Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ __pycache__/

# C extensions
*.so

.idea
# Distribution / packaging
.Python
build/
Expand Down
12 changes: 6 additions & 6 deletions READ_INSTRUCTION.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
1) Регистрация! - регистрирует всех пользователей в чате
2) Загрузить фотографии! - человек пишет данную фун-ию и затем присылает фотографии
3) Начать игру! - начинается игра
3) Остановить игру! - игра останавливается, выводятся оставшиеся пользователи
4) Последняя игра! - выводится победитель из последней игры, если он есть
5) Следующий раунд!
6) Исключить name
7) Моя статистика!
8) Статистика!
4) Остановить игру! - игра останавливается, выводятся оставшиеся пользователи
5) Последняя игра! - выводится победитель из последней игры, если он есть
6) Следующий раунд!
7) Исключить name
8) Моя статистика!
9) Статистика!
Механизм игры такой:
РЕЖИМ: ВСЕ ПРОТИВ ВСЕХ! - все сражаются против друг друга, пока не останется 1 или 0 пользователей. В случае если остался 1 - выводится победитель,
в случае, если никто не остался - выводится соответствующее сообщение
Expand Down
38 changes: 38 additions & 0 deletions app/store/bot/keyboards.py
Original file line number Diff line number Diff line change
@@ -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"))
2 changes: 2 additions & 0 deletions app/store/bot/lexicon.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,6 @@
"GAME_NO_EXIST": "Игровая сессия не запущена!",
"ADMIN_COMMAND": "Данная команда вам недоступна!",
"USER_KICKED": "Пользователь исключен!",
"COMMANDS": "Список команд",
"ID_GROUP": "[club207946988|@kusokusa]",
}
42 changes: 29 additions & 13 deletions app/store/bot/manager.py
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -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):
Expand All @@ -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(
(
Expand All @@ -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
Expand Down Expand Up @@ -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(
Expand Down
7 changes: 6 additions & 1 deletion app/store/bot/sender.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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:
Expand Down
33 changes: 21 additions & 12 deletions app/store/vk_api/accessor.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
UpdatePhoto,
Attachment,
UpdateAction,
MessageKeyboard,
)
from app.store.vk_api.poller import Poller

Expand Down Expand Up @@ -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)
Expand All @@ -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,
Expand Down
5 changes: 5 additions & 0 deletions app/store/vk_api/dataclasses.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ class Message:
text: str


@dataclass
class MessageKeyboard(Message):
keyboard: str


@dataclass
class Attachment(Message):
attachment: list[str]
Expand Down