Exemplo n.º 1
0
def taco_mention_callback(bot, message):
    """ callback for taco-transfer by mention """

    cid = get_cid(message)
    store_name(message)

    chat = Chats.get(Chats.cid == message.chat.id)
    clean_chat(chat.mids, chat.cid, message, bot)

    ok_button = InlineKeyboardButton('OK', callback_data='delete:{}'.format(message.from_user.id))
    ok_keyboard = InlineKeyboardMarkup([[ok_button]])

    mentioned_users = list()
    for entity in message.entities:
        if entity.type == 'mention':
            user = message.text[entity.offset: entity.offset + entity.length].lower()
            mentioned_users.append(user)
    mentioned_users = list(set(mentioned_users))   # removing duplicates

    if len(mentioned_users) > 1:
        if chat.less is True:
            text = only_one_receiver_phrase.split('\n')[0]
        else:
            text = only_one_receiver_phrase
        mid = bot.send_message(chat_id=cid,
                         text=text,
                         reply_to_message_id=get_mid(message),
                               reply_markup=ok_keyboard,
                         parse_mode='html').message_id

        chat.mids = json.dumps([mid])
        chat.save()
        return

    sender = message.from_user
    receiver_username: str = ensure_no_at_sign(mentioned_users[0])

    try:
        receiver = bot.get_chat_member(chat_id=cid,
                                       user_id=receiver_username).user

    except Exception:
        """ here should be except UserNotParticipant, but it still raises this exception """
        if chat.less is True:
            text = user_not_present_phrase.split('\n')[0]
        else:
            text = user_not_present_phrase
        mid = bot.send_message(chat_id=cid,
                         text=text.format(ensure_username(receiver_username)),
                         reply_to_message_id=get_mid(message),
                               reply_markup=ok_keyboard,
                         parse_mode='html').message_id

        chat.mids = json.dumps([mid])
        chat.save()

        return

    give_tacos(bot, message, sender, receiver)
Exemplo n.º 2
0
def taco_top_callback(bot, message):
    """ shows top-5(or less) taco-users in chat """

    cid = get_cid(message)
    mid = get_mid(message)
    store_name(message)

    chat = Chats.get(Chats.cid == message.chat.id)
    clean_chat(chat.mids, chat.cid, message, bot)

    ok_button = InlineKeyboardButton('OK',
                                     callback_data='delete:{}'.format(
                                         message.from_user.id))
    ok_keyboard = InlineKeyboardMarkup([[ok_button]])

    tacos = Tacos.get(Tacos.chat == cid)

    balances = json.loads(tacos.taco_balance)

    if len(balances) == 0:  # in case tacos-table is empty
        bot.send_message(text=empty_top_phrase,
                         chat_id=cid,
                         reply_to_message_id=mid,
                         reply_markup=ok_keyboard,
                         parse_mode='html')
        return

    top = list()

    while len(balances) > 0 and len(top) < 5:
        top_uid = max(balances, key=balances.get)
        username = resolve_name(top_uid)
        top.append([username, balances.get(top_uid)])
        del balances[top_uid]

    formatted_top = ''
    for user in top:
        if "@" in user[0]:
            user_link = "https://t.me/{}".format(user[0][1:])
        else:
            user_link = "tg://user?id={}".format(user[0])

        formatted_top += '{}. <a href="{}">{}</a> - <code>{}</code> tacos!\n'.format(
            top.index(user) + 1, user_link, user[0][1:], user[1])

    mid = bot.send_message(text=taco_top_phrase.format(len(top),
                                                       formatted_top),
                           chat_id=cid,
                           reply_to_message_id=mid,
                           reply_markup=ok_keyboard,
                           parse_mode='html',
                           disable_web_page_preview=True).message_id

    chat.mids = json.dumps([mid])
    chat.save()
Exemplo n.º 3
0
def chat_reply_callback(bot, message):
    """ callback for taco-transfer """

    store_name(message)

    chat = Chats.get(Chats.cid == message.chat.id)
    clean_chat(chat.mids, chat.cid, message, bot)

    sender = message.from_user
    receiver = message.reply_to_message.from_user

    give_tacos(bot, message, sender, receiver)
Exemplo n.º 4
0
def new_chat_callback(bot, message):
    """ triggers when bot gets added to new chat """

    cid = get_cid(message)
    store_name(message)

    invited_by = message.from_user

    Chats.create(cid=cid, invited_by=invited_by.id)

    Tacos.create(chat=cid)

    bot.send_message(cid, chat_enabled_phrase, parse_mode='html')
Exemplo n.º 5
0
def my_tacos_callback(bot, message):
    """ shows users taco-balance """

    cid = get_cid(message)
    uid = str(get_uid(message))

    with db:
        chat = Chats.get(Chats.cid == message.chat.id)
        tacos = Tacos.get(Tacos.chat == cid)
        balances = tacos.taco_balance

    delete_message(bot, message)

    user_name = store_name(message.from_user)

    if uid in balances.keys():
        balance = balances.get(uid)
    else:
        balances.update({uid: default_taco_amount})
        tacos.taco_balance = balances
        tacos.save()
        balance = default_taco_amount

    if chat.less is True:
        comment = ''
    else:
        if balance < 25:
            comment = balance_comment_low
        elif balance > 60:
            comment = balance_comment_high
        else:
            comment = balance_comment_medium

    if chat.autohide:
        msg = bot.send_message(chat_id=cid,
                               text=balance_phrase.format(user_name,
                                                          balance,
                                                          comment),
                               reply_to_message_id=get_mid(message),
                               parse_mode='html')

        time = datetime.datetime.now() + datetime.timedelta(minutes=chat.autohide_delay)

        sched.add_job(delete_message, 'date', run_date=time, args=[bot, msg])

    else:
        ok_button = InlineKeyboardButton('OK', callback_data='delete:{}'.format(message.from_user.id))
        ok_keyboard = InlineKeyboardMarkup([[ok_button]])

        msg = bot.send_message(chat_id=cid,
                               text=balance_phrase.format(user_name,
                                                          balance,
                                                          comment),
                               reply_to_message_id=get_mid(message),
                               reply_markup=ok_keyboard,
                               parse_mode='html')

    chat.mids = [msg.message_id]
    chat.save()
Exemplo n.º 6
0
def my_tacos_callback(bot, message):
    """ shows users taco-balance """

    cid = get_cid(message)
    chat = Chats.get(Chats.cid == message.chat.id)

    clean_chat(chat.mids, chat.cid, message, bot)

    store_name(message)

    uid = str(get_uid(message))
    tacos = Tacos.get(Tacos.chat == cid)

    ok_button = InlineKeyboardButton('OK',
                                     callback_data='delete:{}'.format(
                                         message.from_user.id))
    ok_keyboard = InlineKeyboardMarkup([[ok_button]])

    balances = json.loads(tacos.taco_balance)

    if uid in balances.keys():
        balance = balances.get(uid)
    else:
        balances.update({uid: default_taco_amount})
        tacos.taco_balance = json.dumps(balances)
        tacos.save()
        balance = default_taco_amount

    if chat.less is True:
        comment = ''
    else:
        if balance < 25:
            comment = balance_comment_low
        elif balance > 60:
            comment = balance_comment_high
        else:
            comment = balance_comment_medium

    mid = bot.send_message(chat_id=cid,
                           text=balance_phrase.format(balance, comment),
                           reply_to_message_id=get_mid(message),
                           reply_markup=ok_keyboard,
                           parse_mode='html').message_id

    chat.mids = json.dumps([mid])
    chat.save()
Exemplo n.º 7
0
def new_chat_callback(bot, message):
    """ triggers when bot gets added to new chat """

    cid = get_cid(message)
    if message.from_user is not None:
        store_name(message.from_user)

    invited_by = message.from_user
    if invited_by is None:
        invited_by = -1
    else:
        invited_by = invited_by.id

    with db:
        Chats.create(cid=cid, invited_by=invited_by)

        Tacos.create(chat=cid)

    bot.send_message(cid, chat_enabled_phrase, parse_mode='html')
Exemplo n.º 8
0
def store_names_callback(bot, message):
    """ stores names for each user, if not already present in DB"""
    if message.from_user is not None:
        store_name(message.from_user)
Exemplo n.º 9
0
def give_tacos(bot, message, sender, receiver):
    cid = get_cid(message)
    tacos = Tacos.get(Tacos.chat == cid)

    chat = Chats.get(Chats.cid == message.chat.id)

    ok_button = InlineKeyboardButton('OK',
                                     callback_data='delete:{}'.format(
                                         message.from_user.id))
    ok_keyboard = InlineKeyboardMarkup([[ok_button]])

    sender_name = store_name(sender)
    receiver_name = store_name(receiver)

    if receiver.is_bot:
        if chat.less is True:
            text = no_bots_allowed_phrase.split('\n')[0]
        else:
            text = no_bots_allowed_phrase
        mid = bot.send_message(chat_id=cid,
                               text=text,
                               reply_to_message_id=get_mid(message),
                               reply_markup=ok_keyboard,
                               parse_mode='html').message_id

        chat.mids = [mid]
        chat.save()
        return

    sender_id = str(sender.id)
    receiver_id = str(receiver.id)

    if sender_id == receiver_id:
        if chat.less is True:
            text = self_tacoing_phrase.split('\n')[0]
        else:
            text = self_tacoing_phrase
        mid = bot.send_message(chat_id=cid,
                               text=text,
                               reply_to_message_id=get_mid(message),
                               parse_mode='html').message_id

        chat.mids = [mid]
        chat.save()
        return

    tacos_sent = len(re.findall(taco_emoji, message.text))

    txt = message.text
    if message.entities is not None:
        for entity in message.entities:
            txt = txt[:entity.offset] + txt[entity.offset + entity.length:]
    txt = txt.replace(taco_emoji, '')
    user_comment = txt.lstrip(' ')

    if tacos.taco_balance is None:
        amounts = dict()
        amounts.update({sender_id: default_taco_amount})
        amounts.update({receiver_id: default_taco_amount})
    else:
        amounts = tacos.taco_balance
        if sender_id not in amounts.keys():
            amounts.update({sender_id: default_taco_amount})
        if receiver_id not in amounts.keys():
            amounts.update({receiver_id: default_taco_amount})

    if tacos_sent > amounts.get(sender_id):
        if chat.less is True:
            text = balance_low_phrase.split('\n')[0]
        else:
            text = balance_low_phrase
        if chat.autohide:
            msg = bot.send_message(chat_id=cid,
                                   text=text,
                                   reply_to_message_id=get_mid(message),
                                   parse_mode='html')

            time = datetime.datetime.now() + datetime.timedelta(
                minutes=chat.autohide_delay)

            sched.add_job(delete_message,
                          'date',
                          run_date=time,
                          args=[bot, msg])

        else:
            msg = bot.send_message(chat_id=cid,
                                   text=text,
                                   reply_to_message_id=get_mid(message),
                                   reply_markup=ok_keyboard,
                                   parse_mode='html')

        chat.mids = [msg.message_id]
        chat.save()
        return

    amounts.update({sender_id: amounts.get(sender_id) - tacos_sent})
    amounts.update({receiver_id: amounts.get(receiver_id) + tacos_sent})

    if chat.less is True:
        comment = ''
    else:
        if tacos_sent < 3:
            comment = taco_transfer_comment_low
        elif tacos_sent > 9:
            comment = taco_transfer_comment_high
        else:
            comment = taco_transfer_comment_medium.format(receiver_name)

    if "@" in sender_name:
        sender_link = "https://t.me/{}".format(sender_name[1:])
    else:
        sender_link = "tg://user?id={}".format(sender_id)

    if "@" in receiver_name:
        receiver_link = "https://t.me/{}".format(receiver_name[1:])
    else:
        receiver_link = "tg://user?id={}".format(receiver_id)

    if tacos_sent == 1:
        phrase = taco_transfer_phrase.replace('tacos', 'taco')
    else:
        phrase = taco_transfer_phrase

    if len(user_comment) > 0:
        phrase += '<b>And said:</b>\n>>><code>{}</code>'.format(user_comment)

    if chat.autohide:
        msg = bot.send_message(chat_id=cid,
                               text=phrase.format(sender_link, sender_name,
                                                  tacos_sent, receiver_link,
                                                  receiver_name, comment),
                               parse_mode='html',
                               disable_web_page_preview=True)

        time = datetime.datetime.now() + datetime.timedelta(
            minutes=chat.autohide_delay)

        sched.add_job(delete_message, 'date', run_date=time, args=[bot, msg])

    else:

        msg = bot.send_message(chat_id=cid,
                               text=phrase.format(sender_link, sender_name,
                                                  tacos_sent, receiver_link,
                                                  receiver_name, comment),
                               reply_markup=ok_keyboard,
                               parse_mode='html',
                               disable_web_page_preview=True)

    chat.mids = [msg.message_id]
    chat.save()

    tacos.taco_balance = amounts
    tacos.save()
Exemplo n.º 10
0
def taco_top_callback(bot, message):
    """ shows top-5(or less) taco-users in chat """

    cid = get_cid(message)
    mid = get_mid(message)

    store_name(message.from_user)

    chat = Chats.get(Chats.cid == message.chat.id)
    clean_chat(chat.mids, chat.cid, bot, message)

    ok_button = InlineKeyboardButton('OK', callback_data='delete:{}'.format(message.from_user.id))
    ok_keyboard = InlineKeyboardMarkup([[ok_button]])

    tacos = Tacos.get(Tacos.chat == cid)

    balances = tacos.taco_balance

    if len(balances) == 0:

        if chat.autohide:
            msg = bot.send_message(text=empty_top_phrase,
                                   chat_id=cid,
                                   parse_mode='html')

            time = datetime.datetime.now() + datetime.timedelta(minutes=chat.autohide_delay)

            sched.add_job(delete_message, 'date', run_date=time, args=[bot, msg])

        else:
            bot.send_message(text=empty_top_phrase,
                             chat_id=cid,
                             reply_markup=ok_keyboard,
                             parse_mode='html')
        return

    top = list()

    while len(balances) > 0 and len(top) < 5:
        top_uid = max(balances, key=balances.get)
        username = resolve_name(top_uid)
        top.append([username, balances.get(top_uid)])
        del balances[top_uid]

    formatted_top = ''
    for user in top:
        if "@" in user[0]:
            user_link = "https://t.me/{}".format(user[0][1:])
        else:
            user_link = "tg://user?id={}".format(user[0])

        formatted_top += '{}. <a href="{}">{}</a> - <code>{}</code> tacos!\n'.format(top.index(user) + 1,
                                                                                     user_link,
                                                                                     user[0][1:],
                                                                                     user[1])

    if chat.autohide:
        msg = bot.send_message(text=taco_top_phrase.format(len(top),
                                                           formatted_top),
                               chat_id=cid,
                               parse_mode='html',
                               disable_web_page_preview=True)

        time = datetime.datetime.now() + datetime.timedelta(minutes=chat.autohide_delay)

        sched.add_job(delete_message, 'date', run_date=time, args=[bot, msg])

    else:
        bot.send_message(text=taco_top_phrase.format(len(top),
                                                     formatted_top),
                         chat_id=cid,
                         reply_markup=ok_keyboard,
                         parse_mode='html',
                         disable_web_page_preview=True)

    chat.mids.append(mid)
    chat.save()
Exemplo n.º 11
0
def store_names_callback(bot, message):
    """ stores names for each user, if not already present in DB"""
    store_name(message)