From 3134c3575110e6c693f83466eb82d8f627e0585a Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Thu, 21 Dec 2023 22:21:20 +0500 Subject: [PATCH 01/20] Ban usages of Thread#Sleep (#243) Using Thread.Sleep blocks the _entire_ thread from doing *anything*, while Task.Delay allows the thread to execute other tasks while the delay is passing. The inability to cancel Thread.Sleep may also cause longer shutdowns tl;dr Thread.Sleep bad, Task.Delay good made because of https://github.com/LabsDevelopment/Octobot/pull/234/commits/578c03871de0dd042f2fe0918df296f0a8123e00 Signed-off-by: Octol1ttle --- CodeAnalysis/BannedSymbols.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CodeAnalysis/BannedSymbols.txt b/CodeAnalysis/BannedSymbols.txt index 0a1ec81..bf444a9 100644 --- a/CodeAnalysis/BannedSymbols.txt +++ b/CodeAnalysis/BannedSymbols.txt @@ -18,3 +18,5 @@ P:System.DateTime.Now;Use System.DateTime.UtcNow instead. P:System.DateTimeOffset.Now;Use System.DateTimeOffset.UtcNow instead. P:System.DateTimeOffset.DateTime;Use System.DateTimeOffset.UtcDateTime instead. M:System.IO.File.OpenWrite(System.String);File.OpenWrite(string) does not clear the file before writing to it. Use File.Create(string) instead. +M:System.Threading.Thread.Sleep(System.Int32);Use Task.Delay(int, CancellationToken) instead. +M:System.Threading.Thread.Sleep(System.TimeSpan);Use Task.Delay(TimeSpan, CancellationToken) instead. From 894e8198658b14a9a5a5819329b454e8b4bf800d Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Sun, 31 Dec 2023 15:42:59 +0500 Subject: [PATCH 02/20] Fix newline in LogResult (#245) Fixes an issue on Windows that would cause the `ResultErrorMessage` to be unindented. Signed-off-by: Octol1ttle --- src/Extensions/LoggerExtensions.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Extensions/LoggerExtensions.cs b/src/Extensions/LoggerExtensions.cs index 3805cea..9df90b8 100644 --- a/src/Extensions/LoggerExtensions.cs +++ b/src/Extensions/LoggerExtensions.cs @@ -35,6 +35,7 @@ public static class LoggerExtensions return; } - logger.LogWarning("{UserMessage}\n{ResultErrorMessage}", message, result.Error.Message); + logger.LogWarning("{UserMessage}{NewLine}{ResultErrorMessage}", message, Environment.NewLine, + result.Error.Message); } } From e01fde83c63a0eab0ae972b689395cbca4982d50 Mon Sep 17 00:00:00 2001 From: Macintxsh <95250141+mctaylors@users.noreply.github.com> Date: Sun, 31 Dec 2023 15:27:00 +0300 Subject: [PATCH 03/20] Use custom TimeSpanParser (#223) Closes #154 --------- Signed-off-by: mctaylors --- locale/Messages.resx | 3 ++ locale/Messages.ru.resx | 3 ++ locale/Messages.tt-ru.resx | 3 ++ src/Commands/BanCommandGroup.cs | 23 ++++++++- src/Commands/MuteCommandGroup.cs | 17 ++++++- src/Commands/RemindCommandGroup.cs | 29 +++++++++-- src/Commands/ToolsCommandGroup.cs | 29 +++++++++-- src/Data/Options/TimeSpanOption.cs | 6 +-- src/Messages.Designer.cs | 8 +++ src/Parsers/TimeSpanParser.cs | 78 ++++++++++++++++++++++++++++++ 10 files changed, 183 insertions(+), 16 deletions(-) create mode 100644 src/Parsers/TimeSpanParser.cs diff --git a/locale/Messages.resx b/locale/Messages.resx index 1387edf..adc9f6d 100644 --- a/locale/Messages.resx +++ b/locale/Messages.resx @@ -585,6 +585,9 @@ Report an issue + + Time specified incorrectly! + Kicked diff --git a/locale/Messages.ru.resx b/locale/Messages.ru.resx index 572c0b2..de2158d 100644 --- a/locale/Messages.ru.resx +++ b/locale/Messages.ru.resx @@ -585,6 +585,9 @@ Сообщить о проблеме + + Неправильно указано время! + Выгнан diff --git a/locale/Messages.tt-ru.resx b/locale/Messages.tt-ru.resx index d20c358..ca3c19d 100644 --- a/locale/Messages.tt-ru.resx +++ b/locale/Messages.tt-ru.resx @@ -585,6 +585,9 @@ зарепортить баг + + ты там правильно напиши таймспан + кикнут diff --git a/src/Commands/BanCommandGroup.cs b/src/Commands/BanCommandGroup.cs index bbcf459..e72a43c 100644 --- a/src/Commands/BanCommandGroup.cs +++ b/src/Commands/BanCommandGroup.cs @@ -4,6 +4,7 @@ using System.Text; using JetBrains.Annotations; using Octobot.Data; using Octobot.Extensions; +using Octobot.Parsers; using Octobot.Services; using Octobot.Services.Update; using Remora.Commands.Attributes; @@ -53,7 +54,7 @@ public class BanCommandGroup : CommandGroup /// A slash command that bans a Discord user with the specified reason. /// /// The user to ban. - /// The duration for this ban. The user will be automatically unbanned after this duration. + /// The duration for this ban. The user will be automatically unbanned after this duration. /// /// The reason for this ban. Must be encoded with when passed to /// . @@ -75,7 +76,8 @@ public class BanCommandGroup : CommandGroup [Description("User to ban")] IUser target, [Description("Ban reason")] [MaxLength(256)] string reason, - [Description("Ban duration")] TimeSpan? duration = null) + [Description("Ban duration")] [Option("duration")] + string? stringDuration = null) { if (!_context.TryGetContextIDs(out var guildId, out var channelId, out var executorId)) { @@ -104,6 +106,23 @@ public class BanCommandGroup : CommandGroup var data = await _guildData.GetData(guild.ID, CancellationToken); Messages.Culture = GuildSettings.Language.Get(data.Settings); + if (stringDuration is null) + { + return await BanUserAsync(executor, target, reason, null, guild, data, channelId, bot, + CancellationToken); + } + + var parseResult = TimeSpanParser.TryParse(stringDuration); + if (!parseResult.IsDefined(out var duration)) + { + var failedEmbed = new EmbedBuilder() + .WithSmallTitle(Messages.InvalidTimeSpan, bot) + .WithColour(ColorsList.Red) + .Build(); + + return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: CancellationToken); + } + return await BanUserAsync(executor, target, reason, duration, guild, data, channelId, bot, CancellationToken); } diff --git a/src/Commands/MuteCommandGroup.cs b/src/Commands/MuteCommandGroup.cs index c7b21f6..0156f82 100644 --- a/src/Commands/MuteCommandGroup.cs +++ b/src/Commands/MuteCommandGroup.cs @@ -4,6 +4,7 @@ using System.Text; using JetBrains.Annotations; using Octobot.Data; using Octobot.Extensions; +using Octobot.Parsers; using Octobot.Services; using Octobot.Services.Update; using Remora.Commands.Attributes; @@ -50,7 +51,7 @@ public class MuteCommandGroup : CommandGroup /// A slash command that mutes a Discord member with the specified reason. /// /// The member to mute. - /// The duration for this mute. The member will be automatically unmuted after this duration. + /// The duration for this mute. The member will be automatically unmuted after this duration. /// /// The reason for this mute. Must be encoded with when passed to /// . @@ -72,7 +73,8 @@ public class MuteCommandGroup : CommandGroup [Description("Member to mute")] IUser target, [Description("Mute reason")] [MaxLength(256)] string reason, - [Description("Mute duration")] TimeSpan duration) + [Description("Mute duration")] [Option("duration")] + string stringDuration) { if (!_context.TryGetContextIDs(out var guildId, out var channelId, out var executorId)) { @@ -104,6 +106,17 @@ public class MuteCommandGroup : CommandGroup return await _feedback.SendContextualEmbedResultAsync(embed, ct: CancellationToken); } + var parseResult = TimeSpanParser.TryParse(stringDuration); + if (!parseResult.IsDefined(out var duration)) + { + var failedEmbed = new EmbedBuilder() + .WithSmallTitle(Messages.InvalidTimeSpan, bot) + .WithColour(ColorsList.Red) + .Build(); + + return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: CancellationToken); + } + return await MuteUserAsync(executor, target, reason, duration, guildId, data, channelId, bot, CancellationToken); } diff --git a/src/Commands/RemindCommandGroup.cs b/src/Commands/RemindCommandGroup.cs index 67e7910..5e8c9c5 100644 --- a/src/Commands/RemindCommandGroup.cs +++ b/src/Commands/RemindCommandGroup.cs @@ -17,6 +17,7 @@ using Remora.Discord.Extensions.Embeds; using Remora.Discord.Extensions.Formatting; using Remora.Rest.Core; using Remora.Results; +using Octobot.Parsers; namespace Octobot.Commands; @@ -110,7 +111,7 @@ public class RemindCommandGroup : CommandGroup /// /// A slash command that schedules a reminder with the specified text. /// - /// The period of time which must pass before the reminder will be sent. + /// The period of time which must pass before the reminder will be sent. /// The text of the reminder. /// A feedback sending result which may or may not have succeeded. [Command("remind")] @@ -120,7 +121,8 @@ public class RemindCommandGroup : CommandGroup [UsedImplicitly] public async Task ExecuteReminderAsync( [Description("After what period of time mention the reminder")] - TimeSpan @in, + [Option("in")] + string timeSpanString, [Description("Reminder text")] [MaxLength(512)] string text) { @@ -129,6 +131,12 @@ public class RemindCommandGroup : CommandGroup return new ArgumentInvalidError(nameof(_context), "Unable to retrieve necessary IDs from command context"); } + var botResult = await _userApi.GetCurrentUserAsync(CancellationToken); + if (!botResult.IsDefined(out var bot)) + { + return Result.FromError(botResult); + } + var executorResult = await _userApi.GetUserAsync(executorId, CancellationToken); if (!executorResult.IsDefined(out var executor)) { @@ -138,14 +146,25 @@ public class RemindCommandGroup : CommandGroup var data = await _guildData.GetData(guildId, CancellationToken); Messages.Culture = GuildSettings.Language.Get(data.Settings); - return await AddReminderAsync(@in, text, data, channelId, executor, CancellationToken); + var parseResult = TimeSpanParser.TryParse(timeSpanString); + if (!parseResult.IsDefined(out var timeSpan)) + { + var failedEmbed = new EmbedBuilder() + .WithSmallTitle(Messages.InvalidTimeSpan, bot) + .WithColour(ColorsList.Red) + .Build(); + + return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: CancellationToken); + } + + return await AddReminderAsync(timeSpan, text, data, channelId, executor, CancellationToken); } - private async Task AddReminderAsync(TimeSpan @in, string text, GuildData data, + private async Task AddReminderAsync(TimeSpan timeSpan, string text, GuildData data, Snowflake channelId, IUser executor, CancellationToken ct = default) { var memberData = data.GetOrCreateMemberData(executor.ID); - var remindAt = DateTimeOffset.UtcNow.Add(@in); + var remindAt = DateTimeOffset.UtcNow.Add(timeSpan); var responseResult = await _interactionApi.GetOriginalInteractionResponseAsync(_context.Interaction.ApplicationID, _context.Interaction.Token, ct); if (!responseResult.IsDefined(out var response)) { diff --git a/src/Commands/ToolsCommandGroup.cs b/src/Commands/ToolsCommandGroup.cs index 1dbf72d..b539355 100644 --- a/src/Commands/ToolsCommandGroup.cs +++ b/src/Commands/ToolsCommandGroup.cs @@ -4,6 +4,7 @@ using System.Text; using JetBrains.Annotations; using Octobot.Data; using Octobot.Extensions; +using Octobot.Parsers; using Octobot.Services; using Remora.Commands.Attributes; using Remora.Commands.Groups; @@ -418,7 +419,7 @@ public class ToolsCommandGroup : CommandGroup /// /// A slash command that shows the current timestamp with an optional offset in all styles supported by Discord. /// - /// The offset for the current timestamp. + /// The offset for the current timestamp. /// /// A feedback sending result which may or may not have succeeded. /// @@ -427,14 +428,20 @@ public class ToolsCommandGroup : CommandGroup [Description("Shows a timestamp in all styles")] [UsedImplicitly] public async Task ExecuteTimestampAsync( - [Description("Offset from current time")] - TimeSpan? offset = null) + [Description("Offset from current time")] [Option("offset")] + string? stringOffset = null) { if (!_context.TryGetContextIDs(out var guildId, out _, out var executorId)) { return new ArgumentInvalidError(nameof(_context), "Unable to retrieve necessary IDs from command context"); } + var botResult = await _userApi.GetCurrentUserAsync(CancellationToken); + if (!botResult.IsDefined(out var bot)) + { + return Result.FromError(botResult); + } + var executorResult = await _userApi.GetUserAsync(executorId, CancellationToken); if (!executorResult.IsDefined(out var executor)) { @@ -444,6 +451,22 @@ public class ToolsCommandGroup : CommandGroup var data = await _guildData.GetData(guildId, CancellationToken); Messages.Culture = GuildSettings.Language.Get(data.Settings); + if (stringOffset is null) + { + return await SendTimestampAsync(null, executor, CancellationToken); + } + + var parseResult = TimeSpanParser.TryParse(stringOffset); + if (!parseResult.IsDefined(out var offset)) + { + var failedEmbed = new EmbedBuilder() + .WithSmallTitle(Messages.InvalidTimeSpan, bot) + .WithColour(ColorsList.Red) + .Build(); + + return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: CancellationToken); + } + return await SendTimestampAsync(offset, executor, CancellationToken); } diff --git a/src/Data/Options/TimeSpanOption.cs b/src/Data/Options/TimeSpanOption.cs index 7f60ebb..b9b405f 100644 --- a/src/Data/Options/TimeSpanOption.cs +++ b/src/Data/Options/TimeSpanOption.cs @@ -1,13 +1,11 @@ using System.Text.Json.Nodes; -using Remora.Commands.Parsers; +using Octobot.Parsers; using Remora.Results; namespace Octobot.Data.Options; public sealed class TimeSpanOption : Option { - private static readonly TimeSpanParser Parser = new(); - public TimeSpanOption(string name, TimeSpan defaultValue) : base(name, defaultValue) { } public override TimeSpan Get(JsonNode settings) @@ -29,6 +27,6 @@ public sealed class TimeSpanOption : Option private static Result ParseTimeSpan(string from) { - return Parser.TryParseAsync(from).AsTask().GetAwaiter().GetResult(); + return TimeSpanParser.TryParse(from); } } diff --git a/src/Messages.Designer.cs b/src/Messages.Designer.cs index 8dad3dc..f5a06c0 100644 --- a/src/Messages.Designer.cs +++ b/src/Messages.Designer.cs @@ -1037,6 +1037,14 @@ namespace Octobot { } } + internal static string InvalidTimeSpan + { + get + { + return ResourceManager.GetString("InvalidTimeSpan", resourceCulture); + } + } + internal static string UserInfoKicked { get diff --git a/src/Parsers/TimeSpanParser.cs b/src/Parsers/TimeSpanParser.cs new file mode 100644 index 0000000..1f44d46 --- /dev/null +++ b/src/Parsers/TimeSpanParser.cs @@ -0,0 +1,78 @@ +using System.Globalization; +using System.Text.RegularExpressions; +using JetBrains.Annotations; +using Remora.Commands.Parsers; +using Remora.Results; + +namespace Octobot.Parsers; + +/// +/// Parses s. +/// +[PublicAPI] +public partial class TimeSpanParser : AbstractTypeParser +{ + private static readonly Regex Pattern = ParseRegex(); + + /// + /// Parses a from the . + /// + /// + /// The parsed , or if parsing failed. + /// + public static Result TryParse(string timeSpanString) + { + if (timeSpanString.StartsWith('-')) + { + return new ArgumentInvalidError(nameof(timeSpanString), "TimeSpans cannot be negative."); + } + + if (TimeSpan.TryParse(timeSpanString, DateTimeFormatInfo.InvariantInfo, out var parsedTimeSpan)) + { + return parsedTimeSpan; + } + + var matches = ParseRegex().Matches(timeSpanString); + return matches.Count > 0 + ? ParseFromRegex(matches) + : new ArgumentInvalidError(nameof(timeSpanString), "The regex did not produce any matches."); + } + + private static Result ParseFromRegex(MatchCollection matches) + { + var timeSpan = TimeSpan.Zero; + + foreach (var groups in matches.Select(match => match.Groups + .Cast() + .Where(g => g.Success) + .Skip(1) + .Select(g => (g.Name, g.Value)))) + { + foreach ((var key, var groupValue) in groups) + { + if (!int.TryParse(groupValue, out var parsedIntegerValue)) + { + return new ArgumentInvalidError(nameof(groupValue), "The input value was not an integer."); + } + + var now = DateTimeOffset.UtcNow; + timeSpan += key switch + { + "Years" => now.AddYears(parsedIntegerValue) - now, + "Months" => now.AddMonths(parsedIntegerValue) - now, + "Weeks" => TimeSpan.FromDays(parsedIntegerValue * 7), + "Days" => TimeSpan.FromDays(parsedIntegerValue), + "Hours" => TimeSpan.FromHours(parsedIntegerValue), + "Minutes" => TimeSpan.FromMinutes(parsedIntegerValue), + "Seconds" => TimeSpan.FromSeconds(parsedIntegerValue), + _ => throw new ArgumentOutOfRangeException(key) + }; + } + } + + return timeSpan; + } + + [GeneratedRegex("(?\\d+(?=y|л|г))|(?\\d+(?=mo|мес))|(?\\d+(?=w|н|нед))|(?\\d+(?=d|д|дн))|(?\\d+(?=h|ч))|(?\\d+(?=m|min|мин|м))|(?\\d+(?=s|sec|с|сек))")] + private static partial Regex ParseRegex(); +} From 6a928482af7a49dcf45e14cfc58c94c8cc27cec3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 08:11:17 +0300 Subject: [PATCH 04/20] Bump muno92/resharper_inspectcode from 1.11.1 to 1.11.3 (#248) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [muno92/resharper_inspectcode](https://github.com/muno92/resharper_inspectcode) from 1.11.1 to 1.11.3.
Release notes

Sourced from muno92/resharper_inspectcode's releases.

1.11.3

What's Changed

Full Changelog: https://github.com/muno92/resharper_inspectcode/compare/1.11.2...1.11.3

1.11.2

What's Changed

Full Changelog: https://github.com/muno92/resharper_inspectcode/compare/1.11.1...1.11.2

Changelog

Sourced from muno92/resharper_inspectcode's changelog.

1.11.3 - 2024-01-14

1.11.2 - 2024-01-12

Commits
  • 2325281 Merge pull request #447 from muno92/tagpr-from-1.11.2
  • 647d06f Compile
  • cdd28cb [tagpr] update CHANGELOG.md
  • fa426c0 [tagpr] prepare for the next release
  • 17b3b07 Merge pull request #446 from muno92/renovate/all-minor-patch
  • 060783e Update dependency prettier to v3.2.2
  • 9251310 Merge pull request #445 from muno92/tagpr-from-1.11.1
  • da76157 Compile
  • adedbdf [tagpr] update CHANGELOG.md
  • 8d31ede [tagpr] prepare for the next release
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=muno92/resharper_inspectcode&package-manager=github_actions&previous-version=1.11.1&new-version=1.11.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml index b697dac..512ebc4 100644 --- a/.github/workflows/build-pr.yml +++ b/.github/workflows/build-pr.yml @@ -23,7 +23,7 @@ jobs: uses: actions/checkout@v4 - name: ReSharper CLI InspectCode - uses: muno92/resharper_inspectcode@1.11.1 + uses: muno92/resharper_inspectcode@1.11.3 with: solutionPath: ./Octobot.sln ignoreIssueType: InvertIf, ConvertIfStatementToSwitchStatement, ConvertToPrimaryConstructor From 202daf5c1ff3c8cc1f7d953295db0dcc6bd719e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 14:28:24 +0300 Subject: [PATCH 05/20] Bump muno92/resharper_inspectcode from 1.11.3 to 1.11.5 (#249) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [muno92/resharper_inspectcode](https://github.com/muno92/resharper_inspectcode) from 1.11.3 to 1.11.5.
Release notes

Sourced from muno92/resharper_inspectcode's releases.

1.11.5

What's Changed

Full Changelog: https://github.com/muno92/resharper_inspectcode/compare/1.11.4...1.11.5

1.11.4

What's Changed

Full Changelog: https://github.com/muno92/resharper_inspectcode/compare/1.11.3...1.11.4

Changelog

Sourced from muno92/resharper_inspectcode's changelog.

1.11.5 - 2024-01-17

1.11.4 - 2024-01-17

Commits
  • fc10815 Merge pull request #451 from muno92/tagpr-from-1.11.4
  • bc33dd2 Compile
  • 028cfde [tagpr] update CHANGELOG.md
  • 6409723 [tagpr] prepare for the next release
  • c3894f5 Merge pull request #450 from muno92/renovate/all-minor-patch
  • 760594a Update dependency prettier to v3.2.4
  • 95aa802 Merge pull request #449 from muno92/tagpr-from-1.11.3
  • 48e3450 Compile
  • b5aefe4 [tagpr] update CHANGELOG.md
  • af674ca [tagpr] prepare for the next release
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=muno92/resharper_inspectcode&package-manager=github_actions&previous-version=1.11.3&new-version=1.11.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml index 512ebc4..e93a460 100644 --- a/.github/workflows/build-pr.yml +++ b/.github/workflows/build-pr.yml @@ -23,7 +23,7 @@ jobs: uses: actions/checkout@v4 - name: ReSharper CLI InspectCode - uses: muno92/resharper_inspectcode@1.11.3 + uses: muno92/resharper_inspectcode@1.11.5 with: solutionPath: ./Octobot.sln ignoreIssueType: InvertIf, ConvertIfStatementToSwitchStatement, ConvertToPrimaryConstructor From 83e2c5040ec819a704bfba782a4594ef883c57de Mon Sep 17 00:00:00 2001 From: Macintxsh <95250141+mctaylors@users.noreply.github.com> Date: Mon, 22 Jan 2024 18:47:53 +0300 Subject: [PATCH 06/20] Remove mctaylors.ru mentions (#251) Signed-off-by: mctaylors --- Octobot.csproj | 8 ++++---- docs/CONTRIBUTING.md | 2 +- docs/README.md | 22 +++++---------------- docs/octobot-banner.png | Bin 0 -> 122946 bytes src/Commands/AboutCommandGroup.cs | 2 +- src/Octobot.cs | 2 +- src/Responders/MessageReceivedResponder.cs | 2 +- 7 files changed, 13 insertions(+), 25 deletions(-) create mode 100644 docs/octobot-banner.png diff --git a/Octobot.csproj b/Octobot.csproj index e8f0dfa..1f050a6 100644 --- a/Octobot.csproj +++ b/Octobot.csproj @@ -9,11 +9,11 @@ Octobot Octol1ttle, mctaylors, neroduckale AGPLv3 - https://github.com/LabsDevelopment/Octobot - https://github.com/LabsDevelopment/Octobot/blob/master/LICENSE - https://github.com/LabsDevelopment/Octobot + https://github.com/TeamOctolings/Octobot + https://github.com/TeamOctolings/Octobot/blob/master/LICENSE + https://github.com/TeamOctolings/Octobot github - LabsDevelopment + TeamOctolings en A general-purpose Discord bot for moderation written in C# docs/octobot.ico diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 2a15ef2..dc5a793 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -29,7 +29,7 @@ While pull requests from unaffiliated contributors are welcome, please note that internal issues that haven't been published to the issue tracker yet. Reviewing PRs is done on a best-effort basis, so please be aware that it may take a while before a core maintainer gets around to review your change. -The [issue tracker](https://github.com/LabsDevelopment/Octobot/issues) should provide plenty of issues to start with. +The [issue tracker](https://github.com/TeamOctolings/Octobot/issues) should provide plenty of issues to start with. Make sure to check that an issue you're planning to resolve does not already have people working on it and that there are no PRs associated with it diff --git a/docs/README.md b/docs/README.md index 5be0bd8..7056857 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,12 +1,12 @@

- Octobot banner + Octobot banner

- + - + -Veemo! I'm a general-purpose bot for moderation (formerly known as Boyfriend) written by [Labs Development Team](https://github.com/LabsDevelopment) in C# and Remora.Discord +Veemo! I'm a general-purpose bot for moderation (formerly known as Boyfriend) written by [Team Octolings](https://github.com/TeamOctolings) in C# and Remora.Discord ## Features @@ -19,25 +19,13 @@ Veemo! I'm a general-purpose bot for moderation (formerly known as Boyfriend) wr *...a-a-and more!* -[//]: # (if you are reading this, message @mctaylors and ask him to bring back the wiki) - -## Invite Octobot - -Did you know that Octobot is a public bot? You can invite it to your server and use it without building it! -

- -

- -> [!IMPORTANT] -> The bot will not be able to respond in private channels unless you have configured permissions for the bot in those channels. - ## Building Octobot 1. Install [.NET 8 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) 2. Go to the [Discord Developer Portal](https://discord.com/developers), create a new application and get a bot token. Don't forget to also enable all intents! 3. Clone this repository and open `Octobot` folder. ``` -git clone https://github.com/LabsDevelopment/Octobot +git clone https://github.com/TeamOctolings/Octobot cd Octobot ``` 4. Run Octobot using `dotnet` with `BOT_TOKEN` variable. diff --git a/docs/octobot-banner.png b/docs/octobot-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab5f5baed6cab8a85ada32ef0b5a73171c6cd72 GIT binary patch literal 122946 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 Q*5$;!^P$-kDl-eVgJ#C_!W3f@uc=S64E`w^TM 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 vD&(WM3IBaOB~WxfPs3GssrdhOS>OW literal 0 HcmV?d00001 diff --git a/src/Commands/AboutCommandGroup.cs b/src/Commands/AboutCommandGroup.cs index 4c396d9..e978ec9 100644 --- a/src/Commands/AboutCommandGroup.cs +++ b/src/Commands/AboutCommandGroup.cs @@ -100,7 +100,7 @@ public class AboutCommandGroup : CommandGroup .WithSmallTitle(string.Format(Messages.AboutBot, bot.Username), bot) .WithDescription(builder.ToString()) .WithColour(ColorsList.Cyan) - .WithImageUrl("https://cdn.mctaylors.ru/octobot-banner.png") + .WithImageUrl("https://i.ibb.co/fS6wZhh/octobot-banner.png") .Build(); var repositoryButton = new ButtonComponent( diff --git a/src/Octobot.cs b/src/Octobot.cs index 063bd14..a2b4773 100644 --- a/src/Octobot.cs +++ b/src/Octobot.cs @@ -23,7 +23,7 @@ namespace Octobot; public sealed class Octobot { - public const string RepositoryUrl = "https://github.com/LabsDevelopment/Octobot"; + public const string RepositoryUrl = "https://github.com/TeamOctolings/Octobot"; public const string IssuesUrl = $"{RepositoryUrl}/issues"; public static readonly AllowedMentions NoMentions = new( diff --git a/src/Responders/MessageReceivedResponder.cs b/src/Responders/MessageReceivedResponder.cs index f5c65f4..4ac312b 100644 --- a/src/Responders/MessageReceivedResponder.cs +++ b/src/Responders/MessageReceivedResponder.cs @@ -28,7 +28,7 @@ public class MessageCreateResponder : IResponder "whoami" => "`nobody`", "сука !!" => "`root`", "воооо" => "`removing /...`", - "пон" => "https://cdn.upload.systems/uploads/2LNfUSwM.jpg", + "пон" => "https://i.ibb.co/Kw6QVcw/parry.jpg", "++++" => "#", "осу" => "https://github.com/ppy/osu", _ => default(Optional) From b4ae9cca2dbad498efe97871bc89effb66d8971a Mon Sep 17 00:00:00 2001 From: Macintxsh <95250141+mctaylors@users.noreply.github.com> Date: Sat, 27 Jan 2024 14:59:16 +0300 Subject: [PATCH 07/20] Update CODEOWNERS (#253) Signed-off-by: Macintxsh <95250141+mctaylors@users.noreply.github.com> --- .github/CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 643492d..93a190c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,2 +1,2 @@ -* @LabsDevelopment/octobot -/docs/ @LabsDevelopment/octobot-docs +* @TeamOctolings/octobot +/docs/ @TeamOctolings/octobot-docs From 7e9c08cab72d680741c4b17f4972812ebd716a48 Mon Sep 17 00:00:00 2001 From: Macintxsh <95250141+mctaylors@users.noreply.github.com> Date: Sat, 27 Jan 2024 15:06:10 +0300 Subject: [PATCH 08/20] Don't use Option attribute in ExecuteBanAsync method (#252) https://github.com/TeamOctolings/Octobot/issues/246#issuecomment-1912579699 > The `Option` attribute also somehow affects the command update behavior. I'll get rid of it then. Closes #246 Signed-off-by: mctaylors --- src/Commands/BanCommandGroup.cs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/Commands/BanCommandGroup.cs b/src/Commands/BanCommandGroup.cs index e72a43c..926e615 100644 --- a/src/Commands/BanCommandGroup.cs +++ b/src/Commands/BanCommandGroup.cs @@ -54,7 +54,7 @@ public class BanCommandGroup : CommandGroup /// A slash command that bans a Discord user with the specified reason. /// /// The user to ban. - /// The duration for this ban. The user will be automatically unbanned after this duration. + /// The duration for this ban. The user will be automatically unbanned after this duration. /// /// The reason for this ban. Must be encoded with when passed to /// . @@ -76,8 +76,7 @@ public class BanCommandGroup : CommandGroup [Description("User to ban")] IUser target, [Description("Ban reason")] [MaxLength(256)] string reason, - [Description("Ban duration")] [Option("duration")] - string? stringDuration = null) + [Description("Ban duration")] string? duration = null) { if (!_context.TryGetContextIDs(out var guildId, out var channelId, out var executorId)) { @@ -106,14 +105,14 @@ public class BanCommandGroup : CommandGroup var data = await _guildData.GetData(guild.ID, CancellationToken); Messages.Culture = GuildSettings.Language.Get(data.Settings); - if (stringDuration is null) + if (duration is null) { return await BanUserAsync(executor, target, reason, null, guild, data, channelId, bot, CancellationToken); } - var parseResult = TimeSpanParser.TryParse(stringDuration); - if (!parseResult.IsDefined(out var duration)) + var parseResult = TimeSpanParser.TryParse(duration); + if (!parseResult.IsDefined(out var timeSpan)) { var failedEmbed = new EmbedBuilder() .WithSmallTitle(Messages.InvalidTimeSpan, bot) @@ -123,7 +122,7 @@ public class BanCommandGroup : CommandGroup return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: CancellationToken); } - return await BanUserAsync(executor, target, reason, duration, guild, data, channelId, bot, CancellationToken); + return await BanUserAsync(executor, target, reason, timeSpan, guild, data, channelId, bot, CancellationToken); } private async Task BanUserAsync( From af84f8853ad4bffde0ede8b89256d508d958ecdb Mon Sep 17 00:00:00 2001 From: Macintxsh <95250141+mctaylors@users.noreply.github.com> Date: Sat, 27 Jan 2024 15:50:27 +0300 Subject: [PATCH 09/20] Add /editremind (#247) In this PR, I'm adding a command to modify existing reminders. This can be useful if you, for example, got the name a bit wrong or set the wrong reminder time. Just use /editremind and recreating the reminder from scratch will no longer be necessary. --------- Signed-off-by: mctaylors --- locale/Messages.resx | 3 + locale/Messages.ru.resx | 3 + locale/Messages.tt-ru.resx | 3 + src/Commands/RemindCommandGroup.cs | 126 +++++++++++++++++++++++++++++ src/Messages.Designer.cs | 6 ++ 5 files changed, 141 insertions(+) diff --git a/locale/Messages.resx b/locale/Messages.resx index adc9f6d..218c414 100644 --- a/locale/Messages.resx +++ b/locale/Messages.resx @@ -591,4 +591,7 @@ Kicked + + Reminder edited + diff --git a/locale/Messages.ru.resx b/locale/Messages.ru.resx index de2158d..3eb53f1 100644 --- a/locale/Messages.ru.resx +++ b/locale/Messages.ru.resx @@ -591,4 +591,7 @@ Выгнан + + Напоминание отредактировано + diff --git a/locale/Messages.tt-ru.resx b/locale/Messages.tt-ru.resx index ca3c19d..f5d789b 100644 --- a/locale/Messages.tt-ru.resx +++ b/locale/Messages.tt-ru.resx @@ -591,4 +591,7 @@ кикнут + + напоминалка подправлена + diff --git a/src/Commands/RemindCommandGroup.cs b/src/Commands/RemindCommandGroup.cs index 5e8c9c5..c270f30 100644 --- a/src/Commands/RemindCommandGroup.cs +++ b/src/Commands/RemindCommandGroup.cs @@ -193,6 +193,132 @@ public class RemindCommandGroup : CommandGroup return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct); } + public enum Parameters + { + [UsedImplicitly] Time, + [UsedImplicitly] Text + } + + /// + /// A slash command that edits a scheduled reminder using the specified text or time. + /// + /// The list position of the reminder to edit. + /// The reminder's parameter to edit. + /// The new value for the reminder as a text or time. + /// A feedback sending result which may or may not have succeeded. + [Command("editremind")] + [Description("Edit a reminder")] + [DiscordDefaultDMPermission(false)] + [RequireContext(ChannelContext.Guild)] + [UsedImplicitly] + public async Task ExecuteEditReminderAsync( + [Description("Position in list")] [MinValue(1)] + int position, + [Description("Parameter to edit")] Parameters parameter, + [Description("Parameter's new value")] string value) + { + if (!_context.TryGetContextIDs(out var guildId, out _, out var executorId)) + { + return new ArgumentInvalidError(nameof(_context), "Unable to retrieve necessary IDs from command context"); + } + + var botResult = await _userApi.GetCurrentUserAsync(CancellationToken); + if (!botResult.IsDefined(out var bot)) + { + return Result.FromError(botResult); + } + + var executorResult = await _userApi.GetUserAsync(executorId, CancellationToken); + if (!executorResult.IsDefined(out var executor)) + { + return Result.FromError(executorResult); + } + + var data = await _guildData.GetData(guildId, CancellationToken); + Messages.Culture = GuildSettings.Language.Get(data.Settings); + + var memberData = data.GetOrCreateMemberData(executor.ID); + + if (parameter is Parameters.Time) + { + return await EditReminderTimeAsync(position - 1, value, memberData, bot, executor, CancellationToken); + } + + return await EditReminderTextAsync(position - 1, value, memberData, bot, executor, CancellationToken); + } + + private async Task EditReminderTimeAsync(int index, string value, MemberData data, + IUser bot, IUser executor, CancellationToken ct = default) + { + if (index >= data.Reminders.Count) + { + var failedEmbed = new EmbedBuilder().WithSmallTitle(Messages.InvalidReminderPosition, bot) + .WithColour(ColorsList.Red) + .Build(); + + return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: ct); + } + + var parseResult = TimeSpanParser.TryParse(value); + if (!parseResult.IsDefined(out var timeSpan)) + { + var failedEmbed = new EmbedBuilder() + .WithSmallTitle(Messages.InvalidTimeSpan, bot) + .WithColour(ColorsList.Red) + .Build(); + + return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: ct); + } + + var oldReminder = data.Reminders[index]; + var remindAt = DateTimeOffset.UtcNow.Add(timeSpan); + + data.Reminders.Add(oldReminder with { At = remindAt }); + data.Reminders.RemoveAt(index); + + var builder = new StringBuilder() + .AppendBulletPointLine(string.Format(Messages.ReminderText, Markdown.InlineCode(oldReminder.Text))) + .AppendBulletPoint(string.Format(Messages.ReminderTime, Markdown.Timestamp(remindAt))); + var embed = new EmbedBuilder().WithSmallTitle( + string.Format(Messages.ReminderEdited, executor.GetTag()), executor) + .WithDescription(builder.ToString()) + .WithColour(ColorsList.Cyan) + .WithFooter(string.Format(Messages.ReminderPosition, data.Reminders.Count)) + .Build(); + + return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct); + } + + private async Task EditReminderTextAsync(int index, string value, MemberData data, + IUser bot, IUser executor, CancellationToken ct = default) + { + if (index >= data.Reminders.Count) + { + var failedEmbed = new EmbedBuilder().WithSmallTitle(Messages.InvalidReminderPosition, bot) + .WithColour(ColorsList.Red) + .Build(); + + return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct: ct); + } + + var oldReminder = data.Reminders[index]; + + data.Reminders.Add(oldReminder with { Text = value }); + data.Reminders.RemoveAt(index); + + var builder = new StringBuilder() + .AppendBulletPointLine(string.Format(Messages.ReminderText, Markdown.InlineCode(value))) + .AppendBulletPoint(string.Format(Messages.ReminderTime, Markdown.Timestamp(oldReminder.At))); + var embed = new EmbedBuilder().WithSmallTitle( + string.Format(Messages.ReminderEdited, executor.GetTag()), executor) + .WithDescription(builder.ToString()) + .WithColour(ColorsList.Cyan) + .WithFooter(string.Format(Messages.ReminderPosition, data.Reminders.Count)) + .Build(); + + return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct); + } + /// /// A slash command that deletes a reminder using its list position. /// diff --git a/src/Messages.Designer.cs b/src/Messages.Designer.cs index f5a06c0..a0c915a 100644 --- a/src/Messages.Designer.cs +++ b/src/Messages.Designer.cs @@ -1052,5 +1052,11 @@ namespace Octobot { return ResourceManager.GetString("UserInfoKicked", resourceCulture); } } + + internal static string ReminderEdited { + get { + return ResourceManager.GetString("ReminderEdited", resourceCulture); + } + } } } From f034ede58dece5357d5ac6ee3b85a94682bba635 Mon Sep 17 00:00:00 2001 From: Macintxsh <95250141+mctaylors@users.noreply.github.com> Date: Sun, 28 Jan 2024 15:27:21 +0300 Subject: [PATCH 10/20] =?UTF-8?q?Parry=20"=D0=BB=D0=B0=D0=BD"=20flooders?= =?UTF-8?q?=20(#256)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Macintxsh <95250141+mctaylors@users.noreply.github.com> --- src/Responders/MessageReceivedResponder.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Responders/MessageReceivedResponder.cs b/src/Responders/MessageReceivedResponder.cs index 4ac312b..6ab7199 100644 --- a/src/Responders/MessageReceivedResponder.cs +++ b/src/Responders/MessageReceivedResponder.cs @@ -31,6 +31,7 @@ public class MessageCreateResponder : IResponder "пон" => "https://i.ibb.co/Kw6QVcw/parry.jpg", "++++" => "#", "осу" => "https://github.com/ppy/osu", + "лан" => "https://i.ibb.co/VYH2QLc/lan.jpg", _ => default(Optional) }); return Task.FromResult(Result.FromSuccess()); From 290449077a2541f87d836bb6fd9f553b44994134 Mon Sep 17 00:00:00 2001 From: Macintxsh <95250141+mctaylors@users.noreply.github.com> Date: Sun, 28 Jan 2024 21:36:29 +0300 Subject: [PATCH 11/20] Use TimeSpanParser.TryParse instead of ParseTimeSpan (#257) The ParseTimeSpan method is not needed because we no longer use the quirky (IMO) and long `Parser.TryParseAsync(from).AsTask().GetAwaiter().GetResult()` to parse TimeSpan Signed-off-by: mctaylors --- src/Data/Options/TimeSpanOption.cs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/Data/Options/TimeSpanOption.cs b/src/Data/Options/TimeSpanOption.cs index b9b405f..c81a02d 100644 --- a/src/Data/Options/TimeSpanOption.cs +++ b/src/Data/Options/TimeSpanOption.cs @@ -11,12 +11,12 @@ public sealed class TimeSpanOption : Option public override TimeSpan Get(JsonNode settings) { var property = settings[Name]; - return property != null ? ParseTimeSpan(property.GetValue()).Entity : DefaultValue; + return property != null ? TimeSpanParser.TryParse(property.GetValue()).Entity : DefaultValue; } public override Result Set(JsonNode settings, string from) { - if (!ParseTimeSpan(from).IsDefined(out var span)) + if (!TimeSpanParser.TryParse(from).IsDefined(out var span)) { return new ArgumentInvalidError(nameof(from), Messages.InvalidSettingValue); } @@ -24,9 +24,4 @@ public sealed class TimeSpanOption : Option settings[Name] = span.ToString(); return Result.FromSuccess(); } - - private static Result ParseTimeSpan(string from) - { - return TimeSpanParser.TryParse(from); - } } From 5b4d581325b3db7a776c878811331fff49efdad9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 18:53:55 +0300 Subject: [PATCH 12/20] Bump muno92/resharper_inspectcode from 1.11.5 to 1.11.6 (#258) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [muno92/resharper_inspectcode](https://github.com/muno92/resharper_inspectcode) from 1.11.5 to 1.11.6.
Changelog

Sourced from muno92/resharper_inspectcode's changelog.

1.11.6 - 2024-02-04

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=muno92/resharper_inspectcode&package-manager=github_actions&previous-version=1.11.5&new-version=1.11.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml index e93a460..4867741 100644 --- a/.github/workflows/build-pr.yml +++ b/.github/workflows/build-pr.yml @@ -23,7 +23,7 @@ jobs: uses: actions/checkout@v4 - name: ReSharper CLI InspectCode - uses: muno92/resharper_inspectcode@1.11.5 + uses: muno92/resharper_inspectcode@1.11.6 with: solutionPath: ./Octobot.sln ignoreIssueType: InvertIf, ConvertIfStatementToSwitchStatement, ConvertToPrimaryConstructor From 5483bbd2034c7e9e1029ab03576d8ab5ddcc11d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 12:09:26 +0000 Subject: [PATCH 13/20] Bump the remora group with 4 updates (#259) --- Octobot.csproj | 2 +- src/Commands/ToolsCommandGroup.cs | 4 ++-- src/Services/Update/MemberUpdateService.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Octobot.csproj b/Octobot.csproj index 1f050a6..1c2c08c 100644 --- a/Octobot.csproj +++ b/Octobot.csproj @@ -29,7 +29,7 @@ - + diff --git a/src/Commands/ToolsCommandGroup.cs b/src/Commands/ToolsCommandGroup.cs index b539355..fb87117 100644 --- a/src/Commands/ToolsCommandGroup.cs +++ b/src/Commands/ToolsCommandGroup.cs @@ -101,10 +101,10 @@ public class ToolsCommandGroup : CommandGroup { var builder = new StringBuilder().AppendLine($"### <@{target.ID}>"); - if (target.GlobalName is not null) + if (target.GlobalName.IsDefined(out var globalName)) { builder.AppendBulletPointLine(Messages.UserInfoDisplayName) - .AppendLine(Markdown.InlineCode(target.GlobalName)); + .AppendLine(Markdown.InlineCode(globalName)); } builder.AppendBulletPointLine(Messages.UserInfoDiscordUserSince) diff --git a/src/Services/Update/MemberUpdateService.cs b/src/Services/Update/MemberUpdateService.cs index 06e531f..7674bbe 100644 --- a/src/Services/Update/MemberUpdateService.cs +++ b/src/Services/Update/MemberUpdateService.cs @@ -185,7 +185,7 @@ public sealed partial class MemberUpdateService : BackgroundService { var currentNickname = member.Nickname.IsDefined(out var nickname) ? nickname - : user.GlobalName ?? user.Username; + : user.GlobalName.OrDefault(user.Username); var characterList = currentNickname.ToList(); var usernameChanged = false; foreach (var character in currentNickname) From 58bd439aa72473c6c69fd488b42837e18c9c4bc0 Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Tue, 6 Feb 2024 23:35:33 +0500 Subject: [PATCH 14/20] Revert "Add profiler base" (#260) Reverts TeamOctolings/Octobot#235 See #244 --- src/Octobot.cs | 3 - src/Services/Profiler/Profiler.cs | 114 ----------------------- src/Services/Profiler/ProfilerEvent.cs | 9 -- src/Services/Profiler/ProfilerFactory.cs | 27 ------ 4 files changed, 153 deletions(-) delete mode 100644 src/Services/Profiler/Profiler.cs delete mode 100644 src/Services/Profiler/ProfilerEvent.cs delete mode 100644 src/Services/Profiler/ProfilerFactory.cs diff --git a/src/Octobot.cs b/src/Octobot.cs index a2b4773..1ebf7c3 100644 --- a/src/Octobot.cs +++ b/src/Octobot.cs @@ -4,7 +4,6 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Octobot.Commands.Events; using Octobot.Services; -using Octobot.Services.Profiler; using Octobot.Services.Update; using Remora.Discord.API.Abstractions.Gateway.Commands; using Remora.Discord.API.Abstractions.Objects; @@ -87,8 +86,6 @@ public sealed class Octobot .AddPreparationErrorEvent() .AddPostExecutionEvent() // Services - .AddTransient() - .AddSingleton() .AddSingleton() .AddSingleton() .AddHostedService(provider => provider.GetRequiredService()) diff --git a/src/Services/Profiler/Profiler.cs b/src/Services/Profiler/Profiler.cs deleted file mode 100644 index 8d4ca98..0000000 --- a/src/Services/Profiler/Profiler.cs +++ /dev/null @@ -1,114 +0,0 @@ -using System.Diagnostics; -using System.Text; -using Microsoft.Extensions.Logging; -using Remora.Results; - -// TODO: remove in future profiler PRs -// ReSharper disable All - -namespace Octobot.Services.Profiler; - -/// -/// Provides the ability to profile how long certain parts of code take to complete using es. -/// -/// Resolve instead in singletons. -public sealed class Profiler -{ - private const int MaxProfilerTime = 1000; // milliseconds - private readonly List _events = []; - private readonly ILogger _logger; - - public Profiler(ILogger logger) - { - _logger = logger; - } - - /// - /// Pushes an event to the profiler. - /// - /// The ID of the event. - public void Push(string id) - { - _events.Add(new ProfilerEvent - { - Id = id, - Stopwatch = Stopwatch.StartNew() - }); - } - - /// - /// Pops the last pushed event from the profiler. - /// - /// Thrown if the profiler contains no events. - public void Pop() - { - if (_events.Count is 0) - { - throw new InvalidOperationException("Nothing to pop"); - } - - _events.Last().Stopwatch.Stop(); - } - - /// - /// If the profiler took too long to execute, this will log a warning with per-event time usage - /// - /// - private void Report() - { - var main = _events[0]; - if (main.Stopwatch.ElapsedMilliseconds < MaxProfilerTime) - { - return; - } - - var unprofiled = main.Stopwatch.ElapsedMilliseconds; - var builder = new StringBuilder().AppendLine(); - for (var i = 1; i < _events.Count; i++) - { - var profilerEvent = _events[i]; - if (profilerEvent.Stopwatch.IsRunning) - { - throw new InvalidOperationException( - $"Tried to report on a profiler with running stopwatches: {profilerEvent.Id}"); - } - - builder.AppendLine($"{profilerEvent.Id}: {profilerEvent.Stopwatch.ElapsedMilliseconds}ms"); - unprofiled -= profilerEvent.Stopwatch.ElapsedMilliseconds; - } - - builder.AppendLine($": {unprofiled}ms"); - - _logger.LogWarning("Profiler {ID} took {Elapsed} milliseconds to execute (max: {Max}ms):{Events}", main.Id, - main.Stopwatch.ElapsedMilliseconds, MaxProfilerTime, builder.ToString()); - } - - /// - /// the profiler and on it afterwards. - /// - public void PopAndReport() - { - Pop(); - Report(); - } - - /// - /// on the profiler and return a . - /// - /// - /// - public Result ReportWithResult(Result result) - { - PopAndReport(); - return result; - } - - /// - /// Calls with - /// - /// A successful result. - public Result ReportWithSuccess() - { - return ReportWithResult(Result.FromSuccess()); - } -} diff --git a/src/Services/Profiler/ProfilerEvent.cs b/src/Services/Profiler/ProfilerEvent.cs deleted file mode 100644 index f655fc4..0000000 --- a/src/Services/Profiler/ProfilerEvent.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Diagnostics; - -namespace Octobot.Services.Profiler; - -public struct ProfilerEvent -{ - public string Id { get; init; } - public Stopwatch Stopwatch { get; init; } -} diff --git a/src/Services/Profiler/ProfilerFactory.cs b/src/Services/Profiler/ProfilerFactory.cs deleted file mode 100644 index 0135771..0000000 --- a/src/Services/Profiler/ProfilerFactory.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace Octobot.Services.Profiler; - -/// -/// Provides a method to create a . Useful in singletons. -/// -public sealed class ProfilerFactory -{ - private readonly IServiceScopeFactory _scopeFactory; - - public ProfilerFactory(IServiceScopeFactory scopeFactory) - { - _scopeFactory = scopeFactory; - } - - /// - /// Creates a new . - /// - /// A new . - // TODO: remove in future profiler PRs - // ReSharper disable once UnusedMember.Global - public Profiler Create() - { - return _scopeFactory.CreateScope().ServiceProvider.GetRequiredService(); - } -} From d39303560d2c1863fa36c772e457c343bd3578af Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Tue, 6 Feb 2024 23:39:20 +0500 Subject: [PATCH 15/20] Make LogAction return void (#261) 1) the method isn't actually async lulw 2) it always returns success, so might as well just be void reduces complexity by a bit Signed-off-by: Octol1ttle --- src/Commands/BanCommandGroup.cs | 13 +++---------- src/Commands/ClearCommandGroup.cs | 6 +----- src/Commands/KickCommandGroup.cs | 7 ++----- src/Commands/MuteCommandGroup.cs | 13 +++---------- src/Commands/SettingsCommandGroup.cs | 6 +----- src/Services/Utility.cs | 6 ++---- 6 files changed, 12 insertions(+), 39 deletions(-) diff --git a/src/Commands/BanCommandGroup.cs b/src/Commands/BanCommandGroup.cs index 926e615..6dbf9b9 100644 --- a/src/Commands/BanCommandGroup.cs +++ b/src/Commands/BanCommandGroup.cs @@ -196,12 +196,8 @@ public class BanCommandGroup : CommandGroup title, target) .WithColour(ColorsList.Green).Build(); - var logResult = _utility.LogActionAsync( + _utility.LogAction( data.Settings, channelId, executor, title, description, target, ColorsList.Red, ct: ct); - if (!logResult.IsSuccess) - { - return Result.FromError(logResult.Error); - } return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct); } @@ -287,12 +283,9 @@ public class BanCommandGroup : CommandGroup var title = string.Format(Messages.UserUnbanned, target.GetTag()); var description = new StringBuilder().AppendBulletPoint(string.Format(Messages.DescriptionActionReason, reason)); - var logResult = _utility.LogActionAsync( + + _utility.LogAction( data.Settings, channelId, executor, title, description.ToString(), target, ColorsList.Green, ct: ct); - if (!logResult.IsSuccess) - { - return Result.FromError(logResult.Error); - } return await _feedback.SendContextualEmbedResultAsync(embed, ct: ct); } diff --git a/src/Commands/ClearCommandGroup.cs b/src/Commands/ClearCommandGroup.cs index 1d0ad64..395810f 100644 --- a/src/Commands/ClearCommandGroup.cs +++ b/src/Commands/ClearCommandGroup.cs @@ -136,12 +136,8 @@ public class ClearCommandGroup : CommandGroup return Result.FromError(deleteResult.Error); } - var logResult = _utility.LogActionAsync( + _utility.LogAction( data.Settings, channelId, executor, title, description, bot, ColorsList.Red, false, ct); - if (!logResult.IsSuccess) - { - return Result.FromError(logResult.Error); - } var embed = new EmbedBuilder().WithSmallTitle(title, bot) .WithColour(ColorsList.Green).Build(); diff --git a/src/Commands/KickCommandGroup.cs b/src/Commands/KickCommandGroup.cs index a278fb4..0faa1d3 100644 --- a/src/Commands/KickCommandGroup.cs +++ b/src/Commands/KickCommandGroup.cs @@ -157,12 +157,9 @@ public class KickCommandGroup : CommandGroup var title = string.Format(Messages.UserKicked, target.GetTag()); var description = MarkdownExtensions.BulletPoint(string.Format(Messages.DescriptionActionReason, reason)); - var logResult = _utility.LogActionAsync( + + _utility.LogAction( data.Settings, channelId, executor, title, description, target, ColorsList.Red, ct: ct); - if (!logResult.IsSuccess) - { - return Result.FromError(logResult.Error); - } var embed = new EmbedBuilder().WithSmallTitle( string.Format(Messages.UserKicked, target.GetTag()), target) diff --git a/src/Commands/MuteCommandGroup.cs b/src/Commands/MuteCommandGroup.cs index 0156f82..788eb2c 100644 --- a/src/Commands/MuteCommandGroup.cs +++ b/src/Commands/MuteCommandGroup.cs @@ -153,12 +153,8 @@ public class MuteCommandGroup : CommandGroup .AppendBulletPoint(string.Format( Messages.DescriptionActionExpiresAt, Markdown.Timestamp(until))).ToString(); - var logResult = _utility.LogActionAsync( + _utility.LogAction( data.Settings, channelId, executor, title, description, target, ColorsList.Red, ct: ct); - if (!logResult.IsSuccess) - { - return Result.FromError(logResult.Error); - } var embed = new EmbedBuilder().WithSmallTitle( string.Format(Messages.UserMuted, target.GetTag()), target) @@ -339,12 +335,9 @@ public class MuteCommandGroup : CommandGroup var title = string.Format(Messages.UserUnmuted, target.GetTag()); var description = MarkdownExtensions.BulletPoint(string.Format(Messages.DescriptionActionReason, reason)); - var logResult = _utility.LogActionAsync( + + _utility.LogAction( data.Settings, channelId, executor, title, description, target, ColorsList.Green, ct: ct); - if (!logResult.IsSuccess) - { - return Result.FromError(logResult.Error); - } var embed = new EmbedBuilder().WithSmallTitle( string.Format(Messages.UserUnmuted, target.GetTag()), target) diff --git a/src/Commands/SettingsCommandGroup.cs b/src/Commands/SettingsCommandGroup.cs index ce7472f..acfb8ed 100644 --- a/src/Commands/SettingsCommandGroup.cs +++ b/src/Commands/SettingsCommandGroup.cs @@ -218,12 +218,8 @@ public class SettingsCommandGroup : CommandGroup var title = Messages.SettingSuccessfullyChanged; var description = builder.ToString(); - var logResult = _utility.LogActionAsync( + _utility.LogAction( data.Settings, channelId, executor, title, description, bot, ColorsList.Magenta, false, ct); - if (!logResult.IsSuccess) - { - return Result.FromError(logResult.Error); - } var embed = new EmbedBuilder().WithSmallTitle(title, bot) .WithDescription(description) diff --git a/src/Services/Utility.cs b/src/Services/Utility.cs index 401b067..ad06315 100644 --- a/src/Services/Utility.cs +++ b/src/Services/Utility.cs @@ -196,7 +196,7 @@ public sealed class Utility /// /// The cancellation token for this operation. /// A result which has succeeded. - public Result LogActionAsync( + public void LogAction( JsonNode cfg, Snowflake channelId, IUser user, string title, string description, IUser avatar, Color color, bool isPublic = true, CancellationToken ct = default) { @@ -205,7 +205,7 @@ public sealed class Utility if (GuildSettings.PublicFeedbackChannel.Get(cfg).EmptyOrEqualTo(channelId) && GuildSettings.PrivateFeedbackChannel.Get(cfg).EmptyOrEqualTo(channelId)) { - return Result.FromSuccess(); + return; } var logEmbed = new EmbedBuilder().WithSmallTitle(title, avatar) @@ -230,8 +230,6 @@ public sealed class Utility privateChannel, embedResult: logEmbed, ct: ct); } - - return Result.FromSuccess(); } public async Task> GetEmergencyFeedbackChannel(IGuild guild, GuildData data, CancellationToken ct) From fe22ed3025daa94a73d261395fa7e86f76a14e48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 08:44:52 +0000 Subject: [PATCH 16/20] Bump muno92/resharper_inspectcode from 1.11.6 to 1.11.7 (#262) --- .github/workflows/build-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml index 4867741..8002f6f 100644 --- a/.github/workflows/build-pr.yml +++ b/.github/workflows/build-pr.yml @@ -23,7 +23,7 @@ jobs: uses: actions/checkout@v4 - name: ReSharper CLI InspectCode - uses: muno92/resharper_inspectcode@1.11.6 + uses: muno92/resharper_inspectcode@1.11.7 with: solutionPath: ./Octobot.sln ignoreIssueType: InvertIf, ConvertIfStatementToSwitchStatement, ConvertToPrimaryConstructor From bf8a89c4e967efc69e4dc8eadf04617ad6a2f79f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 13:56:14 +0500 Subject: [PATCH 17/20] Bump the remora group with 3 updates (#263) --- Octobot.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Octobot.csproj b/Octobot.csproj index 1c2c08c..ab76400 100644 --- a/Octobot.csproj +++ b/Octobot.csproj @@ -26,9 +26,9 @@ - - - + + + From 8eed295fcda981fdd506b20a187634d60434f239 Mon Sep 17 00:00:00 2001 From: Macintxsh <95250141+mctaylors@users.noreply.github.com> Date: Wed, 13 Mar 2024 20:40:29 +0300 Subject: [PATCH 18/20] Add /8ball command (#264) @neroduckale was bored so I made this feature. --------- Signed-off-by: mctaylors Signed-off-by: Macintxsh <95250141+mctaylors@users.noreply.github.com> Co-authored-by: Octol1ttle --- locale/Messages.resx | 60 +++++++++++++++ locale/Messages.ru.resx | 60 +++++++++++++++ locale/Messages.tt-ru.resx | 60 +++++++++++++++ src/Commands/ToolsCommandGroup.cs | 63 +++++++++++++++- src/Messages.Designer.cs | 120 ++++++++++++++++++++++++++++++ 5 files changed, 362 insertions(+), 1 deletion(-) diff --git a/locale/Messages.resx b/locale/Messages.resx index 218c414..b881996 100644 --- a/locale/Messages.resx +++ b/locale/Messages.resx @@ -594,4 +594,64 @@ Reminder edited + + It is certain + + + It is decidedly so + + + Without a doubt + + + Yes — definitely + + + You may rely on it + + + As I see it, yes + + + Most likely + + + Outlook good + + + Signs point to yes + + + Yes + + + Reply hazy, try again + + + Ask again later + + + Better not tell you now + + + Cannot predict now + + + Concentrate and ask again + + + Don’t count on it + + + My reply is no + + + My sources say no + + + Outlook not so good + + + Very doubtful + diff --git a/locale/Messages.ru.resx b/locale/Messages.ru.resx index 3eb53f1..cb318cd 100644 --- a/locale/Messages.ru.resx +++ b/locale/Messages.ru.resx @@ -594,4 +594,64 @@ Напоминание отредактировано + + Бесспорно + + + Предрешено + + + Никаких сомнений + + + Определённо да + + + Можешь быть уверен в этом + + + Мне кажется — «да» + + + Вероятнее всего + + + Хорошие перспективы + + + Знаки говорят — «да» + + + Да + + + Пока не ясно, попробуй снова + + + Спроси позже + + + Лучше не рассказывать + + + Сейчас нельзя предсказать + + + Сконцентрируйся и спроси снова + + + Даже не думай + + + Мой ответ — «нет» + + + По моим данным — «нет» + + + Перспективы не очень хорошие + + + Весьма сомнительно + diff --git a/locale/Messages.tt-ru.resx b/locale/Messages.tt-ru.resx index f5d789b..f0b80a7 100644 --- a/locale/Messages.tt-ru.resx +++ b/locale/Messages.tt-ru.resx @@ -594,4 +594,64 @@ напоминалка подправлена + + абсолютли + + + заявлено + + + ваще не сомневайся + + + 100% да + + + будь в этом уверен + + + я считаю что да + + + ну вполне вероятно + + + ну выглядит нормально + + + мне сказали ок + + + мгм + + + ну-ка попробуй снова + + + давай позже + + + щас пока не скажу + + + я не могу сейчас предсказать + + + ну сконцентрируйся и давай еще раз + + + даже не думай + + + мое завление это нет + + + я тут посчитал, короче нет + + + выглядит такое себе + + + чот сомневаюсь + diff --git a/src/Commands/ToolsCommandGroup.cs b/src/Commands/ToolsCommandGroup.cs index fb87117..3c16232 100644 --- a/src/Commands/ToolsCommandGroup.cs +++ b/src/Commands/ToolsCommandGroup.cs @@ -21,7 +21,7 @@ using Remora.Results; namespace Octobot.Commands; /// -/// Handles tool commands: /userinfo, /guildinfo, /random, /timestamp. +/// Handles tool commands: /userinfo, /guildinfo, /random, /timestamp, /8ball. /// [UsedImplicitly] public class ToolsCommandGroup : CommandGroup @@ -496,4 +496,65 @@ public class ToolsCommandGroup : CommandGroup return _feedback.SendContextualEmbedResultAsync(embed, ct: ct); } + + /// + /// A slash command that shows a random answer from the Magic 8-Ball. + /// + /// Unused input. + /// + /// The 8-Ball answers were taken from Wikipedia. + /// + /// + /// A feedback sending result which may or may not have succeeded. + /// + [Command("8ball")] + [DiscordDefaultDMPermission(false)] + [Description("Ask the Magic 8-Ball a question")] + [UsedImplicitly] + public async Task ExecuteEightBallAsync( + // let the user think he's actually asking the ball a question + string question) + { + if (!_context.TryGetContextIDs(out var guildId, out _, out _)) + { + return new ArgumentInvalidError(nameof(_context), "Unable to retrieve necessary IDs from command context"); + } + + var botResult = await _userApi.GetCurrentUserAsync(CancellationToken); + if (!botResult.IsDefined(out var bot)) + { + return Result.FromError(botResult); + } + + var data = await _guildData.GetData(guildId, CancellationToken); + Messages.Culture = GuildSettings.Language.Get(data.Settings); + + return await AnswerEightBallAsync(bot, CancellationToken); + } + + private static readonly string[] AnswerTypes = + [ + "Positive", "Questionable", "Neutral", "Negative" + ]; + + private Task AnswerEightBallAsync(IUser bot, CancellationToken ct) + { + var typeNumber = Random.Shared.Next(0, 4); + var embedColor = typeNumber switch + { + 0 => ColorsList.Blue, + 1 => ColorsList.Green, + 2 => ColorsList.Yellow, + 3 => ColorsList.Red, + _ => throw new ArgumentOutOfRangeException(null, nameof(typeNumber)) + }; + + var answer = $"EightBall{AnswerTypes[typeNumber]}{Random.Shared.Next(1, 6)}".Localized(); + + var embed = new EmbedBuilder().WithSmallTitle(answer, bot) + .WithColour(embedColor) + .Build(); + + return _feedback.SendContextualEmbedResultAsync(embed, ct: ct); + } } diff --git a/src/Messages.Designer.cs b/src/Messages.Designer.cs index a0c915a..9597bcd 100644 --- a/src/Messages.Designer.cs +++ b/src/Messages.Designer.cs @@ -1058,5 +1058,125 @@ namespace Octobot { return ResourceManager.GetString("ReminderEdited", resourceCulture); } } + + internal static string EightBallPositive1 { + get { + return ResourceManager.GetString("EightBallPositive1", resourceCulture); + } + } + + internal static string EightBallPositive2 { + get { + return ResourceManager.GetString("EightBallPositive2", resourceCulture); + } + } + + internal static string EightBallPositive3 { + get { + return ResourceManager.GetString("EightBallPositive3", resourceCulture); + } + } + + internal static string EightBallPositive4 { + get { + return ResourceManager.GetString("EightBallPositive4", resourceCulture); + } + } + + internal static string EightBallPositive5 { + get { + return ResourceManager.GetString("EightBallPositive5", resourceCulture); + } + } + + internal static string EightBallQuestionable1 { + get { + return ResourceManager.GetString("EightBallQuestionable1", resourceCulture); + } + } + + internal static string EightBallQuestionable2 { + get { + return ResourceManager.GetString("EightBallQuestionable2", resourceCulture); + } + } + + internal static string EightBallQuestionable3 { + get { + return ResourceManager.GetString("EightBallQuestionable3", resourceCulture); + } + } + + internal static string EightBallQuestionable4 { + get { + return ResourceManager.GetString("EightBallQuestionable4", resourceCulture); + } + } + + internal static string EightBallQuestionable5 { + get { + return ResourceManager.GetString("EightBallQuestionable5", resourceCulture); + } + } + + internal static string EightBallNeutral1 { + get { + return ResourceManager.GetString("EightBallNeutral1", resourceCulture); + } + } + + internal static string EightBallNeutral2 { + get { + return ResourceManager.GetString("EightBallNeutral2", resourceCulture); + } + } + + internal static string EightBallNeutral3 { + get { + return ResourceManager.GetString("EightBallNeutral3", resourceCulture); + } + } + + internal static string EightBallNeutral4 { + get { + return ResourceManager.GetString("EightBallNeutral4", resourceCulture); + } + } + + internal static string EightBallNeutral5 { + get { + return ResourceManager.GetString("EightBallNeutral5", resourceCulture); + } + } + + internal static string EightBallNegative1 { + get { + return ResourceManager.GetString("EightBallNegative1", resourceCulture); + } + } + + internal static string EightBallNegative2 { + get { + return ResourceManager.GetString("EightBallNegative2", resourceCulture); + } + } + + internal static string EightBallNegative3 { + get { + return ResourceManager.GetString("EightBallNegative3", resourceCulture); + } + } + + internal static string EightBallNegative4 { + get { + return ResourceManager.GetString("EightBallNegative4", resourceCulture); + } + } + + internal static string EightBallNegative5 { + get { + return ResourceManager.GetString("EightBallNegative5", resourceCulture); + } + } } } From 62709d927be7dcbd19ffe32d03c2a6e77ccf88b9 Mon Sep 17 00:00:00 2001 From: Macintxsh <95250141+mctaylors@users.noreply.github.com> Date: Sun, 17 Mar 2024 16:46:53 +0300 Subject: [PATCH 19/20] Add time format example to the description of commands that use TimeSpan. (#267) This PR was made to help users who are trying /remind for the first time by showing an example of the correct time format in the description. --------- Signed-off-by: Macintxsh <95250141+mctaylors@users.noreply.github.com> Signed-off-by: mctaylors --- locale/Messages.resx | 3 +++ locale/Messages.ru.resx | 3 +++ locale/Messages.tt-ru.resx | 3 +++ src/Commands/BanCommandGroup.cs | 4 +++- src/Commands/MuteCommandGroup.cs | 3 ++- src/Commands/RemindCommandGroup.cs | 4 +++- src/Commands/ToolsCommandGroup.cs | 1 + src/Messages.Designer.cs | 6 ++++++ 8 files changed, 24 insertions(+), 3 deletions(-) diff --git a/locale/Messages.resx b/locale/Messages.resx index b881996..ca48fba 100644 --- a/locale/Messages.resx +++ b/locale/Messages.resx @@ -654,4 +654,7 @@ Very doubtful + + Example of a valid input: `1h30m` + diff --git a/locale/Messages.ru.resx b/locale/Messages.ru.resx index cb318cd..7423347 100644 --- a/locale/Messages.ru.resx +++ b/locale/Messages.ru.resx @@ -654,4 +654,7 @@ Весьма сомнительно + + Пример правильного ввода: `1ч30м` + diff --git a/locale/Messages.tt-ru.resx b/locale/Messages.tt-ru.resx index f0b80a7..dc3bb6f 100644 --- a/locale/Messages.tt-ru.resx +++ b/locale/Messages.tt-ru.resx @@ -654,4 +654,7 @@ чот сомневаюсь + + правильно пишут так: `1h30m` + diff --git a/src/Commands/BanCommandGroup.cs b/src/Commands/BanCommandGroup.cs index 6dbf9b9..c350729 100644 --- a/src/Commands/BanCommandGroup.cs +++ b/src/Commands/BanCommandGroup.cs @@ -76,7 +76,8 @@ public class BanCommandGroup : CommandGroup [Description("User to ban")] IUser target, [Description("Ban reason")] [MaxLength(256)] string reason, - [Description("Ban duration")] string? duration = null) + [Description("Ban duration (e.g. 1h30m)")] + string? duration = null) { if (!_context.TryGetContextIDs(out var guildId, out var channelId, out var executorId)) { @@ -116,6 +117,7 @@ public class BanCommandGroup : CommandGroup { var failedEmbed = new EmbedBuilder() .WithSmallTitle(Messages.InvalidTimeSpan, bot) + .WithDescription(Messages.TimeSpanExample) .WithColour(ColorsList.Red) .Build(); diff --git a/src/Commands/MuteCommandGroup.cs b/src/Commands/MuteCommandGroup.cs index 788eb2c..c2542e8 100644 --- a/src/Commands/MuteCommandGroup.cs +++ b/src/Commands/MuteCommandGroup.cs @@ -73,7 +73,7 @@ public class MuteCommandGroup : CommandGroup [Description("Member to mute")] IUser target, [Description("Mute reason")] [MaxLength(256)] string reason, - [Description("Mute duration")] [Option("duration")] + [Description("Mute duration (e.g. 1h30m)")] [Option("duration")] string stringDuration) { if (!_context.TryGetContextIDs(out var guildId, out var channelId, out var executorId)) @@ -111,6 +111,7 @@ public class MuteCommandGroup : CommandGroup { var failedEmbed = new EmbedBuilder() .WithSmallTitle(Messages.InvalidTimeSpan, bot) + .WithDescription(Messages.TimeSpanExample) .WithColour(ColorsList.Red) .Build(); diff --git a/src/Commands/RemindCommandGroup.cs b/src/Commands/RemindCommandGroup.cs index c270f30..f9c006e 100644 --- a/src/Commands/RemindCommandGroup.cs +++ b/src/Commands/RemindCommandGroup.cs @@ -120,7 +120,7 @@ public class RemindCommandGroup : CommandGroup [RequireContext(ChannelContext.Guild)] [UsedImplicitly] public async Task ExecuteReminderAsync( - [Description("After what period of time mention the reminder")] + [Description("After what period of time mention the reminder (e.g. 1h30m)")] [Option("in")] string timeSpanString, [Description("Reminder text")] [MaxLength(512)] @@ -151,6 +151,7 @@ public class RemindCommandGroup : CommandGroup { var failedEmbed = new EmbedBuilder() .WithSmallTitle(Messages.InvalidTimeSpan, bot) + .WithDescription(Messages.TimeSpanExample) .WithColour(ColorsList.Red) .Build(); @@ -264,6 +265,7 @@ public class RemindCommandGroup : CommandGroup { var failedEmbed = new EmbedBuilder() .WithSmallTitle(Messages.InvalidTimeSpan, bot) + .WithDescription(Messages.TimeSpanExample) .WithColour(ColorsList.Red) .Build(); diff --git a/src/Commands/ToolsCommandGroup.cs b/src/Commands/ToolsCommandGroup.cs index 3c16232..ea91e1e 100644 --- a/src/Commands/ToolsCommandGroup.cs +++ b/src/Commands/ToolsCommandGroup.cs @@ -461,6 +461,7 @@ public class ToolsCommandGroup : CommandGroup { var failedEmbed = new EmbedBuilder() .WithSmallTitle(Messages.InvalidTimeSpan, bot) + .WithDescription(Messages.TimeSpanExample) .WithColour(ColorsList.Red) .Build(); diff --git a/src/Messages.Designer.cs b/src/Messages.Designer.cs index 9597bcd..ca460cf 100644 --- a/src/Messages.Designer.cs +++ b/src/Messages.Designer.cs @@ -1178,5 +1178,11 @@ namespace Octobot { return ResourceManager.GetString("EightBallNegative5", resourceCulture); } } + + internal static string TimeSpanExample { + get { + return ResourceManager.GetString("TimeSpanExample", resourceCulture); + } + } } } From 5105b43eff654839edc1d126fa8f33972bfee75b Mon Sep 17 00:00:00 2001 From: Macintxsh <95250141+mctaylors@users.noreply.github.com> Date: Mon, 18 Mar 2024 11:42:37 +0300 Subject: [PATCH 20/20] Add WelcomeMessagesChannel setting (#269) Closes #232 Signed-off-by: mctaylors --- locale/Messages.resx | 3 +++ locale/Messages.ru.resx | 3 +++ locale/Messages.tt-ru.resx | 3 +++ src/Commands/SettingsCommandGroup.cs | 1 + src/Data/GuildSettings.cs | 5 +++++ src/Data/Options/AllOptionsEnum.cs | 1 + src/Messages.Designer.cs | 7 +++++++ src/Responders/GuildMemberJoinedResponder.cs | 4 ++-- 8 files changed, 25 insertions(+), 2 deletions(-) diff --git a/locale/Messages.resx b/locale/Messages.resx index ca48fba..c8ef510 100644 --- a/locale/Messages.resx +++ b/locale/Messages.resx @@ -657,4 +657,7 @@ Example of a valid input: `1h30m` + + Welcome messages channel + diff --git a/locale/Messages.ru.resx b/locale/Messages.ru.resx index 7423347..eb8e57b 100644 --- a/locale/Messages.ru.resx +++ b/locale/Messages.ru.resx @@ -657,4 +657,7 @@ Пример правильного ввода: `1ч30м` + + Канал для приветствий + diff --git a/locale/Messages.tt-ru.resx b/locale/Messages.tt-ru.resx index dc3bb6f..df50d8d 100644 --- a/locale/Messages.tt-ru.resx +++ b/locale/Messages.tt-ru.resx @@ -657,4 +657,7 @@ правильно пишут так: `1h30m` + + канал куда говорить здравствуйте + diff --git a/src/Commands/SettingsCommandGroup.cs b/src/Commands/SettingsCommandGroup.cs index acfb8ed..86f031f 100644 --- a/src/Commands/SettingsCommandGroup.cs +++ b/src/Commands/SettingsCommandGroup.cs @@ -46,6 +46,7 @@ public class SettingsCommandGroup : CommandGroup GuildSettings.RenameHoistedUsers, GuildSettings.PublicFeedbackChannel, GuildSettings.PrivateFeedbackChannel, + GuildSettings.WelcomeMessagesChannel, GuildSettings.EventNotificationChannel, GuildSettings.DefaultRole, GuildSettings.MuteRole, diff --git a/src/Data/GuildSettings.cs b/src/Data/GuildSettings.cs index cdaede6..5a99505 100644 --- a/src/Data/GuildSettings.cs +++ b/src/Data/GuildSettings.cs @@ -56,6 +56,11 @@ public static class GuildSettings /// public static readonly SnowflakeOption PrivateFeedbackChannel = new("PrivateFeedbackChannel"); + /// + /// Controls what channel should welcome messages be sent to. + /// + public static readonly SnowflakeOption WelcomeMessagesChannel = new("WelcomeMessagesChannel"); + public static readonly SnowflakeOption EventNotificationChannel = new("EventNotificationChannel"); public static readonly SnowflakeOption DefaultRole = new("DefaultRole"); public static readonly SnowflakeOption MuteRole = new("MuteRole"); diff --git a/src/Data/Options/AllOptionsEnum.cs b/src/Data/Options/AllOptionsEnum.cs index a96a9ac..e9637d6 100644 --- a/src/Data/Options/AllOptionsEnum.cs +++ b/src/Data/Options/AllOptionsEnum.cs @@ -21,6 +21,7 @@ public enum AllOptionsEnum [UsedImplicitly] RenameHoistedUsers, [UsedImplicitly] PublicFeedbackChannel, [UsedImplicitly] PrivateFeedbackChannel, + [UsedImplicitly] WelcomeMessagesChannel, [UsedImplicitly] EventNotificationChannel, [UsedImplicitly] DefaultRole, [UsedImplicitly] MuteRole, diff --git a/src/Messages.Designer.cs b/src/Messages.Designer.cs index ca460cf..5ad741e 100644 --- a/src/Messages.Designer.cs +++ b/src/Messages.Designer.cs @@ -1184,5 +1184,12 @@ namespace Octobot { return ResourceManager.GetString("TimeSpanExample", resourceCulture); } } + + internal static string SettingsWelcomeMessagesChannel + { + get { + return ResourceManager.GetString("SettingsWelcomeMessagesChannel", resourceCulture); + } + } } } diff --git a/src/Responders/GuildMemberJoinedResponder.cs b/src/Responders/GuildMemberJoinedResponder.cs index eee93b6..012bfad 100644 --- a/src/Responders/GuildMemberJoinedResponder.cs +++ b/src/Responders/GuildMemberJoinedResponder.cs @@ -51,7 +51,7 @@ public class GuildMemberJoinedResponder : IResponder return Result.FromError(returnRolesResult.Error); } - if (GuildSettings.PublicFeedbackChannel.Get(cfg).Empty() + if (GuildSettings.WelcomeMessagesChannel.Get(cfg).Empty() || GuildSettings.WelcomeMessage.Get(cfg) is "off" or "disable" or "disabled") { return Result.FromSuccess(); @@ -76,7 +76,7 @@ public class GuildMemberJoinedResponder : IResponder .Build(); return await _channelApi.CreateMessageWithEmbedResultAsync( - GuildSettings.PublicFeedbackChannel.Get(cfg), embedResult: embed, + GuildSettings.WelcomeMessagesChannel.Get(cfg), embedResult: embed, allowedMentions: Octobot.NoMentions, ct: ct); }
Release notes

Sourced from muno92/resharper_inspectcode's releases.

1.11.6

What's Changed

Full Changelog: https://github.com/muno92/resharper_inspectcode/compare/1.11.5...1.11.6