All checks were successful
Build Docker / Build Image (push) Successful in 2m37s
Add line in verify mesage mentioning the ability to set the record onchain
96 lines
2.5 KiB
Python
96 lines
2.5 KiB
Python
import os
|
|
from dotenv import load_dotenv
|
|
import dns.resolver
|
|
import dns.exception
|
|
import dns.message
|
|
import discord
|
|
import json
|
|
import requests
|
|
|
|
load_dotenv()
|
|
|
|
resolver = dns.resolver.Resolver()
|
|
serverIP = os.getenv('DNS_SERVER')
|
|
if not serverIP:
|
|
print("No DNS_SERVER found in .env")
|
|
exit(1)
|
|
resolver.nameservers = [serverIP]
|
|
resolver.port = int(os.getenv('DNS_PORT',"53"))
|
|
|
|
LOCAL = False
|
|
if os.getenv('LOCAL') == "True":
|
|
LOCAL = True
|
|
|
|
verified_roles = '/data/roles.json'
|
|
|
|
if LOCAL:
|
|
verified_roles = 'roles.json'
|
|
|
|
|
|
def check_name(user_id: int, name: str) -> bool:
|
|
try:
|
|
answer = resolver.resolve('_shaker._auth.' + name, 'TXT')
|
|
for rrset in answer.response.answer:
|
|
parts = rrset.to_text().split(" ")
|
|
if str(user_id) in parts[-1]:
|
|
return True
|
|
except dns.exception.DNSException as e:
|
|
print("DNS Exception")
|
|
print(e)
|
|
|
|
# Alternatively check via hsd.hns.au
|
|
try:
|
|
response = requests.get(f"https://hsd.hns.au/api/v1/nameresource/{name}")
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
if 'records' not in data:
|
|
return False
|
|
for record in data['records']:
|
|
if record['type'] == 'TXT' and str(user_id) in record['txt']:
|
|
return True
|
|
|
|
except Exception as e:
|
|
print("HTTP Exception")
|
|
print(e)
|
|
|
|
return False
|
|
|
|
async def handle_role(member: discord.Member, shouldHaveRole: bool):
|
|
with open(verified_roles, 'r') as f:
|
|
roles = json.load(f)
|
|
|
|
key = str(member.guild.id)
|
|
|
|
if not key in roles:
|
|
return
|
|
|
|
role_id = roles[key]
|
|
|
|
if role_id:
|
|
guild = member.guild
|
|
role = guild.get_role(role_id)
|
|
if role and shouldHaveRole and not role in member.roles:
|
|
await member.add_roles(role)
|
|
elif role and not shouldHaveRole and role in member.roles:
|
|
await member.remove_roles(role)
|
|
|
|
|
|
async def check_member(member: discord.Member) -> bool:
|
|
if member.display_name[-1] != "/":
|
|
await handle_role(member, False)
|
|
return False
|
|
|
|
if check_name(member.id, member.display_name[0:-1]):
|
|
await handle_role(member, True)
|
|
return True
|
|
|
|
try:
|
|
await member.edit(nick=member.display_name[0:-1])
|
|
except Exception as e:
|
|
print(e)
|
|
await handle_role(member, False)
|
|
return False
|
|
|
|
if __name__ == "__main__":
|
|
# Try to check name
|
|
print(check_name(481051831083073536,"xn--tya")) |