Beispiel #1
0
while True:
    try:
        try:
            db.open_connection()
        except (peewee.OperationalError):
            print("connection")
    except (IntegrityError, OperationalError):
        db = DataBase()
        db.open_connection()
    subs = get_subs()
    url = "http://api.travelpayouts.com/v1/prices/direct?origin={0}&depart_date={1}&return_date={2}&token={3}".format(
        subs.origin, subs.depart_date, subs.return_date, AVIATOKEN)
    custom_header = {'Accept-Encoding': 'gzip'}
    response = requests.get(url, headers=custom_header)

    loaded_json = json.loads(response.text)
    if not loaded_json['success']:
        print("Error")

    for x in loaded_json['data']:
        code_airport = ""
        for airport in airports:
            if airport['city_code'] == x['destination']:
                code_airport = airport['name']
                break
        msg = ("destination = {0}\n value = {1} руб.\n".format(
            code_airport, x['value']))
    r = Requests(subs.user_id)
    r.send_msg(msg)
    db.close_connection()
Beispiel #2
0
class Controller:
    def __init__(self, update_object):
        print("Controller init")
        self.u = update_object

        self.user = find_user(update_object['from_id'])
        self.text = update_object['text']

        self.command = self.payloadParse()
        self.r = Requests(update_object['peer_id'])
        self.payloadParse()

        self.switchLevel(self.user.level)

    def starting(self):
        if not self.command:
            self.r.send_msg(
                "Добро пожаловать в чат-бота уведомлений по ценам, управление кнопками!",
                keyboard)
        if self.command == "start":
            self.r.send_msg(
                "Добро пожаловать в чат-бота уведомлений по ценам, управление кнопками!",
                keyboard)
            return
        if self.command == "my_subs":
            subs = try_subs_by_user_id(self.user.id)
            if not subs:
                self.r.send_msg("У вас ничего нет", keyboard)
                return
            msg = "Ваши подписки: \n"
            for sub in subs:
                msg += "{0}\n".format(sub.id)
            self.r.send_msg(msg, keyboard)
            return
        if self.command == "add_subs":
            self.r.send_msg("Выберите тип", k_type)
            self.user.level = 1
            self.user.save()
            return

        self.r.send_msg(
            "Добро пожаловать в чат-бота уведомлений по ценам, управление кнопками!",
            keyboard)
        return

    def isBack(self):
        if self.command == "back":
            self.user.level = 0
            self.user.save()
            self.switchLevel(0)
            return True
        return False

    def adding(self):
        if self.isBack():
            return
        self.user.level = 2
        self.user.tmp_type = self.command
        self.user.save()
        self.r.send_msg(
            "Сохранено. Введите город отправления в виде IATA кода. Например, MOW - Москва, KZN - Казань, LED - Санкт-Петербург, CSY - Чебоксары \nP.S.Это MVP. Не нравится - уходи",
            k_null)

    def setDay(self):
        if self.isBack():
            return
        # Проверка города
        self.user.level = 3
        self.user.tmp_city = self.text
        self.user.save()
        self.r.send_msg("Сохранено. Напишите числом сколько дней", k_null)

    def city(self):
        if self.isBack():
            return
        self.user.level = 4
        self.user.tmp_day = self.text
        self.user.tmp_dates_from = ""
        self.user.save()
        # Лушче сделать календарь (отметьте)
        self.r.send_msg(
            "Сохранено. Выберите в календаре даты, которые бот будет отслеживать как даты вылета. Можно выбрать несколько, например, все субботы января",
            self.monthRender())

    def dateFrom(self):
        if self.isBack():
            return
        # если нажата сохранить
        if self.command == "go_month":
            self.r.send_msg("Выберите месяц", self.monthRender())
            return True
        if self.command == "save":
            self.user.level = 5
            self.user.save()
            self.switchLevel(5)
            return True
        splitted = self.command.split("_")
        if splitted[0] == "mon":
            self.r.send_msg(
                "*Выбран месяц #{0}*".format(self.getNameMonth(splitted[1])),
                self.daysRender(splitted[1]))
        if splitted[0] == "day":
            if splitted[1] == "X":
                self.r.send_msg("Так нельзя", self.daysRender(splitted[2]))
                return True
            label = False
            if len(self.user.tmp_dates_from) > 0:
                for date in self.user.tmp_dates_from.split("%"):
                    if date.split("_")[1] == splitted[2] and date.split(
                            "_")[2] == splitted[1]:
                        label = True
                self.user.tmp_dates_from = self.user.tmp_dates_from + "%"

            if not label:
                self.user.tmp_dates_from = self.user.tmp_dates_from + "2020_{0}_{1}".format(
                    splitted[2], splitted[1])
                self.r.send_msg(
                    "*Выбран день #{0} {1}*".format(
                        splitted[1], self.getNameMonth(splitted[2])),
                    self.daysRender(splitted[2]))
            else:
                label = ""
                for date in self.user.tmp_dates_from.split("%"):
                    if len(date) > 0:
                        if date.split("_")[1] == splitted[2] and date.split(
                                "_")[2] == splitted[1]:
                            label = label
                        else:
                            label = label + date + "%"
                self.user.tmp_dates_from = label[0:-1]
                self.r.send_msg("*Убран день #{0}*".format(splitted[1]),
                                self.daysRender(splitted[2]))
            self.user.save()

    def dateTo(self):
        if self.isBack():
            return
        # Проверка даты
        self.user.level = 0
        self.user.save()

        add_subs(self.user.id, self.user.tmp_type, self.user.tmp_city,
                 self.user.tmp_day, self.user.tmp_dates_from)

        self.r.send_msg(
            "Подписка новая добавлена, спасибо. Уведомления будут присылаться каждые полчаса. Фикс будет потом. ",
            k_null)
        # save to bd
        self.switchLevel(0)

    def switchLevel(self, level):
        if level == 0:
            self.starting()
        if level == 1:
            self.adding()
        if level == 2:
            self.setDay()
        if level == 3:
            self.city()
        if level == 4:
            self.dateFrom()
        if level == 5:
            self.dateTo()

    def payloadParse(self):
        if self.u.get('payload'):
            a = json.loads(self.u['payload'], strict=False, encoding='utf-8')
            if a.get('button') and len(a['button']) > 0:
                return a['button']
        return False

    def monthRender(self):
        month = [["Январь", "Февраль", "Март"], ["Апрель", "Май", "Июнь"],
                 ["Июль", "Август", "Сентябрь"],
                 ["Октябрь", "Ноябрь", "Декабрь"]]
        k_month = {"one_time": False, "buttons": []}
        i = 0
        for mon in month:
            buttons = []
            for m in mon:
                label = "secondary"
                if len(self.user.tmp_dates_from) > 0:
                    for date in self.user.tmp_dates_from.split("%"):
                        if int(date.split("_")[1]) == i:
                            label = "positive"
                buttons.append({
                    "action": {
                        "type": "text",
                        "payload": "{\"button\": \"mon_" + str(i) + "\"}",
                        "label": m
                    },
                    "color": label
                })
                i += 1
            k_month['buttons'].append(buttons)
        k_month['buttons'].append([{
            "action": {
                "type": "text",
                "payload": "{\"button\": \"save\"}",
                "label": "Сохранить"
            },
            "color": "positive"
        }])
        return json.dumps(k_month)

    def daysRender(self, monthId):
        kDays = {"one_time": False, "buttons": []}
        c = calendar.TextCalendar(calendar.MONDAY)
        s = c.monthdayscalendar(2020, int(monthId) + 1)
        for x in zip(*s):
            buttons = []
            for i in x:
                label = "secondary"
                if (i == 0):
                    i = "X"
                else:
                    if len(self.user.tmp_dates_from) > 0:
                        for date in self.user.tmp_dates_from.split("%"):
                            if date.split("_")[1] == monthId and date.split(
                                    "_")[2] == str(i):
                                label = "positive"
                buttons.append({
                    "action": {
                        "type":
                        "text",
                        "payload":
                        "{\"button\": \"day_" + str(i) + "_" + str(monthId) +
                        "\"}",
                        "label":
                        i
                    },
                    "color": label
                })
            kDays['buttons'].append(buttons)
        kDays['buttons'].append([{
            "action": {
                "type": "text",
                "payload": "{\"button\": \"go_month\"}",
                "label": "К месяцам"
            },
            "color": "primary"
        }])
        kDays['buttons'].append([{
            "action": {
                "type": "text",
                "payload": "{\"button\": \"save\"}",
                "label": "Сохранить"
            },
            "color": "positive"
        }])
        return json.dumps(kDays)

    def getNameMonth(self, id):
        month = [
            "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль",
            "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"
        ]
        return month[int(id)]
Beispiel #3
0
class Actions:
    peer_id = 0

    def __init__(self, user_id, chat_id, peer_id, max_pred):
        print("Actions init")
        self.is_ban_or_kik = False
        self.user_id = user_id
        self.chat_id = chat_id
        self.peer_id = peer_id
        self.max_pred = max_pred
        self.requests = Requests(peer_id, chat_id)

    def ban_user(self, id):
        stats = find_stats_addit_user_and_chat(id, self.chat_id)
        stats.is_banned = 1 if self.remove_chat_user(id) else 0
        stats.save()

    def pred_user(self, id, text = ""):
        stats = find_stats_addit_user_and_chat(id, self.chat_id)
        stats.is_pred = stats.is_pred + 1
        self.requests.send_msg(msg="{0} Предупреждение {1} из {2}".format(
            text, stats.is_pred, self.max_pred))
        if int(stats.is_pred) >= int(self.max_pred):
            # По сути надо выбирать что делать роботу
            # stats.is_banned = 1
            stats.is_pred = 0
            self.requests.send_msg(msg="Лимит предупреждений! Кик :-)")
            # И парсить максимальное кол-во
            self.remove_chat_user(id)
        stats.save()
        
    def remove_chat_user(self, id):
        return self.requests.remove_chat_user(id)

    def send_msg(self, msg):
        self.requests.send_msg(msg)

    def get_need_lvl(self, old):
        all_count_msgs = find_all_stats_sum(
            self.user_id, self.chat_id).count_msgs
        if round(int(all_count_msgs) ** 0.2) > old:
            return round(int(all_count_msgs) ** 0.2)
        else:
            return old

    def is_admin(self):
        chat_users = self.requests.getConversationMembers()
        if chat_users:
            for chat_user in chat_users['items']:
                if self.user_id == chat_user['member_id'] and chat_user.get('is_admin'):
                    return True
        return False

    def update_user_data(self, from_id):
        self.from_id = from_id
        user = find_user(from_id)
        now = datetime.datetime.now()
        timestamp = datetime.datetime.timestamp(now)
        if user.cache_repeat + 13600 < timestamp and user.id > 0:
            user.full_name = self.requests.api_full_name(user.id)
            user.cache_repeat = timestamp
            user.save()
        self.user_id = user.id
        return user

    def update_chat_data(self, chat):
        now = datetime.datetime.now()
        timestamp = datetime.datetime.timestamp(now)

        if chat.cache_repeat + 3600 < timestamp:
            chat_data = self.requests.getConversationsById()
            if chat_data:
                chat.title, chat.members_count = chat_data[
                    'title'], chat_data['members_count']
            else:
                chat.title = chat.title
            chat.cache_repeat = timestamp
            chat.save()
        return chat

    def bot_come_to_chat(self):
        members = self.requests.getConversationMembers()
        if not members:
            self.requests.send_msg(
                msg="Привет, чат №{0} &#128521; Рекомендуем выдать доступ к переписке!".format(self.peer_id))
            return True
        for chat_user in members['profiles']:
            self.requests.find_update_user(chat_user['from_id'])

        self.requests.send_msg(
            msg="Привет, чат №{0} &#128521; Напиши: Работяга помощь".format(self.chat_id))
        return True

    def is_chat_invite_user(self, member_id):
        if member_id > 0:
            self.requests.find_update_user(member_id)
            stats = find_stats_addit_user_and_chat(member_id, self.chat_id)
            if stats.is_banned == 1:
                self.requests.remove_chat_user(member_id)
        if member_id == -GROUP_ID:
            self.bot_come_to_chat()

    def get_hero(self, get_settings):
        users = self.requests.getConversationMembers()

        if users:
            settings_array = get_settings()
            today = int(datetime.date.today().strftime("%j"))
            if today != settings_array[5]:
                choice_id = choice(users['profiles'])['id']
                self.requests.send_msg(
                    msg="Герой дня на сегодня ... @id{0}".format(choice_id))
                settings_set(self.chat_id, 6, today)
                settings_set(self.chat_id, 1, choice_id)
            else:
                self.requests.send_msg(
                    msg="Герой дня на сегодня уже выбран @id{0}".format(settings_array[4]))
        else:
            self.requests.send_msg(
                msg="У меня нет доступа к участникам беседы...")
        return True

    def get_top(self):
        self.send_msg(
            msg="Статистика: kanbase.ru/c/{0}".format((self.chat_id)))  # *0x45785
        return True

    def get_all_list(self, params):
        if params == "pred":
            msg = 'Все предупреждения:\n'
            arr_p = get_preds_db(self.chat_id, self.user_id)
        else:
            msg = 'Все блокировки:\n'
            arr_p = get_bans_db(self.chat_id, self.user_id)
        index = 1
        exist = False
        for p in arr_p:
            exist = True
            msg += "#{0} {1} {2}\n".format(index,
                                           p.id_user.full_name, p.is_pred)
            index = index + 1
        if exist:
            self.requests.send_msg(msg=msg)
        else:
            if params == "pred":
                self.requests.send_msg(msg="Предупреждений в чате нет")
            else:
                self.requests.send_msg(msg="Блокировок в чате нет")
        return True

    def get_all_marry(self):
        m = get_marryieds(self.chat_id)
        if m:
            msg = 'Все браки: \n'
            index = 1
            time = datetime.datetime.now()
            for mr in m:
                msg += "#{0} {1} и {2} {3} дн.\n".format(
                    index, mr.id_user_one.full_name, mr.id_user_two.full_name, abs(time - mr.date_time).days)
                index = index + 1
            self.requests.send_msg(msg=msg)
        else:
            self.requests.send_msg(msg="Браков ещё нет")
        return True

    def get_duel_stats(self, type):
        if type == 1:
            arr_duel = get_duel_save(self.chat_id)
        else:
            arr_duel = get_duel_die(self.chat_id)
        if len(arr_duel) > 0:
            msg = ''
            index = 1
            for duel in arr_duel:
                if type == 1:
                    msg += "#{0} {1} {2} р.\n".format(
                        index, duel.id_user.full_name, duel.count_duel_save)
                else:
                    msg += "#{0} {1} {2} р.\n".format(
                        index, duel.id_user.full_name, duel.count_duel_die)
                index = index + 1
            self.requests.send_msg(msg=msg)
        else:
            self.requests.send_msg(msg="Дуэлей ещё не было")
        return True

    def remove_married(self):
        if del_marry_all(self.chat_id, self.user_id):
            self.requests.send_msg(msg="Брак аннулирован:)")
        return True

    def delete_married(self):
        if del_marry(self.chat_id, self.user_id):
            self.send_msg(msg="В браке отказано:)")

    def save_married(self):
        if done_marry(self.chat_id, self.user_id):
            self.requests.send_msg(msg="Поздравляю:)")
        return True

    def get_married(self, text):
        users = re.findall(r'id(\d+)\|@?', text())
        if len(users) == 0:
            self.requests.send_msg(msg="Выберите участника беседы через @")
            return True
        if len(users) > 1:
            self.requests.send_msg(msg="Больше двух участников нельзя)")
            return True
        marryed = add_marrieds(self.user_id, users[0], self.chat_id)
        if marryed == 1:
            self.requests.send_msg(
                msg="Нужно подтвердить другому участнику, написав Работяга брак да/нет")
        else:
            self.requests.send_msg(msg="Брак невозможен")
        return True

    def get_choise(self, text):
        self.requests.send_msg(msg="Я выбираю {0}".format(
            choice(text().split('или')).strip()))

    def get_inform(self):
        self.requests.send_msg(
            msg="Вероятность составляет {0}%".format(randint(0, 100)))
        return True

    def settings(self, text):
        text_array = text().strip().split(' ')
        if len(text_array) >= 2:
            type_set = int(text_array[0])
            val = text_array[1]
            if type_set == 1:
                if int(val) == 0 or int(val) == 1:
                    settings_set(self.chat_id, type_set, val)
                    self.requests.send_msg(msg="Сохранено!")
                    return True
            if type_set == 2:
                if int(val) == 0 or int(val) == 1:
                    settings_set(self.chat_id, type_set, val)
                    self.requests.send_msg(msg="Сохранено!")
                    return True
            if type_set == 3:
                settings_set(self.chat_id, type_set, val)
                self.requests.send_msg(msg="Сохранено!")
                return True
            if type_set == 4:
                if int(val) == 0 or int(val) == 1:
                    settings_set(self.chat_id, type_set, val)
                    self.requests.send_msg(msg="Сохранено!")
                    return True
            if type_set == 5:
                settings_set(self.chat_id, type_set, val)
                self.requests.send_msg(msg="Сохранено!")
                return True
        return False

    def ban_last_users(self, count):
        if len(count()) == 0:
            self.send_msg("Ну напишите сколько человек")
            return True
        for users in get_users_by_limit(self.chat_id, int(count())):
            self.ban_user(users.id_user)
        return True

    def dog_kick(self):
        users = self.requests.getConversationMembers()
        if users:
            for chat_user in users['profiles']:
                dog_exist = False
                if chat_user.get('deactivated'):
                    if self.remove_chat_user(chat_user['id']):
                        dog_exist = True
            if not dog_exist:
                self.requests.send_msg(msg="Собачек нет!")
            else:
                self.requests.send_msg(msg="Собачек больше нет!")
        return True

    def ban_kick_pred_users(self, text, type):
        users = re.findall(r'id(\d+)\|@?', text())
        if len(users) == 0:
            if type == "ban":
                self.requests.send_msg(msg="И кого мне банить?")
            if type == "kick":
                self.requests.send_msg(msg="И кого мне кикать?")
            if type == "pred":
                self.requests.send_msg(msg="И кому мне давать предупреждение?")
            if type == "ro":
                self.requests.send_msg(msg="И кому мне давать ReadOnly?")
            return True
        for user in users:
            if type == "ban":
                self.ban_user(user)
            if type == "kick":
                self.remove_chat_user(user)
            if type == "pred":
                self.pred_user(user)
            # if type == "ro":
                # print("")
        return True

    def un_users(self, text):
        users = re.findall(r'id(\d+)\|@?', text())
        if len(users) == 0:
            self.requests.send_msg(msg="Ну выберите кого-нибудь...")
            return True
        for user in users:
            stats = find_stats_addit_user_and_chat(user, self.chat_id)
            stats.is_banned = 0
            stats.is_pred = 0
            stats.save()
        self.requests.send_msg(msg="Готово!")

    def remove_stop(self, text):
        remove_stop_line(self.chat_id, text())
        self.requests.send_msg(msg="Готово!")

    def add_stop(self, text):
        tmp = text().split()
        if len(tmp) != 2:
            self.requests.send_msg(
                msg="Введите в формате Работяга добавить стоп-слово СЛОВО X")
            return False
        type_stop = 0
        if len(tmp[1]) == 0:
            type_stop = 0
        else:
            type_stop = int(tmp[1])
        add_stop_line(self.chat_id, tmp[0], type_stop)
        self.requests.send_msg(msg="Готово!")
        return True

    def parse_stop_lines(self, text):
        stop_lines = getting_stop_lines(self.chat_id)
        texts = text.lower().split()
        if stop_lines:
            for stop_line in stop_lines:
                for text in texts:
                    if text == stop_line.line:
                        if stop_line.type_do == 0:
                            self.remove_chat_user(self.user_id)
                        if stop_line.type_do == 1:
                            self.ban_user(self.user_id)

    def parse_mat(self, text):
        if mat.check_slang(text):
            self.pred_user(self.user_id, "Некультурно общаемся?")

    def parse_senstiment(self, text):
        tokenizer = RegexTokenizer()
        tokens = tokenizer.split('всё очень плохо') # хз
        model = FastTextSocialNetworkModel(tokenizer=tokenizer)
        
        return model.predict([text], k=2)[0]