From 513b84c96b8ae667b9360ffbcbe6cab253ff791b Mon Sep 17 00:00:00 2001 From: olred Date: Thu, 9 Mar 2023 12:35:22 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BB=D0=B0=D0=B2=D0=B8=D0=B0=D1=82?= =?UTF-8?q?=D1=83=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- READ_INSTRUCTION.txt | 12 +++++----- app/store/bot/keyboards.py | 38 +++++++++++++++++++++++++++++ app/store/bot/lexicon.py | 2 ++ app/store/bot/manager.py | 42 +++++++++++++++++++++++---------- app/store/bot/sender.py | 7 +++++- app/store/vk_api/accessor.py | 33 ++++++++++++++++---------- app/store/vk_api/dataclasses.py | 5 ++++ 8 files changed, 108 insertions(+), 33 deletions(-) create mode 100644 app/store/bot/keyboards.py diff --git a/.gitignore b/.gitignore index ddcb89f..7951c9b 100644 --- a/.gitignore +++ b/.gitignore @@ -134,7 +134,7 @@ __pycache__/ # C extensions *.so - +.idea # Distribution / packaging .Python build/ diff --git a/READ_INSTRUCTION.txt b/READ_INSTRUCTION.txt index f49f103..5dc3c8c 100644 --- a/READ_INSTRUCTION.txt +++ b/READ_INSTRUCTION.txt @@ -2,12 +2,12 @@ 1) Регистрация! - регистрирует всех пользователей в чате 2) Загрузить фотографии! - человек пишет данную фун-ию и затем присылает фотографии 3) Начать игру! - начинается игра -3) Остановить игру! - игра останавливается, выводятся оставшиеся пользователи -4) Последняя игра! - выводится победитель из последней игры, если он есть -5) Следующий раунд! -6) Исключить name -7) Моя статистика! -8) Статистика! +4) Остановить игру! - игра останавливается, выводятся оставшиеся пользователи +5) Последняя игра! - выводится победитель из последней игры, если он есть +6) Следующий раунд! +7) Исключить name +8) Моя статистика! +9) Статистика! Механизм игры такой: РЕЖИМ: ВСЕ ПРОТИВ ВСЕХ! - все сражаются против друг друга, пока не останется 1 или 0 пользователей. В случае если остался 1 - выводится победитель, в случае, если никто не остался - выводится соответствующее сообщение diff --git a/app/store/bot/keyboards.py b/app/store/bot/keyboards.py new file mode 100644 index 0000000..1169dde --- /dev/null +++ b/app/store/bot/keyboards.py @@ -0,0 +1,38 @@ +import json + + +def get_but(text, color): + return { + "action": { + "type": "text", + "payload": '{"button": "' + "1" + '"}', + "label": f"{text}", + }, + "color": f"{color}", + } + + +keyboard_admin = { + "one_time": True, + "buttons": [ + [ + get_but("Регистрация!", "primary"), + get_but("Загрузить фотографии!", "primary"), + ], + [ + get_but("Начать игру!", "primary"), + get_but("Остановить игру!", "primary"), + ], + [ + get_but("Последняя игра!", "primary"), + get_but("Следующий раунд!", "primary"), + ], + [ + get_but("Моя статистика!", "primary"), + get_but("Статистика!", "primary"), + ], + ], +} + +keyboard_admin = json.dumps(keyboard_admin, ensure_ascii=False).encode("utf-8") +keyboard_admin = str(keyboard_admin.decode("utf-8")) diff --git a/app/store/bot/lexicon.py b/app/store/bot/lexicon.py index 8d3f2dc..d3a14d1 100644 --- a/app/store/bot/lexicon.py +++ b/app/store/bot/lexicon.py @@ -43,4 +43,6 @@ "GAME_NO_EXIST": "Игровая сессия не запущена!", "ADMIN_COMMAND": "Данная команда вам недоступна!", "USER_KICKED": "Пользователь исключен!", + "COMMANDS": "Список команд", + "ID_GROUP": "[club207946988|@kusokusa]", } diff --git a/app/store/bot/manager.py b/app/store/bot/manager.py index 1d4cdae..139f9be 100644 --- a/app/store/bot/manager.py +++ b/app/store/bot/manager.py @@ -1,11 +1,12 @@ import asyncio import typing from logging import getLogger -from time import sleep from random import choice from sqlalchemy import insert from sqlalchemy.sql import select, update as refresh, delete + +from app.store.bot.keyboards import keyboard_admin from app.store.bot.lexicon import ( commands_for_users, commands_for_admins, @@ -43,14 +44,14 @@ def __init__( "chat_invite_user": self.command_invite, } self.commands = { - "Регистрация!": self.command_registery, - "Начать игру!": self.command_start_game, - "Остановить игру!": self.command_stop_game, - "Последняя игра!": self.command_last_game, - "Моя статистика!": self.command_my_statistic, - "Команды!": self.command_list_of_commands, - "Следующий раунд!": self.command_next_round, - "Статистика!": self.command_general_statistic, + f"{lexicon_for_messages['ID_GROUP']} Регистрация!": self.command_registery, + f"{lexicon_for_messages['ID_GROUP']} Начать игру!": self.command_start_game, + f"{lexicon_for_messages['ID_GROUP']} Остановить игру!": self.command_stop_game, + f"{lexicon_for_messages['ID_GROUP']} Последняя игра!": self.command_last_game, + f"{lexicon_for_messages['ID_GROUP']} Моя статистика!": self.command_my_statistic, + f"Команды!": self.command_list_of_commands, + f"{lexicon_for_messages['ID_GROUP']} Следующий раунд!": self.command_next_round, + f"{lexicon_for_messages['ID_GROUP']} Статистика!": self.command_general_statistic, } async def handle_updates(self, update): @@ -70,7 +71,11 @@ async def handle_updates(self, update): self.reader = list(map(int, self.reader)) if update.object.body in self.commands: await self.commands[update.object.body](update, game) - if update.object.body == "Загрузить фотографии!" or game["state_photo"]: + if ( + update.object.body + == f"{lexicon_for_messages['ID_GROUP']} Загрузить фотографии!" + or game["state_photo"] + ): if len(users) == 0: self.out_queue.put_nowait( ( @@ -95,7 +100,8 @@ async def handle_updates(self, update): ) if ( len(update.object.body.split()) == 2 - and "Исключить" in update.object.body.split() + and f"{lexicon_for_messages['ID_GROUP']} Исключить" + in update.object.body.split() ): await self.command_kick_from_game( update.object.body.split()[1], update, game @@ -213,14 +219,24 @@ async def command_list_of_commands(self, update, game): for i in commands_for_admins.items(): result += f"{i[0]}: {i[1]}%0A" self.out_queue.put_nowait( - ("message", update.object.chat_id, result[:-3]) + ( + "keyboard", + update.object.chat_id, + lexicon_for_messages["COMMANDS"], + keyboard_admin, + ) ) else: result = "" for i in commands_for_users.items(): result += f"{i[0]}: {i[1]}%0A" self.out_queue.put_nowait( - ("message", update.object.chat_id, result[:-3]) + ( + "keyboard", + update.object.chat_id, + lexicon_for_messages["COMMANDS"], + keyboard_user, + ) ) else: self.out_queue.put_nowait( diff --git a/app/store/bot/sender.py b/app/store/bot/sender.py index 876b6cd..9a3d23d 100644 --- a/app/store/bot/sender.py +++ b/app/store/bot/sender.py @@ -1,7 +1,7 @@ import asyncio import typing -from app.store.vk_api.dataclasses import Message, Attachment +from app.store.vk_api.dataclasses import Message, Attachment, MessageKeyboard if typing.TYPE_CHECKING: from app.web.app import Application @@ -27,6 +27,11 @@ async def send_vk(self, upd): ), self.app, ) + if upd[0] == "keyboard": + await self.app.store.vk_api.send_message( + MessageKeyboard(chat_id=upd[1], text=upd[2], keyboard=upd[3]), + self.app, + ) async def _worker(self): while True: diff --git a/app/store/vk_api/accessor.py b/app/store/vk_api/accessor.py index 49b09fa..c1209ab 100644 --- a/app/store/vk_api/accessor.py +++ b/app/store/vk_api/accessor.py @@ -11,6 +11,7 @@ UpdatePhoto, Attachment, UpdateAction, + MessageKeyboard, ) from app.store.vk_api.poller import Poller @@ -150,19 +151,28 @@ async def poll(self, app): await self.disconnect(app) return updates - async def send_message(self, message: Message, app) -> None: + async def send_message( + self, message: Message | MessageKeyboard, app + ) -> None: await self.connect(app) + if type(message) is Message: + parametrs = { + "random_id": random.randint(1, 2**32), + "peer_id": message.chat_id, + "message": message.text, + "access_token": self.app.config.bot.token, + } + else: + print(1) + parametrs = { + "random_id": random.randint(1, 2**32), + "peer_id": message.chat_id, + "message": message.text, + "keyboard": message.keyboard, + "access_token": self.app.config.bot.token, + } async with self.session.get( - self._build_query( - API_PATH, - "messages.send", - params={ - "random_id": random.randint(1, 2**32), - "peer_id": message.chat_id, - "message": message.text, - "access_token": self.app.config.bot.token, - }, - ) + self._build_query(API_PATH, "messages.send", params=parametrs) ) as resp: data = await resp.json() self.logger.info(data) @@ -179,7 +189,6 @@ def _build_attachment(attach_mass: list[str]): async def send_photo(self, attachment: Attachment, app) -> None: await self.connect(app) attachments = self._build_attachment(attachment.attachment) - print(attachments) async with self.session.get( self._build_query( API_PATH, diff --git a/app/store/vk_api/dataclasses.py b/app/store/vk_api/dataclasses.py index 631bfa9..87d4c6c 100644 --- a/app/store/vk_api/dataclasses.py +++ b/app/store/vk_api/dataclasses.py @@ -33,6 +33,11 @@ class Message: text: str +@dataclass +class MessageKeyboard(Message): + keyboard: str + + @dataclass class Attachment(Message): attachment: list[str]