import asyncio from typing import Any import requests import websockets import json from websockets import Response from enums import OpCode, EventTitle, MessageComponentType with open('configuration.json', 'r') as file: CONFIG = json.load(file) APPLICATION_ID: int = CONFIG["APPLICATION_ID"] GATEWAY_URL: str = "wss://gateway.discord.gg/?v=10&encoding=json" API_URL: str = "https://discord.com/api/v10" TOKEN: str = CONFIG["TOKEN"] async def create_command(): body: dict = { "name": "poll", "type": 1, "description": "Des votes sur lesquels gamble !", } res: Response = requests.post(f"{API_URL}/applications/{APPLICATION_ID}/commands", json=body, headers={"Authorization": f"Bot {TOKEN}"}) print(res) async def init_commands(): res = requests.get(f"{API_URL}/applications/{APPLICATION_ID}/commands", headers={"Authorization": f"Bot {TOKEN}"}) commands = json.loads(res.content) for command in commands: response = requests.delete(f"{API_URL}/applications/{APPLICATION_ID}/commands/{command['id']}", headers={"Authorization": f"Bot {TOKEN}"}) if response.status_code == 204: print("Suppression des commandes: Supprimé avec succès !") else: print("Suppression des commandes: Une erreur est survenue") await create_command() async def create_poll(interaction_id: int, interaction_token: str, components: list[dict]): question = next( (comp["components"][0]["value"] for comp in components if comp["components"][0]["custom_id"] == "label"), "Question du poll" ) vote_options = [] 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} }) body = { "type": 4, "data": { "embeds": [ { "title": "Les paris sont ouverts !", "description": "Vous pouvez parier vos points, ils ne passeront pas en dessous de 50." } ], "poll": { "question": {"text": question}, "answers": vote_options, "allow_multiselect": False, "layout_type": 1 } } } res = requests.post( f"{API_URL}/interactions/{interaction_id}/{interaction_token}/callback", json=body, headers={"Authorization": f"Bot {TOKEN}"} ) if res.status_code == 400: print(res.json()) else: print(res) async def identify(websocket): payload: dict = { "op": OpCode.IDENTIFY, "d": { "token": TOKEN, "properties": { "os": "linux", "browser": "gambling", "device": "gambling" }, "intents": 50364416, } } await websocket.send(json.dumps(payload)) async def create_poll_form(interaction_id: int, interaction_token: str): body = { "type": 9, "data": { "title": "Créer un vote", "custom_id": "poll_id_create", "components": [ { "type": 1, "components": [ { "type": 4, "custom_id": "label", "label": "Question du vote", "placeholder": "Shy aime-t-il les robots?", "style": 1, "min_length": 1, "required": True } ] }, { "type": 1, "components": [ { "type": 4, "custom_id": "vote1", "label": "Première option", "placeholder": "Oui", "style": 1, "min_length": 1, "required": True } ] }, { "type": 1, "components": [ { "type": 4, "custom_id": "vote2", "label": "Deuxième option", "placeholder": "Non", "style": 1, "min_length": 1, "required": False } ] }, { "type": 1, "components": [ { "type": 4, "custom_id": "vote3", "label": "Troisième option", "placeholder": "Peut-être", "style": 1, "min_length": 1, "required": False } ] }, { "type": 1, "components": [ { "type": 4, "custom_id": "vote4", "label": "Quatrième option", "placeholder": "Pas du tout", "style": 1, "min_length": 1, "required": False } ] } ] } } res = requests.post(f"{API_URL}/interactions/{interaction_id}/{interaction_token}/callback", json=body, headers={"Authorization": f"Bot {TOKEN}"}) if res.status_code == 400: print(res.json()) else: print(res) async def heartbeat(websocket, interval): while True: await asyncio.sleep(interval / 1000) await websocket.send(json.dumps({"op": OpCode.HEARTBEAT, "d": None})) 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: print(response["d"]["data"].keys()) 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"]) await create_poll_form(int(response["d"]["id"]), response["d"]["token"]) case _: print(response) async def connect(): async with websockets.connect(GATEWAY_URL) as websocket: response = json.loads(await websocket.recv()) heartbeat_interval = response["d"]["heartbeat_interval"] asyncio.create_task(heartbeat(websocket, heartbeat_interval)) await identify(websocket) while True: response = json.loads(await websocket.recv()) match response["op"]: case OpCode.DISPATCH: await get_event(response) case _: print(response) async def main(): gateway_connect = asyncio.create_task(connect()) # await init_commands() # await create_poll(840107060901052426, "f", []) await gateway_connect asyncio.run(main())