diff --git a/extensions/click_game.py b/extensions/click_game.py index 9488c0cd9d24ec588a42a4a362fa6878ffc88623..8b2c62ea7c159bdf4640c59274a7a77d2fc08f51 100644 --- a/extensions/click_game.py +++ b/extensions/click_game.py @@ -1,3 +1,4 @@ +import json import os import random from typing import Dict @@ -9,15 +10,27 @@ from discord.app_commands import Choice from discord.ext import commands, tasks - @app_commands.guild_only() class ClickGame(commands.Cog): def __init__(self, bot): self.bot = bot self.config: Dict = bot.config["extensions"][__name__.split(".")[-1]] self.bot.view_manager.register("on_click", self.on_click) + self.players = {} self.msg_count: int = 0 self.last_sent: datetime = datetime(1970, 1, 1) + self.load() + + def load(self): + try: + with open("data/players.json", "r") as players_file: + self.players = json.load(players_file) + except FileNotFoundError: + pass + + def save(self): + with open("data/players.json", "w") as players_file: + json.dump(self.players, players_file) @commands.Cog.listener() async def on_message(self, message: Message): @@ -80,6 +93,14 @@ class ClickGame(commands.Cog): await interaction.followup.send(content=leaderboard, ephemeral=True) async def on_click(self, button: discord.ui.Button, interaction: Interaction, value=None): + player = self.get_player(interaction.user.id) + + if player.get(str(interaction.message.id)): + await interaction.response.send_message("Du hast bereits mit diesem Monster interagiert. Versuche es beim nächsten noch mal.", ephemeral=True) + return + + player[str(interaction.message.id)] = value + if value > 0: await interaction.response.send_message( f"Super! Du hast das Monster geschwächt und erhältst zur Belohnung {value} Punkte.", ephemeral=True) @@ -93,19 +114,30 @@ class ClickGame(commands.Cog): interaction.response.send_message("Du warst zu spät. Glücklicherweise wurde das Monster bereits besiegt.", ephemeral=True) + self.save() + if button.value == 0 and interaction.message: await interaction.message.delete() def get_view(self, plus_emoji, minus_emoji): buttons = [ - {"style": ButtonStyle.gray, "value": 5, "custom_id": "click_game:plus", "emoji": plus_emoji}, - {"style": ButtonStyle.gray, "value": -5, "custom_id": "click_game:minus", "emoji": minus_emoji} + {"style": ButtonStyle.gray, "value": self.config["max_points"], "custom_id": "click_game:plus", + "emoji": plus_emoji}, + {"style": ButtonStyle.gray, "value": -1 * self.config["max_points"], "custom_id": "click_game:minus", + "emoji": minus_emoji} ] random.shuffle(buttons) return self.bot.view_manager.view(buttons, "on_click") + def get_player(self, user_id: int): + if player := self.players.get(str(user_id)): + return player + + player = {} + self.players[str(user_id)] = player + return player async def get_leaderboard(self, guild: Guild, max_entries: int = 10): message = f"**__Elm-Street Leaderboard__**\n\n" \ f"Wie süß bist du wirklich??\n" \ @@ -115,21 +147,20 @@ class ClickGame(commands.Cog): f"==================================================\n" place = 0 - + scores = self.get_scores() ready = False last_score = -1 - for player_id, player_data in sorted(self.players.items(), key=lambda item: item[1]["sweets"], reverse=True): - value = player_data["sweets"] + for player_id, score in sorted(scores.items(), key=lambda item: item[1], reverse=True): member = await guild.fetch_member(int(player_id)) try: - if last_score != value: + if last_score != score: place += 1 - last_score = value + last_score = score if 0 < max_entries < place: if ready: break - message += f"{str(place).rjust(4)}. | {str(value).rjust(5)} | " - message += f"{member.display_name}#{member.discriminator}\n" + message += f"{str(place).rjust(4)}. | {str(score).rjust(5)} | " + message += f"{member.name}" + (f"#{member.discriminator}\n" if member.discriminator > 0 else "") except: pass @@ -137,24 +168,15 @@ class ClickGame(commands.Cog): return message - @tasks.loop(minutes=5) - async def increase_courage(self): - pass - - @increase_courage.before_loop - async def before_increase(self): - pass - # 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() + def get_scores(self): + scores = {} + for player_id, messages in self.players.items(): + score = 0 + for value in messages.values(): + score += value + scores[player_id] = score + return scores async def setup(bot: commands.Bot) -> None: await bot.add_cog(ClickGame(bot)) diff --git a/images/img01.png b/images/img01.png index 7945985f0d2dddd26ee1346ee0a79fc058c65190..386a22430ca783c91b7a4c93f84a8770d47b2bf9 100644 Binary files a/images/img01.png and b/images/img01.png differ diff --git a/images/img02.png b/images/img02.png index 36fd22528423cf5849df588ad0c022c704b5de27..ae6eaa1bf5a7b1d525824126e830e36d63c2909e 100644 Binary files a/images/img02.png and b/images/img02.png differ diff --git a/images/img03.png b/images/img03.png index c8b9a51bc978f151dc8ff86227be0713cb64a28c..d86a6111c9ac2b83c39999e6202e88907492f7e6 100644 Binary files a/images/img03.png and b/images/img03.png differ diff --git a/utils.py b/utils.py index fe81c1adb8fc5b1fa69b387753fe628210c8bb67..6c279c396195b324eee7628cabfb67808d417018 100644 --- a/utils.py +++ b/utils.py @@ -6,7 +6,7 @@ from discord.ext.commands import Context from discord import ButtonStyle, Embed, User, Member from dotenv import load_dotenv -from views.dialog_view import DialogView +from deprecated.views.dialog_view import DialogView load_dotenv() DATE_TIME_FMT = os.getenv("DISCORD_DATE_TIME_FORMAT") diff --git a/view_manager.py b/view_manager.py index 2249ac9bd9df951870ec1340cf5240c550df0909..5a74ad5812f7e165bfa952363d87ae128c99577c 100644 --- a/view_manager.py +++ b/view_manager.py @@ -3,7 +3,7 @@ import uuid import discord -from views.dialog_view import DialogView +from deprecated.views.dialog_view import DialogView class ViewManager: