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)
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)
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)
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
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
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
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
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
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 "Четная"
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]