From bdd56ec1ef36746f73eb35f009b58b0cc6a0deb3 Mon Sep 17 00:00:00 2001 From: babrick Date: Sat, 26 Oct 2024 18:01:58 +0000 Subject: [PATCH] first commit --- config.py | 8 ++ main.py | 302 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 310 insertions(+) create mode 100644 config.py create mode 100644 main.py diff --git a/config.py b/config.py new file mode 100644 index 0000000..46bb853 --- /dev/null +++ b/config.py @@ -0,0 +1,8 @@ +# Выдача ролей +auto_role_enabled = True # Вкл/выкл выдачу ролей (False - выкл, True - вкл) +server_id = "01JAK2J1RV31VE5TP5S2S2HS85" # ID сервера +role_id = "01JAK4ZE4TYVAVKWJYS4Z1KS0E" # ID роли + +# Бот +token="BOT TOKEN" # Токен бота +owner_id="01J39VCPN45CDKP4WP6ERPW00V" # ID создателя бота \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..21276d0 --- /dev/null +++ b/main.py @@ -0,0 +1,302 @@ +import asyncio + +import aiohttp + +import next +from next.ext import commands +import config +from datetime import timedelta +import random + + +def convert_to_timedelta(duration_str): + if duration_str.endswith('h'): + hours = int(duration_str[:-1]) + return timedelta(hours=hours) + elif duration_str.endswith('d'): + days = int(duration_str[:-1]) + return timedelta(days=days) + elif duration_str.endswith('m'): + minutes = int(duration_str[:-1]) + return timedelta(minutes=minutes) + elif duration_str.endswith('s'): + seconds = int(duration_str[:-1]) + return timedelta(seconds=seconds) + else: + raise ValueError("Invalid format. Use 'h' for hours, 'd' for days, 'm' for minutes, 's' for seconds.") + + +class Client(commands.CommandsClient): + async def get_prefix(self, message: next.Message): + return "/" + + async def on_member_join(self, member: next.Member): + if member.bot: + return + + if not config.auto_role_enabled: + return + + server = self.get_server(config.server_id) + + role = server.get_role(config.role_id) + + await member.edit(roles=[role]) + + print("Роль выдана участнику с ID:", member.id) + + + async def on_ready(self): + prefix = await self.get_prefix(None) + print(f"Logged in as {self.user.name}#{self.user.discriminator}") + await self.edit_status(presence=next.PresenceType.busy, text=f"{prefix}help - Babrick bot") + + + @commands.command() + async def help(self, ctx: commands.Context): + prefix = await self.get_prefix(ctx.message) + embed = next.SendableEmbed(title="Команды", description=f"`{prefix}ban (Пользователь) (Причина)` - бан пользователя\n`{prefix}unban (Пользователь)` - разбан пользователя\n`{prefix}kick (Пользователь)` - кикнут пользователя\n`{prefix}timeout (Пользователь) (Время. Пример: 1m)` - выдать таймаут пользователю\n`{prefix}untimeout (Пользователь)` - снять таймаут пользователю\n`{prefix}drel` - дрель\n`{prefix}say (Текст)` - отправка текста от имени бота (Только для создателя бота)\n`{prefix}user_info` - информация о пользователе\n`{prefix}tsuefa` - игра камень, ножницы, бумага", colour="#9723ad") + await ctx.send(embed=embed) + + + @commands.command() + async def tsuefa(self, ctx: commands.Context): + all_texts = [":rock: - камень", ":spiral_notepad: - бумага", ":scissors: - ножницы"] + random.shuffle(all_texts) + selected_test = random.choice(all_texts) + embed = next.SendableEmbed(title="Камень, ножницы, бумага", description=f"Бросил: <@{ctx.author.id}>\nВыпало: {selected_test}", colour="#9723ad") + await ctx.send(embed=embed) + + @commands.command() + async def ban(self, ctx: commands.Context, *args): + if not ctx.author.has_permissions(ban_members=True): + await ctx.send("У вас недостаточно прав") + return + + bot_member = ctx.server.get_member(self.user.id) + + if not bot_member.has_permissions(ban_members=True): + await ctx.send("Не достаточно прав у бота") + return + + + message = ' '.join(args) + + ids = ctx.message.raw_mentions + ban_id = 0 + reason = 'Не указана' + + if not ids: + return + + for id in ids: + ban_id = id + break + + if not ban_id: + return + + if ctx.author.id == ban_id: + await ctx.send("Вы не можете забанить себя") + return + + server = ctx.server + member = server.get_member(ban_id) + + if message.replace(f"<@{ban_id}>", ""): + reason = message.replace(f"<@{ban_id}>", "") + + await member.ban(reason=reason) + await ctx.send(f"Пользователь <@{ban_id}> был успешно забанен по причине: `{reason}`") + + print(f"Пользователь под ID {ctx.author.id} забанил пользователь под ID {ban_id} по причине \"{reason}\"") + + @commands.command() + async def unban(self, ctx: commands.Context): + if not ctx.author.has_permissions(ban_members=True): + await ctx.send("У вас недостаточно прав") + return + + bot_member = ctx.server.get_member(self.user.id) + + if not bot_member.has_permissions(ban_members=True): + await ctx.send("Не достаточно прав у бота") + return + + ids = ctx.message.raw_mentions + unban_id = 0 + + if not ids: + return + + for id in ids: + unban_id = id + break + + if not unban_id: + return + + server = ctx.server + member = server.get_member(unban_id) + + await member.unban() + await ctx.send(f"Пользователь <@{unban_id}> был успешно разбанен") + + print(f"Пользователь под ID {ctx.author.id} разбанил пользователь под ID {unban_id}") + + + @commands.command() + async def kick(self, ctx: commands.Context, user): + if not ctx.author.has_permissions(kick_members=True): + await ctx.send("У вас недостаточно прав") + return + + bot_member = ctx.server.get_member(self.user.id) + + if not bot_member.has_permissions(kick_members=True): + await ctx.send("Не достаточно прав у бота") + return + + ids = ctx.message.raw_mentions + kick_id = 0 + + if not ids: + return + + for id in ids: + kick_id = id + break + + if not kick_id: + return + + if ctx.author.id == kick_id: + await ctx.send("Вы не можете кикнуть себя") + return + + server = ctx.server + member = server.get_member(kick_id) + + await member.kick() + await ctx.send(f"Пользователь <@{kick_id}> был успешно кикнут") + + print(f"Пользователь под ID {ctx.author.id} кикнул пользователь под ID {kick_id}") + + + @commands.command() + async def timeout(self, ctx: commands.Context, user, time): + if not ctx.author.has_permissions(timeout_members=True): + await ctx.send("У вас недостаточно прав") + return + + bot_member = ctx.server.get_member(self.user.id) + + if not bot_member.has_permissions(timeout_members=True): + await ctx.send("Не достаточно прав у бота") + return + + ids = ctx.message.raw_mentions + timeout_id = 0 + + if not ids: + return + + for id in ids: + timeout_id = id + break + + if not timeout_id: + return + + if ctx.author.id == timeout_id: + await ctx.send("Вы не можете выдать таймаут себе") + return + + server = ctx.server + member = server.get_member(timeout_id) + + await member.timeout(convert_to_timedelta(time)) + await ctx.send(f"Пользователю <@{timeout_id}> был успешно выдан таймаут с продолжительностю `{time}`") + + print(f"Пользователь под ID {ctx.author.id} выдал таймаут на {time} пользователю под ID {timeout_id}") + + + @commands.command() + async def untimeout(self, ctx: commands.Context, user): + if not ctx.author.has_permissions(timeout_members=True): + await ctx.send("У вас недостаточно прав") + return + + bot_member = ctx.server.get_member(self.user.id) + + if not bot_member.has_permissions(timeout_members=True): + await ctx.send("Не достаточно прав у бота") + return + + ids = ctx.message.raw_mentions + untimeout_id = 0 + + if not ids: + return + + for id in ids: + untimeout_id = id + break + + if not untimeout_id: + return + + if ctx.author.id == untimeout_id: + await ctx.send("Вы не можете снять таймаут у себя") + return + + server = ctx.server + member = server.get_member(untimeout_id) + + await member.timeout(convert_to_timedelta("0s")) + await ctx.send(f"Пользователю <@{untimeout_id}> был успешно снят таймаут") + + print(f"Пользователь под ID {ctx.author.id} снял таймаут пользователю под ID {untimeout_id}") + + + @commands.command() + async def say(self, ctx: commands.Context, *args): + if ctx.author.id != config.owner_id: + await ctx.send("Вы не создатель бота") + return + + message = ' '.join(args) + + if not message: + await ctx.send("Вы не ввели текст сообщения") + return + + await ctx.send(message) + + + @commands.command(name="дрель") + async def drel(self, ctx: commands.Context): + await ctx.send("дрель я тебя люблю") + + + @commands.command() + async def user_info(self, ctx: commands.Context): + roles = "" + + for role in ctx.author.roles: + if not role.name: + continue + + roles += role.name + "\n" + + if roles: + await ctx.send(f"ID: {ctx.author.id}\nНик: {ctx.author.name}#{ctx.author.discriminator}\nРоли; {roles}") + else: + await ctx.send(f"ID: {ctx.author.id}\nНик: {ctx.author.name}#{ctx.author.discriminator}") + +async def main(): + async with aiohttp.ClientSession() as session: + client = Client(session, config.token, help_command=None) + await client.start() + +asyncio.run(main()) \ No newline at end of file