-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
259 lines (229 loc) · 12.9 KB
/
main.py
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
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackQueryHandler, JobQueue
from telegram import InlineKeyboardMarkup, InlineKeyboardButton
from attendance_handler import create_inline_obj, delete_user_from_attd, get_all_chat_id, init_name_mapped_val, update_name_mapped_val, attd_insert_new_kid,add_in_new_attd, get_attd_obj_by_id, inside_bool_db,startup_user,get_user_readable_data,insert_class_user, insert_session_user,insert_session_id_user,get_user_session_code, insert_new_kid, get_praise_jam_attendance_array, collate_absentee_cnt, get_names_absentee_cnt, get_all_chat_id, delete_user_from_attd
from excel_auto import init_workbook
#attd_change_inline_button
from datetime import datetime, timedelta, time
from msg import message_text, inline_options, month_number_map
from private import TELEGRAM_TOKEN
from random_verse import get_random_verse
from private import TELEGRAM_TOKEN
import os
def start_msg(update, context):
chat_id = update.message.from_user["id"]
user_name = update.message.from_user["first_name"]
is_id_in_db = inside_bool_db(chat_id)
if is_id_in_db == False:
update.message.reply_text(message_text["start"])
startup_user(chat_id, user_name)
update_profile(update, context)
elif is_id_in_db == True:
update.message.reply_text(message_text["welcome_back_start"])
name, session, user_class = get_user_readable_data(chat_id)
data_checking_string = f"NAME: {name}\nCLASS: {user_class}\nSESSION: {message_text[session]}"
update.message.reply_text(data_checking_string)
def stop_bot(update, context):
chat_id = update.message.from_user["id"]
update.message.reply_text("Stopping Bot...")
delete_user_from_attd(chat_id)
def attd_date_msg(update, context):
get_chat_id = update.message.from_user["id"]
update.message.reply_text(message_text["attendance_pending"])
DATE_TODAY,DATE_TODAY_SLASHED = give_sun_date_if_not_sun()
reply_markup={}
user_session = get_user_session_code(str(get_chat_id))
is_available = get_attd_obj_by_id(user_session + DATE_TODAY)
if is_available == False:
init_obj = init_name_mapped_val(user_session)
reply_markup = create_inline_obj(init_obj)
add_in_new_attd(user_session+DATE_TODAY, str(init_obj))
else:
reply_markup = create_inline_obj(get_attd_obj_by_id(user_session+DATE_TODAY))
whole_message = message_text["attendance_message"] + DATE_TODAY_SLASHED + message_text["attendance_caution"]
context.bot.send_message(chat_id = get_chat_id, text=whole_message, reply_markup = reply_markup)
def update_attd(update, context):
query = update.callback_query
get_chat_id = update.callback_query.message.chat.id
DATE_TODAY,DATE_TODAY_SLASHED = give_sun_date_if_not_sun()
user_session = get_user_session_code(str(get_chat_id))
obj = get_attd_obj_by_id(user_session+DATE_TODAY)
button_pressed = query.data.strip()
new_mapped_val = update_name_mapped_val(button_pressed, obj)
new_markup = create_inline_obj(new_mapped_val)
whole_message = message_text["attendance_message"] + DATE_TODAY_SLASHED+ message_text["attendance_caution"]
context.bot.edit_message_text(chat_id=get_chat_id, message_id=query.message.message_id, text=whole_message, reply_markup=new_markup)
add_in_new_attd(user_session+DATE_TODAY, str(new_mapped_val))
def submit_attd(update, context):
get_chat_id = update.callback_query.message.chat.id
user_session = get_user_session_code(str(get_chat_id))
DATE_TODAY,DATE_TODAY_SLASHED = give_sun_date_if_not_sun()
attd_id = user_session+DATE_TODAY
query = update.callback_query
mapped_val = get_attd_obj_by_id(attd_id)
add_in_new_attd(attd_id, str(mapped_val))
new_changes_markup = {'inline_keyboard':[[{'callback_data':'change_attd', 'text':'Make Changes 📋'}]]}
collate_absentee_cnt(DATE_TODAY, user_session, mapped_val)
context.bot.edit_message_text(chat_id=get_chat_id, message_id=query.message.message_id, text=message_text["attendance_submit"], reply_markup=new_changes_markup)
def change_attd(update, context):
get_chat_id = update.callback_query.message.chat.id
user_session = get_user_session_code(str(get_chat_id))
DATE_TODAY,DATE_TODAY_SLASHED = give_sun_date_if_not_sun()
attd_id = user_session+DATE_TODAY
query = update.callback_query
obj = get_attd_obj_by_id(attd_id)
markup_obj = create_inline_obj(obj)
whole_message = message_text["attendance_message"] + DATE_TODAY_SLASHED
context.bot.edit_message_text(chat_id=get_chat_id, message_id=query.message.message_id,text=whole_message, reply_markup=markup_obj)
def P_submit_user_session_data(update, context):
get_chat_id = update.callback_query.message.chat.id
message_id = update.callback_query.message.message_id
session = update.callback_query.data.replace("submit_user_session_data_P_", "")
insert_session_user(str(get_chat_id), session)
context.bot.edit_message_text(chat_id=get_chat_id, message_id=message_id, text=message_text['select_class'], reply_markup=inline_options["P_class_option"])
def J_submit_user_session_data(update, context):
get_chat_id = update.callback_query.message.chat.id
message_id = update.callback_query.message.message_id
session = update.callback_query.data.replace("submit_user_session_data_J_", "")
insert_session_user(str(get_chat_id), session)
context.bot.edit_message_text(chat_id=get_chat_id, message_id=message_id, text=message_text['select_class'], reply_markup=inline_options["J_class_option"])
def T_submit_user_session_data(update, context):
get_chat_id = update.callback_query.message.chat.id
message_id = update.callback_query.message.message_id
session = update.callback_query.data.replace("submit_user_session_data_T_", "")
insert_session_user(str(get_chat_id), session)
context.bot.edit_message_text(chat_id=get_chat_id, message_id=message_id, text=message_text['select_class'], reply_markup=inline_options["T_class_option"])
def submit_user_class_data(update, context):
get_chat_id = update.callback_query.message.chat.id
message_id = update.callback_query.message.message_id
user_class = update.callback_query.data.replace("submit_user_class_data_", "")
str_chat_id = str(get_chat_id)
insert_class_user(str_chat_id, user_class)
session_id = get_user_session_code(str_chat_id)
insert_session_id_user(str_chat_id, session_id)
context.bot.edit_message_text(chat_id=get_chat_id, message_id=message_id, text=message_text["select_complete"])
def update_profile(update, context):
chat_id = update.message.from_user["id"]
context.bot.send_message(chat_id = chat_id, text=message_text["select_session"], reply_markup = inline_options["session_option"])
def help_msg(update, context):
update.message.reply_text(message_text["help_message"])
def getverse(update, context):
bible_verse = get_random_verse()
update.message.reply_text(bible_verse)
def get_time_test(update, context):
DATE_TODAY_W_MIN_S = datetime.today().strftime("%d%m%Y-%H:%M:%S")
update.message.reply_text(DATE_TODAY_W_MIN_S)
def give_sun_date_if_not_sun():
DATE_TODAY = datetime.today().strftime("%d%m%Y")
DATE_TODAY_SLASHED = datetime.today().strftime("%d/%m/%Y")
GET_DAY_OF_WEEK = datetime.today().weekday()
GET_DATE_OF_PREV_SUN_RAW = datetime.today()-timedelta(days=GET_DAY_OF_WEEK+1)
GET_PREV_SUN_DATE = GET_DATE_OF_PREV_SUN_RAW.strftime("%d%m%Y")
GET_PREV_SUN_DATE_SLASHED = GET_DATE_OF_PREV_SUN_RAW.strftime("%d/%m/%Y")
if GET_DAY_OF_WEEK != 6:
return GET_PREV_SUN_DATE, GET_PREV_SUN_DATE_SLASHED
else:
return DATE_TODAY, DATE_TODAY_SLASHED
def add_kid_into_attd(update, context):
message_receive = update.message.text.strip()
string_combi = message_receive.replace("/addkid","")
name_and_session_code = string_combi.split('/')
DATE_TODAY,DATE_TODAY_SLASHED = give_sun_date_if_not_sun()
if len(name_and_session_code) == 2:
name = name_and_session_code[0]
session_code = name_and_session_code[1]
if len(session_code) != 4:
update.message.reply_text(message_text["addkid_error"])
elif len(session_code) == 4:
try:
session = session_code[0:2]
kid_class = session_code[2:4]
DATE_TODAY,DATE_TODAY_SLASHED = give_sun_date_if_not_sun()
insert_new_kid({"name":name.strip(),"session_code":session_code,"session":session,"class":kid_class,"age":00, "attendance_cnt":0, "last_update":DATE_TODAY})
attd_insert_new_kid(name.strip(), session_code + DATE_TODAY)
update.message.reply_text(message_text["added_kid_success"] + message_text[session] + " " + kid_class)
except:
update.message.reply_text(message_text["addkid_error"])
else:
update.message.reply_text(message_text["addkid_error"])
def advance_help_msg(update, context):
update.message.reply_text(message_text["help_advance"])
def collate_attendance_month(update, context):
chat_id = update.message.from_user["id"]
message = update.message.text.strip()
date_input = message.replace("/collate","").strip()
month_year = date_input.split("/")
if len(month_year) == 2 :
month = month_year[0]
year = month_year[1]
if len(month) == 2 and len(year) == 4:
update.message.reply_text(message_text["collate_loading"])
get_array_sessions = get_praise_jam_attendance_array(month, year)
filename = f"collate_{month}{year}"
init_workbook(filename,month_number_map[month],get_array_sessions)
with open(f"{filename}.xlsx", "rb") as excel_collate:
context.bot.send_document(chat_id = chat_id, document=excel_collate, filename=filename+".xlsx")
os.remove(f"./{filename}.xlsx")
else:
update.message.reply_text(message_text["date_format_error"])
else:
update.message.reply_text(message_text["date_format_error"])
def get_absentee_red_flags(update, context):
chat_id = update.message.from_user["id"]
user_session = get_user_session_code(str(chat_id))
name_list = get_names_absentee_cnt(user_session)
message = f"List shows kids that have been absent for more than 3 weeks 🥶:\n\n{name_list}"
update.message.reply_text(message)
def send_all_reminder_msg(context):
all_chat_ids = get_all_chat_id()
for chat_id in all_chat_ids:
try:
context.bot.send_message(chat_id=chat_id[0], text=message_text['attendance_reminder'])
except:
pass
def scheduler(dp):
job_queue = JobQueue()
job_queue.set_dispatcher(dp)
this_time = time(2, 30, 00, 00000)
job_queue.run_daily(callback=send_all_reminder_msg, time= this_time, days=(6,))
job_queue.start()
def get_date_attendance(update, context):
chat_id = update.message.from_user["id"]
user_session = get_user_session_code(str(chat_id))
message = update.message.text
date_input = message.replace("/getattd","").strip().replace('/','')
attd_obj = get_attd_obj_by_id(user_session+date_input)
if attd_obj == False:
update.message.reply_text("This date is not available")
else:
return_string = []
state_obj = {0:'Absent', 1:'Church', 2:'Zoom'}
for name, number in attd_obj.items():
return_string.append(f'{name}-->{state_obj[number]}')
update.message.reply_text('\n'.join(return_string))
def run():
updater = Updater(TELEGRAM_TOKEN)
dp = updater.dispatcher
dp.add_handler(CommandHandler('start',start_msg))
dp.add_handler(CommandHandler('stop',stop_bot))
dp.add_handler(CommandHandler('timetest',get_time_test))
dp.add_handler(CommandHandler('help',help_msg))
dp.add_handler(CommandHandler('advancehelp',advance_help_msg))
dp.add_handler(CommandHandler('setclass',update_profile))
dp.add_handler(CommandHandler('attendance', attd_date_msg))
dp.add_handler(CommandHandler('verse', getverse))
dp.add_handler(CommandHandler('absentee', get_absentee_red_flags))
dp.add_handler(CommandHandler('addkid', add_kid_into_attd))
dp.add_handler(CommandHandler('collate', collate_attendance_month))
dp.add_handler(CommandHandler('getattd', get_date_attendance))
dp.add_handler(CallbackQueryHandler(update_attd,pattern="attd_"))
dp.add_handler(CallbackQueryHandler(submit_attd,pattern="submit_attd"))
dp.add_handler(CallbackQueryHandler(change_attd,pattern="change_attd"))
dp.add_handler(CallbackQueryHandler(P_submit_user_session_data,pattern="submit_user_session_data_P"))
dp.add_handler(CallbackQueryHandler(J_submit_user_session_data,pattern="submit_user_session_data_J"))
dp.add_handler(CallbackQueryHandler(T_submit_user_session_data,pattern="submit_user_session_data_T"))
dp.add_handler(CallbackQueryHandler(submit_user_class_data,pattern="submit_user_class_data_"))
scheduler(dp)
updater.start_polling()
updater.idle()
if __name__ == "__main__":
run()