Files
shaker-bot/shaker.py
Nathan Woodburn 226210ee0c
All checks were successful
Build Docker / Build Image (push) Successful in 2m37s
fix: Cleanup code to follow good practice
Add line in verify mesage mentioning the ability to set the record onchain
2025-10-09 13:28:05 +11:00

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"))