13
13
14
14
sys_path .append ('../' )
15
15
from budget_graph .logger import setup_logger
16
- from budget_graph .time_checking import timeit
16
+ # from budget_graph.time_checking import timeit
17
17
from budget_graph .create_csv import CsvFileWithTable
18
18
from budget_graph .registration_service import user_registration
19
19
from budget_graph .dictionary import Stickers , receive_translation
20
20
from budget_graph .encryption import getting_hash , get_salt , logging_hash
21
21
from budget_graph .user_cache_structure import UserLanguageCache , UserRegistrationStatusCache
22
22
from budget_graph .db_manager import DatabaseQueries , connect_db , close_db , connect_defer_close_db
23
- from budget_graph .helpers import get_category_button_labels , get_bot_commands , get_category_translate , \
24
- get_timezone_buttons
25
23
from budget_graph .validation import date_validation , value_validation , description_validation , username_validation , \
26
24
password_validation , category_validation
25
+ from budget_graph .helpers import StorageMsgIdForDeleteAfterOperation , get_category_button_labels , get_bot_commands , \
26
+ get_category_translate , get_timezone_buttons , get_language_buttons
27
27
28
28
29
29
load_dotenv () # Load environment variables from .env file
@@ -103,13 +103,10 @@ def group_settings_get_buttons(message):
103
103
reply_markup = markup_1 )
104
104
105
105
106
- @timeit
107
- def reply_buttons (message ):
106
+ @connect_defer_close_db
107
+ def reply_buttons (db_connection , message ):
108
108
telegram_id : int = message .from_user .id
109
- connection = connect_db ()
110
- bot_db = DatabaseQueries (connection )
111
- res : str = bot_db .get_username_by_telegram_id (telegram_id )
112
- close_db (connection )
109
+ res : str = db_connection .get_username_by_telegram_id (telegram_id )
113
110
if res :
114
111
reply_menu_buttons_register (message )
115
112
else :
@@ -162,6 +159,32 @@ def get_my_id(message) -> None:
162
159
f"telegram ID: { message .from_user .id } " )
163
160
164
161
162
+ @bot .message_handler (commands = ['del_msg_transaction' ])
163
+ @connect_defer_close_db
164
+ def del_msg_transaction (db_connection , message ) -> None :
165
+ telegram_id : int = message .from_user .id
166
+ chat_id : int = message .chat .id
167
+ user_language : str = check_user_language (telegram_id )
168
+
169
+ reg_res : bool = user_is_registered (telegram_id )
170
+ if not reg_res :
171
+ bot .send_message (chat_id , receive_translation (user_language , 'not_register' ))
172
+ bot .send_sticker (chat_id , Stickers .get_sticker_by_id ('id_5' ))
173
+ logger_bot .info (f'[del_msg_transaction] Unregistered user interaction. TelegramID: { logging_hash (telegram_id )} ' )
174
+ reply_menu_buttons_not_register (message )
175
+ return
176
+
177
+ old_feature_status : bool = db_connection .get_feature_status_del_msg_after_transaction (telegram_id )
178
+ res : bool = db_connection .change_feature_status_del_msg_after_transaction (telegram_id )
179
+ if res and old_feature_status : # the functionality was enabled
180
+ bot .send_message (chat_id , receive_translation (user_language , 'del_msg_transaction_of' ))
181
+ elif res and not old_feature_status : # the functionality was disabled
182
+ bot .send_message (chat_id , receive_translation (user_language , 'del_msg_transaction_on' ))
183
+ else :
184
+ bot .send_message (chat_id , f"{ receive_translation (user_language , 'del_msg_transaction_on' )} \n "
185
+ f"{ receive_translation (user_language , 'contact_support' )} " )
186
+
187
+
165
188
@bot .message_handler (commands = ['project_github' ])
166
189
def project_github (message ) -> None :
167
190
telegram_id : int = message .from_user .id
@@ -229,19 +252,7 @@ def callback_query_change_timezone(call):
229
252
def change_language (message ) -> None :
230
253
telegram_id : int = message .from_user .id
231
254
user_language : str = check_user_language (telegram_id )
232
- markup_1 = InlineKeyboardMarkup (row_width = 2 )
233
- # button_labels: dict = {'English': 'en', 'Español': 'es', 'Русский': 'ru', 'Français': 'fr', ...} - cache
234
-
235
- # TODO - cache
236
- markup_1 .add (InlineKeyboardButton ('English' , callback_data = 'change_language_en' ))
237
- markup_1 .add (InlineKeyboardButton ('Español' , callback_data = 'change_language_es' ))
238
- markup_1 .add (InlineKeyboardButton ('Русский' , callback_data = 'change_language_ru' ))
239
- markup_1 .add (InlineKeyboardButton ('Français' , callback_data = 'change_language_fr' ))
240
- markup_1 .add (InlineKeyboardButton ('Deutsch' , callback_data = 'change_language_de' ))
241
- markup_1 .add (InlineKeyboardButton ('Islenskur' , callback_data = 'change_language_is' ))
242
- markup_1 .add (InlineKeyboardButton ('Português' , callback_data = 'change_language_pt' ))
243
- markup_1 .add (InlineKeyboardButton ('қазақ' , callback_data = 'change_language_kk' ))
244
-
255
+ markup_1 = InlineKeyboardMarkup (get_language_buttons ())
245
256
bot .send_message (message .chat .id , f"{ receive_translation (user_language , 'choose_language' )} :" ,
246
257
reply_markup = markup_1 )
247
258
@@ -304,17 +315,17 @@ def get_my_token(db_connection, message, user_language: str) -> None:
304
315
bot .send_message (message .chat .id , token )
305
316
306
317
307
- def add_income ( message , user_language : str ) -> None :
308
- bot . send_message ( message . chat . id , f" { receive_translation ( user_language , "enter_income" ) } :" )
309
- bot . register_next_step_handler ( message , process_add_date_for_transfer , False )
310
-
311
-
312
- def add_expense ( message , user_language : str ) -> None :
313
- bot . send_message ( message . chat . id , f" { receive_translation ( user_language , "enter_expense" ) } :" )
314
- bot .register_next_step_handler (message , process_add_date_for_transfer , True )
318
+ @ connect_defer_close_db
319
+ def start_transaction ( db_connection , message , user_language : str , is_negative : bool ) -> None :
320
+ text_key : str = 'enter_expense' if is_negative else 'enter_income'
321
+ msg = bot . send_message ( message . chat . id , f" { receive_translation ( user_language , text_key ) } :" )
322
+ feature_is_active : bool = db_connection . get_feature_status_del_msg_after_transaction ( message . from_user . id )
323
+ msg_del_obj = StorageMsgIdForDeleteAfterOperation ( feature_is_active )
324
+ msg_del_obj . append ( msg . id )
325
+ bot .register_next_step_handler (message , process_add_date_for_transfer , is_negative , msg_del_obj )
315
326
316
327
317
- def process_add_date_for_transfer (message , is_negative : bool ) -> None :
328
+ def process_add_date_for_transfer (message , is_negative : bool , msg_del_obj : StorageMsgIdForDeleteAfterOperation ) -> None :
318
329
"""
319
330
Adds income and expense to the database.
320
331
Accepts an unvalidated value,
@@ -324,9 +335,11 @@ def process_add_date_for_transfer(message, is_negative: bool) -> None:
324
335
message:
325
336
is_negative (bool): False if X > 0 (add_income), True if X < 0 (add_expense)
326
337
X = 0 - will be rejected by the validator
338
+ msg_del_obj:
327
339
328
340
Returns: None
329
341
"""
342
+ msg_del_obj .append (message .message_id )
330
343
telegram_id : int = message .from_user .id
331
344
user_language : str = check_user_language (telegram_id )
332
345
value : str = message .text
@@ -338,14 +351,17 @@ def process_add_date_for_transfer(message, is_negative: bool) -> None:
338
351
339
352
if value :
340
353
value *= - 1 if is_negative else 1
341
- bot .send_message (message .chat .id , f"{ receive_translation (user_language , "set_date" )} (DD/MM/YYYY)" ,
342
- reply_markup = markup_1 )
343
- bot .register_next_step_handler (message , process_add_category_for_transfer , value , user_language )
354
+ msg = bot .send_message (message .chat .id , f"{ receive_translation (user_language , "set_date" )} (DD/MM/YYYY)" ,
355
+ reply_markup = markup_1 )
356
+ msg_del_obj .append (msg .id )
357
+ bot .register_next_step_handler (message , process_add_category_for_transfer , value , user_language , msg_del_obj )
344
358
else :
345
359
bot .send_message (message .chat .id , receive_translation (user_language , 'invalid_value' ))
346
360
347
361
348
- def process_add_category_for_transfer (message , value : int , user_language : str ) -> None :
362
+ def process_add_category_for_transfer (message , value : int , user_language : str ,
363
+ msg_del_obj : StorageMsgIdForDeleteAfterOperation ) -> None :
364
+ msg_del_obj .append (message .message_id )
349
365
markup_1 = ReplyKeyboardMarkup (resize_keyboard = True , row_width = 4 )
350
366
button_labels : tuple = get_category_button_labels (user_language )
351
367
buttons : list = [KeyboardButton (label ) for label in button_labels ] # assembling buttons from the tuple above
@@ -355,24 +371,30 @@ def process_add_category_for_transfer(message, value: int, user_language: str) -
355
371
record_date_is_valid : bool = asyncio_run (date_validation (record_date )) # DD/MM/YYYY
356
372
357
373
if record_date_is_valid :
358
- bot .send_message (message .chat .id , f"{ receive_translation (user_language , "select_category" )} :" ,
359
- reply_markup = markup_1 )
360
- bot .register_next_step_handler (message , process_add_description_for_transfer , value , record_date , user_language )
374
+ msg = bot .send_message (message .chat .id , f"{ receive_translation (user_language , "select_category" )} :" ,
375
+ reply_markup = markup_1 )
376
+ msg_del_obj .append (msg .id )
377
+ bot .register_next_step_handler (message , process_add_description_for_transfer , value ,
378
+ record_date , user_language , msg_del_obj )
361
379
else :
362
380
bot .send_message (message .chat .id , receive_translation (user_language , 'invalid_date' ))
363
381
reply_buttons (message )
364
382
365
383
366
- def process_add_description_for_transfer (message , value : int , record_date : str , user_language : str ) -> None :
384
+ def process_add_description_for_transfer (message , value : int , record_date : str , user_language : str ,
385
+ msg_del_obj : StorageMsgIdForDeleteAfterOperation ) -> None :
386
+ msg_del_obj .append (message .message_id )
367
387
markup_1 = ReplyKeyboardMarkup (resize_keyboard = True , row_width = 4 )
368
388
btn1 = KeyboardButton (receive_translation (user_language , 'no_description' ))
369
389
markup_1 .add (btn1 )
370
390
category : str = message .text
371
391
372
392
if category_validation (user_language , category ):
373
- bot .send_message (message .chat .id , receive_translation (user_language , 'add_description' ),
374
- reply_markup = markup_1 )
375
- bot .register_next_step_handler (message , process_transfer_final , value , record_date , category , user_language )
393
+ msg = bot .send_message (message .chat .id , receive_translation (user_language , 'add_description' ),
394
+ reply_markup = markup_1 )
395
+ msg_del_obj .append (msg .id )
396
+ bot .register_next_step_handler (message , process_transfer_final , value , record_date ,
397
+ category , user_language , msg_del_obj )
376
398
else :
377
399
bot .send_message (message .chat .id , receive_translation (user_language , 'invalid_category' ))
378
400
reply_buttons (message )
@@ -386,8 +408,10 @@ def process_transfer_final(
386
408
value : int ,
387
409
record_date : str ,
388
410
category : str ,
389
- user_language : str
411
+ user_language : str ,
412
+ msg_del_obj : StorageMsgIdForDeleteAfterOperation
390
413
) -> None :
414
+ msg_del_obj .append (message .message_id )
391
415
telegram_id : int = message .from_user .id
392
416
description : str = message .text
393
417
@@ -396,7 +420,8 @@ def process_transfer_final(
396
420
397
421
if description_validation (description ):
398
422
if db_connection .add_transaction_to_db (value , record_date , category , description , telegram_id = telegram_id ):
399
- bot .send_message (message .chat .id , f"{ receive_translation (user_language , 'entry_add_success' )} !" )
423
+ bot .send_message (chat_id := message .chat .id , f"{ receive_translation (user_language , 'entry_add_success' )} !" )
424
+ msg_del_obj .delete_messages (bot , chat_id )
400
425
else :
401
426
bot .send_message (message .chat .id , f"{ receive_translation (user_language , 'entry_add_error' )} \n "
402
427
f"{ receive_translation (user_language , 'contact_support' )} " )
@@ -896,9 +921,9 @@ def text(message) -> None:
896
921
if message .text == f"📖 { receive_translation (user_language , 'view_table' )} " :
897
922
view_table (message , res , user_language )
898
923
elif message .text == f"📈 { receive_translation (user_language , 'add_income' )} " :
899
- add_income (message , user_language )
924
+ start_transaction (message , user_language , False )
900
925
elif message .text == f"📉 { receive_translation (user_language , 'add_expense' )} " :
901
- add_expense (message , user_language )
926
+ start_transaction (message , user_language , True )
902
927
elif message .text == f"❌ { receive_translation (user_language , 'del_record' )} " :
903
928
delete_record (message , user_language )
904
929
elif message .text == f"🗃️ { receive_translation (user_language , 'get_csv' )} " :
0 commit comments