TFinance

Форк
0
/
game.py 
107 строк · 6.1 Кб
1
from telegram import InlineKeyboardMarkup, InlineKeyboardButton
2

3
from database import Database
4
from functions import create_user, PredictionAlreadySet, StockSelectedAlready, generate_prediction, user_won
5
from graphics.visualize import check_stock_prices, pdr, do_stock_image
6

7

8
# Обработчик команды /game [stock_index]. Основное меню игры с предугадыванием.
9
from stock import check_stock
10

11

12
def game_menu(update, context):
13
    db: Database = Database('data.db')
14
    user = create_user(update)
15
    message_id = str(int(update.message.message_id) + 2)  # Сохраняем id сообщения для возможности одновременной
16
    # игры на многих акциях. Прибавляем 2 т.к. отправляем 2 сообщения: фото и приписку к нему с клавиатурой.
17
    try:
18
        if not context.args:  # Проверка на наличие аргументов.
19
            update.message.reply_text("Неправильно введена команда! Попробуйте: /game [индекс акции]")
20
        if db.check_selected_stocks(user):  # Проверка: была ли выбрана акция до этого? Избегаем читерства.
21
            for stock in db.get_selected_stocks(user):
22
                if context.args[0] in stock:
23
                    raise StockSelectedAlready
24
        if db.check_prediction_stock(user, context.args[0]):  # Проверка: был ли прогноз на эту акцию.
25
            raise PredictionAlreadySet
26
        if not check_stock(context.args[0]):
27
            raise KeyError
28

29
        # Создание клавиатуры и отправка ответа.
30
        keyboard = [[
31
            InlineKeyboardButton("Повышение", callback_data=str(1)),
32
            InlineKeyboardButton("Понижение", callback_data=str(2))]]
33
        reply_markup = InlineKeyboardMarkup(keyboard)
34
        update.message.reply_photo(photo=do_stock_image(context.args[0]))
35
        db.select_stock(user, f"{context.args[0]}:{message_id}")  # Запоминаем, что акция была выбрана.
36
        update.message.reply_text(text=f"Предугадайте курс {context.args[0]} на завтра.", reply_markup=reply_markup)
37
    except pdr._utils.RemoteDataError:
38
        update.message.reply_text(text="Такой акции не было найдено в данных Yahoo Finance.")
39
        db.remove_selected_stock(user, message_id)
40
    except TypeError:
41
        update.message.reply_text('Вас нет в бд, запустите команду /start чтобы исправить ошибку')
42
    except KeyError:
43
        update.message.reply_text(text="Такой акции не было найдено в данных Yahoo Finance.")
44
        db.remove_selected_stock(user, message_id)
45
    except StockSelectedAlready:
46
        update.message.reply_text(text="Эта акция уже была вами выбрана.")
47
        db.remove_selected_stock(user, message_id)
48
    except PredictionAlreadySet:
49
        update.message.reply_text(text="Прогноз на эту акцию уже установлен.")
50
        db.remove_selected_stock(user, message_id)
51

52
    return 1  # Возвращаем 1, чтобы показать ConversationHandler'у состояние, в котором находимся.
53

54

55
# Кнопка повышения акции.
56
def higher_game(update, _):
57
    db: Database = Database('data.db')
58
    user = create_user(update)
59

60
    # Обработка и ответ на колл-бэк.
61
    query = update.callback_query
62
    query.answer()
63

64
    generate_prediction(query, database=db, user=user, prediction="up")  # Устанавливаем прогноз на акцию.
65
    query.edit_message_text(text="Предсказание установлено на повышение")  # Редактируем сообщение с клавиатурой.
66

67

68
# Кнопка понижения акции.
69
def lower_game(update, _):
70
    db: Database = Database('data.db')
71
    user = create_user(update)
72

73
    # Обработка и ответ на колл-бэк.
74
    query = update.callback_query
75
    query.answer()
76

77
    generate_prediction(query, database=db, user=user, prediction="down")  # Устанавливаем прогноз на акцию.
78
    query.edit_message_text(text="Предсказание установлено на понижение")  # Редактируем сообщение с клавиатурой.
79

80

81
# Подсчет результатов игры.
82
def game_results(context):
83
    db: Database = Database('data.db')
84
    for user in db.get_users():
85
        if not user.prediction:
86
            continue
87
        for i in user.prediction.split():
88
            # Проверка прогноза
89
            try:
90
                if i.split(":")[-1] == 'up':
91
                    if check_stock_prices(i.split(":")[0]):
92
                        user_won(context, database=db, user=user, stock=i.split(':')[0])
93
                    else:
94
                        context.bot.send_message(chat_id=user.id, text=f"Прогноз {i.split(':')[0]} был неверным.")
95
                else:
96
                    if not check_stock_prices(i.split(":")[0]):
97
                        user_won(context, database=db, user=user, stock=i.split(':')[0])
98
                    else:
99
                        context.bot.send_message(chat_id=user.id, text=f"Прогноз {i.split(':')[0]} был неверным.")
100
            except KeyError:
101
                # Если биржа перестанет работать, по непонятным нам причинам, то удалятся прошлые прогнозы.
102
                db.delete_predictions(user)
103
                context.bot.send_message(chat_id=user.id, text=f"На данный момент к бирже нет доступа. "
104
                                                               f"Прогноз на акцию {i.split(':')[0]} был отменен.")
105
        # Удаляем пройденные прогнозы
106
        db.delete_predictions(user)
107
        user.prediction = db.get_predictions(user)
108

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.