示例#1
0
    def update_category_list(self):
        self.notify_admin('Sending category list...')

        # generate category links to previous messages
        all_categories = '\n'.join([
            "[{}](https://t.me/{}/{})".format(str(c), self.channel.username,
                                              c.current_message_id)
            for c in Category.select_all()
        ])

        url_stub = 'https://t.me/{}/'.format(self.channel.username)
        category_list = self._read_file(self.CATEGORY_LIST_FILE)

        # Insert placeholders
        text = category_list.format(url_stub + str(self.channel.intro_en_mid),
                                    url_stub + str(self.channel.intro_es_mid),
                                    all_categories,
                                    url_stub + str(self.channel.new_bots_mid))

        msg = self.send_or_edit(text, self.channel.category_list_mid)

        if msg:
            self.channel.category_list_mid = msg.message_id
            self.sent['category_list'] = "Category Links sent"
        self._save_channel()
示例#2
0
 def delete_full_botlist(self):
     all_cats = Category.select_all()
     start = all_cats[0].current_message_id - 3  # Some wiggle room and GIF
     end = all_cats[-1].current_message_id + 4  # Some wiggle room
     self.notify_admin("Deleting all messages...")
     for m in range(start, end):
         try:
             self.bot.delete_message(self.channel.chat_id, m)
         except BadRequest as e:
             pass
示例#3
0
def categories_endpoint():
    """
    Returns all categories of the BotList.
    """
    if request.method == 'GET':
        query = Category.select_all()
        data = [i.serialize for i in query]

        if data:
            res = jsonify({'categories': data, 'meta': {'url': request.url}})
            res.status_code = 200
        else:
            res = _error('No categories found.')
            res.status_code = 500
        return res
示例#4
0
def send_botlist(bot, update, resend=False, silent=False):
    log.info("Re-sending BotList..." if resend else "Updating BotList...")

    channel = helpers.get_channel()
    revision = Revision.get_instance()
    revision.nr += 1
    revision.save()

    all_categories = Category.select_all()

    botlist = BotList(bot, update, channel, resend, silent)
    if resend:
        botlist.delete_full_botlist()
    botlist.update_intro()
    botlist.update_categories(all_categories)
    botlist.update_new_bots_list()
    botlist.update_category_list()
    botlist.send_footer()
    botlist.finish()
    channel.save()
    Statistic.of(update, 'send', 'botlist (resend: {})'.format(str(resend)),
                 Statistic.IMPORTANT)
示例#5
0
def inlinequery_handler(bot, update, chat_data):
    query = update.inline_query.query.lower()

    # TODO: remove or enhance eventually, this is potentially very spammy
    # Statistic.of(update, 'inlinequery', '"{}"'.format(query), Statistic.DETAILED)

    user = User.from_update(update)
    results_list = list()

    input_given = len(query.strip()) > 0
    query_too_short = 0 < len(query.strip()) < SEARCH_QUERY_MIN_LENGTH

    too_many_results = False
    cat_results = []
    bot_results = []

    if input_given:
        # query category results
        cat_results = search.search_categories(query)

        if not query_too_short:
            # query bot results
            bot_results = list(search.search_bots(query))
            if len(bot_results) > MAX_BOTS:
                bot_results = bot_results[:MAX_BOTS]
                too_many_results = True

    # query for new bots
    if query == messages.NEW_BOTS_INLINEQUERY.lower() or query == 'new':
        results_list.append(new_bots_article())
        bot.answerInlineQuery(update.inline_query.id, results=results_list)
        return

    if query in CONTRIBUTING_QUERIES:
        results_list.append(
            InlineQueryResultArticle(
                id=uuid4(),
                title='Contributing',
                input_message_content=InputTextMessageContent(
                    message_text=messages.CONTRIBUTING, parse_mode="Markdown"),
            ))
        bot.answerInlineQuery(update.inline_query.id,
                              results=results_list,
                              cache_time=600)
        return

    if query in EXAMPLES_QUERIES:
        results_list.append(
            InlineQueryResultArticle(
                id=uuid4(),
                title='Examples',
                input_message_content=InputTextMessageContent(
                    message_text=messages.EXAMPLES, parse_mode="Markdown"),
            ))
        bot.answerInlineQuery(update.inline_query.id,
                              results=results_list,
                              cache_time=600)
        return

    if query in (const.DeepLinkingActions.RULES, '#rules'):
        results_list.append(
            InlineQueryResultArticle(
                id=uuid4(),
                title='@BotListChat Rules',
                input_message_content=InputTextMessageContent(
                    message_text=messages.BOTLISTCHAT_RULES,
                    parse_mode="Markdown",
                    disable_web_page_preview=True),
            ))
        bot.answerInlineQuery(update.inline_query.id,
                              results=results_list,
                              cache_time=600)
        return

    if query == const.DeepLinkingActions.FAVORITES and user.has_favorites:
        results_list.append(favorites_article(user))
        bot.answerInlineQuery(update.inline_query.id,
                              results=results_list,
                              cache_time=0,
                              is_personal=True)
        return

    msg, reply_markup, key = botlistchat.get_hint_message_and_markup(query)
    if msg is not None:
        results_list.append(hint_article(msg, reply_markup, key))
        bot.answerInlineQuery(update.inline_query.id,
                              results=results_list,
                              cache_time=600)
        return

    invalid_search_term = query_too_short and not cat_results
    if invalid_search_term:
        results_list.append(query_too_short_article())

    results_available = cat_results or bot_results
    if results_available:
        if len(bot_results) > 1:
            results_list.append(
                all_bot_results_article(bot_results, too_many_results))
        for c in cat_results:
            results_list.append(category_article(c))
        for b in bot_results:
            results_list.append(bot_article(b))

        if len(bot_results) > 0:
            bot.answerInlineQuery(
                update.inline_query.id,
                results=results_list,
                switch_pm_text="See all results"
                if too_many_results else "Search in private chat",
                switch_pm_parameter=util.encode_base64(query),
                cache_time=0,
                is_personal=True)
        else:
            bot.answerInlineQuery(update.inline_query.id,
                                  results=results_list,
                                  cache_time=0,
                                  is_personal=True)
    else:
        if user.has_favorites:
            results_list.append(favorites_article(user))
        results_list.append(new_bots_article())
        categories = Category.select_all()
        for c in categories:
            results_list.append(category_article(c))

        if invalid_search_term or not input_given:
            bot.answerInlineQuery(update.inline_query.id,
                                  results=results_list,
                                  cache_time=0,
                                  is_personal=True)
        else:
            bot.answerInlineQuery(
                update.inline_query.id,
                results=results_list,
                switch_pm_text="No results. Contribute a bot?",
                switch_pm_parameter='contributing',
                cache_time=0,
                is_personal=True)