Skip to content

Commit

Permalink
Make working only in private chat.
Browse files Browse the repository at this point in the history
  • Loading branch information
blvdek committed Jul 9, 2024
1 parent 4d616f2 commit a0b9b3c
Show file tree
Hide file tree
Showing 36 changed files with 87 additions and 225 deletions.
2 changes: 1 addition & 1 deletion bot/core/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ class Nextcloud(BaseModel):
"""

protocol: str = "https"
host: str = ""
host: str
port: int = 80
chunksize: int = MIN_CHUNK_SIZE
overwrite: Overwrite | None = None
Expand Down
4 changes: 2 additions & 2 deletions bot/filters/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
"""Custom filters for handling incoming updates in bot."""

from .authorization_filter import AuthorizedFilter
from .from_user_filter import FromUserFilter
from .only_private_filter import OnlyPrivateFilter

__all__ = (
"AuthorizedFilter",
"FromUserFilter",
"OnlyPrivateFilter",
)
4 changes: 2 additions & 2 deletions bot/filters/authorization_filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ class AuthorizedFilter(BaseFilter):
"""

async def __call__(self, event: TelegramObject, uow: UnitOfWork, i18n: I18nContext) -> bool:
"""Checks if the user is authorized."""
"""Check if the user is authorized."""
if not isinstance(event, Message):
msg = "This filter is only usable with 'Message' event type."
msg = "'AuthorizedFilter' is only usable with 'Message' event type."
raise TypeError(msg)
if event.from_user is None:
msg = "Event object must have the 'from_user' attribute."
Expand Down
34 changes: 0 additions & 34 deletions bot/filters/from_user_filter.py

This file was deleted.

19 changes: 19 additions & 0 deletions bot/filters/only_private_filter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
"""Authorization filter."""

from aiogram.filters import BaseFilter
from aiogram.types import Message, TelegramObject
from aiogram_i18n import I18nContext


class OnlyPrivateFilter(BaseFilter):
"""Filter to check if the event is a private message or a callback query in a private chat."""

async def __call__(self, event: TelegramObject, i18n: I18nContext) -> bool:
"""Check chat is private."""
if not isinstance(event, Message):
msg = "'OnlyPrivateFilter' is only usable with 'Message' event type."
raise TypeError(msg)
if event.chat.type != "private":
await event.answer(text=i18n.get("only-private"))
return False
return True
6 changes: 0 additions & 6 deletions bot/handlers/_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ def get_fsnode_msg(
i18n: I18nContext,
fsnode: FsNode,
attached_fsnodes: list[FsNode],
from_user_id: int,
**kwargs: Any,
) -> tuple[str, InlineKeyboardMarkup]:
text = i18n.get(
Expand All @@ -74,7 +73,6 @@ def get_fsnode_msg(
reply_markup = FsNodeMenuBoard(
fsnode=fsnode,
attached_fsnodes=attached_fsnodes,
from_user_id=from_user_id,
**kwargs,
).get_kb()
return text, reply_markup
Expand All @@ -84,7 +82,6 @@ def get_trashbin_msg(
i18n: I18nContext,
trashbin: list[FsNode],
trashbin_size: int,
from_user_id: int,
**kwargs: Any,
) -> tuple[str, InlineKeyboardMarkup | None]:
if trashbin == []:
Expand All @@ -110,7 +107,6 @@ def get_trashbin_msg(
text = f"{trashbin_text}\n{fsnodes_text}"
reply_markup = TrashbinBoard(
fsnodes=trashbin,
from_user_id=from_user_id,
**kwargs,
).get_kb()
return text, reply_markup
Expand All @@ -120,7 +116,6 @@ def get_search_msg(
i18n: I18nContext,
query: str,
fsnodes: list[FsNode],
from_user_id: int,
**kwargs: Any,
) -> tuple[str, InlineKeyboardMarkup | None]:
if fsnodes == []:
Expand All @@ -137,7 +132,6 @@ def get_search_msg(
reply_markup = SearchBoard(
query=query,
fsnodes=fsnodes,
from_user_id=from_user_id,
**kwargs,
).get_kb()
return text, reply_markup
3 changes: 2 additions & 1 deletion bot/handlers/auth/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from aiogram.filters.command import Command

from .auth import auth
from bot.filters import OnlyPrivateFilter
from bot.middlewares import NextcloudMD, UnitOfWorkMD


Expand All @@ -17,6 +18,6 @@ def auth_router() -> Router:
router.message.outer_middleware(UnitOfWorkMD())
router.message.outer_middleware(NextcloudMD())

router.message.register(auth, Command("auth"))
router.message.register(auth, Command("auth"), OnlyPrivateFilter())

return router
3 changes: 0 additions & 3 deletions bot/handlers/auth/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,6 @@ async def auth(
if await uow.users.get_by_id(msg_from_user.id):
return await message.reply(text=i18n.get("already-authorized"), reply_markup=menu_board())

if message.chat.type != "private":
return await message.reply(text=i18n.get("only-private"))

init = await nc.loginflow_v2.init(user_agent=settings.appname)

url = overwrite_url(init.login)
Expand Down
4 changes: 2 additions & 2 deletions bot/handlers/menu/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from .logout import logout, logout_cancel, logout_confirm
from .search import search_router
from .trashbin import trashbin_router
from bot.filters import AuthorizedFilter
from bot.filters import AuthorizedFilter, OnlyPrivateFilter
from bot.keyboards.callback_data_factories import LogoutActions, LogoutData
from bot.middlewares import NextcloudMD, UnitOfWorkMD

Expand All @@ -27,7 +27,7 @@ def menu_router() -> Router:
router.callback_query.outer_middleware.register(UnitOfWorkMD())
router.callback_query.outer_middleware.register(NextcloudMD())

router.message.register(logout, Command("logout"), AuthorizedFilter())
router.message.register(logout, Command("logout"), AuthorizedFilter(), OnlyPrivateFilter())
router.callback_query.register(
logout_confirm,
LogoutData.filter(F.action == LogoutActions.CONFIRM),
Expand Down
38 changes: 11 additions & 27 deletions bot/handlers/menu/fsnode/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
)
from .pag import pag
from .select import select
from bot.filters import AuthorizedFilter, FromUserFilter
from bot.filters import AuthorizedFilter, OnlyPrivateFilter
from bot.keyboards.callback_data_factories import FsNodeData, FsNodeMenuActions, FsNodeMenuData
from bot.states import FsNodeMenuStatesGroup

Expand All @@ -33,13 +33,17 @@ def fsnode_menu_router() -> Router:
router = Router()

# Menu block.
router.message.register(menu, LazyFilter("fsnode-menu-button"), AuthorizedFilter())
router.message.register(
menu,
LazyFilter("fsnode-menu-button"),
AuthorizedFilter(),
OnlyPrivateFilter(),
)

# Cancel block.
router.callback_query.register(
cancel_callback,
FsNodeMenuData.filter(F.action == FsNodeMenuActions.CANCEL),
FromUserFilter(FsNodeMenuData),
)
router.message.register(
cancel_message,
Expand All @@ -53,76 +57,56 @@ def fsnode_menu_router() -> Router:
)

# New fsnode block.
router.callback_query.register(
new,
FsNodeMenuData.filter(F.action == FsNodeMenuActions.NEW),
FromUserFilter(FsNodeMenuData),
)
router.callback_query.register(new, FsNodeMenuData.filter(F.action == FsNodeMenuActions.NEW))

router.callback_query.register(
upload_start,
FsNodeMenuData.filter(F.action == FsNodeMenuActions.UPLOAD),
FromUserFilter(FsNodeMenuData),
)
router.message.register(
upload,
FsNodeMenuStatesGroup.UPLOAD,
F.content_type.in_({ContentType.DOCUMENT}),
)
router.message.register(
upload_incorrectly,
FsNodeMenuStatesGroup.UPLOAD,
)
router.message.register(upload_incorrectly, FsNodeMenuStatesGroup.UPLOAD)

router.callback_query.register(
mkdir_start,
FsNodeMenuData.filter(F.action == FsNodeMenuActions.MKDIR),
FromUserFilter(FsNodeMenuData),
)
router.message.register(
mkdir,
FsNodeMenuStatesGroup.MKDIR,
F.text.regexp(r"^[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9]?$"),
)
router.message.register(
incorrectly_mkdir,
FsNodeMenuStatesGroup.MKDIR,
)
router.message.register(incorrectly_mkdir, FsNodeMenuStatesGroup.MKDIR)

# Pagination block.
router.callback_query.register(
pag,
FsNodeMenuData.filter(
F.action.in_({FsNodeMenuActions.PAG_BACK, FsNodeMenuActions.PAG_NEXT}),
),
FromUserFilter(FsNodeMenuData),
)

# Delete block.
router.callback_query.register(
delete,
FsNodeMenuData.filter(F.action == FsNodeMenuActions.DELETE),
FromUserFilter(FsNodeMenuData),
)
router.callback_query.register(
delete_confirm,
FsNodeMenuData.filter(F.action == FsNodeMenuActions.DELETE_CONFIRM),
FromUserFilter(FsNodeMenuData),
)

# Download block.
router.callback_query.register(
download,
FsNodeMenuData.filter(F.action == FsNodeMenuActions.DOWNLOAD),
FromUserFilter(FsNodeMenuData),
)

# Back block.
router.callback_query.register(
back,
FsNodeMenuData.filter(F.action == FsNodeMenuActions.BACK),
FromUserFilter(FsNodeMenuData),
)
router.callback_query.register(back, FsNodeMenuData.filter(F.action == FsNodeMenuActions.BACK))

# Select.
router.callback_query.register(select, FsNodeData.filter())
Expand Down
2 changes: 1 addition & 1 deletion bot/handlers/menu/fsnode/back.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ async def back(
except FsNodeNotFoundError:
return await query_msg.edit_text(text=i18n.get("fsnode-not-found"))

text, reply_markup = get_fsnode_msg(i18n, srv.fsnode, srv.attached_fsnodes, query.from_user.id)
text, reply_markup = get_fsnode_msg(i18n, srv.fsnode, srv.attached_fsnodes)
with suppress(TelegramBadRequest):
msg = await query_msg.edit_text(text=text, reply_markup=reply_markup)
return msg
6 changes: 1 addition & 5 deletions bot/handlers/menu/fsnode/cancel.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
from aiogram.exceptions import TelegramBadRequest
from aiogram.fsm.context import FSMContext
from aiogram.types import CallbackQuery, Message
from aiogram.types import User as TgUser
from aiogram_i18n import I18nContext
from nc_py_api import AsyncNextcloud

Expand Down Expand Up @@ -45,7 +44,6 @@ async def cancel_callback(
i18n,
srv.fsnode,
srv.attached_fsnodes,
query.from_user.id,
page=callback_data.page,
)
with suppress(TelegramBadRequest):
Expand All @@ -66,8 +64,6 @@ async def cancel_message(
:param i18n: Internationalization context.
:param nc: AsyncNextcloud.
"""
msg_from_user = cast(TgUser, message.from_user)

data = await state.get_data()

try:
Expand All @@ -81,5 +77,5 @@ async def cancel_message(
menu_text = i18n.get("cancel")
await message.reply(text=menu_text, reply_markup=menu_reply_markup)

text, reply_markup = get_fsnode_msg(i18n, srv.fsnode, srv.attached_fsnodes, msg_from_user.id)
text, reply_markup = get_fsnode_msg(i18n, srv.fsnode, srv.attached_fsnodes)
return await message.reply(text=text, reply_markup=reply_markup)
7 changes: 1 addition & 6 deletions bot/handlers/menu/fsnode/delete.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,7 @@ async def delete(
except FsNodeNotFoundError:
return await query_msg.edit_text(text=i18n.get("fsnode-not-found"))

reply_markup = fsnode_delete_board(
fsnode=srv.fsnode,
from_user_id=query.from_user.id,
page=callback_data.page,
)
reply_markup = fsnode_delete_board(fsnode=srv.fsnode, page=callback_data.page)
return await query_msg.edit_text(
text=i18n.get("fsnode-delete", name=srv.fsnode.name),
reply_markup=reply_markup,
Expand Down Expand Up @@ -74,7 +70,6 @@ async def delete_confirm(
i18n,
prev_srv.fsnode,
prev_srv.attached_fsnodes,
query.from_user.id,
page=callback_data.page,
)
with suppress(TelegramBadRequest):
Expand Down
6 changes: 1 addition & 5 deletions bot/handlers/menu/fsnode/menu.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
"""Fsnode menu handler."""

from typing import cast

from aiogram.types import Message
from aiogram.types import User as TgUser
from aiogram_i18n import I18nContext
from nc_py_api import AsyncNextcloud

Expand All @@ -21,12 +19,10 @@ async def menu(message: Message, i18n: I18nContext, nc: AsyncNextcloud) -> Messa
:param i18n: Internationalization context.
:param nc: AsyncNextcloud.
"""
msg_from_user = cast(TgUser, message.from_user)

try:
srv = await RootFsNodeService.create_instance(nc)
except FsNodeNotFoundError:
return await message.reply(text=i18n.get("fsnode-not-found"))

text, reply_markup = get_fsnode_msg(i18n, srv.fsnode, srv.attached_fsnodes, msg_from_user.id)
text, reply_markup = get_fsnode_msg(i18n, srv.fsnode, srv.attached_fsnodes)
return await message.reply(text=text, reply_markup=reply_markup)
Loading

0 comments on commit a0b9b3c

Please sign in to comment.