Пример #1
0
    def do_requests_list(self, filename="request_list.json"):
        data = JSONFile.read_json(filename)
        for request_type in data["request"]:
            index = 0
            max_value_index = len(data['request'][request_type])
            if request_type == "swap":
                while index < max_value_index:
                    swap_c = data['request'][request_type][index].split()
                    cmd = "$$swap " + swap_c[0] + " " + swap_c[1]

                    self.ids[JSONFile.get_vkid_by_id(
                        swap_c[1], self.group_file_name)].command(cmd)

                    del data['request'][request_type][index]
                    max_value_index -= 1

                    index += 1

                    if index == max_value_index:
                        break
            elif request_type == "send2all":
                if len(data['request']['send2all']) > 0:
                    self.spam.send_spam(data['request']['send2all'])
                    del data['request']['send2all'][0]

        JSONFile.set_json_data(data, filename)
Пример #2
0
    def start(self):
        # Слушаем сервер
        for event in self.longpoll.listen():
            self.do_requests_list()
            # Новое сообщение
            if event.type == VkBotEventType.MESSAGE_NEW:

                if str(event.object.from_id) not in self.ids:
                    self.ids[str(event.object.from_id)] = Assistant(
                        self.vk_s, event.object.from_id,
                        JSONFile.get_id_by_vkid(str(event.object.from_id),
                                                self.group_file_name),
                        self.group_file_name, True)

                if event.group_id:
                    pass

                if True:

                    if event.object.id == 0:
                        self.messenger.send_message(
                            event.object.from_id,
                            "Сообщения в группе запрещены. "
                            "Пожалуйста, пишите в личные сообщения)))")
                    else:
                        self.messenger.send_message_by_event(
                            event, from_id=event.object.from_id)
Пример #3
0
 def send_spam(self,
               msg: str,
               exceptions_id: list = [],
               exceptions_vkid=[]):
     for vkid in self.ids:
         if vkid in exceptions_vkid:
             pass
         elif JSONFile.get_id_by_vkid(
                 vkid, self.group_file_name) in exceptions_id:
             pass
         elif vkid is None:
             pass
         elif not JSONFile.read_json(self.group_file_name)["Persons"][
                 self.ids[vkid].isu_id]['settings']['4all_msg']:
             pass
         else:
             self.messenger.send_message(vkid, msg)
Пример #4
0
    def _set_persons(self, filename):
        data = JSONFile.read_json(filename)
        res = {}
        for info in data['Persons']:
            res[data["Persons"][info]['vkid']] = Assistant(
                self.vk_s, data["Persons"][info]['vkid'], info,
                self.group_file_name)

        return res
Пример #5
0
    def get_associate(word, filename="associates/associates.json"):
        data = JSONFile.read_json(filename)

        if isinstance(data, Exception):
            print(data.__str__())
            return data

        for association_key in data:
            if word in data[association_key]:
                return association_key

        return None
Пример #6
0
    def _set_group_list(self):
        """
        Получает список группы из файла
        :return: сгенерированный список группы с элементами Person
        """

        data = JSONFile.read_json(self.group_file_name)
        group_list = []

        for person in data["Persons"]:
            group_list.append(Person(person, data["Persons"][person]["name"]))

        return group_list
Пример #7
0
    def in_associate(association_key,
                     word,
                     filename="associates/associates.json") -> bool:
        data = JSONFile.read_json(filename)

        if isinstance(data, Exception):
            print(data.__str__())
            return False

        if association_key in data.keys():
            for association_key in data:
                if word in data[association_key]:
                    return True

        return False
Пример #8
0
    def get_manual(mode: ModeEnum, work_dir="manual/"):

        data = {"command": "Мануал не найден!"}

        if mode == ModeEnum.DEFAULT:
            data = JSONFile.read_json(work_dir + "default.json")
        elif mode == ModeEnum.QUEUE:
            data = JSONFile.read_json(work_dir + "queue.json")
        elif mode == ModeEnum.REQUEST:
            data = JSONFile.read_json(work_dir + "request.json")
        elif mode == ModeEnum.QUESTION:
            data = JSONFile.read_json(work_dir + "question.json")
        elif mode == ModeEnum.SETTINGS:
            data = JSONFile.read_json(work_dir + "settings.json")
        else:
            return "Мануал по данному моду пока не создан, либо редактируется."

        res = ""

        for command in data['commands']:
            res += "[" + str(
                command) + "]" + " - " + data['commands'][command] + "\n"

        return res
Пример #9
0
    def get_week_parity():
        """
        Возвращает четность недели
        :return: Четная/Нечетная
        """
        # b_site = self.set_http("http://www.ifmo.ru/ru/schedule/0/P3112/raspisanie_zanyatiy_P3112.htm")
        #
        # return self.clean_all_tag_from_str(b_site.select(".schedule-week")[0].find("strong"))

        today_day, month = map(
            int,
            datetime.datetime.today().strftime("%d %m").split())

        if month != 11:
            today_day += JSONFile.read_json("schedule/2018_month.json")[str(
                month)]
        if ((today_day - 5) // 7) % 2 == 0:
            return "Нечетная"
        else:
            return "Четная"
Пример #10
0
    def command(self, command, from_id=None) -> any:
        """

        Сюда вводятся все команды пользователя. Команды разделены на моды,
        чтобы не было конфликтов среди имен и лишних взаимодействий с ботом.

        :param command: команда вводимая пользователем или "супер"-команда
        :param from_id: Если None, то сообщение из группы, если есть значение, то личное
        :return: вывод (ответ бота)
        """

        if command == "":
            command = "unknown"
        if command is None:
            print("Command is None")

        # Обработка нечитаемых событий

        if command in self.not_readable_commands:
            return

        # Обработка особых событий

        if len(command) > 2:
            if command[0:2:] == "$$":
                if command[2:6] == "swap":

                    if self.last_ask_yes_no_ans is None:

                        self.now_mode = ModeEnum.YES_NO_ASK
                        self.last_command = command

                    else:
                        if self.last_ask_yes_no_ans:
                            if self.queue.exist_check():
                                self.queue.update_queue()
                                command = command.split()

                                self.queue.swap(command[1], command[2])
                                self.queue.write_queue_on_file()
                                self.change_mode(ModeEnum.DEFAULT)
                                self.last_ask_yes_no_ans = None
                                self.queue.update_queue()
                                return "Вы успешно поменялись с очередью!"
                            else:
                                self.last_ask_yes_no_ans = None
                                return "Очереди нет"
                        else:
                            self.last_ask_yes_no_ans = None
                            return "Вы отклонили запрос!"

        command = self.set_command(command, self.now_mode)

        self.future_def()
        # Command identify

        # Mode change

        change_mode = self.identify_mode_change(command['text'])

        if change_mode[0]:
            if from_id is None:
                return "В группе доступен только режим очереди!"
            else:
                self.change_mode(change_mode[1])
                return "Режим успешно изменён!\n Текущий режим: " + self.now_mode.value[
                    0]

        if from_id is None:
            not_possible_command = True
            for cmd in self.from_group_possible_commands:
                if command['text'] in cmd.value or command['text'].split(
                )[0] in cmd.value:
                    command["command_enum"] = cmd
                    command["message_enum"] = MessageEnum.send_to_group
                    not_possible_command = False
            if not_possible_command:
                return "Недопустимая команда для группы!"

        else:

            command['from_id'] = from_id
            for cmd in CommandEnum:
                if command['text'] in cmd.value:
                    command["command_enum"] = cmd
                    command["message_enum"] = MessageEnum.send_to_person

        command_type = command['command_enum']

        # Вывод текущего мода
        if command_type == CommandEnum.now_mode:
            return self.now_mode.value[0]

        if command_type == CommandEnum.help:
            return Manual.get_manual(self.now_mode)

        if self.now_mode == ModeEnum.YES_NO_ASK:

            if command['text'].upper() in ["Y", "YES", "ДА"]:
                self.now_mode = self.last_mode
                self.last_ask_yes_no_ans = True

            elif command['text'].upper() in ["NO", "N", "НЕТ"]:
                self.now_mode = self.last_mode
                self.last_ask_yes_no_ans = False

            elif command['text'].upper() in ["ВЫХОД", "EXIT"]:
                self.now_mode = self.last_mode
                self.last_ask_yes_no_ans = None
                return "Вы отменили команду"

            else:
                return "Введите корректный ответ!"

            return self.command(self.last_command, from_id)

        if self.now_mode == ModeEnum.GET_STRING:
            if command['text'].upper() in ["ВЫХОД", "EXIT"]:
                self.now_mode = self.last_mode
                self.last_get_string_ans = None
                return "Вы отменили команду"
            self.now_mode = self.last_mode
            self.last_get_string_ans = command['text']
            return self.command(self.last_command, from_id)

        if self.now_mode == ModeEnum.GET_NUMBER:
            if command['text'].upper() in ["ВЫХОД", "EXIT"]:
                self.now_mode = self.last_mode
                self.last_get_number_ans = None
                return "Вы отменили команду"

            try:
                self.last_get_number_ans = int(command['text'])

            except ValueError:
                return "Введите цифру!"

            self.now_mode = self.last_mode
            return self.command(self.last_command, from_id)

        #
        #              MAIN COMMANDS
        #

        # Register check

        if self.not_registered:
            possible_command = False
            for cmd in self.not_registered_commands:

                if command['text'] in cmd.value or command['text'].split(
                )[0] in cmd.value:
                    possible_command = True

            if not possible_command:
                return "Вы не зарегестрированный пользователь, " \
                        "поэтому вам не доступны команды для редактирования очереди " \
                        "или другого взаимодействия с группой."

        #
        # QUESTION MODE
        #
        if self.now_mode == ModeEnum.QUESTION:
            if command['text'].split(
            )[0] in CommandEnum.get_java_question.value:
                if len(command['text'].split()) > 1:
                    return self.java_question.get_question(
                        command['text'].split()[1])[1]
                else:
                    return self.java_question.get_question()[1]
            elif command['text'] in CommandEnum.get_java_answer.value:
                return self.java_question.last_answer
            else:
                return "Не могу распознать вашу команду, простите."
        #
        # DEFAULT MODE
        #
        if self.now_mode == ModeEnum.DEFAULT:

            # schedule

            if len(command['text'].split()) > 1:
                if command['text'].split()[0] in CommandEnum.schedule.value:
                    if command['text'].split()[1] == "завтра":
                        return self.schedule.get_schedule(1)
                    if len(command['text'].split()) > 2:
                        if command['text'].split()[1] == "на" and command[
                                'text'].split()[2] == "завтра":
                            return self.schedule.get_schedule(1)
                    try:
                        return self.schedule.get_schedule(
                            int(command['text'].split()[1]))
                    except TypeError:
                        return "Неверный формат[TP]! Расписание <через k: int дней>/<на завтра>"
                    except ValueError:
                        return "Неверный формат[VE]! Расписание <через k: int дней>/<на завтра>"
            if command['text'] in CommandEnum.schedule.value:
                return self.schedule.get_schedule()

        #
        # REQUEST MODE
        #
        if self.now_mode == ModeEnum.REQUEST:
            if command['text'] in RequestEnum.SWAP.value:
                if not self.queue.check_person_passed(self.isu_id):
                    if self.last_get_number_ans is None:
                        self.change_mode(ModeEnum.GET_NUMBER)
                        self.last_command = command['text']
                        return "Введите номер ИСУ с которым хотите поменяться:"
                    else:
                        if self.last_get_number_ans > len(
                                JSONFile.read_json(self.group_file_name)
                            ["Persons"]) or self.last_get_number_ans < 1:
                            self.change_mode(ModeEnum.GET_NUMBER)
                            self.last_command = command['text']
                            return "Такого номера не существует!"
                        elif self.queue.check_person_passed(
                                self.last_get_number_ans):
                            self.now_mode = self.last_mode
                            self.last_get_number_ans = None
                            return "Запрашиваемый пользователь уже прошел очередь. Заявка отменена!"
                        elif not JSONFile.read_json(
                                self.group_file_name)["Persons"][str(
                                    self.last_get_number_ans
                                )]['settings']['swap_request']:
                            self.now_mode = self.last_mode
                            self.last_get_number_ans = None
                            return "Запрашиваемый пользователь запретил подачи заявки на обмен мест. Заявка отменена!"
                        else:
                            JSONFile.add_request(
                                "swap",
                                f"{self.isu_id} {self.last_get_number_ans}")

                            self.now_mode = self.last_mode
                            try:
                                self.vk_api.messages.send(
                                    peer_id=JSONFile.get_vkid_by_id(
                                        self.last_get_number_ans,
                                        self.group_file_name),
                                    message=f"Вы хотите поменяться с"
                                    f" {JSONFile.get_name_by_vkid(self.vkid, self.group_file_name)} "
                                    f"под номером ИСУ {self.isu_id} ? Его место в очереди: "
                                    f"{self.queue.get_person_queue_position(self.isu_id)}",
                                    keyboard=JSONFile.read_keyboard(
                                        "yes_no_ask.json"))
                            except Exception:
                                self.now_mode = self.last_mode
                                self.last_get_number_ans = None
                                return "Произошла ошибка! Скорее всего, пользователь не может получать сообщения," \
                                       " так как он не указал свой ID." \
                                       " Заявка отклонена!"
                            self.last_get_number_ans = None
                            return "Заявка отправлена и будет передано пользователю"
                else:
                    return "Вы уже прошли очередь, поэтому не можете подавать заявку на смену в очереди"

            if command_type == CommandEnum.send_spam:
                print("access for = ", self.vkid)
                if str(from_id) in JSONFile.read_json(self.group_file_name)["extended access"] or str(self.vkid) in \
                        JSONFile.read_json(self.group_file_name)["extended access"]:
                    if self.last_get_string_ans is None:

                        self.change_mode(ModeEnum.GET_STRING)
                        self.last_command = command['text']
                        return "Напишите сообщение, которое вы хотите передать всем:"
                    else:
                        JSONFile.add_request("send2all",
                                             self.last_get_string_ans)
                        self.last_get_string_ans = None
                        return "Успешно!"
                else:
                    return "У вас нет прав для этого метода. Обратитесь к старосте или к моему создателю."

        #
        # QUEUE MODE
        #
        if self.now_mode == ModeEnum.QUEUE:
            if self.queue.exist_check():
                self.queue.update_queue()

            if command_type == CommandEnum.new_queue:
                if self.queue.exist_check():
                    if str(from_id) in JSONFile.read_json(self.group_file_name)["extended access"] or str(self.vkid) in \
                            JSONFile.read_json(self.group_file_name)["extended access"]:
                        self.queue.new_queue()
                        self.queue.history.clean()
                        self.queue.write_queue_on_file()
                        return "Новая очередь создана. История очищена"
                    else:
                        return "Очередь уже существует. " \
                               "Обратитесь к старосте или к моему создателю, чтобы создать новую очередь."
                else:
                    self.queue.new_queue()
                    self.queue.history.clean()
                    self.queue.write_queue_on_file()

                    return "Очередь создана!"

            # Функции не изменяющие очередь
            elif command_type == CommandEnum.get_history:

                result = ""
                for i in self.queue.history.get_history():
                    result += i + "\n"

                return result

            elif command_type == CommandEnum.get_queue:
                if self.queue.exist_check():
                    self.queue.update_queue()

                    result = ""
                    for person in self.queue.get_queue():
                        result += f"{person.get_name()} id:{person.get_id()}"
                        if person.get_passed():
                            result += " [прошел]"
                        else:
                            result += " [ожидает]"
                        result += "\n"

                    return result
                else:
                    return "Очереди нет"

            elif command_type == CommandEnum.get_person_queue_position:
                if self.queue.exist_check():
                    self.queue.update_queue()
                    return self.queue.get_person_queue_position(self.isu_id)
                else:
                    return "Очереди нет"
            elif command_type == CommandEnum.get_last_person_in_queue:
                if self.queue.exist_check():
                    self.queue.update_queue()

                    return self.queue.get_last_person_in_queue().get_name()
                else:
                    return "Очереди нет"

            elif command_type == CommandEnum.get_current_person_in_queue:
                if self.queue.exist_check():
                    self.queue.update_queue()

                    return self.queue.get_current_person_in_queue().get_name()
                else:
                    return "Очереди нет"

            elif command_type == CommandEnum.get_next_person_in_queue:
                if self.queue.exist_check():
                    self.queue.update_queue()

                    return self.queue.get_next_person_in_queue().get_name()
                else:
                    return "Очереди нет"

            # Функции меняющие очерердь

            elif command_type == CommandEnum.person_passed:
                if self.queue.exist_check():
                    self.queue.update_queue()

                    # TODO : rewite to func
                    if self.vkid in JSONFile.read_json(self.group_file_name)['extended access'] or \
                            self.vkid in JSONFile.read_json(self.group_file_name)['moderators'] or \
                            self.queue.get_current_person_in_queue().get_id() == self.isu_id:

                        self.queue.person_passed()
                        self.queue.write_queue_on_file()

                        # Предупреждение следующих по очереди
                        now_user_id = self.queue.get_current_person_in_queue(
                        ).get_id()
                        message_for_now = f"Пользователь {self.queue.get_last_person_in_queue().get_name()} прошел\n" \
                                          f" очередь. Сейчас на очереди вы."
                        next_user_id = self.queue.get_next_person_in_queue(
                        ).get_id()
                        message_for_next = f"Пользователь {self.queue.get_last_person_in_queue().get_name()} прошел\n" \
                                           f" очередь. Пользователь " \
                                           f"{self.queue.get_current_person_in_queue().get_name()}" \
                                           f" сейчас в очереди. После него идете вы, будьте готовы!"

                        if JSONFile.read_json(
                                self.group_file_name
                        )["Persons"][now_user_id]['settings']['push']:
                            self.send_msg(
                                JSONFile.get_vkid_by_id(
                                    now_user_id, self.group_file_name),
                                message_for_now)
                        if JSONFile.read_json(
                                self.group_file_name
                        )["Persons"][next_user_id]['settings']['push']:
                            self.send_msg(
                                JSONFile.get_vkid_by_id(
                                    next_user_id, self.group_file_name),
                                message_for_next)

                        return f"{self.queue.get_last_person_in_queue().get_name()} прошел"

                    else:
                        accessed_people = ""
                        for vkid in JSONFile.read_json(
                                self.group_file_name)['extended access']:
                            accessed_people += JSONFile.get_name_by_vkid(
                                vkid, self.group_file_name) + "\n"
                        for vkid in JSONFile.read_json(
                                self.group_file_name)['moderators']:
                            accessed_people += JSONFile.get_name_by_vkid(
                                vkid, self.group_file_name) + "\n"
                        return "У вас нет доступа для этой команды, обратитесь к тем у кого есть доступ:\n" \
                               + accessed_people
                else:
                    return "Очереди нет"

            elif command_type == CommandEnum.delete_person:
                if self.queue.exist_check():
                    self.queue.update_queue()

                    if self.last_ask_yes_no_ans is None:
                        self.change_mode(ModeEnum.YES_NO_ASK)
                        self.last_command = command['text']
                        return "Вы уверены? Вас удалят из очереди[y/n]"
                    elif self.last_ask_yes_no_ans:
                        self.last_ask_yes_no_ans = None
                        self.change_mode(ModeEnum.QUEUE)
                        self.queue.delete_person(self.isu_id)
                        self.queue.write_queue_on_file()
                        return f"Вы были удалены из очереди."
                    else:
                        self.last_ask_yes_no_ans = None
                        return "Команда отменена"

                else:
                    return "Очереди нет"

            elif command_type == CommandEnum.add_person:
                if self.queue.exist_check():

                    if self.queue.check_exist_in_queue(self.isu_id):
                        return "Вы уже в очереди"
                    else:
                        self.queue.update_queue()

                        self.queue.add_person(self.isu_id)
                        self.queue.write_queue_on_file()
                        return f"Вы добавлены в конец очереди"

                else:
                    return "Очереди нет"

        #
        # LINK
        #
        if self.now_mode == ModeEnum.LINK:
            # journal link

            if len(command['text'].split()) > 1:
                if command['text'].split(
                )[0] in CommandEnum.get_journal_link.value:
                    data = JSONFile.read_json("links.json")

                elif command['text'].split(
                )[0] in CommandEnum.get_group_link.value:
                    data = JSONFile.read_json("group_links.json")
                else:
                    return "Неверный формат указателя на ссылку"

                associate = Associate.get_associate(command['text'].split()[1])
                if isinstance(associate, Exception):
                    return "У меня тут что-то пошло не так... Вы все правильно ввели?"
                if associate is None:
                    return "Не нашла такого журнала\\группы в своей базе данных..."
                return data['journals'][associate]
        #
        # SETTINGS
        #
        if self.now_mode == ModeEnum.SETTINGS:
            if command_type == CommandEnum.show:
                res = ""
                settings = JSONFile.read_json(
                    self.group_file_name)["Persons"][self.isu_id]["settings"]
                for setting in settings:
                    set_name = "None"
                    if settings[setting] is True:
                        value = "Да"
                    else:
                        value = "Нет"

                    if setting == "4all_msg":
                        set_name = "1.Уведомления от старосты:"
                    elif setting == "push":
                        set_name = "2.Уведомления о событиях:"
                    elif setting == "swap_request":
                        set_name = "3.Возможность смены очереди:"

                    res += set_name + " " + value + "\n"

                return res

            if command_type == CommandEnum.send_spam or command_type == CommandEnum.one:
                if self.last_ask_yes_no_ans is None:
                    self.change_mode(ModeEnum.YES_NO_ASK)
                    self.last_command = command['text']
                    return "Вы хотите чтобы вас уведомляли личным сообщением о важных объявлениях?"
                else:
                    JSONFile.set_setting("4all_msg", self.last_ask_yes_no_ans,
                                         self.isu_id, self.group_file_name)
                    self.last_ask_yes_no_ans = None
                    return "Ваш ответ принят!"

            if command_type == CommandEnum.change_push or command_type == CommandEnum.two:
                if self.last_ask_yes_no_ans is None:
                    self.change_mode(ModeEnum.YES_NO_ASK)
                    self.last_command = command['text']
                    return "Вы хотите чтобы вас уведомляли личным сообщением об изменениях очереди," \
                           " и приближении вашего?"
                else:
                    JSONFile.set_setting("push", self.last_ask_yes_no_ans,
                                         self.isu_id, self.group_file_name)
                    self.last_ask_yes_no_ans = None
                    return "Ваш ответ принят!"

            if command_type == CommandEnum.swap or command_type == CommandEnum.three:
                if self.last_ask_yes_no_ans is None:
                    self.change_mode(ModeEnum.YES_NO_ASK)
                    self.last_command = command['text']
                    return "Вы хотите чтобы другие люди кидали вам заявку на обмен мест в очереди?"
                else:
                    JSONFile.set_setting("swap_request",
                                         self.last_ask_yes_no_ans, self.isu_id,
                                         self.group_file_name)
                    self.last_ask_yes_no_ans = None
                    return "Ваш ответ принят!"

        return "Не распознанная команда! Текущий мод: " + self.now_mode.value[0]