Example #1
0
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))
Example #2
0
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
Example #3
0
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')