-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbot_model.py
More file actions
108 lines (91 loc) · 3.72 KB
/
bot_model.py
File metadata and controls
108 lines (91 loc) · 3.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
from bot_view import BotView
from user_storage import Users
from wwntgbotlib.country_codes import CountryCodes
from wwntgbotlib.keyboard_button_names import KeyboardButtonsNames as KBN
from user_model import User
from navigation_menu import Navigator, Item, Action
import pickle
from google.cloud import storage
class NewsReceiver(Action):
def __init__(self, a_logger, token):
self.token = token
self.users_storage = Users()
self.logger = a_logger
def run(self, message):
print("Start get data")
chat_id = message["chat"]["id"]
parse_mode = 'MarkdownV2'
message_text = message["text"]
self.logger.debug(f"Message: {message_text}")
user = self.__get_user(chat_id)
if user is None:
user = self.__add_user(chat_id)
print("Message text:", message_text)
news_article = NewsReceiver.__get_news_article(message_text, user)
if not news_article:
return message_text
post = BotView.get_post(news_article)
self.__save_user(user)
print("Finish get data")
return post
@staticmethod
def __get_news_article(message_text, user: User):
try:
country_code = CountryCodes.get_member_by_value(message_text)
except:
return None
return user.get_news_article(country_code)
def __get_user(self, chat_id):
return self.users_storage.get_user(chat_id)
def __save_user(self, user: User):
self.users_storage.add_user(user)
def __add_user(self, chat_id):
user = self.users_storage.add_user(User(chat_id))
return user
def __getstate__(self):
return {
"token" : self.token,
"users_storage" : self.users_storage,
"logger" : self.logger
}
def __setstate__(self, state):
self.token = state["token"]
self.users_storage = state["users_storage"]
self.logger = state["logger"]
# class MyTestClass(Action):
# def run(self, message):
# print("Hello from MyTestClass!!!!!!!!!!!!!!!!!!")
class NavigatorController:
def __init__(self, news_receiver):
self.__news_receiver = news_receiver
def create_navigator(self):
main = Item("Головна")
news = main.add_next_item("Новини")
bbc_news = news.add_next_item("BBC")
ukraine_news = bbc_news.add_next_item(KBN.UA.value)
ukraine_news.add_action(self.__news_receiver)
world_news = bbc_news.add_next_item(KBN.WORLD.value)
world_news.add_action(self.__news_receiver)
settings = main.add_next_item("Налаштування")
settings.add_next_item("Донат")
return Navigator(main, "Назад")
def reset(self, message):
navigator = self.create_navigator()
self.save_state(navigator, message)
return navigator
def save_state(self, navigator: Navigator, message):
chat_id = message['chat']['id']
nav_pkl = pickle.dumps(navigator)
navigation_users_data_bucket = storage.Client().bucket("navigation_users_data")
blob = navigation_users_data_bucket.blob(f"user_{chat_id}_nav_data.pickle")
blob.upload_from_string(nav_pkl)
def get_navigator(self, message):
chat_id = message['chat']['id']
navigation_users_data_bucket = storage.Client().bucket("navigation_users_data")
blob = navigation_users_data_bucket.blob(f"user_{chat_id}_nav_data.pickle")
if blob.exists():
navigator_pkl = blob.download_as_string()
navigator = pickle.loads(navigator_pkl)
return navigator
navigator = self.create_navigator()
return navigator