Skip to content

Bot dev/helpers to merge - #4

Open
artbakulev wants to merge 38 commits into
mainfrom
bot-dev/helpers-to-merge
Open

Bot dev/helpers to merge#4
artbakulev wants to merge 38 commits into
mainfrom
bot-dev/helpers-to-merge

Conversation

@artbakulev

Copy link
Copy Markdown
Collaborator

No description provided.

Flash1ee and others added 30 commits February 9, 2021 00:17
# Conflicts:
#	app/game/models.py
#	app/store/database/accessor.py
#	app/store/database/models.py
#	rest/alembic/README
#	rest/alembic/env.py
#	rest/alembic/script.py.mako
#	rest/alembic/versions/b6f6e5cefec4_first_migration.py

@artbakulev artbakulev left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

посмотрел код - основное замечание что очень все хаотично - функции не там где они должны быть, аксессуары не используются, а просто существуют во многих экземплярах, gino пытается создать модели при каждом запросе... В идеале, каждый должен делать свою работу, например GameHelper не должен исполнять запросы к базе, это не его зона ответственности. И еще большое замечание - код очень разобщен и частично из-за этого и возникает первое замечание. Игровые функции не имеют доступа к app, а следовательно и к конфигу, и к PostgresAccessor, и к логгеру, и поэтому им приходится инстанцировать объекты каждый раз, а конфиг вообще обходить стороной - сделайте хотя бы так, чтобы в GameHelper пробрасывался экземпляр app (к которому должны быть привязаны все вышеперечисленные сущности) и из app уже доставайте все необходимое. В остальном хорошо, молодцы что научились работать с aiogram и поняли как обрабатывать игровые сессии

Comment thread app.py
from bot.middlewares.db import PostgressMiddleware


bot = Bot(token=TOKEN)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

мне не очень нравится, что бот и диспетчер создаются тут, сделайте отдельный accessor для бота как в репе-примере - возможно в будущем нужно будет сделать что-то on_connect, on_disconnect (кстати, у бота есть метод close) + надо привязать бота к приложению, чтобы к нему был доступ по app.bot или хотя бы app['bot']

Comment thread app.py
dp = Dispatcher(bot, storage=MemoryStorage())


async def main():

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

в одной функции - один смысл.
у вас эта функция разрастется до невозможности при дальнейшем написании кода. Лучше переделать на setup_configs, setup_handlers и т.д., а тут вызывать уже просто по порядку. К примеру о неразберихе в коде: почему мидлвары при запуске добавляются? логичнее было бы их вынести в функцию main и только main запускать

Comment thread app/store/database/accessor.py Outdated
async def create_session(self) -> None:
from app.store.database.models import db
await db.set_bind(
"postgresql://postgres:1111@localhost:5433/postgres"

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

надо из конфигов это тягать

Comment thread bot/middlewares/db.py
from aiogram import types


class PostgressMiddleware(BaseMiddleware):

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

одна "s"

Comment thread bot/middlewares/db.py


class PostgressMiddleware(BaseMiddleware):
def __init__(self):

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Очень страшная мидлвара - не надо открывать соединение на каждый запрос, это очень не эффективно - надо переиспользовать соединение или, если есть необходимость, иметь пул соединений и из него уже брать. Представьте ситуацию - к вам пришло 100 медленных клиентов одновременно == вы открыли 100 соединений к базе, что ухудшит ее производительность. Открытие/закрытие соединений тоже дает overhead, это не мгновенная операция - база должна проверить, что ничего не выполняется и она может закрыть соединение безопасно. Убирайте мидлвару, создайте одно соединение, привяжите к PostgresAccessor и пользуйтесь им

Comment thread bot/helpers/gameHelper.py

class GameHelper:

# Config

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

вынесите все в нормальный конфиг и устанавливайте в init

Comment thread bot/helpers/gameHelper.py
error = 4


class GameHelper:

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Все операции с базой должны происходить в PostgresAccessor - нельзя раскидывать чистые вызовы по коду

Comment thread bot/handlers/game_init.py

async def game_status(message: types.Message):
game = GameHelper(message.chat.id, db)
state = await game.GetState()

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

это все надо переносить в GameHelper, не надо часть логики по игре оставлять во view, а часть в классе. в идеале View должен принять запрос, вызвать какую-то функцию и отправить ответ

Comment thread bot/handlers/game_init.py Outdated

from app.store.database.accessor import PostgresAccessor

pg = PostgresAccessor()

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

один accessor на все приложение, практически из каждой функции и класса должен быть доступ к app (не к глобальному только)

Comment thread bot/config.py Outdated
@@ -0,0 +1,3 @@
from bot.settings import cfg

TOKEN = cfg["bot"]["token"]

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

грустно... сделайте dataclass с конфигурацией бота, у вас там не только token будет

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants