Exemple #1
0
def answer_callback(client: Client,
                    callback_query_id: str,
                    text: str,
                    show_alert: bool = False) -> Optional[bool]:
    # Answer the callback
    result = None
    try:
        flood_wait = True
        while flood_wait:
            flood_wait = False
            try:
                result = client.answer_callback_query(
                    callback_query_id=callback_query_id,
                    text=text,
                    show_alert=show_alert)
            except FloodWait as e:
                flood_wait = True
                wait_flood(e)
            except QueryIdInvalid:
                return False
    except Exception as e:
        logger.warning(f"Answer query to {callback_query_id} error: {e}",
                       exc_info=True)

    return result
Exemple #2
0
def timeloop(client: Client, call: CallbackQuery):
    user, _ = get_user_model(call.from_user)
    coin = 'TIME'
    wallet = MinterWallets.objects.get(user=user)
    wallet_obj = MinterWallet.create(mnemonic=wallet.mnemonic)
    amount = wallet.balance[coin]
    nonce = API.get_nonce(wallet.address)

    send_tx = MinterSendCoinTx(coin,
                               wallet.address,
                               amount,
                               nonce=nonce,
                               gas_coin=coin)
    send_tx.sign(wallet_obj['private_key'])
    tx_fee = API.estimate_tx_commission(send_tx.signed_tx,
                                        pip2bip=True)['result']['commission']
    available_send = amount - tx_fee

    user_timeloop_address = call.data.split('_')[-1]
    if not user_timeloop_address:
        alert_text = user.choice_localized(text_name='alert-tl-no-account')
        client.answer_callback_query(call.id, text=alert_text)
        return

    if available_send <= 0:
        alert_text = user.choice_localized(text_name='alert-tl-no-money')
        client.answer_callback_query(call.id, text=alert_text)
        return

    response = coin_send(wallet_obj['private_key'],
                         wallet_obj['address'],
                         user_timeloop_address,
                         coin,
                         available_send,
                         gas_coin=coin)
    if 'error' in response:
        alert_text = user.choice_localized(text_name='alert-tl-no-money')
        client.answer_callback_query(call.id, text=alert_text)
        return

    alert_text = user.choice_localized(text_name='alert-tl-success')
    client.answer_callback_query(call.id, text=alert_text)
Exemple #3
0
def answer_callback(client: Client, callback_query_id: str, text: str, show_alert: bool = False) -> Optional[bool]:
    # Answer the callback
    result = None

    try:
        result = client.answer_callback_query(
            callback_query_id=callback_query_id,
            text=text,
            show_alert=show_alert
        )
    except FloodWait as e:
        logger.warning(f"Answer callback to {callback_query_id} - Sleep for {e.x} second(s)")
        raise e
    except QueryIdInvalid:
        return False
    except Exception as e:
        logger.warning(f"Answer query to {callback_query_id} error: {e}", exc_info=True)

    return result
Exemple #4
0
def callback_query_handler(bot: Client, query: CallbackQuery):
    data = json.loads(query.data)
    game = get_game(query.inline_message_id, data)
    if data["type"] == "P":  # Player
        if game.player1["id"] == query.from_user.id:
            bot.answer_callback_query(query.id,
                                      "Wait for opponent!",
                                      show_alert=True)
        elif game.player1["id"] != query.from_user.id:
            game.player2 = {
                "type": "P",
                "id": query.from_user.id,
                "name": query.from_user.first_name
            }

            message_text = "{}({})  {}  {}({})\n\n{} **{} ({})**".format(
                mention(game.player1["name"],
                        game.player1["id"]), emojis.X, emojis.vs,
                mention(game.player2["name"], game.player2["id"]),
                emojis.O, emojis.game,
                mention(game.player1["name"], game.player1["id"]), emojis.X)

            bot.edit_inline_text(query.inline_message_id,
                                 message_text,
                                 reply_markup=InlineKeyboardMarkup(
                                     game.board_keys))
    elif data["type"] == "K":  # Keyboard
        if data["end"]:
            bot.answer_callback_query(query.id,
                                      "Match has ended!",
                                      show_alert=True)

            return

        if (game.whose_turn and query.from_user.id != game.player1["id"]) \
                or (not game.whose_turn and query.from_user.id != game.player2["id"]):
            bot.answer_callback_query(query.id, "Not your turn!")

            return

        if game.fill_board(query.from_user.id, data["coord"]):
            game.whose_turn = not game.whose_turn

            if game.check_winner():
                message_text = "{}({})  {}  {}({})\n\n{} **{} won!**".format(
                    mention(game.player1["name"],
                            game.player1["id"]), emojis.X, emojis.vs,
                    mention(game.player2["name"], game.player2["id"]),
                    emojis.O, emojis.trophy,
                    mention(game.winner["name"], game.winner["id"]))
            elif game.is_draw():
                message_text = "{}({})  {}  {}({})\n\n{} **Draw!**".format(
                    mention(game.player1["name"],
                            game.player1["id"]), emojis.X, emojis.vs,
                    mention(game.player2["name"], game.player2["id"]),
                    emojis.O, emojis.draw)
            else:
                message_text = "{}({})  {}  {}({})\n\n{} **{} ({})**".format(
                    mention(game.player1["name"],
                            game.player1["id"]), emojis.X, emojis.vs,
                    mention(game.player2["name"],
                            game.player2["id"]), emojis.O, emojis.game,
                    mention(game.player1["name"], game.player1["id"])
                    if game.whose_turn else mention(game.player2["name"],
                                                    game.player2["id"]),
                    emojis.X if game.whose_turn else emojis.O)

            bot.edit_inline_text(query.inline_message_id,
                                 message_text,
                                 reply_markup=InlineKeyboardMarkup(
                                     game.board_keys))
        else:
            bot.answer_callback_query(query.id, "This one is already taken!")
    elif data["type"] == "R":  # Reset
        game = reset_game(game)

        message_text = "{}({})  {}  {}({})\n\n{} **{} ({})**".format(
            mention(game.player1["name"],
                    game.player1["id"]), emojis.X, emojis.vs,
            mention(game.player2["name"], game.player2["id"]),
            emojis.O, emojis.game,
            mention(game.player1["name"], game.player1["id"]), emojis.X)

        bot.edit_inline_text(query.inline_message_id,
                             message_text,
                             reply_markup=InlineKeyboardMarkup(
                                 game.board_keys))
    elif data["type"] == "C":  # Contact
        if data["action"] == "email":
            bot.edit_message_text(query.from_user.id,
                                  query.message.message_id,
                                  "*****@*****.**",
                                  reply_markup=InlineKeyboardMarkup([[
                                      InlineKeyboardButton(
                                          emojis.back + " Back",
                                          json.dumps({
                                              "type": "C",
                                              "action": "email-back"
                                          }))
                                  ]]))
        elif data["action"] == "email-back":
            bot.edit_message_text(
                query.from_user.id,
                query.message.message_id,
                "Feel free to share your thoughts on XO bot with me.",
                reply_markup=CONTACT_KEYS)