diff --git a/extensions/elm_street.py b/extensions/elm_street.py index cb17ad017997f952a171717f05501764f4a82ed4..9da2a776fe4aea0de8c93932bdc4ad61a1907658 100644 --- a/extensions/elm_street.py +++ b/extensions/elm_street.py @@ -546,8 +546,8 @@ class ElmStreet(commands.GroupCog, name="elm"): if 0 < max_entries < place: if ready: break - message += escape_markdown(f"{str(place).rjust(4)}. | {str(value).rjust(5)} | " - f"{member.display_name}#{member.discriminator}\n") + message += f"{str(place).rjust(4)}. | {str(value).rjust(5)} | " + message += escape_markdown(f"{member.display_name}#{member.discriminator}\n") except: pass @@ -555,147 +555,159 @@ class ElmStreet(commands.GroupCog, name="elm"): return message - async def get_group_stats_embed(self, thread_id): - thread = await self.bot.fetch_channel(thread_id) - players = self.groups.get(str(thread_id)).get('players') - stats = self.groups.get(str(thread_id)).get('stats') - players_value = ', '.join([f'<@{int(player)}>' for player in players]) - doors_value = stats.get('doors') - sweets_value = stats.get('sweets') - courage_value = stats.get('courage') +async def get_group_stats_embed(self, thread_id): + thread = await self.bot.fetch_channel(thread_id) + players = self.groups.get(str(thread_id)).get('players') + stats = self.groups.get(str(thread_id)).get('stats') - embed = discord.Embed(title=f'Erfolge der Gruppe "{thread.name}"') - embed.add_field(name='Mitspieler', value=players_value, inline=False) - embed.add_field(name="Besuchte Türen", value=doors_value) - embed.add_field(name="Gesammelte Süßigkeiten", value=sweets_value) - embed.add_field(name="Verlorene Mutpunkte", value=courage_value) + players_value = ', '.join([f'<@{int(player)}>' for player in players]) + doors_value = stats.get('doors') + sweets_value = stats.get('sweets') + courage_value = stats.get('courage') - return embed + embed = discord.Embed(title=f'Erfolge der Gruppe "{thread.name}"') + embed.add_field(name='Mitspieler', value=players_value, inline=False) + embed.add_field(name="Besuchte Türen", value=doors_value) + embed.add_field(name="Gesammelte Süßigkeiten", value=sweets_value) + embed.add_field(name="Verlorene Mutpunkte", value=courage_value) - def get_personal_stats_embed(self, player_id): - player = self.players.get(str(player_id)) - embed = discord.Embed(title="Deine persönlichen Erfolge") - embed.add_field(name="Süßigkeiten", value=player['sweets']) - embed.add_field(name="Mutpunkte", value=player['courage']) - return embed + return embed - def get_invite_message(self, author): - return SystemRandom().choice(self.story["invitations"]).format(author_mention=author.mention) - def get_group_by_voice_id(self, voice_id): - for group in self.groups.values(): - if vc := group.get("voice_channel"): - if vc == voice_id: - return group +def get_personal_stats_embed(self, player_id): + player = self.players.get(str(player_id)) + embed = discord.Embed(title="Deine persönlichen Erfolge") + embed.add_field(name="Süßigkeiten", value=player['sweets']) + embed.add_field(name="Mutpunkte", value=player['courage']) + return embed - return None - def apply_sweets_and_courage(self, text, sweets, courage, thread_id): - group = self.groups.get(str(thread_id)) - player_ids = group.get("players") - group_stats = group.get('stats') - - if sweets: - if sweets > 0: - text += f"\n\nIhr erhaltet jeweils {sweets} Süßigkeiten." - if sweets == 0: - text += f"\n\nIhr habt genau so viele Süßigkeiten wie vorher." - if sweets < 0: - text += f"\n\nIhr verliert jeweils {-sweets} Süßigkeiten." - group_stats['sweets'] += sweets - if courage: - if courage > 0: - text += f"\n\nIhr verliert jeweils {courage} Mutpunkte." - for player_id in player_ids: - player = self.players.get(str(player_id)) - player["courage"] -= courage - group_stats['courage'] += courage +def get_invite_message(self, author): + return SystemRandom().choice(self.story["invitations"]).format(author_mention=author.mention) - self.save() - # TODO Was passiert wenn die courage eines Players zu weit sinkt? - return text - def share_sweets(self, sweets, thread_id): - group = self.groups.get(str(thread_id)) - player_ids = group.get("players") +def get_group_by_voice_id(self, voice_id): + for group in self.groups.values(): + if vc := group.get("voice_channel"): + if vc == voice_id: + return group + + return None + + +def apply_sweets_and_courage(self, text, sweets, courage, thread_id): + group = self.groups.get(str(thread_id)) + player_ids = group.get("players") + group_stats = group.get('stats') + + if sweets: + if sweets > 0: + text += f"\n\nIhr erhaltet jeweils {sweets} Süßigkeiten." + if sweets == 0: + text += f"\n\nIhr habt genau so viele Süßigkeiten wie vorher." + if sweets < 0: + text += f"\n\nIhr verliert jeweils {-sweets} Süßigkeiten." + group_stats['sweets'] += sweets + if courage: + if courage > 0: + text += f"\n\nIhr verliert jeweils {courage} Mutpunkte." for player_id in player_ids: player = self.players.get(str(player_id)) - player["sweets"] += sweets - - def leave_group(self, thread_id, player_id): - group = self.groups.get(str(thread_id)) - group_players = group.get('players') - player = self.players.get(str(player_id)) + player["courage"] -= courage + group_stats['courage'] += courage - # Spieler auszahlen - group_stats = group.get('stats') - player["sweets"] += group_stats['sweets'] + self.save() + # TODO Was passiert wenn die courage eines Players zu weit sinkt? + return text - # Spieler aus Gruppe löschen - group_players.remove(player_id) - self.save() - async def deny_join_request(self, group, message, player_id): - user = self.bot.get_user(player_id) - outfit = ["Piraten", "Einhörner", "Geister", "Katzen", "Weihnachtswichtel"] - dresscode = ["Werwölfe", "Vampire", "Alice im Wunderland", "Hexen", "Zombies"] - texts = [ - "Wir wollen um die Häuser ziehen und Kinder erschrecken. Du schaust aus, als würdest du den " - "Kindern lieber unsere Süßigkeiten geben. Versuch es woanders.", - f"Ich glaub du hast dich verlaufen, in dieser Gruppe können wir keine " - f"{SystemRandom().choice(outfit)} gebrauchen. Unser Dresscode ist: {SystemRandom().choice(dresscode)}."] - await send_dm(user, SystemRandom().choice(texts)) - group["requests"].remove({'player': player_id, 'id': message.id}) - self.save() - # Request Nachricht aus diesem Thread und aus players löschen - self.delete_message_from_player(player_id, message.id) - await message.delete() - - async def deny_open_join_requests(self, thread_id, group): - thread = await self.bot.fetch_channel(thread_id) - - if requests := group.get("requests"): - for request in requests: - message = await thread.fetch_message(request["id"]) - await self.deny_join_request(group, message, request["player"]) - - @tasks.loop(minutes=5) - async def increase_courage(self): - # Alle Spieler, die gerade in einer Runde sind auslesen - actual_playing = [player for player in [group["players"] for group in self.groups.values()]] - - # pro Spieler: courage erhöhen - for player_id, player in self.players.items(): - # nur wenn Spieler nicht gerade spielt - if int(player_id) not in actual_playing: - courage = player.get('courage') - if courage < MAX_COURAGE: - player['courage'] = min(courage + INC_COURAGE_STEP, MAX_COURAGE) - self.save() +def share_sweets(self, sweets, thread_id): + group = self.groups.get(str(thread_id)) + player_ids = group.get("players") + for player_id in player_ids: + player = self.players.get(str(player_id)) + player["sweets"] += sweets + + +def leave_group(self, thread_id, player_id): + group = self.groups.get(str(thread_id)) + group_players = group.get('players') + player = self.players.get(str(player_id)) + + # Spieler auszahlen + group_stats = group.get('stats') + player["sweets"] += group_stats['sweets'] + + # Spieler aus Gruppe löschen + group_players.remove(player_id) + self.save() + + +async def deny_join_request(self, group, message, player_id): + user = self.bot.get_user(player_id) + outfit = ["Piraten", "Einhörner", "Geister", "Katzen", "Weihnachtswichtel"] + dresscode = ["Werwölfe", "Vampire", "Alice im Wunderland", "Hexen", "Zombies"] + texts = [ + "Wir wollen um die Häuser ziehen und Kinder erschrecken. Du schaust aus, als würdest du den " + "Kindern lieber unsere Süßigkeiten geben. Versuch es woanders.", + f"Ich glaub du hast dich verlaufen, in dieser Gruppe können wir keine " + f"{SystemRandom().choice(outfit)} gebrauchen. Unser Dresscode ist: {SystemRandom().choice(dresscode)}."] + await send_dm(user, SystemRandom().choice(texts)) + group["requests"].remove({'player': player_id, 'id': message.id}) + self.save() + # Request Nachricht aus diesem Thread und aus players löschen + self.delete_message_from_player(player_id, message.id) + await message.delete() + + +async def deny_open_join_requests(self, thread_id, group): + thread = await self.bot.fetch_channel(thread_id) + + if requests := group.get("requests"): + for request in requests: + message = await thread.fetch_message(request["id"]) + await self.deny_join_request(group, message, request["player"]) + + +@tasks.loop(minutes=5) +async def increase_courage(self): + # Alle Spieler, die gerade in einer Runde sind auslesen + actual_playing = [player for player in [group["players"] for group in self.groups.values()]] + + # pro Spieler: courage erhöhen + for player_id, player in self.players.items(): + # nur wenn Spieler nicht gerade spielt + if int(player_id) not in actual_playing: + courage = player.get('courage') + if courage < MAX_COURAGE: + player['courage'] = min(courage + INC_COURAGE_STEP, MAX_COURAGE) + self.save() - # pro Nachricht: Nachricht erneuern - if messages := player.get('messages'): - for message in messages: - channel = await self.bot.fetch_channel(message['channel']) - msg = await channel.fetch_message(message['id']) - embed = msg.embeds[0] - embed.clear_fields() - embed.add_field(name='aktuelle Mutpunkte', value=f"{player.get('courage')}") - await msg.edit(embed=embed) - - @increase_courage.before_loop - async def before_increase(self): - await sleep(10) - - @commands.Cog.listener(name="on_voice_state_update") - async def voice_state_changed(self, member, before, after): - if not after.channel: - voice_channel_left = before.channel - if len(voice_channel_left.members) == 0 and \ - voice_channel_left.category_id == self.halloween_category_id and \ - not self.get_group_by_voice_id(voice_channel_left.id): - await voice_channel_left.delete() + # pro Nachricht: Nachricht erneuern + if messages := player.get('messages'): + for message in messages: + channel = await self.bot.fetch_channel(message['channel']) + msg = await channel.fetch_message(message['id']) + embed = msg.embeds[0] + embed.clear_fields() + embed.add_field(name='aktuelle Mutpunkte', value=f"{player.get('courage')}") + await msg.edit(embed=embed) + + +@increase_courage.before_loop +async def before_increase(self): + await sleep(10) + + +@commands.Cog.listener(name="on_voice_state_update") +async def voice_state_changed(self, member, before, after): + if not after.channel: + voice_channel_left = before.channel + if len(voice_channel_left.members) == 0 and \ + voice_channel_left.category_id == self.halloween_category_id and \ + not self.get_group_by_voice_id(voice_channel_left.id): + await voice_channel_left.delete() async def setup(bot: commands.Bot) -> None: