示例#1
0
    def __init__(self, action: ControllerAction):
        self._controller_action = action
        self._vk_action = self._controller_action.vk_action
        self._vk_core = self._vk_action.get_api_core()
        self._vk_listener = LongPollListener(self._vk_core)

        # Handler prepare for any event control context
        self._any_controller = AnyController(self._controller_action)

        self._any_event_handlers = methods_with_decorator(
            AnyController, "InvokeOnAnyEvent")
        self._any_message_handlers = methods_with_decorator(
            AnyController, "InvokeOnAnyMessage")

        # Handler prepare for users message control context
        self._user_msg_controller = UserMsgController(self._controller_action)

        self._user_msg_handlers = methods_with_decorator(
            UserMsgController, "HandleMessage")
        self._user_required_level_handlers = methods_with_decorator(
            UserMsgController, "RequiredLvl")
        self._user_auth_handlers = methods_with_decorator(
            UserMsgController, "Authorized")

        # Handler prepare for chats messages control context
        self._chat_controller = ChatMsgController(self._controller_action)

        self._chat_handlers = methods_with_decorator(ChatMsgController,
                                                     "HandleMessage")
        self._chat_required_level_handlers = methods_with_decorator(
            ChatMsgController, "RequiredLvl")
        self._chat_auth_handlers = methods_with_decorator(
            ChatMsgController, "Authorized")

        self._user_wrr = UserDbWorker()
示例#2
0
    def test_delete(self):
        users_worker = UserDbWorker()
        _old_list = users_worker.select_all()

        self.assertTrue([item for item in _old_list if item['vk_id'] == 22813311] != [])
        self.assertTrue(users_worker.delete(22813311))
        _new_list = users_worker.select_all()

        for _old, _new in zip(_old_list, _new_list):
            print(_old, ' | ', _new)
        self.assertEqual(len(_old_list), len(_new_list) + 1)
        self.assertEqual([item for item in _new_list if item['vk_id'] == 22813311], [])
示例#3
0
    def test_insert(self):
        _database = DbConnection('localhost', 'KartonBot', 'root', 'zxc123', 3306)

        users_worker = UserDbWorker()
        users_worker.insert(23, 1234567, 'mobyDickDuck', 1000.1)

        _new_data = _database.select_where('users', {'vk_id': 1234567})
        print(_new_data[0])
        self.assertEqual(_new_data[0][1], 23)
        self.assertEqual(_new_data[0][2], 1234567)
        self.assertEqual(_new_data[0][3], 'mobyDickDuck')
        self.assertEqual(_new_data[0][4], 1000.1)
示例#4
0
    def test_select_all(self):
        users_worker = UserDbWorker()
        data_from_worker = users_worker.select_all()

        _database = DbConnection('localhost', 'KartonBot', 'root', 'zxc123', 3306)
        _pure_data = _database.select_all_table('users', ['access_level', 'vk_id', 'association', 'lvl_exp'])
        for taken_item, action in zip(_pure_data, data_from_worker):
            print(taken_item, " | ", action)
            self.assertEqual(taken_item[0], action['access_level'])
            self.assertEqual(taken_item[1], action['vk_id'])
            self.assertEqual(taken_item[2], action['association'])
            self.assertEqual(taken_item[3], action['lvl_exp'])
示例#5
0
    def test_update(self):
        _database = DbConnection('localhost', 'KartonBot', 'root', 'zxc123', 3306)
        _old_row = _database.select_where('users', {'vk_id': 376359640})[0]

        self.assertNotEqual(_old_row[3], 'дима')
        self.assertEqual(_old_row[3], 'dima')

        users_worker = UserDbWorker()
        users_worker.update(376359640, association='дима')

        _new_row = _database.select_where('users', {'vk_id': 376359640})[0]

        self.assertEqual(_new_row[3], 'дима')
示例#6
0
class LongPollHandler:
    def __init__(self, action: ControllerAction):
        self._controller_action = action
        self._vk_action = self._controller_action.vk_action
        self._vk_core = self._vk_action.get_api_core()
        self._vk_listener = LongPollListener(self._vk_core)

        # Handler prepare for any event control context
        self._any_controller = AnyController(self._controller_action)

        self._any_event_handlers = methods_with_decorator(
            AnyController, "InvokeOnAnyEvent")
        self._any_message_handlers = methods_with_decorator(
            AnyController, "InvokeOnAnyMessage")

        # Handler prepare for users message control context
        self._user_msg_controller = UserMsgController(self._controller_action)

        self._user_msg_handlers = methods_with_decorator(
            UserMsgController, "HandleMessage")
        self._user_required_level_handlers = methods_with_decorator(
            UserMsgController, "RequiredLvl")
        self._user_auth_handlers = methods_with_decorator(
            UserMsgController, "Authorized")

        # Handler prepare for chats messages control context
        self._chat_controller = ChatMsgController(self._controller_action)

        self._chat_handlers = methods_with_decorator(ChatMsgController,
                                                     "HandleMessage")
        self._chat_required_level_handlers = methods_with_decorator(
            ChatMsgController, "RequiredLvl")
        self._chat_auth_handlers = methods_with_decorator(
            ChatMsgController, "Authorized")

        self._user_wrr = UserDbWorker()

    def _send_call_error_chat(self, chat_id: int, msg: str):
        return self._vk_action.send_message_chat(chat_id=chat_id,
                                                 message="Call error: " + msg)

    def _send_call_error_to_user(self, user_id: int, msg: str):
        return self._vk_action.send_message(type_id="user_id",
                                            id=user_id,
                                            message=msg)

    def is_user_registered(self, user_id: int) -> bool:
        return self._user_wrr.contains(user_id)

    async def start_handle(self):
        for event in self._vk_listener.listen():
            if 'type' in event and 'object' in event and 'group_id' in event and 'event_id' in event:
                vk_event = VkEvent(event)
                await self.__handle_any_event(vk_event)
                if vk_event.is_message_new_event():
                    await self.__handle_any_message(vk_event)  # any message
                    obj = event['object']
                    if 'message' in obj:
                        msg = obj['message']
                        if 'from_id' in msg and 'text' in msg and 'peer_id' in msg and 'attachments' in msg:
                            if vk_event.is_message_new_event():
                                new_message_event = vk_event.to_message_new_event(
                                )
                                if new_message_event.from_chat():
                                    await self.__find_chat_handler_invoke(
                                        new_message_event.
                                        to_chat_new_msg_event())
                                elif new_message_event.from_user():
                                    await self.__find_user_msg_handler_invoke(
                                        new_message_event.
                                        to_user_new_msg_event())

    # region any_handlers

    async def __handle_any_message(self, vk_event: VkEvent):
        for _handler in self._any_message_handlers:
            await getattr(self._any_controller, _handler[0])(vk_event)

    async def __handle_any_event(self, vk_event: VkEvent):
        for _handler in self._any_event_handlers:
            await getattr(self._any_controller, _handler[0])(vk_event)

    # end region any_handlers

    # region chat_handlers

    # TODO test it
    async def __find_chat_handler_invoke(self, chat_event: VkNewMsgChatEvent):
        for _handler in self._chat_handlers:
            if 'msg' in _handler[1]:  # if we wont to explicit use all message
                msg_handle = _handler[1].split('=')[1].replace(
                    '\"', '').replace(' ', '').replace('\'', '')

                if msg_handle == chat_event.msg_text:
                    await self.__check_for_chat_annotation_and_invoke(
                        _handler[0], chat_event)
                    break
            elif 'first_word' in _handler[1]:  # explicit first-word handler
                word_handle = _handler[1].split("first_word=")[1].replace(' ', '').split(",")[0] \
                    .replace('"', '').replace("'", "")

                words_split = chat_event.msg_text.split(" ")
                if words_split[0] == word_handle:
                    if 'words_length' in _handler[1]:
                        word_require_len = _handler[1].split(
                            "words_length=")[1].replace(' ', '').split(",")[0]
                        if int(word_require_len) == len(words_split):
                            await self.__check_for_chat_annotation_and_invoke(
                                _handler[0], chat_event)
                            break
                    else:
                        await self.__check_for_chat_annotation_and_invoke(
                            _handler[0], chat_event)
                        break
            elif 'first_word' in _handler[
                    1] and _handler in self._chat_handlers:
                raise Exception(
                    "Cannot explicit cast part of message and message in one expression!"
                )

    async def __check_for_chat_annotation_and_invoke(
            self, fn_name: str, chat_event: VkNewMsgChatEvent):
        if fn_name in list(item[0] for item in self._chat_auth_handlers):
            await self.__invoke_auth_handler(fn_name, chat_event)

        elif fn_name in list(item[0]
                             for item in self._chat_required_level_handlers):
            await self.__invoke_required_lvl_handler(fn_name, chat_event)

        else:
            await self.__invoke_base_handler(fn_name, chat_event)

    async def __invoke_auth_handler(self, fn_name: str,
                                    chat_event: VkNewMsgChatEvent):
        if self.is_user_registered(chat_event.msg_from_id):
            await getattr(self._chat_controller, fn_name)(chat_event)
        else:
            self._send_call_error_chat(
                chat_event.msg_peer_id - int(2E9),  # TODO refactor it
                """комманда доступна только для 
                                          зарегестрированных 
                                          пользователей""")

    async def __invoke_required_lvl_handler(self, fn_name: str,
                                            chat_event: VkNewMsgChatEvent):
        curr_u_lvl = self._user_wrr.first_or_default(chat_event.msg_from_id)
        if curr_u_lvl is not None:
            curr_u_lvl = curr_u_lvl[1]
        else:
            self._send_call_error_chat(
                chat_event.msg_peer_id - int(2E9),  # TODO refactor it
                """комманда доступна только для 
                                       зарегестрированных 
                                       пользователей c повышенным уровнем доступа"""
            )
        lvl_handle = [
            handler_item for i, handler_item in enumerate(
                self._chat_required_level_handlers)
            if handler_item[0] == fn_name
        ][0]
        needed_lvl = int(lvl_handle[1].split('=')[1])
        if curr_u_lvl >= needed_lvl:
            await getattr(self._chat_controller, fn_name)(chat_event)
        else:
            self._send_call_error_chat(
                chat_event.msg_peer_id - int(2E9),  # TODO refactor it
                """Нет доступа к команде: required lvl = {0},
                                            {1} taken, {0} > {1}""".format(
                    needed_lvl, curr_u_lvl))

    async def __invoke_base_handler(self, fn_name: str,
                                    chat_event: VkNewMsgChatEvent):
        await getattr(self._chat_controller, fn_name)(chat_event)

    # region end chat_handlers

    # region for user_messages_handler

    # TODO test it
    async def __find_user_msg_handler_invoke(self,
                                             user_event: VkNewMsgUserEvent):
        for _handler in self._user_msg_handlers:
            if 'msg' in _handler[1]:  # if we wont to explicit use all message
                msg_handle = _handler[1].split('=')[1].replace(
                    '\"', '').replace(' ', '').replace('\'', '')

                if msg_handle == user_event.msg_text:
                    await self.__check_for_user_annotation_and_invoke(
                        _handler[0], user_event)
            elif 'first_word' in _handler[1]:  # explicit first-word handler
                word_handle = _handler[1].split("first_word=")[1].replace(' ', '').split(",")[0] \
                    .replace('"', '').replace("'", "")

                words_split = user_event.msg_text.split(" ")
                if words_split[0] == word_handle:
                    if 'words_length' in _handler[1]:
                        word_require_len = _handler[1].split(
                            "words_length=")[1].replace(' ', '').split(",")[0]
                        if int(word_require_len) == len(words_split):
                            await self.__check_for_user_annotation_and_invoke(
                                _handler[0], user_event)
                    else:
                        await self.__check_for_user_annotation_and_invoke(
                            _handler[0], user_event)

            elif 'first_word' in _handler[
                    1] and _handler in self._user_msg_handlers:
                raise Exception(
                    "Cannot explicit cast part of message and message in one expression!"
                )

    async def __check_for_user_annotation_and_invoke(
            self, fn_name: str, user_event: VkNewMsgUserEvent):

        if fn_name in list(item[0] for item in self._user_auth_handlers):
            await self.__invoke_auth_handler_user(fn_name, user_event)

        elif fn_name in list(item[0]
                             for item in self._user_required_level_handlers):
            await self.__invoke_required_lvl_handler_user(fn_name, user_event)

        else:
            await self.__invoke_base_handler_user(fn_name, user_event)

    async def __invoke_auth_handler_user(self, fn_name: str,
                                         user_event: VkNewMsgUserEvent):
        if self._user_wrr.contains(user_event.msg_from_id):
            await getattr(self._user_msg_controller, fn_name)(user_event)

        else:
            self._send_call_error_to_user(
                user_event.msg_from_id, 'комманда доступна только для ' +
                'зарегестрированных пользователей')

    async def __invoke_required_lvl_handler_user(
            self, fn_name: str, user_event: VkNewMsgUserEvent):
        curr_u_lvl = self._user_wrr.first_or_default(user_event.msg_from_id)
        if curr_u_lvl is not None:
            curr_u_lvl = curr_u_lvl[1]
        else:
            self._send_call_error_to_user(
                user_event.msg_from_id,
                'комманда доступна только для зарегестрированных ' +
                'пользователей c повышенным уровнем доступа')

        lvl_handle = [
            v for i, v in enumerate(self._user_required_level_handlers)
            if v[0] == fn_name
        ][0]
        needed_lvl = int(lvl_handle[1].split('=')[1])
        if curr_u_lvl >= needed_lvl:
            await getattr(self._user_msg_controller, fn_name)(user_event)
        else:
            self._send_call_error_to_user(
                user_event.msg_from_id,
                """Нет доступа к команде: required lvl = {0},
                                            {1} taken, {0} > {1}""".format(
                    needed_lvl, curr_u_lvl))

    async def __invoke_base_handler_user(self, fn_name: str,
                                         user_event: VkNewMsgUserEvent):
        await getattr(self._user_msg_controller, fn_name)(user_event)
示例#7
0
 def test_contains(self):
     users_worker = UserDbWorker()
     #users_worker.insert(10, 98712364, 'html', 7777)
     self.assertTrue(users_worker.contains(98712364))
     self.assertFalse(users_worker.contains(213))
示例#8
0
 def load_users_list(self) -> list:
     user_worker = UserDbWorker()
     return user_worker.select_all()