コード例 #1
0
ファイル: bot.py プロジェクト: Vladimir92/python-coursework
def interests_process(bot, update):
    query = update.callback_query
    interest_id = query.data.split("_")[1]
    user_object = get_or_register_user(query.from_user)
    user = query.from_user
    target_interest = Interest.get(id=interest_id)
    keyboard = []

    if not User.select().join(UserInterests).join(Interest).where(User.tlg_id == user.id,
                                                                  Interest.name == target_interest.name).exists():
        UserInterests.create(user=user_object, interest=target_interest)
    else:
        ui = UserInterests.get(UserInterests.user == user_object, UserInterests.interest == target_interest)
        ui.delete_instance()

    for interest in Interest.select():
        if User.select().join(UserInterests).join(Interest).where(User.tlg_id == user.id,
                                                                  Interest.name == interest.name).exists():
            prefix = "✅ "
        else:
            prefix = ""
        keyboard.append([InlineKeyboardButton(prefix + interest.name, callback_data="interest_{}".format(interest.id))])
    keyboard.append([InlineKeyboardButton("Готово", callback_data="interests_finish")])
    reply_markup = InlineKeyboardMarkup(keyboard)
    query.edit_message_reply_markup(reply_markup=reply_markup)
    query.answer("Интерес обновлен ✅")
コード例 #2
0
def clbck(c):
    chat_id = cid(c)
    u = User.cog(user_id=cid(c))
    Message.create(sender=cid(c),
                   sender_type="user",
                   receiver=bot_id,
                   text=c.data,
                   msg_type='text')
    try:
        r = Routing.get(state=u.state, decision=c.data)
        keyboard = types.InlineKeyboardMarkup()
        bot.edit_message_reply_markup(chat_id=cid(c),
                                      message_id=c.message.message_id,
                                      reply_markup=keyboard)
        bot.answer_callback_query(callback_query_id=c.id, show_alert=True)

        try:  # на случай если action не определён в таблице роутинга
            if u.state != s.stop:
                eval(r.action)(u=u, c=c)
        except Exception as e:
            Error.create(message=c.data, state=u.state, exception=e)
            print(e)
            print(s.action_not_defined)
    except Exception as e:
        Error.create(message=c.data, state=u.state, exception=e)
        log_routing_error(e)
コード例 #3
0
def send_photo_delay(chat_id,
                     p,
                     state=None,
                     delay=0,
                     disable_notification=None):
    u = User.get(user_id=chat_id)
    if state != None:
        u.state = state
    u.save()
    bot.send_photo(chat_id, p, disable_notification=disable_notification)
コード例 #4
0
ファイル: bot.py プロジェクト: Vladimir92/python-coursework
def get_or_register_user(user, ref_id=None):
    ref_user = None
    if ref_id:
        query = User.select().where(User.unique_id == ref_id)
        if query.exists():
            ref_user = query.get()
    # logger.info("In register user, ref_id is {} and user found is {}".format(ref_id, ref_user))

    # Register in DB if not exist, putting the referrer id if provided
    if not User.select().where(User.tlg_id == user.id).exists():
        # logger.info("Putting ref_user id {} to user {}".format(ref_user, user.first_name))
        user_object = User.create(tlg_id=user.id,
                                  tlg_username=user.username,
                                  first_name=user.first_name,
                                  last_name=user.last_name,
                                  referer=ref_user)
    else:
        user_object = User.select().where(User.tlg_id == user.id).get()
    return user_object
コード例 #5
0
ファイル: bot.py プロジェクト: Vladimir92/python-coursework
def create_menu_message(bot, update, is_callback=False):
    if is_callback:
        user = update.from_user
    else:
        user = update.message.from_user
    user_object = get_or_register_user(user)
    keyboard = []
    # Check, if the user have not calculate scale - display only one option
    if get_user_scale(user).amount <= 0:
        keyboard.append([InlineKeyboardButton("Рассчитать масштаб личности", callback_data="scale_processing_start")])
        reply_markup = InlineKeyboardMarkup(keyboard)
        message = "Хочешь узнать на сколько ты масштабная личность и получить доступ к самым интересным для тебя " \
                  "событиям? "
        update.message.reply_text(message, reply_markup=reply_markup)
        return
    # Adding the ability to recalculate scale at any time
    query = Scale.select().join(User).where(User.tlg_id == user.id)
    message = "{}, ваши данные по нетворкинг сети:\n" \
              "Масштаб вашей личности: {}\n".format(user.first_name if user.first_name else user.username,
                                                    query.get().amount)
    keyboard.append([InlineKeyboardButton("Пересчитать масштаб личности", callback_data="scale_processing_start")])
    # Referral system data to message append
    Referrer = User.alias()
    query = User.select().join(Referrer, on=(Referrer.referer == User.id)).where(User.tlg_id == user.id)
    ref_link = "https://t.me/{bot_name}?start={lnk}".format(bot_name=BOT_NAME, lnk=user_object.unique_id)
    message = "{}\nПриглашено человек по реферальной системе: {}" \
              "\nВаша реферальная ссылка: {}\n".format(message, query.count(), ref_link)

    # If the user does not have selected interests, show him the invitation to fill them
    if Interest.select().join(UserInterests).join(User).where(User.tlg_id == user.id).count() < 1:
        message = "{}\nЧтобы получать наиболее интересные для вас новости, укажите ваши интересы".format(message)
        keyboard.append([InlineKeyboardButton("Указать интересы", callback_data="interests_set")])
        keyboard = appendSocialButtons(keyboard, ref_link)
        reply_markup = InlineKeyboardMarkup(keyboard)
        update.message.reply_text(message, reply_markup=reply_markup)
        return
    query = User.select().join(UserInterests).join(Interest).where(User.tlg_id == user.id)
    message = "{}\nУказано {} интересов для уточнения новостей".format(message, query.count())
    keyboard.append([InlineKeyboardButton("Уточнить интересы", callback_data="interests_set")])
    keyboard = appendSocialButtons(keyboard, ref_link)
    # Final reply
    reply_markup = InlineKeyboardMarkup(keyboard)
    update.message.reply_text(message, reply_markup=reply_markup)
コード例 #6
0
 def delayed(*args, **kwargs):
     chat_id, m = args
     u = User.get(user_id=chat_id)
     u.state = s.stop
     u.save()
     timer = threading.Timer(kwargs['delay'],
                             func,
                             args=args,
                             kwargs=kwargs)
     timer.start()
コード例 #7
0
def day_2(user_id):
    u = User.get(user_id=user_id)
    u.day = 2
    u.save()
    send_message_delay(user_id,
                       s.day_2_start.format(u.first_name),
                       state=s.day_2,
                       delay=1)
    bot.send_chat_action(user_id, 'typing')
    send_message_delay(
        user_id,
        "Продолжайте присылать фото всего, что Вы едите и пьёте",
        delay=6)
コード例 #8
0
ファイル: bot.py プロジェクト: Vladimir92/python-coursework
def interests_show(bot, update):
    query = update.callback_query
    user = query.from_user
    keyboard = []
    for interest in Interest.select():
        if User.select().join(UserInterests).join(Interest).where(User.tlg_id == user.id,
                                                                  Interest.name == interest.name).exists():
            prefix = "✅ "
        else:
            prefix = ""
        keyboard.append([InlineKeyboardButton(prefix + interest.name, callback_data="interest_{}".format(interest.id))])
    keyboard.append([InlineKeyboardButton("Готово", callback_data="interests_finish")])
    reply_markup = InlineKeyboardMarkup(keyboard)
    query.edit_message_text("Отметьте ваши интересы.\nДля заверешения нажмите \"Готово\"", reply_markup=reply_markup)
コード例 #9
0
def send_message_delay(chat_id,
                       m,
                       state=None,
                       delay=0,
                       reply_markup=None,
                       disable_notification=None,
                       parse_mode='Markdown'):
    u = User.get(user_id=chat_id)
    bot.send_chat_action(chat_id, 'typing')
    if state != None:
        u.state = state
    u.save()
    bot.send_message(chat_id,
                     m,
                     reply_markup=reply_markup,
                     parse_mode=parse_mode,
                     disable_notification=disable_notification)
コード例 #10
0
def photo(m):
    photo_name = save_photo(m)
    Message.create(sender=uid(m),
                   sender_type="user",
                   receiver=bot_id,
                   text=photo_name,
                   msg_type='photo')
    photo = Photo.create(user_id=uid(m), message_id=m.message_id)
    u = User.cog(user_id=uid(m))
    try:
        r = Routing.get(state=u.state, decision='photo')
        try:  # на случай если action не определён в таблице роутинга
            if u.state != s.stop:
                eval(r.action)(u=u, m=m)
        except Exception as e:
            Error.create(message=m.text, state=u.state, exception=e)
    except Exception as e:
        print(e)
コード例 #11
0
    def __call__(self):
        while True:
            now = datetime.now()
            now = now.replace(microsecond=0)
            hour_ago = now - timedelta(hours=1)

            # проверка на запланированное действие в расписании
            actions = Schedule.select().where((Schedule.timestamp >= now) & (
                Schedule.timestamp < now + timedelta(seconds=1)))
            for action in actions:
                eval(action.action)(**json.loads(action.arguments))

            # проверка на last_activity
            users = User.select().where(
                (User.last_activity >= hour_ago)
                & (User.last_activity < hour_ago + timedelta(seconds=1))
                & (User.state != s.canceled) & (User.state != s.pause)
                & (User.state != s.stop))
            for user in users:
                bot.send_message(user.user_id, s.one_hour_reminder)
            sleep(1)
コード例 #12
0
def action(m):
    chat_id = sid(m)
    u = User.cog(user_id=uid(m))
    Message.create(sender=uid(m),
                   sender_type="user",
                   receiver=bot_id,
                   text=m.text)
    if u.state == s.canceled:
        return False
    try:
        r = Routing.get(state=u.state, decision='text')
        try:  # на случай если action не определён в таблице роутинга
            if u.state != s.stop:
                eval(r.action)(u=u, m=m)
        except Exception as e:
            Error.create(message=m.text, state=u.state, exception=e)
            # print(e)
            # print(m)
    except Exception as e:
        Error.create(message=m.text, state=u.state, exception=e)
        log_routing_error(e)
コード例 #13
0
def start(m):
    # print(u, m)
    u = User.cog(user_id=uid(m),
                 username=m.from_user.username,
                 first_name=m.from_user.first_name,
                 last_name=m.from_user.last_name)
    u.clear()
    u.state = s.default
    u.save()
    keyboard = types.InlineKeyboardMarkup()
    agree_btn = types.InlineKeyboardButton(text=s.agree_btn,
                                           callback_data=s.agree)
    disagree_btn = types.InlineKeyboardButton(text=s.disagree_btn,
                                              callback_data=s.disagree)
    more_btn = types.InlineKeyboardButton(text=s.more_btn,
                                          url="http://1fitchat.ru")
    keyboard.add(agree_btn)
    keyboard.add(disagree_btn)
    keyboard.add(more_btn)
    bot.send_message(uid(m),
                     s.greeting,
                     reply_markup=keyboard,
                     parse_mode="Markdown")
コード例 #14
0
def publish_news(novelty_object, my_bot):
    # Match the user by interest and scale
    query = User.select().join(UserInterests).join(Interest).join(NoveltyInterests).join(Novelty).switch(User).join(Scale) \
        .where(Novelty.id == novelty_object.id,
               ((Scale.amount >= novelty_object.scale_from) & (Scale.amount < novelty_object.scale_to)))

    logger.info("Publish the news to {} users".format(query.count()))
    for user in query:
        try:
            my_bot.send_message(chat_id=user.tlg_id, text=novelty_object.text)
        except Unauthorized as u:
            user_msg = "{}:{} {}".format(user.username, user.first_name,
                                         user.last_name)
            logger.info(
                "Exception occurred while sending message to user {}\n Message: {}"
                .format(user_msg, u.message))
            continue
        except TelegramError as te:
            user_msg = "{}:{} {}".format(user.username, user.first_name,
                                         user.last_name)
            logger.info(
                "Telegram Error occurred while sending message to user {}\n Message: {}"
                .format(user_msg, te.message))
            continue
コード例 #15
0
def init(m):
    User.create_table(fail_silently=True)
コード例 #16
0
def bye_day_3(user_id):
    u = User(user_id=user_id).get()
    u.day = 0
    u.save()
    bot.send_message(user_id, s.bye_day_3)
コード例 #17
0
def day_3(user_id):
    u = User.get(user_id=user_id)
    u.day = 3
    u.save()
    bot.send_message(user_id, s.greeting_3.format(u.first_name))
    send_message_delay(user_id, s.waiting_from_you, state=s.day_3, delay=5)