Skip to content

Commit 25fbb95

Browse files
committed
update website and fix bugs
1 parent fa2ab75 commit 25fbb95

File tree

2 files changed

+104
-39
lines changed

2 files changed

+104
-39
lines changed

api/templates/app.html

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,26 +84,60 @@
8484
color: #34D399;
8585
text-decoration: underline;
8686
}
87+
.notification-bar {
88+
background-color: #facc15; /* bright yellow */
89+
color: #1f2937; /* dark gray text */
90+
padding: 12px 20px;
91+
font-size: 14px;
92+
text-align: center;
93+
border-bottom: 2px solid #f59e0b; /* orange accent for separation */
94+
position: relative;
95+
z-index: 1000;
96+
}
97+
.notification-bar a {
98+
color: #1e40af;
99+
font-weight: bold;
100+
}
101+
.notification-bar a:hover {
102+
text-decoration: underline;
103+
}
104+
87105
</style>
88106
</head>
89107
<body>
108+
<div class="notification-bar">
109+
⚠️ Heads up! This bot is no longer actively maintained due to upcoming platform changes.
110+
You can <a href="https://teleexpense.vercel.app" target="_blank">try the new version here</a>,
111+
or <a href="https://vercel.com/changelog/legacy-build-image-is-being-deprecated-on-august-1-2025-4rKrNPKXA3yiCV9c9h2Z5k" target="_blank">read more</a>.
112+
</div>
113+
114+
90115
<div class="container">
91116
<div class="child">
92117
<img src="https://github.com/brucewzj99/tele-tracker-v2/blob/main/api/templates/logo.png?raw=true" alt="Logo" class="logo" />
93-
<h1 class="title">tele-tracker-bot</h1>
118+
<h1 class="title">TeleFinance Tracker Bot</h1>
94119
<h2 class="subtitle">A python telegram bot to help track expenses!</h2>
95120
<p>You can access the bot using this <a href="https://t.me/telefinance_tracker_bot">link</a>.
96121
<br>For instructions on how to use the bot, please refer to the <a href="https://github.com/brucewzj99/tele-tracker-v2/wiki/Getting-Started">GitHub Wiki</a>.</p>
97122
<p>If you would like to support my work, you can do so at the following links:</p>
98123
<script type='text/javascript' src='https://storage.ko-fi.com/cdn/widget/Widget_2.js'></script>
99124
<script type='text/javascript'>kofiwidget2.init('Support Me on Ko-fi', '#2f8a5b', 'H2H8LN59H');kofiwidget2.draw();</script>
125+
100126
</div>
101127
</div>
102128

103129
<!-- Footer Section -->
130+
104131
<footer class="footer">
105-
<p>Check out my other project: <a href="https://cardfit.me" target="_blank">CardFit</a> – Unlock the potential of your spending!</p>
106-
<p>&copy; 2024 Bruce Wang. All rights reserved.</p>
132+
&copy; <span id="year"></span> TeleFinance Tracker — Built by&nbsp;<a href="https://www.brucewzj.com" target="_blank">Bruce Wang</a> |
133+
Check out&nbsp;<a href="https://teleexpense.vercel.app/" target="_blank">TeleExpense Tracker</a> |
134+
Check out&nbsp;<a href="https://glimpse-mi.vercel.app/" target="_blank">Glimpse Mi</a>
107135
</footer>
136+
137+
<script>
138+
document.getElementById("year").textContent = new Date().getFullYear();
139+
</script>
140+
108141
</body>
142+
109143
</html>

bot/telegram_bot.py

Lines changed: 67 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ def start(update, context):
7474
return CS.SET_UP
7575
except Exception as e:
7676
update.message.reply_text(
77-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
77+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
78+
parse_mode=ParseMode.HTML,
7879
)
7980
return ConversationHandler.END
8081

@@ -126,11 +127,13 @@ def set_up(update, context) -> int:
126127

127128
except GoogleSheetError as e:
128129
update.message.reply_text(
129-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
130+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
131+
parse_mode=ParseMode.HTML,
130132
)
131133
except DatabaseError as e:
132134
update.message.reply_text(
133-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
135+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
136+
parse_mode=ParseMode.HTML,
134137
)
135138
except Exception as e:
136139
update.message.reply_text(GSHEET_ERROR_TEXT)
@@ -207,7 +210,8 @@ def config_handler(update, context) -> int:
207210
return CS.CONFIG_SETUP
208211
except Exception as e:
209212
update.callback_query.message.reply_text(
210-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
213+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
214+
parse_mode=ParseMode.HTML,
211215
)
212216
return ConversationHandler.END
213217

@@ -228,7 +232,8 @@ def config_setup(update, context) -> int:
228232
return CS.CONFIG_CATEGORY
229233
except Exception as e:
230234
update.callback_query.message.reply_text(
231-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
235+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
236+
parse_mode=ParseMode.HTML,
232237
)
233238
return ConversationHandler.END
234239
update.callback_query.edit_message_text(END_TEXT, reply_markup=None)
@@ -264,7 +269,8 @@ def config_category(update, context) -> int:
264269
return CS.CONFIG_SUBCATEGORY
265270
except Exception as e:
266271
update.callback_query.reply_text(
267-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
272+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
273+
parse_mode=ParseMode.HTML,
268274
)
269275
return ConversationHandler.END
270276

@@ -288,7 +294,8 @@ def config_subcategory(update, context) -> int:
288294
return CS.CONFIG_PAYMENT
289295
except Exception as e:
290296
update.callback_query.message.reply_text(
291-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
297+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
298+
parse_mode=ParseMode.HTML,
292299
)
293300
return ConversationHandler.END
294301

@@ -309,7 +316,8 @@ def config_payment(update, context) -> int:
309316
return CS.CONFIG_SUBPAYMENT
310317
except Exception as e:
311318
update.callback_query.message.reply_text(
312-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
319+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
320+
parse_mode=ParseMode.HTML,
313321
)
314322
return ConversationHandler.END
315323

@@ -336,7 +344,8 @@ def config_subpayment(update, context) -> int:
336344
return ConversationHandler.END
337345
except Exception as e:
338346
update.callback_query.message.reply_text(
339-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
347+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
348+
parse_mode=ParseMode.HTML,
340349
)
341350
return ConversationHandler.END
342351

@@ -358,7 +367,8 @@ def add_entry(update, context):
358367
return CS.ENTRY
359368
except Exception as e:
360369
update.message.reply_text(
361-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
370+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
371+
parse_mode=ParseMode.HTML,
362372
)
363373
return ConversationHandler.END
364374

@@ -407,7 +417,8 @@ def remarks(update: Update, context) -> int:
407417
return CS.CATEGORY
408418
except Exception as e:
409419
update.message.reply_text(
410-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
420+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
421+
parse_mode=ParseMode.HTML,
411422
)
412423
return ConversationHandler.END
413424

@@ -453,7 +464,8 @@ def category(update, context) -> int:
453464
return CS.PAYMENT
454465
except Exception as e:
455466
update.callback_query.reply_text(
456-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
467+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
468+
parse_mode=ParseMode.HTML,
457469
)
458470
return ConversationHandler.END
459471

@@ -481,7 +493,8 @@ def subcategory(update, context) -> int:
481493
return CS.PAYMENT
482494
except Exception as e:
483495
update.callback_query.message.reply_text(
484-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
496+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
497+
parse_mode=ParseMode.HTML,
485498
)
486499
return ConversationHandler.END
487500

@@ -513,7 +526,8 @@ def payment(update, context) -> int:
513526
update.callback_query.message.reply_text("Transaction logged.")
514527
except Exception as e:
515528
update.callback_query.message.reply_text(
516-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
529+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
530+
parse_mode=ParseMode.HTML,
517531
)
518532
return ConversationHandler.END
519533

@@ -542,7 +556,8 @@ def subpayment(update, context) -> int:
542556
update.callback_query.message.reply_text("Transaction logged.")
543557
except Exception as e:
544558
update.callback_query.message.reply_text(
545-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
559+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
560+
parse_mode=ParseMode.HTML,
546561
)
547562
return ConversationHandler.END
548563

@@ -577,15 +592,17 @@ def log_transaction(user_data, update):
577592
msg = f"New entry for {day} {month}"
578593
prev_month = month
579594
# this should fix the bug regarding if first day of month not keyed in, but not tested
580-
if day == 1 | day < day_tracker:
581-
prev_month = (current_datetime - dt.timedelta(days=1)).strftime("%b")
595+
if day == 1 or day < day_tracker:
596+
first_of_this_month = current_datetime.replace(day=1)
597+
last_of_prev_month = first_of_this_month - dt.timedelta(days=1)
598+
prev_month = last_of_prev_month.strftime("%b")
582599
# update prev day
583600
msg = f"{msg}\nCreating sum for day {day_tracker}"
584601
gs.update_day_total_sum(sheet_id, prev_month, first_row)
585-
if day == 1 | day < day_tracker:
602+
if day == 1 or day < day_tracker:
586603
new_row = 4
587604
first_row = 5
588-
gs.update_tracker_values(sheet_id, 1, new_row, first_row)
605+
gs.update_tracker_values(sheet_id, day, new_row, first_row)
589606
else:
590607
new_row = gs.get_last_entered_row(sheet_id, month)
591608
first_row = new_row + 1
@@ -624,7 +641,6 @@ def backlog_transaction(user_data, update):
624641
backlog_day = user_data["backlog_day"]
625642
backlog_month = user_data["backlog_month"]
626643

627-
628644
try:
629645
# user input data
630646
entry_type = user_data["entry_type"]
@@ -636,7 +652,7 @@ def backlog_transaction(user_data, update):
636652

637653
# create backlog entry
638654
gs.create_backlog_entry(sheet_id, backlog_day, backlog_month, row_data)
639-
655+
640656
except GoogleSheetError as e:
641657
raise e
642658
except Exception as e:
@@ -665,7 +681,8 @@ def add_transport(update, context):
665681
)
666682
except Exception as e:
667683
update.callback_query.message.reply_text(
668-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
684+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
685+
parse_mode=ParseMode.HTML,
669686
)
670687
return ConversationHandler.END
671688

@@ -694,7 +711,8 @@ def add_transport(update, context):
694711
return CS.QUICK_ADD_TRANSPORT
695712
except Exception as e:
696713
update.message.reply_text(
697-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
714+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
715+
parse_mode=ParseMode.HTML,
698716
)
699717
return ConversationHandler.END
700718

@@ -713,7 +731,8 @@ def add_others(update, context):
713731
)
714732
except Exception as e:
715733
update.callback_query.message.reply_text(
716-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
734+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
735+
parse_mode=ParseMode.HTML,
717736
)
718737
return ConversationHandler.END
719738

@@ -731,7 +750,8 @@ def add_others(update, context):
731750
)
732751
except Exception as e:
733752
update.message.reply_text(
734-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
753+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
754+
parse_mode=ParseMode.HTML,
735755
)
736756
return CS.QUICK_ADD_CATEGORY
737757

@@ -769,7 +789,8 @@ def quick_add(update, context) -> int:
769789
return ConversationHandler.END
770790
except Exception as e:
771791
update.message.reply_text(
772-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
792+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
793+
parse_mode=ParseMode.HTML,
773794
)
774795
return ConversationHandler.END
775796
except Exception as e:
@@ -793,7 +814,8 @@ def get_day_transaction(update, context):
793814
return CS.HANDLE_GET_TRANSACTION
794815
except Exception as e:
795816
update.message.reply_text(
796-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
817+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
818+
parse_mode=ParseMode.HTML,
797819
)
798820
return ConversationHandler.END
799821

@@ -810,7 +832,8 @@ def get_overall(update, context):
810832
return CS.HANDLE_GET_OVERALL
811833
except Exception as e:
812834
update.message.reply_text(
813-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
835+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
836+
parse_mode=ParseMode.HTML,
814837
)
815838
return ConversationHandler.END
816839

@@ -854,7 +877,8 @@ def handle_get_transaction(update, context):
854877
return CS.HANDLE_GET_TRANSACTION
855878
except Exception as e:
856879
update.message.reply_text(
857-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
880+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
881+
parse_mode=ParseMode.HTML,
858882
)
859883
return ConversationHandler.END
860884

@@ -892,7 +916,8 @@ def handle_get_overall(update, context):
892916
return CS.HANDLE_GET_OVERALL
893917
except Exception as e:
894918
update.message.reply_text(
895-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
919+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
920+
parse_mode=ParseMode.HTML,
896921
)
897922
return ConversationHandler.END
898923

@@ -909,7 +934,8 @@ def add_income(update, context):
909934
return CS.INCOME
910935
except Exception as e:
911936
update.message.reply_text(
912-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
937+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
938+
parse_mode=ParseMode.HTML,
913939
)
914940
return ConversationHandler.END
915941

@@ -938,7 +964,8 @@ def income(update, context) -> int:
938964
return CS.WORK_PLACE
939965
except Exception as e:
940966
update.message.reply_text(
941-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
967+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
968+
parse_mode=ParseMode.HTML,
942969
)
943970
return ConversationHandler.END
944971

@@ -972,7 +999,8 @@ def cpf(update, context) -> int:
972999
update.callback_query.message.reply_text(INCOME_LIMIT_TEXT)
9731000
except Exception as e:
9741001
update.callback_query.message.reply_text(
975-
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
1002+
ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
1003+
parse_mode=ParseMode.HTML,
9761004
)
9771005
return ConversationHandler.END
9781006

@@ -1059,7 +1087,9 @@ def notify_all(update, context):
10591087
no_of_users = db.get_user_count()
10601088
keyboard = [
10611089
[
1062-
InlineKeyboardButton(f"Send to {no_of_users} users", callback_data="confirm_send"),
1090+
InlineKeyboardButton(
1091+
f"Send to {no_of_users} users", callback_data="confirm_send"
1092+
),
10631093
InlineKeyboardButton("Cancel", callback_data="cancel_send"),
10641094
]
10651095
]
@@ -1074,7 +1104,7 @@ def notify_all(update, context):
10741104
def notify_preview(update, context):
10751105
query = update.callback_query
10761106
query.answer()
1077-
1107+
10781108
try:
10791109
if (
10801110
query.data == "confirm_send"
@@ -1097,7 +1127,8 @@ def notify_preview(update, context):
10971127
query.edit_message_text(text="Message sending cancelled.")
10981128
except Exception as e:
10991129
query.edit_message_text(
1100-
text=ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)), parse_mode=ParseMode.HTML
1130+
text=ERROR_TEXT + "\nError:\n" + utils.sanitize_error_message(str(e)),
1131+
parse_mode=ParseMode.HTML,
11011132
)
11021133
return ConversationHandler.END
11031134

0 commit comments

Comments
 (0)