import discord from discord.ext import commands from configparser import ConfigParser # Bot token (replace with your own) TOKEN = 'MTE1NDc0ODQ3MzE4MzMwNTc4OQ.Gz_Q7u.02sb2YNV_QQy7Bs19roXlB62mjoMKA6y8aubHU' async def reply_error(ctx: commands.Context, message: str): await reply(ctx, f'**Error:** {message}', True) async def reply(ctx: commands.Context, message: str): await ctx.send(message) def get_server_IDs(): config = ConfigParser() config.read("config.ini") server_IDs = [] for section in config.sections(): server_IDs.append(int(config[section]['server_ID'])) return server_IDs # Create an instance of the bot intents = discord.Intents.default() intents.members = True bot = commands.Bot(command_prefix='!', intents=intents) # Study group roles and their corresponding IDs (you can customize this) def get_study_groups(server_id): config = ConfigParser() config.read("config.ini") study_groups = {} for section in config.sections(): if int(config[section]['server_ID']) == server_id: # Study group names are in style "kruh-XX", where XX is a two-digit number # Iterate over all from top to bottom for (key, value) in config.items(section): if key.startswith('kruh-'): study_groups[key] = int(value) return study_groups @bot.event async def on_ready(): print(f'Logged in as {bot.user.name}') @bot.command() async def grant_role(ctx, study_group_name: str): server_IDs = get_server_IDs() author_id = ctx.author.id for guild_id in server_IDs: guild = bot.get_guild(guild_id) if guild is None: continue author = guild.get_member(author_id) if author is None: continue study_groups = get_study_groups(guild_id) if study_group_name in study_groups: role_name = study_groups[study_group_name] role = discord.utils.get(guild.roles, id=role_name) if role is not None: await author.add_roles(role) await reply(ctx, f'{author.mention} has been granted the {study_group_name} role on the [{guild.name}] server.') return await reply_error(ctx, 'Something went wrong. Please check your command and try again.') return @bot.event async def on_message(message): # Check if the message is a private message and not from the bot itself if isinstance(message.channel, discord.DMChannel) and message.author != bot.user: # Split the message content into words words = message.content.split() # Check if the message starts with the bot's command prefix and has enough arguments if len(words) >= 3 and words[0] == '!grant_role': # Process the command await bot.process_commands(message) # Run the bot bot.run(TOKEN)