from email import message from discord.ext import tasks, commands import discord import asyncio import traceback import os from exceptions import NotFoundPlayerOnServer import aiohttp class Extension: core = None track_guild_id = 0 track_channel_id = 712673654487515238 track_webhook_id = 740681080557797499 track_role_id = 744928190895489074 no_reason = {} def __init__(self, core): if not os.getenv("WEBHOOK_HELPER_ENABLED", None): return None self.core = core self.track_guild_id = core.main_server_id self.webhook_reaction_translate = { "😘":('ban', {"profile":"", "reason":"", "minutes":0, "discord_user":None}), "🔨":('ban', {"profile":"", "reason":"", "minutes":30, "discord_user":None}), "⚒️":('ban', {"profile":"", "reason":"", "minutes":120, "discord_user":None}), "📨":(self.null_reason, {"requester":""}), "🦵":("kick", {"profile":"", "discord_user":None, "reason":""}), "🔇":("mute", {"profile":"", "discord_user":None}), "😇":("unban", {"profile":"", "discord_user":None}), "<:hueglot:713139400028061767>":("kick", {"profile":"", "requester_profile":"", "discord_user":None, "reason":""}), "🔍":("profile", {"profile":"", "discord_user":None}), "🔎":("profile", {"profile":"", "requester_profile":"", "discord_user":None}) } self.reaction_translate = { '😘':"ban", '🔍':"inspect", '🦵':"kick", '🔨':"ban30", '⚒️':"ban120", '📨':"noreason", '<:hueglot:713139400028061767>':"author_kick", '🔇':"mute", '😇':"unban", '🔎':'author_inspect' } @core.listen() async def on_message(message: discord.Message): if message.webhook_id != self.track_webhook_id: return for emoji in list(self.webhook_reaction_translate.keys()): try: await message.add_reaction(emoji) except Exception as err: print(f"Cannot add reaction on webhook, error: {err}") return @core.listen() async def on_raw_reaction_add(payload): channel = await self.core.fetch_channel(payload.channel_id) message: discord.Message = await channel.fetch_message(payload.message_id) user: discord.User = await self.core.fetch_user(payload.user_id) if message.webhook_id != self.track_webhook_id: return if self.core.user.id == payload.user_id: return if not message.guild.get_member(user.id).get_role(self.track_role_id): return print(payload.emoji, message.webhook_id, self.core.user.id == payload.user_id, message.guild.get_member(user.id).get_role(self.track_role_id)) if str(payload.emoji) in self.webhook_reaction_translate.keys(): executor = self.webhook_reaction_translate[str(payload.emoji)][0] kwargs = self.webhook_reaction_translate[str(payload.emoji)][1].copy() if "requester" in kwargs: kwargs["requester"] = user.id if "discord_user" in kwargs: kwargs["discord_user"] = user if "reason" in kwargs and not user.id in self.no_reason: def check(msg: discord.Message): return msg.author == user and msg.channel == message.channel try: req_msg = await message.channel.send(content=f"{user.mention}!\nВведи причину отправив сообщение") msg = await self.core.wait_for("message", timeout=60.0, check=check) except asyncio.TimeoutError: await message.channel.send(content=f"{user.mention}!\nДействие {payload.emoji} отменено спустя время", delete_after=60) return try: await req_msg.delete() except Exception as err: print("Cannot delete request reason message, error: " +err) try: await msg.delete() except Exception as err: print("Cannot delete user response message, error: " +err) #не ну это пиздец if len(msg.content.split(" ")) > 0 and msg.content.lower().split(" ")[0] == "отмена": return await message.channel.send(content=f"{user.mention}!\nДействие {payload.emoji} отменено по твоей воле", delete_after=60) else: kwargs["reason"] = msg.content if "reason" in kwargs and user.id in self.no_reason: kwargs["reason"] = self.no_reason[user.id] del self.no_reason[user.id] #### if "requester_profile" in kwargs: kwargs["profile"] = message.embeds[0].author.url del kwargs["requester_profile"] elif "profile" in kwargs: kwargs["profile"] = message.embeds[0].url #else: # return await message.channel.send(content=f"невозможно получить профиль игрока из webhook") print(kwargs) try: report_id = message.embeds[0].color.value await self.add_action(report_id, str(payload.emoji)) except Exception: traceback.print_exc() try: if type(executor) == str: result = await self.core.loaded_extensions[executor](**kwargs) else: result = await executor(**kwargs) except NotFoundPlayerOnServer: return await message.channel.send(content=f"{user.mention}!\nДействие {payload.emoji} сообщило что игрок сейчас не играет на сервере!\nВозможен пиздеж и провокация!", delete_after=60) except Exception as err: traceback.print_exc() return await message.channel.send(content=f"{user.mention}!\nДействие {payload.emoji} невозможно из-за ошибки: {err}. Стоит написать добродею!", delete_after=60) return await message.channel.send(content=f"{user.mention}!\nДействие {payload.emoji} дало ответ: {result}") async def null_reason(self, requester): self.no_reason[requester] = "no reason" return "Следующий бан будет без причины" async def add_action(self, report_id, emoji): if emoji in self.reaction_translate: async with aiohttp.ClientSession(cookies={ "secretkey":os.getenv("BACKEND_SECRETKEY")}) as session: async with session.post(f"{os.getenv('BACKEND_URL')}/api/server/any/report/{report_id}", data=self.reaction_translate[emoji], ssl = False) as response: result = await response.text() print(f"Action added with id: {result}") else: print(f"Not found traslate for reaction: {emoji}")