| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- import discord
- from discord.ext import commands
- from discord.commands import Option
- from discord.commands import slash_command
- import configparser
- import os
- from dotenv import load_dotenv
- class Matesearch(commands.Cog):
- def __init__(self, bot: discord.Bot):
- self.bot = bot
-
- #Modal form
- class Form(discord.ui.Modal):
- def __init__(self, bot: discord.Bot, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.bot = bot
- #Modal form layout
- """self.add_item(Select(placeholder="Select a day.",
- options=[
- discord.SelectOption(label="Montag", value="Montag"),
- discord.SelectOption(label="Dienstag", value="Dienstag"),
- discord.SelectOption(label="Mittwoch", value="Mittwoch"),
- discord.SelectOption(label="Donnerstag", value="Donnerstag"),
- discord.SelectOption(label="Freitag", value="Freitag"),
- discord.SelectOption(label="Samstag", value="Samstag"),
- discord.SelectOption(label="Sonntag", value="Sontag"),
- ],
- min_values=1,
- max_values=1))"""
- self.add_item(discord.ui.InputText(label="Tag", placeholder="Montag, Dienstag, Mittwoch, Donnerstag, Freitag", required=False, ))
- self.add_item(discord.ui.InputText(label="Zeit", placeholder="19 Uhr"))
-
- #funktions to load the config and get the channels
- def _load_config(self):
- config = configparser.ConfigParser()
- configFilePath = r'config.cfg'
- config.read(configFilePath)
- return config
- def _get_guild(self):
- load_dotenv()
- debug_guilds_up = []
- server_token = os.getenv("SERVER").split(",")
- for i in range(len(server_token)):
- debug_guilds_up.append(int(server_token[i]))
- def _get_channel(self):
- config = self._load_config()
- search_channel_id = int(config["Matesearch"]["search_channel_id"])
- search_channel = self.bot.get_channel(search_channel_id)
- if search_channel is None:
- print(f"Channel with ID {search_channel_id} not found.")
- return None
- return search_channel
- def _get_role(self, interaction: discord.Interaction):
- config = self._load_config()
- search_role_id = int(config["Matesearch"]["search_role_id"])
- search_role = interaction.guild.get_role(search_role_id) if interaction.guild else None
- if search_role is None:
- print(f"Role with ID {search_role_id} not found.")
- return None
- return search_role_id
- #Output of the Modal form
- async def callback(self, interaction: discord.Interaction):
- role = self._get_role(interaction)
- embed = discord.Embed(title="Mitspieler gesucht!")
- embed.add_field(name="", value="Es werden Mitspieler für eine gemeinsame Schicht gesucht! Wenn du mitmachen willst, reagiere mit ✅ auf diese Nachricht. Bei offenen Fragen kannst du per Rechtsklick auf diese Nachricht einen Thread eröffnen. Alle Nachrichten und Threads zur Spielersuche sind Out of Character (OOC).", inline=False)
- embed.add_field(name="Ersteller", value=interaction.user.mention, inline=False)
- embed.add_field(name="Tag", value=self.children[0].value, inline=False)
- embed.add_field(name="Zeit", value=self.children[1].value, inline=False)
- self.embed = embed
- #sending the embed
- search_channel = self._get_channel()
- msg = await search_channel.send(embeds=[embed])
- await search_channel.send(f"<@&{role}>")
- await interaction.response.send_message("Your search for players has been submitted.", ephemeral=True)
- try:
- await msg.add_reaction("✅")
- await msg.add_reaction("❌")
- except Exception as e:
- await interaction.respond(f"Failed to add reaction: {e}", ephemeral=True)
-
- #Slash command to trigger the Modal form
- @slash_command()
- @commands.cooldown(1, 3600, commands.BucketType.default) # 1-mal alle 3600 Sek. GLOBAL für den gesamten Bot
- async def spielersuche(self, ctx: discord.ApplicationContext):
- """Start a search for players."""
- config = self.Form._load_config(self)
- enable_search = config.getboolean("Matesearch","enable_search_mates")
- if not enable_search:
- return
- modal = self.Form(self.bot, title="Fill the form to search for players.") # type: ignore
- await ctx.send_modal(modal)
- @spielersuche.error
- async def spielersuche_error(self, ctx: discord.ApplicationContext, error: discord.DiscordException):
- if isinstance(error, commands.CommandOnCooldown):
- minuten, sekunden = divmod(int(error.retry_after), 60)
- await ctx.respond(
- f"Dieser Befehl ist global gesperrt. Bitte warte noch {minuten} Minuten und {sekunden} Sekunden, bis er wieder verfügbar ist.",
- ephemeral=True
- )
- else:
- raise error
-
- def setup(bot: discord.Bot):
- bot.add_cog(Matesearch(bot))
|