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))
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)
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
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
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
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
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 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
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)
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)
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)
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('')
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'
def to_string(self): return "Object of class %s @ 0x%x" % (nameof( self.cls), self.val.address)
def to_string(self): return "Object of class %s @ %s" % ( nameof(self.cls), self.val.address)
def to_string(self): return 'Object of class "%s" @ %s' % (nameof( self.cls), self.val.address)
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('')