From c2dc6f7e682c692f1923ae2273678930ece0b954 Mon Sep 17 00:00:00 2001 From: Matthew Albert <61246987+Mralbert93@users.noreply.github.com> Date: Sun, 29 Oct 2023 14:17:11 -0400 Subject: [PATCH 1/8] Update server.py --- server.py | 225 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 212 insertions(+), 13 deletions(-) diff --git a/server.py b/server.py index 430d1dc7..ca9b523f 100644 --- a/server.py +++ b/server.py @@ -1,19 +1,218 @@ +import asyncio +from datetime import datetime +from dotenv import load_dotenv +from interactions import Client, Intents, listen, slash_command, SlashContext, OptionType, slash_option, ActionRow, Button, ButtonStyle, StringSelectMenu +from interactions.api.events import Component import os -import http.server -import socketserver +import uuid -from http import HTTPStatus +load_dotenv() +token= os.environ.get("DISCORD_TOKEN") +bot = Client(intents=Intents.DEFAULT) -class Handler(http.server.SimpleHTTPRequestHandler): - def do_GET(self): - self.send_response(HTTPStatus.OK) - self.end_headers() - msg = 'Hello! you requested %s' % (self.path) - self.wfile.write(msg.encode()) +class Party: + def __init__(self, Type, Quantity, Host, Multi=None, **kwargs): + self.ID = str(uuid.uuid4()) + self.Type = Type + self.Quantity = Quantity + self.Host = Host + self.Multi = Multi if Multi is not None else True + self.Roles = { + "Starter": ["Open"], + "Batter": ["Open"]*3, + "Froster": ["Open"], + "Leafer": ["Open"]*4, + "Fruit Froster": ["Open"]*3, + "Oven/Spreader": ["Open"]*3, + } + self.Roles.update(kwargs) + self.MessageID = None + def has_user_signed_up(self, user_id): + for role in self.Roles.values(): + if user_id in role: + return True + return False -port = int(os.getenv('PORT', 80)) -print('Listening on port %s' % (port)) -httpd = socketserver.TCPServer(('', port), Handler) -httpd.serve_forever() + def set_user_id_for_role(self, role, user_id): + if role in self.Roles: + role_list = self.Roles[role] + if "Open" in self.Roles[role]: + open_index = role_list.index("Open") + role_list[open_index] = user_id + + def remove_user_from_role(self, user_id): + for role, role_list in self.Roles.items(): + if user_id in role_list: + user_index = role_list.index(user_id) + role_list[user_index] = "Open" + return role + + def generate_description(self): + description = f"Hosted by {self.Host}\n\n" + + required_ingredients = { + "Starter": ":blueberries: Blueberries", + "Batter": ":butter: Butter, :egg: Eggs, 🌾 Flour", + "Froster": ":milk: Milk, :butter: Butter", + "Leafer": ":leaves: Sweet Leaves", + "Fruit Froster": ":apple: Fruit, :ice_cube: Sugar" + } + + for role, members in self.Roles.items(): + description += f"**{role}:** {required_ingredients.get(role, 'No ingredients required')}\n" + + if members: + for member in members: + description += f"- {member}\n" + + return description + +async def edit_message(ctx, message_id: int): + message = await ctx.channel.fetch_message(message_id) + description = party.generate_description() + embed = { + "title": f"{party.Quantity}x {party.Type} Party", + "description": description, + "thumbnail": { + "url": "https://emojiisland.com/cdn/shop/products/4_large.png", + "height": 0, + "width": 0 + }, + "footer": { + "text": "Last updated" + }, + "timestamp": f"{datetime.utcnow()}" + } + components: list[ActionRow] = [ + ActionRow( + Button( + style=ButtonStyle.GREEN, + label="Sign Up", + custom_id="signup", + ), + Button( + style=ButtonStyle.RED, + label="Unsign Up", + custom_id="unsignup", + ) + ) + ] + await message.edit(embed=embed,components=components) + +@slash_command( + name="party", + description="Used to manage Palia parties", + sub_cmd_name="create", + sub_cmd_description="Create a Palia Party", +) +@slash_option( + name="type", + description="Type of party", + required=True, + opt_type=OptionType.STRING +) +@slash_option( + name="quantity", + description="Quantity to be made", + required=True, + opt_type=OptionType.STRING +) +@slash_option( + name="host", + description="In game name of host", + required=True, + opt_type=OptionType.STRING +) +@slash_option( + name="multi", + description="Whether player can have multiple roles (true/false)", + required=False, + opt_type=OptionType.BOOLEAN +) +async def create(ctx: SlashContext, type: str, quantity: str, host: str, multi: bool = True): + global party + party = Party(Type=type, Quantity=quantity, Host=host, Multi=multi) + description = party.generate_description() + embed = { + "title": f"{party.Quantity}x {party.Type} Party", + "description": description, + "thumbnail": { + "url": "https://emojiisland.com/cdn/shop/products/4_large.png", + "height": 0, + "width": 0 + }, + "footer": { + "text": "Last updated" + }, + "timestamp": f"{datetime.utcnow()}" + } + + components: list[ActionRow] = [ + ActionRow( + Button( + style=ButtonStyle.GREEN, + label="Sign Up", + custom_id="signup", + ), + Button( + style=ButtonStyle.RED, + label="Unsign Up", + custom_id="unsignup", + ) + ) + ] + + posting = await ctx.send(embed=embed,components=components) + party.MessageID = posting.id + +@listen(Component) +async def on_component(event: Component): + ctx = event.ctx + global signup_message + match ctx.custom_id: + case "signup": + if party.has_user_signed_up(f"<@{ctx.author.id}>") and party.Multi == False: + await ctx.author.send("You have already signed up for a role. Please remove your current role to switch roles.") + else: + components = StringSelectMenu( + "Starter", "Batter", "Froster", "Leafer", "Fruit Froster", "Oven/Spreader", + placeholder="Choose your role", + custom_id="role" + ) + signup_message = await ctx.send(components=components) + await asyncio.sleep(30) + try: + await signup_message.delete() + except Exception as e: + pass + + case "unsignup": + while party.has_user_signed_up(f"<@{ctx.author.id}>"): + party.remove_user_from_role(f"<@{ctx.author.id}>") + await edit_message(ctx, party.MessageID) + + case "role": + selected_role = ctx.values[0] + party.set_user_id_for_role(selected_role, f"<@{ctx.author.id}>") + await edit_message(ctx, party.MessageID) + await signup_message.delete() + + +@slash_command( + name="party", + description="Used to manage Palia parties", + sub_cmd_name="delete", + sub_cmd_description="Delete a Palia Party" +) +@slash_option( + name="id", + description="Party ID", + required=True, + opt_type=OptionType.STRING +) +async def delete(ctx: SlashContext, id: str): + await ctx.send(f"Party {id} deleted!") + +bot.start(token) From bfd33ceb16153e66bdd23475090f775c32ab2a90 Mon Sep 17 00:00:00 2001 From: Matthew Albert <61246987+Mralbert93@users.noreply.github.com> Date: Sun, 29 Oct 2023 14:24:03 -0400 Subject: [PATCH 2/8] Update server.py --- server.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/server.py b/server.py index ca9b523f..e1d3031c 100644 --- a/server.py +++ b/server.py @@ -1,12 +1,10 @@ import asyncio from datetime import datetime -from dotenv import load_dotenv from interactions import Client, Intents, listen, slash_command, SlashContext, OptionType, slash_option, ActionRow, Button, ButtonStyle, StringSelectMenu from interactions.api.events import Component import os import uuid -load_dotenv() token= os.environ.get("DISCORD_TOKEN") bot = Client(intents=Intents.DEFAULT) From 00750bc8c5ee7f552b7174a728844622834eecbe Mon Sep 17 00:00:00 2001 From: Matthew Albert <61246987+Mralbert93@users.noreply.github.com> Date: Sun, 29 Oct 2023 14:31:16 -0400 Subject: [PATCH 3/8] Update requirements.txt --- requirements.txt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/requirements.txt b/requirements.txt index e69de29b..0dcedc31 100644 --- a/requirements.txt +++ b/requirements.txt @@ -0,0 +1,18 @@ +aiohttp==3.8.6 +aiosignal==1.3.1 +async-timeout==4.0.3 +attrs==23.1.0 +charset-normalizer==3.3.1 +discord.py==2.3.2 +discord-py-interactions==5.10.0 +discord-typings==0.7.0 +emoji==2.8.0 +frozenlist==1.4.0 +idna==3.4 +multidict==6.0.4 +pip==23.3.1 +python-dotenv==1.0.0 +tomli==2.0.1 +typing_extensions==4.8.0 +wheel==0.41.2 +yarl==1.9.2 From dd94123c42fa8534af63096b7fedcd0a4d2abfe4 Mon Sep 17 00:00:00 2001 From: Matthew Albert <61246987+Mralbert93@users.noreply.github.com> Date: Sun, 29 Oct 2023 14:40:47 -0400 Subject: [PATCH 4/8] Update app.yaml --- .do/app.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.do/app.yaml b/.do/app.yaml index 2405d557..ccb712d0 100644 --- a/.do/app.yaml +++ b/.do/app.yaml @@ -4,5 +4,5 @@ services: github: branch: main deploy_on_push: true - repo: digitalocean/sample-python + repo: Mralbert93/chapaa-bot name: sample-python From 101562d1ba1d5974f2c74095790de12ef11a9e61 Mon Sep 17 00:00:00 2001 From: Matthew Albert <61246987+Mralbert93@users.noreply.github.com> Date: Sun, 29 Oct 2023 16:11:58 -0400 Subject: [PATCH 5/8] Update server.py --- server.py | 42 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/server.py b/server.py index e1d3031c..eb53c046 100644 --- a/server.py +++ b/server.py @@ -168,7 +168,14 @@ async def create(ctx: SlashContext, type: str, quantity: str, host: str, multi: @listen(Component) async def on_component(event: Component): ctx = event.ctx - global signup_message + signup_message = None + + async def set_deleted(): + nonlocal signup_message + if signup_message: + await signup_message.delete() + signup_message = None + match ctx.custom_id: case "signup": if party.has_user_signed_up(f"<@{ctx.author.id}>") and party.Multi == False: @@ -179,38 +186,25 @@ async def on_component(event: Component): placeholder="Choose your role", custom_id="role" ) - signup_message = await ctx.send(components=components) + signup_message = await ctx.send(f"<@{ctx.author.id}>",components=components) await asyncio.sleep(30) - try: - await signup_message.delete() - except Exception as e: - pass + await set_deleted() case "unsignup": while party.has_user_signed_up(f"<@{ctx.author.id}>"): party.remove_user_from_role(f"<@{ctx.author.id}>") - await edit_message(ctx, party.MessageID) + await edit_message(ctx, party.MessageID) + confirmation = await ctx.send(f"<@{ctx.author.id}>, you have been removed from the party.") + await asyncio.sleep(5) + await confirmation.delete() case "role": selected_role = ctx.values[0] party.set_user_id_for_role(selected_role, f"<@{ctx.author.id}>") await edit_message(ctx, party.MessageID) - await signup_message.delete() - - -@slash_command( - name="party", - description="Used to manage Palia parties", - sub_cmd_name="delete", - sub_cmd_description="Delete a Palia Party" -) -@slash_option( - name="id", - description="Party ID", - required=True, - opt_type=OptionType.STRING -) -async def delete(ctx: SlashContext, id: str): - await ctx.send(f"Party {id} deleted!") + await set_deleted() + confirmation = await ctx.send(f"<@{ctx.author.id}>, you have been added to {selected_role}") + await asyncio.sleep(5) + await confirmation.delete() bot.start(token) From c9e5cdab4bdd93fe15d514bb1a42e9c49f3270f3 Mon Sep 17 00:00:00 2001 From: Matthew Albert <61246987+Mralbert93@users.noreply.github.com> Date: Sun, 29 Oct 2023 16:32:04 -0400 Subject: [PATCH 6/8] Update server.py --- server.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server.py b/server.py index eb53c046..de399358 100644 --- a/server.py +++ b/server.py @@ -193,10 +193,10 @@ async def set_deleted(): case "unsignup": while party.has_user_signed_up(f"<@{ctx.author.id}>"): party.remove_user_from_role(f"<@{ctx.author.id}>") - await edit_message(ctx, party.MessageID) - confirmation = await ctx.send(f"<@{ctx.author.id}>, you have been removed from the party.") - await asyncio.sleep(5) - await confirmation.delete() + await edit_message(ctx, party.MessageID) + confirmation = await ctx.send(f"<@{ctx.author.id}>, you have been removed from the party.") + await asyncio.sleep(5) + await confirmation.delete() case "role": selected_role = ctx.values[0] From 984495eddc55729c7cc711abdc5201e694d653d7 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 29 Oct 2023 22:04:02 +0000 Subject: [PATCH 7/8] Working version --- server.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) mode change 100644 => 100755 server.py diff --git a/server.py b/server.py old mode 100644 new mode 100755 index de399358..94943670 --- a/server.py +++ b/server.py @@ -187,7 +187,7 @@ async def set_deleted(): custom_id="role" ) signup_message = await ctx.send(f"<@{ctx.author.id}>",components=components) - await asyncio.sleep(30) + await asyncio.sleep(15) await set_deleted() case "unsignup": @@ -195,7 +195,7 @@ async def set_deleted(): party.remove_user_from_role(f"<@{ctx.author.id}>") await edit_message(ctx, party.MessageID) confirmation = await ctx.send(f"<@{ctx.author.id}>, you have been removed from the party.") - await asyncio.sleep(5) + await asyncio.sleep(3) await confirmation.delete() case "role": @@ -204,7 +204,7 @@ async def set_deleted(): await edit_message(ctx, party.MessageID) await set_deleted() confirmation = await ctx.send(f"<@{ctx.author.id}>, you have been added to {selected_role}") - await asyncio.sleep(5) + await asyncio.sleep(1) await confirmation.delete() bot.start(token) From f1b9421ccfe514c6eb2a888fbc03a518b072ec00 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 5 Nov 2023 14:36:13 +0000 Subject: [PATCH 8/8] Adding flexible role --- server.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server.py b/server.py index 94943670..1ece6628 100755 --- a/server.py +++ b/server.py @@ -23,6 +23,7 @@ def __init__(self, Type, Quantity, Host, Multi=None, **kwargs): "Leafer": ["Open"]*4, "Fruit Froster": ["Open"]*3, "Oven/Spreader": ["Open"]*3, + "Flexible (TBD)": ["Open"]*4, } self.Roles.update(kwargs) self.MessageID = None @@ -182,7 +183,7 @@ async def set_deleted(): await ctx.author.send("You have already signed up for a role. Please remove your current role to switch roles.") else: components = StringSelectMenu( - "Starter", "Batter", "Froster", "Leafer", "Fruit Froster", "Oven/Spreader", + "Starter", "Batter", "Froster", "Leafer", "Fruit Froster", "Oven/Spreader","Flexible (TBD)", placeholder="Choose your role", custom_id="role" )