diff --git a/main.py b/main.py index 85378fc..03d348e 100644 --- a/main.py +++ b/main.py @@ -45,7 +45,7 @@ async def on_ready(): global no_select_inst no_select_inst = No_select() bot.add_view(no_select_inst) - bot.add_view(delete_message()) + bot.add_view(delete_and_view_votes_message()) print(f"{bot.user} is ready and online!") conn = connect_db() @@ -57,16 +57,31 @@ settings = bot.create_group("set", "Einstellungen") def get_count_recruits(): cur.execute("SELECT count(*) FROM recruits WHERE recruit=1") count = cur.fetchone()[0] - return count + return int(count) -def build_option_list(): +def build_option_list(part=1): cur.execute("SELECT discord_id, nickname, recruit FROM recruits WHERE recruit=1") options = [] records = cur.fetchall() - for row in records: - options.append(discord.SelectOption(value=str(row[0]), label=str(row[1]))) - return options + count = get_count_recruits() + if count < 25: + for row in records: + options.append(discord.SelectOption(value=str(row[0]), label=str(row[1]))) + return options + else: + i = 0 + for row in records: + if part == 1: + if i > (count / 2): + break + elif part == 2: + if i <= (count / 2): + i = i + 1 + continue + options.append(discord.SelectOption(value=str(row[0]), label=str(row[1]))) + i = i + 1 + return options def insert_yes_vote(recruit_id, voter_id): @@ -78,6 +93,39 @@ def insert_yes_vote(recruit_id, voter_id): cur.execute("SELECT nickname FROM recruits WHERE discord_id = ?", (recruit_id, )) return cur.fetchone()[0] +async def send_yes_confirm(select, interaction): + message = "Du hast für folgende Rekruten mit **Ja** abgestimmt:\n\n" + for recruit in select.values: + member = insert_yes_vote(recruit, interaction.user.id) + message = message + member + "\n" + embed = discord.Embed( + title="Aktion abgeschlossen", + description=message, + color=discord.Colour.green(), + ) + await interaction.response.send_message(embed=embed, ephemeral=True) + + +class yes_question_cause_overlap(discord.ui.View): + vote_ids = [] + @discord.ui.button(label="Nein-Stimmen löschen und mit Ja stimmen", style=discord.ButtonStyle.primary) + async def yes(self, button, interaction): + for vote_id in self.vote_ids: + cur.execute("DELETE FROM no_votes WHERE id = ?", (vote_id, )) + conn.commit() + await self.message.delete() + await send_yes_confirm(self.select, interaction) + @discord.ui.button(label="Abbrechen", style=discord.ButtonStyle.secondary) + async def no(self, button, interaction): + embed = discord.Embed( + title="Aktion abgebrochen", + description="HALT STOPP", + color=discord.Colour.green(), + ) + await self.message.delete() + await interaction.response.send_message(embed=embed, ephemeral=True) + + class Yes_select(discord.ui.View): def __init__(self): super().__init__(timeout=None) # timeout of the view must be set to None @@ -90,16 +138,25 @@ class Yes_select(discord.ui.View): ) async def select_callback(self, select, interaction): # the function called when the user is done selecting options - message = "Du hast für folgende Rekruten mit **Ja** abgestimmt:\n\n" - for recruit in select.values: - member = insert_yes_vote(recruit, interaction.user.id) - message = message + member + "\n" - embed = discord.Embed( - title="Aktion abgeschlossen", - description=message, + found = False + overlap_embed = discord.Embed( + title="Stimmen bereits vorhanden", + description="Für folgende Rekruten hast du bereits mit Nein gestimmt. Möchtest du diese Stimmen löschen und mit Ja stimmen?", color=discord.Colour.green(), ) - await interaction.response.send_message(embed = embed, ephemeral = True) + yes_question_cause_overlap_inst = yes_question_cause_overlap() + for yes_vote in select.values: + cur.execute("SELECT recruits.nickname, no_votes.reason, no_votes.id FROM recruits, no_votes WHERE no_votes.discord_id_recruit = recruits.discord_id AND no_votes.discord_id_voter = ? AND no_votes.discord_id_recruit = ?", (interaction.user.id, yes_vote)) + result = cur.fetchall() + if result: + found = True + overlap_embed.add_field(name=result[0][0], value=result[0][1]) + yes_question_cause_overlap_inst.vote_ids.append(result[0][2]) + if found: + yes_question_cause_overlap_inst.select = select + await interaction.response.send_message(embed=overlap_embed, view=yes_question_cause_overlap_inst, ephemeral=True) + else: + await send_yes_confirm(select, interaction) def create_yes_embed(): @@ -143,7 +200,7 @@ class No_reason(discord.ui.Modal): async def callback(self, interaction: discord.Interaction): insert_no_vote(self.recruit_id, interaction.user.id, self.children[0].value) - message = ("Du hast deine Nein-Stimme erfolgreich abgegeben.") + message = ("Du hast deine Nein-Stimme erfolgreich abgegeben.\n **Hinweis:** Die Rekrutierungsleiter werden sich demnächst bei dir melden.") embed = discord.Embed( title="Aktion abgeschlossen", description=message, @@ -151,7 +208,6 @@ class No_reason(discord.ui.Modal): ) embed.add_field(name="Rekrut:", value=self.recruit_name) embed.add_field(name="Dein Grund", value=self.children[0].value) - embed.add_field(name="Hinweis:", value="Die Rekrutierungsleiter werden dich demnächst kontaktieren.") await interaction.response.send_message(embeds=[embed], ephemeral=True) async def reason(discord_id, interaction): @@ -170,6 +226,7 @@ class no_question(discord.ui.View): async def yes(self, button, interaction): cur.execute("DELETE FROM no_votes WHERE id = ?", (self.vote_id, )) conn.commit() + await self.message.delete() await reason(self.discord_id, interaction) @discord.ui.button(label="Nein", style=discord.ButtonStyle.grey) async def no(self, button, interaction): @@ -178,6 +235,7 @@ class no_question(discord.ui.View): description="Es wurde nichts gespeichert.\nDeine Nein-Stimme mit dem angegebenen Grund bleibt bestehen.\nWenn du diese löschen möchtest, wähle die Option 'Stimme entfernen'", color=discord.Colour.blurple(), # Pycord provides a class with default colors you can choose from ) + await self.message.delete() await interaction.response.send_message(embed=embed, ephemeral=True) class no_clicked_but_yes_vote_question(discord.ui.View): @@ -187,9 +245,11 @@ class no_clicked_but_yes_vote_question(discord.ui.View): async def yes(self, button, interaction): cur.execute("DELETE FROM yes_votes WHERE id = ?", (self.vote_id, )) conn.commit() + await self.message.delete() await reason(self.discord_id, interaction) @discord.ui.button(label="Nein", style=discord.ButtonStyle.grey) async def no(self, button, interaction): + await self.message.delete() embed = discord.Embed( title="Aktion abgebrochen", description="Es wurde nichts gespeichert.\nDeine Ja-Stimme bleibt bestehen.\nWenn du diese löschen möchtest, wähle die Option 'Stimme entfernen'", @@ -266,7 +326,7 @@ async def edit_no_message(): print("Edited!") -class delete_message(discord.ui.View): +class delete_and_view_votes_message(discord.ui.View): def __init__(self): super().__init__(timeout=None) # timeout of the view must be set to None @discord.ui.button(label="Stimmen einsehen", custom_id="show-votes", style=discord.ButtonStyle.grey,) @@ -307,7 +367,7 @@ async def send_delete_message(channel): description="Um deine Stimmene einzusehen oder eine Stimme zu löschen, klicke auf den entsprechenden Button.", color=discord.Colour.dark_red(), ) - message = await channel.send(embed=embed, view=delete_message()) + message = await channel.send(embed=embed, view=delete_and_view_votes_message()) cur.execute("UPDATE settings SET VALUE = ? WHERE name = 'message_delete_vote'", (message.id, ))