1
Fork 0
mirror of https://github.com/RYGhub/royal-mifia.git synced 2024-11-22 22:04:18 +00:00

Aggiunte annotazioni di tipo

This commit is contained in:
Steffo 2017-07-18 01:13:38 +02:00
parent c526c020f4
commit cef1ffe701

84
main.py
View file

@ -5,7 +5,7 @@ import pickle # Per salvare la partita su file.
import math import math
import time import time
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler from telegram.ext import Updater, CommandHandler, CallbackQueryHandler
from telegram import ParseMode, InlineKeyboardButton, InlineKeyboardMarkup from telegram import ParseMode, InlineKeyboardButton, InlineKeyboardMarkup, Bot
from telegram.error import Unauthorized, TimedOut, RetryAfter from telegram.error import Unauthorized, TimedOut, RetryAfter
import filemanager import filemanager
import random import random
@ -43,12 +43,12 @@ class Player:
def __str__(self) -> str: def __str__(self) -> str:
return "@{}".format(self.tusername) return "@{}".format(self.tusername)
def message(self, bot, text): def message(self, bot: Bot, text: str):
"""Manda un messaggio privato al giocatore.""" """Manda un messaggio privato al giocatore."""
if not self.dummy: if not self.dummy:
bot.sendMessage(self.tid, text, parse_mode=ParseMode.MARKDOWN) bot.sendMessage(self.tid, text, parse_mode=ParseMode.MARKDOWN)
def kill(self, bot): def kill(self, bot: Bot):
"""Uccidi il giocatore.""" """Uccidi il giocatore."""
self.role.ondeath(bot) self.role.ondeath(bot)
self.alive = False self.alive = False
@ -57,7 +57,7 @@ class Player:
class Game: class Game:
"""Classe di una partita, contenente parametri riguardanti stato della partita """Classe di una partita, contenente parametri riguardanti stato della partita
e informazioni sul gruppo di Telegram.""" e informazioni sul gruppo di Telegram."""
def __init__(self, groupid): def __init__(self, groupid: int):
self.groupid = groupid # ID del gruppo in cui si sta svolgendo una partita self.groupid = groupid # ID del gruppo in cui si sta svolgendo una partita
self.admin = None # ID telegram dell'utente che ha creato la partita con /newgame self.admin = None # ID telegram dell'utente che ha creato la partita con /newgame
self.players = list() # Lista dei giocatori in partita self.players = list() # Lista dei giocatori in partita
@ -97,35 +97,33 @@ class Game:
.format(name=self.name, groupid=self.groupid, nplayers=len(self.players), phase=self.phase) .format(name=self.name, groupid=self.groupid, nplayers=len(self.players), phase=self.phase)
return r return r
def message(self, bot, text): def message(self, bot: Bot, text: str):
"""Manda un messaggio nel gruppo.""" """Manda un messaggio nel gruppo."""
bot.sendMessage(self.groupid, text, parse_mode=ParseMode.MARKDOWN) bot.sendMessage(self.groupid, text, parse_mode=ParseMode.MARKDOWN)
def adminmessage(self, bot, text): def adminmessage(self, bot: Bot, text: str):
"""Manda un messaggio privato al creatore della partita.""" """Manda un messaggio privato al creatore della partita."""
self.admin.message(bot, text) self.admin.message(bot, text)
def mifiamessage(self, bot, text): def mifiamessage(self, bot: Bot, text: str):
"""Manda un messaggio privato a tutti i Mifiosi nella partita.""" """Manda un messaggio privato a tutti i Mifiosi nella partita."""
# Trova tutti i mifiosi nell'elenco dei giocatori # Trova tutti i mifiosi nell'elenco dei giocatori
for player in self.players: for player in self.players:
if isinstance(player.role, Mifioso): if isinstance(player.role, Mifioso):
player.message(bot, text) player.message(bot, text)
def findplayerbyid(self, tid): def findplayerbyid(self, tid: int):
"""Trova il giocatore con un certo id.""" """Trova il giocatore con un certo id."""
for player in self.players: for player in self.players:
if player.tid == tid: if player.tid == tid:
return player return player
else:
return None return None
def findplayerbyusername(self, tusername): def findplayerbyusername(self, tusername: str):
"""Trova il giocatore con un certo username.""" """Trova il giocatore con un certo username."""
for player in self.players: for player in self.players:
if player.tusername.lower() == tusername.strip("@").lower(): if player.tusername.lower() == tusername.strip("@").lower():
return player return player
else:
return None return None
# def updategroupname(self, bot: Bot): # def updategroupname(self, bot: Bot):
@ -138,7 +136,7 @@ class Game:
# except Unauthorized: # except Unauthorized:
# print("Bot is not administrator in group {}".format(self.groupid)) # print("Bot is not administrator in group {}".format(self.groupid))
def assignroles(self, bot): def assignroles(self, bot: Bot):
"""Assegna i ruoli specificati ib playersinrole a tutti i giocatori.""" """Assegna i ruoli specificati ib playersinrole a tutti i giocatori."""
random.seed() random.seed()
playersleft = self.players.copy() playersleft = self.players.copy()
@ -218,7 +216,7 @@ class Game:
else: else:
return list() return list()
def endday(self, bot): def endday(self, bot: Bot):
"""Finisci la giornata, uccidi il più votato del giorno ed esegui gli endday di tutti i giocatori.""" """Finisci la giornata, uccidi il più votato del giorno ed esegui gli endday di tutti i giocatori."""
# SALVA LA PARTITA, così se crasha si riprende da qui # SALVA LA PARTITA, così se crasha si riprende da qui
self.save(bot) self.save(bot)
@ -274,7 +272,7 @@ class Game:
# Controlla se qualcuno ha vinto # Controlla se qualcuno ha vinto
self.victoryconditions(bot) self.victoryconditions(bot)
def startpreset(self, bot): def startpreset(self, bot: Bot):
"""Inizio della fase di preset""" """Inizio della fase di preset"""
self.phase = 'Preset' self.phase = 'Preset'
# Aggiorna il nome del gruppo # Aggiorna il nome del gruppo
@ -292,7 +290,7 @@ class Game:
# Manda la tastiera # Manda la tastiera
bot.sendMessage(self.groupid, s.preset_choose, parse_mode=ParseMode.MARKDOWN, reply_markup=kbmarkup) bot.sendMessage(self.groupid, s.preset_choose, parse_mode=ParseMode.MARKDOWN, reply_markup=kbmarkup)
def loadpreset(self, bot, preset): def loadpreset(self, bot: Bot, preset: str):
"""Fine della fase di preset: carica il preset selezionato o passa a config""" """Fine della fase di preset: carica il preset selezionato o passa a config"""
if preset == "simple": if preset == "simple":
# Preset semplice (solo Royal, Mifiosi e Investigatori) # Preset semplice (solo Royal, Mifiosi e Investigatori)
@ -361,7 +359,7 @@ class Game:
self.endconfig(bot) self.endconfig(bot)
def endconfig(self, bot): def endconfig(self, bot: Bot):
"""Fine della fase di config, inizio assegnazione ruoli""" """Fine della fase di config, inizio assegnazione ruoli"""
# Controlla che ci siano abbastanza giocatori per avviare la partita # Controlla che ci siano abbastanza giocatori per avviare la partita
requiredplayers = 0 requiredplayers = 0
@ -382,7 +380,7 @@ class Game:
for player in self.players: for player in self.players:
player.role.onstartgame(bot) player.role.onstartgame(bot)
def revealallroles(self, bot): def revealallroles(self, bot: Bot):
text = s.status_header.format(name=self.name, admin=self.admin.tusername, phase=self.phase) text = s.status_header.format(name=self.name, admin=self.admin.tusername, phase=self.phase)
self.updatevotes() self.updatevotes()
# Aggiungi l'elenco dei giocatori # Aggiungi l'elenco dei giocatori
@ -391,14 +389,14 @@ class Game:
name=player.tusername) name=player.tusername)
self.message(bot, text) self.message(bot, text)
def endgame(self, bot): def endgame(self, bot: Bot):
self.revealallroles(bot) self.revealallroles(bot)
for player in self.players: for player in self.players:
# Togli la referenza circolare # Togli la referenza circolare
player.role.player = None player.role.player = None
inprogress.remove(self) inprogress.remove(self)
def save(self, bot): def save(self, bot: Bot):
# Crea il file. # Crea il file.
try: try:
file = open(str(self.groupid) + ".p", 'x') file = open(str(self.groupid) + ".p", 'x')
@ -425,7 +423,7 @@ class Game:
self.adminmessage(bot, s.game_saved.format(name=self.name)) self.adminmessage(bot, s.game_saved.format(name=self.name))
file.close() file.close()
def victoryconditions(self, bot): def victoryconditions(self, bot: Bot):
"""Controlla se qualcuno ha completato le condizioni di vittoria.""" """Controlla se qualcuno ha completato le condizioni di vittoria."""
good = 0 good = 0
evil = 0 evil = 0
@ -468,7 +466,7 @@ class Game:
player.message(bot, s.end_game_chaos + s.victory) player.message(bot, s.end_game_chaos + s.victory)
self.endgame(bot) self.endgame(bot)
def changerole(self, bot, player, newrole): def changerole(self, bot: Bot, player: Player, newrole):
"""Cambia il ruolo di un giocatore, aggiornando tutti i valori""" """Cambia il ruolo di un giocatore, aggiornando tutti i valori"""
# Aggiorna le liste dei ruoli # Aggiorna le liste dei ruoli
if player.role.__class__ != Royal: if player.role.__class__ != Royal:
@ -492,7 +490,7 @@ class Game:
for player in self.playersinrole['Corrotto']: for player in self.playersinrole['Corrotto']:
player.message(bot, text) player.message(bot, text)
def joinplayer(self, bot, player, silent=False): def joinplayer(self, bot: Bot, player: Player, silent=False):
self.players.append(player) self.players.append(player)
if not silent: if not silent:
self.message(bot, s.player_joined.format(name=player.tusername, players=len(self.players))) self.message(bot, s.player_joined.format(name=player.tusername, players=len(self.players)))
@ -513,14 +511,14 @@ class Game:
inprogress = list() inprogress = list()
def findgamebyid(gid) -> Game: def findgamebyid(gid: int) -> Game:
"""Trova una partita con un certo id.""" """Trova una partita con un certo id."""
for game in inprogress: for game in inprogress:
if game.groupid == gid: if game.groupid == gid:
return game return game
def findgamebyname(name) -> Game: def findgamebyname(name: str) -> Game:
"""Trova una partita con un certo nome.""" """Trova una partita con un certo nome."""
for game in inprogress: for game in inprogress:
if game.name.lower() == name.lower(): if game.name.lower() == name.lower():
@ -528,12 +526,12 @@ def findgamebyname(name) -> Game:
# Comandi a cui risponde il bot # Comandi a cui risponde il bot
def ping(bot, update): def ping(bot: Bot, update):
"""Ping!""" """Ping!"""
bot.sendMessage(update.message.chat.id, s.pong, parse_mode=ParseMode.MARKDOWN) bot.sendMessage(update.message.chat.id, s.pong, parse_mode=ParseMode.MARKDOWN)
def newgame(bot, update): def newgame(bot: Bot, update):
"""Crea una nuova partita.""" """Crea una nuova partita."""
if update.message.chat.type != 'private': if update.message.chat.type != 'private':
game = findgamebyid(update.message.chat.id) game = findgamebyid(update.message.chat.id)
@ -548,7 +546,7 @@ def newgame(bot, update):
bot.sendMessage(update.message.chat.id, s.error_chat_type, parse_mode=ParseMode.MARKDOWN) bot.sendMessage(update.message.chat.id, s.error_chat_type, parse_mode=ParseMode.MARKDOWN)
def join(bot, update): def join(bot: Bot, update):
"""Unisciti a una partita.""" """Unisciti a una partita."""
game = findgamebyid(update.message.chat.id) game = findgamebyid(update.message.chat.id)
# Nessuna partita in corso # Nessuna partita in corso
@ -581,7 +579,7 @@ def join(bot, update):
game.save(bot) game.save(bot)
def debugjoin(bot, update): def debugjoin(bot: Bot, update):
"""Aggiungi dei bot alla partita.""" """Aggiungi dei bot alla partita."""
if __debug__: if __debug__:
game = findgamebyid(update.message.chat.id) game = findgamebyid(update.message.chat.id)
@ -600,7 +598,7 @@ def debugjoin(bot, update):
pass pass
def status(bot, update): def status(bot: Bot, update):
"""Visualizza lo stato della partita.""" """Visualizza lo stato della partita."""
game = findgamebyid(update.message.chat.id) game = findgamebyid(update.message.chat.id)
if game is not None: if game is not None:
@ -625,7 +623,7 @@ def status(bot, update):
bot.sendMessage(update.message.chat.id, s.error_no_games_found, parse_mode=ParseMode.MARKDOWN) bot.sendMessage(update.message.chat.id, s.error_no_games_found, parse_mode=ParseMode.MARKDOWN)
def endjoin(bot, update): def endjoin(bot: Bot, update):
"""Termina la fase di join e inizia quella di votazione.""" """Termina la fase di join e inizia quella di votazione."""
game = findgamebyid(update.message.chat.id) game = findgamebyid(update.message.chat.id)
if game is not None and game.phase == 'Join': if game is not None and game.phase == 'Join':
@ -638,7 +636,7 @@ def endjoin(bot, update):
bot.sendMessage(update.message.chat.id, s.error_no_games_found, parse_mode=ParseMode.MARKDOWN) bot.sendMessage(update.message.chat.id, s.error_no_games_found, parse_mode=ParseMode.MARKDOWN)
def vote(bot, update): def vote(bot: Bot, update):
"""Vota per uccidere una persona.""" """Vota per uccidere una persona."""
# Trova la partita # Trova la partita
game = findgamebyid(update.message.chat.id) game = findgamebyid(update.message.chat.id)
@ -667,14 +665,14 @@ def vote(bot, update):
bot.sendMessage(game.groupid, s.vote_keyboard, parse_mode=ParseMode.MARKDOWN, reply_markup=keyboard) bot.sendMessage(game.groupid, s.vote_keyboard, parse_mode=ParseMode.MARKDOWN, reply_markup=keyboard)
def endday(bot, update): def endday(bot: Bot, update):
"""Termina la giornata attuale.""" """Termina la giornata attuale."""
game = findgamebyid(update.message.chat.id) game = findgamebyid(update.message.chat.id)
if game is not None and game.phase is 'Voting' and update.message.from_user.id == game.admin.tid: if game is not None and game.phase is 'Voting' and update.message.from_user.id == game.admin.tid:
game.endday(bot) game.endday(bot)
def power(bot, update): def power(bot: Bot, update):
"""Attiva il potere del tuo ruolo.""" """Attiva il potere del tuo ruolo."""
if update.message.chat.type == 'private': if update.message.chat.type == 'private':
cmd = update.message.text.split(' ', 2) cmd = update.message.text.split(' ', 2)
@ -703,7 +701,7 @@ def power(bot, update):
bot.sendMessage(update.message.chat.id, s.error_private_required, parse_mode=ParseMode.MARKDOWN) bot.sendMessage(update.message.chat.id, s.error_private_required, parse_mode=ParseMode.MARKDOWN)
def role(bot, update): def role(bot: Bot, update):
"""Visualizza il tuo ruolo.""" """Visualizza il tuo ruolo."""
game = findgamebyid(update.message.chat.id) game = findgamebyid(update.message.chat.id)
if game is not None and game.phase is 'Voting': if game is not None and game.phase is 'Voting':
@ -720,7 +718,7 @@ def role(bot, update):
bot.sendMessage(update.message.chat.id, s.error_no_games_found, parse_mode=ParseMode.MARKDOWN) bot.sendMessage(update.message.chat.id, s.error_no_games_found, parse_mode=ParseMode.MARKDOWN)
def kill(bot, update): def kill(bot: Bot, update):
"""Uccidi un giocatore in partita.""" """Uccidi un giocatore in partita."""
if __debug__: if __debug__:
game = findgamebyid(update.message.chat.id) game = findgamebyid(update.message.chat.id)
@ -740,7 +738,7 @@ def kill(bot, update):
bot.sendMessage(update.message.chat.id, s.error_no_games_found, parse_mode=ParseMode.MARKDOWN) bot.sendMessage(update.message.chat.id, s.error_no_games_found, parse_mode=ParseMode.MARKDOWN)
def delete(bot, update): def delete(bot: Bot, update):
"""Elimina una partita in corso.""" """Elimina una partita in corso."""
if update.message.chat.type == 'private': if update.message.chat.type == 'private':
if update.message.from_user.username == "Steffo": if update.message.from_user.username == "Steffo":
@ -760,7 +758,7 @@ def delete(bot, update):
bot.sendMessage(update.message.chat.id, s.error_chat_type, parse_mode=ParseMode.MARKDOWN) bot.sendMessage(update.message.chat.id, s.error_chat_type, parse_mode=ParseMode.MARKDOWN)
def fakerole(bot, update): def fakerole(bot: Bot, update):
"""Manda un finto messaggio di ruolo.""" """Manda un finto messaggio di ruolo."""
if update.message.chat.type == 'private': if update.message.chat.type == 'private':
roles = rolepriority.copy() roles = rolepriority.copy()
@ -772,7 +770,7 @@ def fakerole(bot, update):
bot.sendMessage(update.message.chat.id, s.error_private_required, parse_mode=ParseMode.MARKDOWN) bot.sendMessage(update.message.chat.id, s.error_private_required, parse_mode=ParseMode.MARKDOWN)
def load(bot, update): def load(bot: Bot, update):
"""Carica una partita salvata.""" """Carica una partita salvata."""
file = open(str(update.message.chat.id) + ".p", "rb") file = open(str(update.message.chat.id) + ".p", "rb")
game = pickle.load(file) game = pickle.load(file)
@ -780,7 +778,7 @@ def load(bot, update):
game.message(bot, s.game_loaded) game.message(bot, s.game_loaded)
def save(bot, update): def save(bot: Bot, update):
"""Salva una partita su file.""" """Salva una partita su file."""
game = findgamebyid(update.message.chat.id) game = findgamebyid(update.message.chat.id)
if game is not None: if game is not None:
@ -789,7 +787,7 @@ def save(bot, update):
bot.sendMessage(update.message.chat.id, s.error_no_games_found, parse_mode=ParseMode.MARKDOWN) bot.sendMessage(update.message.chat.id, s.error_no_games_found, parse_mode=ParseMode.MARKDOWN)
def debug(bot, update): def debug(bot: Bot, update):
"""Visualizza tutti i ruoli e gli id.""" """Visualizza tutti i ruoli e gli id."""
if __debug__: if __debug__:
game = findgamebyid(update.message.chat.id) game = findgamebyid(update.message.chat.id)
@ -799,7 +797,7 @@ def debug(bot, update):
bot.sendMessage(update.message.chat.id, s.error_no_games_found, parse_mode=ParseMode.MARKDOWN) bot.sendMessage(update.message.chat.id, s.error_no_games_found, parse_mode=ParseMode.MARKDOWN)
def debugchangerole(bot, update): def debugchangerole(bot: Bot, update):
"""Cambia il ruolo a un giocatore.""" """Cambia il ruolo a un giocatore."""
if __debug__: if __debug__:
game = findgamebyid(update.message.chat.id) game = findgamebyid(update.message.chat.id)
@ -810,13 +808,13 @@ def debugchangerole(bot, update):
bot.sendMessage(update.message.chat.id, s.error_no_games_found, parse_mode=ParseMode.MARKDOWN) bot.sendMessage(update.message.chat.id, s.error_no_games_found, parse_mode=ParseMode.MARKDOWN)
def debuggameslist(bot, update): def debuggameslist(bot: Bot, update):
"""Visualizza l'elenco delle partite in corso.""" """Visualizza l'elenco delle partite in corso."""
if __debug__: if __debug__:
bot.sendMessage(update.message.from_user.id, repr(inprogress), parse_mode=ParseMode.MARKDOWN) bot.sendMessage(update.message.from_user.id, repr(inprogress), parse_mode=ParseMode.MARKDOWN)
def inlinekeyboard(bot, update): def inlinekeyboard(bot: Bot, update):
"""Seleziona un preset dalla tastiera.""" """Seleziona un preset dalla tastiera."""
game = findgamebyid(update.callback_query.message.chat.id) game = findgamebyid(update.callback_query.message.chat.id)
if game is None: if game is None: