from email import message import discord from discord.ext import commands import os import asyncio, aiohttp import traceback from typing import List class Extension: auth_channel = 960796520247091201 default_role = 684828780040421388 core = None def __init__(self, core): if not os.getenv("REGISTER_ENABLED", None): return None self.core = core @core.tree.command(name = "register", description = "Привязать дискорд к стиму") @discord.app_commands.describe(profile=core.ANY_INPUT) async def register( interaction: discord.Interaction, profile: str ): await interaction.response.defer(thinking=True, ephemeral=True) return await interaction.followup.send(f'Для этого перейди сюда и проделай что нужно https://tf2.pblr-nyk.pro/authentication_discord.html\nЗатем перезайди на сервер дискорда', ephemeral=True) try: steam64 = await core.GetSteam64OfDiscord(interaction.user, True) return await interaction.followup.send('У тебя уже привязан профиль, стоит его для начала отвязать перед новой привязкой', ephemeral=True) except: pass try: profile = await core.GetPlayer(profile, "", True) except: return await interaction.followup.send(""" Невозможно в данный момент времени привязать такой профиль, причины: 1)Ты не играл на наших серверах, поэтому нельзя получить ид стима 2)Если ты кидал ссылку, то твоя ссылка является невалидной, попробуй другой формат 3)Сервисы стим устали 4)Сервисы факты13 устали Попробуй по-другому или подожди...""", ephemeral=True) profile_discord_id = await profile.GetDiscordId() if profile_discord_id != 0: return await interaction.followup.send(f'Профиль {profile.community_url} уже привязан к пользователю <@{profile_discord_id}>, если у тебя угнали профиль, напиши об этом <@142269939783434240>', ephemeral=True) if not profile.played_on_servers: return await interaction.followup.send('Профиль который ты хочешь привязать не играл на наших серверах, тогда зачем ты здесь??', ephemeral=True) result = await profile.CreateDiscordId(interaction.user.id) if not result: return await interaction.followup.send('Кароч нельзя привязать профиль(((', ephemeral=True) await self.final_stage(interaction.user, interaction.guild) return await interaction.followup.send(f'Ты крут!', ephemeral=True) @core.tree.command(name = "unregister", description = "Отвязать профиль") @discord.app_commands.describe() async def unregister( interaction: discord.Interaction ): await interaction.response.defer(thinking=True) steam64 = await core.GetSteam64OfDiscord(interaction.user) player = await core.GetPlayer(steam64, steam64, False) await player.RemoveDiscordId(interaction.user.id) core.discord2steam_cache = {} await self.remove_role(interaction.user, interaction.guild) await interaction.followup.send(f'Профиль отвязан, друг', ephemeral=True) return @core.listen() async def on_member_join(member: discord.Member): if member.guild.id != core.main_server_id: return try: await core.GetSteam64OfDiscord(member, True) await self.final_stage(member, member.guild) return except: pass auth_channel: discord.TextChannel = await core.fetch_channel(self.auth_channel) welcome_message = f"Привет <@{member.id}>!!!\n" + """ Добро пожаловать на оффициальный сервер дискорда факты 13! Чтоб войти и получить роль для доступа ко всему, авторизуйся через форму на сайте: https://tf2.pblr-nyk.pro/authentication_discord.html Если все правильно, то этот канал для тебя исчезнет и ты получишь доступ ко всем остальным каналам. > Так-же ты можешь прочитать местные правила <#734497550232453340> Если ты их видишь)) > Если не получается получить роль через бота пиши <@142269939783434240>""" return await auth_channel.send(content=welcome_message, delete_after=120) @core.listen() async def on_message(message: discord.Message): if not message.guild or message.guild.id != core.main_server_id: return if message.channel.id != self.auth_channel: return if message.author == core.user or message.author.id == 142269939783434240: return try: await message.delete() except Exception as err: print(f"Cannot delete message from auth channel, error: {err}") return @core.tree.command(name = "synclist", description = "Сихронизировать работяг") @discord.app_commands.describe() @discord.app_commands.checks.has_role("Администратор Фактов13") async def sync_list_not_have_role(interaction: discord.Interaction): await interaction.response.defer(thinking=True) not_synced = await self.get_authusers_without_sync() message = "Текущий список:\n" for uid in not_synced: message += f"<@{uid}>\n" if not not_synced: message += "пусто..." return await interaction.followup.send(content=message, ephemeral=True) async def prepair(self): not_synced = await self.get_authusers_without_sync() for uid in not_synced: try: member = self.core.get_guild(self.core.main_server_id).get_member(uid) await self.final_stage(member, member.guild, "Автоматически, синхронизация с сайтом, во время иницилизации") except Exception as e: print(f"[register.prepair] Cannot add role, uid:{uid}, error:{e}") traceback.print_exc() async def get_authusers_without_sync(self): current_members:List[discord.Member] = self.core.get_guild(int(self.core.main_server_id)).members current_members = [str(i.id) for i in current_members if i.get_role(self.default_role) == None] not_synced = None async with aiohttp.ClientSession(cookies={"secretkey":os.getenv("BACKEND_SECRETKEY")}) as session: async with session.post(f"{os.getenv('BACKEND_URL')}/api/discord/sync", ssl=False, json=current_members) as response: not_synced = await response.json() return not_synced async def final_stage(self, user: discord.Member, guild: discord.Guild, reason = ""): try: await user.add_roles(guild.get_role(self.default_role), reason = "Автоматически, зарегистрировался через сайтик" if not reason else reason) except Exception as err: print(f"Cannot set role({self.default_role}) to {user}, error: {err}") async def remove_role(self, user: discord.Member, guild: discord.Guild, reason = ""): try: await user.remove_roles(guild.get_role(self.default_role), reason = "Игрок отвязал аккаунт через бота" if not reason else reason) except Exception as err: print(f"Cannot remove role({self.default_role}) from {user}, error: {err}") async def task(self, timeout = 60): await self.core.wait_until_ready() await asyncio.sleep(5) print("[register] update register cache") while True: await self.updater() await asyncio.sleep(timeout) async def task_secondary(self, timeout = 60 * 60): await self.core.wait_until_ready() await asyncio.sleep(5) print("[register] update register cache who dont have role") while True: await self.prepair() await asyncio.sleep(timeout) async def updater(self): try: hmap = None async with aiohttp.ClientSession(cookies={"secretkey":os.getenv("BACKEND_SECRETKEY")}) as session: async with session.get(f"{os.getenv('BACKEND_URL')}/api/discord/sync", ssl=False) as response: hmap = await response.json() if not hmap: return print(f"[register] need sync, payload: {hmap}") for reg in hmap.get("reg", []): try: member = self.core.get_guild(self.core.main_server_id).get_member(reg) await self.final_stage(member, member.guild, "Автоматически, синхронизация с сайтом") except: print(f"[register] cannot add role to {reg}") traceback.print_exc() for unreg in hmap.get("unreg", []): try: member = self.core.get_guild(self.core.main_server_id).get_member(unreg) await self.final_stage(member, member.guild, "Автоматически, синхронизация с сайтом") except: print(f"[register] cannot add role to {unreg}") traceback.print_exc() except: traceback.print_exc()