mirror of
https://github.com/RYGhub/royal-mifia.git
synced 2024-11-26 15:44:19 +00:00
parent
1e61f2f398
commit
652ee21dbb
1 changed files with 41 additions and 39 deletions
80
main.py
80
main.py
|
@ -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)
|
Loading…
Reference in a new issue