From 50931d52158026bf98031dd8dc1ad7e16ef0095a Mon Sep 17 00:00:00 2001 From: Guams Date: Sat, 15 Mar 2025 22:16:29 +0100 Subject: [PATCH] Bot get poll response from user --- database.sql | 37 ++++++++++++++++++++++++++ enums.py | 7 +++++ main.py | 73 ++++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 97 insertions(+), 20 deletions(-) create mode 100644 database.sql diff --git a/database.sql b/database.sql new file mode 100644 index 0000000..cadf57b --- /dev/null +++ b/database.sql @@ -0,0 +1,37 @@ +DROP TABLE IF EXISTS vote_utilisateur; +DROP TABLE IF EXISTS utilisateur; +DROP TABLE IF EXISTS poll; +DROP TABLE IF EXISTS vote; + + +CREATE TABLE vote ( + vote_id UUID, + vote_option VARCHAR(255), + nbr_vote INT, + PRIMARY KEY (vote_id) +); + +CREATE TABLE poll ( + poll_id UUID, + vote_id UUID, + question VARCHAR(255), + opened BOOLEAN, + PRIMARY KEY (poll_id), + FOREIGN KEY (vote_id) REFERENCES vote(vote_id) +); + +CREATE TABLE utilisateur ( + user_id BIGINT, + global_name VARCHAR(255), + avatar TEXT, + PRIMARY KEY (user_id) +); + +CREATE TABLE vote_utilisateur ( + user_id BIGINT, + vote_id UUID, + poll_id UUID, + FOREIGN KEY (user_id) REFERENCES utilisateur(user_id), + FOREIGN KEY (vote_id) REFERENCES vote(vote_id), + FOREIGN KEY (poll_id) REFERENCES poll(poll_id) +); diff --git a/enums.py b/enums.py index ffe5edb..41037dc 100644 --- a/enums.py +++ b/enums.py @@ -32,3 +32,10 @@ class EventTitle(str, Enum): MESSAGE_CREATE = "MESSAGE_CREATE" GUILD_CREATE = "GUILD_CREATE" READY = "READY" + +class InteractionType(int, Enum): + PING = 1 + APPLICATION_COMMAND = 2 + MESSAGE_COMPONENT = 3 + APPLICATION_COMMAND_AUTOCOMPLETE = 4 + MODAL_SUBMIT = 5 diff --git a/main.py b/main.py index 271762e..d4fe303 100644 --- a/main.py +++ b/main.py @@ -7,7 +7,7 @@ import json from websockets import Response -from enums import OpCode, EventTitle, MessageComponentType +from enums import OpCode, EventTitle, InteractionType with open('configuration.json', 'r') as file: CONFIG = json.load(file) @@ -74,30 +74,40 @@ async def create_poll(interaction_id: int, interaction_token: str, components: l "Question du poll" ) - vote_options = [] + print(components) + + vote_options = "" + buttons = [] for index, comp in enumerate(components): if "vote" in comp["components"][0]["custom_id"] and comp["components"][0]["value"] != "": vote_text = comp["components"][0]["value"] - vote_options.append({ - "answer_id": len(vote_options) + 1, - "poll_media": {"text": vote_text} + vote_options += f"Option {index}: {vote_text}\n" + + buttons.append({ + "type": 2, + "label": vote_text, + "style": 1, + "custom_id": f"vote_{index}" }) + action_rows = [{"type": 1, "components": buttons[i:i + 5]} for i in range(0, len(buttons), 5)] + body = { "type": 4, "data": { "embeds": [ { "title": "Les paris sont ouverts !", - "description": "Vous pouvez parier vos points, ils ne passeront pas en dessous de 50." + "description": "Vous pouvez parier vos points, ils ne passeront pas en dessous de 50.", + "color": 5613215 + }, + { + "title": f"Sondage: {question}", + "description": vote_options, + "color": 16775222 } ], - "poll": { - "question": {"text": question}, - "answers": vote_options, - "allow_multiselect": False, - "layout_type": 1 - } + "components": action_rows } } @@ -232,21 +242,44 @@ async def heartbeat(websocket, interval): await asyncio.sleep(interval / 1000) await websocket.send(json.dumps({"op": OpCode.HEARTBEAT, "d": None})) +async def send_private_response(interaction_id: int, interaction_token: str, custom_id: str, user_id: str): + + # Récupérer le nom de l'option corespondant à l'id en BDD + body = { + "type": 4, + "data": { + "content": f"<@{user_id}>, tu as misé 50 sur l'option **{custom_id.split('_')[1]}** ! 🎉", + "flags": 64 + } + } + + res = requests.post( + f"{API_URL}/interactions/{interaction_id}/{interaction_token}/callback", + json=body, + headers={"Authorization": f"Bot {TOKEN}", "Content-Type": "application/json"} + ) + if res.status_code == 400: + print(res.json()) + else: + print(res) async def get_event(response: Any): match response["t"]: case EventTitle.MESSAGE_CREATE: print(f'{response["d"]["author"]["username"]}: {response["d"]["content"]}') case EventTitle.INTERACTION_CREATE: - if "custom_id" in response["d"]["data"].keys(): - if response["d"]["data"]["custom_id"] == "poll_id_create": - await create_poll( - int(response["d"]["id"]), - response["d"]["token"], - response["d"]["data"]["components"] + if response["d"]["type"] == InteractionType.MODAL_SUBMIT: + await create_poll( + int(response["d"]["id"]), + response["d"]["token"], + response["d"]["data"]["components"] ) - print(response) - await create_poll_form(int(response["d"]["id"]), response["d"]["token"]) + elif response["d"]["type"] == InteractionType.MESSAGE_COMPONENT: + custom_id = response["d"]["data"]["custom_id"] + user_id = response["d"]["member"]["user"]["id"] + await send_private_response(int(response["d"]["id"]), response["d"]["token"], custom_id, user_id) + elif response["d"]["type"] == InteractionType.APPLICATION_COMMAND: + await create_poll_form(int(response["d"]["id"]), response["d"]["token"]) case _: print(response)