def get_ct_week(self, update: telegram.Update, context: CallbackContext):
        """
        Меню -> Расписание -> Эта неделя
        Меню -> Расписание -> След. неделя
        """
        query = update.callback_query
        query.answer()

        query_data = query.data

        if query_data == nameof(const.btn_week_current):
            is_even_week = help.is_even_week()
            ct_dict = self.get_ct(lambda x: x[nameof(self.model.isEvenWeek)] == f'{is_even_week}')
        elif query_data == nameof(const.btn_week_next):
            is_even_week = not help.is_even_week()
            ct_dict = self.get_ct(lambda x: x[nameof(self.model.isOddWeek)] != f'{is_even_week}')

        answer_message = f''
        for line in ct_dict:
            answer_message += self.add_ct_answer_delimiter()
            answer_message += self.add_ct_answer_generic(line)
            answer_message += self.add_ct_answer_other_info(line)

        answer_message += self.add_ct_answer_delimiter()
        query.edit_message_text(text=answer_message)
    def get_start_menu(self, update: telegram.Update, context: CallbackContext):
        """Стартовое меню"""
        menu = [[InlineKeyboardButton(const.btn_start_menu_ct, callback_data=nameof(const.btn_start_menu_ct)),
                 InlineKeyboardButton(const.btn_start_menu_ntf, callback_data=nameof(const.btn_start_menu_ntf))]]

        reply_markup = InlineKeyboardMarkup(menu)
        update.message.reply_text(const.msg_start_menu, reply_markup=reply_markup)
    def get_btns_ntf(self, update: telegram.Update, context: CallbackContext):
        """Меню -> Уведомления"""
        query = update.callback_query
        query.answer()

        menu = [[InlineKeyboardButton(const.btn_ntf_bef_lsn, callback_data=nameof(const.btn_ntf_bef_lsn))],
                [InlineKeyboardButton(const.btn_ntf_every_day, callback_data=nameof(const.btn_ntf_every_day))]]

        reply_markup = InlineKeyboardMarkup(menu)
        query.edit_message_text(text=const.msg_ntf, reply_markup=reply_markup)
    def add_ct_answer_other_info(self, ct_dict_line: {}):
        """Добавлении остальной информации о занятии"""
        answer_message = f''
        if ct_dict_line[nameof(self.model.isOnline)]:
            answer_message += f'{const.msg_ct_is_online}\n'
        else:
            answer_message += f'{const.msg_ct_is_offline}\n'

        if ct_dict_line[nameof(self.model.otherInfo)] is not None:
            answer_message += f'{const.msg_ct_other_info} {ct_dict_line[nameof(self.model.otherInfo)]}\n'

        return answer_message
 def add_ct_answer_week(self, ct_dict_line: {}):
     """Добавление занятии о неделе"""
     if ct_dict_line[nameof(self.model.isEveryWeek)]:
         return f'{const.msg_ct_is_every_w}\n'
     elif ct_dict_line[nameof(self.model.isEvenWeek)]:
         return f'{const.msg_ct_is_even_w}\n'
     elif ct_dict_line[nameof(self.model.isOddWeek)]:
         return f'{const.msg_ct_is_odd_w}\n'
     elif ct_dict_line[nameof(self.model.isOnceMonth)]:
         return f'{const.msg_ct_is_once_month}\n'
     else:
         return f''
    def get_btns_ntf_bef_lesson(self, update: telegram.Update, context: CallbackContext):
        """Меню -> Уведомления -> Перед началом занятий"""
        query = update.callback_query
        query.answer()

        menu = [[InlineKeyboardButton(const.btn_ntf_bef_lesson_h2, callback_data=nameof(const.btn_ntf_bef_lesson_h2)),
                InlineKeyboardButton(const.btn_ntf_bef_lesson_h1, callback_data=nameof(const.btn_ntf_bef_lesson_h1))],
                [InlineKeyboardButton(const.btn_ntf_bef_lesson_min30, callback_data=nameof(const.btn_ntf_bef_lesson_min30)),
                InlineKeyboardButton(const.btn_ntf_bef_lesson_min15, callback_data=nameof(const.btn_ntf_bef_lesson_min15))]]

        reply_markup = InlineKeyboardMarkup(menu)
        query.edit_message_text(text=const.msg_ntf, reply_markup=reply_markup)
    def get_ct_day(self, update: telegram.Update, context: CallbackContext):
        """
        Меню -> Респисание -> Сегодня
        Меню -> Расписание -> Завтра
        Меню -> Расписание -> День недели -> День
        """
        query = update.callback_query
        query.answer()

        query_data = query.data

        weekday = self.get_weekday(query_data)
        if weekday == 0:
            weekday_str = const.btn_day_mon
        elif weekday == 1:
            weekday_str = const.btn_day_tue
        elif weekday == 2:
            weekday_str = const.btn_day_wed
        elif weekday == 3:
            weekday_str = const.btn_day_thu
        elif weekday == 4:
            weekday_str = const.btn_day_fri
        elif weekday == 5:
            weekday_str = const.btn_day_sat
        elif weekday == 6:
            weekday_str = const.btn_day_sun
        else:
            weekday_str = None

        ct_dict = self.get_ct(lambda x: (x[nameof(self.model.weekday)] == weekday_str))

        answer_message = f''
        if len(ct_dict) <= 0:
            answer_message += self.add_ct_answer_delimiter()
            if query_data == nameof(const.btn_day_today):
                answer_message += self.add_ct_answer_not_in_day(const.btn_day_today)
            elif query_data == nameof(const.btn_day_tomorrow):
                answer_message += self.add_ct_answer_not_in_day(const.btn_day_tomorrow)
            else:
                answer_message += self.add_ct_answer_not_in_day(weekday_str)
        else:
            for line in ct_dict:
                answer_message += self.add_ct_answer_delimiter()
                answer_message += self.add_ct_answer_generic(line)
                answer_message += self.add_ct_answer_other_info(line)

        answer_message += self.add_ct_answer_delimiter()
        query.edit_message_text(text=answer_message)
 def command_handlers_build(self, dispatcher):
     """
     Построение обработчиков событий получения от пользователя сообщений с командами.
     :param dispatcher: - диспетчер обработчиков событий телеграм-бота.
     """
     super(ClassTimetableBot, self).command_handlers_build(dispatcher)
     dispatcher.add_handler(CommandHandler("start", self.get_start_menu))
     # dispatcher.add_handler(MessageHandler(Filters.regex(const.btn_start_menu_ct), self.get_class_timetable_days))
     dispatcher.add_handler(CallbackQueryHandler(self.get_ct_btns, pattern=nameof(const.btn_start_menu_ct)))
     dispatcher.add_handler(CallbackQueryHandler(self.get_ct_full, pattern=nameof(const.btn_ct_full)))
     dispatcher.add_handler(CallbackQueryHandler(self.get_ct_week, pattern=nameof(const.btn_week_)))
     dispatcher.add_handler(CallbackQueryHandler(self.get_ct_weekday_btns, pattern=nameof(const.btn_weekday)))
     dispatcher.add_handler(CallbackQueryHandler(self.get_ct_day, pattern=nameof(const.btn_day_)))
     dispatcher.add_handler(CallbackQueryHandler(self.get_btns_ntf, pattern=nameof(const.btn_start_menu_ntf)))
     dispatcher.add_handler(CallbackQueryHandler(self.get_btns_ntf_bef_lesson, pattern=nameof(const.btn_ntf_bef_lsn)))
     dispatcher.add_handler(CommandHandler("set_reminder", self.set_timer, pass_args=True, pass_job_queue=True, pass_chat_data=True))
Esempio n. 9
0
    def _string(self):
        inner = self._pointer().dereference()
        inner_type = rawtype(inner.type)

        if inner_type.tag == 'HPHP::StringData':
            return string_data_val(inner)
        return nameof(inner)
Esempio n. 10
0
    def _string(self):
        inner = self._pointer().dereference()
        inner_type = rawtype(inner.type)

        if inner_type.tag == 'HPHP::StringData':
            return string_data_val(inner)
        return nameof(inner)
Esempio n. 11
0
def create_php(idx, ar, rip='0x????????', pc=None):
    """Collect metadata for a PHP frame.

    All arguments are expected to be gdb.Values, except `idx'.
    """
    func = ar['m_func']
    shared = rawptr(func['m_shared'])

    # Pull the function name.
    if not shared['m_isClosureBody']:
        func_name = nameof(func)
    else:
        func_name = nameof(func['m_baseCls'])
        func_name = func_name[:func_name.find(';')]

    if len(func_name) == 0:
        func_name = '<pseudomain>'

    frame = {
        'idx':  idx,
        'fp':   str(ar),
        'rip':  _format_rip(rip),
        'func': '[PHP] %s()' % func_name,
    }

    attrs = idxs.atomic_get(func['m_attrs']['m_attrs'])

    if attrs & V('HPHP::AttrBuiltin'):
        # Builtins don't have source files.
        return frame

    # Pull the PC from Func::base() and ar->m_soff if necessary.
    if pc is None:
        pc = shared['m_base'] + ar['m_soff']

    # Adjust it for calls.
    op_ptype = T('HPHP::Op').pointer()
    op = (func['m_unit']['m_bc'] + pc).cast(op_ptype).dereference()

    if op in [V('HPHP::Op::' + x) for x in
              ['PopR', 'UnboxR', 'UnboxRNop']]:
        pc -= 1

    frame['file'] = php_filename(func)
    frame['line'] = php_line_number(func, pc)

    return frame
Esempio n. 12
0
File: frame.py Progetto: milesj/hhvm
def create_php(idx, ar, rip='0x????????', pc=None):
    """Collect metadata for a PHP frame.

    All arguments are expected to be gdb.Values, except `idx'.
    """
    func = ar['m_func']
    shared = rawptr(func['m_shared'])

    # Pull the function name.
    if not shared['m_isClosureBody']:
        func_name = nameof(func)
    else:
        func_name = nameof(func['m_baseCls'])
        func_name = func_name[:func_name.find(';')]

    if len(func_name) == 0:
        func_name = '<pseudomain>'

    frame = {
        'idx':  idx,
        'sp':   str(ar),
        'rip':  _format_rip(rip),
        'func': '[PHP] %s()' % func_name,
    }

    attrs = idxs.atomic_get(func['m_attrs']['m_attrs'])

    if attrs & V('HPHP::AttrBuiltin'):
        # Builtins don't have source files.
        return frame

    # Pull the PC from Func::base() and ar->m_soff if necessary.
    if pc is None:
        pc = shared['m_base'] + ar['m_soff']

    # Adjust it for calls.
    op_ptype = T('HPHP::Op').pointer()
    op = (func['m_unit']['m_bc'] + pc).cast(op_ptype).dereference()

    if op in [V('HPHP::Op::' + x) for x in
              ['PopR', 'UnboxR', 'UnboxRNop']]:
        pc -= 1

    frame['file'] = php_filename(func)
    frame['line'] = php_line_number(func, pc)

    return frame
Esempio n. 13
0
File: pretty.py Progetto: wc2m/hhvm
    def to_string(self):
        global _tv_recurse

        data = self.val['m_data']
        t = self.val['m_type']
        val = None
        name = None

        if t == V('HPHP::KindOfUninit') or t == V('HPHP::KindOfNull'):
            pass

        elif t == V('HPHP::KindOfBoolean'):
            if data['num'] == 0:
                val = False
            elif data['num'] == 1:
                val = True
            else:
                val = data['num']

        elif t == V('HPHP::KindOfInt64'):
            val = data['num']

        elif t == V('HPHP::KindOfDouble'):
            val = data['dbl']

        elif (t == V('HPHP::KindOfString')
              or t == V('HPHP::KindOfPersistentString')):
            val = data['pstr'].dereference()

        elif (t == V('HPHP::KindOfArray')
              or t == V('HPHP::KindOfPersistentArray')):
            val = data['parr']
            if _tv_recurse:
                val = val.dereference()

        elif t == V('HPHP::KindOfObject'):
            val = data['pobj']
            if _tv_recurse:
                val = val.dereference()
            name = nameof(val)

        elif t == V('HPHP::KindOfResource'):
            val = data['pres']

        elif t == V('HPHP::KindOfRef'):
            val = data['pref'].dereference()

        else:
            t = 'Invalid(%d)' % t.cast(T('int8_t'))
            val = "0x%x" % int(data['num'])

        if val is None:
            out = '{ %s }' % t
        elif name is None:
            out = '{ %s, %s }' % (t, str(val))
        else:
            out = '{ %s, %s ("%s") }' % (t, str(val), name)

        return out
Esempio n. 14
0
    def to_string(self):
        global _tv_recurse

        data = self.val['m_data']
        t = self.val['m_type']
        val = None
        name = None

        if t == V('HPHP::KindOfUninit') or t == V('HPHP::KindOfNull'):
            pass

        elif t == V('HPHP::KindOfBoolean'):
            if data['num'] == 0:
                val = False
            elif data['num'] == 1:
                val = True
            else:
                val = data['num']

        elif t == V('HPHP::KindOfInt64'):
            val = data['num']

        elif t == V('HPHP::KindOfDouble'):
            val = data['dbl']

        elif (t == V('HPHP::KindOfString') or
              t == V('HPHP::KindOfPersistentString')):
            val = data['pstr'].dereference()

        elif (t == V('HPHP::KindOfArray') or
              t == V('HPHP::KindOfPersistentArray')):
            val = data['parr']
            if _tv_recurse:
                val = val.dereference()

        elif t == V('HPHP::KindOfObject'):
            val = data['pobj']
            if _tv_recurse:
                val = val.dereference()
            name = nameof(val)

        elif t == V('HPHP::KindOfResource'):
            val = data['pres']

        elif t == V('HPHP::KindOfRef'):
            val = data['pref'].dereference()

        else:
            t = 'Invalid(%d)' % t.cast(T('int8_t'))
            val = "0x%x" % int(data['num'])

        if val is None:
            out = '{ %s }' % t
        elif name is None:
            out = '{ %s, %s }' % (t, str(val))
        else:
            out = '{ %s, %s ("%s") }' % (t, str(val), name)

        return out
Esempio n. 15
0
File: frame.py Progetto: runt18/hhvm
def create_php(idx, ar, rip="0x????????", pc=None):
    """Collect metadata for a PHP frame.

    All arguments are expected to be gdb.Values, except `idx'.
    """
    func = ar["m_func"]
    shared = rawptr(func["m_shared"])

    # Pull the function name.
    if not shared["m_isClosureBody"]:
        func_name = nameof(func)
    else:
        func_name = nameof(func["m_baseCls"])
        func_name = func_name[: func_name.find(";")]

    if len(func_name) == 0:
        func_name = "<pseudomain>"

    frame = {"idx": idx, "sp": str(ar), "rip": _format_rip(rip), "func": "[PHP] {0!s}()".format(func_name)}

    attrs = idxs.atomic_get(func["m_attrs"]["m_attrs"])

    if attrs & V("HPHP::AttrBuiltin"):
        # Builtins don't have source files.
        return frame

    # Pull the PC from Func::base() and ar->m_soff if necessary.
    if pc is None:
        pc = shared["m_base"] + ar["m_soff"]

    # Adjust it for calls.
    op_ptype = T("HPHP::Op").pointer()
    op = (func["m_unit"]["m_bc"] + pc).cast(op_ptype).dereference()

    if op in [V("HPHP::Op::" + x) for x in ["PopR", "UnboxR", "UnboxRNop"]]:
        pc -= 1

    frame["file"] = php_filename(func)
    frame["line"] = php_line_number(func, pc)

    return frame
Esempio n. 16
0
    def to_string(self):
        data = self.val['m_data']
        t = self.val['m_type']
        val = None
        name = None

        if t == V('HPHP::KindOfUninit') or t == V('HPHP::KindOfNull'):
            pass

        elif t == V('HPHP::KindOfBoolean'):
            if data['num'] == 0:
                val = False
            elif data['num'] == 1:
                val = True
            else:
                val = data['num']

        elif t == V('HPHP::KindOfInt64'):
            val = data['num']

        elif t == V('HPHP::KindOfDouble'):
            val = data['dbl']

        elif (t == V('HPHP::KindOfString') or
              t == V('HPHP::KindOfStaticString')):
            val = data['pstr'].dereference()

        elif t == V('HPHP::KindOfArray'):
            val = data['parr']

        elif t == V('HPHP::KindOfObject'):
            val = data['pobj']
            name = nameof(val)

        elif t == V('HPHP::KindOfResource'):
            val = data['pres']

        elif t == V('HPHP::KindOfRef'):
            val = data['pref'].dereference()

        else:
            t = "Invalid(%d)" % t.cast(T('int8_t'))
            val = "0x%x" % data['num']

        if val is None:
            out = "{ %s }" % t
        elif name is None:
            out = "{ %s, %s }" % (t, str(val))
        else:
            out = "{ %s, %s (%s) }" % (t, str(val), name)

        return out
Esempio n. 17
0
    def to_string(self):
        data = self.val['m_data']
        t = self.val['m_type']
        val = None
        name = None

        if t == V('HPHP::KindOfUninit') or t == V('HPHP::KindOfNull'):
            pass

        elif t == V('HPHP::KindOfBoolean'):
            if data['num'] == 0:
                val = False
            elif data['num'] == 1:
                val = True
            else:
                val = data['num']

        elif t == V('HPHP::KindOfInt64'):
            val = data['num']

        elif t == V('HPHP::KindOfDouble'):
            val = data['dbl']

        elif (t == V('HPHP::KindOfString')
              or t == V('HPHP::KindOfStaticString')):
            val = data['pstr'].dereference()

        elif t == V('HPHP::KindOfArray'):
            val = data['parr']

        elif t == V('HPHP::KindOfObject'):
            val = data['pobj']
            name = nameof(val)

        elif t == V('HPHP::KindOfResource'):
            val = data['pres']

        elif t == V('HPHP::KindOfRef'):
            val = data['pref'].dereference()

        else:
            t = "Invalid(%d)" % t.cast(T('int8_t'))
            val = "0x%x" % data['num']

        if val is None:
            out = "{ %s }" % t
        elif name is None:
            out = "{ %s, %s }" % (t, str(val))
        else:
            out = "{ %s, %s (%s) }" % (t, str(val), name)

        return out
Esempio n. 18
0
def create_php(idx, ar, rip='0x????????', pc=None):
    """Collect metadata for a PHP frame.

    All arguments are expected to be gdb.Values, except `idx'.
    """
    func = ar['m_func']
    shared = rawptr(func['m_shared'])

    # Pull the function name.
    if not shared['m_isClosureBody']:
        func_name = nameof(func)
    else:
        func_name = nameof(func['m_baseCls'].cast(T('HPHP::Class').pointer()))
        func_name = func_name[:func_name.find(';')]

    if len(func_name) == 0:
        func_name = '<pseudomain>'

    frame = {
        'idx': idx,
        'fp': str(ar),
        'rip': _format_rip(rip),
        'func': '[PHP] %s()' % func_name,
    }

    attrs = idxs.atomic_get(func['m_attrs']['m_attrs'])

    if attrs & V('HPHP::AttrBuiltin'):
        # Builtins don't have source files.
        return frame

    # Pull the PC from Func::base() and ar->m_callOff if necessary.
    if pc is None:
        pc = shared['m_base'] + (ar['m_callOffAndFlags'] >> 2)

    frame['file'] = php_filename(func)
    frame['line'] = php_line_number(func, pc)

    return frame
Esempio n. 19
0
    def to_string(self):
        data = self.val["m_data"]
        t = self.val["m_type"]
        val = None
        name = None

        if t == V("HPHP::KindOfUninit") or t == V("HPHP::KindOfNull"):
            pass

        elif t == V("HPHP::KindOfBoolean"):
            if data["num"] == 0:
                val = False
            elif data["num"] == 1:
                val = True
            else:
                val = data["num"]

        elif t == V("HPHP::KindOfInt64"):
            val = data["num"]

        elif t == V("HPHP::KindOfDouble"):
            val = data["dbl"]

        elif t == V("HPHP::KindOfString") or t == V("HPHP::KindOfStaticString"):
            val = data["pstr"].dereference()

        elif t == V("HPHP::KindOfArray"):
            val = data["parr"]

        elif t == V("HPHP::KindOfObject"):
            val = data["pobj"]
            name = nameof(val)

        elif t == V("HPHP::KindOfResource"):
            val = data["pres"]

        elif t == V("HPHP::KindOfRef"):
            val = data["pref"].dereference()

        else:
            t = "Invalid(%d)" % t.cast(T("int8_t"))
            val = "0x%x" % data["num"]

        if val is None:
            out = "{ %s }" % t
        elif name is None:
            out = "{ %s, %s }" % (t, str(val))
        else:
            out = '{ %s, %s ("%s") }' % (t, str(val), name)

        return out
 def get_weekday(self, query_data: str):
     """Получение значения дня недели по кнопке"""
     if query_data == nameof(const.btn_day_today):
         return datetime.datetime.today().weekday()
     elif query_data == nameof(const.btn_day_tomorrow):
         return (datetime.datetime.today() + datetime.timedelta(days=1)).weekday()
     elif query_data == nameof(const.btn_day_mon):
         return 0
     elif query_data == nameof(const.btn_day_tue):
         return 1
     elif query_data == nameof(const.btn_day_wed):
         return 2
     elif query_data == nameof(const.btn_day_thu):
         return 3
     elif query_data == nameof(const.btn_day_fri):
         return 4
     elif query_data == nameof(const.btn_day_sat):
         return 5
     elif query_data == nameof(const.btn_day_sun):
         return 6
    def get_ct_weekday_btns(self, update: telegram.Update, context: CallbackContext):
        """Меню -> Расписание -> День недели"""
        query = update.callback_query
        query.answer()

        menu = [[InlineKeyboardButton(const.btn_day_mon, callback_data=nameof(const.btn_day_mon)),
                 InlineKeyboardButton(const.btn_day_tue, callback_data=nameof(const.btn_day_tue))],
                [InlineKeyboardButton(const.btn_day_wed, callback_data=nameof(const.btn_day_wed)),
                 InlineKeyboardButton(const.btn_day_thu, callback_data=nameof(const.btn_day_thu))],
                [InlineKeyboardButton(const.btn_day_fri, callback_data=nameof(const.btn_day_fri)),
                 InlineKeyboardButton(const.btn_day_sat, callback_data=nameof(const.btn_day_sat))]]

        reply_markup = InlineKeyboardMarkup(menu)
        query.edit_message_text(text=const.msg_day_btns, reply_markup=reply_markup)
    def get_ct_btns(self, update: telegram.Update, context: CallbackContext):
        """Меню -> Расписание занятий"""
        query = update.callback_query
        query.answer()

        menu = [[InlineKeyboardButton(const.btn_ct_full, callback_data=nameof(const.btn_ct_full)),
                 InlineKeyboardButton(const.btn_weekday, callback_data=nameof(const.btn_weekday))],
                [InlineKeyboardButton(const.btn_week_current, callback_data=nameof(const.btn_week_current)),
                 InlineKeyboardButton(const.btn_week_next, callback_data=nameof(const.btn_week_next))],
                [InlineKeyboardButton(const.btn_day_today, callback_data=nameof(const.btn_day_today)),
                 InlineKeyboardButton(const.btn_day_tomorrow, callback_data=nameof(const.btn_day_tomorrow))]]

        reply_markup = InlineKeyboardMarkup(menu)
        query.edit_message_text(text=const.msg_ct, reply_markup=reply_markup)
Esempio n. 23
0
    def to_string(self):
        func_id = self.val['m_funcID']
        if func_id == -1:
            return '<invalid SrcKey>'

        func = nameof(lookup_func(func_id))
        offset = self.val['m_offset']

        rmp = self.val['m_resumeModeAndPrologue']
        resume = prologue = ''
        if rmp == 0:
            # ResumeMode::None
            pass
        elif rmp == 1:
            resume = 'ra'
        elif rmp == 2:
            resume = 'rg'
        elif rmp == 3:
            prologue = 'p'

        return '%s@%d%s%s' % (func, offset, resume, prologue)
Esempio n. 24
0
    def to_string(self):
        func_id = self.val['m_funcID']
        if func_id == -1:
            return '<invalid SrcKey>'

        func = nameof(lookup_func(func_id))
        offset = self.val['m_offset']
        this = 't' if self.val['m_hasThis'] else ''

        rmp = self.val['m_resumeModeAndPrologue']
        resume = prologue = ''
        if rmp == 0:
            # ResumeMode::None
            pass
        elif rmp == 1:
            resume = 'ra'
        elif rmp == 2:
            resume = 'rg'
        elif rmp == 3:
            prologue = 'p'

        return '%s@%d%s%s%s' % (func, offset, resume, this, prologue)
Esempio n. 25
0
    def invoke(self, args, from_tty):
        asio_session = TL('HPHP::AsioSession::s_current')['m_p']

        contexts = asio_session['m_contexts']
        num_contexts = sizeof(contexts)

        if num_contexts == 0:
            print('Not currently in the scope of an AsioContext')
            return

        asio_ctx = asio_context()

        # Count the number of contexts, and print the topmost.
        print('\n%d stacked AsioContext%s (current: (%s) %s)' %
              (int(num_contexts), plural_suffix(num_contexts),
               str(asio_ctx.type), str(asio_ctx)))

        # Get the current vmfp().
        header_ptype = T('HPHP::rds::Header').pointer()
        vmfp = TL('HPHP::rds::tl_base').cast(header_ptype)['vmRegs']['fp']

        wh_ptype = T('HPHP::c_WaitableWaitHandle').pointer()

        # Find the most recent join().
        for _i, fp in izip(count(), frame.gen_php(vmfp)):
            if nameof(fp['m_func']) == 'HH\WaitHandle::join':
                break

        if nameof(fp['m_func']) != 'HH\WaitHandle::join':
            print("...but couldn't find join().  Something is wrong.\n")
            return

        wh = fp['m_this'].cast(wh_ptype)

        print('\nCurrently %s WaitHandle: (%s) %s [state: %s]' %
              ('joining' if i == 0 else 'executing', str(
                  wh.type), str(wh), WaitHandle(wh).state_str()))

        # Dump the async stacktrace.
        for s in frame.stringify_stacktrace(asio_stacktrace(wh)):
            print('    %s' % s)

        # Count the number of queued runnables.
        queue_size = sizeof(asio_ctx['m_runnableQueue'])
        print('%d other resumable%s queued' %
              (int(queue_size), plural_suffix(queue_size)))

        sleeps = asio_ctx['m_sleepEvents']
        externals = asio_ctx['m_externalThreadEvents']

        num_sleeps = sizeof(sleeps)
        num_externals = sizeof(externals)

        # Count sleep and external thread events.
        print('')
        print('%d pending sleep event%s' %
              (int(num_sleeps), plural_suffix(num_sleeps)))
        print('%d pending external thread event%s' %
              (int(num_externals), plural_suffix(num_externals)))

        # Dump sleep and external thread event stacktraces.
        for vec in [sleeps, externals]:
            for i in xrange(int(sizeof(vec))):
                wh = idx.vector_at(vec, i)
                stacktrace = frame.stringify_stacktrace(asio_stacktrace(wh, 3))

                print('\n(%s) %s [state: %s]' %
                      (str(wh.type), str(wh), WaitHandle(wh).state_str()))

                if len(stacktrace) == 4:
                    for s in stacktrace[0:-1]:
                        print('    %s' % s)
                    print('     ...')
                    print('    %s' % stacktrace[-1])
                else:
                    for s in stacktrace:
                        print('    %s' % s)
        print('')
Esempio n. 26
0
 def to_string(self):
     return 'Object of class "%s" @ %s' % (
         nameof(self.cls),
         self.val.address)
    def set_timer(self, update: telegram.Update, context: CallbackContext):
        chat_id = update.message.chat_id
        query = update.callback_query
        query.answer()

        ct_dict = self.get_ct()

        if query.data == nameof(const.btn_ntf_bef_lesson_h2):


        if 'job' in context.chat_data:
            old_job = context.chat_data['job']
            old_job.schedule_removal()

        new_job = context.job_queue.run_daily(self.alarm, datetime.time(8, 47, 0, 0), context=chat_id)
        # new_job = context.job_queue.run_repeating(self.alarm, 5, context=chat_id)
        context.chat_data['job'] = new_job

        update.message.reply_text('Timer successfully set!')

    def get_start_menu(self, update: telegram.Update, context: CallbackContext):
        """Стартовое меню"""
        menu = [[InlineKeyboardButton(const.btn_start_menu_ct, callback_data=nameof(const.btn_start_menu_ct)),
                 InlineKeyboardButton(const.btn_start_menu_ntf, callback_data=nameof(const.btn_start_menu_ntf))]]

        reply_markup = InlineKeyboardMarkup(menu)
        update.message.reply_text(const.msg_start_menu, reply_markup=reply_markup)

    def get_btns_ntf(self, update: telegram.Update, context: CallbackContext):
        """Меню -> Уведомления"""
        query = update.callback_query
        query.answer()

        menu = [[InlineKeyboardButton(const.btn_ntf_bef_lsn, callback_data=nameof(const.btn_ntf_bef_lsn))],
                [InlineKeyboardButton(const.btn_ntf_every_day, callback_data=nameof(const.btn_ntf_every_day))]]

        reply_markup = InlineKeyboardMarkup(menu)
        query.edit_message_text(text=const.msg_ntf, reply_markup=reply_markup)

    def get_btns_ntf_bef_lesson(self, update: telegram.Update, context: CallbackContext):
        """Меню -> Уведомления -> Перед началом занятий"""
        query = update.callback_query
        query.answer()

        menu = [[InlineKeyboardButton(const.btn_ntf_bef_lesson_h2, callback_data=nameof(const.btn_ntf_bef_lesson_h2)),
                InlineKeyboardButton(const.btn_ntf_bef_lesson_h1, callback_data=nameof(const.btn_ntf_bef_lesson_h1))],
                [InlineKeyboardButton(const.btn_ntf_bef_lesson_min30, callback_data=nameof(const.btn_ntf_bef_lesson_min30)),
                InlineKeyboardButton(const.btn_ntf_bef_lesson_min15, callback_data=nameof(const.btn_ntf_bef_lesson_min15))]]

        reply_markup = InlineKeyboardMarkup(menu)
        query.edit_message_text(text=const.msg_ntf, reply_markup=reply_markup)

    def get_ct_btns(self, update: telegram.Update, context: CallbackContext):
        """Меню -> Расписание занятий"""
        query = update.callback_query
        query.answer()

        menu = [[InlineKeyboardButton(const.btn_ct_full, callback_data=nameof(const.btn_ct_full)),
                 InlineKeyboardButton(const.btn_weekday, callback_data=nameof(const.btn_weekday))],
                [InlineKeyboardButton(const.btn_week_current, callback_data=nameof(const.btn_week_current)),
                 InlineKeyboardButton(const.btn_week_next, callback_data=nameof(const.btn_week_next))],
                [InlineKeyboardButton(const.btn_day_today, callback_data=nameof(const.btn_day_today)),
                 InlineKeyboardButton(const.btn_day_tomorrow, callback_data=nameof(const.btn_day_tomorrow))]]

        reply_markup = InlineKeyboardMarkup(menu)
        query.edit_message_text(text=const.msg_ct, reply_markup=reply_markup)

    def get_ct_weekday_btns(self, update: telegram.Update, context: CallbackContext):
        """Меню -> Расписание -> День недели"""
        query = update.callback_query
        query.answer()

        menu = [[InlineKeyboardButton(const.btn_day_mon, callback_data=nameof(const.btn_day_mon)),
                 InlineKeyboardButton(const.btn_day_tue, callback_data=nameof(const.btn_day_tue))],
                [InlineKeyboardButton(const.btn_day_wed, callback_data=nameof(const.btn_day_wed)),
                 InlineKeyboardButton(const.btn_day_thu, callback_data=nameof(const.btn_day_thu))],
                [InlineKeyboardButton(const.btn_day_fri, callback_data=nameof(const.btn_day_fri)),
                 InlineKeyboardButton(const.btn_day_sat, callback_data=nameof(const.btn_day_sat))]]

        reply_markup = InlineKeyboardMarkup(menu)
        query.edit_message_text(text=const.msg_day_btns, reply_markup=reply_markup)

    def get_ct(self, predicate: lambda x: x is not None):
        filepath = path.join(path.dirname(path.dirname(__file__)), const.file_path_class_timetable)
        ct_dict = filtration_class_timetable(filepath, predicate=predicate)
        return ct_dict

    def get_ct_full(self, update: telegram.Update, context: CallbackContext):
        """Меню -> Расписание -> Полное"""
        query = update.callback_query
        query.answer()

        ct_dict = self.get_ct(lambda x: x is not None)
        answer_message = ''
        for line in ct_dict:
            answer_message += self.add_ct_answer_delimiter()
            answer_message += self.add_ct_answer_generic(line)
            answer_message += self.add_ct_answer_week(line)
            answer_message += self.add_ct_answer_other_info(line)

        answer_message += self.add_ct_answer_delimiter()
        query.edit_message_text(text=answer_message)

    def get_ct_week(self, update: telegram.Update, context: CallbackContext):
        """
        Меню -> Расписание -> Эта неделя
        Меню -> Расписание -> След. неделя
        """
        query = update.callback_query
        query.answer()

        query_data = query.data

        if query_data == nameof(const.btn_week_current):
            is_even_week = help.is_even_week()
            ct_dict = self.get_ct(lambda x: x[nameof(self.model.isEvenWeek)] == f'{is_even_week}')
        elif query_data == nameof(const.btn_week_next):
            is_even_week = not help.is_even_week()
            ct_dict = self.get_ct(lambda x: x[nameof(self.model.isOddWeek)] != f'{is_even_week}')

        answer_message = f''
        for line in ct_dict:
            answer_message += self.add_ct_answer_delimiter()
            answer_message += self.add_ct_answer_generic(line)
            answer_message += self.add_ct_answer_other_info(line)

        answer_message += self.add_ct_answer_delimiter()
        query.edit_message_text(text=answer_message)

    def get_weekday(self, query_data: str):
        """Получение значения дня недели по кнопке"""
        if query_data == nameof(const.btn_day_today):
            return datetime.datetime.today().weekday()
        elif query_data == nameof(const.btn_day_tomorrow):
            return (datetime.datetime.today() + datetime.timedelta(days=1)).weekday()
        elif query_data == nameof(const.btn_day_mon):
            return 0
        elif query_data == nameof(const.btn_day_tue):
            return 1
        elif query_data == nameof(const.btn_day_wed):
            return 2
        elif query_data == nameof(const.btn_day_thu):
            return 3
        elif query_data == nameof(const.btn_day_fri):
            return 4
        elif query_data == nameof(const.btn_day_sat):
            return 5
        elif query_data == nameof(const.btn_day_sun):
            return 6

    def get_ct_day(self, update: telegram.Update, context: CallbackContext):
        """
        Меню -> Респисание -> Сегодня
        Меню -> Расписание -> Завтра
        Меню -> Расписание -> День недели -> День
        """
        query = update.callback_query
        query.answer()

        query_data = query.data

        weekday = self.get_weekday(query_data)
        if weekday == 0:
            weekday_str = const.btn_day_mon
        elif weekday == 1:
            weekday_str = const.btn_day_tue
        elif weekday == 2:
            weekday_str = const.btn_day_wed
        elif weekday == 3:
            weekday_str = const.btn_day_thu
        elif weekday == 4:
            weekday_str = const.btn_day_fri
        elif weekday == 5:
            weekday_str = const.btn_day_sat
        elif weekday == 6:
            weekday_str = const.btn_day_sun
        else:
            weekday_str = None

        ct_dict = self.get_ct(lambda x: (x[nameof(self.model.weekday)] == weekday_str))

        answer_message = f''
        if len(ct_dict) <= 0:
            answer_message += self.add_ct_answer_delimiter()
            if query_data == nameof(const.btn_day_today):
                answer_message += self.add_ct_answer_not_in_day(const.btn_day_today)
            elif query_data == nameof(const.btn_day_tomorrow):
                answer_message += self.add_ct_answer_not_in_day(const.btn_day_tomorrow)
            else:
                answer_message += self.add_ct_answer_not_in_day(weekday_str)
        else:
            for line in ct_dict:
                answer_message += self.add_ct_answer_delimiter()
                answer_message += self.add_ct_answer_generic(line)
                answer_message += self.add_ct_answer_other_info(line)

        answer_message += self.add_ct_answer_delimiter()
        query.edit_message_text(text=answer_message)

    # region Add Class Timetable Answer
    def add_ct_answer_delimiter(self):
        """Добавление в ответ разделителя занятий"""
        return f'{const.msg_ct_delimiter}\n'

    def add_ct_answer_generic(self, ct_dict_line: {}):
        """Добавление в ответ основной информации по занятию"""
        answer_message = f'{const.msg_ct_weekday} {ct_dict_line[nameof(self.model.weekday)]}\n' \
                         f'{const.msg_ct_lesson_start} {ct_dict_line[nameof(self.model.lessonStart)][slice(-8, -3)]}\n' \
                         f'{const.msg_ct_lesson_end} {ct_dict_line[nameof(self.model.lessonEnd)][slice(-8, -3)]}\n' \
                         f'{const.msg_ct_lesson_name} {ct_dict_line[nameof(self.model.lessonName)]}\n' \
                         f'{const.msg_ct_teacher_name} {ct_dict_line[nameof(self.model.teacherName)]}\n'

        return answer_message

    def add_ct_answer_week(self, ct_dict_line: {}):
        """Добавление занятии о неделе"""
        if ct_dict_line[nameof(self.model.isEveryWeek)]:
            return f'{const.msg_ct_is_every_w}\n'
        elif ct_dict_line[nameof(self.model.isEvenWeek)]:
            return f'{const.msg_ct_is_even_w}\n'
        elif ct_dict_line[nameof(self.model.isOddWeek)]:
            return f'{const.msg_ct_is_odd_w}\n'
        elif ct_dict_line[nameof(self.model.isOnceMonth)]:
            return f'{const.msg_ct_is_once_month}\n'
        else:
            return f''

    def add_ct_answer_other_info(self, ct_dict_line: {}):
        """Добавлении остальной информации о занятии"""
        answer_message = f''
        if ct_dict_line[nameof(self.model.isOnline)]:
            answer_message += f'{const.msg_ct_is_online}\n'
        else:
            answer_message += f'{const.msg_ct_is_offline}\n'

        if ct_dict_line[nameof(self.model.otherInfo)] is not None:
            answer_message += f'{const.msg_ct_other_info} {ct_dict_line[nameof(self.model.otherInfo)]}\n'

        return answer_message

    def add_ct_answer_not_in_day(self, weekday: str):
        return f'{weekday}: {const.msg_ct_not}\n'
Esempio n. 28
0
 def to_string(self):
     return "Object of class %s @ 0x%x" % (nameof(
         self.cls), self.val.address)
Esempio n. 29
0
 def to_string(self):
     return "Object of class %s @ %s" % (
         nameof(self.cls),
         self.val.address)
Esempio n. 30
0
 def to_string(self):
     return 'Object of class "%s" @ %s' % (nameof(
         self.cls), self.val.address)
Esempio n. 31
0
    def invoke(self, args, from_tty):
        asio_session = TL('HPHP::AsioSession::s_current')['m_p']

        contexts = asio_session['m_contexts']
        num_contexts = sizeof(contexts)

        if num_contexts == 0:
            print('Not currently in the scope of an AsioContext')
            return

        asio_ctx = asio_context()

        # Count the number of contexts, and print the topmost.
        print('\n%d stacked AsioContext%s (current: (%s) %s)' % (
            int(num_contexts),
            plural_suffix(num_contexts),
            str(asio_ctx.type),
            str(asio_ctx)))

        # Get the current vmfp().
        header_ptype = T('HPHP::rds::Header').pointer()
        vmfp = TL('HPHP::rds::tl_base').cast(header_ptype)['vmRegs']['fp']

        wh_ptype = T('HPHP::c_WaitableWaitHandle').pointer()

        # Find the most recent join().
        for i, fp in izip(count(), frame.gen_php(vmfp)):
            if nameof(fp['m_func']) == 'HH\WaitHandle::join':
                break

        if nameof(fp['m_func']) != 'HH\WaitHandle::join':
            print("...but couldn't find join().  Something is wrong.\n")
            return

        wh = fp['m_this'].cast(wh_ptype)

        print('\nCurrently %s WaitHandle: (%s) %s [state: %s]' % (
            'joining' if i == 0 else 'executing',
            str(wh.type),
            str(wh),
            WaitHandle(wh).state_str()))

        # Dump the async stacktrace.
        for s in frame.stringify_stacktrace(asio_stacktrace(wh)):
            print('    %s' % s)

        # Count the number of queued runnables.
        queue_size = sizeof(asio_ctx['m_runnableQueue'])
        print('%d other resumable%s queued' % (
            int(queue_size),
            plural_suffix(queue_size)))

        sleeps = asio_ctx['m_sleepEvents']
        externals = asio_ctx['m_externalThreadEvents']

        num_sleeps = sizeof(sleeps)
        num_externals = sizeof(externals)

        # Count sleep and external thread events.
        print('')
        print('%d pending sleep event%s' % (
            int(num_sleeps), plural_suffix(num_sleeps)))
        print('%d pending external thread event%s' % (
            int(num_externals), plural_suffix(num_externals)))

        # Dump sleep and external thread event stacktraces.
        for vec in [sleeps, externals]:
            for i in xrange(int(sizeof(vec))):
                wh = idx.vector_at(vec, i)
                stacktrace = frame.stringify_stacktrace(asio_stacktrace(wh, 3))

                print('\n(%s) %s [state: %s]' % (
                    str(wh.type), str(wh), WaitHandle(wh).state_str()))

                if len(stacktrace) == 4:
                    for s in stacktrace[0:-1]:
                        print('    %s' % s)
                    print('     ...')
                    print('    %s' % stacktrace[-1])
                else:
                    for s in stacktrace:
                        print('    %s' % s)
        print('')