index — Deutsche-Haus-Bot @ 566934245e485a0bc09c810dc756d2641a6d4fb3

Discord bot to dynamically create voice chats for clubs that boosters can create

readme, bot, db: implement role header handling
crispy-caesus crispy@crispy-caesus.eu
Thu, 11 Jun 2026 21:40:17 +0200
commit

566934245e485a0bc09c810dc756d2641a6d4fb3

parent

c1678d5b1ad629a7e762f3a80b35a09b50c5b059

3 files changed, 53 insertions(+), 20 deletions(-)

jump to
M README.mdREADME.md

@@ -26,5 +26,4 @@

Run the bot with `python bot.py` ## ToDo -- implement role headers properly - don't create several channels, if two people open the same club
M bot.pybot.py

@@ -272,7 +272,12 @@ await error(ctx, "Role-Creation: Couldn't create new role in DB", err)

return await log(ctx, f"club {kanalname} created by {ctx.author}") - await ctx.author.add_roles(createdRole) + header_role = await possibly_add_header_role(ctx.guild, ctx.author.id, db) + + if header_role == None: + await ctx.author.add_roles(createdRole) + else: + await ctx.author.add_roles(createdRole, header_role) await db.add_member(ctx.author.id, ctx.author.id) await log(ctx, f"Role {createdRole} added to {ctx.author}")

@@ -341,20 +346,32 @@ await error(ctx, "Error, editing club", response)

else: await ctx.respond("✅ Club editiert!") -# ========================= dsfsf ======================= # -async def add_header_role(ctx): - pass +# ========================= header role management ======================= # + +async def possibly_add_header_role(guild, member, db): + clubs = await db.select_clubs_of_member(member) + if clubs == []: + print("empty") + header_role = await db.get_header_role() + return discord.utils.get(guild.roles, id=header_role) + else: + print("full") + return None + +# ========================= member management ======================= # @bot.slash_command(description="Fügt Member zu eigenem Club hinzu") async def mitglied_hinzufuegen(ctx, member): + member = member[2:-1] db = await init_db(ctx) - response = await db.add_member(member[2:-1], ctx.author.id) + + header_role = await possibly_add_header_role(ctx.guild, member, db) + + response = await db.add_member(member, ctx.author.id) if response is not None: await ctx.respond(response) return - - member = await member_converter.convert(ctx, member) response = await db.select_role_id_by_owner(ctx.author.id) if response is None:

@@ -362,18 +379,27 @@ await ctx.respond(":x: Du hast keinen Club")

return role = discord.utils.get(ctx.guild.roles, id=response) - await member.add_roles(role) + member = await member_converter.convert(ctx, member) + if header_role == None: + await member.add_roles(role) + else: + await member.add_roles(role, header_role) await ctx.respond(":white_check_mark:") await log(ctx, f"Added {member} to {role}") @bot.slash_command(description="Entfernt Mitglied aus eigenem Club") async def mitglied_entfernen(ctx, member): + member = member[2:-1] db = await init_db(ctx) - response = await db.remove_member(member[2:-1], ctx.author.id) + + + response = await db.remove_member(member, ctx.author.id) if response is not None: await ctx.respond(response) return + header_role = await possibly_add_header_role(ctx.guild, member, db) + member = await member_converter.convert(ctx, member) response = await db.select_role_id_by_owner(ctx.author.id)

@@ -382,7 +408,10 @@ await ctx.respond(":x: Du hast keinen Club")

return role = discord.utils.get(ctx.guild.roles, id=response) - await member.remove_roles(role) + if header_role == None: + await member.remove_roles(role) + else: + await member.remove_roles(role, header_role) await ctx.respond(":white_check_mark:") await log(ctx, f"Removed {member} from {role}")
M db.pydb.py

@@ -5,7 +5,6 @@

class Database: def __init__(self, db_name: str): self.db_name = db_name - # print(db_name) # ====================== INITIALIZATION ======================== # async def initial_setup(self):

@@ -167,7 +166,6 @@

# ============================ add member ================================== # async def add_member(self, member: int, owner: int): - # print(f"DB: add_member received:\n member: {member}\n owner: {owner}") sql = """INSERT INTO members (user_id, club_id) VALUES(?,?);""" try:

@@ -196,14 +194,11 @@ async def remove_member(self, member: int, owner: int):

club_id = await self.get_club_id_by_owner(owner) try: async with aiosqlite.connect(self.db_name) as db: - async with db.execute( - "DELETE FROM members WHERE user_id = ? AND club_id = ?", + await db.execute( + "DELETE FROM members WHERE user_id = ? AND club_id = ?;", (member, club_id), - ) as cursor: - async for row in cursor: - args = (member, row[0]) - await db.execute(sql, args) - await db.commit() + ) + await db.commit() except Error as e: print(e) return e

@@ -281,6 +276,8 @@

async def delete_club(self, owner_id): async with aiosqlite.connect(self.db_name) as db: await db.execute("DELETE FROM clubs WHERE owner_id = ?", (owner_id,)) + club_id = await self.get_club_id_by_owner(owner_id) + await db.execute("DELETE FROM members WHERE club_id = ?", (club_id,)) await db.commit() async def get_channel_name_by_owner(self, owner_id):

@@ -290,3 +287,11 @@ "SELECT channel_name FROM clubs WHERE owner_id = ?;", (owner_id,)

) as cursor: result = await cursor.fetchone() return result[0] + + async def get_header_role(self): + async with aiosqlite.connect(self.db_name) as db: + async with db.execute( + "SELECT discord_id FROM ids WHERE id_type LIKE 'club_role_header_role_id';" + ) as cursor: + result = await cursor.fetchone() + return result[0]