Exemplo n.º 1
0
    class Singleton(Bot):
        def __init__(self):
            self.keyboard = InlineKeyboardMarkup(inline_keyboard=[
                [InlineKeyboardButton(text="/answer", callback_data='a')],
                [InlineKeyboardButton(text="/report", callback_data='r')],
                [InlineKeyboardButton(text="/start", callback_data='s')],
                [InlineKeyboardButton(text="/list", callback_data='l')],
                [InlineKeyboardButton(text="/free_list", callback_data='fl')],
                [InlineKeyboardButton(text="/ban", callback_data='b')],
                [InlineKeyboardButton(text="/ban_list", callback_data='bl')],
                [InlineKeyboardButton(text="/sban", callback_data='sb')],
                [InlineKeyboardButton(text="/change", callback_data='c')],
                [InlineKeyboardButton(text="/delete", callback_data='d')],
                [InlineKeyboardButton(text="/hints", callback_data='h')],
                [InlineKeyboardButton(text="/add_hint", callback_data='ah')],
                [
                    InlineKeyboardButton(text="/change_lang",
                                         callback_data='cl')
                ],
                [
                    InlineKeyboardButton(text="/change_role",
                                         callback_data='cr')
                ]
            ])
            self.tree = Tree()
            self.query_bool = {}
            self.lang_bool = {}
            self.query_bool = {}
            self.prev_lang = {}
            self.topic_name = {}
            self.is_logged = {}
            self.singleton_id = BotId()
            self.singleton_ban = UserBanned()
            super().__init__(Database().get_teacher(), self.message,
                             self.query)
            self.tree.send_notification_teacher(super().get_bot())
            self.singleton_id.set_bot("teacher", super().get_bot())
            self.singleton_id.reset_key_id("teacher")

        def condition(self, content_type, msg, chat_id, from_id, topic):
            return content_type == 'text' and self.verify_user(
                msg, chat_id, from_id, topic)

        def start_command(self, txt, chat_type, lang, from_id, chat_id):
            return match_command('/start', txt, chat_type,
                                 super().get_bot().getMe()["username"]) or (
                                     self.singleton_id.check_time_id(
                                         chat_type, self.tree.get_lang(), lang,
                                         from_id, chat_id, "teacher") != 0
                                     and self.tree.check_lang_str(txt, "canc"))

        def sub_message(self, chat_type, chat_id, from_id, topic, user, msg):
            txt = msg["text"]
            lang = self.tree.get_super_user_lang(chat_id, topic)
            if self.start_command(txt, chat_type, lang, from_id, chat_id):
                self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id,
                                              "teacher")
                self.singleton_id.start_fun(chat_id, from_id, chat_type, lang,
                                            self.tree.get_lang(), "teacher",
                                            topic, self.keyboard)
            elif match_command('/answer', txt, chat_type,
                               super().get_bot().getMe()["username"]):
                self.singleton_id.add_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id, 1,
                                              "teacher")
                selection(chat_id, from_id, lang,
                          self.tree.get_res_array(topic, lang,
                                                  "FREE"), chat_type,
                          super().get_bot(), self.tree.get_lang(),
                          self.singleton_id, "teacher")
            elif match_command('/ban', txt, chat_type,
                               super().get_bot().getMe()["username"]):
                self.singleton_id.add_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id, 3,
                                              "teacher")
                selection(chat_id, from_id, lang,
                          self.tree.get_res_array(topic, lang,
                                                  "FREE"), chat_type,
                          super().get_bot(), self.tree.get_lang(),
                          self.singleton_id, "teacher")
            elif match_command('/report', txt, chat_type,
                               super().get_bot().getMe()["username"]):
                self.singleton_id.add_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id, 2,
                                              "teacher")
                send_message(
                    super().get_bot(), chat_id,
                    tag_group(chat_type, user) +
                    self.tree.get_string(lang, "report"),
                    self.tree.get_string(lang, "canc"),
                    self.singleton_id.check_time_id(
                        chat_type, self.tree.get_lang(), lang, from_id,
                        chat_id, "teacher") != 0)
            elif match_command('/list', txt, chat_type,
                               super().get_bot().getMe()["username"]):
                self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id,
                                              "teacher")
                self.list_sel(chat_id, from_id, lang,
                              self.tree.get_res_array(topic, lang, "ANSWER"),
                              chat_type)
            elif match_command('/ban_list', txt, chat_type,
                               super().get_bot().getMe()["username"]):
                self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id,
                                              "teacher")
                self.list_sel(chat_id, from_id, lang,
                              self.tree.get_res_array(topic, lang, "BANNED"),
                              chat_type)
            elif match_command('/free_list', txt, chat_type,
                               super().get_bot().getMe()["username"]):
                self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id,
                                              "teacher")
                self.list_sel(chat_id, from_id, lang,
                              self.tree.get_res_array(topic, lang, "FREE"),
                              chat_type)
            elif match_command('/sban', txt, chat_type,
                               super().get_bot().getMe()["username"]):
                self.singleton_id.add_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id, 5,
                                              "teacher")
                selection(chat_id, from_id, lang,
                          self.tree.get_res_array(topic, lang,
                                                  "BANNED"), chat_type,
                          super().get_bot(), self.tree.get_lang(),
                          self.singleton_id, "teacher")
            elif match_command('/change', txt, chat_type,
                               super().get_bot().getMe()["username"]):
                self.singleton_id.add_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id, 1,
                                              "teacher")
                selection(chat_id, from_id, lang,
                          self.tree.get_res_array(topic, lang,
                                                  "ANSWER"), chat_type,
                          super().get_bot(), self.tree.get_lang(),
                          self.singleton_id, "teacher")
            elif match_command('/delete', txt, chat_type,
                               super().get_bot().getMe()["username"]):
                self.tree.delete_tc(chat_id, topic)
                self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id,
                                              "teacher")
                send_message(super().get_bot(),
                             chat_id,
                             "Permission deleted",
                             self.tree.get_string(lang, "canc"),
                             self.singleton_id.check_time_id(
                                 chat_type, self.tree.get_lang(), lang,
                                 from_id, chat_id, "teacher") != 0,
                             reply_markup=ReplyKeyboardRemove())
            elif match_command('/hints', txt, chat_type,
                               super().get_bot().getMe()["username"]):
                self.hints(chat_id, from_id, topic, lang, chat_type, user)
            elif match_command('/add_hint', txt, chat_type,
                               super().get_bot().getMe()["username"]):
                self.add_hints(chat_id, from_id, topic, lang, chat_type, user)
            elif match_command('/change_lang', txt, chat_type,
                               super().get_bot().getMe()["username"]):
                self.singleton_id.add_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id, 7,
                                              "teacher")
                send_message(super().get_bot(),
                             chat_id,
                             tag_group(chat_type, user) +
                             self.tree.get_string(lang, "lang"),
                             self.tree.get_string(lang, "canc"),
                             self.singleton_id.check_time_id(
                                 chat_type, self.tree.get_lang(), lang,
                                 from_id, chat_id, "teacher") != 0,
                             reply_markup=self.tree.set_keyboard(
                                 ["it", "de", "en", "es", "fr"]))
            elif match_command('/change_role', txt, chat_type,
                               super().get_bot().getMe()["username"]):
                role = self.tree.change_role(chat_id, topic)
                send_message(super().get_bot(),
                             chat_id,
                             self.tree.get_string(lang, role),
                             self.tree.get_string(lang, "canc"),
                             self.singleton_id.check_time_id(
                                 chat_type, self.tree.get_lang(), lang,
                                 from_id, chat_id, "teacher") != 0,
                             reply_markup=ReplyKeyboardRemove())
                self.singleton_id.start_fun(chat_id, from_id, chat_type, lang,
                                            self.tree.get_lang(), "teacher",
                                            topic, self.keyboard)
            elif self.singleton_id.check_time_id(
                    chat_type, self.tree.get_lang(), lang, from_id, chat_id,
                    "teacher") != 0:
                self.switcher(chat_id, from_id, txt, lang, topic, chat_type)

        def message(self, msg):
            content_type, chat_type, chat_id = telepot.glance(msg)
            from_id = msg["from"]["id"]
            topic = self.tree.get_topic(chat_id)
            user = super().get_bot().getChat(from_id)
            if self.condition(content_type, msg, chat_id, from_id, topic):
                self.sub_message(chat_type, chat_id, from_id, topic, user, msg)

        def hints(self, chat_id, from_id, topic, lang, chat_type, user):
            self.tree.set_nlp(lang)
            vett = self.tree.get_hint(topic, lang)
            self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                          lang, from_id, chat_id, "teacher")
            if vett != []:
                send_message(
                    super().get_bot(), chat_id,
                    tag_group(chat_type, user) + list_to_str(vett),
                    self.tree.get_string(lang, "canc"),
                    self.singleton_id.check_time_id(
                        chat_type, self.tree.get_lang(), lang, from_id,
                        chat_id, "teacher") != 0)
            else:
                send_message(
                    super().get_bot(), chat_id,
                    tag_group(chat_type, user) +
                    self.tree.get_string(lang, "empty"),
                    self.tree.get_string(lang, "canc"),
                    self.singleton_id.check_time_id(
                        chat_type, self.tree.get_lang(), lang, from_id,
                        chat_id, "teacher") != 0)

        def add_hints(self, chat_id, from_id, topic, lang, chat_type, user):
            self.tree.set_nlp(lang)
            hints = self.tree.get_hint(topic, lang)
            if len(hints) > 0:
                self.singleton_id.add_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id, 6,
                                              "teacher")
                send_message(super().get_bot(),
                             chat_id,
                             tag_group(chat_type, user) +
                             self.tree.get_string(lang, "select_hint"),
                             self.tree.get_string(lang, "canc"),
                             self.singleton_id.check_time_id(
                                 chat_type, self.tree.get_lang(), lang,
                                 from_id, chat_id, "teacher") != 0,
                             reply_markup=create_reply_keyboard(
                                 array_to_matrix(
                                     self.tree.get_hint(topic, lang))))
            else:
                self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id,
                                              "teacher")
                send_message(super().get_bot(),
                             chat_id,
                             tag_group(chat_type, user) +
                             self.tree.get_string(lang, "empty"),
                             self.tree.get_string(lang, "canc"),
                             self.singleton_id.check_time_id(
                                 chat_type, self.tree.get_lang(), lang,
                                 from_id, chat_id, "teacher") != 0,
                             reply_markup=create_reply_keyboard(
                                 array_to_matrix(
                                     self.tree.get_hint(topic, lang))))

        def query(self, msg):
            query_id, from_id, query_data = telepot.glance(
                msg, flavor="callback_query")
            chat_id = msg["message"]["chat"]["id"]
            chat_type = msg["message"]["chat"]["type"]
            topic = self.tree.get_topic(chat_id)
            user = super().get_bot().getChat(from_id)
            if not self.verify_user(msg, chat_id, from_id, topic):
                return
            lang = self.tree.get_super_user_lang(chat_id, topic)
            if query_data == 's':
                self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id,
                                              "teacher")
                self.singleton_id.start_fun(chat_id, from_id, chat_type, lang,
                                            self.tree.get_lang(), "teacher",
                                            topic, self.keyboard)
            elif query_data == 'a':
                self.singleton_id.add_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id, 1,
                                              "teacher")
                selection(chat_id, from_id, lang,
                          self.tree.get_res_array(topic, lang,
                                                  "FREE"), chat_type,
                          super().get_bot(), self.tree.get_lang(),
                          self.singleton_id, "teacher")
            elif query_data == 'b':
                self.singleton_id.add_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id, 3,
                                              "teacher")
                selection(chat_id, from_id, lang,
                          self.tree.get_res_array(topic, lang,
                                                  "FREE"), chat_type,
                          super().get_bot(), self.tree.get_lang(),
                          self.singleton_id, "teacher")
            elif query_data == 'r':
                self.singleton_id.add_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id, 2,
                                              "teacher")
                send_message(
                    super().get_bot(), chat_id,
                    tag_group(chat_type, user) +
                    self.tree.get_string(lang, "report"),
                    self.tree.get_string(lang, "canc"),
                    self.singleton_id.check_time_id(
                        chat_type, self.tree.get_lang(), lang, from_id,
                        chat_id, "teacher") != 0)
            elif query_data == 'l':
                self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id,
                                              "teacher")
                self.list_sel(chat_id, from_id, lang,
                              self.tree.get_res_array(topic, lang, "ANSWER"),
                              chat_type)
            elif query_data == 'fl':
                self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id,
                                              "teacher")
                self.list_sel(chat_id, from_id, lang,
                              self.tree.get_res_array(topic, lang, "FREE"),
                              chat_type)
            elif query_data == 'bl':
                self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id,
                                              "teacher")
                self.list_sel(chat_id, from_id, lang,
                              self.tree.get_res_array(topic, lang, "BANNED"),
                              chat_type)
            elif query_data == 'sb':
                self.singleton_id.add_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id, 5,
                                              "teacher")
                selection(chat_id, from_id, lang,
                          self.tree.get_res_array(topic, lang,
                                                  "BANNED"), chat_type,
                          super().get_bot(), self.tree.get_lang(),
                          self.singleton_id, "teacher")
            elif query_data == 'c':
                self.singleton_id.add_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id, 1,
                                              "teacher")
                selection(chat_id, from_id, lang,
                          self.tree.get_res_array(topic, lang,
                                                  "ANSWER"), chat_type,
                          super().get_bot(), self.tree.get_lang(),
                          self.singleton_id, "teacher")
            elif query_data == 'd':
                self.tree.delete_tc(chat_id, topic)
                self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id,
                                              "teacher")
                send_message(super().get_bot(),
                             chat_id,
                             "Permission deleted",
                             self.tree.get_string(lang, "canc"),
                             self.singleton_id.check_time_id(
                                 chat_type, self.tree.get_lang(), lang,
                                 from_id, chat_id, "teacher") != 0,
                             reply_markup=ReplyKeyboardRemove())
            elif query_data == 'h':
                self.hints(chat_id, from_id, topic, lang, chat_type, user)
            elif query_data == 'ah':
                self.add_hints(chat_id, from_id, topic, lang, chat_type, user)
            elif query_data == 'cl':
                self.singleton_id.add_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id, 7,
                                              "teacher")
                send_message(super().get_bot(),
                             chat_id,
                             tag_group(chat_type, user) +
                             self.tree.get_string(lang, "lang"),
                             self.tree.get_string(lang, "canc"),
                             self.singleton_id.check_time_id(
                                 chat_type, self.tree.get_lang(), lang,
                                 from_id, chat_id, "teacher") != 0,
                             reply_markup=self.tree.set_keyboard(
                                 ["it", "de", "en", "es", "fr"]))
            elif query_data == 'cr':
                role = self.tree.change_role(chat_id, topic)
                send_message(super().get_bot(),
                             chat_id,
                             self.tree.get_string(lang, role),
                             self.tree.get_string(lang, "canc"),
                             self.singleton_id.check_time_id(
                                 chat_type, self.tree.get_lang(), lang,
                                 from_id, chat_id, "teacher") != 0,
                             reply_markup=ReplyKeyboardRemove())
                self.singleton_id.start_fun(chat_id, from_id, chat_type, lang,
                                            self.tree.get_lang(), "teacher",
                                            topic, self.keyboard)

        def list_sel(self, chat_id, from_id, lang, list1, chat_type):
            user = super().get_bot().getChat(from_id)
            if list1 == []:
                send_message(
                    super().get_bot(), chat_id,
                    tag_group(chat_type, user) +
                    self.tree.get_string(lang, "empty"),
                    self.tree.get_string(lang, "canc"),
                    self.singleton_id.check_time_id(
                        chat_type, self.tree.get_lang(), lang, from_id,
                        chat_id, "teacher") != 0)
            else:
                reply = telepot.message_identifier(
                    send_message(
                        super().get_bot(), chat_id,
                        tag_group(chat_type, user) + "File:",
                        self.tree.get_string(lang, "canc"),
                        self.singleton_id.check_time_id(
                            chat_type, self.tree.get_lang(), lang, from_id,
                            chat_id, "teacher") != 0))[1]
                send_doc(super().get_bot(), chat_id, list_to_str(list1), reply)

        def branch_one(self, msg, chat_id, from_id):
            lang = self.prev_lang[chat_id]
            topic = self.topic_name[chat_id]
            if self.tree.check_teach(lang, msg["text"]):
                send_message(super().get_bot(),
                             chat_id,
                             self.tree.get_string(lang, "teacher"),
                             reply_markup=ReplyKeyboardRemove())
                self.tree.add_teachers([chat_id], self.topic_name[chat_id],
                                       lang)
                del self.topic_name[chat_id]
                del self.prev_lang[chat_id]
            elif self.tree.check_coll(lang, msg["text"]):
                send_message(super().get_bot(),
                             chat_id,
                             self.tree.get_string(lang, "collaborator"),
                             reply_markup=ReplyKeyboardRemove())
                self.tree.add_collaborators([chat_id],
                                            self.topic_name[chat_id], lang)
                del self.topic_name[chat_id]
                del self.prev_lang[chat_id]
            self.singleton_id.start_fun(chat_id, from_id, "private", lang,
                                        self.tree.get_lang(), "teacher", topic,
                                        self.keyboard)
            self.query_bool[chat_id] = False
            self.lang_bool[chat_id] = False

        def branch_two(self, msg, chat_id, from_id, topic):
            if msg["text"] in self.tree.get_flag_list():
                self.prev_lang[chat_id] = self.tree.switcherflag(msg["text"])
                send_message(super().get_bot(),
                             chat_id,
                             self.tree.get_string(self.prev_lang[chat_id],
                                                  "roles"),
                             reply_markup=self.tree.get_lang_board(
                                 self.prev_lang[chat_id],
                                 ["teacher", "collaborator"]))
                self.lang_bool[chat_id] = True

        def sub_branch_three(self, msg, chat_id, from_id, topic):
            if self.is_logged[chat_id]:
                if msg["text"] in self.tree.get_topic_list():
                    send_message(super().get_bot(),
                                 chat_id,
                                 "Copy/paste the password:"******"text"]
                    self.is_logged[chat_id] = False
                    return False
            else:
                if self.tree.verify_password(self.topic_name[chat_id],
                                             msg["text"]):
                    self.singleton_ban.del_ban(chat_id)
                    send_message(super().get_bot(),
                                 chat_id,
                                 "Choose a language:",
                                 reply_markup=self.tree.set_keyboard(
                                     ["it", "de", "en", "es", "fr"]))
                    self.query_bool[chat_id] = True
                    #self.tree.write_ban()
                    return False
            return True

        def branch_three(self, msg, chat_id, from_id, topic):
            if chat_id in self.is_logged:
                if self.sub_branch_three(msg, chat_id, from_id,
                                         topic) == False:
                    return False
                self.singleton_ban.add_ban(chat_id)
                send_message(super().get_bot(),
                             chat_id,
                             "Error, retry:",
                             reply_markup=ReplyKeyboardRemove())
                send_message(super().get_bot(),
                             chat_id,
                             "Please select the topic:",
                             reply_markup=self.tree.topic_keyboard())
                self.is_logged[chat_id] = True
                #self.tree.write_ban()
                if chat_id in self.topic_name:
                    del self.topic_name[chat_id]
            else:
                send_message(super().get_bot(),
                             chat_id,
                             "Please select the topic:",
                             reply_markup=self.tree.topic_keyboard())
                self.is_logged[chat_id] = True

        def verify_user(self, msg, chat_id, from_id, topic):
            if self.singleton_ban.check_ban(chat_id):
                send_message(super().get_bot(),
                             chat_id,
                             "You are banned from this bot",
                             reply_markup=ReplyKeyboardRemove())
                return False
            if chat_id not in self.lang_bool:
                self.lang_bool[chat_id] = False
            if chat_id not in self.query_bool:
                self.query_bool[chat_id] = False
            if self.lang_bool[chat_id] == True:
                self.branch_one(msg, chat_id, from_id)
                return False
            if self.query_bool[chat_id] == True:
                self.branch_two(msg, chat_id, from_id, topic)
                return False
            if topic == None:
                self.branch_three(msg, chat_id, from_id, topic)
                return False
            return True

        def case1(self, chat_id, from_id, txt, lang, topic, chat_type):
            user = super().get_bot().getChat(from_id)
            res = self.tree.get_response(txt, lang, topic)
            if res != None:
                self.tree.set_qid(chat_id, from_id, txt, topic)
                self.singleton_id.add_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id, 4,
                                              "teacher")
                send_message(
                    super().get_bot(), chat_id,
                    tag_group(chat_type, user) +
                    self.tree.get_string(lang, "answer", xxx=txt),
                    self.tree.get_string(lang, "canc"),
                    self.singleton_id.check_time_id(
                        chat_type, self.tree.get_lang(), lang, from_id,
                        chat_id, "teacher") != 0)
            else:
                send_message(
                    super().get_bot(), chat_id,
                    tag_group(chat_type, user) +
                    self.tree.get_string(lang, "error"),
                    self.tree.get_string(lang, "canc"),
                    self.singleton_id.check_time_id(
                        chat_type, self.tree.get_lang(), lang, from_id,
                        chat_id, "teacher") != 0)

        def case3(self, chat_id, from_id, txt, lang, topic, chat_type):
            user = super().get_bot().getChat(from_id)
            self.tree.set_ban(txt, lang, topic)
            vett = self.tree.get_ids_array(topic, lang, txt)
            self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                          lang, from_id, chat_id, "teacher")
            send_message(
                super().get_bot(), chat_id,
                tag_group(chat_type, user) +
                self.tree.get_string(lang, "banned_q", xxx=txt),
                self.tree.get_string(lang, "canc"),
                self.singleton_id.check_time_id(
                    chat_type, self.tree.get_lang(), lang, from_id, chat_id,
                    "teacher") != 0)
            for elem in vett:
                send_message(
                    self.tree.get_bot_by_topic(topic), elem,
                    self.tree.get_string(lang, "banned_q", xxx=txt),
                    self.tree.get_string(lang, "canc"),
                    self.singleton_id.check_time_id(
                        chat_type, self.tree.get_lang(), lang, from_id,
                        chat_id, "teacher") != 0)

        def case4(self, chat_id, from_id, txt, lang, topic, chat_type):
            user = super().get_bot().getChat(from_id)
            question = self.tree.set_res(chat_id, from_id, txt, lang, topic)
            if question == None:
                return
            vett = self.tree.get_ids_array(topic, lang, question)
            self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                          lang, from_id, chat_id, "teacher")
            send_message(
                super().get_bot(), chat_id,
                tag_group(chat_type, user) +
                self.tree.get_string(lang, "answer_q", xxx=question, yyy=txt),
                self.tree.get_string(lang, "canc"),
                self.singleton_id.check_time_id(
                    chat_type, self.tree.get_lang(), lang, from_id, chat_id,
                    "teacher") != 0)
            for elem in vett:
                send_message(
                    self.tree.get_bot_by_topic(topic), elem,
                    self.tree.get_string(lang,
                                         "answer_q",
                                         xxx=question,
                                         yyy=txt),
                    self.tree.get_string(lang, "canc"),
                    self.singleton_id.check_time_id(
                        chat_type, self.tree.get_lang(), lang, from_id,
                        chat_id, "teacher") != 0)

        def case5(self, chat_id, from_id, txt, lang, topic, chat_type):
            user = super().get_bot().getChat(from_id)
            self.tree.set_sban(txt, lang, topic)
            vett = self.tree.get_ids_array(topic, lang, txt)
            self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                          lang, from_id, chat_id)
            send_message(
                super().get_bot(), chat_id,
                tag_group(chat_type, user) + self.tree.get_string(
                    lang, "banned_q", xxx=txt).replace("ban", "sban"),
                self.tree.get_string(lang, "canc"),
                self.singleton_id.check_time_id(
                    chat_type, self.tree.get_lang(), lang, from_id, chat_id,
                    "teacher") != 0)
            for elem in vett:
                send_message(
                    self.tree.get_bot_by_topic(topic), elem,
                    self.tree.get_string(lang, "banned_q",
                                         xxx=txt).replace("ban", "sban"))

        def case6(self, chat_id, from_id, txt, lang, topic, chat_type):
            user = super().get_bot().getChat(from_id)
            splitted = txt[1:-1].split("\" -> \"")
            self.tree.add_question_by_hint(lang, splitted[0], splitted[1],
                                           chat_id, from_id, topic)
            self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                          lang, from_id, chat_id, "teacher")
            send_message(
                super().get_bot(), chat_id,
                tag_group(chat_type, user) + self.tree.get_string(
                    lang, "answer_q", xxx=splitted[0], yyy=splitted[1]),
                self.tree.get_string(lang, "canc"),
                self.singleton_id.check_time_id(
                    chat_type, self.tree.get_lang(), lang, from_id, chat_id,
                    "teacher") != 0)

        def case7(self, chat_id, from_id, txt, lang, topic, chat_type):
            user = super().get_bot().getChat(from_id)
            txt = self.tree.switcherflag(txt)
            if txt == None:
                send_message(
                    super().get_bot(), chat_id,
                    tag_group(chat_type, user) +
                    self.tree.get_string(lang, "error"),
                    self.tree.get_string(lang, "canc"),
                    self.singleton_id.check_time_id(
                        chat_type, self.tree.get_lang(), lang, from_id,
                        chat_id, "teacher") != 0)
                return
            self.tree.set_super_user_lang(chat_id, topic, txt)
            send_message(
                super().get_bot(), chat_id,
                tag_group(chat_type, user) +
                self.tree.get_string(txt, "setted_lang"),
                self.tree.get_string(lang, "canc"),
                self.singleton_id.check_time_id(
                    chat_type, self.tree.get_lang(), lang, from_id, chat_id,
                    "teacher") != 0)
            self.singleton_id.start_fun(chat_id, from_id, chat_type, txt,
                                        self.tree.get_lang(), "teacher", topic,
                                        self.keyboard)

        def get_bot(self):
            return super().get_bot()

        def switcher(self, chat_id, from_id, txt, lang, topic, chat_type):
            self.tree.set_nlp(lang)
            if self.singleton_id.check_time_id(chat_type, self.tree.get_lang(),
                                               lang, from_id, chat_id,
                                               "teacher") == 1:
                self.case1(chat_id, from_id, txt, lang, topic, chat_type)
            elif self.singleton_id.check_time_id(chat_type,
                                                 self.tree.get_lang(), lang,
                                                 from_id, chat_id,
                                                 "teacher") == 2:
                chat = {"chat": chat_id, "from": from_id}
                bot = {"bot": super().get_bot(), "type": "teachers"}
                self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id,
                                              "teacher")
                seg_bug(chat, txt, lang, chat_type, bot,
                        self.tree.get_database(), self.tree.get_lang())
            elif self.singleton_id.check_time_id(chat_type,
                                                 self.tree.get_lang(), lang,
                                                 from_id, chat_id,
                                                 "teacher") == 3:
                self.case3(chat_id, from_id, txt, lang, topic, chat_type)
            elif self.singleton_id.check_time_id(chat_type,
                                                 self.tree.get_lang(), lang,
                                                 from_id, chat_id,
                                                 "teacher") == 4:
                self.case4(chat_id, from_id, txt, lang, topic, chat_type)
            elif self.singleton_id.check_time_id(chat_type,
                                                 self.tree.get_lang(), lang,
                                                 from_id, chat_id,
                                                 "teacher") == 5:
                self.case5(chat_id, from_id, txt, lang, topic, chat_type)
            elif self.singleton_id.check_time_id(chat_type,
                                                 self.tree.get_lang(), lang,
                                                 from_id, chat_id,
                                                 "teacher") == 6:
                self.case6(chat_id, from_id, txt, lang, topic, chat_type)
            elif self.singleton_id.check_time_id(chat_type,
                                                 self.tree.get_lang(), lang,
                                                 from_id, chat_id,
                                                 "teacher") == 7:
                self.singleton_id.del_time_id(chat_type, self.tree.get_lang(),
                                              lang, from_id, chat_id,
                                              "teacher")
                self.case7(chat_id, from_id, txt, lang, topic, chat_type)
Exemplo n.º 2
0
    class Singleton(Bot):

        def __init__(self):
            self.keyboard = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="/new_bot", callback_data='n')],[InlineKeyboardButton(text="/delete_bot", callback_data='d')],[InlineKeyboardButton(text="/start", callback_data='s')],[InlineKeyboardButton(text="/change_pwd", callback_data='c')]])
            self.boolvett={}
            self.unconfirmed_bot={}
            self.unc_del={}
            self.tree=Tree()
            self.user_request=self.tree.read_pwd()
            self.admin_pwd=self.tree.get_pwd_admin()
            self.select_str="Please select a topic:"
            self.singleton_id=BotId()
            self.singleton_ban=UserBanned()
            super().__init__(Database().get_creation(),self.message,self.query)
            self.singleton_id.set_bot("creation",super().get_bot())
            self.singleton_id.reset_key_id("creation")

        def message(self,msg):
            content_type, chat_type, chat_id = telepot.glance(msg)
            if self.singleton_ban.check_ban(chat_id):
                send_message(super().get_bot(),chat_id,"You are banned from this bot","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=self.tree.topic_keyboard())
                return
            if content_type == 'text' and chat_type=="private":
                if msg["text"]=='/start' or (self.singleton_id.check_time_id(chat_type,self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0 and msg["text"]=="Cancel"):
                    self.del_past_creation(chat_id)
                    send_message(super().get_bot(),chat_id,"Hi, this is the bot to create a new subject.","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=ReplyKeyboardRemove())
                    self.singleton_id.set_key_id(telepot.message_identifier(send_message(super().get_bot(),chat_id,"Click on a command below:","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=self.keyboard)),"creation")
                elif msg["text"]=='/delete_bot':
                    self.del_past_creation(chat_id)
                    self.singleton_id.add_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,4,"creation")
                    send_message(super().get_bot(),chat_id,self.select_str,"Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=self.tree.topic_keyboard())
                    self.boolvett[chat_id]=False
                elif msg["text"]=='/new_bot':
                    self.del_past_creation(chat_id)
                    self.singleton_id.add_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,1,"creation")
                    send_message(super().get_bot(),chat_id,"Please select a new topic, please write the name in english:","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=self.tree.topic_keyboard())
                elif msg["text"]=='/change_pwd':
                    self.del_past_creation(chat_id)
                    if not self.req_pwd(chat_id):
                        send_message(super().get_bot(),chat_id,"You made too many requests, command aborted","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=self.tree.topic_keyboard())
                        return
                    self.singleton_id.add_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,4,"creation")
                    send_message(super().get_bot(),chat_id,self.select_str,"Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=self.tree.topic_keyboard())
                    self.boolvett[chat_id]=True
                elif self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation") != 0:
                    self.switch_creation(chat_id,msg["text"])
                else :
                    send_message(super().get_bot(),chat_id,"Unknown command or bot restarted.","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=self.tree.topic_keyboard())

        def query(self,msg):
            query_id, from_id, query_data = telepot.glance(msg, flavor="callback_query")
            chat_id=msg["message"]["chat"]["id"]
            if self.singleton_ban.check_ban(chat_id):
                send_message(super().get_bot(),chat_id,"You are banned from this bot","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=ReplyKeyboardRemove())
                return
            if query_data=='s':
                self.del_past_creation(chat_id)
                send_message(super().get_bot(),chat_id,"Hi, this is the bot to create a new subject.","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=ReplyKeyboardRemove())
                self.singleton_id.set_key_id(telepot.message_identifier(send_message(super().get_bot(),chat_id,"Click on a command below:","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=self.keyboard)),"creation")
            elif query_data=='n':
                self.del_past_creation(chat_id)
                self.singleton_id.add_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,1,"creation")
                send_message(super().get_bot(),chat_id,"Please select a new topic, please write the name in english:","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=ReplyKeyboardRemove())
            elif query_data=='d':
                self.del_past_creation(chat_id)
                self.singleton_id.add_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,4,"creation")
                send_message(super().get_bot(),chat_id,self.select_str,"Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=self.tree.topic_keyboard())
                self.boolvett[chat_id]=False
            elif query_data=='c':
                self.del_past_creation(chat_id)
                if not self.req_pwd(chat_id):
                    send_message(super().get_bot(),chat_id,"You made too many requests, command aborted","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=ReplyKeyboardRemove())
                    return
                self.singleton_id.add_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,4,"creation")
                send_message(super().get_bot(),chat_id,self.select_str,"Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=self.tree.topic_keyboard())
                self.boolvett[chat_id]=True

        def teach_board_topic(self,topic,chat_id):
            send_message(super().get_bot(),chat_id,"If you want go to a bot","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=self.tree.get_creation_keyboard(topic))

        def delete_req(self,time,vett):
            data=[]
            for elem in vett:
                if time < elem:
                    data.append(elem)
            return data

        def select_topic(self,chat_id,text):
            if not re.search("^[a-zA-Z0-9][a-zA-Z0-9 ]{3}[a-zA-Z0-9 ]*[a-zA-Z0-9]$", text):
                send_message(super().get_bot(),chat_id,"The name of the topic is not valid, it must have at least 5 characters and contain only letters, numbers and spaces. The name cannot begin or end with a space. Please retry","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=ReplyKeyboardRemove())
                return
            if text in self.tree.get_topic_list():
                send_message(super().get_bot(),chat_id,"The topic name has already been used. Please retry","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=ReplyKeyboardRemove())
                return
            self.unconfirmed_bot[chat_id]={}
            self.unconfirmed_bot[chat_id]["topic"]=text
            self.singleton_id.add_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,2,"creation")
            send_message(super().get_bot(),chat_id,"Paste the token created with the @BotFather bot:","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=ReplyKeyboardRemove())

        def token_valid(self,token):
            url="https://api.telegram.org/bot"+token+"/getMe"
            #try:
            try:
                response = urlopen(url)
                data = json.loads(response.read())
                if data['ok'] and token not in self.tree.get_token_list():
                    return True
                else:
                    return False
            except HTTPError:
                return False

        def rand_string(self,string_length=10):
            password_characters = string.ascii_letters + string.digits + string.punctuation
            return ''.join(random.choice(password_characters) for _ in range(string_length))

        def hash_password(self,password):
            """Hash a password for storing."""
            salt = hashlib.sha256(os.urandom(60)).hexdigest().encode('ascii')
            pwdhash = hashlib.pbkdf2_hmac('sha512', password.encode('utf-8'), 
                                        salt, 100000)
            pwdhash = binascii.hexlify(pwdhash)
            return (salt + pwdhash).decode('ascii')

        def send_notify(self,chat_id,pwd,name_bot):
            bot_pwd=self.tree.get_bot_pwd()
            send_message(bot_pwd,self.admin_pwd,"The new password for the "+name_bot+" topic is "+pwd,self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0)
            send_message(super().get_bot(),chat_id,"This is the password to be enabled to answer questions: "+pwd,"Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=ReplyKeyboardRemove())

        def save_token(self,chat_id,txt):
            #try:
            if self.token_valid(txt):
                self.unconfirmed_bot[chat_id]["token"]=txt
            else:
                send_message(super().get_bot(),chat_id,"The token is already used or is not valid. Retry with another token. Please retry.","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=ReplyKeyboardRemove())
                return
            #except telepot.exception:
                #send_message(super().get_bot(),chat_id,"The token is already used or is not valid. Retry with another token. Please retry.",reply_markup=ReplyKeyboardRemove())
                #return
            pwd=self.rand_string()
            self.singleton_id.del_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")
            self.send_notify(chat_id,pwd,self.unconfirmed_bot[chat_id]["topic"])
            self.tree.new_bot(txt,self.unconfirmed_bot[chat_id]["topic"],self.hash_password(pwd))
            self.teach_board_topic(self.unconfirmed_bot[chat_id]["topic"],chat_id)
            del self.unconfirmed_bot[chat_id]

        def cond_hash_first_branch(self,chat_id,text):
            self.singleton_id.del_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")
            if self.tree.verify_password(self.unc_del[chat_id], text):
                self.singleton_ban.del_ban(chat_id)
                pwd=self.rand_string()
                self.send_notify(chat_id,pwd,self.unc_del[chat_id])
                self.tree.change_pwd(self.unc_del[chat_id],self.hash_password(pwd))
                self.teach_board_topic(self.unc_del[chat_id],chat_id)
            else :
                self.singleton_ban.add_ban(chat_id)
                send_message(super().get_bot(),chat_id,"Incorrect password. Command aborted.","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=ReplyKeyboardRemove())
            del self.unc_del[chat_id]

        def cond_hash_second_branch(self,chat_id,text):
            self.singleton_id.del_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")
            if self.tree.verify_password(self.unc_del[chat_id], text):
                self.singleton_ban.del_ban(chat_id)
                self.tree.delete_bot(self.unc_del[chat_id])
                send_message(super().get_bot(),chat_id,"Topic deleted","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=ReplyKeyboardRemove())
            else :
                self.singleton_ban.add_ban(chat_id)
                send_message(super().get_bot(),chat_id,"Incorrect password. Command aborted.","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=ReplyKeyboardRemove())
            del self.unc_del[chat_id]

        def cond_hash(self,chat_id,text):
            if text=="Forgot password?":
                user=super().get_bot().getChat(chat_id)
                bot_pwd=self.tree.get_bot_pwd()
                self.singleton_id.del_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")
                send_message(bot_pwd,self.admin_pwd,"The user "+user['last_name']+" "+user['first_name']+" (@"+user['username']+") lost password for the topic "+self.unc_del[chat_id],self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0)
                send_message(super().get_bot(),chat_id,"A request was sent to the administrator","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=ReplyKeyboardRemove())
                del self.unc_del[chat_id]
                return
            if self.boolvett[chat_id]:
                self.cond_hash_first_branch(chat_id,text)
            else:
                self.cond_hash_second_branch(chat_id,text)
            #self.tree.write_ban()

        def choose_topic(self,chat_id,text):
            if text in self.tree.get_topic_list():
                self.singleton_id.add_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,3,"creation")
                send_message(super().get_bot(),chat_id,"Enter the password relating to the topic:","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=create_reply_keyboard([["Forgot password?"]],only_one=False))
                self.unc_del[chat_id]=text
            else :
                self.singleton_id.del_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")
                send_message(super().get_bot(),chat_id,"Topic don't found, command aborted","Cancel",self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")!=0,reply_markup=ReplyKeyboardRemove())

        def switch_creation(self,chat_id,text):
            if self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")==1:
                self.select_topic(chat_id,text)
            elif self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")==2:
                self.save_token(chat_id,text)
            elif self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")==3:
                self.cond_hash(chat_id,text)
            elif self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")==4:
                self.choose_topic(chat_id,text)

        def req_pwd(self,chat_id):
            time=datetime.datetime.today()
            if chat_id not in self.user_request:
                self.user_request[chat_id]=[]
            self.user_request[chat_id]=self.delete_req(time,self.user_request[chat_id])
            self.user_request[chat_id].append(time+datetime.timedelta(days=30))
            self.tree.write_pwd(self.user_request)
            if len(self.user_request[chat_id]) > 10:
                return False
            return True

        def del_past_creation(self,chat_id):
            if chat_id in self.unconfirmed_bot:
                del self.unconfirmed_bot[chat_id]
            if self.singleton_id.check_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation") != 0:
                self.singleton_id.del_time_id("private",self.tree.get_lang(),"en",chat_id,chat_id,"creation")
            if chat_id in self.unc_del:
                del self.unc_del[chat_id]