forked from test/mau_mau_bot
switch codebase to bot-api-2.0 and minor improvements
This commit is contained in:
parent
b17dcf5cdc
commit
28863876da
1 changed files with 115 additions and 121 deletions
236
bot.py
236
bot.py
|
@ -2,7 +2,10 @@ import logging
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from random import randint
|
from random import randint
|
||||||
|
|
||||||
from telegram import Updater, InlineQueryResultArticle, ParseMode, Message, Chat
|
from telegram import InlineQueryResultArticle, ParseMode, Message, Chat, \
|
||||||
|
Emoji, InputTextMessageContent
|
||||||
|
from telegram.ext import Updater, InlineQueryHandler, \
|
||||||
|
ChosenInlineResultHandler, CommandHandler
|
||||||
from telegram.utils.botan import Botan
|
from telegram.utils.botan import Botan
|
||||||
|
|
||||||
from game_manager import GameManager
|
from game_manager import GameManager
|
||||||
|
@ -67,13 +70,13 @@ def display_name(game):
|
||||||
def display_color(color):
|
def display_color(color):
|
||||||
""" Convert a color code to actual color name """
|
""" Convert a color code to actual color name """
|
||||||
if color == "r":
|
if color == "r":
|
||||||
return "Red"
|
return Emoji.HEAVY_BLACK_HEART + " Red"
|
||||||
if color == "b":
|
if color == "b":
|
||||||
return "Blue"
|
return Emoji.BLUE_HEART + " Blue"
|
||||||
if color == "g":
|
if color == "g":
|
||||||
return "Green"
|
return Emoji.GREEN_HEART + " Green"
|
||||||
if color == "y":
|
if color == "y":
|
||||||
return "Yellow"
|
return Emoji.YELLOW_HEART + " Yellow"
|
||||||
|
|
||||||
|
|
||||||
def error(bot, update, error):
|
def error(bot, update, error):
|
||||||
|
@ -158,14 +161,6 @@ def start_game(bot, update):
|
||||||
help(bot, update)
|
help(bot, update)
|
||||||
|
|
||||||
|
|
||||||
def inline(bot, update):
|
|
||||||
""" Handler for all inline stuff """
|
|
||||||
if update.inline_query:
|
|
||||||
reply_to_query(bot, update)
|
|
||||||
else:
|
|
||||||
process_result(bot, update)
|
|
||||||
|
|
||||||
|
|
||||||
def help(bot, update):
|
def help(bot, update):
|
||||||
""" Handler for the /help command """
|
""" Handler for the /help command """
|
||||||
bot.sendMessage(update.message.chat_id,
|
bot.sendMessage(update.message.chat_id,
|
||||||
|
@ -214,9 +209,7 @@ def reply_to_query(bot, update):
|
||||||
if game.last_card.special == c.DRAW_FOUR and game.draw_counter:
|
if game.last_card.special == c.DRAW_FOUR and game.draw_counter:
|
||||||
add_call_bluff(results)
|
add_call_bluff(results)
|
||||||
|
|
||||||
add_other_cards(playable, player, results)
|
add_other_cards(playable, player, results, game)
|
||||||
|
|
||||||
add_gameinfo(game, results)
|
|
||||||
|
|
||||||
bot.answerInlineQuery(update.inline_query.id, results, cache_time=0)
|
bot.answerInlineQuery(update.inline_query.id, results, cache_time=0)
|
||||||
|
|
||||||
|
@ -227,98 +220,17 @@ def add_choose_color(results):
|
||||||
InlineQueryResultArticle(
|
InlineQueryResultArticle(
|
||||||
id=color,
|
id=color,
|
||||||
title="Choose Color",
|
title="Choose Color",
|
||||||
message_text=display_color(color),
|
description=display_color(color),
|
||||||
description=display_color(color)
|
input_message_content=
|
||||||
|
InputTextMessageContent(display_color(color))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def add_other_cards(playable, player, results):
|
def add_other_cards(playable, player, results, game):
|
||||||
if not playable:
|
if not playable:
|
||||||
playable = list()
|
playable = list()
|
||||||
|
|
||||||
results.append(
|
|
||||||
InlineQueryResultArticle(
|
|
||||||
"hand",
|
|
||||||
title="Other cards:",
|
|
||||||
description=', '.join([repr(card) for card in
|
|
||||||
list_subtract(player.cards, playable)]),
|
|
||||||
message_text='Just checking cards'
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def add_no_game(results):
|
|
||||||
results.append(
|
|
||||||
InlineQueryResultArticle(
|
|
||||||
"nogame",
|
|
||||||
title="You are not playing",
|
|
||||||
message_text='Not playing right now. Use /new to start a game or '
|
|
||||||
'/join to join the current game in this group'
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def add_not_started(results):
|
|
||||||
results.append(
|
|
||||||
InlineQueryResultArticle(
|
|
||||||
"nogame",
|
|
||||||
title="The game wasn't started yet",
|
|
||||||
message_text='Start the game with /start'
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def add_draw(player, results, could_play_card):
|
|
||||||
results.append(
|
|
||||||
InlineQueryResultArticle(
|
|
||||||
"draw",
|
|
||||||
title=("No suitable cards..." if not could_play_card else
|
|
||||||
"I don't want to play a card..."),
|
|
||||||
description="Draw!",
|
|
||||||
message_text='Drawing %d card(s)'
|
|
||||||
% (player.game.draw_counter or 1)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def add_pass(results):
|
|
||||||
results.append(
|
|
||||||
InlineQueryResultArticle(
|
|
||||||
"pass",
|
|
||||||
title="Pass",
|
|
||||||
description="Don't play a card",
|
|
||||||
message_text='Pass'
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def add_call_bluff(results):
|
|
||||||
results.append(
|
|
||||||
InlineQueryResultArticle(
|
|
||||||
"call_bluff",
|
|
||||||
title="Call their bluff!",
|
|
||||||
description="Risk it!",
|
|
||||||
message_text="I'm calling your bluff!"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def add_play_card(card, results):
|
|
||||||
results.append(
|
|
||||||
InlineQueryResultArticle(str(card),
|
|
||||||
title="Play card",
|
|
||||||
message_text=
|
|
||||||
('<a href="%s">\xad</a>'
|
|
||||||
'Played card ' + repr(card))
|
|
||||||
% card.get_image_link(),
|
|
||||||
thumb_url=card.get_thumb_link(),
|
|
||||||
description=repr(card),
|
|
||||||
parse_mode=ParseMode.HTML)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def add_gameinfo(game, results):
|
|
||||||
players = list()
|
players = list()
|
||||||
current_player = game.current_player
|
current_player = game.current_player
|
||||||
itplayer = current_player.next
|
itplayer = current_player.next
|
||||||
|
@ -330,17 +242,94 @@ def add_gameinfo(game, results):
|
||||||
|
|
||||||
results.append(
|
results.append(
|
||||||
InlineQueryResultArticle(
|
InlineQueryResultArticle(
|
||||||
"gameinfo",
|
"hand",
|
||||||
title="Show game info",
|
title="Not playable (tap for game state):",
|
||||||
description="Tap to see the current player, player order, "
|
description=', '.join([repr(card) for card in
|
||||||
"card amounts and last played card",
|
list_subtract(player.cards, playable)]),
|
||||||
message_text="Current player: " + display_name(game) + "\n" +
|
input_message_content=InputTextMessageContent(
|
||||||
"Last card: " + repr(game.last_card) + "\n" +
|
"Current player: " + display_name(game) + "\n" +
|
||||||
"Players: " + " -> ".join(players)
|
"Last card: " + repr(game.last_card) + "\n" +
|
||||||
|
"Players: " + " -> ".join(players))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def add_no_game(results):
|
||||||
|
results.append(
|
||||||
|
InlineQueryResultArticle(
|
||||||
|
"nogame",
|
||||||
|
title="You are not playing",
|
||||||
|
input_message_content=
|
||||||
|
InputTextMessageContent('Not playing right now. Use /new to start '
|
||||||
|
'a game or /join to join the current game '
|
||||||
|
'in this group')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def add_not_started(results):
|
||||||
|
results.append(
|
||||||
|
InlineQueryResultArticle(
|
||||||
|
"nogame",
|
||||||
|
title="The game wasn't started yet",
|
||||||
|
input_message_content=
|
||||||
|
InputTextMessageContent('Start the game with /start')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def add_draw(player, results, could_play_card):
|
||||||
|
results.append(
|
||||||
|
InlineQueryResultArticle(
|
||||||
|
"draw",
|
||||||
|
title=("No suitable cards..." if not could_play_card else
|
||||||
|
"I don't want to play a card..."),
|
||||||
|
description="Draw!",
|
||||||
|
input_message_content=
|
||||||
|
InputTextMessageContent('Drawing %d card(s)'
|
||||||
|
% (player.game.draw_counter or 1))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def add_pass(results):
|
||||||
|
results.append(
|
||||||
|
InlineQueryResultArticle(
|
||||||
|
"pass",
|
||||||
|
title="Pass",
|
||||||
|
description="Don't play a card",
|
||||||
|
input_message_content=InputTextMessageContent('Pass')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def add_call_bluff(results):
|
||||||
|
results.append(
|
||||||
|
InlineQueryResultArticle(
|
||||||
|
"call_bluff",
|
||||||
|
title="Call their bluff!",
|
||||||
|
description="Risk it!",
|
||||||
|
input_message_content=
|
||||||
|
InputTextMessageContent("I'm calling your bluff!")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def add_play_card(card, results):
|
||||||
|
results.append(
|
||||||
|
InlineQueryResultArticle(str(card),
|
||||||
|
title="Play card",
|
||||||
|
thumb_url=card.get_thumb_link(),
|
||||||
|
description=repr(card),
|
||||||
|
input_message_content=
|
||||||
|
InputTextMessageContent(
|
||||||
|
('<a href="%s">\xad</a>'
|
||||||
|
'Played card ' + repr(card))
|
||||||
|
% card.get_image_link(),
|
||||||
|
parse_mode=ParseMode.HTML))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def add_player(itplayer, players):
|
def add_player(itplayer, players):
|
||||||
players.append(itplayer.user.first_name + " (%d cards)"
|
players.append(itplayer.user.first_name + " (%d cards)"
|
||||||
% len(itplayer.cards))
|
% len(itplayer.cards))
|
||||||
|
@ -348,11 +337,15 @@ def add_player(itplayer, players):
|
||||||
|
|
||||||
def process_result(bot, update):
|
def process_result(bot, update):
|
||||||
""" Check the players actions and act accordingly """
|
""" Check the players actions and act accordingly """
|
||||||
user = update.chosen_inline_result.from_user
|
try:
|
||||||
game = gm.userid_game[user.id]
|
user = update.chosen_inline_result.from_user
|
||||||
player = gm.userid_player[user.id]
|
game = gm.userid_game[user.id]
|
||||||
result_id = update.chosen_inline_result.result_id
|
player = gm.userid_player[user.id]
|
||||||
chat_id = gm.chatid_game[game]
|
result_id = update.chosen_inline_result.result_id
|
||||||
|
chat_id = gm.chatid_game[game]
|
||||||
|
except KeyError:
|
||||||
|
return
|
||||||
|
|
||||||
logger.debug("Selected result: " + result_id)
|
logger.debug("Selected result: " + result_id)
|
||||||
|
|
||||||
if result_id in ('hand', 'gameinfo', 'nogame'):
|
if result_id in ('hand', 'gameinfo', 'nogame'):
|
||||||
|
@ -368,7 +361,7 @@ def process_result(bot, update):
|
||||||
else:
|
else:
|
||||||
do_play_card(bot, chat_id, game, player, result_id, user)
|
do_play_card(bot, chat_id, game, player, result_id, user)
|
||||||
|
|
||||||
if game.current_player is not game.current_player.next:
|
if game.current_player.next:
|
||||||
bot.sendMessage(chat_id, text="Next player: " + display_name(game))
|
bot.sendMessage(chat_id, text="Next player: " + display_name(game))
|
||||||
|
|
||||||
|
|
||||||
|
@ -425,13 +418,14 @@ def do_call_bluff(bot, chat_id, game, player):
|
||||||
|
|
||||||
|
|
||||||
# Add all handlers to the dispatcher and run the bot
|
# Add all handlers to the dispatcher and run the bot
|
||||||
dp.addTelegramInlineHandler(inline)
|
dp.addHandler(InlineQueryHandler(reply_to_query))
|
||||||
dp.addTelegramCommandHandler('start', start_game)
|
dp.addHandler(ChosenInlineResultHandler(process_result))
|
||||||
dp.addTelegramCommandHandler('new', new_game)
|
dp.addHandler(CommandHandler('start', start_game))
|
||||||
dp.addTelegramCommandHandler('join', join_game)
|
dp.addHandler(CommandHandler('new', new_game))
|
||||||
dp.addTelegramCommandHandler('leave', leave_game)
|
dp.addHandler(CommandHandler('join', join_game))
|
||||||
dp.addTelegramCommandHandler('help', help)
|
dp.addHandler(CommandHandler('leave', leave_game))
|
||||||
dp.addTelegramCommandHandler('news', news)
|
dp.addHandler(CommandHandler('help', help))
|
||||||
|
dp.addHandler(CommandHandler('news', news))
|
||||||
dp.addErrorHandler(error)
|
dp.addErrorHandler(error)
|
||||||
|
|
||||||
start_bot(u)
|
start_bot(u)
|
||||||
|
|
Loading…
Reference in a new issue