diff --git a/locale/Messages.resx b/locale/Messages.resx
index 3d05722..282e678 100644
--- a/locale/Messages.resx
+++ b/locale/Messages.resx
@@ -1,6 +1,6 @@
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
- PublicKeyToken=b77a5c561934e089
-
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
- PublicKeyToken=b77a5c561934e089
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
I'm ready!
-
+
Deleted message by {0}:
-
+
Cleared message from {0} in channel {1}: {2}
-
+
Edited message by {0}:
-
+
{0}, welcome to {1}
-
+
Bah!
-
+
Bop!
-
+
Beep!
-
+
I do not have permission to execute this command!
-
+
You do not have permission to execute this command!
-
+
You were banned
-
+
Punishment expired
-
+
You specified less than {0} messages!
-
+
You specified more than {0} messages!
-
+
Command help:
-
+
You were kicked
-
+
ms
-
+
Member is already muted!
-
+
Not specified
-
+
Not specified
-
+
Current settings:
-
+
Language
-
+
Prefix
-
+
Remove roles on mute
-
+
Send welcome messages
-
+
Mute role
-
- Language not supported!
-
-
+
+ Language not supported!
+
+
Yes
-
+
No
-
+
This user is not banned!
-
+
Member not muted!
-
+
Welcome message
-
+
You need to specify an integer from {0} to {1} instead of {2}!
-
+
{0} was banned
-
+
That setting doesn't exist!
-
+
Receive startup messages
-
+
Invalid setting value specified!
-
+
This role does not exist!
-
+
This channel does not exist!
-
+
I cannot mute someone for more than 28 days using timeouts! Either specify a duration shorter than 28 days, or set a mute role in settings
-
+
I cannot use time-outs on other bots! Try to set a mute role in settings
-
+
{0} has created event {1}! It will take place in {2} and will start <t:{3}:R>! \n {4}
-
+
Role for event creation notifications
-
+
Channel for event notifications
-
+
Event start notifications receivers
-
+
Event "{0}" started
-
+
:(
-
+
Event "{0}" is cancelled!
-
+
Event "{0}" has completed!
-
+
ever
-
+
Cleared {0} messages
-
+
Kicked {0}: {1}
-
+
Muted {0} for{1}: {2}
-
+
Unbanned {0}: {1}
-
+
Unmuted {0}: {1}
-
+
Nothing changed! `{0}` is already set to {1}
-
+
Not specified
-
+
Value of setting `{0}` is now set to {1}
-
+
Bans a user
-
+
Deletes a specified amount of messages in this channel
-
+
Shows this message
-
+
Kicks a member
-
+
Mutes a member
-
+
Shows (inaccurate) latency
-
+
Allows you to change certain preferences for this guild
-
+
Unbans a user
-
+
Unmutes a member
-
+
You need to specify an integer from {0} to {1}!
-
+
You need to specify a user!
-
+
You need to specify a user instead of {0}!
-
+
You need to specify a guild member!
-
+
You need to specify a member of this guild!
-
+
You cannot ban users from this guild!
-
+
You cannot manage messages in this guild!
-
+
You cannot kick members from this guild!
-
+
You cannot moderate members in this guild!
-
+
You cannot manage this guild!
-
+
I cannot ban users from this guild!
-
+
I cannot manage messages in this guild!
-
+
I cannot kick members from this guild!
-
+
I cannot moderate members in this guild!
-
+
I cannot manage this guild!
-
+
You need to specify a reason to ban this user!
-
+
You need to specify a reason to kick this member!
-
+
You need to specify a reason to mute this member!
-
+
You need to specify a reason to unban this user!
-
+
You need to specify a reason for unmute this member!
-
+
You cannot ban the owner of this guild!
-
+
You cannot ban yourself!
-
+
You cannot ban me!
-
+
I cannot ban this user!
-
+
You cannot ban this user!
-
+
You cannot kick the owner of this guild!
-
+
You cannot kick yourself!
-
+
You cannot kick me!
-
+
I cannot kick this member!
-
+
You cannot kick this member!
-
+
You cannot mute the owner of this guild!
-
+
You cannot mute yourself!
-
+
You cannot mute me!
-
+
I cannot mute this member!
-
+
You cannot mute this member!
-
+
You don't need to unmute the owner of this guild!
-
+
You are muted!
-
+
...
-
+
I cannot unmute this member!
-
+
You cannot unmute this user!
-
+
Event "{0}" will start {1}!
-
+
Early event start notification offset
-
+
I could not find this user in any guild I'm a member of! Check if the ID is correct and that the user was on this server no longer than 30 days ago
-
+
Default role
-
+
Adds a reminder
-
+
Channel for public notifications
-
+
Channel for private notifications
-
+
Return roles on rejoin
-
+
Automatically start scheduled events
-
+
You need to specify reminder text!
-
- OK, I'll mention you on {0}
-
-
+
You need to specify when I should send you the reminder!
-
+
Issued by
-
+
{0} has created a new event:
-
+
The event will start at {0} in {1}
-
+
The event will start at {0} until {1} in {2}
-
+
Event details
-
+
The event has lasted for `{0}`
-
+
The event is happening at {0}
-
+
The event is happening at {0} until {1}
-
+
This user is already banned!
-
+
{0} was unbanned
-
+
{0} was muted
-
+
{0} was unmuted
-
+
This member is not muted!
-
+
I could not find this user!
-
+
{0} was kicked
-
+
Reason: {0}
-
+
Expires at: {0}
-
+
This user is already muted!
-
+
From {0}:
-
+
Developers:
-
- Boyfriend's Wiki Page:
+
+ Boyfriend's source code
-
+
About Boyfriend
-
- logo and embed designer, Boyfriend's Wiki creator
+
+ developer & designer, Boyfriend's Wiki creator
-
+
main developer
-
+
developer
-
- Reminder for {0} created
-
-
- Reminder for {0}
-
-
- You asked me to remind you {0}
-
-
- Boyfriend's Settings
-
-
- Setting successfully changed
-
-
- Setting not changed
-
-
- is now
-
-
- Rename members who attempt to hoist themselves
-
-
- Page
-
-
- Page not found!
-
-
- There are {0} total pages
-
-
- Next
-
-
- Previous
-
+
+ Reminder for {0} created
+
+
+ Reminder for {0}
+
+
+ You asked me to remind you {0}
+
+
+ Boyfriend's Settings
+
+
+ Setting successfully changed
+
+
+ Setting not changed
+
+
+ is now
+
+
+ Rename members who attempt to hoist themselves
+
+
+ Page
+
+
+ Page not found!
+
+
+ There are {0} total pages
+
+
+ Next
+
+
+ Previous
+
- {0}'s reminders
-
+ {0}'s reminders
+
- There's no reminder with that index!
-
+ There's no reminder with that index!
+
- Reminder deleted
-
-
- You don't have any reminders created!
-
-
- Setting {0} reset
-
-
- All settings have been reset
-
-
- Display name
-
-
- Information about {0}
-
-
- Muted
-
-
- Discord user since
-
-
- Banned
-
-
- Punishments
-
-
- Banned permanently
-
-
- Not in the guild
-
-
- Muted by timeout
-
-
- Muted by mute role
-
-
- Guild member since
-
-
- Nickname
-
-
- Roles
-
-
- Nitro booster since
-
+ Reminder deleted
+
+
+ You don't have any reminders created!
+
+
+ Setting {0} reset
+
+
+ All settings have been reset
+
+
+ Jump to message: {0}
+
+
+ Jump to channel: {0}
+
+
+ Index: {0}
+
+
+ The reminder will be sent on: {0}
+
+
+ Reminder text: {0}
+
+
+ Display name
+
+
+ Information about {0}
+
+
+ Muted
+
+
+ Discord user since
+
+
+ Banned
+
+
+ Punishments
+
+
+ Banned permanently
+
+
+ Not in the guild
+
+
+ Muted by timeout
+
+
+ Muted by mute role
+
+
+ Guild member since
+
+
+ Nickname
+
+
+ Roles
+
+
+ Nitro booster since
+
diff --git a/locale/Messages.ru.resx b/locale/Messages.ru.resx
index 3f20dd0..77e3838 100644
--- a/locale/Messages.ru.resx
+++ b/locale/Messages.ru.resx
@@ -1,6 +1,6 @@
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
- PublicKeyToken=b77a5c561934e089
-
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
- PublicKeyToken=b77a5c561934e089
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
Я запустился!
-
+
Сообщение {0} удалено:
-
+
Очищено сообщение от {0} в канале {1}: {2}
-
+
Сообщение {0} отредактировано:
-
+
{0}, добро пожаловать на сервер {1}
-
+
Бап!
-
+
Боп!
-
+
Бип!
-
+
У меня недостаточно прав для выполнения этой команды!
-
+
У тебя недостаточно прав для выполнения этой команды!
-
+
Время наказания истекло
-
+
Указано менее {0} сообщений!
-
+
Указано более {0} сообщений!
-
+
Справка по командам:
-
+
Вы были выгнаны
-
+
мс
-
+
Участник уже заглушен!
-
+
Не указан
-
+
Не указана
-
+
Текущие настройки:
-
+
Язык
-
+
Префикс
-
+
Удалять роли при муте
-
+
Отправлять приветствия
-
+
Роль мута
-
- Язык не поддерживается!
-
-
+
+ Язык не поддерживается!
+
+
Да
-
+
Нет
-
+
Этот пользователь не забанен!
-
+
Участник не заглушен!
-
+
Приветствие
-
+
Надо указать целое число от {0} до {1} вместо {2}!
-
+
{0} был(-а) забанен(-а)
-
+
Такая настройка не существует!
-
+
Получать сообщения о запуске
-
+
Указано недействительное значение для настройки!
-
+
Эта роль не существует!
-
+
Этот канал не существует!
-
+
Я не могу заглушить кого-то на более чем 28 дней, используя тайм-ауты! Или укажи продолжительность менее 28 дней, или установи роль мута в настройках
-
+
Я не могу использовать тайм-ауты на других ботах! Попробуй указать роль мута в настройках
-
+
{0} создал событие {1}! Оно пройдёт в {2} и начнётся <t:{3}:R>!{4}
-
+
Роль для уведомлений о создании событий
-
+
Канал для уведомлений о событиях
-
+
Получатели уведомлений о начале событий
-
+
Событие "{0}" началось
-
+
:(
-
+
Событие "{0}" отменено!
-
+
Событие "{0}" завершено!
-
+
всегда
-
+
Очищено {0} сообщений
-
+
Выгнан {0}: {1}
-
+
Заглушен {0} на{1}: {2}
-
+
Возвращён из бана {0}: {1}
-
+
Разглушен {0}: {1}
-
+
Ничего не изменилось! Значение настройки `{0}` уже {1}
-
+
Не указано
-
+
Значение настройки `{0}` теперь установлено на {1}
-
+
Банит пользователя
-
+
Удаляет указанное количество сообщений в этом канале
-
+
Показывает эту справку
-
+
Выгоняет участника
-
+
Глушит участника
-
+
Показывает (неточную) задержку
-
+
Позволяет менять некоторые настройки под этот сервер
-
+
Возвращает пользователя из бана
-
+
Разглушает участника
-
+
Надо указать целое число от {0} до {1}!
-
+
Надо указать пользователя!
-
+
Надо указать пользователя вместо {0}!
-
+
Надо указать участника сервера!
-
+
Надо указать участника этого сервера!
-
+
Ты не можешь банить пользователей на этом сервере!
-
+
Ты не можешь управлять сообщениями этого сервера!
-
+
Ты не можешь выгонять участников с этого сервера!
-
+
Ты не можешь модерировать участников этого сервера!
-
+
Ты не можешь настраивать этот сервер!
-
+
Я не могу банить пользователей на этом сервере!
-
+
Я не могу управлять сообщениями этого сервера!
-
+
Я не могу выгонять участников с этого сервера!
-
+
Я не могу модерировать участников этого сервера!
-
+
Я не могу настраивать этот сервер!
-
+
Надо указать причину для бана этого участника!
-
+
Надо указать причину для кика этого участника!
-
+
Надо указать причину для мута этого участника!
-
+
Надо указать причину для разбана этого пользователя!
-
+
Надо указать причину для размута этого участника!
-
+
Ты не можешь меня забанить!
-
+
Ты не можешь забанить владельца этого сервера!
-
+
Ты не можешь забанить этого участника!
-
+
Ты не можешь себя забанить!
-
+
Я не могу забанить этого пользователя!
-
+
Ты не можешь выгнать владельца этого сервера!
-
+
Ты не можешь себя выгнать!
-
+
Ты не можешь меня выгнать!
-
+
Я не могу выгнать этого участника
-
+
Ты не можешь выгнать этого участника!
-
+
Ты не можешь заглушить владельца этого сервера!
-
+
Ты не можешь себя заглушить!
-
+
Ты не можешь заглушить меня!
-
+
Я не могу заглушить этого пользователя!
-
+
Ты не можешь заглушить этого участника!
-
+
Тебе не надо возвращать из мута владельца этого сервера!
-
+
Ты заглушен!
-
+
...
-
+
Ты не можешь вернуть из мута этого пользователя!
-
+
Я не могу вернуть из мута этого пользователя!
-
+
Событие "{0}" начнется {1}!
-
+
Офсет отправки преждевременного уведомления о начале события
-
+
Я не смог найти этого пользователя ни в одном из серверов, в которых я есть. Проверь правильность ID и нахождение пользователя на этом сервере максимум 30 дней назад
-
- Роль по умолчанию
-
-
+
+ Роль по умолчанию
+
+
Добавляет напоминание
-
+
Канал для публичных уведомлений
-
+
Канал для приватных уведомлений
-
+
Возвращать роли при перезаходе
-
+
Автоматически начинать события
-
+
Тебе нужно указать текст напоминания!
-
- Хорошо, я упомяну тебя {0}
-
-
+
Нужно указать время, через которое придёт напоминание!
-
+
Ответственный
-
+
{0} создаёт новое событие:
-
+
Событие пройдёт {0} в канале {1}
-
+
Событие пройдёт с {0} до {1} в {2}
-
+
Подробнее о событии
-
+
Событие длилось `{0}`
-
+
Событие происходит в {0}
-
+
Событие происходит в {0} до {1}
-
+
Этот пользователь уже забанен!
-
+
{0} был(-а) разбанен(-а)
-
+
{0} был(-а) заглушен(-а)
-
+
Этот участник не заглушен!
-
+
{0} был(-а) разглушен(-а)
-
+
Я не смог найти этого пользователя!
-
+
{0} был(-а) выгнан(-а)
-
+
Причина: {0}
-
+
Закончится: {0}
-
+
Этот пользователь уже в муте!
-
+
Вы были забанены
-
+
От {0}:
-
+
Разработчики:
-
- Страница Boyfriend's Wiki:
+
+ Исходный код Boyfriend
-
+
О Boyfriend
-
- разрабочик
+
+ разработчик
-
+
основной разработчик
-
- дизайнер лого и эмбедов, создатель Boyfriend's Wiki
+
+ разработчик и дизайнер, создатель Boyfriend's Wiki
+
+
+ Напоминание для {0} создано
+
+
+ Напоминание для {0}
+
+
+ Вы просили напомнить вам {0}
+
+
+ Настройки Boyfriend
+
+
+ Настройка успешно изменена
+
+
+ Настройка не редактирована
+
+
+ теперь имеет значение
+
+
+ Переименовывать участников, которые пытаются поднять себя
+
+
+ Страница
+
+
+ Страница не найдена!
+
+
+ Всего есть {0} страниц(-ы)
+
+
+ Далее
+
+
+ Назад
+
+
+ Напоминания {0}
+
+
+ У тебя нет напоминания с указанным индексом!
+
+
+ Напоминание удалено
+
+
+ У вас нет созданных напоминаний!
+
+
+ Настройка {0} сброшена
+
+
+ Все настройки были сброшены
+
+
+ Перейти к сообщению: {0}
+
+
+ Перейти к каналу: {0}
+
+
+ Индекс: {0}
+
+
+ Напоминание будет отправлено: {0}
+
+
+ Текст напоминалки: {0}
+
+
+ Отображаемое имя
+
+
+ Информация о {0}
+
+
+ Заглушен
+
+
+ Вступил в Discord
+
+
+ Забанен
+
+
+ Наказания
+
+
+ Забанен навсегда
+
+
+ Не на сервере
+
+
+ Заглушен с помощью тайм-аута
+
+
+ Заглушен с помощью роли мута
+
+
+ Вступил на сервер
+
+
+ Никнейм
+
+
+ Роли
+
+
+ Начал бустить сервер
-
- Напоминание для {0} создано
-
-
- Напоминание для {0}
-
-
- Вы просили напомнить вам {0}
-
-
- Настройки Boyfriend
-
-
- Настройка успешно изменена
-
-
- Настройка не редактирована
-
-
- теперь имеет значение
-
-
- Переименовывать участников, которые пытаются поднять себя
-
-
- Страница
-
-
- Страница не найдена!
-
-
- Всего есть {0} страниц(-ы)
-
-
- Далее
-
-
- Назад
-
-
- Напоминания {0}
-
-
- У тебя нет напоминания с указанным индексом!
-
-
- Напоминание удалено
-
-
- У вас нет созданных напоминаний!
-
-
- Настройка {0} сброшена
-
-
- Все настройки были сброшены
-
-
- Отображаемое имя
-
-
- Информация о {0}
-
-
- Заглушен
-
-
- Вступил в Discord
-
-
- Забанен
-
-
- Наказания
-
-
- Забанен навсегда
-
-
- Не на сервере
-
-
- Заглушен с помощью тайм-аута
-
-
- Заглушен с помощью роли мута
-
-
- Вступил на сервер
-
-
- Никнейм
-
-
- Роли
-
-
- Начал бустить сервер
-
diff --git a/locale/Messages.tt-ru.resx b/locale/Messages.tt-ru.resx
index a564e1c..b0335a8 100644
--- a/locale/Messages.tt-ru.resx
+++ b/locale/Messages.tt-ru.resx
@@ -1,6 +1,6 @@
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
- PublicKeyToken=b77a5c561934e089
-
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
- PublicKeyToken=b77a5c561934e089
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
я родился!
-
+
сообщение {0} вырезано:
-
+
вырезано сообщение (используя `!clear`) от {0} в канале {1}: {2}
-
+
сообщение {0} переделано:
-
+
{0}, добро пожаловать на сервер {1}
-
+
брах!
-
+
брох!
-
+
брух!
-
+
у меня прав нету, сделай что нибудь.
-
+
у тебя прав нету, твои проблемы.
-
+
вы были забанены
-
+
время бана закончиловсь
-
+
ты выбрал менее {0} сообщений
-
+
ты выбрал более {0} сообщений
-
+
туториал по приколам:
-
+
вы были кикнуты
-
+
мс
-
+
шизоид уже замучен!
-
+
*тут ничего нет*
-
+
нъет
-
+
настройки:
-
+
язык
-
+
префикс
-
+
удалять звание при муте
-
+
разглашать о том что пришел новый шизоид
-
+
звание замученного
-
- такого языка нету...
-
-
+
+ такого языка нету...
+
+
да
-
+
нъет
-
+
шизик не забанен
-
+
шизоид не замучен!
-
+
здравствуйте (типо настройка)
-
+
выбери число от {0} до {1} вместо {2}!
-
+
{0} забанен
-
+
такой прикол не существует
-
+
получать инфу о старте бота
-
+
криво настроил прикол, давай по новой
-
+
этого звания нету, ты шо
-
+
этого канала нету, ты шо
-
+
ты шо, мутить больше чем на 28 дней таймаут не разрешает, вот настроишь роль мута, тогда поговорим
-
+
я не могу замутить ботов, сделай что нибудь
-
+
{0} приготовил новую движуху {1}! она пройдёт в {2} и начнётся <t:{3}:R>!{4}
-
+
роль для уведомлений о создании движухи
-
+
канал для уведомлений о движухах
-
+
получатели уведомлений о начале движух
-
+
движуха "{0}" начинается
-
+
оъмъомоъемъъео((((
-
- движуха "{0}" отменена!
-
-
- движуха "{0}" завершена!
-
-
+
+ движуха "{0}" отменена!
+
+
+ движуха "{0}" завершена!
+
+
всегда
-
+
вырезано {0} забавных сообщений
-
+
выгнан {0}: {1}
-
+
замучен {0} на{1}: {2}
-
+
раззабанен {0}: {1}
-
+
раззамучен {0}: {1}
-
+
ты все сломал! значение прикола `{0}` и так {1}
-
+
нъет
-
+
прикол для `{0}` теперь установлен на {1}
-
+
возводит великий банхаммер над шизоидом
-
+
удаляет сообщения. сколько хош, столько и удалит
-
+
показывает то, что ты сейчас видишь прямо сейчас
-
+
выпинывает шизоида
-
+
мутит шизоида
-
+
показывает пинг (сверхмегаточный (нет))
-
+
настройки бота под этот сервер
-
+
отводит великий банхаммер от шизоида
-
+
раззамучивает шизоида
-
+
укажи целое число от {0} до {1}
-
+
укажи самого шизика
-
+
надо указать юзверя вместо {0}!
-
+
укажи самого шизика
-
+
укажи шизоида сервера!
-
+
бан
-
+
тебе нельзя иметь власть над сообщениями шизоидов
-
+
кик шизиков нельзя
-
+
тебе нельзя управлять шизоидами
-
+
тебе нельзя редактировать дурку
-
+
я не могу ваще никого банить чел.
-
+
я не могу исправлять орфографический кринж участников, сделай что нибудь.
-
+
я не могу ваще никого кикать чел.
-
+
я не могу контроллировать за всеми ними, сделай что нибудь.
-
+
я не могу этому серверу хоть че либо нибудь изменить, сделай что нибудь.
-
+
укажи зачем банить шизика
-
+
укажи зачем кикать шизика
-
+
укажи зачем мутить шизика
-
+
укажи зачем раззабанивать шизика
-
+
укажи зачам размучивать шизика
-
+
ээбля френдли фаер огонь по своим
-
+
бан админу нельзя
-
+
бан этому шизику нельзя
-
+
самобан нельзя
-
+
я не могу его забанить...
-
+
кик админу нельзя
-
+
самокик нельзя
-
+
ээбля френдли фаер огонь по своим
-
+
я не могу его кикнуть...
-
+
кик этому шизику нельзя
-
+
мут админу нельзя
-
+
самомут нельзя
-
+
ээбля френдли фаер огонь по своим
-
+
я не могу его замутить...
-
+
мут этому шизику нельзя
-
+
сильно
-
+
ты замучен.
-
+
...
-
+
тебе нельзя раззамучивать
-
+
я не могу его раззамутить...
-
+
движуха "{0}" начнется {1}!
-
+
заранее пнуть в минутах до начала движухи
-
+
у нас такого шизоида нету, проверь, валиден ли ID уважаемого (я забываю о шизоидах если они ливнули минимум месяц назад)
-
+
дефолтное звание
-
+
крафтит напоминалку
-
+
канал для секретных уведомлений
-
+
канал для не секретных уведомлений
-
+
вернуть звания при переподключении в дурку
-
+
автоматом стартить движухи
-
+
для крафта напоминалки нужен текст
-
- вас понял, упоминание будет {0}
-
-
+
шизоид у меня на часах такого нету
-
+
ответственный
-
+
{0} создает новое событие:
-
+
движуха произойдет {0} в канале {1}
-
+
движуха будет происходить с {0} до {1} в {2}
-
+
побольше о движухе
-
+
все это длилось `{0}`
-
+
движуха происходит в {0}
-
+
движуха происходит в {0} до {1}
-
+
этот шизоид уже лежит в бане
-
+
{0} раззабанен
-
+
{0} в муте
-
+
{0} в размуте
-
+
этого шизоида никто не мутил.
-
+
у нас такого шизоида нету...
-
+
{0} вышел с посторонней помощью
-
+
причина: {0}
-
+
до: {0}
-
+
этот шизоид УЖЕ замучился
-
+
от {0}
-
+
девелоперы:
-
- страничка Boyfriend's Wiki:
+
+ репа Boyfriend (тык)
-
+
немного о Boyfriend
-
- скучный лого/эмбед дизайнер создавший Boyfriend's Wiki
+
+ скучный девелопер + дизайнер создавший Boyfriend's Wiki
-
+
ВАЖНЫЙ соучастник кодинг-стримов @Octol1ttle
-
+
САМЫЙ ВАЖНЫЙ чел написавший кода больше всех (99.99%)
-
- напоминалка для {0} скрафченА
-
-
- напоминалка для {0}
-
-
- ты хотел чтоб я напомнил тебе {0}
-
-
- приколы Boyfriend
-
-
- прикол редактирован
-
-
- прикол сдох
-
-
- стало
-
-
- переобувать шизоидов пытающихся поднять себя в табе
-
-
- это страница
-
-
- если я был бы html, я бы сказал 404
-
-
- ну а если быть точнее, тут всего {0} страниц(-ы)
-
-
- следующее
-
-
- предыдущее
-
-
- напоминалки {0}
-
-
- у тебя нет напоминалки с этим индексом!
-
-
- напоминалка уничтожена
-
-
- ты еще не крафтил напоминалки
-
-
- {0} откачен к заводским
-
-
- откатываемся к заводским...
-
-
- дисплейнейм
-
-
- деанон {0}
-
-
- замучен
-
-
- юзер Discord со времен
-
-
- забанен
-
-
- приколы полученные по заслугам
-
-
- забанен
-
-
- вышел из сервера
-
-
- замучен таймаутом
-
-
- замучен ролькой
-
-
- участник сервера со времен
-
-
- сервернейм
-
-
- рольки
-
-
- бустит сервер со времен
-
-
+
+ напоминалка для {0} скрафченА
+
+
+ напоминалка для {0}
+
+
+ ты хотел чтоб я напомнил тебе {0}
+
+
+ приколы Boyfriend
+
+
+ прикол редактирован
+
+
+ прикол сдох
+
+
+ стало
+
+
+ переобувать шизоидов пытающихся поднять себя в табе
+
+
+ это страница
+
+
+ если я был бы html, я бы сказал 404
+
+
+ ну а если быть точнее, тут всего {0} страниц(-ы)
+
+
+ следующее
+
+
+ предыдущее
+
+
+ напоминалки {0}
+
+
+ у тебя нет напоминалки с этим индексом!
+
+
+ напоминалка уничтожена
+
+
+ ты еще не крафтил напоминалки
+
+
+ {0} откачен к заводским
+
+
+ откатываемся к заводским...
+
+
+ чекнуть сообщение: {0}
+
+
+ чекнуть канал: {0}
+
+
+ индекс: {0}
+
+
+ я пну тебе это: {0}
+
+
+ че там в напоминалке: {0}
+
+
+ дисплейнейм
+
+
+ деанон {0}
+
+
+ замучен
+
+
+ юзер Discord со времен
+
+
+ забанен
+
+
+ приколы полученные по заслугам
+
+
+ забанен
+
+
+ вышел из сервера
+
+
+ замучен таймаутом
+
+
+ замучен ролькой
+
+
+ участник сервера со времен
+
+
+ сервернейм
+
+
+ рольки
+
+
+ бустит сервер со времен
+
+
\ No newline at end of file
diff --git a/src/Commands/AboutCommandGroup.cs b/src/Commands/AboutCommandGroup.cs
index 4ad428a..e9d9874 100644
--- a/src/Commands/AboutCommandGroup.cs
+++ b/src/Commands/AboutCommandGroup.cs
@@ -12,7 +12,7 @@ using Remora.Discord.Commands.Conditions;
using Remora.Discord.Commands.Contexts;
using Remora.Discord.Commands.Feedback.Services;
using Remora.Discord.Extensions.Embeds;
-using Remora.Discord.Extensions.Formatting;
+using Remora.Rest.Core;
using Remora.Results;
namespace Boyfriend.Commands;
@@ -23,20 +23,29 @@ namespace Boyfriend.Commands;
[UsedImplicitly]
public class AboutCommandGroup : CommandGroup
{
- private static readonly string[] Developers = { "Octol1ttle", "mctaylors", "neroduckale" };
+ private static readonly (string Username, Snowflake Id)[] Developers =
+ {
+ ("Octol1ttle", new Snowflake(504343489664909322)),
+ ("mctaylors", new Snowflake(326642240229474304)),
+ ("neroduckale", new Snowflake(474943797063843851))
+ };
+
private readonly ICommandContext _context;
private readonly FeedbackService _feedback;
private readonly GuildDataService _guildData;
private readonly IDiscordRestUserAPI _userApi;
+ private readonly IDiscordRestGuildAPI _guildApi;
public AboutCommandGroup(
ICommandContext context, GuildDataService guildData,
- FeedbackService feedback, IDiscordRestUserAPI userApi)
+ FeedbackService feedback, IDiscordRestUserAPI userApi,
+ IDiscordRestGuildAPI guildApi)
{
_context = context;
_guildData = guildData;
_feedback = feedback;
_userApi = userApi;
+ _guildApi = guildApi;
}
///
@@ -66,20 +75,22 @@ public class AboutCommandGroup : CommandGroup
var cfg = await _guildData.GetSettings(guildId, CancellationToken);
Messages.Culture = GuildSettings.Language.Get(cfg);
- return await SendAboutBotAsync(currentUser, CancellationToken);
+ return await SendAboutBotAsync(currentUser, guildId, CancellationToken);
}
- private async Task SendAboutBotAsync(IUser currentUser, CancellationToken ct = default)
+ private async Task SendAboutBotAsync(IUser currentUser, Snowflake guildId, CancellationToken ct = default)
{
- var builder = new StringBuilder().AppendLine(Markdown.Bold(Messages.AboutTitleDevelopers));
+ var builder = new StringBuilder().Append("### ").AppendLine(Messages.AboutTitleDevelopers);
foreach (var dev in Developers)
{
- builder.AppendLine($"@{dev} — {$"AboutDeveloper@{dev}".Localized()}");
+ var guildMemberResult = await _guildApi.GetGuildMemberAsync(
+ guildId, dev.Id, ct);
+ var tag = guildMemberResult.IsSuccess ? $"<@{dev.Id}>" : $"@{dev.Username}";
+
+ builder.AppendLine($"- {tag} — {$"AboutDeveloper@{dev.Username}".Localized()}");
}
- builder.AppendLine()
- .AppendLine(Markdown.Bold(Messages.AboutTitleWiki))
- .AppendLine("https://github.com/LabsDevelopment/Boyfriend/wiki");
+ builder.Append($"### [{Messages.AboutTitleRepository}](https://github.com/LabsDevelopment/Boyfriend)");
var embed = new EmbedBuilder().WithSmallTitle(Messages.AboutBot, currentUser)
.WithDescription(builder.ToString())
diff --git a/src/Commands/BanCommandGroup.cs b/src/Commands/BanCommandGroup.cs
index 25cd7e8..0ac5a36 100644
--- a/src/Commands/BanCommandGroup.cs
+++ b/src/Commands/BanCommandGroup.cs
@@ -133,10 +133,11 @@ public class BanCommandGroup : CommandGroup
return await _feedback.SendContextualEmbedResultAsync(errorEmbed, ct);
}
- var builder = new StringBuilder().AppendLine(string.Format(Messages.DescriptionActionReason, reason));
+ var builder = new StringBuilder().Append("- ")
+ .AppendLine(string.Format(Messages.DescriptionActionReason, reason));
if (duration is not null)
{
- builder.Append(
+ builder.Append("- ").Append(
string.Format(
Messages.DescriptionActionExpiresAt,
Markdown.Timestamp(DateTimeOffset.UtcNow.Add(duration.Value))));
@@ -271,9 +272,10 @@ public class BanCommandGroup : CommandGroup
.WithColour(ColorsList.Green).Build();
var title = string.Format(Messages.UserUnbanned, target.GetTag());
- var description = string.Format(Messages.DescriptionActionReason, reason);
+ var description = new StringBuilder().Append("- ")
+ .Append(string.Format(Messages.DescriptionActionReason, reason));
var logResult = _utility.LogActionAsync(
- data.Settings, channelId, user, title, description, target, ColorsList.Green, ct: ct);
+ data.Settings, channelId, user, title, description.ToString(), target, ColorsList.Green, ct: ct);
if (!logResult.IsSuccess)
{
return Result.FromError(logResult.Error);
diff --git a/src/Commands/KickCommandGroup.cs b/src/Commands/KickCommandGroup.cs
index 88d746f..c3a4179 100644
--- a/src/Commands/KickCommandGroup.cs
+++ b/src/Commands/KickCommandGroup.cs
@@ -131,7 +131,7 @@ public class KickCommandGroup : CommandGroup
{
var dmEmbed = new EmbedBuilder().WithGuildTitle(guild)
.WithTitle(Messages.YouWereKicked)
- .WithDescription(string.Format(Messages.DescriptionActionReason, reason))
+ .WithDescription($"- {string.Format(Messages.DescriptionActionReason, reason)}")
.WithActionFooter(user)
.WithCurrentTimestamp()
.WithColour(ColorsList.Red)
@@ -156,7 +156,7 @@ public class KickCommandGroup : CommandGroup
data.GetOrCreateMemberData(target.ID).Roles.Clear();
var title = string.Format(Messages.UserKicked, target.GetTag());
- var description = string.Format(Messages.DescriptionActionReason, reason);
+ var description = $"- {string.Format(Messages.DescriptionActionReason, reason)}";
var logResult = _utility.LogActionAsync(
data.Settings, channelId, user, title, description, target, ColorsList.Red, ct: ct);
if (!logResult.IsSuccess)
diff --git a/src/Commands/MuteCommandGroup.cs b/src/Commands/MuteCommandGroup.cs
index bc64a64..5b3b68d 100644
--- a/src/Commands/MuteCommandGroup.cs
+++ b/src/Commands/MuteCommandGroup.cs
@@ -152,10 +152,9 @@ public class MuteCommandGroup : CommandGroup
}
var title = string.Format(Messages.UserMuted, target.GetTag());
- var description = new StringBuilder().AppendLine(string.Format(Messages.DescriptionActionReason, reason))
- .Append(
- string.Format(
- Messages.DescriptionActionExpiresAt, Markdown.Timestamp(until))).ToString();
+ var description = new StringBuilder().Append("- ").AppendLine(string.Format(Messages.DescriptionActionReason, reason))
+ .Append("- ").Append(string.Format(
+ Messages.DescriptionActionExpiresAt, Markdown.Timestamp(until))).ToString();
var logResult = _utility.LogActionAsync(
data.Settings, channelId, user, title, description, target, ColorsList.Red, ct: ct);
@@ -211,10 +210,9 @@ public class MuteCommandGroup : CommandGroup
}
var title = string.Format(Messages.UserMuted, target.GetTag());
- var description = new StringBuilder().AppendLine(string.Format(Messages.DescriptionActionReason, reason))
- .Append(
- string.Format(
- Messages.DescriptionActionExpiresAt, Markdown.Timestamp(until))).ToString();
+ var description = new StringBuilder().Append("- ").AppendLine(string.Format(Messages.DescriptionActionReason, reason))
+ .Append("- ").Append(string.Format(
+ Messages.DescriptionActionExpiresAt, Markdown.Timestamp(until))).ToString();
var logResult = _utility.LogActionAsync(
data.Settings, channelId, user, title, description, target, ColorsList.Red, ct: ct);
@@ -328,7 +326,7 @@ public class MuteCommandGroup : CommandGroup
}
var title = string.Format(Messages.UserUnmuted, target.GetTag());
- var description = string.Format(Messages.DescriptionActionReason, reason);
+ var description = $"- {string.Format(Messages.DescriptionActionReason, reason)}";
var logResult = _utility.LogActionAsync(
data.Settings, channelId, user, title, description, target, ColorsList.Green, ct: ct);
if (!logResult.IsSuccess)
@@ -372,7 +370,7 @@ public class MuteCommandGroup : CommandGroup
}
var title = string.Format(Messages.UserUnmuted, target.GetTag());
- var description = string.Format(Messages.DescriptionActionReason, reason);
+ var description = $"- {string.Format(Messages.DescriptionActionReason, reason)}";
var logResult = _utility.LogActionAsync(
data.Settings, channelId, user, title, description, target, ColorsList.Green, ct: ct);
if (!logResult.IsSuccess)
diff --git a/src/Commands/RemindCommandGroup.cs b/src/Commands/RemindCommandGroup.cs
index d437b5d..d150e9c 100644
--- a/src/Commands/RemindCommandGroup.cs
+++ b/src/Commands/RemindCommandGroup.cs
@@ -19,7 +19,7 @@ using Remora.Results;
namespace Boyfriend.Commands;
///
-/// Handles the command to manage reminders: /remind
+/// Handles commands to manage reminders: /remind, /listremind, /delremind
///
[UsedImplicitly]
public class RemindCommandGroup : CommandGroup
@@ -88,8 +88,9 @@ public class RemindCommandGroup : CommandGroup
for (var i = data.Reminders.Count - 1; i >= 0; i--)
{
var reminder = data.Reminders[i];
- builder.AppendLine(
- $"- {Markdown.InlineCode(i.ToString())} - {Markdown.InlineCode(reminder.Text)} - {Markdown.Timestamp(reminder.At)}");
+ builder.Append("- ").AppendLine(string.Format(Messages.ReminderIndex, Markdown.InlineCode(i.ToString())))
+ .Append(" - ").AppendLine(string.Format(Messages.ReminderText, Markdown.InlineCode(reminder.Text)))
+ .Append(" - ").AppendLine(string.Format(Messages.ReminderWillBeSentOn, Markdown.Timestamp(reminder.At)));
}
var embed = new EmbedBuilder().WithSmallTitle(
@@ -149,8 +150,13 @@ public class RemindCommandGroup : CommandGroup
Text = message
});
- var embed = new EmbedBuilder().WithSmallTitle(string.Format(Messages.ReminderCreated, user.GetTag()), user)
- .WithDescription(string.Format(Messages.DescriptionReminderCreated, Markdown.Timestamp(remindAt)))
+ var builder = new StringBuilder().Append("- ").AppendLine(string.Format(
+ Messages.ReminderText, Markdown.InlineCode(message)))
+ .Append("- ").Append(string.Format(Messages.ReminderWillBeSentOn, Markdown.Timestamp(remindAt)));
+
+ var embed = new EmbedBuilder().WithSmallTitle(
+ string.Format(Messages.ReminderCreated, user.GetTag()), user)
+ .WithDescription(builder.ToString())
.WithColour(ColorsList.Green)
.Build();
diff --git a/src/Extensions.cs b/src/Extensions.cs
index 1e30cf4..c06c4ce 100644
--- a/src/Extensions.cs
+++ b/src/Extensions.cs
@@ -17,22 +17,6 @@ namespace Boyfriend;
public static class Extensions
{
- ///
- /// Adds a footer with the 's avatar and tag (@username or username#0000).
- ///
- /// The builder to add the footer to.
- /// The user whose tag and avatar to add.
- /// The builder with the added footer.
- public static EmbedBuilder WithUserFooter(this EmbedBuilder builder, IUser user)
- {
- var avatarUrlResult = CDN.GetUserAvatarUrl(user, imageSize: 256);
- var avatarUrl = avatarUrlResult.IsSuccess
- ? avatarUrlResult.Entity.AbsoluteUri
- : CDN.GetDefaultUserAvatarUrl(user, imageSize: 256).Entity.AbsoluteUri;
-
- return builder.WithFooter(new EmbedFooter(user.GetTag(), avatarUrl));
- }
-
///
/// Adds a footer representing that an action was performed by a .
///
diff --git a/src/Messages.Designer.cs b/src/Messages.Designer.cs
index 884cfd4..8784b90 100644
--- a/src/Messages.Designer.cs
+++ b/src/Messages.Designer.cs
@@ -744,12 +744,6 @@ namespace Boyfriend {
}
}
- internal static string DescriptionReminderCreated {
- get {
- return ResourceManager.GetString("DescriptionReminderCreated", resourceCulture);
- }
- }
-
internal static string InvalidRemindIn {
get {
return ResourceManager.GetString("InvalidRemindIn", resourceCulture);
@@ -876,9 +870,9 @@ namespace Boyfriend {
}
}
- internal static string AboutTitleWiki {
+ internal static string AboutTitleRepository {
get {
- return ResourceManager.GetString("AboutTitleWiki", resourceCulture);
+ return ResourceManager.GetString("AboutTitleRepository", resourceCulture);
}
}
@@ -1014,6 +1008,36 @@ namespace Boyfriend {
}
}
+ internal static string DescriptionActionJumpToMessage {
+ get {
+ return ResourceManager.GetString("DescriptionActionJumpToMessage", resourceCulture);
+ }
+ }
+
+ internal static string DescriptionActionJumpToChannel {
+ get {
+ return ResourceManager.GetString("DescriptionActionJumpToChannel", resourceCulture);
+ }
+ }
+
+ internal static string ReminderIndex {
+ get {
+ return ResourceManager.GetString("ReminderIndex", resourceCulture);
+ }
+ }
+
+ internal static string ReminderWillBeSentOn {
+ get {
+ return ResourceManager.GetString("ReminderWillBeSentOn", resourceCulture);
+ }
+ }
+
+ internal static string ReminderText {
+ get {
+ return ResourceManager.GetString("ReminderText", resourceCulture);
+ }
+ }
+
internal static string ShowInfoTitle {
get {
return ResourceManager.GetString("ShowInfoTitle", resourceCulture);
diff --git a/src/Responders/MessageDeletedResponder.cs b/src/Responders/MessageDeletedResponder.cs
index 3611f80..8ae2418 100644
--- a/src/Responders/MessageDeletedResponder.cs
+++ b/src/Responders/MessageDeletedResponder.cs
@@ -1,3 +1,4 @@
+using System.Text;
using Boyfriend.Data;
using Boyfriend.Services;
using JetBrains.Annotations;
@@ -81,13 +82,17 @@ public class MessageDeletedResponder : IResponder
Messages.Culture = GuildSettings.Language.Get(cfg);
+ var builder = new StringBuilder().AppendLine(
+ string.Format(Messages.DescriptionActionJumpToChannel,
+ Mention.Channel(gatewayEvent.ChannelID)))
+ .AppendLine(message.Content.InBlockCode());
+
var embed = new EmbedBuilder()
.WithSmallTitle(
string.Format(
Messages.CachedMessageDeleted,
message.Author.GetTag()), message.Author)
- .WithDescription(
- $"{Mention.Channel(gatewayEvent.ChannelID)}\n{message.Content.InBlockCode()}")
+ .WithDescription(builder.ToString())
.WithActionFooter(user)
.WithTimestamp(message.Timestamp)
.WithColour(ColorsList.Red)
diff --git a/src/Responders/MessageEditedResponder.cs b/src/Responders/MessageEditedResponder.cs
index 7e02f9f..d7e2347 100644
--- a/src/Responders/MessageEditedResponder.cs
+++ b/src/Responders/MessageEditedResponder.cs
@@ -1,3 +1,4 @@
+using System.Text;
using Boyfriend.Data;
using Boyfriend.Services;
using DiffPlex.DiffBuilder;
@@ -23,16 +24,13 @@ public class MessageEditedResponder : IResponder
private readonly CacheService _cacheService;
private readonly IDiscordRestChannelAPI _channelApi;
private readonly GuildDataService _guildData;
- private readonly IDiscordRestUserAPI _userApi;
public MessageEditedResponder(
- CacheService cacheService, IDiscordRestChannelAPI channelApi, GuildDataService guildData,
- IDiscordRestUserAPI userApi)
+ CacheService cacheService, IDiscordRestChannelAPI channelApi, GuildDataService guildData)
{
_cacheService = cacheService;
_channelApi = channelApi;
_guildData = guildData;
- _userApi = userApi;
}
public async Task RespondAsync(IMessageUpdate gatewayEvent, CancellationToken ct = default)
@@ -92,20 +90,18 @@ public class MessageEditedResponder : IResponder
// NOTE: Awaiting this might not even solve this if the same responder is called asynchronously
_ = _channelApi.GetChannelMessageAsync(channelId, messageId, ct);
- var currentUserResult = await _userApi.GetCurrentUserAsync(ct);
- if (!currentUserResult.IsDefined(out var currentUser))
- {
- return Result.FromError(currentUserResult);
- }
-
var diff = InlineDiffBuilder.Diff(message.Content, newContent);
Messages.Culture = GuildSettings.Language.Get(cfg);
+ var builder = new StringBuilder().AppendLine(
+ string.Format(Messages.DescriptionActionJumpToMessage,
+ $"https://discord.com/channels/{guildId}/{channelId}/{messageId}"))
+ .AppendLine(diff.AsMarkdown());
+
var embed = new EmbedBuilder()
.WithSmallTitle(string.Format(Messages.CachedMessageEdited, message.Author.GetTag()), message.Author)
- .WithDescription($"https://discord.com/channels/{guildId}/{channelId}/{messageId}\n{diff.AsMarkdown()}")
- .WithUserFooter(currentUser)
+ .WithDescription(builder.ToString())
.WithTimestamp(timestamp.Value)
.WithColour(ColorsList.Yellow)
.Build();