def show_new_bots(bot, update, chat_data, back_button=False): chat_id = update.effective_chat.id channel = helpers.get_channel() buttons = [[ InlineKeyboardButton("Show in BotList", url="http://t.me/{}/{}".format( channel.username, channel.new_bots_mid)), InlineKeyboardButton("Share", switch_inline_query=messages.NEW_BOTS_INLINEQUERY) ]] if back_button: buttons[0].insert( 0, InlineKeyboardButton(captions.BACK, callback_data=util.callback_for_action( CallbackActions.SELECT_CATEGORY))) reply_markup = InlineKeyboardMarkup(buttons) reply_markup, callback = botlistchat.append_delete_button( update, chat_data, reply_markup) msg = bot.formatter.send_or_edit( chat_id, _new_bots_text(), to_edit=util.mid_from_update(update), reply_markup=reply_markup, reply_to_message_id=util.mid_from_update(update)) callback(msg) return ConversationHandler.END
def select_category(bot, update, chat_data, callback_action=None): chat_id = update.effective_chat.id reply_markup = InlineKeyboardMarkup(_select_category_buttons(callback_action)) reply_markup, callback = botlistchat.append_delete_button(update, chat_data, reply_markup) msg = bot.formatter.send_or_edit(chat_id, util.action_hint(messages.SELECT_CATEGORY), to_edit=util.mid_from_update(update), reply_markup=reply_markup) callback(msg) return ConversationHandler.END
def send_category(bot, update, chat_data, category=None): uid = util.uid_from_update(update) cid = update.effective_chat.id bots = Bot.of_category_without_new( category)[:settings.MAX_BOTS_PER_MESSAGE] bots_with_description = [b for b in bots if b.description is not None] detailed_buttons_enabled = len( bots_with_description) > 0 and util.is_private_message(update) callback = CallbackActions.SEND_BOT_DETAILS if detailed_buttons_enabled: buttons = [ InlineKeyboardButton(x.username, callback_data=util.callback_for_action( callback, {'id': x.id})) for x in bots_with_description ] else: buttons = [] menu = util.build_menu(buttons, 2) menu.insert(0, [ InlineKeyboardButton(captions.BACK, callback_data=util.callback_for_action( CallbackActions.SELECT_CATEGORY)), InlineKeyboardButton("Show in BotList", url='http://t.me/botlist/{}'.format( category.current_message_id)), InlineKeyboardButton("Share", switch_inline_query=category.name) ]) txt = "There are *{}* bots in the category *{}*:\n\n".format( len(bots), str(category)) if uid in settings.MODERATORS and util.is_private_message(update): # append admin edit buttons txt += '\n'.join(["{} — /edit{} 🛃".format(b, b.id) for b in bots]) else: txt += '\n'.join([str(b) for b in bots]) if detailed_buttons_enabled: txt += "\n\n" + util.action_hint( "Press a button below to get a detailed description.") reply_markup = InlineKeyboardMarkup(menu) reply_markup, callback = botlistchat.append_delete_button( update, chat_data, reply_markup) msg = bot.formatter.send_or_edit(cid, txt, to_edit=util.mid_from_update(update), reply_markup=reply_markup) callback(msg) Statistic.of(update, 'menu', 'of category {}'.format(str(category)), Statistic.ANALYSIS)
def send_bot_details(bot, update, chat_data, item=None): is_group = util.is_group_message(update) cid = update.effective_chat.id user = User.from_update(update) first_row = list() if item is None: if is_group: return try: text = update.message.text bot_in_text = re.findall(settings.REGEX_BOT_IN_TEXT, text)[0] item = Bot.by_username(bot_in_text) except Bot.DoesNotExist: update.message.reply_text( util.failure( "This bot is not in the @BotList. If you think this is a mistake, see the /examples for /contributing." )) return if item.approved: # bot is already in the botlist => show information txt = item.detail_text if item.description is None and not Keyword.select().where( Keyword.entity == item).exists(): txt += ' is in the @BotList.' btn = InlineCallbackButton(captions.BACK_TO_CATEGORY, CallbackActions.SELECT_BOT_FROM_CATEGORY, {'id': item.category.id}) first_row.insert(0, btn) first_row.append( InlineKeyboardButton(captions.SHARE, switch_inline_query=item.username)) # if cid in settings.MODERATORS: first_row.append( InlineKeyboardButton("📝 Edit", callback_data=util.callback_for_action( CallbackActions.EDIT_BOT, {'id': item.id}))) else: txt = '{} is currently pending to be accepted for the @BotList.'.format( item) if cid in settings.MODERATORS: first_row.append( InlineKeyboardButton("🛃 Accept / Reject", callback_data=util.callback_for_action( CallbackActions.APPROVE_REJECT_BOTS, {'id': item.id}))) if is_group: reply_markup = InlineKeyboardMarkup([]) else: buttons = [first_row] favorite_found = Favorite.search_by_bot(user, item) if favorite_found: buttons.append([ InlineKeyboardButton(captions.REMOVE_FAVORITE_VERBOSE, callback_data=util.callback_for_action( CallbackActions.REMOVE_FAVORITE, { 'id': favorite_found.id, 'details': True })) ]) else: buttons.append([ InlineKeyboardButton(captions.ADD_TO_FAVORITES, callback_data=util.callback_for_action( CallbackActions.ADD_TO_FAVORITES, { 'id': item.id, 'details': True })) ]) reply_markup = InlineKeyboardMarkup(buttons) reply_markup, callback = botlistchat.append_delete_button( update, chat_data, reply_markup) # Should we ever decide to show thumbnails *shrug* # if os.path.exists(item.thumbnail_file): # preview = True # photo = '[\xad]({})'.format('{}/thumbnail/{}.jpeg'.format( # settings.API_URL, # item.username[1:] # )) # log.info(photo) # txt = photo + txt # else: # preview = False msg = bot.formatter.send_or_edit(cid, txt, to_edit=util.mid_from_update(update), reply_markup=reply_markup) callback(msg) Statistic.of(update, 'view-details', item.username, Statistic.ANALYSIS) return CallbackStates.SHOWING_BOT_DETAILS