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

Probabilmente risolti #58, #57 e #53

This commit is contained in:
Steffo 2017-07-05 01:40:23 +03:00
parent 1e61f2f398
commit 652ee21dbb

80
main.py
View file

@ -3,8 +3,10 @@
import datetime import datetime
import pickle # Per salvare la partita su file. import pickle # Per salvare la partita su file.
import math import math
import time
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler from telegram.ext import Updater, CommandHandler, CallbackQueryHandler
from telegram import ParseMode, TelegramError, InlineKeyboardButton, InlineKeyboardMarkup from telegram import ParseMode, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.error import Unauthorized, TimedOut
import filemanager import filemanager
import random import random
import strings as s import strings as s
@ -32,8 +34,10 @@ class Role:
self.player = player self.player = player
def __repr__(self) -> str: def __repr__(self) -> str:
r = "<undefined Role>" return "<undefined Role>"
return r
def __str__(self) -> str:
return "{} {}".format(self.icon, self.name)
def power(self, bot, game, arg): def power(self, bot, game, arg):
"""Il potere del ruolo. Si attiva quando il bot riceve un /power in chat privata.""" """Il potere del ruolo. Si attiva quando il bot riceve un /power in chat privata."""
@ -62,8 +66,7 @@ class Royal(Role):
super().__init__(player) super().__init__(player)
def __repr__(self) -> str: def __repr__(self) -> str:
r = "<Role: Royal>" return "<Role: Royal>"
return r
class Mifioso(Role): class Mifioso(Role):
@ -79,10 +82,9 @@ class Mifioso(Role):
def __repr__(self) -> str: def __repr__(self) -> str:
if self.target is None: if self.target is None:
r = "<Role: Mifioso>" return "<Role: Mifioso>"
else: else:
r = "<Role: Mifioso, targeting {target}>".format(target=self.target.tusername) return "<Role: Mifioso, targeting {target}>".format(target=self.target.tusername)
return r
def power(self, bot, game, arg): def power(self, bot, game, arg):
# Imposta una persona come bersaglio da uccidere. # Imposta una persona come bersaglio da uccidere.
@ -131,8 +133,7 @@ class Investigatore(Role):
self.poweruses = self.refillpoweruses self.poweruses = self.refillpoweruses
def __repr__(self) -> str: def __repr__(self) -> str:
r = "<Role: Investigatore, {uses} uses left>".format(uses=self.poweruses) return "<Role: Investigatore, {uses} uses left>".format(uses=self.poweruses)
return r
def power(self, bot, game, arg): def power(self, bot, game, arg):
# Indaga sul vero ruolo di una persona, se sono ancora disponibili usi del potere. # Indaga sul vero ruolo di una persona, se sono ancora disponibili usi del potere.
@ -181,10 +182,9 @@ class Angelo(Role):
def __repr__(self) -> str: def __repr__(self) -> str:
if self.protecting is None: if self.protecting is None:
r = "<Role: Angelo>" return "<Role: Angelo>"
else: else:
r = "<Role: Angelo, protecting {target}>".format(target=self.protecting.tusername) return "<Role: Angelo, protecting {target}>".format(target=self.protecting.tusername)
return r
def power(self, bot, game, arg): def power(self, bot, game, arg):
# Imposta qualcuno come protetto # Imposta qualcuno come protetto
@ -220,8 +220,7 @@ class Terrorista(Role):
powerdesc = s.terrorist_power_description powerdesc = s.terrorist_power_description
def __repr__(self) -> str: def __repr__(self) -> str:
r = "<Role: Terrorista>" return "<Role: Terrorista>"
return r
def ondeath(self, bot, game): def ondeath(self, bot, game):
# Se è stato ucciso da una votazione, attiva il suo potere # Se è stato ucciso da una votazione, attiva il suo potere
@ -250,8 +249,7 @@ class Derek(Role):
self.chaos = False self.chaos = False
def __repr__(self) -> str: def __repr__(self) -> str:
r = "<Role: Derek>" return "<Role: Derek>"
return r
def power(self, bot, game, arg): def power(self, bot, game, arg):
# Attiva / disattiva la morte alla fine del round # Attiva / disattiva la morte alla fine del round
@ -282,8 +280,7 @@ class Disastro(Role):
self.poweruses = self.refillpoweruses self.poweruses = self.refillpoweruses
def __repr__(self) -> str: def __repr__(self) -> str:
r = "<Role: Investigatore, {uses} uses left>".format(uses=self.poweruses) return "<Role: Investigatore, {uses} uses left>".format(uses=self.poweruses)
return r
def power(self, bot, game, arg): def power(self, bot, game, arg):
# Indaga sul vero ruolo di una persona, se sono ancora disponibili usi del potere. # Indaga sul vero ruolo di una persona, se sono ancora disponibili usi del potere.
@ -318,8 +315,7 @@ class Mamma(Role):
powerdesc = s.mom_power_description powerdesc = s.mom_power_description
def __repr__(self) -> str: def __repr__(self) -> str:
r = "<Role: Mamma>" return "<Role: Mamma>"
return r
def onstartgame(self, bot, game): def onstartgame(self, bot, game):
# Scegli un bersaglio casuale che non sia il giocatore stesso # Scegli un bersaglio casuale che non sia il giocatore stesso
@ -439,8 +435,10 @@ class Player:
self.dummy = dummy # E' un bot? Usato solo per il debug (/debugjoin) self.dummy = dummy # E' un bot? Usato solo per il debug (/debugjoin)
def __repr__(self) -> str: def __repr__(self) -> str:
r = "<Player {username}>".format(username=self.tusername) return "<Player {username}>".format(username=self.tusername)
return r
def __str__(self) -> str:
return "@{}".format(self.tusername)
def message(self, bot, text): def message(self, bot, text):
"""Manda un messaggio privato al giocatore.""" """Manda un messaggio privato al giocatore."""
@ -680,6 +678,7 @@ class Game:
self.roleconfig = { self.roleconfig = {
"Mifioso": 0, "Mifioso": 0,
"Investigatore": 0, "Investigatore": 0,
"Corrotto": 0,
"Angelo": 0, "Angelo": 0,
"Terrorista": 0, "Terrorista": 0,
"Derek": 0, "Derek": 0,
@ -715,6 +714,7 @@ class Game:
self.roleconfig = { self.roleconfig = {
"Mifioso": math.floor(len(self.players) / 8) + 1, # 1 Mifioso ogni 8 giocatori "Mifioso": math.floor(len(self.players) / 8) + 1, # 1 Mifioso ogni 8 giocatori
"Investigatore": math.floor(len(self.players) / 12) + 1, # 1 Detective ogni 12 giocatori "Investigatore": math.floor(len(self.players) / 12) + 1, # 1 Detective ogni 12 giocatori
"Corrotto": 0,
"Angelo": 0, "Angelo": 0,
"Terrorista": 0, "Terrorista": 0,
"Derek": 0, "Derek": 0,
@ -753,10 +753,10 @@ class Game:
self.roleconfig = dict() self.roleconfig = dict()
unassignedplayers = len(self.players) unassignedplayers = len(self.players)
# Mifioso: tra 1 e 25% dei giocatori # Mifioso: tra 1 e 25% dei giocatori
self.roleconfig["Mifioso"] = random.randint(1, math.ceil(unassignedplayers / 4)), self.roleconfig["Mifioso"] = random.randint(1, math.ceil(unassignedplayers / 4))
unassignedplayers -= self.roleconfig["Mifioso"] unassignedplayers -= self.roleconfig["Mifioso"]
# Investigatore: tra 1 e 19% dei giocatori # Investigatore: tra 1 e 19% dei giocatori
self.roleconfig["Investigatore"] = random.randint(1, math.ceil(unassignedplayers / 4)), self.roleconfig["Investigatore"] = random.randint(1, math.ceil(unassignedplayers / 4))
unassignedplayers -= self.roleconfig["Investigatore"] unassignedplayers -= self.roleconfig["Investigatore"]
# Angelo: tra 1 e 14% dei giocatori # Angelo: tra 1 e 14% dei giocatori
self.roleconfig["Angelo"] = random.randint(1, math.ceil(unassignedplayers / 4)) self.roleconfig["Angelo"] = random.randint(1, math.ceil(unassignedplayers / 4))
@ -784,12 +784,18 @@ class Game:
self.roleconfig["Stagista"] = 0 self.roleconfig["Stagista"] = 0
self.roleconfig["Derek"] = 1 self.roleconfig["Derek"] = 1
unassignedplayers -= 1 unassignedplayers -= 1
# E se non ce ne fosse nessuno?
else:
self.roleconfig["Stagista"] = 0
self.roleconfig["Derek"] = 0
# Disastro: tra 0 e l'8% dei giocatori # Disastro: tra 0 e l'8% dei giocatori
self.roleconfig["Disastro"] = random.randint(0, math.ceil(unassignedplayers) / 4) self.roleconfig["Disastro"] = random.randint(0, math.ceil(unassignedplayers) / 4)
unassignedplayers -= self.roleconfig["Disastro"] unassignedplayers -= self.roleconfig["Disastro"]
# Non ci sono SignoreDelCaos e Servitore per motivi ovvi # Non ci sono SignoreDelCaos e Servitore per motivi ovvi
self.roleconfig["SignoreDelCaos"] = 0 self.roleconfig["SignoreDelCaos"] = 0
self.roleconfig["Servitore"] = 0 self.roleconfig["Servitore"] = 0
# Non ho ancora finito il corrotto
self.roleconfig["Corrotto"] = 0
# Altri parametri # Altri parametri
self.votingmifia = True self.votingmifia = True
self.missingmifia = True self.missingmifia = True
@ -969,7 +975,7 @@ def join(bot, update):
else: else:
try: try:
p.message(bot, s.you_joined.format(game=game.name)) p.message(bot, s.you_joined.format(game=game.name))
except TelegramError: except Unauthorized:
game.message(bot, s.error_chat_unavailable) game.message(bot, s.error_chat_unavailable)
else: else:
game.message(bot, s.player_joined.format(name=p.tusername)) game.message(bot, s.player_joined.format(name=p.tusername))
@ -1285,7 +1291,9 @@ def delete(bot, update):
def fakerole(bot, update): def fakerole(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':
for singlerole in rolepriority: roles = rolepriority.copy()
roles.append(Royal)
for singlerole in roles:
bot.sendMessage(update.message.chat['id'], s.role_assigned.format(icon=singlerole.icon, name=singlerole.name), bot.sendMessage(update.message.chat['id'], s.role_assigned.format(icon=singlerole.icon, name=singlerole.name),
parse_mode=ParseMode.MARKDOWN) parse_mode=ParseMode.MARKDOWN)
else: else:
@ -1356,7 +1364,7 @@ def inlinekeyboard(bot, update):
elif game.phase is 'Voting': elif game.phase is 'Voting':
# Trova il giocatore # Trova il giocatore
player = game.findplayerbyid(update.callback_query.from_user['id']) player = game.findplayerbyid(update.callback_query.from_user['id'])
if player is not None: if player is not None and player.alive:
# Trova il bersaglio # Trova il bersaglio
target = game.findplayerbyusername(update.callback_query.data) target = game.findplayerbyusername(update.callback_query.data)
player.votingfor = target player.votingfor = target
@ -1364,15 +1372,6 @@ def inlinekeyboard(bot, update):
bot.answerCallbackQuery(callback_query_id=update.callback_query.id, text=s.vote_fp.format(voted=target.tusername)) bot.answerCallbackQuery(callback_query_id=update.callback_query.id, text=s.vote_fp.format(voted=target.tusername))
def handleerror(bot, update, error):
print("Error: " + error)
try:
bot.sendMessage(update.message.chat['id'], error)
except AttributeError:
# Magari invece che pass are questo si potrebbe mandare un msg di debug o roba del genere
pass
updater.dispatcher.add_handler(CommandHandler('ping', ping)) updater.dispatcher.add_handler(CommandHandler('ping', ping))
updater.dispatcher.add_handler(CommandHandler('newgame', newgame)) updater.dispatcher.add_handler(CommandHandler('newgame', newgame))
updater.dispatcher.add_handler(CommandHandler('join', join)) updater.dispatcher.add_handler(CommandHandler('join', join))
@ -1393,8 +1392,11 @@ updater.dispatcher.add_handler(CommandHandler('load', load))
updater.dispatcher.add_handler(CommandHandler('delete', delete)) updater.dispatcher.add_handler(CommandHandler('delete', delete))
updater.dispatcher.add_handler(CommandHandler('debugchangerole', debugchangerole)) updater.dispatcher.add_handler(CommandHandler('debugchangerole', debugchangerole))
updater.dispatcher.add_handler(CallbackQueryHandler(inlinekeyboard)) updater.dispatcher.add_handler(CallbackQueryHandler(inlinekeyboard))
updater.dispatcher.add_error_handler(handleerror)
updater.start_polling() updater.start_polling()
print("Bot avviato!") print("Bot avviato!")
if __name__ == "__main__": if __name__ == "__main__":
updater.idle() while:
try:
updater.idle()
except TimedOut:
time.sleep(10)