1
0
Files
battle_royale_sim/bot.py

140 lines
5.7 KiB
Python

from telegram.ext import Application
from telegram.ext import CommandHandler
from telegram.ext import MessageHandler
from telegram.ext import filters
from telegram import ReplyKeyboardMarkup
from telegram import ReplyKeyboardRemove
import main as _brsim
import debug as _dbg
from bot_libs import player_handling as _bot_player
from bot_libs import syms as _botsyms
async def simulate_day(context, chat_id):
if 'arena' in context.application.bot_data:
Arena= context.application.bot_data['arena']
if len(Arena.get_alive_players()) == 1:
winner= Arena.get_alive_players()[0]
try:
context.job.schedule_removal()
print(f'simulate_day: Loop removed')
except: pass
msg= f'{winner.get_name()} Vince la cruenta battaglia, e vive felice e contento con Guarino'
return await context.bot.send_message(chat_id, msg)
print(f'{chat_id}: Guarino ha trovato l\'arena')
await context.bot.send_message(chat_id, f'Giorno #{Arena.day}')
msg= _dbg.play_one_day_debug(Arena)
await context.bot.send_message(chat_id, msg)
else:
print('Arena non trovata')
await context.bot.send_message(chat_id, 'Che e\' successo? un Guarino ha rubato l\'arena, avvia una nuova partita con /start')
async def loop_game(context):
chat_id = context.job.chat_id
print(f'loop_game: run on {chat_id}')
return await simulate_day(context, chat_id)
async def bot_start(update, context):
await update.message.reply_text(_botsyms.START_MSG)
keyboard = [
['Init/Restart'],
['Add Player'],
['Get Players', 'Get Alive Players', 'Get Death Players'],
['Simulate Day', 'Run Periodically']
]
reply_markup= ReplyKeyboardMarkup(keyboard, one_time_keyboard=False, resize_keyboard=True)
chat_id = update.effective_chat.id
print(f'{chat_id}: Sto costruendo il mondo di gioco...')
Arena= _brsim.init_arena()
await update.message.reply_text('Ho creato il mondo di gioco', reply_markup=reply_markup)
context.application.bot_data['arena'] = Arena
async def start_loop_game(update, context, seconds):
await update.message.reply_text(f'Ok capo!! giochero\' per te ogni {seconds}secondi')
chat_id = update.effective_chat.id
if 'arena' not in context.application.bot_data:
print(f'{chat_id}: Arena non trovata')
await update.message.reply_text(f'Arena non trovata, avviare con /start')
return
Arena= context.application.bot_data['arena']
if len(Arena.get_players()) < 2:
print(f'{chat_id}: Guarino pretende che ci siano almeno 2 giocatori')
await update.message.reply_text(f'Servono almeno 2 giocatori. Ecco i giocatori presenti nel mondo do gioco: \n{Arena.get_players()}')
return
context.job_queue.run_repeating(loop_game, interval= seconds, first=1, chat_id= chat_id)
print(f'Job giornaliero creato per la chat {chat_id}')
async def bot_commands(update, context):
text= update.message.text
chat_id = update.effective_chat.id
if text == 'Init/Restart':
print(f'bot_command: {chat_id} Init/Restart')
return await bot_start(update, context)
if text == 'Add Player':
print(f'bot_command: {chat_id} Add Player')
context.application.bot_data['ask_name'] = 1
if 'ask_seconds' in context.application.bot_data:
del(context.application.bot_data['ask_seconds'])
return await update.message.reply_text('Inserisci il Nome del giocatore')
if text == 'Get Players':
print(f'bot_command: {chat_id} Get Players')
return await _bot_player.get_players(update, context)
if text == 'Get Alive Players':
print(f'bot_command: {chat_id} Get Alive Players')
return await _bot_player.get_alive_players(update, context)
if text == 'Get Death Players':
print(f'bot_command: {chat_id} Get Death Players')
return await _bot_player.get_death_players(update, context)
if text == 'Simulate Day':
print(f'bot_command: {chat_id} Simulate Day')
return await simulate_day(context, chat_id)
if text == 'Run Periodically':
print(f'bot_command: {chat_id} Run Periodically')
context.application.bot_data['ask_seconds'] = 1
if 'ask_name' in context.application.bot_data:
del(context.application.bot_data['ask_name'])
return await update.message.reply_text('Inserisci il numero di secondi, ad esempio \n(60 = 1 minuto)(600 = 10 minuti)\n(3600 = 1 ora)\n(86400 = 1 giorno)')
#return await simulate_day(context, chat_id)
waiting_for_seconds= context.application.bot_data.get('ask_seconds')
if waiting_for_seconds:
print(f'bot_command: {chat_id} User Wants to auto-run the game every {text} seconds')
try: text= int(text)
except: return
seconds= max(1, text)
return await start_loop_game(update, context, seconds)
waiting_for_name= context.application.bot_data.get('ask_name')
if waiting_for_name:
print(f'bot_command: {chat_id} Collected Player Name {text}')
del(context.application.bot_data['ask_name'])
return await _bot_player.add_player(update, context, text)
print(f'{chat_id} ha inviato questo testo: {text}')
await update.message.reply_text(_botsyms.WIP_MSG)
def main():
application = Application.builder().token(_botsyms.TOKEN).build()
application.add_handler(CommandHandler('start', bot_start))
#application.add_handler(CommandHandler('start_game', start_loop_game))
# player handler
#application.add_handler(CommandHandler('add_player', _bot_player.add_player))
#application.add_handler(CommandHandler('get_players', _bot_player.get_players))
#application.add_handler(CommandHandler('get_alive_players', _bot_player.get_alive_players))
#application.add_handler(CommandHandler('get_death_players', _bot_player.get_death_players))
application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, bot_commands))
print('Bot in esecuzione...')
application.run_polling()
if __name__ == '__main__':
main()