def add_keyword(bot, update, chat_data):
    user = User.from_telegram_object(update.effective_user)
    if check_suggestion_limit(bot, update, user):
        return
    kw = update.message.text
    bot_to_edit = chat_data.get('edit_bot')
    kw = helpers.format_keyword(kw)

    # Sanity checks
    if kw in settings.FORBIDDEN_KEYWORDS:
        update.message.reply_text('The keyword {} is forbidden.'.format(kw))
        return
    if len(kw) <= 1:
        update.message.reply_text('Keywords must be longer than 1 character.')
        return
    if len(kw) >= 20:
        update.message.reply_text(
            'Keywords must not be longer than 20 characters.')

    # Ignore duplicates
    try:
        Keyword.get((Keyword.name == kw) & (Keyword.entity == bot_to_edit))
        return
    except Keyword.DoesNotExist:
        pass

    Suggestion.add_or_update(user=user,
                             action='add_keyword',
                             subject=bot_to_edit,
                             value=kw)
    set_keywords(bot, update, chat_data, bot_to_edit)
    Statistic.of(update, 'added keyword to'.format(kw), bot_to_edit.username)
def set_text_property(bot, update, chat_data, property_name, to_edit=None):
    uid = util.uid_from_update(update)
    user = User.from_update(update)
    if check_suggestion_limit(bot, update, user):
        return

    if to_edit:
        text = (util.escape_markdown(getattr(to_edit, property_name)) +
                "\n\n" if getattr(to_edit, property_name) else '')
        text += mdformat.action_hint(
            messages.SET_BOTPROPERTY.format(
                property_name, util.escape_markdown(to_edit.username),
                CLEAR_QUERY))
        if property_name == 'description':
            text += ', markdown enabled.'
        update.effective_message.reply_text(
            text,
            reply_markup=ForceReply(selective=True),
            parse_mode=ParseMode.MARKDOWN)
        chat_data['edit_bot'] = to_edit
    elif update.message:
        value = None
        text = update.message.text

        to_edit = chat_data.get('edit_bot', None)

        def too_long(n):
            bot.formatter.send_failure(
                uid, "Your {} text is too long, it must be shorter "
                "than {} characters. Please try again.".format(
                    property_name, n))
            util.wait(bot, update)
            return admin.edit_bot(bot, update, chat_data, to_edit)

        # Validation
        if property_name == 'description' and len(text) > 300:
            return too_long(300)
        if property_name == 'username':
            value = helpers.validate_username(text)
            if value:
                to_edit = chat_data.get('edit_bot', None)
            else:
                bot.formatter.send_failure(
                    uid,
                    "The username you entered is not valid. Please try again..."
                )
                return admin.edit_bot(bot, update, chat_data, to_edit)

        if not value:
            value = text

        if to_edit:
            if _is_clear_query(text):
                Suggestion.add_or_update(user, property_name, to_edit, None)
            else:
                Suggestion.add_or_update(user, property_name, to_edit, value)
            admin.edit_bot(bot, update, chat_data, to_edit)
        else:
            bot.formatter.send_failure(uid, "An unexpected error occured.")
def remove_keyword(bot, update, chat_data, context):
    user = User.from_telegram_object(update.effective_user)
    if check_suggestion_limit(bot, update, user):
        return
    to_edit = context.get('to_edit')
    kw = context.get('keyword')
    Suggestion.add_or_update(user=user,
                             action='remove_keyword',
                             subject=to_edit,
                             value=kw.name)
    return set_keywords(bot, update, chat_data, to_edit)
def set_country(bot, update, to_edit, country):
    user = User.from_update(update)

    if check_suggestion_limit(bot, update, user):
        return
    if isinstance(country, Country):
        value = country.id
    elif country is None or country == 'None':
        value = None
    else:
        raise AttributeError("Error setting country to {}.".format(country))
    Suggestion.add_or_update(user, 'country', to_edit, value)
def change_category(bot, update, to_edit, category):
    uid = update.effective_user.id
    user = User.get(User.chat_id == uid)

    if uid == 918962:
        # Special for t3chno
        to_edit.category = category
        to_edit.save()
    else:
        if check_suggestion_limit(bot, update, user):
            return
        Suggestion.add_or_update(user, 'category', to_edit, category.id)
def toggle_value(bot, update, property_name, to_edit, value):
    user = User.from_update(update)

    if check_suggestion_limit(bot, update, user):
        return
    Suggestion.add_or_update(user, property_name, to_edit, bool(value))