TFinance
/
game.py
107 строк · 6.1 Кб
1from telegram import InlineKeyboardMarkup, InlineKeyboardButton
2
3from database import Database
4from functions import create_user, PredictionAlreadySet, StockSelectedAlready, generate_prediction, user_won
5from graphics.visualize import check_stock_prices, pdr, do_stock_image
6
7
8# Обработчик команды /game [stock_index]. Основное меню игры с предугадыванием.
9from stock import check_stock
10
11
12def game_menu(update, context):
13db: Database = Database('data.db')
14user = create_user(update)
15message_id = str(int(update.message.message_id) + 2) # Сохраняем id сообщения для возможности одновременной
16# игры на многих акциях. Прибавляем 2 т.к. отправляем 2 сообщения: фото и приписку к нему с клавиатурой.
17try:
18if not context.args: # Проверка на наличие аргументов.
19update.message.reply_text("Неправильно введена команда! Попробуйте: /game [индекс акции]")
20if db.check_selected_stocks(user): # Проверка: была ли выбрана акция до этого? Избегаем читерства.
21for stock in db.get_selected_stocks(user):
22if context.args[0] in stock:
23raise StockSelectedAlready
24if db.check_prediction_stock(user, context.args[0]): # Проверка: был ли прогноз на эту акцию.
25raise PredictionAlreadySet
26if not check_stock(context.args[0]):
27raise KeyError
28
29# Создание клавиатуры и отправка ответа.
30keyboard = [[
31InlineKeyboardButton("Повышение", callback_data=str(1)),
32InlineKeyboardButton("Понижение", callback_data=str(2))]]
33reply_markup = InlineKeyboardMarkup(keyboard)
34update.message.reply_photo(photo=do_stock_image(context.args[0]))
35db.select_stock(user, f"{context.args[0]}:{message_id}") # Запоминаем, что акция была выбрана.
36update.message.reply_text(text=f"Предугадайте курс {context.args[0]} на завтра.", reply_markup=reply_markup)
37except pdr._utils.RemoteDataError:
38update.message.reply_text(text="Такой акции не было найдено в данных Yahoo Finance.")
39db.remove_selected_stock(user, message_id)
40except TypeError:
41update.message.reply_text('Вас нет в бд, запустите команду /start чтобы исправить ошибку')
42except KeyError:
43update.message.reply_text(text="Такой акции не было найдено в данных Yahoo Finance.")
44db.remove_selected_stock(user, message_id)
45except StockSelectedAlready:
46update.message.reply_text(text="Эта акция уже была вами выбрана.")
47db.remove_selected_stock(user, message_id)
48except PredictionAlreadySet:
49update.message.reply_text(text="Прогноз на эту акцию уже установлен.")
50db.remove_selected_stock(user, message_id)
51
52return 1 # Возвращаем 1, чтобы показать ConversationHandler'у состояние, в котором находимся.
53
54
55# Кнопка повышения акции.
56def higher_game(update, _):
57db: Database = Database('data.db')
58user = create_user(update)
59
60# Обработка и ответ на колл-бэк.
61query = update.callback_query
62query.answer()
63
64generate_prediction(query, database=db, user=user, prediction="up") # Устанавливаем прогноз на акцию.
65query.edit_message_text(text="Предсказание установлено на повышение") # Редактируем сообщение с клавиатурой.
66
67
68# Кнопка понижения акции.
69def lower_game(update, _):
70db: Database = Database('data.db')
71user = create_user(update)
72
73# Обработка и ответ на колл-бэк.
74query = update.callback_query
75query.answer()
76
77generate_prediction(query, database=db, user=user, prediction="down") # Устанавливаем прогноз на акцию.
78query.edit_message_text(text="Предсказание установлено на понижение") # Редактируем сообщение с клавиатурой.
79
80
81# Подсчет результатов игры.
82def game_results(context):
83db: Database = Database('data.db')
84for user in db.get_users():
85if not user.prediction:
86continue
87for i in user.prediction.split():
88# Проверка прогноза
89try:
90if i.split(":")[-1] == 'up':
91if check_stock_prices(i.split(":")[0]):
92user_won(context, database=db, user=user, stock=i.split(':')[0])
93else:
94context.bot.send_message(chat_id=user.id, text=f"Прогноз {i.split(':')[0]} был неверным.")
95else:
96if not check_stock_prices(i.split(":")[0]):
97user_won(context, database=db, user=user, stock=i.split(':')[0])
98else:
99context.bot.send_message(chat_id=user.id, text=f"Прогноз {i.split(':')[0]} был неверным.")
100except KeyError:
101# Если биржа перестанет работать, по непонятным нам причинам, то удалятся прошлые прогнозы.
102db.delete_predictions(user)
103context.bot.send_message(chat_id=user.id, text=f"На данный момент к бирже нет доступа. "
104f"Прогноз на акцию {i.split(':')[0]} был отменен.")
105# Удаляем пройденные прогнозы
106db.delete_predictions(user)
107user.prediction = db.get_predictions(user)
108