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
22 changes: 22 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,22 @@
### Linux ###
*~

# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*

# KDE directory preferences
.directory

# Linux trash folder which might appear on any partition or disk
.Trash-*

# .nfs files are created when an open file is removed but is still being accessed
.nfs*

### PyCharm ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
Expand Down Expand Up @@ -276,6 +295,9 @@ poetry.toml
# ruff
.ruff_cache/

# LSP config files
pyrightconfig.json

### venv ###
# Virtualenv
# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/
Expand Down
6 changes: 0 additions & 6 deletions .idea/vcs.xml

This file was deleted.

7 changes: 6 additions & 1 deletion READ_INSTRUCTION.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,15 @@
3) Начать игру! - начинается игра
3) Остановить игру! - игра останавливается, выводятся оставшиеся пользователи
4) Последняя игра! - выводится победитель из последней игры, если он есть

5) Следующий раунд!
6) Исключить name
7) Моя статистика!
8) Статистика!
Механизм игры такой:
РЕЖИМ: ВСЕ ПРОТИВ ВСЕХ! - все сражаются против друг друга, пока не останется 1 или 0 пользователей. В случае если остался 1 - выводится победитель,
в случае, если никто не остался - выводится соответствующее сообщение

ВАЖНО!! Подгружать фотографии можно с сохраненок либо ваших фотографий с телефона. Фотографии со страницы нельзя!



2 changes: 1 addition & 1 deletion alembic/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from sqlalchemy import pool
from sqlalchemy.engine import Connection
from sqlalchemy.ext.asyncio import AsyncEngine
from app.store.models.model import ParticipantsModel
from app.store.models.model import ParticipantsModel, GameModel

from alembic import context

Expand Down
37 changes: 0 additions & 37 deletions alembic/versions/1d6d7e9045d3_participants.py

This file was deleted.

63 changes: 63 additions & 0 deletions alembic/versions/e0fb8c912758_add_gamemodel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
"""Add GameModel

Revision ID: e0fb8c912758
Revises:
Create Date: 2023-03-04 19:24:14.714777

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision = 'e0fb8c912758'
down_revision = None
branch_labels = None
depends_on = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('game_session',
sa.Column('id', sa.BigInteger(), nullable=False),
sa.Column('chat_id', sa.BigInteger(), nullable=True),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('chat_id')
)
op.create_table('game',
sa.Column('id', sa.BigInteger(), nullable=False),
sa.Column('chat_id', sa.BigInteger(), nullable=True),
sa.Column('users', postgresql.JSONB(astext_type=sa.Text()), nullable=True),
sa.Column('state_photo', sa.Boolean(), nullable=True),
sa.Column('state_in_game', sa.Boolean(), nullable=True),
sa.Column('state_wait_votes', sa.Boolean(), nullable=True),
sa.Column('new_pair', postgresql.JSONB(astext_type=sa.Text()), nullable=True),
sa.Column('first_votes', sa.BigInteger(), nullable=True),
sa.Column('second_votes', sa.BigInteger(), nullable=True),
sa.Column('state_send_photo', sa.Boolean(), nullable=True),
sa.Column('voters', postgresql.JSONB(astext_type=sa.Text()), nullable=True),
sa.Column('amount_users', sa.BigInteger(), nullable=True),
sa.Column('last_winner', sa.Text(), nullable=True),
sa.ForeignKeyConstraint(['chat_id'], ['game_session.chat_id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id')
)
op.create_table('participants',
sa.Column('id', sa.BigInteger(), nullable=False),
sa.Column('name', sa.Text(), nullable=False),
sa.Column('wins', sa.BigInteger(), nullable=True),
sa.Column('chat_id', sa.BigInteger(), nullable=True),
sa.Column('owner_id', sa.BigInteger(), nullable=True),
sa.Column('photo_id', sa.BigInteger(), nullable=True),
sa.Column('access_key', sa.Text(), nullable=True),
sa.ForeignKeyConstraint(['chat_id'], ['game_session.chat_id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id')
)
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('participants')
op.drop_table('game')
op.drop_table('game_session')
# ### end Alembic commands ###
28 changes: 28 additions & 0 deletions alembic/versions/eb47d650c4bf_add_gamemodel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
"""Add GameModel

Revision ID: eb47d650c4bf
Revises: e0fb8c912758
Create Date: 2023-03-07 21:26:04.620744

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision = 'eb47d650c4bf'
down_revision = 'e0fb8c912758'
branch_labels = None
depends_on = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('game', sa.Column('kicked_users', postgresql.JSONB(astext_type=sa.Text()), nullable=True))
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('game', 'kicked_users')
# ### end Alembic commands ###
27 changes: 27 additions & 0 deletions app/bot_vk.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import asyncio

from app.store.bot.sender import VKSender
from app.store.vk_api.poller import Poller
from app.store.bot.manager import BotManager
from app.store import Store
from app.web.app import app


class Bot:
def __init__(self, n):
self.queue = asyncio.Queue()
self.out_queue = asyncio.Queue()
self.store = Store(app)
self.poller = Poller(self.queue, self.store)
self.worker = BotManager(self.queue, self.out_queue, app, n)
self.sender = VKSender(self.out_queue, app)

async def start(self):
await self.poller.start(app)
await self.worker.start()
await self.sender.start()

async def stop(self):
await self.poller.stop()
await self.worker.stop()
await self.sender.stop()
11 changes: 7 additions & 4 deletions app/store/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import asyncio
import typing

from app.store.database.database import Database
Expand All @@ -8,15 +9,17 @@

class Store:
def __init__(self, app: "Application"):
from app.store.bot.manager import BotManager
from app.store.vk_api.accessor import VkApiAccessor
from app.store.bot.manager import BotManager
from app.store.bot.sender import VKSender

self.queue = asyncio.Queue()
self.out_queue = asyncio.Queue()
self.vk_api = VkApiAccessor(app)
self.bots_manager = BotManager(app)
self.bot_manager = BotManager(self.queue, self.out_queue, app, 1)
self.vk_sender = VKSender(self.out_queue, app)


def setup_store(app: "Application"):
app.database = Database(app)
app.on_startup.append(app.database.connect)
app.on_cleanup.append(app.database.disconnect)
app.store = Store(app)
1 change: 1 addition & 0 deletions app/store/bot/admins_id.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
582423336
18 changes: 18 additions & 0 deletions app/store/bot/bot_runner.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import asyncio
import datetime


from app.bot_vk import Bot


def run():
loop = asyncio.get_event_loop()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

посмотри новый синтакс юез лупа

bot = Bot(3)
try:
print("Bot has been started")
loop.create_task(bot.start())
loop.run_forever()
except KeyboardInterrupt:
print("\nstopping", datetime.datetime.now())
loop.run_until_complete(bot.stop())
print("Bot has been stopped", datetime.datetime.now())
20 changes: 0 additions & 20 deletions app/store/bot/dataclassess.py

This file was deleted.

46 changes: 46 additions & 0 deletions app/store/bot/lexicon.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
commands_for_users = {
"«Регистрация!»": "регистрирует всех участников игры.",
"«Загрузить фотографии!»": "после написания данной команды, скидываете фотографию, которая будет участвовать в конкурсе.",
"«Начать игру!»": "запускает игровой процесс.",
"«Остановить игру!»": "останавливает игровую сессию и выводит всех оставшихся участников.",
"«Моя статистика!»": "выводит персональную статистику человека.",
"«Последняя игра!»": "выводит информацию о последней игре.",
}

commands_for_admins = {
"«Стастика!»": "выводит статистику всех игроков.",
"«Замолчать!»": "запрещает выбранному участнику говорить.",
"«Говорить!»": "убирает у выбранного участника блокировку чата.",
"«Выгнать!»": "удаляет выбранного участника из чата.",
}


lexicon_for_messages = {
"DUR_GAME": "Данная команда недоступна во время игры!",
"NO_REG": "Вы не прошли регистрацию!",
"SUCC_REG": "Регистрация прошла успешно!",
"WINNER": "Победил",
"NO_WINNERS": "Никто не победил!",
"STATISTIC_PLAYER": "Статистика игрока",
"AMOUNT_WINS": "Кол-во побед",
"LAST_WINNER": "Последний победитель",
"NO_LAST_WINNER": "Игр еще не было или они закончились ничьей!",
"WELCOME_PHRASE": "Здравствуйте, я бот-викторина. Пожалуйста, для игры сделайте меня администратором!",
"SUCC_PHOTO": "Фотографии успешно загружены!",
"LITTLE_PEOPLE": "Необходимо минимум два человека!",
"START_GAME": "Игра начинается через",
"LETS_GO": "Поехали!",
"NOT_ENOUGH_PHOTO": "Не все пользователи загрузили фотографии!",
"GAME_GO": "Игра уже идет!",
"CHOOSE": "Выбирай!",
"ALR_VOTED": "Вы уже отдали свой голос!",
"FIRST_WIN": "И в текущем сражении победителем стал обладатель первой картинки!",
"SECOND_WIN": "И в текущем сражении победителем стал обладатель второй картинки!",
"DRAW": "Никто не победил - следовательно оба вылетают.",
"RANDOM_WIN": "Никто не проголосовал, поэтому победитель определяется случайным образом.",
"REMAIN": "Оставшиеся пользователи",
"GAME_STOP": "Игра остановлена!",
"GAME_NO_EXIST": "Игровая сессия не запущена!",
"ADMIN_COMMAND": "Данная команда вам недоступна!",
"USER_KICKED": "Пользователь исключен!",
}
Loading