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.
 
 
 

166 lines
7.7 KiB

import discord
from discord.ext import commands
import os
import asyncio, aiohttp
import traceback
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!
Чтоб войти и получить роль для доступа ко всему, используй команду /register cо своим профилем стима или никнейм из тф.
Например: /register отдыхаем
Если все правильно, то этот канал для тебя исчезнет и ты получишь доступ ко всем остальным каналам.
> Так-же ты можешь прочитать местные правила <#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):
current_members = self.core.get_guild(int(self.core.main_server_id)).members
current_members = [i for i in current_members if i]
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, payload=current_members) as response:
await response.json()'''
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 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
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()