-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathapp_globals.py
More file actions
237 lines (167 loc) · 7.09 KB
/
Copy pathapp_globals.py
File metadata and controls
237 lines (167 loc) · 7.09 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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
from loguru import logger
import json
import asyncio
from pathlib import Path
from sys import exit as sys_exit
from aiogram import Dispatcher, Bot
from aiogram.fsm.storage.memory import MemoryStorage
from aiogram.enums import ParseMode
from collections import deque
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import SecretStr
from collections import deque
from time import time
from app_config import app_config
from tools import save_app_results
### Set start time ###
acheta_start_time = int(
time()
)
### Global mutex ###
results_lock = asyncio.Lock()
### Init results ###
app_results = {}
app_results_obj = Path(app_config['service']['results_path'])
if app_results_obj.exists():
logger.info(f"Loading results from '{app_results_obj}' file...")
with open(file=app_results_obj, mode="rt") as input_results:
try:
app_results = json.load(fp=input_results)
except BaseException as E:
logger.critical(f"Cannot load results from '{app_results_obj}' ({str(E)})")
sys_exit(1)
else:
logger.info(f"Successfully loaded results from '{app_results_obj}' file!")
else:
logger.warning(f"No results file '{app_results_obj}' exists. Trying to create...")
try:
if not save_app_results():
raise Exception
except BaseException as E:
logger.critical(f"Cannot create '{app_results_obj}' file. Exiting...")
sys_exit(1)
else:
logger.info(f"Successfully created empty '{app_results_obj}' file")
for node_name in app_results:
app_results[node_name]['last_status'] = "unknown"
app_results[node_name]['last_update'] = 0
app_results[node_name]['last_chain_id'] = 0
app_results[node_name]['last_cycle'] = 0
app_results[node_name]['last_result'] = {"unknown": "Never updated before"}
for wallet_address in app_results[node_name]['wallets']:
app_results[node_name]['wallets'][wallet_address] = {}
app_results[node_name]['wallets'][wallet_address]['last_status'] = "unknown"
app_results[node_name]['wallets'][wallet_address]['last_update'] = 0
app_results[node_name]['wallets'][wallet_address]['final_balance'] = 0
app_results[node_name]['wallets'][wallet_address]['candidate_rolls'] = 0
app_results[node_name]['wallets'][wallet_address]['active_rolls'] = 0
app_results[node_name]['wallets'][wallet_address]['missed_blocks'] = 0
app_results[node_name]['wallets'][wallet_address]['last_result'] = {"unknown": "Never updated before"}
app_results[node_name]['wallets'][wallet_address]['stat'] = deque(
maxlen=int(
24 * 60 / app_config['service']['main_loop_period_min']
)
)
### MASSA network values ###
massa_config = {}
massa_network = {}
massa_network['values'] = {
"latest_release": "",
"current_release": "",
"current_cycle": 0,
"roll_price": 0,
"block_reward": 0,
"total_stakers": 0,
"total_staked_rolls": 0,
"last_updated": 0
}
massa_network['stat'] = deque(
maxlen=int(
24 * 60 / app_config['service']['massa_network_update_period_min']
)
)
### Restore stat values ###
app_stat_obj = Path(app_config['service']['stat_path'])
if app_stat_obj.exists():
logger.info(f"Loading stat from '{app_stat_obj}' file...")
try:
with open(file=app_stat_obj, mode="rt") as input_stat:
app_stat = json.load(fp=input_stat)
except BaseException as E:
logger.error(f"Cannot load stat from '{app_stat_obj}': ({str(E)})")
else:
logger.info(f"Loaded app_stat from '{app_stat_obj}' successfully")
try:
for node_name in app_results:
for wallet_address in app_results[node_name]['wallets']:
wallet_stat = app_stat['app_results'][node_name][wallet_address].get("stat", None)
if wallet_stat and type(wallet_stat) == list and len(wallet_stat) > 0:
for measure in wallet_stat:
app_results[node_name]['wallets'][wallet_address]['stat'].append(measure)
logger.info(f"Restored {len(app_results[node_name]['wallets'][wallet_address]['stat'])} measures for wallet '{wallet_address}'@'{node_name}'")
except BaseException as E:
logger.error(f"Cannot restore app_result stat ({str(E)})")
else:
logger.info(f"Restored app_results stat successfully")
try:
massa_network_stat = app_stat['massa_network'].get("stat", None)
if massa_network_stat and type(massa_network_stat) == list and len(massa_network_stat) > 0:
for measure in massa_network_stat:
if type(measure) == dict:
massa_network['stat'].append(measure)
logger.info(f"Restored {len(massa_network['stat'])} measures for massa_network")
except BaseException as E:
logger.error(f"Cannot restore massa_network stat ({str(E)})")
else:
logger.info(f"Restored massa_network stat successfully")
### Init Telegram stuff ###
class BotSettings(BaseSettings):
model_config = SettingsConfigDict(
env_file=".env",
env_file_encoding='utf-8'
)
ACHETA_KEY: SecretStr
ACHETA_CHAT: int
bot = BotSettings()
telegram_queue = deque()
tg_dp = Dispatcher(
storage=MemoryStorage()
)
tg_bot = Bot(
token=bot.ACHETA_KEY.get_secret_value(),
parse_mode=ParseMode.HTML,
disable_web_page_preview=True
)
### Acheta releases stuff ###
local_acheta_release = "ACHETA.1.2.3"
latest_acheta_release = ""
### Init deferred_credits ###
deferred_credits = {}
deferred_credits_obj = Path(app_config['service']['deferred_credits_path'])
if not deferred_credits_obj.exists():
logger.warning(f"No deferred_credits file '{deferred_credits_obj}' exists. Skipping...")
else:
logger.info(f"Loading deferred_credits from '{deferred_credits_obj}' file...")
with open(file=deferred_credits_obj, mode="rt") as input_deferred_credits:
try:
deferred_credits = json.load(fp=input_deferred_credits)
except BaseException as E:
logger.error(f"Cannot load deferred_credits from '{deferred_credits_obj}' ({str(E)})")
else:
logger.info(f"Successfully loaded deferred_credits from '{deferred_credits_obj}' file!")
### Init public_user_dir ###
public_dir = {}
public_dir_obj = Path(app_config['service']['public_dir_path'])
if not public_dir_obj.exists():
logger.warning(f"No public_dir file '{public_dir_obj}' exists. Skipping...")
else:
logger.info(f"Loading public_dir from '{public_dir_obj}' file...")
with open(file=public_dir_obj, mode="rt") as input_public_dir:
try:
public_dir = json.load(fp=input_public_dir)
except BaseException as E:
logger.error(f"Cannot load public_dir from '{public_dir_obj}' file ({str(E)})")
else:
logger.info(f"Successfully loaded public_dir from '{public_dir_obj}' file ({len(public_dir)} keys)")
if __name__ == "__main__":
pass