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.
201 lines
8.9 KiB
201 lines
8.9 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 * 60):
|
|
await self.core.wait_until_ready()
|
|
await asyncio.sleep(5)
|
|
print("[register] update register cache who dont have role")
|
|
while True:
|
|
await self.give_roles_to_auth()
|
|
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:
|
|
traceback.print_exc()
|