Example #1
0
def tags(update, context):
    db = AnkiGenDB()
    state = State(db.get_state(update.message.chat_id))
    if state in dict_state_to_lang_tags:
        db.update_tags(update.message.chat_id,
                       tags="",
                       lang=dict_state_to_lang_tags[state])
        update.message.reply_text("Ok! I deleted all the tags for {}.".format(
            dict_state_to_lang_tags[state].name),
                                  parse_mode='Markdown')
    else:
        langs = sorted(list(dict_state_to_lang.values()),
                       key=lambda x: x.value)
        keyboard = [[
            InlineKeyboardButton(lang.name,
                                 callback_data="tags{}".format(lang.value))
        ] for lang in langs]
        keyboard.append([
            InlineKeyboardButton('Cancel', callback_data="tags{}".format(-1))
        ])
        reply_markup = InlineKeyboardMarkup(keyboard)

        tags = db.get_all_tags(update.message.chat_id)
        if tags is None:
            tags = ''
        else:
            tags = '\nCurrent tags are:\n' + \
                         ''.join(['\n- *{}*: {}'.format(Languages(language).name, escape_markdown(lang_tags) if tags else "") for lang_tags, language in tags])
        text = 'Select a language to set tags for that language.{}'.format(
            tags)
        update.message.reply_text(text,
                                  reply_markup=reply_markup,
                                  parse_mode='Markdown')
Example #2
0
def deck(update, context):
    langs = sorted(list(dict_state_to_lang.values()), key=lambda x: x.value)
    keyboard = [[
        InlineKeyboardButton(lang.name,
                             callback_data="deck{}".format(lang.value))
    ] for lang in langs]
    keyboard.append(
        [InlineKeyboardButton('Cancel', callback_data="deck{}".format(-1))])
    reply_markup = InlineKeyboardMarkup(keyboard)

    deck_names = AnkiGenDB().get_all_deck_names(update.message.chat_id)
    if deck_names is None:
        deck_names = ''
    else:
        deck_names = '\nCurrent deck names are:\n' + ''.join([
            '\n- *{}*: {}'.format(
                Languages(language).name,
                escape_markdown(deck_name) if deck_name else "")
            for deck_name, language in deck_names
        ])
    text = 'Select a language to set a deck name for that language.{}'.format(
        deck_names)
    update.message.reply_text(text,
                              reply_markup=reply_markup,
                              parse_mode='Markdown')
Example #3
0
def set_welc(bot, update, uid, message):
    user = update.message.from_user
    welc_msg = ' '.join(message)
    chatid = update.message.chat.id
    bredis.welcome.set(welc_msg, uid)
    if update.message.reply_to_message:
        if update.message.reply_to_message.document:
            file_id = update.message.reply_to_message.document.file_id
            bredis.welcome.file_id.set(file_id, uid)
            bredis.welcome.type.set('gif', uid)
            if user.id == uid:
                log_msg = "{fname} {lname} ({uid}) (@{username}) has set their welcome message to:\n {welc} \nIn {chatid}"
            else:
                log_msg = "{fname} {lname} ({setter_id}) (@{username}) has set {uid}'s welcome message to:\n {welc} \nIn {chatid}"
            bot.sendDocument(log_channel,
                             file_id,
                             caption=log_msg.format(fname=user.first_name,
                                                    lname=user.last_name,
                                                    setter_id=user.id,
                                                    uid=uid,
                                                    username=user.username,
                                                    welc=welc_msg,
                                                    chatid=chatid))
    else:
        bredis.welcome.type.set('text', uid)
        if user.id == uid:
            log_msg = "{fname} {lname} (`{uid}`) (@{username}) has set their welcome message to:\n {welc} \nIn {chatid}"
        else:
            log_msg = "{fname} {lname} (`{setter_id}`) (@{username}) has set `{uid}`'s welcome message to:\n {welc} \nIn {chatid}"
        bot.sendMessage(log_channel,
                        log_msg.format(fname=escape_markdown(user.first_name),
                                       lname=escape_markdown(user.last_name),
                                       setter_id=user.id,
                                       uid=uid,
                                       username=escape_markdown(user.username),
                                       welc=welc_msg,
                                       chatid=chatid),
                        parse_mode='Markdown')
Example #4
0
async def welcome(msg):
    if msg.get('text'):
        if msg['text'].split()[0] == '/welcome' or msg['text'].split()[0] == '/welcome@' + bot_username or \
                msg['text'].split()[0] == '!welcome':
            if msg['chat']['type'] == 'private':
                await bot.sendMessage(
                    msg['chat']['id'],
                    'Este comando só funciona em grupos ¯\\_(ツ)_/¯')

            elif (await is_admin(msg['chat']['id'],
                                 msg['from']['id']))['user']:
                text = msg['text'].split(' ', 1)
                if len(text) == 1:
                    await bot.sendMessage(
                        msg['chat']['id'],
                        'Uso: /welcome on/off/reset/mensagem de boas-vindas do grupo (suporta Markdown e as tags $name, $title, $id e $rules)',
                        reply_to_message_id=msg['message_id'])
                elif text[1] == 'on':
                    enable_welcome(msg['chat']['id'])
                    await bot.sendMessage(
                        msg['chat']['id'],
                        'A mensagem de boas-vindas foi ativada.',
                        reply_to_message_id=msg['message_id'])
                elif text[1] == 'off':
                    disable_welcome(msg['chat']['id'])
                    await bot.sendMessage(
                        msg['chat']['id'],
                        'A mensagem de boas-vindas foi desativada.',
                        reply_to_message_id=msg['message_id'])
                elif text[1] == 'reset':
                    set_welcome(msg['chat']['id'], None)
                    await bot.sendMessage(
                        msg['chat']['id'],
                        'A mensagem de boas-vindas foi redefinida.',
                        reply_to_message_id=msg['message_id'])
                else:
                    try:
                        sent = await bot.sendMessage(
                            msg['chat']['id'],
                            text[1],
                            parse_mode='Markdown',
                            reply_to_message_id=msg['message_id'])
                        set_welcome(msg['chat']['id'], text[1])
                        await bot.editMessageText(
                            (msg['chat']['id'], sent['message_id']),
                            'A mensagem de boas-vindas foi definida.')
                    except TelegramError as e:
                        await bot.sendMessage(
                            msg['chat']['id'],
                            '''Ocorreu um erro ao definir a mensagem de boas-vindas:
{}

Se esse erro persistir entre em contato com @AmanoSupport.'''.format(
                                e.description),
                            reply_to_message_id=msg['message_id'])

            return True

    elif msg.get('new_chat_member'):
        chat_title = msg['chat']['title']
        chat_id = msg['chat']['id']
        first_name = msg['new_chat_member']['first_name']
        user_id = msg['new_chat_member']['id']
        if msg['new_chat_member']['id'] == bot_id:
            pass
        else:
            welcome = get_welcome(chat_id)
            if welcome[1]:
                if welcome[0] is not None:
                    welcome = welcome[0].replace('$id', str(user_id))
                    welcome = welcome.replace('$title',
                                              escape_markdown(chat_title))
                    welcome = welcome.replace('$name',
                                              escape_markdown(first_name))
                else:
                    welcome = 'Olá {}, seja bem-vindo(a) ao {}!'.format(
                        escape_markdown(first_name),
                        escape_markdown(chat_title))
                if '$rules' in welcome:
                    welcome = welcome.replace('$rules', '')
                    rules_markup = InlineKeyboardMarkup(inline_keyboard=[[
                        dict(text='Leia as regras',
                             url='https://t.me/{}?start=rules_{}'.format(
                                 bot_username, chat_id))
                    ]])
                else:
                    rules_markup = None
                await bot.sendMessage(chat_id,
                                      welcome,
                                      'markdown',
                                      reply_to_message_id=msg['message_id'],
                                      reply_markup=rules_markup,
                                      disable_web_page_preview=True)
        return True
Example #5
0
def button_th(update, context):
    query = update.callback_query
    language_codes = [str(lang.value) for lang in dict_state_to_lang.values()]
    if query.data in language_codes:
        AnkiGenDB().update_language(query.message.chat_id, int(query.data))
        context.bot.editMessageText(text="Success! Language updated.",
                                    chat_id=query.message.chat_id,
                                    message_id=query.message.message_id)
        return
    if query.data[:4] == 'deck' and (query.data[4:] == '-1'
                                     or query.data[4:] in language_codes):
        if query.data[4:] == '-1':
            context.bot.editMessageText(text="No deck name was changed.",
                                        chat_id=query.message.chat_id,
                                        message_id=query.message.message_id)
            return
        state = None
        for st, lang in dict_state_to_lang.items():
            if str(lang.value) == query.data[4:]:
                state = st
                break
        AnkiGenDB().update_state(query.message.chat_id, state)
        context.bot.editMessageText(
            text="Send me the deck name for {}.".format(
                Languages(int(query.data[4:])).name),
            chat_id=query.message.chat_id,
            message_id=query.message.message_id)
        return
    if query.data[:5] == 'fromd' and (query.data[5:] == '-1'
                                      or query.data[5:] in language_codes):
        if query.data[5:] == '-1':
            context.bot.editMessageText(text="No changes were made.",
                                        chat_id=query.message.chat_id,
                                        message_id=query.message.message_id)
            return

        for st, lang in dict_state_to_lang_defi.items():
            if str(lang.value) == query.data[5:]:
                state = st
                break
        db = AnkiGenDB()
        db.update_state(query.message.chat_id, state)
        langs = sorted(list(dict_state_to_lang.values()),
                       key=lambda x: x.value)

        keyboard = [[
            InlineKeyboardButton("{}".format(lang.name),
                                 callback_data="tod{}".format(lang.value))
        ] for lang in langs if lang.value != int(query.data[5:])]
        if db.get_def_lang(query.message.chat_id, int(query.data[5:])):
            keyboard.append([
                InlineKeyboardButton('Disable {} translation'.format(
                    Languages(int(query.data[5:])).name),
                                     callback_data="tod{}".format(-2))
            ])
        keyboard.append(
            [InlineKeyboardButton('Cancel', callback_data="tod{}".format(-1))])

        context.bot.editMessageText(text='\nMake the definition for cards in {} be in another language B. Note the translation is automatic and can be innacurate sometimes\n*Now select language B*\nYou can press a button or write a valid language code from [this list](https://telegra.ph/Language-codes-07-26)'\
                                        .format(Languages(int(query.data[5:])).name),
                                    chat_id=query.message.chat_id,
                                    reply_markup=InlineKeyboardMarkup(keyboard),
                                    parse_mode='Markdown',
                                    message_id=query.message.message_id)
        return
    if query.data[:3] == 'tod' and (query.data[3:]
                                    in language_codes + ['-1', '-2']):
        db = AnkiGenDB()
        if query.data[3:] == '-1':
            context.bot.editMessageText(text="No changes were made.",
                                        chat_id=query.message.chat_id,
                                        message_id=query.message.message_id)
            AnkiGenDB().update_state(query.message.chat_id, State.normal)
            return

        state = State(db.get_state(query.message.chat_id))
        if state not in dict_state_to_lang_defi:
            return
        from_lang = dict_state_to_lang_defi[state]
        db.update_state(query.message.chat_id, State.normal)
        if query.data[3:] == '-2':
            AnkiGenDB().remove_def_lang(query.message.chat_id, from_lang)
            context.bot.editMessageText(
                text='Ok! I will not translate the definition of the {} cards.'
                .format(from_lang.name),
                chat_id=query.message.chat_id,
                message_id=query.message.message_id)
            return
        to_lang = int(query.data[3:])
        db.update_def_lang(
            query.message.chat_id, from_lang,
            language_translate_shell_codes[Languages(to_lang).name])
        context.bot.editMessageText(
            text='Ok! I will translate the definitions of {} cards into {}'.
            format(from_lang.name,
                   Languages(to_lang).name),
            chat_id=query.message.chat_id,
            message_id=query.message.message_id)
        return
    if query.data[:5] == 'fromw' and (query.data[5:] == '-1'
                                      or query.data[5:] in language_codes):
        if query.data[5:] == '-1':
            context.bot.editMessageText(text="No changes were made.",
                                        chat_id=query.message.chat_id,
                                        message_id=query.message.message_id)
            return

        for st, lang in dict_state_to_lang_word.items():
            if str(lang.value) == query.data[5:]:
                state = st
                break
        db = AnkiGenDB()
        db.update_state(query.message.chat_id, state)
        langs = sorted(list(dict_state_to_lang_word.values()),
                       key=lambda x: x.value)

        keyboard = [[
            InlineKeyboardButton("{}".format(lang.name),
                                 callback_data="tow{}".format(lang.value))
        ] for lang in langs if lang.value != int(query.data[5:])]

        if db.get_def_lang(query.message.chat_id, int(query.data[5:])):
            keyboard.append([
                InlineKeyboardButton('Disable {} translation'.format(
                    Languages(int(query.data[5:])).name),
                                     callback_data="tow{}".format(-2))
            ])
        keyboard.append(
            [InlineKeyboardButton('Cancel', callback_data="tow{}".format(-1))])
        context.bot.editMessageText(text='\nFor cards in {}, add a translation of the concept to the language you will now select. Note the translations are automatic and can be innacurate sometimes\n**Now select language B**' \
                                    .format(Languages(int(query.data[5:])).name),
                                    chat_id=query.message.chat_id,
                                    reply_markup=InlineKeyboardMarkup(keyboard),
                                    parse_mode='Markdown',
                                    message_id=query.message.message_id)
        return
    if query.data[:3] == 'tow' and (query.data[3:]
                                    in language_codes + ['-1', '-2']):
        db = AnkiGenDB()
        if query.data[3:] == '-1':
            context.bot.editMessageText(text="No changes were made.",
                                        chat_id=query.message.chat_id,
                                        message_id=query.message.message_id)
            AnkiGenDB().update_state(query.message.chat_id, State.normal)
            return

        state = State(db.get_state(query.message.chat_id))
        if state not in dict_state_to_lang_word:
            return
        from_lang = dict_state_to_lang_word[state]
        if query.data[3:] == '-2':
            AnkiGenDB().remove_word_lang(query.message.chat_id, from_lang)
            context.bot.editMessageText(
                text="Word translation has been disabled for {}".format(
                    from_lang.name),
                chat_id=query.message.chat_id,
                message_id=query.message.message_id)
            return
        to_lang = int(query.data[3:])
        db.update_word_lang(
            query.message.chat_id, from_lang,
            language_translate_shell_codes[Languages(to_lang).name])
        context.bot.editMessageText(text='Ok! Cards for {} words will be translated into {} and you will be asked whether you want to add a translation into the card.' \
                                    .format(from_lang.name, Languages(to_lang).name),
                                    chat_id=query.message.chat_id,
                                    message_id=query.message.message_id)
        return
    if query.data[:4] == 'tags' and (query.data[4:] == '-1'
                                     or query.data[4:] in language_codes):
        if query.data[4:] == '-1':
            context.bot.editMessageText(text="No tags were changed.",
                                        chat_id=query.message.chat_id,
                                        message_id=query.message.message_id)
            return
        state = None
        for st, lang in dict_state_to_lang_tags.items():
            if str(lang.value) == query.data[4:]:
                state = st
                break
        AnkiGenDB().update_state(query.message.chat_id, state)
        context.bot.editMessageText(
            text=
            "Send me the tags for {} (words separated by spaces). Or send /tags again to delete all tags for this language."
            .format(Languages(int(query.data[4:])).name),
            chat_id=query.message.chat_id,
            message_id=query.message.message_id)
        return
    try:
        if query.data != '-1':
            db = AnkiGenDB()
            spl = query.data.split('|', 1)[0]
            deck = None
            if spl in language_codes:
                deck = db.get_deck_name(query.message.chat_id, spl)
                tags = db.get_tags(query.message.chat_id, spl)
            if deck is None:
                context.bot.editMessageText(
                    text=
                    "You need to specify the name of an existing deck with /deck"
                    .format(query.message.text),
                    parse_mode='Markdown',
                    chat_id=query.message.chat_id,
                    message_id=query.message.message_id)
                return
            try:
                username, password, card_type = db.get_data(
                    query.message.chat_id)
                if username is None or password is None or deck is None:
                    context.bot.editMessageText(
                        text=
                        "I can't send your data because I don't have your credentials",
                        chat_id=query.message.chat_id,
                        message_id=query.message.message_id)
                    return
                front = query.message.text
                display_front = front
                if '|' in query.data:
                    data = query.data.split('|', 2)
                    back = data[1]
                    if len(data) > 2:
                        display_front = "{}\n{}".format(
                            query.message.reply_markup.inline_keyboard[int(
                                data[2])][0].text, front)
                        front = "{}\n\n{}".format(
                            query.message.reply_markup.inline_keyboard[int(
                                data[2])][0].text, front)

                        #if front[0] == '(':
                        #    idx = front.find(')')
                        #    front = '{} ({}){}'.format(front[: idx+ 1 ], query.message.reply_markup.inline_keyboard[int(data[2])][0].text, front[idx + 1: ] )
                        #else:
                        #    front = "({}) {}".format(query.message.reply_markup.inline_keyboard[int(data[2])][0].text, front)
                else:
                    back = query.data.lower()
                if db.get_if_add_phonetics(
                        query.message.chat_id) != 0 and db.get_language(
                            query.message.chat_id) == Languages.English.value:
                    ipa = to_ipa(back)
                    if ipa != back:  # ipa translation found
                        back = "{} /{}/".format(back, ipa)

                if db.is_order_reversed(
                        query.message.chat_id) == 1:  # Reverse if we have to
                    front, back = back, front
                    display_front, back = back, display_front
                context.bot.editMessageText(
                    text="{}\n---\n{}\n*Uploading card to your anki deck*".
                    format(display_front, back),
                    parse_mode='Markdown',
                    chat_id=query.message.chat_id,
                    message_id=query.message.message_id)
                with lock_card_senders:
                    try:
                        card_sender = card_senders[query.message.chat_id]
                        card_sender.last_access = time.time()
                    except KeyError:
                        card_sender = CardSender(username, password, card_type)
                        card_senders[query.message.chat_id] = card_sender

                    Timer(delay, delete_card_sender,
                          [query.message.chat_id]).start()

                    ret = card_sender.send_card(front, back, deck, tags)
                    if ret:
                        context.bot.sendMessage(query.message.chat_id,
                                                text=escape_markdown(ret),
                                                parse_mode='Markdown')
            except NoDeckFoundError as e:
                print(traceback.format_exc())
                context.bot.editMessageText(
                    text=
                    "Could not find the deck \"{}\". Check it exists or use /deck to change the name of the deck I should use for this language"
                    .format(e.deck),
                    chat_id=query.message.chat_id,
                    message_id=query.message.message_id)
                return
            except Exception:
                print(traceback.format_exc())
                context.bot.editMessageText(
                    text=
                    "Could not connect to ankiweb. Is your username and password correct? Check if you can access https://ankiweb.net/ with your credentials",
                    chat_id=query.message.chat_id,
                    message_id=query.message.message_id)
                return
            context.bot.editMessageText(text="{}\n---\n{}\n{}".format(
                display_front, back, u"\u2705"),
                                        chat_id=query.message.chat_id,
                                        message_id=query.message.message_id)
        else:
            context.bot.editMessageText(text="{}\n{}".format(
                query.message.text, u"\u274C"),
                                        chat_id=query.message.chat_id,
                                        message_id=query.message.message_id)
    except TimedOut:
        context.bot.editMessageText(
            text="Telegram timed out, try again later.",
            chat_id=query.message.chat_id,
            message_id=query.message.message_id)
        print("Telegram timed out")
        print(traceback.format_exc())
    except:
        context.bot.editMessageText(text="Sorry, the message was too old",
                                    chat_id=query.message.chat_id,
                                    message_id=query.message.message_id)
        print("Sorry, the message was too old")
        print(traceback.format_exc())
        raise