def prayertime(lv_zones): doc_czones_qry = db.czones.find_one({"_id": lv_zones, "fxpara": {"$ne": "default"}}) lv_ftzone = doc_czones_qry.get('ftzone') lv_txzone = ' ' if lv_ftzone == 7: lv_txzone = 'WIB' elif lv_ftzone == 8: lv_txzone = 'WITA' elif lv_ftzone == 9: lv_txzone = 'WIT' utctime = datetime.datetime.utcnow() utctime = utctime.replace(minute=0, second=0, microsecond=0) localtime = utctime + datetime.timedelta(hours = lv_ftzone) #Getting midnight of localtime localtime = localtime.replace(hour=0) #Getting utctime for midnight of localtime utcbegtime = localtime + datetime.timedelta(hours = -1*lv_ftzone) utcendtime = utcbegtime + datetime.timedelta(hours = 24) #Hijri function hijritime = HijriDate(localtime.date().year, localtime.date().month, localtime.date().day, gr=True) doc_chijri_qry = db.chijri.find_one({"_id": int(hijritime.month)}) lv_orihijriday = hijritime.day hijritime.day = hijritime.day + doc_chijri_qry.get('fadjst') if int(hijritime.day) == 30: if doc_chijri_qry.get('f29flg') == True: hijritime.day = 1 if hijritime.month == 12: hijritime.month = 1 hijritime.year = hijritime.year + 1 else: hijritime.month = hijritime.month + 1 elif int(lv_orihijriday) == 1: if int(hijritime.month) == 1: doc_chijri_qry = db.chijri.find_one({"_id": 12}) else: doc_chijri_qry = db.chijri.find_one({"_id": int(hijritime.month)-1}) if doc_chijri_qry.get('f30flg') == True: hijritime.day = 30 if int(hijritime.month) == 1: hijritime.month = 12 hijritime.year = hijritime.year - 1 else: hijritime.month = hijritime.month - 1 #End of Hijri function msg = '*[Waktu Salat Hari Ini]*\n' msg = '{}_{}, {} {} {} | '.format(msg, LOCAL_DAY[localtime.weekday()], localtime.day, LOCAL_MONTH[localtime.month], localtime.year) msg = '{}{} {} {}\n'.format(msg, int(hijritime.day), HIJRI_MONTH[int(hijritime.month)], int(hijritime.year)) msg = '{}{} - {}_\n\n'.format(msg, doc_czones_qry.get('fdescr'), doc_czones_qry.get('fstate')) msg = '{}```'.format(msg) csched_qry = db.csched.find({"_id": {"$gt": utcbegtime, "$lt": utcendtime}, "fazfor.czones_id": lv_zones}).sort("_id", 1) for doc_csched_qry in csched_qry: for lv_fazfor in doc_csched_qry['fazfor']: if lv_fazfor.get('czones_id') == lv_zones: localtime = doc_csched_qry.get('_id') + datetime.timedelta(hours = lv_ftzone) msg = '{}\n'.format(msg) msg = '{}{:<6} - {} {}'.format(msg, lv_fazfor.get('ftypes'), localtime.strftime('%H:%M'), lv_txzone) msg = '{}```\n\n'.format(msg) msg = '{}[https://t.me/ID_AzanBot](https://t.me/ID_AzanBot)'.format(msg) return msg
def next(bot, update): chat_id = update.message.chat_id doc_cusers_qry = db.cusers.find_one({"_id": chat_id}) if doc_cusers_qry is not None: lv_zones = doc_cusers_qry.get('czones_id') if lv_zones is not None: doc_czones_qry = db.czones.find_one({"_id": lv_zones, "fxpara": {"$ne": "default"}}) lv_ftzone = doc_czones_qry.get('ftzone') lv_txzone = ' ' if lv_ftzone == 7: lv_txzone = 'WIB' elif lv_ftzone == 8: lv_txzone = 'WITA' elif lv_ftzone == 9: lv_txzone = 'WIT' utctime = datetime.datetime.utcnow() localtime = utctime + datetime.timedelta(hours = lv_ftzone) localtime = localtime.replace(hour=0, minute=0, second=0, microsecond=0) #Getting midnight of localtime # localtime = localtime.replace(hour=0) #Getting utctime for midnight of localtime # utcbegtime = localtime + datetime.timedelta(hours = -1*lv_ftzone) # utcendtime = utcbegtime + datetime.timedelta(hours = 24) csched_qry = db.csched.find({"_id": {"$gt": utctime}, "fazfor.czones_id": lv_zones}).sort("_id", 1) msg = '' for doc_csched_qry in csched_qry: for lv_fazfor in doc_csched_qry['fazfor']: if lv_fazfor.get('czones_id') == lv_zones: localtime = doc_csched_qry.get('_id') lv_diffs = (localtime - utctime).total_seconds() localtime = localtime + datetime.timedelta(hours = lv_ftzone) msg = '{}`{} - {} {}`\n\n'.format(msg, lv_fazfor.get('ftypes'), localtime.strftime('%H:%M'), lv_txzone) break break #Hijri function hijritime = HijriDate(localtime.date().year, localtime.date().month, localtime.date().day, gr=True) doc_chijri_qry = db.chijri.find_one({"_id": int(hijritime.month)}) lv_orihijriday = hijritime.day hijritime.day = hijritime.day + doc_chijri_qry.get('fadjst') if int(hijritime.day) == 30: if doc_chijri_qry.get('f29flg') == True: hijritime.day = 1 if hijritime.month == 12: hijritime.month = 1 hijritime.year = hijritime.year + 1 else: hijritime.month = hijritime.month + 1 elif int(lv_orihijriday) == 1: if int(hijritime.month) == 1: doc_chijri_qry = db.chijri.find_one({"_id": 12}) else: doc_chijri_qry = db.chijri.find_one({"_id": int(hijritime.month)-1}) if doc_chijri_qry.get('f30flg') == True: hijritime.day = 30 if int(hijritime.month) == 1: hijritime.month = 12 hijritime.year = hijritime.year - 1 else: hijritime.month = hijritime.month - 1 #End of Hijri function msg = '{}_{}, {} {} {} | '.format(msg, LOCAL_DAY[localtime.weekday()], localtime.day, LOCAL_MONTH[localtime.month], localtime.year) msg = '{}{} {} {}\n'.format(msg, int(hijritime.day), HIJRI_MONTH[int(hijritime.month)], int(hijritime.year)) msg = '{}{} - {}_'.format(msg, doc_czones_qry.get('fdescr'), doc_czones_qry.get('fstate')) lv_diffh = int(lv_diffs / 3600) lv_diffm = int((lv_diffs % 3600) / 60) + ((lv_diffs % 3600) % 60 > 0) if lv_diffm == 60: lv_diffm = 0 lv_diffh += 1 if lv_diffh == 0 and lv_diffm > 0: msg = '`{} menit menuju waktu `{}'.format(lv_diffm, msg) elif lv_diffh == 0 and lv_diffm == 0: msg = '`Tepat saat waktu `{}'.format(msg) elif lv_diffh > 0 and lv_diffm == 0: msg = '`{} jam menuju waktu `{}'.format(lv_diffh, msg) elif lv_diffh > 0 and lv_diffm > 0: msg = '`{} jam dan {} menit menuju waktu `{}'.format(lv_diffh, lv_diffm, msg) update.message.reply_text(msg, parse_mode='Markdown') else: update.message.reply_text('Setting Zona belum dilakukan.\nGunakan perintah /setting untuk melakukan setting Zona.') else: update.message.reply_text('Setting Zona belum dilakukan.\nGunakan perintah /setting untuk melakukan setting Zona.') if not 'test' in DBNAME: Botan(BOTAN_TOKEN).track(update.message, event_name='next')
def get_azan(bot, job): global add_job # Latency monitoring 1 d1 = datetime.datetime.utcnow() #Manipulate UTCTime to consider lead time of data fetching utctime = datetime.datetime.utcnow() + datetime.timedelta(minutes = LEADTIME) #Testing purpose #utctime = datetime.datetime(2017, 7, 12, 4, 58) utctime = utctime.replace(second=0, microsecond=0) lv_mindt = job.context utcadjtime = utctime + datetime.timedelta(minutes = lv_mindt) doc_csched_qry = db.csched.find_one({"_id": utcadjtime}) if doc_csched_qry is not None: for lv_fazfor in doc_csched_qry['fazfor']: lv_zones = lv_fazfor.get('czones_id') lv_ftypes = lv_fazfor.get('ftypes') doc_czones_qry = db.czones.find_one({"_id": lv_zones, "fxpara": {"$ne": "default"}}) lv_ftzone = doc_czones_qry.get('ftzone') lv_txzone = ' ' if lv_ftzone == 7: lv_txzone = 'WIB' elif lv_ftzone == 8: lv_txzone = 'WITA' elif lv_ftzone == 9: lv_txzone = 'WIT' cusers_qry = db.cusers.find({"czones_id": lv_zones, "fdsble": False, "fblock": False}) if cusers_qry.count() > 0: localtime = utcadjtime + datetime.timedelta(hours = lv_ftzone) #Hijri function hijritime = HijriDate(localtime.date().year, localtime.date().month, localtime.date().day, gr=True) doc_chijri_qry = db.chijri.find_one({"_id": int(hijritime.month)}) lv_orihijriday = hijritime.day hijritime.day = hijritime.day + doc_chijri_qry.get('fadjst') if int(hijritime.day) == 30: if doc_chijri_qry.get('f29flg') == True: hijritime.day = 1 if hijritime.month == 12: hijritime.month = 1 hijritime.year = hijritime.year + 1 else: hijritime.month = hijritime.month + 1 elif int(lv_orihijriday) == 1: if int(hijritime.month) == 1: doc_chijri_qry = db.chijri.find_one({"_id": 12}) else: doc_chijri_qry = db.chijri.find_one({"_id": int(hijritime.month)-1}) if doc_chijri_qry.get('f30flg') == True: hijritime.day = 30 if int(hijritime.month) == 1: hijritime.month = 12 hijritime.year = hijritime.year - 1 else: hijritime.month = hijritime.month - 1 #End of Hijri function lv_msg = '' if lv_ftypes != 'Imsak' and lv_ftypes != 'Terbit': lv_msg = '{}*[Azan]* '.format(lv_msg) lv_msg = '{}`{} - {} {}`\n\n'.format(lv_msg, lv_ftypes, localtime.strftime('%H:%M'), lv_txzone) lv_msg = '{}_{}, {} {} {} | '.format(lv_msg, LOCAL_DAY[localtime.weekday()], localtime.day, LOCAL_MONTH[localtime.month], localtime.year) lv_msg = '{}{} {} {}\n'.format(lv_msg, int(hijritime.day), HIJRI_MONTH[int(hijritime.month)], int(hijritime.year)) lv_msg = '{}{} - {}_'.format(lv_msg, doc_czones_qry.get('fdescr'), doc_czones_qry.get('fstate')) lv_counter = 0 lv_second = 0 for doc_cusers_qry in cusers_qry: lv_frmndr = doc_cusers_qry.get('frmndr') msgtype = 0 msg = '' utcrmndr = utctime + datetime.timedelta(minutes = lv_frmndr) if utcadjtime == utctime: msgtype = 1 # Notif msg = lv_msg elif utcadjtime == utcrmndr and lv_frmndr > 0: msgtype = 2 # Reminder msg = '*[Reminder]* `{} menit menuju waktu `{}'.format(lv_frmndr, lv_msg.replace('*[Azan]* ','')) if msgtype > 0: chat_id = doc_cusers_qry.get('_id') #Testing purpose #chat_id = xxxxxxxx jobtime = utctime + datetime.timedelta(seconds = lv_second) lv_context = [] lv_context.append(chat_id) lv_context.append(msg) lv_context.append(job.name) lv_context.append(utctime) lv_context.append(lv_zones) if lv_ftypes == 'Imsak': if doc_cusers_qry.get('fimsak') == True: add_job.run_once(set_azan, jobtime, context=lv_context) lv_counter += 1 elif lv_ftypes == 'Terbit': if doc_cusers_qry.get('fsyurk') == True: add_job.run_once(set_azan, jobtime, context=lv_context) lv_counter += 1 else: add_job.run_once(set_azan, jobtime, context=lv_context) lv_counter += 1 if lv_counter%MAX_MESSAGE == 0: lv_second += 1 # Job limit monitoring #Testing purpose #JOB_LIMIT = -1 if lv_second > JOB_LIMIT: logger.error('[JOB LIMIT] Processing on {} exceeds the {}th second limit: {} seconds!'.format(utctime, JOB_LIMIT, lv_second)) try: bot.send_message(chat_id=LOG_CHATID, text='[JOB LIMIT] Processing on {} exceeds the {}th second limit: {} seconds!'.format(utctime, JOB_LIMIT, lv_second)) except TelegramError as e: logger.error('[JOB LIMIT NOTIFICATION] Failed to send job limit notification error: {}'.format(e.message)) else: logger.info('No message to be sent on {} job {:<11} zone {:<4}'.format(utctime, job.name, lv_zones)) else: logger.info('No message to be sent on {} job {:<11}'.format(utctime, job.name)) # Latency monitoring 2 d2 = datetime.datetime.utcnow() lv_latency = (d2 - d1).total_seconds() #Testing purpose #LATENCY_LIMIT = 0 if lv_latency > LATENCY_LIMIT: logger.error('[LATENCY] Processing on {} job {:<11} exceeds {} seconds limit: {} seconds!'.format(utctime, job.name, LATENCY_LIMIT, lv_latency)) try: bot.send_message(chat_id=LOG_CHATID, text='[LATENCY] Processing on {} job {:<11} exceeds {} seconds limit: {} seconds!'.format(utctime, job.name, LATENCY_LIMIT, lv_latency)) except TelegramError as e: logger.error('[LATENCY NOTIFICATION] Failed to send latency notification error: {}'.format(e.message))
def main(argv): # [START checking arguments] if not argv: print(gv_usage) sys.exit() else: try: opts, args = getopt.getopt(argv, "hm:", ["help", "mins="]) except getopt.GetoptError: print(gv_usage) sys.exit(2) for opt, arg in opts: if opt in ('-h', '--help'): print(gv_usage) sys.exit() elif opt in ('-m', '--mins'): try: lv_mindt = int(arg) except ValueError: print(gv_usage) sys.exit() else: if lv_mindt < 0: print(gv_usage) sys.exit() # [END checking arguments] utctime = datetime.datetime.utcnow() #Testing purpose #utctime = datetime.datetime(2017, 7, 12, 4, 58) utctime = utctime.replace(second=0, microsecond=0) utcadjtime = utctime + datetime.timedelta(minutes=lv_mindt) doc_csched_qry = db.csched.find_one({"_id": utcadjtime}) if doc_csched_qry is not None: for lv_fazfor in doc_csched_qry['fazfor']: lv_zones = lv_fazfor.get('czones_id') lv_ftypes = lv_fazfor.get('ftypes') doc_czones_qry = db.czones.find_one({ "_id": lv_zones, "fxpara": { "$ne": "default" } }) lv_ftzone = doc_czones_qry.get('ftzone') lv_txzone = ' ' if lv_ftzone == 7: lv_txzone = 'WIB' elif lv_ftzone == 8: lv_txzone = 'WITA' elif lv_ftzone == 9: lv_txzone = 'WIT' cusers_qry = db.cusers.find({ "czones_id": lv_zones, "fdsble": False, "fblock": False }) if cusers_qry.count() > 0: localtime = utcadjtime + datetime.timedelta(hours=lv_ftzone) #Hijri function hijritime = HijriDate(localtime.date().year, localtime.date().month, localtime.date().day, gr=True) doc_chijri_qry = db.chijri.find_one( {"_id": int(hijritime.month)}) hijritime.day = hijritime.day + doc_chijri_qry.get('fadjst') if int(hijritime.day) == 30: if doc_chijri_qry.get('f29flg') == True: hijritime.day = 1 hijritime.month = hijritime.month + 1 elif int(hijritime.day) == 1: doc_chijri_qry = db.chijri.find_one( {"_id": int(hijritime.month) - 1}) if doc_chijri_qry.get('f30flg') == True: hijritime.day = 30 hijritime.month = hijritime.month - 1 #End of Hijri function lv_msg = '' if lv_ftypes != 'Imsak' and lv_ftypes != 'Terbit': lv_msg = '{}*[Azan]* '.format(lv_msg) lv_msg = '{}`{} - {} {}`\n\n'.format( lv_msg, lv_ftypes, localtime.strftime('%H:%M'), lv_txzone) lv_msg = '{}_{}, {} {} {} | '.format( lv_msg, LOCAL_DAY[localtime.weekday()], localtime.day, LOCAL_MONTH[localtime.month], localtime.year) lv_msg = '{}{} {} {}\n'.format( lv_msg, int(hijritime.day), HIJRI_MONTH[int(hijritime.month)], int(hijritime.year)) lv_msg = '{}{} - {}_'.format(lv_msg, doc_czones_qry.get('fdescr'), doc_czones_qry.get('fstate')) for doc_cusers_qry in cusers_qry: lv_frmndr = doc_cusers_qry.get('frmndr') msgtype = 0 msg = '' utcrmndr = utctime + datetime.timedelta(minutes=lv_frmndr) if utcadjtime == utctime: msgtype = 1 # Notif msg = lv_msg elif utcadjtime == utcrmndr and lv_frmndr > 0: msgtype = 2 # Reminder msg = '*[Reminder]* `{} menit menuju waktu `{}'.format( lv_frmndr, lv_msg.replace('*[Azan]* ', '')) if msgtype > 0: chat_id = doc_cusers_qry.get('_id') logger.info( '[START] Send message on {} -m {:<2} zone {:<4} chat_id {}' .format(utctime, lv_mindt, lv_zones, chat_id)) if lv_ftypes == 'Imsak': if doc_cusers_qry.get('fimsak') == True: sendmsg(chat_id, msg) elif lv_ftypes == 'Terbit': if doc_cusers_qry.get('fsyurk') == True: sendmsg(chat_id, msg) else: sendmsg(chat_id, msg) logger.info( '[END] Send message on {} -m {:<2} zone {:<4} chat_id {}' .format(utctime, lv_mindt, lv_zones, chat_id)) else: logger.info( 'No message to be sent on {} -m {:<2} zone {:<4}'.format( utctime, lv_mindt, lv_zones)) else: logger.info('No message to be sent on {} -m {:<2}'.format( utctime, lv_mindt))