Пример #1
0
def request_phone_number(chat_id):
    # указываем параметр resize_keyboard для того, чтобы кнопки были маленького размера
    markup = types.ReplyKeyboardMarkup(row_width=2, one_time_keyboard=True, resize_keyboard=True)
    markup.add(types.KeyboardButton(text=phone_button_text, request_contact=True))
    markup.add(types.KeyboardButton(text=phone_button_text_denied))
    telegram_bot.send_message(text=request_phone_message, chat_id=chat_id,
                              reply_markup=markup, disable_notification=True)
Пример #2
0
 def daily_update(self):
     subscription = Subscribe.query.filter(Subscribe.telegram_id==self.id).all()
     for sub in subscription:
         comp = Company.query.filter(Company.id==sub.company_id).first()
         response = render_template('telebot/price_alert.html', header='Daily Update', company=comp, user=self, company_url=COMPANY_INFO_URL)
         telegram_bot.send_message(chat_id=self.chat_id, text=response, parse_mode='HTML')
         sub.user_notified()
Пример #3
0
def handle_room_owner_start(query):
    room_owner = User.query.get(query.message.chat.id)  # создатель комнаты
    if room_owner.state != BotSate.IN_ROOM_CREATOR:
        return
    room_users = room_owner.participant.users  # AppenderBaseQuery все участники комнаты
    room_users_count = get_room_users_count(room_owner)  # всего участников комнаты
    room_users_ready_count = check_ready(room_owner)  # кол-во готовых пользователей

    # если в комнате только создатель или не все пользователи готовы
    # отменить распределение тайных сант до тех пор пока все не будут готовы
    if room_users_count == 1 or room_users_count != room_users_ready_count:
        return

    santa_ids = [user.id for user in room_users]

    for user in room_users:
        telegram_bot.send_message(chat_id=user.id, text=room_everyone_ready_message.format(room_owner.first_name),
                                  disable_notification=True)

        santa_for = random.choice(santa_ids)
        while santa_for == user.id:  # никто не может быть тайным сантой для себя самого
            santa_for = random.choice(santa_ids)
        santa_ids.remove(santa_for)

        santa = User.query.filter_by(id=santa_for).first()
        assign_santa(user, santa)  # назначить санту santa для пользователя user

    drop_room(query.message, end=True)
Пример #4
0
def drop_room(message, end=False):
    user = User.query.filter_by(id=message.chat.id).first()
    if user.participant is not None:
        room = Room.query.filter_by(identifier=user.participant.identifier).first()
    else:
        room = None

    if room and user.state == BotSate.IN_ROOM_CREATOR and user.id == room.owner_id:
        for u in room.users:
            u.participant = None
            u.state = BotSate.ROOM_CHOICE
            db.session.query(User).filter_by(id=u.id).update({"ready": False})  # сбрасываем готовность
            if u.id == user.id:
                telegram_bot.send_message(chat_id=u.id,
                                          text=room_dropped_owner_message, disable_notification=True)
            else:
                telegram_bot.send_message(chat_id=u.id,
                                          text=room_dropped_participant_message.format(user.first_name),
                                          disable_notification=True)
            if not end:
                request_room_invitation(u.id)
        db.session.delete(room)
        db.session.commit()
    else:
        check_state(message)
Пример #5
0
def join_room(message):
    identifier = re.search(r'/room\w{10}\b', message.text).group(0)[5:]
    user = User.query.filter_by(id=message.chat.id).first()
    room = Room.query.filter_by(identifier=identifier).first()

    if room and user.state == BotSate.ROOM_CHOICE:
        user.participant = room
        user.state = BotSate.IN_ROOM_USER
        db.session.commit()
        for u in room.users:
            if u.id != user.id:
                telegram_bot.send_message(chat_id=u.id,
                                          text=room_join_alert_message.format(user.first_name,
                                                                              user.participant.identifier),
                                          disable_notification=True)
            else:
                owner_name = User.query.filter_by(id=user.participant.owner_id).first().first_name
                telegram_bot.send_message(chat_id=user.id,
                                          text=room_join_message.format(user.first_name,
                                                                        user.participant.identifier,
                                                                        owner_name),
                                          disable_notification=True)
                request_ready(user.id)
    else:
        check_state(message)
Пример #6
0
def send_message_to_all_telegram_users(users, message):
    # start = time.time()
    # при рассылке использовать try-except, так как пользватель может заблокировать бота
    for user in users:
        try:
            telegram_bot.send_message(user.id, message)
        except Exception as e:
            pass
Пример #7
0
def request_room_invitation(chat_id):
    markup = types.InlineKeyboardMarkup(row_width=2)
    markup.add(types.InlineKeyboardButton(text='Создать новую комнату',
                                          callback_data=json.dumps({'inv': True})))
    markup.add(types.InlineKeyboardButton(text='Подключится к существующей',
                                          callback_data=json.dumps({'inv': False})))
    telegram_bot.send_message(text=room_invitation_text, chat_id=chat_id,
                              reply_markup=markup, parse_mode='Markdown', disable_notification=True)
Пример #8
0
def get_room_users_count(room_owner):
    count = User.query.filter_by(room=room_owner.participant.id).count()
    if count == 1:
        telegram_bot.send_message(chat_id=room_owner.id,
                                  text=room_owner_alone_message.format(room_owner.participant.identifier),
                                  parse_mode='Markdown',
                                  disable_notification=True)
    return count
Пример #9
0
def assign_santa(user, santa):
    contact_data = concatenate_name(santa)
    try:
        message_text = secret_santa_message.format(contact_data, santa.phone_number, santa.address, santa.present)
        telegram_bot.send_message(chat_id=user.id, text=message_text, parse_mode='HTML', disable_notification=True)
    except Exception as e:  # ошибка форматирования HTML
        clean_message_test = secret_santa_message_clean.format(contact_data, santa.phone_number, santa.address,
                                                               santa.present)
        telegram_bot.send_message(chat_id=user.id, text=clean_message_test, disable_notification=True)
Пример #10
0
def request_start(chat_id):
    photo = open('app/static/start-pic.jpg', 'rb')
    markup = types.InlineKeyboardMarkup()
    markup.add(types.InlineKeyboardButton(text='Старт', callback_data=json.dumps({'strt': True})))
    telegram_bot.send_photo(chat_id, photo)
    telegram_bot.send_message(chat_id=chat_id,
                              text=start_message,
                              reply_markup=markup,
                              parse_mode='Markdown')
Пример #11
0
    def price_alert(self, max_send_frequency=3):
        # Storing current utc datetime
        datetime_now = datetime.datetime.utcnow()
        target_time = datetime_now - datetime.timedelta(hours=max_send_frequency)

        subscription = Subscribe.query.filter(Subscribe.company_id == self.id, Subscribe.last_sent<=target_time, Subscribe.price_alert_status == 0, Subscribe.price_alert != None).all()
        for sub in subscription:
            if abs(self.last_done - sub.price_alert) < 0.005:
                user = TelegramSubscriber.query.filter(TelegramSubscriber.id==sub.telegram_id).first()
                response = render_template('telebot/price_alert.html', header='Price Alert', company=self, user=user, company_url=COMPANY_INFO_URL)
                telegram_bot.send_message(chat_id=user.chat_id, text=response, parse_mode='HTML')
                sub.price_alert_notified()
Пример #12
0
    def price_change(self, max_send_frequency=3):
        # Storing current utc datetime
        datetime_now = datetime.datetime.utcnow()
        target_time = datetime_now - datetime.timedelta(hours=max_send_frequency)

        if abs(self.change_percent) >= 3:
            # Query list of subscribers that received price alerts more than max_send_frequency hours ago for self(company)
            users = TelegramSubscriber.query.filter(TelegramSubscriber.subscribe.any(and_(Subscribe.last_sent<=target_time, Subscribe.company_id==self.id))).all()
            for user in users:
                response = render_template('telebot/price_alert.html', header='Volatile Alert', company=self, user=user, company_url=COMPANY_INFO_URL)
                telegram_bot.send_message(chat_id=user.chat_id, text=response, parse_mode='HTML')
                sub = Subscribe.query.filter(Subscribe.telegram_id == user.id, Subscribe.company_id == self.id).first()
                sub.user_notified()
Пример #13
0
def notify_room_participants(message):
    user = User.query.filter_by(id=message.from_user.id).first()
    # отправлять уведомления тем кто в комнате
    if user.state in [BotSate.IN_ROOM_CREATOR, BotSate.IN_ROOM_USER, BotSate.IN_ROOM_USER_READY]:
        if message.text == '/notify':
            telegram_bot.send_message(user.id, proper_usage_of_notify_text, parse_mode='Markdown')
            return
        telegram_bot.delete_message(message.chat.id, message.message_id)  # удалить сообщение со слэшем
        for room_user in user.participant.users:
            telegram_bot.send_message(chat_id=room_user.id,
                                      text='💬 {}: {}'.format(concatenate_name(user), message.text[8:]),
                                      disable_notification=True)
    else:
        check_state(message)
Пример #14
0
def confirm_present(chat_id):
    user = User.query.get(chat_id)
    try:
        markup = types.InlineKeyboardMarkup(row_width=2)
        markup.add(types.InlineKeyboardButton(text='Да',
                                              callback_data=json.dumps({'prz': True})))
        markup.add(types.InlineKeyboardButton(text='Нет',
                                              callback_data=json.dumps({'prz': False})))
        telegram_bot.send_message(text=correct_present_text.format(user.present), chat_id=chat_id,
                                  reply_markup=markup, parse_mode='Markdown', disable_notification=True)
    except Exception as e:
        user.present = None
        db.session.commit()
        request_present(user.id)
Пример #15
0
def send_or_update_course_option(chat_id, message_id=None, update=False):
    markup = types.InlineKeyboardMarkup()
    markup.add(types.InlineKeyboardButton(text='Умный дом на Arduino С++',
                                          callback_data=json.dumps({'crs': Course.SMART_HOUSE})))
    markup.add(types.InlineKeyboardButton(text='Python Джедай', callback_data=json.dumps({'crs': Course.PYTHON})))
    markup.add(types.InlineKeyboardButton(text='Получи Бонус', callback_data=json.dumps({'crs': Course.BONUS})))

    if update:
        telegram_bot.delete_message(chat_id=chat_id, message_id=message_id)
        telegram_bot.send_message(chat_id=chat_id, text=course_choice_message,
                                  reply_markup=markup, parse_mode='Markdown')

    else:
        telegram_bot.send_message(chat_id=chat_id, text=course_choice_message,
                                  reply_markup=markup, parse_mode='Markdown')
Пример #16
0
def handle_room_ready(query):
    ready = json.loads(query.data).get('rdy')
    user = User.query.get(query.message.chat.id)
    if ready and user.state == BotSate.IN_ROOM_USER:
        db.session.query(User).filter_by(id=user.id).update({"ready": True})
        user.state = BotSate.IN_ROOM_USER_READY
        db.session.commit()
        for u in user.participant.users:
            if u.id != user.id:
                telegram_bot.send_message(chat_id=u.id,
                                          text=user_ready_alert_message.format(user.first_name),
                                          disable_notification=True)
            else:
                telegram_bot.delete_message(chat_id=u.id, message_id=query.message.message_id)
                telegram_bot.send_message(chat_id=u.id, text=user_ready_message, parse_mode='Markdown',
                                          disable_notification=True)
Пример #17
0
def auth_user(message):
    if User.query.filter_by(id=message.from_user.id).first():
        check_state(message)
    else:
        user = User(id=message.from_user.id,
                    first_name=message.from_user.first_name,
                    last_name=message.from_user.last_name,
                    username=message.from_user.username,
                    state=BotSate.PHONE)

        db.session.add(user)
        db.session.commit()
        telegram_bot.send_message(chat_id=user.id,
                                  text=start_message.format(user.first_name),
                                  disable_notification=True)
        request_phone_number(message.from_user.id)
Пример #18
0
def check_ready(room_owner):
    ready_users_count = 0
    try:
        for u in room_owner.participant.users:
            if u.ready:
                ready_users_count += 1
            else:
                telegram_bot.send_message(chat_id=room_owner.id,
                                          text=user_doesnt_ready_owner_message.format(u.first_name),
                                          disable_notification=True)
                telegram_bot.send_message(chat_id=u.id,
                                          text=user_doesnt_ready_participant_message.format(room_owner.first_name),
                                          disable_notification=True)
                request_ready(chat_id=u.id)

        return ready_users_count
    except Exception:
        return ready_users_count
Пример #19
0
def handle_room_joining(query):
    choice = json.loads(query.data).get('inv')  # True - кнопка создания, False - кнопка присоединения
    user = User.query.get(query.message.chat.id)
    if user.state < BotSate.ROOM_CHOICE:  # ничего не делать если не в меню выбора кнопок или не в комнате
        return
    if choice:
        if not user.room:
            room = Room(owner_id=user.id)
            user.participant = room
            user.state = BotSate.IN_ROOM_CREATOR
            # создатель комнаты готов по-умолчанию
            db.session.query(User).filter_by(id=query.message.chat.id).update({"ready": True})
            db.session.add(room)
            db.session.commit()

            request_room_owner_panel(query.message.chat.id, user.first_name, room.identifier)
            telegram_bot.delete_message(chat_id=query.message.chat.id,
                                        message_id=query.message.message_id)
        else:
            if user.id == user.participant.owner_id:
                telegram_bot.send_message(text=already_in_room_message.format(user.participant.identifier),
                                          chat_id=query.message.chat.id, disable_notification=True)
            else:
                telegram_bot.send_message(text=already_in_room_message2.format(user.participant.identifier),
                                          chat_id=query.message.chat.id, disable_notification=True)
    else:
        if not user.room:
            telegram_bot.send_message(text=room_exists_message,
                                      chat_id=query.message.chat.id,
                                      parse_mode='Markdown', disable_notification=True)
            telegram_bot.delete_message(chat_id=query.message.chat.id,
                                        message_id=query.message.message_id)
        else:
            if user.id == user.participant.owner_id:
                telegram_bot.send_message(text=already_in_room_message.format(user.participant.identifier),
                                          chat_id=query.message.chat.id, disable_notification=True)
            else:
                telegram_bot.send_message(text=already_in_room_message2.format(user.participant.identifier),
                                          chat_id=query.message.chat.id, disable_notification=True)
Пример #20
0
def data_loading():
    app.app_context().push()
    # Load company (quote) details and announcement details
    print("Starting data loading job...")
    Company.company_scrape()
    announcements = Announcement.announcement_scrape()
    db.session.commit()

    if not Announcement.query.filter_by(
            announced_date=datetime.date.today()).first():
        print("No operation today, no announcement/stock update required")
        return

    # Send out announcements based on announcements loading
    for announcement in announcements:
        recipients = announcement.subscriber()
        chats = []
        for recipient in recipients:
            chats.append(recipient.chat_id)
        chats.append(os.environ.get('TARGET_CHANNEL'))

        response = announcement.announcement_message()
        if response:
            for chat in chats:
                time.sleep(0.1)
                telegram_bot.send_message(chat_id=chat,
                                          text=response,
                                          parse_mode='HTML')

    # Query all companies and run price check and price alert for each
    subs = Subscribe.query.all()
    for sub in subs:
        time.sleep(0.1)
        sub.company.price_change()
        sub.company.price_alert()

    db.session.commit()
    print("Data loading job completed...")
Пример #21
0
def exit_room(message):
    identifier = re.search(r'/exit\w{10}\b', message.text).group(0)[5:]
    user = User.query.filter_by(id=message.chat.id).first()
    room = Room.query.filter_by(identifier=identifier).first()

    if room and user.state in [BotSate.IN_ROOM_USER, BotSate.IN_ROOM_USER_READY]:
        user.participant = None
        user.state = BotSate.ROOM_CHOICE
        db.session.query(User).filter_by(id=user.id).update({"ready": False})
        db.session.commit()

        telegram_bot.send_message(chat_id=user.id,
                                  text=room_exit_message.format(user.first_name, room.identifier),
                                  disable_notification=True)

        for u in room.users:
            if u.id != user.id:
                telegram_bot.send_message(chat_id=u.id, text=room_exit_alert_message.format(user.first_name,
                                                                                            room.identifier),
                                          disable_notification=True)
        request_room_invitation(user.id)
    else:
        check_state(message)
Пример #22
0
def course_link(query):
    user = TelegramUser.query.get(query.message.chat.id)
    course = json.loads(query.data).get('prb')

    # вернуться к выбору языков
    if course == 'back':
        user.state = BotSate.COURSE_CHOICE
        db.session.commit()
        send_or_update_course_option(user.id, query.message.message_id, update=True)
        return
    # ccылки на курсы
    if course == Course.SMART_HOUSE:
        telegram_bot.send_message(user.id, text=smart_house_link, disable_web_page_preview=True,
                                  parse_mode='Markdown')
    elif course == Course.PYTHON:
        telegram_bot.send_message(user.id, text=python_link, disable_web_page_preview=True,
                                  parse_mode='Markdown')
    elif course == Course.JAVASCRIPT:
        telegram_bot.send_message(user.id, text=javascript_link, disable_web_page_preview=True,
                                  parse_mode='Markdown')
Пример #23
0
def send_autonomous_link(query):
    chat_id = query.message.chat.id
    photo = open('app/static/aut-pic.jpg', 'rb')
    telegram_bot.send_photo(chat_id, photo)
    telegram_bot.send_message(chat_id, text=autonomous_link, parse_mode='Markdown',
                              disable_web_page_preview=True)
Пример #24
0
def request_present(chat_id):
    telegram_bot.send_message(text=request_present_message, chat_id=chat_id, disable_notification=True)
Пример #25
0
def request_address(chat_id, first_name):
    telegram_bot.send_message(text=request_address_message.format(first_name),
                              chat_id=chat_id, disable_notification=True)
Пример #26
0
def confirm_phone_number_lack(chat_id):
    markup = types.ReplyKeyboardMarkup(row_width=1, one_time_keyboard=True, resize_keyboard=True)
    markup.add(types.KeyboardButton(text=skip_phone_button_text))
    telegram_bot.send_message(text=not_phone_number_info, chat_id=chat_id, reply_markup=markup,
                              disable_notification=True)
Пример #27
0
def request_room_owner_panel(chat_id, first_name, room_identifier):
    markup = types.InlineKeyboardMarkup(row_width=2)
    markup.add(types.InlineKeyboardButton(text='Старт',
                                          callback_data=json.dumps({'strt': True})))
    telegram_bot.send_message(text=room_created_message.format(room_identifier),
                              chat_id=chat_id, reply_markup=markup, parse_mode='Markdown', disable_notification=True)
Пример #28
0
def request_ready(chat_id):
    markup = types.InlineKeyboardMarkup(row_width=2)
    markup.add(types.InlineKeyboardButton(text='Готов!',
                                          callback_data=json.dumps({'rdy': True})))
    telegram_bot.send_message(text=ready_message, chat_id=chat_id,
                              reply_markup=markup, parse_mode='Markdown', disable_notification=True)
Пример #29
0
def send_help(message):
    telegram_bot.send_message(chat_id=message.from_user.id, text=help_message,
                              parse_mode='Markdown', disable_notification=True)
Пример #30
0
def request_registration_start(chat_id):
    telegram_bot.send_message(text=registration_start_message, chat_id=chat_id,
                              parse_mode='Markdown')