babrick-bot/main.py

302 lines
11 KiB
Python
Raw Normal View History

2024-10-26 21:01:58 +03:00
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())