Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#82 #88

Merged
merged 4 commits into from
Jun 9, 2024
Merged

#82 #88

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
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