Exemple #1
0
 def run(self):
     vk_session = vk_api.VkApi(token=self.token)
     self.vk = vk_session.get_api()
     vk_longpoll = VkLongPoll(vk_session, wait=25)
     while True:
         self.__notify()
         for event in vk_longpoll.check():
             self.__event_handler(event)
Exemple #2
0
 def run(self, token):
     vk_session = vk_api.VkApi(token=self.token)
     vk_longpoll = VkLongPoll(vk_session, wait=25)
     self.vk = vk_session.get_api()
     self.osu_api = OSUApi(token)
     while True:
         self.save_users()
         self.check_notifications()
         for event in vk_longpoll.check():
             self.handle_event(event)
Exemple #3
0
    def poll(self, handler: Callable[[Event], None]) -> None:
        poll = VkLongPoll(self._vk)
        while True:
            try:
                events = poll.check()
            except ReadTimeout:
                logger.warning("Poll read timeout")
                continue

            for event in events:
                logger.debug("Received raw event: %s", event.raw)
                if event := self._create_event(event):
                    handler(event)
Exemple #4
0
class VkLongPollThread(Thread):
    def __init__(self, api, period):
        Thread.__init__(self, target=self.event_handler)
        self.vk_met = api.get_api()
        self.stop_flag = False
        self.longpoll = VkLongPoll(vk=api,
                                   mode=VkLongpollMode.GET_EXTENDED,
                                   preload_messages=True)
        self.period = period

    def event_handler(self):
        while (self.stop_flag == False):
            try:
                event_list = self.longpoll.check()
                for event in event_list:
                    if event.type == VkEventType.MESSAGE_NEW:
                        msg = event.message_data
                        user = self.vk_met.users.get(user_id=msg['from_id'])
                        print(user[0]['first_name'] + ' ' +
                              user[0]['last_name'] + ': ' + msg['text'])

                        if msg['peer_id'] == 2000000182 and (
                                anime_set.intersection(set(msg['text'].split(
                                )))) != set() and msg['from_id'] != 94734732:
                            self.vk_met.messages.send(peer_id=msg['peer_id'],
                                                      message='Привет =)',
                                                      random_id=randint(
                                                          0,
                                                          0xFFFFFFFFFFFFFFFF))

                        if (joke_set.intersection(set(msg['text'].split()))
                            ) != set() and msg['from_id'] != 94734732:
                            url = 'https://bash.im/random/'
                            r = requests.get(url)
                            i = r.text.find('<div class="text">')
                            k = r.text.find('</div>', i)
                            self.vk_met.messages.send(
                                peer_id=msg['peer_id'],
                                message=
                                'Анекдот:\n------------------------------------------------\n'
                                + html2text.html2text(r.text[i:k + 6]) +
                                '\n------------------------------------------------',
                                random_id=randint(0, 0xFFFFFFFFFFFFFFFF))

            except:
                print('error occured')

            sleep(self.period)

    def stop(self):
        self.stop_flag = True
Exemple #5
0
class VkontakteClass(IMessenger):
    def __init__(self, token: str):
        super().__init__(token)

        self.__session = vk_api.VkApi(token=token)
        self.__vkApi = self.__session.get_api()
        self.__longpoll = VkLongPoll(self.__session)

    def sendMessage(self, userId, message: str):
        self.__vkApi.messages.send(user_id=userId, message=message)

    def getLastMessages(self):
        result = {}
        events = self.__longpoll.check()

        for event in events:
            if event.type == VkEventType.MESSAGE_NEW and event.to_me:
                if event.user_id in result:
                    result[event.user_id].append(event.text)
                else:
                    result[event.user_id] = [event.text]
        return result
Exemple #6
0
class Game():
    def __init__(self):
        logger.logger()
        logger.log("Initialization...")
        str_const.set_fracs_list()
        vk_session = vk_api.VkApi(token=vk_token.token)

        self.vk = vk_session.get_api()
        self.longpoll = VkLongPoll(vk_session, wait=const.wait)
        self.is_running = True
        #self.counter = 0
        self.player = PlayerManager()
        self.database = LiteDB()
        self.quest = Quest()
        logger.log("Initialization complete!")

    def process(self):
        while self.is_running:
            self.quest.check_quest(self.vk, self.database)
            #logger.log("Begin check")
            events = self.longpoll.check()
            #logger.log("End check")
            if len(events) != 0:
                for i in range(len(events)):
                    event = events[i]
                    if event:
                        self._proc_event(event)

    def _proc_event(self, event):
        if not event.from_me:
            if event.type == VkEventType.MESSAGE_NEW and event.text:
                random.seed()
                #---------------------------------------------------------------stop
                self.is_running = self.player.stop(self.vk, event)
                #---------------------------------------------------------------stop
                self.player.event_handling(self.vk, event, self.database,
                                           self.quest)
Exemple #7
0
class QVkMessenger(QMessenger):
    """VC (vc.com) connector for qbot"""
    MAX_MESSAGE_LENGTH = 4096
    MAX_MESSAGE_LENGTH_FOR_LOG = 80

    def __init__(self, **config):
        QMessenger.__init__(self, VERSION=VERSION, **config)
        self.dvd_group_id = config['group_id']
        self.group_token = config['group_token']
        self.vk_session = vk_api.VkApi(token=self.group_token)
        self.vk = self.vk_session.get_api()
        self.vk_user = vk_api.VkApi(self.vk_session)
        self.lPoll = VkLongPoll(self.vk_session)
        self.errorTimeout = 5
        self.logger.debug('Init completed')

    def getMessages(self):
        events = self.lPoll.check()
        res = {'ok': True, 'messages': [], 'status': 'OK'}

        for event in events:
            #self.logger.debug("New event: type=%s, user_id=%s,text=%s,to_me='%s', from_me='%s', Attachments: %s" % (event.type, event.user_id, event.text, event.to_me, event.from_me, event.attachments))
            if event.type == VkEventType.MESSAGE_NEW and event.to_me:
                self.logger.debug(
                    "New event: type=%s, user_id=%s,text=%s,to_me='%s', from_me='%s', Attachments: %s"
                    % (event.type, event.user_id, event.text, event.to_me,
                       event.from_me, event.attachments))
                files = []
                caption = None
                try:
                    text = event.text
                except Exception as err:
                    self.logger.warning('Read message text failed: %s' % err)
                    text = None
                if len(event.attachments) > 0:
                    msg = self.vk.messages.getById(
                        message_ids=event.message_id)
                    atch_list = msg['items'][0]['attachments']
                    for f in atch_list:
                        type = f['type']
                        url = f[type]['url']
                        files.append({
                            'file_name': f[type]['title'],
                            'file_size': f[type]['size'],
                            'file_id': f[type]['id'],
                            'file_type': type,
                            'url': url
                        })
                message = {'text': text, 'caption': caption, 'files': files, 'user_id': event.user_id, 'message_id': str(event.message_id),\
                       'message_time': str(event.datetime), 'replyto': event.user_id, 'message':event}
                res['messages'].append(message)
        res['status'] = 'OK: %s messages' % len(res['messages'])
        return res

    def get_file(self, file, path=None):
        if not path:
            path = self.savedir
        fname = "%s/%s" % (os.path.normpath(path), file['file_name'])
        resp = requests.get(file['url'])
        if resp.ok:
            fil = open(fname, 'wb')
            sz = fil.write(resp.content)
            fil.close()
            res = "%s: %s/%s bytes" % (fname, sz, file['file_size'])
            self.logger.debug(res)
        else:
            res = '%s - error: %s' % (fname, resp.json())
            self.logger.error(res)
        return res

    def reply(self, msg, originalCommand):
        return self.sendMessage(msg, originalCommand['user_id'])

    def sendMessage(self, msg, to):
        i = 0
        self.sendStatusText = 'OK'
        try:
            while i <= len(msg):
                j = i + self.MAX_MESSAGE_LENGTH if i + self.MAX_MESSAGE_LENGTH <= len(
                    msg) else len(msg)
                self.vk.messages.send(user_id=to, message=msg[i:j])
                i += self.MAX_MESSAGE_LENGTH
        except Exception as err:
            self.sendStatusText = "Send message failed: %s" % (err)
            self.logger.error(self.sendStatusText)
        self.logger.debug('Message sent: %s' %
                          (msg[0:self.MAX_MESSAGE_LENGTH_FOR_LOG]))
Exemple #8
0
class Bot(object):
    def __init__(self, vk_session):
        self.logger_root = logging.getLogger("bot")
        self.logger_root.info("Bot was created")

        self.logger_messages = logging.getLogger("messages")

        self.vk_session = vk_session
        self.vk = self.vk_session.get_api()

        self.vk_methods = VkApiMethod(self.vk)

        self.longpoll = VkLongPoll(self.vk_session)

        self.database = UsersDatabase("containers/database.sqlite")

        self.months = [
            "января", "февраля", "марта", "апреля", "мая", "июня", "июля",
            "августа", "сентября", "октября", "ноября", "декабря"
        ]
        self.shifts = {"Первая смена": "1", "Вторая смена": "2"}

        self.irrelevant_data_message = "Нет актуальной информации. Попробуй " \
                                       "проверить позже, она обновляется в " \
                                       "6 и 11 часов до полудня."

        self.help_message = "Хочешь воспользоваться моими командами? Выбери " \
                            "одну из них при помощи клавиатуры или напиши " \
                            'мне "список команд".'

        self.list_of_commands = "Напиши мне команду, чтобы " \
                                "воспользоваться ей. \n" \
                                "Cписок и описание моих команд:\n" \
                                '"Получать уведомления"' \
                                "- я предложу вам выбрать смену, в " \
                                "которой вы обучаетесь, чтобы информировать " \
                                "вас об актировках при появлении информации " \
                                "о них.\n" \
                                '"Больше не получать"' \
                                "- я больше не буду присылать вам " \
                                "уведомления 😢😢😢\n" \
                                '"Актуальная информация"' \
                                "- я сообщу вам самую свежую информацию об " \
                                "актировках сегодня для обоих смен."

        self.last_update = []

        self.messages_callback = {
            "Получать уведомления об актировках": self.get_shift,
            "Получать уведомления": self.get_shift,
            "Первая смена": self.add_to_inform,
            "Вторая смена": self.add_to_inform,
            "Больше не получать уведомления": self.exclude_from_informing,
            "Больше не получать": self.exclude_from_informing,
            "Актуальная информация": self.inform_event
        }
        self.messages_answers = {"Список команд": self.list_of_commands}

        self.messages_callback = {
            self.text_processing(key): value
            for key, value in self.messages_callback.items()
        }

        self.messages_answers = {
            self.text_processing(key): value
            for key, value in self.messages_answers.items()
        }

    def listen(self):
        """
        Checks every event which bot can get, answers on messages
        """
        for event in self.longpoll.check():
            if event.type == VkEventType.MESSAGE_NEW and event.text \
                    and event.to_me:
                self.logger_messages.info("New message from %s" %
                                          str(event.peer_id))

                text = self.text_processing(event.text)

                if text in self.messages_callback:
                    self.messages_callback[text](event)
                elif text in self.messages_answers:
                    self.send_message(event, self.messages_answers[text])
                else:
                    self.help(event)

    def send_message(self, event, text):
        try:
            self.vk.messages.send(peer_id=event.peer_id,
                                  message=text,
                                  random_id=self.get_random_id())

        except Exception as exception:
            self.emergency(exception)

    def send_keyboard(self, event, message_, keyboard_):
        try:
            self.vk.messages.send(peer_id=event.peer_id,
                                  message=message_,
                                  keyboard=keyboard_,
                                  random_id=self.get_random_id())

        except Exception as exception:
            self.emergency(exception)

    def help(self, event):
        """
        Sends user keyboard with main commands.
        """
        keyboard_ = VkKeyboard(one_time=False)

        keyboard_.add_button("Получать уведомления об актировках",
                             color=VkKeyboardColor.PRIMARY)

        keyboard_.add_line()
        keyboard_.add_button("Больше не получать уведомления")

        keyboard_.add_line()
        keyboard_.add_button("Актуальная информация",
                             color=VkKeyboardColor.PRIMARY)

        self.send_keyboard(event, self.help_message, keyboard_.get_keyboard())

    def get_shift(self, event):
        keyboard_ = VkKeyboard(one_time=True)
        keyboard_.add_button("Первая смена")
        keyboard_.add_button("Вторая смена", color=VkKeyboardColor.PRIMARY)

        self.send_keyboard(event, "Выбери смену, в которой ты учишься",
                           keyboard_.get_keyboard())

    def add_to_inform(self, event):
        """
        Adds chat's or user's id to the database.
        """
        self.logger_messages.info("Attempt. Add user to inform list")

        success_message = """Теперь вы будете получать уведомления об 
        актировках."""
        decline_message = """Вы уже получаете уведомления об 
        актировках."""

        shift = int(self.shifts[event.text])
        user_subs = self.database.get_user(event.peer_id)

        if not user_subs:
            self.database.add_user(event.peer_id)
            user_subs = [False, False]

        if not user_subs[shift - 1]:
            self.logger_messages.info("The attempt was successful.")
            self.database.subscribe(event.peer_id, shift)
            self.send_message(event, success_message)

        else:
            self.logger_messages.info("Declined.")
            self.send_message(event, decline_message)

    def inform(self, update, shift):
        """
        Sends information message to every user/chat who/which had subscribed.
        """
        self.logger_root.info("Informing %s shift." % str(shift))

        if shift:
            date = update[0]
            date[1] = self.months[date[1] - 1]
            date = " ".join([str(i) for i in date])

            for user in self.database.get_all():
                user = {"id": user[0], 1: user[1], 2: user[2]}

                if user[shift]:
                    # Prevents sending message to user, who has banned bot
                    try:
                        self.vk.messages.send(peer_id=user["id"],
                                              message=date + "\n" +
                                              update[shift],
                                              random_id=self.get_random_id())

                    except vk_api.ApiError as exception:
                        self.logger_root.error(msg="Error: %s\n"
                                               "User was excluded "
                                               "from informing" % e.__str__())

                        # If user has banned bot, deletes his if from storage
                        self.database.delete(user["id"])
                        continue

    def inform_event(self, event):
        """
        Sends information message for one certain user/chat.
        """
        self.logger_messages.info("Information was requested")
        date = self.last_update[0] if self.last_update else False

        flag = False
        if [time.localtime()[2], time.localtime()[1]] == date:
            flag = True

        # If information is relevant
        if flag:
            """
            Message:
            1. <1st shift text>
            2. <2nd shift text>
            """
            message = self.last_update[1] + "\n" + self.last_update[2]
            self.send_message(event, message)

        else:
            self.send_message(event, self.irrelevant_data_message)

    def exclude_from_informing(self, event):
        """
        Delete chat's or user's id from container file.
        """
        self.logger_messages.info("User was excluded from informing")

        success_message = "Вы больше не будете получать уведомления об " \
                          "актировках."
        decline_message = "Вы и так не получаете уведомления."

        if self.database.get_user(event.peer_id):
            self.database.delete(event.peer_id)
            self.send_message(event, success_message)

        else:
            self.send_message(event, decline_message)

    def emergency(self, exception):
        """
        Sends emergency message to the creator.
        Also prints it and writes to the file
        """
        self.logger_root.error(
            logging.exception(
                exception=exception,
                msg=" ".join([type(exception).__name__,
                              exception.__str__()])))

        self.vk.messages.send(
            user_id=admin_id,
            message="Помоги своему чаду! Всё сломалось! "
            "Вот тип ошибки: "
            "{err_type}\n Вот сообщение ошибки:{err_msg}".format(
                err_type=type(exception).__name__,
                err_msg=exception.__str__()),
            random_id=self.get_random_id())

    @staticmethod
    def get_random_id():
        return randrange(0, 10**6)

    @staticmethod
    def key_by_value(dictionary, value):
        """
        If the dictionary contains two and more keys linked with given value,
        function returns first key.
        :return: key
        """

        return list(dictionary.keys())[list(dictionary.values()).index(value)]

    @staticmethod
    def text_processing(text):
        """
        Deletes spaces and punctuation marks from given text and
        :return: processed text
        """
        punctuation_marks = [".", ",", "-", "_", "!", "?", ";", ":", "'", '"']

        text = text.lower()
        # Delete spaces from lowercase text
        text = text.replace(" ", "")

        for mark in punctuation_marks:
            text = text.replace(mark, "")

        return text
Exemple #9
0
class Bot(object):
    def __init__(self, vk_session):
        self.vk_session = vk_session
        self.vk = self.vk_session.get_api()

        self.vk_methods = VkApiMethod(self.vk_session)

        self.longpoll = VkLongPoll(self.vk_session)

        self.messages_callback = {
            "мои напоминания": self.show_timetable,
            "напомнить": self.plan_an_event
        }

        self.messages_answers = {}

        self.unknown_message = "Извини, я тебя не понимаю. Напиши мне" \
                               "'мои напоминания' или 'напомнить'"

        self.messages_callback = {
            process_text(key): value
            for key, value in self.messages_callback.items()
        }

        self.messages_answers = {
            process_text(key): value
            for key, value in self.messages_answers.items()
        }

        self.events_to_plan = []
        self.event_pattern = {
            "peer_id": False,
            "time": False,
            "message_text": False
        }

    def listen(self):
        """Listens for events (incoming messages).
        """
        for event in self.longpoll.check():
            if event.type == VkEventType.MESSAGE_NEW and event.text \
                    and event.to_me:

                if process_text(event.text) in self.messages_answers:
                    self.send_message(
                        event.peer_id,
                        self.messages_answers[process_text(event.text)])

                elif process_text(event.text) in self.messages_callback:
                    self.messages_callback[process_text(event.text)]()

                else:
                    self.send_message(event.peer_id, self.unknown_message)

    def send_message(self, peer_id, msg_text):
        """Sends text message to user.
        """
        try:
            self.vk.messages.send(peer_id=peer_id,
                                  message=msg_text,
                                  random_id=randrange(0, 10**6))

        except Exception as exception:
            self.emergency(exception)

    def plan_an_event(self, peer_id, message):
        """TODO plan: look at notebook"""
        for event in self.events_to_plan:
            if peer_id in event:
                break

        else:
            self.events_to_plan.append(copy(self.event_pattern))
            self.events_to_plan[-1]["peer_id"] = peer_id

    def add_event_to_timetable(self, time_, message):
        pass

    def show_timetable(self):
        pass

    def emergency(self, exception):
        """Shows, that an error was raised. Sends administrator a message,
        saves exception description to logs.
        """
        # TODO logger, admin id
        self.send_message(
            admin_id, "Всё сломалось! "
            "Вот тип ошибки: "
            "{err_type}\n Вот сообщение ошибки:{err_msg}".format(
                err_type=type(exception).__name__,
                err_msg=exception.__str__()))
Exemple #10
0

def play(user_id):


    c.execute("SELECT user_id FROM play   WHERE user_id = %d" % user_id)
    result88 = c.fetchone()
    return result88[0]



while True:



    for event in longpoll.check():


        if event.type == VkEventType.MESSAGE_NEW  and event.text and event.to_me :

            if not check_if_exists(event.user_id):
                register_new_user(event.user_id)

            if event.text.lower() == "начать":
                vk.messages.send(
                    user_id=event.user_id,
                    message="Привет!\nХочешь ли ты получать уведомления❓",
                    keyboard=open("uesorno.json", "r", encoding="UTF-8").read(),
                    random_id=random_id()
                )