You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

205 lines
9.0 KiB

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 give_roles_to_auth(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(int(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):
await self.core.wait_until_ready()
await asyncio.sleep(5)
print("[register] update register cache who dont have role")
while True:
try:
await self.give_roles_to_auth()
except:
print("Cannot update sync roles")
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(int(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(int(unreg))
await self.final_stage(member, member.guild, "Автоматически, синхронизация с сайтом")
except:
print(f"[register] cannot add role to {unreg}")
traceback.print_exc()
except:
print("Cannot get /api/discord/sync")
traceback.print_exc()