1
0
Fork 1
mirror of https://github.com/TeamOctolings/Octobot.git synced 2025-04-19 16:33:36 +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)) if (!RemovedRolesDictionary.ContainsKey(id))
RemovedRolesDictionary.Add(id, new Dictionary<ulong, ReadOnlyCollection<ulong>>()); 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"; var path = $"config_{id}.json";
@ -110,7 +110,7 @@ public static class Boyfriend {
} }
public static Dictionary<ulong, ReadOnlyCollection<ulong>> GetRemovedRoles(ulong id) { 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"; var path = $"removedroles_{id}.json";
@ -126,7 +126,7 @@ public static class Boyfriend {
} }
public static SocketGuild FindGuild(ulong channel) { 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) { foreach (var guild in Client.Guilds) {
// ReSharper disable once LoopCanBeConvertedToQuery // ReSharper disable once LoopCanBeConvertedToQuery
foreach (var x in guild.Channels) foreach (var x in guild.Channels)

View file

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

View file

@ -1,5 +1,4 @@
using System.Text; using System.Text;
using System.Text.RegularExpressions;
using Boyfriend.Commands; using Boyfriend.Commands;
using Discord; using Discord;
using Discord.Commands; using Discord.Commands;
@ -14,14 +13,14 @@ public sealed class CommandProcessor {
private const string NoAccess = ":no_entry_sign: "; private const string NoAccess = ":no_entry_sign: ";
private const string CantInteract = ":vertical_traffic_light: "; private const string CantInteract = ":vertical_traffic_light: ";
private const string Mention = "<@855023234407333888>";
public static readonly ICommand[] Commands = { public static readonly ICommand[] Commands = {
new BanCommand(), new ClearCommand(), new HelpCommand(), new BanCommand(), new ClearCommand(), new HelpCommand(),
new KickCommand(), new MuteCommand(), new PingCommand(), new KickCommand(), new MuteCommand(), new PingCommand(),
new SettingsCommand(), new UnbanCommand(), new UnmuteCommand() 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 _stackedPrivateFeedback = new();
private readonly StringBuilder _stackedPublicFeedback = new(); private readonly StringBuilder _stackedPublicFeedback = new();
private readonly StringBuilder _stackedReplyMessage = new(); private readonly StringBuilder _stackedReplyMessage = new();
@ -46,16 +45,10 @@ public sealed class CommandProcessor {
return; 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 list = Context.Message.Content.Split("\n");
var cleanList = Context.Message.CleanContent.Split("\n"); var cleanList = Context.Message.CleanContent.Split("\n");
for (var i = 0; i < list.Length; i++) { for (var i = 0; i < list.Length; i++) {
RunCommandOnLine(list[i], cleanList[i], regex); RunCommandOnLine(list[i], cleanList[i], config["Prefix"]);
if (_serverBlacklisted) { if (_serverBlacklisted) {
await Context.Message.ReplyAsync(Messages.ServerBlacklisted); await Context.Message.ReplyAsync(Messages.ServerBlacklisted);
return; return;
@ -78,20 +71,21 @@ public sealed class CommandProcessor {
SendFeedbacks(); 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) { foreach (var command in Commands) {
var lineNoMention = regex.Replace(MentionRegex.Replace(line, "", 1), "", 1); var lineNoMention = line.Remove(0, prefixed ? prefix.Length : Mention.Length);
if (lineNoMention == line if (!command.Aliases.Contains(lineNoMention.Trim().Split()[0])) continue;
|| !command.Aliases.Contains(lineNoMention.Trim().ToLower().Split()[0]))
continue;
if (Utils.IsServerBlacklisted(Context.Guild)) { if (Utils.IsServerBlacklisted(Context.Guild)) {
_serverBlacklisted = true; _serverBlacklisted = true;
return; 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(); var cleanArgs = cleanLine.Split().Skip(lineNoMention.StartsWith(" ") ? 2 : 1).ToArray();
_tasks.Add(command.RunAsync(this, args, cleanArgs)); _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); var rolesRemoved = Boyfriend.GetRemovedRoles(cmd.Context.Guild.Id);
if (rolesRemoved.ContainsKey(toMute.Id)) { if (rolesRemoved.TryGetValue(toMute.Id, out var mutedRemovedRoles)) {
foreach (var roleId in rolesRemoved[toMute.Id]) await toMute.AddRoleAsync(roleId); foreach (var roleId in mutedRemovedRoles) await toMute.AddRoleAsync(roleId);
rolesRemoved.Remove(toMute.Id); rolesRemoved.Remove(toMute.Id);
cmd.ConfigWriteScheduled = true; cmd.ConfigWriteScheduled = true;
cmd.Reply(Messages.RolesReturned, ":warning: "); cmd.Reply(Messages.RolesReturned, ":warning: ");

View file

@ -110,10 +110,9 @@ public sealed class SettingsCommand : ICommand {
}; };
if (value is "reset" or "default") { if (value is "reset" or "default") {
if (selectedSetting is "WelcomeMessage") config[selectedSetting] = selectedSetting is "WelcomeMessage"
config[selectedSetting] = Messages.DefaultWelcomeMessage; ? Messages.DefaultWelcomeMessage
else : Boyfriend.DefaultConfig[selectedSetting];
config[selectedSetting] = Boyfriend.DefaultConfig[selectedSetting];
} else { } else {
if (value == config[selectedSetting]) { if (value == config[selectedSetting]) {
cmd.Reply(string.Format(Messages.SettingsNothingChanged, localizedSelectedSetting, formattedValue), 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)) { if (role != null && toUnmute.Roles.Contains(role)) {
var rolesRemoved = Boyfriend.GetRemovedRoles(cmd.Context.Guild.Id); var rolesRemoved = Boyfriend.GetRemovedRoles(cmd.Context.Guild.Id);
if (rolesRemoved.ContainsKey(toUnmute.Id)) { if (rolesRemoved.TryGetValue(toUnmute.Id, out var unmutedRemovedRoles)) {
await toUnmute.AddRolesAsync(rolesRemoved[toUnmute.Id]); await toUnmute.AddRolesAsync(unmutedRemovedRoles);
rolesRemoved.Remove(toUnmute.Id); rolesRemoved.Remove(toUnmute.Id);
cmd.ConfigWriteScheduled = true; 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) { public static SocketRole? GetMuteRole(SocketGuild guild) {
var id = ulong.Parse(Boyfriend.GetGuildConfig(guild.Id)["MuteRole"]); 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; SocketRole? role = null;
foreach (var x in guild.Roles) { foreach (var x in guild.Roles) {
if (x.Id != id) continue; if (x.Id != id) continue;
@ -89,7 +89,6 @@ public static class Utils {
await channel.SendMessageAsync(text, false, null, null, allowRoles ? AllowRoles : AllowedMentions.None); await channel.SendMessageAsync(text, false, null, null, allowRoles ? AllowRoles : AllowedMentions.None);
} }
public static RequestOptions GetRequestOptions(string reason) { public static RequestOptions GetRequestOptions(string reason) {
var options = RequestOptions.Default; var options = RequestOptions.Default;
options.AuditLogReason = reason; options.AuditLogReason = reason;
@ -99,7 +98,7 @@ public static class Utils {
public static string GetMessage(string name) { public static string GetMessage(string name) {
var propertyName = name; var propertyName = name;
name = $"{Messages.Culture}/{name}"; name = $"{Messages.Culture}/{name}";
if (ReflectionMessageCache.ContainsKey(name)) return ReflectionMessageCache[name]; if (ReflectionMessageCache.TryGetValue(name, out var cachedMessage)) return cachedMessage;
var toReturn = var toReturn =
typeof(Messages).GetProperty(propertyName, BindingFlags.NonPublic | BindingFlags.Static)?.GetValue(null) typeof(Messages).GetProperty(propertyName, BindingFlags.NonPublic | BindingFlags.Static)?.GetValue(null)