forked from NotFate/bot
Оптимизация import
This commit is contained in:
@@ -1,20 +1,20 @@
|
|||||||
from discord.ext import commands
|
from discord.ext.commands import Cog, Bot, command, Context
|
||||||
|
|
||||||
from ..storage import storage
|
from ..storage import storage
|
||||||
from .moderation import is_admin
|
from .moderation import is_admin
|
||||||
|
|
||||||
|
|
||||||
class Blacklist(commands.Cog):
|
class Blacklist(Cog):
|
||||||
"""
|
"""
|
||||||
Cog для управления чёрным списком слов.
|
Cog для управления чёрным списком слов.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, bot: commands.Bot) -> None:
|
def __init__(self, bot: Bot) -> None:
|
||||||
self.bot: commands.Bot = bot
|
self.bot: Bot = bot
|
||||||
|
|
||||||
@commands.command()
|
@command()
|
||||||
@is_admin()
|
@is_admin()
|
||||||
async def blacklist_show(self, ctx: commands.Context) -> None:
|
async def blacklist_show(self, ctx: Context) -> None:
|
||||||
"""
|
"""
|
||||||
Показать текущий чёрный список слов.
|
Показать текущий чёрный список слов.
|
||||||
|
|
||||||
@@ -25,9 +25,9 @@ class Blacklist(commands.Cog):
|
|||||||
else:
|
else:
|
||||||
await ctx.send("Чёрный список:\n" + ", ".join(storage.blacklist))
|
await ctx.send("Чёрный список:\n" + ", ".join(storage.blacklist))
|
||||||
|
|
||||||
@commands.command()
|
@command()
|
||||||
@is_admin()
|
@is_admin()
|
||||||
async def blacklist_add(self, ctx: commands.Context, *, word: str) -> None:
|
async def blacklist_add(self, ctx: Context, *, word: str) -> None:
|
||||||
"""
|
"""
|
||||||
Добавить слово в чёрный список.
|
Добавить слово в чёрный список.
|
||||||
|
|
||||||
@@ -43,9 +43,9 @@ class Blacklist(commands.Cog):
|
|||||||
storage.save_blacklist()
|
storage.save_blacklist()
|
||||||
await ctx.send(f"Слово `{word_lower}` добавлено в чёрный список.")
|
await ctx.send(f"Слово `{word_lower}` добавлено в чёрный список.")
|
||||||
|
|
||||||
@commands.command()
|
@command()
|
||||||
@is_admin()
|
@is_admin()
|
||||||
async def blacklist_remove(self, ctx: commands.Context, *, word: str) -> None:
|
async def blacklist_remove(self, ctx: Context, *, word: str) -> None:
|
||||||
"""
|
"""
|
||||||
Удалить слово из чёрного списка.
|
Удалить слово из чёрного списка.
|
||||||
|
|
||||||
@@ -62,5 +62,5 @@ class Blacklist(commands.Cog):
|
|||||||
await ctx.send(f"Слово `{word_lower}` удалено из чёрного списка.")
|
await ctx.send(f"Слово `{word_lower}` удалено из чёрного списка.")
|
||||||
|
|
||||||
|
|
||||||
async def setup(bot: commands.Bot) -> None:
|
async def setup(bot: Bot) -> None:
|
||||||
await bot.add_cog(Blacklist(bot))
|
await bot.add_cog(Blacklist(bot))
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
from discord.ext import commands, tasks
|
from discord.ext import tasks
|
||||||
|
from discord.ext.commands import Bot, Cog
|
||||||
from discord.utils import get
|
from discord.utils import get
|
||||||
|
|
||||||
from configs import settings
|
from configs import settings
|
||||||
@@ -9,16 +10,16 @@ from middleware import logger
|
|||||||
from ..storage import storage, Reminder
|
from ..storage import storage, Reminder
|
||||||
|
|
||||||
|
|
||||||
class Events(commands.Cog):
|
class Events(Cog):
|
||||||
"""
|
"""
|
||||||
Cog с обработчиками событий и фоновой задачей напоминаний.
|
Cog с обработчиками событий и фоновой задачей напоминаний.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, bot: commands.Bot) -> None:
|
def __init__(self, bot: Bot) -> None:
|
||||||
self.bot: commands.Bot = bot
|
self.bot: Bot = bot
|
||||||
self.check_reminders.start()
|
self.check_reminders.start()
|
||||||
|
|
||||||
@commands.Cog.listener()
|
@Cog.listener()
|
||||||
async def on_ready(self) -> None:
|
async def on_ready(self) -> None:
|
||||||
"""
|
"""
|
||||||
Событие запуска бота.
|
Событие запуска бота.
|
||||||
@@ -28,7 +29,7 @@ class Events(commands.Cog):
|
|||||||
storage.load_all()
|
storage.load_all()
|
||||||
await self.ensure_roles_exist()
|
await self.ensure_roles_exist()
|
||||||
|
|
||||||
@commands.Cog.listener()
|
@Cog.listener()
|
||||||
async def on_member_join(self, member: discord.Member) -> None:
|
async def on_member_join(self, member: discord.Member) -> None:
|
||||||
"""
|
"""
|
||||||
Событие вступления нового участника на сервер.
|
Событие вступления нового участника на сервер.
|
||||||
@@ -45,7 +46,7 @@ class Events(commands.Cog):
|
|||||||
if isinstance(channel, discord.TextChannel):
|
if isinstance(channel, discord.TextChannel):
|
||||||
await channel.send(f"Приветствуем {member.mention} на сервере!")
|
await channel.send(f"Приветствуем {member.mention} на сервере!")
|
||||||
|
|
||||||
@commands.Cog.listener()
|
@Cog.listener()
|
||||||
async def on_message(self, message: discord.Message) -> None:
|
async def on_message(self, message: discord.Message) -> None:
|
||||||
"""
|
"""
|
||||||
Событие получения сообщения. Проверяет чёрный список слов.
|
Событие получения сообщения. Проверяет чёрный список слов.
|
||||||
@@ -97,7 +98,7 @@ class Events(commands.Cog):
|
|||||||
Фоновая задача, которая каждые 30 секунд проверяет напоминания
|
Фоновая задача, которая каждые 30 секунд проверяет напоминания
|
||||||
и отправляет просроченные.
|
и отправляет просроченные.
|
||||||
"""
|
"""
|
||||||
now: float = datetime.datetime.now().timestamp()
|
now: float = datetime.now().timestamp()
|
||||||
to_remove: list[Reminder] = []
|
to_remove: list[Reminder] = []
|
||||||
|
|
||||||
for rem in storage.reminders:
|
for rem in storage.reminders:
|
||||||
@@ -120,7 +121,7 @@ class Events(commands.Cog):
|
|||||||
await self.bot.wait_until_ready()
|
await self.bot.wait_until_ready()
|
||||||
|
|
||||||
|
|
||||||
async def setup(bot: commands.Bot) -> None:
|
async def setup(bot: Bot) -> None:
|
||||||
"""
|
"""
|
||||||
Функция для загрузки Cog.
|
Функция для загрузки Cog.
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import Callable, Awaitable, Optional
|
from typing import Callable, Awaitable, Optional
|
||||||
|
from datetime import datetime
|
||||||
import datetime
|
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
from discord.ext import commands
|
from discord.app_commands.checks import has_permissions
|
||||||
|
from discord.ext.commands import Bot, Context, Cog, check, command
|
||||||
from discord.utils import get
|
from discord.utils import get
|
||||||
|
|
||||||
from configs import settings
|
from configs import settings
|
||||||
@@ -13,7 +13,7 @@ from ..storage import storage
|
|||||||
|
|
||||||
|
|
||||||
# Тип предиката для check (для читаемости, но не обязателен)
|
# Тип предиката для check (для читаемости, но не обязателен)
|
||||||
CheckPredicate = Callable[[commands.Context], Awaitable[bool]]
|
CheckPredicate = Callable[[Context], Awaitable[bool]]
|
||||||
|
|
||||||
|
|
||||||
def is_admin():
|
def is_admin():
|
||||||
@@ -23,7 +23,7 @@ def is_admin():
|
|||||||
либо у пользователя есть флаг администратора сервера.
|
либо у пользователя есть флаг администратора сервера.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
async def predicate(ctx: commands.Context) -> bool:
|
async def predicate(ctx: Context) -> bool:
|
||||||
author = ctx.author
|
author = ctx.author
|
||||||
if not isinstance(author, discord.Member):
|
if not isinstance(author, discord.Member):
|
||||||
return False
|
return False
|
||||||
@@ -31,10 +31,10 @@ def is_admin():
|
|||||||
admin_role = get(author.roles, name=settings.ADMIN_ROLE_NAME)
|
admin_role = get(author.roles, name=settings.ADMIN_ROLE_NAME)
|
||||||
return bool(admin_role) or author.guild_permissions.administrator
|
return bool(admin_role) or author.guild_permissions.administrator
|
||||||
|
|
||||||
return commands.check(predicate)
|
return check(predicate)
|
||||||
|
|
||||||
|
|
||||||
def require_guild(ctx: commands.Context) -> Optional[discord.Guild]:
|
def require_guild(ctx: Context) -> Optional[discord.Guild]:
|
||||||
"""
|
"""
|
||||||
Безопасно получить guild из контекста.
|
Безопасно получить guild из контекста.
|
||||||
|
|
||||||
@@ -43,21 +43,21 @@ def require_guild(ctx: commands.Context) -> Optional[discord.Guild]:
|
|||||||
return ctx.guild
|
return ctx.guild
|
||||||
|
|
||||||
|
|
||||||
class Moderation(commands.Cog):
|
class Moderation(Cog):
|
||||||
"""
|
"""
|
||||||
Cog с модерационными командами:
|
Cog с модерационными командами:
|
||||||
rules, kick, ban, unban, mute, unmute, warn, warnings, clear.
|
rules, kick, ban, unban, mute, unmute, warn, warnings, clear.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, bot: commands.Bot) -> None:
|
def __init__(self, bot: Bot) -> None:
|
||||||
"""
|
"""
|
||||||
:param bot: Экземпляр бота, к которому привязан cog.
|
:param bot: Экземпляр бота, к которому привязан cog.
|
||||||
"""
|
"""
|
||||||
self.bot: commands.Bot = bot
|
self.bot: Bot = bot
|
||||||
|
|
||||||
@commands.command()
|
@command()
|
||||||
@is_admin()
|
@is_admin()
|
||||||
async def rules(self, ctx: commands.Context) -> None:
|
async def rules(self, ctx: Context) -> None:
|
||||||
"""
|
"""
|
||||||
Показать правила сервера.
|
Показать правила сервера.
|
||||||
|
|
||||||
@@ -73,11 +73,11 @@ class Moderation(commands.Cog):
|
|||||||
)
|
)
|
||||||
await ctx.send(rules_text)
|
await ctx.send(rules_text)
|
||||||
|
|
||||||
@commands.command()
|
@command()
|
||||||
@is_admin()
|
@is_admin()
|
||||||
async def kick(
|
async def kick(
|
||||||
self,
|
self,
|
||||||
ctx: commands.Context,
|
ctx: Context,
|
||||||
member: discord.Member,
|
member: discord.Member,
|
||||||
*,
|
*,
|
||||||
reason: Optional[str] = None,
|
reason: Optional[str] = None,
|
||||||
@@ -97,11 +97,11 @@ class Moderation(commands.Cog):
|
|||||||
except discord.HTTPException:
|
except discord.HTTPException:
|
||||||
await ctx.send(f"Не удалось исключить {member} из-за ошибки Discord.")
|
await ctx.send(f"Не удалось исключить {member} из-за ошибки Discord.")
|
||||||
|
|
||||||
@commands.command()
|
@command()
|
||||||
@is_admin()
|
@is_admin()
|
||||||
async def ban(
|
async def ban(
|
||||||
self,
|
self,
|
||||||
ctx: commands.Context,
|
ctx: Context,
|
||||||
member: discord.Member,
|
member: discord.Member,
|
||||||
*,
|
*,
|
||||||
reason: Optional[str] = None,
|
reason: Optional[str] = None,
|
||||||
@@ -121,9 +121,9 @@ class Moderation(commands.Cog):
|
|||||||
except discord.HTTPException:
|
except discord.HTTPException:
|
||||||
await ctx.send(f"Не удалось забанить {member} из-за ошибки Discord.")
|
await ctx.send(f"Не удалось забанить {member} из-за ошибки Discord.")
|
||||||
|
|
||||||
@commands.command()
|
@command()
|
||||||
@commands.has_permissions(ban_members=True)
|
@has_permissions(ban_members=True)
|
||||||
async def unban(self, ctx: commands.Context, *, member_name: str) -> None:
|
async def unban(self, ctx: Context, *, member_name: str) -> None:
|
||||||
"""
|
"""
|
||||||
Разбанить пользователя по имени или тегу.
|
Разбанить пользователя по имени или тегу.
|
||||||
|
|
||||||
@@ -190,11 +190,11 @@ class Moderation(commands.Cog):
|
|||||||
msg_lines.append(f"- {user.name}#{user.discriminator}")
|
msg_lines.append(f"- {user.name}#{user.discriminator}")
|
||||||
await ctx.send("\n".join(msg_lines))
|
await ctx.send("\n".join(msg_lines))
|
||||||
|
|
||||||
@commands.command()
|
@command()
|
||||||
@is_admin()
|
@is_admin()
|
||||||
async def mute(
|
async def mute(
|
||||||
self,
|
self,
|
||||||
ctx: commands.Context,
|
ctx: Context,
|
||||||
member: discord.Member,
|
member: discord.Member,
|
||||||
*,
|
*,
|
||||||
reason: Optional[str] = None,
|
reason: Optional[str] = None,
|
||||||
@@ -224,9 +224,9 @@ class Moderation(commands.Cog):
|
|||||||
except discord.HTTPException:
|
except discord.HTTPException:
|
||||||
await ctx.send("Не удалось выдать мут из-за ошибки Discord.")
|
await ctx.send("Не удалось выдать мут из-за ошибки Discord.")
|
||||||
|
|
||||||
@commands.command()
|
@command()
|
||||||
@is_admin()
|
@is_admin()
|
||||||
async def unmute(self, ctx: commands.Context, member: discord.Member) -> None:
|
async def unmute(self, ctx: Context, member: discord.Member) -> None:
|
||||||
"""
|
"""
|
||||||
Снять мут с участника.
|
Снять мут с участника.
|
||||||
|
|
||||||
@@ -251,11 +251,11 @@ class Moderation(commands.Cog):
|
|||||||
except discord.HTTPException:
|
except discord.HTTPException:
|
||||||
await ctx.send("Не удалось снять мут из-за ошибки Discord.")
|
await ctx.send("Не удалось снять мут из-за ошибки Discord.")
|
||||||
|
|
||||||
@commands.command()
|
@command()
|
||||||
@is_admin()
|
@is_admin()
|
||||||
async def warn(
|
async def warn(
|
||||||
self,
|
self,
|
||||||
ctx: commands.Context,
|
ctx: Context,
|
||||||
member: discord.Member,
|
member: discord.Member,
|
||||||
*,
|
*,
|
||||||
reason: Optional[str] = None,
|
reason: Optional[str] = None,
|
||||||
@@ -271,7 +271,7 @@ class Moderation(commands.Cog):
|
|||||||
storage.user_warnings.setdefault(user_id, []).append(
|
storage.user_warnings.setdefault(user_id, []).append(
|
||||||
{
|
{
|
||||||
"reason": reason or "Без причины",
|
"reason": reason or "Без причины",
|
||||||
"date": datetime.datetime.now().isoformat(
|
"date": datetime.now().isoformat(
|
||||||
sep=" ", timespec="seconds"
|
sep=" ", timespec="seconds"
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
@@ -281,8 +281,8 @@ class Moderation(commands.Cog):
|
|||||||
f"{member} получил предупреждение. Причина: {reason or 'Без причины'}"
|
f"{member} получил предупреждение. Причина: {reason or 'Без причины'}"
|
||||||
)
|
)
|
||||||
|
|
||||||
@commands.command()
|
@command()
|
||||||
async def warnings(self, ctx: commands.Context, member: discord.Member) -> None:
|
async def warnings(self, ctx: Context, member: discord.Member) -> None:
|
||||||
"""
|
"""
|
||||||
Показать предупреждения участника.
|
Показать предупреждения участника.
|
||||||
|
|
||||||
@@ -300,9 +300,9 @@ class Moderation(commands.Cog):
|
|||||||
lines.append(f"{i}. {w['reason']} ({w['date']})")
|
lines.append(f"{i}. {w['reason']} ({w['date']})")
|
||||||
await ctx.send("\n".join(lines))
|
await ctx.send("\n".join(lines))
|
||||||
|
|
||||||
@commands.command()
|
@command()
|
||||||
@is_admin()
|
@is_admin()
|
||||||
async def clear(self, ctx: commands.Context, amount: int) -> None:
|
async def clear(self, ctx: Context, amount: int) -> None:
|
||||||
"""
|
"""
|
||||||
Очистить указанное количество сообщений в канале.
|
Очистить указанное количество сообщений в канале.
|
||||||
|
|
||||||
@@ -320,7 +320,7 @@ class Moderation(commands.Cog):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def setup(bot: commands.Bot) -> None:
|
async def setup(bot: Bot) -> None:
|
||||||
"""
|
"""
|
||||||
Зарегистрировать cog в боте.
|
Зарегистрировать cog в боте.
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
from discord.ext import commands
|
from discord.ext.commands import Cog, Bot, Context, group
|
||||||
|
|
||||||
from ..storage import storage, Reminder
|
from ..storage import storage, Reminder
|
||||||
from .moderation import is_admin
|
from .moderation import is_admin
|
||||||
|
|
||||||
|
|
||||||
class Reminders(commands.Cog):
|
class Reminders(Cog):
|
||||||
"""
|
"""
|
||||||
Cog для управления напоминаниями: add, list, remove.
|
Cog для управления напоминаниями: add, list, remove.
|
||||||
"""
|
"""
|
||||||
def __init__(self, bot: commands.Bot) -> None:
|
def __init__(self, bot: Bot) -> None:
|
||||||
self.bot: commands.Bot = bot
|
self.bot: Bot = bot
|
||||||
|
|
||||||
@commands.group()
|
@group()
|
||||||
@is_admin()
|
@is_admin()
|
||||||
async def reminder(self, ctx: commands.Context) -> None:
|
async def reminder(self, ctx: Context) -> None:
|
||||||
"""
|
"""
|
||||||
Группа команд напоминаний.
|
Группа команд напоминаний.
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ class Reminders(commands.Cog):
|
|||||||
|
|
||||||
@reminder.command(name="add")
|
@reminder.command(name="add")
|
||||||
async def reminder_add(
|
async def reminder_add(
|
||||||
self, ctx: commands.Context, minutes: int, *, text: str
|
self, ctx: Context, minutes: int, *, text: str
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Добавить новое напоминание.
|
Добавить новое напоминание.
|
||||||
@@ -55,7 +55,7 @@ class Reminders(commands.Cog):
|
|||||||
await ctx.send(f"Напоминание добавлено через {minutes} минут: {text}")
|
await ctx.send(f"Напоминание добавлено через {minutes} минут: {text}")
|
||||||
|
|
||||||
@reminder.command(name="list")
|
@reminder.command(name="list")
|
||||||
async def reminder_list(self, ctx: commands.Context) -> None:
|
async def reminder_list(self, ctx: Context) -> None:
|
||||||
"""
|
"""
|
||||||
Показать список активных напоминаний.
|
Показать список активных напоминаний.
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ class Reminders(commands.Cog):
|
|||||||
await ctx.send(msg)
|
await ctx.send(msg)
|
||||||
|
|
||||||
@reminder.command(name="remove")
|
@reminder.command(name="remove")
|
||||||
async def reminder_remove(self, ctx: commands.Context, number: int) -> None:
|
async def reminder_remove(self, ctx: Context, number: int) -> None:
|
||||||
"""
|
"""
|
||||||
Удалить напоминание по номеру.
|
Удалить напоминание по номеру.
|
||||||
|
|
||||||
@@ -90,5 +90,5 @@ class Reminders(commands.Cog):
|
|||||||
await ctx.send(f"Удалено напоминание: {removed.text}")
|
await ctx.send(f"Удалено напоминание: {removed.text}")
|
||||||
|
|
||||||
|
|
||||||
async def setup(bot: commands.Bot) -> None:
|
async def setup(bot: Bot) -> None:
|
||||||
await bot.add_cog(Reminders(bot))
|
await bot.add_cog(Reminders(bot))
|
||||||
|
|||||||
Reference in New Issue
Block a user