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
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)
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
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)