import discord import os # default module from dotenv import load_dotenv import json import mariadb import sys from discord import default_permissions load_dotenv() # load all the variables from the env file with open('config.json') as user_file: config = json.loads(user_file.read()) def connect_db(): try: conn = mariadb.connect( user=config["db_user"], password=config["db_password"], host=config["db_host"], port=3306, database=config["db_name"] ) return conn except mariadb.Error as e: print(f"Error connecting to MariaDB Platform: {e}") sys.exit(1) def recruit_update(member, recruit, cur, conn): if member.nick is None: nick = member.name else: nick = member.nick cur.execute("INSERT INTO recruits (discord_id, nickname, recruit) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE nickname=?, recruit=?;", (member.id, nick, recruit, nick, recruit)) conn.commit() intents = discord.Intents.default() intents.members = True bot = discord.Bot(intents = intents) @bot.event async def on_ready(): print(f"{bot.user} is ready and online!") conn = connect_db() cur = conn.cursor() # create Slash Command group with bot.create_group settings = bot.create_group("set", "Einstellungen") @settings.command() @discord.commands.default_permissions(manage_roles=True) async def channel_voting(ctx): cur.execute("UPDATE settings SET VALUE = ? WHERE name = 'channel_voting'", (ctx.channel_id, )) conn.commit() await ctx.respond(f"Done.", ephemeral=True) @settings.command() @default_permissions(manage_roles=True) async def channel_report(ctx): cur.execute("UPDATE settings SET VALUE = ? WHERE name = 'channel_report'", (ctx.channel_id, )) conn.commit() await ctx.respond(f"Done.", ephemeral=True) @settings.command() @default_permissions(manage_roles=True) async def role_recruit( ctx, rolearg: discord.Option(discord.SlashCommandOptionType.role) ): cur.execute("UPDATE settings SET VALUE = ? WHERE name = 'role_recruit'", (rolearg.id, )) conn.commit() await ctx.respond(f"Done.", ephemeral=True) @settings.command() @default_permissions(manage_roles=True) async def guild(ctx): cur.execute("UPDATE settings SET VALUE = ? WHERE name = 'guild'", (ctx.guild_id, )) conn.commit() await ctx.respond(f"Done.", ephemeral=True) def check_roles(member, recruit_id): for role in member.roles: if role.id == recruit_id: return "Yes" @settings.command() @default_permissions(manage_roles=True) async def refresh(ctx): cur.execute("SELECT value FROM settings WHERE name='guild'") #conn.commit() guild_id = cur.fetchone() guild_id = guild_id[0] cur.execute("SELECT value FROM settings WHERE name='role_recruit'") recruit_id = cur.fetchone() recruit_id = recruit_id[0] guild = bot.get_guild(guild_id) for role in guild.roles: if role.id == recruit_id: for member in role.members: recruit_update(member, 1, cur, conn) for member in guild.members: result = check_roles(member, recruit_id) if result == "Yes": None else: if member.nick is None: nick = member.name else: nick = member.nick cur.execute("UPDATE recruits SET recruit = ? WHERE discord_id = ?", (0, member.id)) conn.commit() await ctx.respond(f"Done.", ephemeral=True) @bot.event async def on_member_update(previous, after): cur.execute("SELECT value FROM settings WHERE name='role_recruit'") recruit_id = cur.fetchone() recruit_id = recruit_id[0] for role in after.roles: if role.id == recruit_id: recruit_update(after, 1, cur, conn) return None # Kein Rekrut for role in previous.roles: if role.id == recruit_id: recruit_update(after, 0, cur, conn) return None bot.run(os.getenv('TOKEN')) # run the bot with the token