Skip to content

Commit

Permalink
Merge pull request #88 from bomzheg/#82
Browse files Browse the repository at this point in the history
  • Loading branch information
bomzheg authored Jun 9, 2024
2 parents 0bd3400 + 08c99de commit f5d3317
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 14 deletions.
9 changes: 3 additions & 6 deletions shvatka/tgbot/dialogs/game_spy/dialogs.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
from datetime import datetime

from aiogram import F
from aiogram_dialog import Dialog, Window
from aiogram_dialog.widgets.kbd import Button, SwitchTo, Cancel
from aiogram_dialog.widgets.text import Const, Jinja, Multi

from shvatka.core.utils.datetime_utils import tz_utc
from shvatka.tgbot import states
from .getters import get_org, get_spy, get_keys
from .handlers import keys_handler
Expand Down Expand Up @@ -61,17 +58,17 @@
"Промежуточный лог ключей \n"
"для игры <b>{{game.name}}</b> "
"(началась в {{game.start_at|user_timezone}}) \n"
"по состоянию на {{ now | user_timezone }}\n"
"{% if key_link %}"
'доступен <a href="{{key_link}}">по ссылке</a>'
'доступен <a href="{{key_link}}">по ссылке</a>\n'
"по состоянию на {{ updated | user_timezone }}"
"{% else %}"
"пока недоступен (попробуй обновить)"
"{% endif %}"
),
Button(Const("🔄Обновить"), id="refresh_spy", on_click=keys_handler),
SwitchTo(Const("🔙Назад"), id="back", state=states.OrgSpySG.main),
state=states.OrgSpySG.keys,
getter=(get_org, get_keys, {"now": datetime.now(tz=tz_utc)}),
getter=(get_org, get_keys),
disable_web_page_preview=True,
),
)
10 changes: 8 additions & 2 deletions shvatka/tgbot/dialogs/game_spy/getters.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@
async def get_org(
dao: HolderDao, player: dto.Player, game: dto.Game, dialog_manager: DialogManager, **_
):
org = await get_by_player(player=player, game=game, dao=dao.organizer)
if dialog_manager.middleware_data.get("org", None) is not None:
org = dialog_manager.middleware_data["org"]
else:
org = await get_by_player(player=player, game=game, dao=dao.organizer)
return {
"game": game,
"player": player,
Expand All @@ -27,4 +30,7 @@ async def get_spy(


async def get_keys(dialog_manager: DialogManager, **_):
return {"key_link": dialog_manager.dialog_data.get("key_link", None)}
return {
"key_link": dialog_manager.dialog_data.get("key_link", None),
"updated": dialog_manager.dialog_data.get("updated", None),
}
4 changes: 4 additions & 0 deletions shvatka/tgbot/dialogs/game_spy/handlers.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
from datetime import datetime

from aiogram.types import CallbackQuery
from aiogram_dialog import DialogManager
from aiogram_dialog.widgets.kbd import Button

from shvatka.core.models import dto
from shvatka.core.utils.datetime_utils import tz_utc
from shvatka.infrastructure.db.dao.holder import HolderDao
from shvatka.tgbot.views.keys import create_keys_page
from shvatka.tgbot.views.telegraph import Telegraph
Expand All @@ -16,3 +19,4 @@ async def keys_handler(c: CallbackQuery, widget: Button, manager: DialogManager)
player: dto.Player = manager.middleware_data["player"]
page = await create_keys_page(game, player, telegraph, dao, salt=game.manage_token[:8])
manager.dialog_data["key_link"] = page["url"]
manager.dialog_data["updated"] = datetime.now(tz=tz_utc)
23 changes: 19 additions & 4 deletions shvatka/tgbot/dialogs/starters/game_spy.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,39 @@
from aiogram.filters import Command

from shvatka.tgbot import states
from shvatka.tgbot.filters.is_org import OrgFilter
from shvatka.tgbot.utils.router import register_start_handler
from shvatka.tgbot.views.commands import SPY_COMMAND, SPY_LEVELS_COMMAND, SPY_KEYS_COMMAND
from shvatka.tgbot.views.commands import (
SPY_COMMAND,
SPY_LEVELS_COMMAND,
SPY_KEYS_COMMAND,
START_COMMAND,
)


def setup() -> Router:
router = Router(name=__name__)
register_start_handler(
Command(commands=SPY_COMMAND),
OrgFilter(only_for_running_game=False),
state=states.OrgSpySG.main,
router=router, # TODO is_org
router=router,
)
register_start_handler(
Command(commands=START_COMMAND),
OrgFilter(),
state=states.OrgSpySG.main,
router=router,
)
register_start_handler(
Command(commands=SPY_LEVELS_COMMAND), # TODO is_org
Command(commands=SPY_LEVELS_COMMAND),
OrgFilter(can_spy=True),
state=states.OrgSpySG.spy,
router=router,
)
register_start_handler(
Command(commands=SPY_KEYS_COMMAND), # TODO is_org
Command(commands=SPY_KEYS_COMMAND),
OrgFilter(can_see_log_keys=True),
state=states.OrgSpySG.keys,
router=router,
)
Expand Down
51 changes: 51 additions & 0 deletions shvatka/tgbot/filters/is_org.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
from dataclasses import dataclass
from typing import Any

from aiogram.filters import BaseFilter
from aiogram.types import Message

from shvatka.core.models import dto
from shvatka.core.services.organizers import get_by_player
from shvatka.infrastructure.db.dao.holder import HolderDao


@dataclass
class OrgFilter(BaseFilter):
"""
if multiple values provided used AND semantic,
except is_primary (if provided - only this checked)
and only_for_running_game
"""

can_spy: bool | None = None
can_see_log_keys: bool | None = None
can_validate_waivers: bool | None = None
is_primary: bool | None = None
only_for_running_game: bool = True

async def __call__( # noqa: C901
self,
message: Message,
game: dto.Game | None,
player: dto.Player,
dao: HolderDao,
) -> bool | dict[str, Any]:
if not game or not game.is_active():
return False
if self.only_for_running_game and not game.is_started():
return False
org = await get_by_player(player=player, game=game, dao=dao.organizer)
if org is None or org.deleted:
return False
if self.is_primary is not None:
return isinstance(org, dto.PrimaryOrganizer)
if self.can_spy is not None:
if self.can_spy != org.can_spy:
return False
if self.can_see_log_keys is not None:
if self.can_see_log_keys != org.can_see_log_keys:
return False
if self.can_validate_waivers is not None:
if self.can_validate_waivers != org.can_validate_waivers:
return False
return {"org": org}
4 changes: 2 additions & 2 deletions shvatka/tgbot/utils/router.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from aiogram import Router, Dispatcher
from aiogram.filters import Filter
from aiogram.dispatcher.event.handler import CallbackType
from aiogram.fsm.state import State
from aiogram.types import Message
from aiogram_dialog import StartMode, DialogManager
Expand All @@ -20,7 +20,7 @@ def disable_router_on_game(router: Router):


def register_start_handler(
*filters: Filter,
*filters: CallbackType,
state: State,
router: Router,
mode: StartMode = StartMode.NORMAL,
Expand Down

0 comments on commit f5d3317

Please sign in to comment.