From 08e7f4ee939e12f9fea1bad431e0c14e731c317a Mon Sep 17 00:00:00 2001 From: Andrey Gumirov Date: Sun, 1 May 2022 02:36:51 +0700 Subject: [PATCH] Fixed group add event --- blueprints/menu.py | 25 +++++++++++++++++++++---- blueprints/student.py | 10 ++++++++-- blueprints/teacher.py | 10 ++++++++-- blueprints/test.py | 6 +----- main.py | 2 -- middlewares/test_state_middleware.py | 7 ++++++- middlewares/user_data_middleware.py | 20 +++++++++++++++++--- 7 files changed, 61 insertions(+), 19 deletions(-) diff --git a/blueprints/menu.py b/blueprints/menu.py index e8926b0..4219361 100644 --- a/blueprints/menu.py +++ b/blueprints/menu.py @@ -1,12 +1,29 @@ -from vkwave.bots import DefaultRouter, SimpleBotEvent, simple_bot_message_handler +from vkwave.bots import DefaultRouter, SimpleBotEvent, simple_bot_message_handler, EventTypeFilter +from vkwave.types.bot_events import BotEventType + import locales menu_router = DefaultRouter() -@simple_bot_message_handler(menu_router,) +@menu_router.registrar.with_decorator( + EventTypeFilter(BotEventType.MESSAGE_NEW.value), +) async def menu(event: SimpleBotEvent): - return await event.answer( + sevent = SimpleBotEvent(event) + return await sevent.answer( message=locales.MENU, keyboard=locales.MENU_KB.get_keyboard(), - ) \ No newline at end of file + ) + + +@menu_router.registrar.with_decorator( + EventTypeFilter(BotEventType.GROUP_JOIN.value), +) +async def menu(event: SimpleBotEvent): + return await event.api_ctx.messages.send( + keyboard=locales.MENU_KB.get_keyboard(), + peer_id=event.object.object.user_id, + message=locales.MENU, + random_id=0 + ) diff --git a/blueprints/student.py b/blueprints/student.py index bf63b61..d1f29a9 100644 --- a/blueprints/student.py +++ b/blueprints/student.py @@ -1,10 +1,16 @@ -from vkwave.bots import DefaultRouter, SimpleBotEvent, simple_bot_message_handler, PayloadContainsFilter, BotEvent +from vkwave.bots import DefaultRouter, SimpleBotEvent, simple_bot_message_handler, PayloadContainsFilter, BotEvent, \ + EventTypeFilter +from vkwave.types.bot_events import BotEventType + import locales student_router = DefaultRouter() -@student_router.registrar.with_decorator(PayloadContainsFilter("student"),) +@student_router.registrar.with_decorator( + EventTypeFilter(BotEventType.MESSAGE_NEW.value), + PayloadContainsFilter("student"), +) async def student_menu(event: BotEvent): sevent = SimpleBotEvent(event) return await sevent.answer( diff --git a/blueprints/teacher.py b/blueprints/teacher.py index fe9e70c..c5f1c33 100644 --- a/blueprints/teacher.py +++ b/blueprints/teacher.py @@ -1,10 +1,16 @@ -from vkwave.bots import DefaultRouter, SimpleBotEvent, simple_bot_message_handler, PayloadContainsFilter, BotEvent +from vkwave.bots import DefaultRouter, SimpleBotEvent, simple_bot_message_handler, PayloadContainsFilter, BotEvent, \ + EventTypeFilter +from vkwave.types.bot_events import BotEventType + import locales teacher_router = DefaultRouter() -@teacher_router.registrar.with_decorator(PayloadContainsFilter("teacher"),) +@teacher_router.registrar.with_decorator( + EventTypeFilter(BotEventType.MESSAGE_NEW.value), + PayloadContainsFilter("teacher"), +) async def teacher_menu(event: BotEvent): sevent = SimpleBotEvent(event) return await sevent.answer( diff --git a/blueprints/test.py b/blueprints/test.py index f423094..7b05556 100644 --- a/blueprints/test.py +++ b/blueprints/test.py @@ -26,11 +26,6 @@ from util.redis_db import RedisDB test_router = DefaultRouter() -fsm = FiniteStateMachine() -test_router.registrar.add_default_filter(StateFilter(fsm, ..., ..., always_false=True)) -test_router.registrar.add_default_filter( - EventTypeFilter(BotEventType.MESSAGE_NEW.value)) # we don't want to write it in all handlers. - # # exiting from poll (works on any state) # @test_router.registrar.with_decorator( @@ -44,6 +39,7 @@ test_router.registrar.add_default_filter( # return "You are quited!" @test_router.registrar.with_decorator( + EventTypeFilter(BotEventType.MESSAGE_NEW.value), PayloadContainsFilter("test"), ) async def main_part_handle(event: BotEvent): diff --git a/main.py b/main.py index 6f7220f..deeb7ae 100644 --- a/main.py +++ b/main.py @@ -14,8 +14,6 @@ logging.basicConfig(level="DEBUG") bot = SimpleLongPollBot(Config.TOKEN, group_id=Config.GROUP_ID) -# nft_sender = NFTSender(bot.api_context) -# nft_sender.start() uploader = PhotoUploader(bot.api_context) Config().api_ctx = bot.api_context Config().uploader = uploader diff --git a/middlewares/test_state_middleware.py b/middlewares/test_state_middleware.py index 6cf5fed..0324f93 100644 --- a/middlewares/test_state_middleware.py +++ b/middlewares/test_state_middleware.py @@ -3,6 +3,7 @@ import logging from vkwave.bots import BaseMiddleware, BotEvent, MiddlewareResult, SimpleBotEvent, Storage from vkwave.bots.storage.types import Key +from vkwave.types.bot_events import MessageNewObject from db import DB, Candidate from util.redis_db import RedisDB @@ -12,7 +13,11 @@ storage = Storage() class TestStateMiddleware(BaseMiddleware): async def pre_process_event(self, event: BotEvent) -> MiddlewareResult: - user_id = event.object.object.message.from_id + if isinstance(event.object.object, MessageNewObject): + user_id = event.object.object.message.from_id + else: + return MiddlewareResult(True) + redis_test_state = RedisDB().get_state(user_id) logging.debug(event.object.object.message.payload) payload_json = json.loads(event.object.object.message.payload) if event.object.object.message.payload else {} diff --git a/middlewares/user_data_middleware.py b/middlewares/user_data_middleware.py index 759b182..41cb16e 100644 --- a/middlewares/user_data_middleware.py +++ b/middlewares/user_data_middleware.py @@ -1,19 +1,33 @@ import logging from vkwave.bots import BaseMiddleware, BotEvent, MiddlewareResult, SimpleBotEvent +from vkwave.types.bot_events import GroupJoinObject, MessageNewObject +from vkwave.types.objects import UsersUser from db import DB, Candidate +async def get_user(api_ctx, user_id): + raw_user = ( + await api_ctx.api_request("users.get", {"user_ids": user_id}) + )["response"][0] + return UsersUser(**raw_user) + + class UserMiddleware(BaseMiddleware): async def pre_process_event(self, event: BotEvent) -> MiddlewareResult: db = DB() - botevent = SimpleBotEvent(event) - user_id = event.object.object.message.from_id + + if isinstance(event.object.object, GroupJoinObject): + user_id = event.object.object.user_id + elif isinstance(event.object.object, MessageNewObject): + user_id = event.object.object.message.from_id + else: + return MiddlewareResult(True) user = db.get_user(user_id) if not user: - user_info = await botevent.get_user() + user_info = await get_user(event.api_ctx, user_id) logging.debug(f"Got user info: {user_info}") user = Candidate(id=user_id, sex=user_info.sex, name=user_info.first_name, last_name=user_info.last_name) db.add_candidate(user)