1
0
Fork 1
mirror of https://github.com/TeamOctolings/Octobot.git synced 2025-04-19 08:23:35 +03:00
This commit is contained in:
mctaylors 2022-10-22 15:25:32 +03:00
commit 6b36e2c310
10 changed files with 475 additions and 34 deletions

27
.github/dependabot.yml vendored Normal file
View file

@ -0,0 +1,27 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "github-actions" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "weekly"
allow:
# Allow both direct and indirect updates for all packages
- dependency-type: "all"
assignees:
- "l1ttleO"
- package-ecosystem: "nuget" # See documentation for possible values
directory: "/Boyfriend" # Location of package manifests
schedule:
interval: "weekly"
allow:
# Allow both direct and indirect updates for all packages
- dependency-type: "all"
# Add assignees
assignees:
- "l1ttleO"

44
.github/workflows/codeql.yml vendored Normal file
View file

@ -0,0 +1,44 @@
name: "CodeQL"
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
schedule:
- cron: '45 7 * * 2'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'csharp' ]
steps:
- name: Checkout repository
uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
queries: +security-extended,security-and-quality
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually
- name: Autobuild
uses: github/codeql-action/autobuild@v2
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:${{matrix.language}}"

View file

@ -83,7 +83,7 @@ public static class Boyfriend {
if (!RemovedRolesDictionary.ContainsKey(id))
RemovedRolesDictionary.Add(id, new Dictionary<ulong, ReadOnlyCollection<ulong>>());
if (GuildConfigDictionary.ContainsKey(id)) return GuildConfigDictionary[id];
if (GuildConfigDictionary.TryGetValue(id, out var cfg)) return cfg;
var path = $"config_{id}.json";
@ -110,7 +110,7 @@ public static class Boyfriend {
}
public static Dictionary<ulong, ReadOnlyCollection<ulong>> GetRemovedRoles(ulong id) {
if (RemovedRolesDictionary.ContainsKey(id)) return RemovedRolesDictionary[id];
if (RemovedRolesDictionary.TryGetValue(id, out var dict)) return dict;
var path = $"removedroles_{id}.json";
@ -126,7 +126,7 @@ public static class Boyfriend {
}
public static SocketGuild FindGuild(ulong channel) {
if (GuildCache.ContainsKey(channel)) return GuildCache[channel];
if (GuildCache.TryGetValue(channel, out var gld)) return gld;
foreach (var guild in Client.Guilds) {
// ReSharper disable once LoopCanBeConvertedToQuery
foreach (var x in guild.Channels)

View file

@ -8,11 +8,11 @@
<LangVersion>default</LangVersion>
<Title>Boyfriend</Title>
<Authors>l1ttle</Authors>
<PackageProjectUrl>https://git.cavej376.xyz/Octol1ttle/Boyfriend-CSharp</PackageProjectUrl>
<RepositoryUrl>https://git.cavej376.xyz/Octol1ttle/Boyfriend-CSharp</RepositoryUrl>
<PackageProjectUrl>https://github.com/l1ttleO/Boyfriend-CSharp</PackageProjectUrl>
<RepositoryUrl>https://github.com/l1ttleO/Boyfriend-CSharp</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageVersion>1.0.1</PackageVersion>
<PackageLicenseUrl>https://git.cavej376.xyz/Octol1ttle/Boyfriend-CSharp/src/branch/master/LICENSE</PackageLicenseUrl>
<PackageVersion>1.0.0</PackageVersion>
<PackageLicenseUrl>https://github.com/l1ttleO/Boyfriend-CSharp/blob/master/LICENSE</PackageLicenseUrl>
<NeutralLanguage>en</NeutralLanguage>
</PropertyGroup>

View file

@ -1,5 +1,4 @@
using System.Text;
using System.Text.RegularExpressions;
using Boyfriend.Commands;
using Discord;
using Discord.Commands;
@ -14,14 +13,14 @@ public sealed class CommandProcessor {
private const string NoAccess = ":no_entry_sign: ";
private const string CantInteract = ":vertical_traffic_light: ";
private const string Mention = "<@855023234407333888>";
public static readonly ICommand[] Commands = {
new BanCommand(), new ClearCommand(), new HelpCommand(),
new KickCommand(), new MuteCommand(), new PingCommand(),
new SettingsCommand(), new UnbanCommand(), new UnmuteCommand()
};
private static readonly Dictionary<string, Regex> RegexCache = new();
private static readonly Regex MentionRegex = new(Regex.Escape("<@855023234407333888>"), RegexOptions.Compiled);
private readonly StringBuilder _stackedPrivateFeedback = new();
private readonly StringBuilder _stackedPublicFeedback = new();
private readonly StringBuilder _stackedReplyMessage = new();
@ -46,16 +45,10 @@ public sealed class CommandProcessor {
return;
}
Regex regex;
if (RegexCache.ContainsKey(config["Prefix"])) { regex = RegexCache[config["Prefix"]]; } else {
regex = new Regex(Regex.Escape(config["Prefix"]), RegexOptions.Compiled | RegexOptions.IgnoreCase);
RegexCache.Add(config["Prefix"], regex);
}
var list = Context.Message.Content.Split("\n");
var cleanList = Context.Message.CleanContent.Split("\n");
for (var i = 0; i < list.Length; i++) {
RunCommandOnLine(list[i], cleanList[i], regex);
RunCommandOnLine(list[i], cleanList[i], config["Prefix"]);
if (_serverBlacklisted) {
await Context.Message.ReplyAsync(Messages.ServerBlacklisted);
return;
@ -78,20 +71,21 @@ public sealed class CommandProcessor {
SendFeedbacks();
}
private void RunCommandOnLine(string line, string cleanLine, Regex regex) {
private void RunCommandOnLine(string line, string cleanLine, string prefix) {
var prefixed = line[..prefix.Length] == prefix;
if (!prefixed && line[..Mention.Length] is not Mention) return;
foreach (var command in Commands) {
var lineNoMention = regex.Replace(MentionRegex.Replace(line, "", 1), "", 1);
if (lineNoMention == line
|| !command.Aliases.Contains(lineNoMention.Trim().ToLower().Split()[0]))
continue;
var lineNoMention = line.Remove(0, prefixed ? prefix.Length : Mention.Length);
if (!command.Aliases.Contains(lineNoMention.Trim().Split()[0])) continue;
if (Utils.IsServerBlacklisted(Context.Guild)) {
_serverBlacklisted = true;
return;
}
var args = line.Split().Skip(lineNoMention.StartsWith(" ") ? 2 : 1).ToArray();
var args = lineNoMention.Trim().Split().Skip(1).ToArray();
var cleanArgs = cleanLine.Split().Skip(lineNoMention.StartsWith(" ") ? 2 : 1).ToArray();
_tasks.Add(command.RunAsync(this, args, cleanArgs));
return;
}
}

View file

@ -26,8 +26,8 @@ public sealed class MuteCommand : ICommand {
var rolesRemoved = Boyfriend.GetRemovedRoles(cmd.Context.Guild.Id);
if (rolesRemoved.ContainsKey(toMute.Id)) {
foreach (var roleId in rolesRemoved[toMute.Id]) await toMute.AddRoleAsync(roleId);
if (rolesRemoved.TryGetValue(toMute.Id, out var mutedRemovedRoles)) {
foreach (var roleId in mutedRemovedRoles) await toMute.AddRoleAsync(roleId);
rolesRemoved.Remove(toMute.Id);
cmd.ConfigWriteScheduled = true;
cmd.Reply(Messages.RolesReturned, ":warning: ");

View file

@ -110,10 +110,9 @@ public sealed class SettingsCommand : ICommand {
};
if (value is "reset" or "default") {
if (selectedSetting is "WelcomeMessage")
config[selectedSetting] = Messages.DefaultWelcomeMessage;
else
config[selectedSetting] = Boyfriend.DefaultConfig[selectedSetting];
config[selectedSetting] = selectedSetting is "WelcomeMessage"
? Messages.DefaultWelcomeMessage
: Boyfriend.DefaultConfig[selectedSetting];
} else {
if (value == config[selectedSetting]) {
cmd.Reply(string.Format(Messages.SettingsNothingChanged, localizedSelectedSetting, formattedValue),

View file

@ -23,8 +23,8 @@ public sealed class UnmuteCommand : ICommand {
if (role != null && toUnmute.Roles.Contains(role)) {
var rolesRemoved = Boyfriend.GetRemovedRoles(cmd.Context.Guild.Id);
if (rolesRemoved.ContainsKey(toUnmute.Id)) {
await toUnmute.AddRolesAsync(rolesRemoved[toUnmute.Id]);
if (rolesRemoved.TryGetValue(toUnmute.Id, out var unmutedRemovedRoles)) {
await toUnmute.AddRolesAsync(unmutedRemovedRoles);
rolesRemoved.Remove(toUnmute.Id);
cmd.ConfigWriteScheduled = true;
}

378
Boyfriend/Messages.mc.resx Normal file
View file

@ -0,0 +1,378 @@
<root>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="Ready" xml:space="preserve">
<value>{0}я родился! (C#)</value>
</data>
<data name="CachedMessageDeleted" xml:space="preserve">
<value>вырезано {0} в канале {1}: {2}</value>
</data>
<data name="AutobanReason" xml:space="preserve">
<value>ты тут распинался сильно, иди отдохни.</value>
</data>
<data name="CachedMessageEdited" xml:space="preserve">
<value>переделано {0}: {1} -&gt; {2}</value>
</data>
<data name="DefaultWelcomeMessage" xml:space="preserve">
<value>{0}, добро пожаловать на сервер {1}</value>
</data>
<data name="Beep1" xml:space="preserve">
<value>брах!</value>
</data>
<data name="Beep2" xml:space="preserve">
<value>брох!</value>
</data>
<data name="Beep3" xml:space="preserve">
<value>брух!</value>
</data>
<data name="CommandNoPermissionBot" xml:space="preserve">
<value>у меня прав нету, сделай что нибудь.</value>
</data>
<data name="CommandNoPermissionUser" xml:space="preserve">
<value>у тебя прав нету, твои проблемы.</value>
</data>
<data name="YouWereBanned" xml:space="preserve">
<value>здарова, тебя крч забанил {0} на сервере {1} за {2}</value>
</data>
<data name="PunishmentExpired" xml:space="preserve">
<value>время бана закончиловсь</value>
</data>
<data name="ClearAmountTooSmall" xml:space="preserve">
<value>ты выбрал менее {0} сообщений</value>
</data>
<data name="ClearAmountTooLarge" xml:space="preserve">
<value>ты выбрал более {0} сообщений</value>
</data>
<data name="CommandHelp" xml:space="preserve">
<value>туториал по приколам:</value>
</data>
<data name="YouWereKicked" xml:space="preserve">
<value>здарова, тебя крч кикнул {0} на сервере {1} за {2}</value>
</data>
<data name="Milliseconds" xml:space="preserve">
<value>мс</value>
</data>
<data name="MemberAlreadyMuted" xml:space="preserve">
<value>шизоид уже замучен!</value>
</data>
<data name="ChannelNotSpecified" xml:space="preserve">
<value>*тут ничего нет*</value>
</data>
<data name="RoleNotSpecified" xml:space="preserve">
<value>*тут ничего нет*</value>
</data>
<data name="CurrentSettings" xml:space="preserve">
<value>настройки:</value>
</data>
<data name="SettingsLang" xml:space="preserve">
<value>язык</value>
</data>
<data name="SettingsPrefix" xml:space="preserve">
<value>префикс</value>
</data>
<data name="SettingsRemoveRolesOnMute" xml:space="preserve">
<value>удалять звание при муте</value>
</data>
<data name="SettingsSendWelcomeMessages" xml:space="preserve">
<value>разглашать о том что пришел новый шизоид</value>
</data>
<data name="SettingsMuteRole" xml:space="preserve">
<value>роль замученного</value>
</data>
<data name="SettingsAdminLogChannel" xml:space="preserve">
<value>канал админ-уведомлений</value>
</data>
<data name="SettingsBotLogChannel" xml:space="preserve">
<value>канал бот-уведомлений</value>
</data>
<data name="LanguageNotSupported" xml:space="preserve">
<value>такого языка нету, ты шо</value>
</data>
<data name="Yes" xml:space="preserve">
<value>да</value>
</data>
<data name="No" xml:space="preserve">
<value>нъет</value>
</data>
<data name="UserNotBanned" xml:space="preserve">
<value>шизик не забанен</value>
</data>
<data name="MemberNotMuted" xml:space="preserve">
<value>шизоид не замучен!</value>
</data>
<data name="RolesReturned" xml:space="preserve">
<value>кто-то решил поумничать и обошел роль мута. я ее вернул.</value>
</data>
<data name="SettingsWelcomeMessage" xml:space="preserve">
<value>приветствие</value>
</data>
<data name="ClearAmountInvalid" xml:space="preserve">
<value>выбери число от {0} до {1} вместо {2}!</value>
</data>
<data name="FeedbackUserBanned" xml:space="preserve">
<value>забанен {0} на{1}: {2}</value>
</data>
<data name="UserNotInGuild" xml:space="preserve">
<value>шизик не на этом сервере</value>
</data>
<data name="SettingDoesntExist" xml:space="preserve">
<value>такой прикол не существует</value>
</data>
<data name="SettingsReceiveStartupMessages" xml:space="preserve">
<value>получать инфу о рождении бота</value>
</data>
<data name="InvalidSettingValue" xml:space="preserve">
<value>криво настроил прикол, давай по новой</value>
</data>
<data name="InvalidRole" xml:space="preserve">
<value>этого звания нету, ты шо</value>
</data>
<data name="InvalidChannel" xml:space="preserve">
<value>этого канала нету, ты шо</value>
</data>
<data name="RoleRemovalFailed" xml:space="preserve">
<value>я не украл звание {0} в связи с ошибкой! {1}</value>
</data>
<data name="DurationRequiredForTimeOuts" xml:space="preserve">
<value>ты шо, мутить больше чем на 28 дней таймаут не разрешает, вот настроишь роль мута, тогда поговорим</value>
</data>
<data name="CannotTimeOutBot" xml:space="preserve">
<value>я не могу замутить ботов, сделай что нибудь</value>
</data>
<data name="SettingsStarterRole" xml:space="preserve">
<value>базовое звание</value>
</data>
<data name="EventCreated" xml:space="preserve">
<value>{1}{2} приготовил новый квест {3}! он пройдёт в {4} и начнётся &lt;t:{5}:R&gt;!{0}{6}</value>
</data>
<data name="SettingsEventNotifyReceiverRole" xml:space="preserve">
<value>роль для уведомлений о создании квеста</value>
</data>
<data name="SettingsEventCreatedChannel" xml:space="preserve">
<value>канал для уведомлений о создании квеста</value>
</data>
<data name="SettingsEventStartedChannel" xml:space="preserve">
<value>канал для уведомлений о начале квеста</value>
</data>
<data name="SettingsEventStartedReceivers" xml:space="preserve">
<value>получатели уведомлений о начале квеста</value>
</data>
<data name="EventStarted" xml:space="preserve">
<value>{0}квест {1} начинается в {2}!</value>
</data>
<data name="SettingsFrowningFace" xml:space="preserve">
<value>оъмъомоъемъъео(((( </value>
</data>
<data name="EventCancelled" xml:space="preserve">
<value>квест {0} отменен!{1}</value>
</data>
<data name="SettingsEventCancelledChannel" xml:space="preserve">
<value>канал для уведомлений о отмене событий</value>
</data>
<data name="SettingsEventCompletedChannel" xml:space="preserve">
<value>канал для уведомлений о завершении квеста</value>
</data>
<data name="EventCompleted" xml:space="preserve">
<value>квест {0} завершен! все это длилось {1}</value>
</data>
<data name="FeedbackFormat" xml:space="preserve">
<value>*[{0}: {1}]* </value>
</data>
<data name="Ever" xml:space="preserve">
<value>всегда</value>
</data>
<data name="FeedbackMessagesCleared" xml:space="preserve">
<value>удалено {0} сообщений в {1}</value>
</data>
<data name="FeedbackMemberKicked" xml:space="preserve">
<value>выгнан {0}: {1}</value>
</data>
<data name="FeedbackMemberMuted" xml:space="preserve">
<value>замучен {0} на{1}: {2}</value>
</data>
<data name="FeedbackUserUnbanned" xml:space="preserve">
<value>раззабанен {0}: {1}</value>
</data>
<data name="FeedbackMemberUnmuted" xml:space="preserve">
<value>раззамучен {0}: {1}</value>
</data>
<data name="SettingsNothingChanged" xml:space="preserve">
<value>ты все сломал! значение прикола `{0}` и так {1}</value>
</data>
<data name="SettingNotDefined" xml:space="preserve">
<value>*тут ничего нет*</value>
</data>
<data name="FeedbackSettingsUpdated" xml:space="preserve">
<value>прикол для `{0}` теперь установлен на {1}</value>
</data>
<data name="CommandDescriptionBan" xml:space="preserve">
<value>возводит великий банхаммер над шизоидом</value>
</data>
<data name="CommandDescriptionClear" xml:space="preserve">
<value>удаляет сообщения. сколько хош, столько и удалит</value>
</data>
<data name="CommandDescriptionHelp" xml:space="preserve">
<value>показывает то, что ты сейчас видишь прямо сейчас</value>
</data>
<data name="CommandDescriptionKick" xml:space="preserve">
<value>выпинывает шизоида</value>
</data>
<data name="CommandDescriptionMute" xml:space="preserve">
<value>мутит шизоида</value>
</data>
<data name="CommandDescriptionPing" xml:space="preserve">
<value>показывает пинг (сверхмегаточный (нет))</value>
</data>
<data name="CommandDescriptionSettings" xml:space="preserve">
<value>настройки бота под этот сервер</value>
</data>
<data name="CommandDescriptionUnban" xml:space="preserve">
<value>отводит великий банхаммер от шизоида</value>
</data>
<data name="CommandDescriptionUnmute" xml:space="preserve">
<value>раззамучивает шизоида</value>
</data>
<data name="MissingNumber" xml:space="preserve">
<value>укажи целое число от {0} до {1}</value>
</data>
<data name="MissingUser" xml:space="preserve">
<value>укажи самого шизика</value>
</data>
<data name="InvalidUser" xml:space="preserve">
<value>надо указать юзверя вместо {0}!</value>
</data>
<data name="MissingMember" xml:space="preserve">
<value>укажи самого шизика</value>
</data>
<data name="InvalidMember" xml:space="preserve">
<value>укажи шизоида сервера вместо {0}!</value>
</data>
<data name="UserCannotBanMembers" xml:space="preserve">
<value>бан</value>
</data>
<data name="UserCannotManageMessages" xml:space="preserve">
<value>Ты не можешь управлять сообщениями этого сервера!</value>
</data>
<data name="UserCannotKickMembers" xml:space="preserve">
<value>кик шизиков нельзя</value>
</data>
<data name="UserCannotModerateMembers" xml:space="preserve">
<value>тебе нельзя управлять шизоидами</value>
</data>
<data name="UserCannotManageGuild" xml:space="preserve">
<value>тебе нельзя редактировать дурку</value>
</data>
<data name="BotCannotBanMembers" xml:space="preserve">
<value>я не могу ваще никого банить чел.</value>
</data>
<data name="BotCannotManageMessages" xml:space="preserve">
<value>я не могу исправлять орфографический кринж участников, сделай что нибудь.</value>
</data>
<data name="BotCannotKickMembers" xml:space="preserve">
<value>я не могу ваще никого кикать чел.</value>
</data>
<data name="BotCannotModerateMembers" xml:space="preserve">
<value>я не могу контроллировать за всеми ними, сделай что нибудь.</value>
</data>
<data name="BotCannotManageGuild" xml:space="preserve">
<value>я не могу этому серверу хоть че либо нибудь изменить, сделай что нибудь.</value>
</data>
<data name="MissingBanReason" xml:space="preserve">
<value>укажи зачем банить шизика</value>
</data>
<data name="MissingKickReason" xml:space="preserve">
<value>укажи зачем кикать шизика</value>
</data>
<data name="MissingMuteReason" xml:space="preserve">
<value>укажи зачем мутить шизика</value>
</data>
<data name="MissingSetting" xml:space="preserve">
<value>укажи настройку которую менять нужно</value>
</data>
<data name="MissingUnbanReason" xml:space="preserve">
<value>укажи зачем раззабанивать шизика</value>
</data>
<data name="MissingUnmuteReason" xml:space="preserve">
<value>укажи зачам размучивать шизика</value>
</data>
<data name="UserCannotBanBot" xml:space="preserve">
<value>че ты там вякнул?</value>
</data>
<data name="UserCannotBanOwner" xml:space="preserve">
<value>бан админу нельзя</value>
</data>
<data name="UserCannotBanTarget" xml:space="preserve">
<value>бан этому шизику нельзя</value>
</data>
<data name="UserCannotBanThemselves" xml:space="preserve">
<value>самобан нельзя</value>
</data>
<data name="BotCannotBanTarget" xml:space="preserve">
<value>я не могу его забанить...</value>
</data>
<data name="UserCannotKickOwner" xml:space="preserve">
<value>кик админу нельзя</value>
</data>
<data name="UserCannotKickThemselves" xml:space="preserve">
<value>самокик нельзя</value>
</data>
<data name="UserCannotKickBot" xml:space="preserve">
<value>че ты там вякнул?</value>
</data>
<data name="BotCannotKickTarget" xml:space="preserve">
<value>я не могу его кикнуть...</value>
</data>
<data name="UserCannotKickTarget" xml:space="preserve">
<value>кик этому шизику нельзя</value>
</data>
<data name="UserCannotMuteOwner" xml:space="preserve">
<value>мут админу нельзя</value>
</data>
<data name="UserCannotMuteThemselves" xml:space="preserve">
<value>самомут нельзя</value>
</data>
<data name="UserCannotMuteBot" xml:space="preserve">
<value>че ты там вякнул?</value>
</data>
<data name="BotCannotMuteTarget" xml:space="preserve">
<value>я не могу его замутить...</value>
</data>
<data name="UserCannotMuteTarget" xml:space="preserve">
<value>мут этому шизику нельзя</value>
</data>
<data name="UserCannotUnmuteOwner" xml:space="preserve">
<value>ты шо далбайоп шоле, админ замозамучался, не трожь</value>
</data>
<data name="UserCannotUnmuteThemselves" xml:space="preserve">
<value>ты замучен.</value>
</data>
<data name="UserCannotUnmuteBot" xml:space="preserve">
<value>... </value>
</data>
<data name="UserCannotUnmuteTarget" xml:space="preserve">
<value>тебе нельзя раззамучивать</value>
</data>
<data name="BotCannotUnmuteTarget" xml:space="preserve">
<value>я не могу его раззамутить...</value>
</data>
<data name="CommandDescriptionCavepleaselisten" xml:space="preserve">
<value>каве пропал.</value>
</data>
<data name="ServerBlacklisted" xml:space="preserve">
<value>упс, кажется ваш сервер в черном списке, и я вам ничем помочь не смогу)</value>
</data>
</root>

View file

@ -66,7 +66,7 @@ public static class Utils {
public static SocketRole? GetMuteRole(SocketGuild guild) {
var id = ulong.Parse(Boyfriend.GetGuildConfig(guild.Id)["MuteRole"]);
if (MuteRoleCache.ContainsKey(id)) return MuteRoleCache[id];
if (MuteRoleCache.TryGetValue(id, out var cachedMuteRole)) return cachedMuteRole;
SocketRole? role = null;
foreach (var x in guild.Roles) {
if (x.Id != id) continue;
@ -89,7 +89,6 @@ public static class Utils {
await channel.SendMessageAsync(text, false, null, null, allowRoles ? AllowRoles : AllowedMentions.None);
}
public static RequestOptions GetRequestOptions(string reason) {
var options = RequestOptions.Default;
options.AuditLogReason = reason;
@ -99,7 +98,7 @@ public static class Utils {
public static string GetMessage(string name) {
var propertyName = name;
name = $"{Messages.Culture}/{name}";
if (ReflectionMessageCache.ContainsKey(name)) return ReflectionMessageCache[name];
if (ReflectionMessageCache.TryGetValue(name, out var cachedMessage)) return cachedMessage;
var toReturn =
typeof(Messages).GetProperty(propertyName, BindingFlags.NonPublic | BindingFlags.Static)?.GetValue(null)