1
Fork 0
mirror of https://github.com/RYGhub/royalnet.git synced 2024-11-24 03:54:20 +00:00
royalnet/mifia.py

347 lines
14 KiB
Python
Raw Normal View History

2016-04-01 15:39:38 +00:00
# -*- coding: utf-8 -*-
2016-04-01 16:20:10 +00:00
import telegram
2016-04-10 12:04:04 +00:00
import configparser
2016-04-11 21:20:14 +00:00
import random
2016-04-05 19:01:25 +00:00
2016-04-06 19:53:36 +00:00
2016-04-01 15:39:38 +00:00
class Player:
2016-04-01 15:47:20 +00:00
telegramid = int()
username = str()
2016-04-05 19:01:25 +00:00
role = 0 # 0 normale | 1 rryg | 2 resistenza
2016-04-01 16:20:10 +00:00
alive = True
2016-04-03 11:14:05 +00:00
votedfor = str()
special = False
2016-04-01 16:20:10 +00:00
def message(self, text):
"""Manda un messaggio al giocatore
:param text: Testo del messaggio
"""
telegram.sendmessage(text, self.telegramid)
2016-04-01 15:47:20 +00:00
2016-04-10 12:04:04 +00:00
partiteincorso = list()
2016-04-01 15:47:20 +00:00
class Game:
2016-04-03 11:14:05 +00:00
groupid = int()
adminid = int()
2016-04-01 16:20:10 +00:00
players = list()
tokill = list()
2016-04-01 20:08:08 +00:00
2016-04-11 21:33:16 +00:00
def __del__(self):
print("Partita {0} eliminata.\n".format(self.groupid))
2016-04-01 20:08:08 +00:00
def message(self, text):
"""Manda un messaggio alla chat generale del gioco
:param text: Testo del messaggio
"""
2016-04-05 19:24:00 +00:00
telegram.sendmessage(text, self.groupid)
2016-04-01 20:28:41 +00:00
2016-04-03 11:14:05 +00:00
def adminmessage(self, text):
"""Manda un messaggio all'admin del gioco
:param text: Testo del messaggio
"""
telegram.sendmessage(text, self.adminid)
def evilmessage(self, text):
2016-04-05 15:12:17 +00:00
"""Manda un messaggio al team dei nemici del gioco
2016-04-01 20:28:41 +00:00
:param text: Testo del messaggio
"""
for player in self.players:
if player.role == 1:
2016-04-06 19:53:36 +00:00
telegram.sendmessage("\U0001F608: " + text, player.telegramid)
2016-04-01 20:08:08 +00:00
2016-04-05 19:01:25 +00:00
def status(self) -> str:
2016-04-03 11:14:05 +00:00
"""Restituisci lo stato attuale della partita in una stringa unicode"""
2016-04-01 20:08:08 +00:00
tosend = "Stato attuale del gioco: \n"
for player in self.players:
if not player.alive:
tosend += "\U0001F480 "
else:
tosend += "\U0001F636 "
tosend += player.username + "\n"
2016-04-03 11:14:05 +00:00
return tosend
2016-04-01 20:08:08 +00:00
2016-04-05 19:01:25 +00:00
def fullstatus(self) -> str:
2016-04-03 11:14:05 +00:00
"""Restituisci lo stato attuale della partita (per admin?) in una stringa unicode"""
2016-04-01 20:28:41 +00:00
tosend = "Stato attuale del gioco: \n"
for player in self.players:
if not player.alive:
2016-04-03 11:14:05 +00:00
tosend += "\U0001F480 "
2016-04-01 20:28:41 +00:00
elif player.role == 1:
2016-04-05 19:55:51 +00:00
tosend += "\U0001F608 "
elif player.role == 2:
2016-04-06 19:53:36 +00:00
tosend += "\U0001F46E "
2016-04-01 20:28:41 +00:00
else:
2016-04-19 15:12:14 +00:00
tosend += "\U0001F610 "
2016-04-01 20:28:41 +00:00
tosend += player.username + "\n"
2016-04-03 11:14:05 +00:00
return tosend
2016-04-06 19:53:36 +00:00
def findusername(self, fusername) -> Player:
2016-04-03 11:14:05 +00:00
"""Trova un giocatore con un certo nome utente
2016-04-06 19:53:36 +00:00
:param fusername: Nome utente da cercare
2016-04-03 11:14:05 +00:00
"""
for player in self.players:
2016-04-19 15:21:57 +00:00
if player.username == fusername.capitalize():
2016-04-03 11:14:05 +00:00
return player
else:
return None
2016-04-05 19:01:25 +00:00
def findid(self, telegramid) -> Player:
2016-04-03 11:14:05 +00:00
"""Trova un giocatore con un certo ID di telegram
:param telegramid: ID da cercare
"""
for player in self.players:
if player.telegramid == telegramid:
return player
else:
return None
2016-04-01 20:28:41 +00:00
2016-04-01 20:08:08 +00:00
def addplayer(self, player):
"""Aggiungi un giocatore alla partita
:param player: Oggetto del giocatore da aggiungere
"""
self.players.append(player)
2016-04-03 11:14:05 +00:00
2016-04-05 19:01:25 +00:00
def mostvoted(self) -> Player:
2016-04-03 11:14:05 +00:00
"""Trova il giocatore più votato"""
2016-04-05 15:12:17 +00:00
votelist = dict()
for player in self.players:
2016-04-06 19:53:36 +00:00
if player.votedfor != str() and player.alive:
2016-04-05 15:12:17 +00:00
if player.votedfor not in votelist:
votelist[player.votedfor] = 1
else:
votelist[player.votedfor] += 1
mostvoted = str()
mostvotes = int()
for player in votelist:
if mostvoted == str():
mostvoted = player
mostvotes = votelist[player]
else:
if votelist[player] > mostvotes:
mostvoted = player
mostvotes = votelist[player]
if mostvoted is not None:
return self.findusername(mostvoted)
else:
return None
2016-04-05 15:12:17 +00:00
def endday(self):
2016-04-06 19:53:36 +00:00
votedout = self.mostvoted()
2016-04-08 10:03:46 +00:00
self.message(votedout.username + " è il più votato del giorno e sarà ucciso.")
2016-04-06 19:53:36 +00:00
self.tokill.append(votedout)
for killed in self.tokill:
2016-04-06 19:53:36 +00:00
self.message(killed.username + " è stato ucciso.\n")
2016-04-19 15:12:14 +00:00
if killed.role == 0:
self.message("Era un \U0001F610 Royal.")
elif killed.role == 1:
self.message("Era un \U0001F608 Mifioso!")
2016-04-06 19:53:36 +00:00
elif killed.role == 2:
2016-04-19 15:12:14 +00:00
self.message("Era un \U0001F46E Detective!")
killed.alive = False
2016-04-05 15:12:17 +00:00
for player in self.players:
player.votedfor = str()
if player.role != 0:
player.special = True
2016-04-11 21:20:14 +00:00
self.message(self.displaycount())
2016-04-06 19:53:36 +00:00
# Controlla se la Royal Games ha vinto
zero = 0
uno = 0
for player in self.players:
if player.alive:
if player.role == 0 or player.role == 2:
zero += 1
elif player.role == 1:
uno += 1
if uno == 0:
2016-04-08 10:03:46 +00:00
self.message("*Il Team Royal ha vinto!*\n"
"Tutti i Mifiosi sono stati eliminati.")
2016-04-11 21:33:16 +00:00
partiteincorso.remove(findgame(self.groupid))
2016-04-06 19:53:36 +00:00
if uno >= zero:
2016-04-08 10:03:46 +00:00
self.message("*Il Team Mifia ha vinto!*\n"
"I Mifiosi rimasti sono più dei Royal.")
self.tokill = list()
2016-04-05 15:12:17 +00:00
def displaycount(self) -> str:
zero = 0
uno = 0
for player in self.players:
if player.alive:
if player.role == 0 or player.role == 2:
zero += 1
elif player.role == 1:
uno += 1
2016-04-11 21:27:40 +00:00
msg = "*Royal*: {0} persone rimaste\n" \
"*Mifia*: {1} persone rimaste".format(str(zero), str(uno))
return msg
2016-04-10 12:04:04 +00:00
def save(self):
status = configparser.ConfigParser()
status['General'] = {
"groupid": self.groupid,
"adminid": self.adminid,
}
for player in self.players:
status[player.username] = {
2016-04-10 12:21:42 +00:00
"telegramid": player.telegramid,
2016-04-10 12:04:04 +00:00
"role": player.role,
"alive": player.alive,
}
try:
f = open(str(self.groupid) + ".ini", "w")
except OSError:
open(str(self.groupid) + ".ini", "x")
f = open(str(self.groupid) + ".ini", "w")
status.write(f)
2016-04-05 19:01:25 +00:00
def findgame(chatid) -> Game:
for game in partiteincorso:
if game.groupid == chatid:
return game
else:
return None
2016-04-10 12:04:04 +00:00
def loadgame(chatid) -> Game:
l = Game()
loaded = configparser.ConfigParser()
loaded.read(str(chatid) + ".ini")
# General non è un giocatore, quindi toglilo
2016-04-10 12:21:42 +00:00
playerlist = loaded.sections()
playerlist.remove("General")
2016-04-10 12:04:04 +00:00
for player in playerlist:
lp = Player()
lp.alive = bool(loaded[player]['alive'])
lp.username = player
lp.role = int(loaded[player]['role'])
2016-04-10 12:21:42 +00:00
lp.telegramid = int(loaded[player]['telegramid'])
l.players.append(lp)
l.groupid = int(loaded['General']['groupid'])
l.adminid = int(loaded['General']['adminid'])
return l
2016-04-10 12:04:04 +00:00
2016-04-05 19:01:25 +00:00
while True:
t = telegram.getupdates()
if 'text' in t:
2016-04-05 19:24:00 +00:00
g = findgame(t['chat']['id'])
if g is None:
if t['text'].startswith("/newgame"):
2016-04-05 19:01:25 +00:00
g = Game()
g.groupid = t['chat']['id']
g.adminid = t['from']['id']
partiteincorso.append(g)
2016-04-05 19:55:51 +00:00
g.message("Partita creata!")
2016-04-10 12:04:04 +00:00
elif t['text'].startswith("/loadgame"):
g = loadgame(t['chat']['id'])
2016-04-10 12:21:42 +00:00
partiteincorso.append(g)
2016-04-10 12:04:04 +00:00
g.message("Partita caricata!\n_Forse._")
2016-04-05 19:24:00 +00:00
elif t['text'].startswith("/status"):
2016-04-05 19:01:25 +00:00
telegram.sendmessage("Nessuna partita in corso.", t['chat']['id'], t['message_id'])
else:
2016-04-06 19:53:36 +00:00
xtra = t['text'].split(' ', 2)
try:
g = findgame(int(xtra[0]))
except ValueError:
g = None
if g is not None:
2016-04-19 15:21:57 +00:00
if xtra[1].capitalize() == "special":
if g.findid(t['from']['id']).role == 1 and g.findid(t['from']['id']).special:
target = g.findusername(xtra[2])
if target is not None:
g.tokill.append(target)
g.findid(t['from']['id']).special = False
2016-04-06 19:53:36 +00:00
g.evilmessage("Il bersaglio di " + t['from']['username'] + " è *" + target.username +
"*.")
elif g.findid(t['from']['id']).role == 2 and g.findid(t['from']['id']).special:
target = g.findusername(xtra[2])
p = g.findid(t['from']['id'])
if target is not None:
if target.role == 0:
2016-04-19 15:12:14 +00:00
p.message(target.username + " è un \U0001F610 Royal.")
2016-04-06 19:53:36 +00:00
elif target.role == 1:
2016-04-19 15:12:14 +00:00
p.message(target.username + " è un \U0001F608 Mifioso.")
2016-04-06 19:53:36 +00:00
elif target.role == 2:
2016-04-19 15:12:14 +00:00
p.message(target.username + " è un \U0001F46E Detective.")
2016-04-06 19:53:36 +00:00
p.special = False
2016-04-19 15:21:57 +00:00
elif xtra[1].capitalize() == "chat":
2016-04-06 19:53:36 +00:00
if g.findid(t['from']['id']).role == 1:
g.evilmessage(xtra[2])
2016-04-05 19:24:00 +00:00
else:
if t['text'].startswith("/join"):
2016-04-08 10:03:46 +00:00
if g.findid(t['from']['id']) is None:
2016-04-05 19:55:51 +00:00
p = Player()
p.telegramid = t['from']['id']
# Qui crasha se non è stato impostato un username. Fare qualcosa?
2016-04-19 15:21:57 +00:00
p.username = t['from']['username'].capitalize()
2016-04-05 19:55:51 +00:00
# Assegnazione dei ruoli
2016-04-11 21:20:14 +00:00
r = random.randrange(0, 100)
2016-04-05 19:55:51 +00:00
# Spiegare meglio cosa deve fare ogni ruolo?
2016-04-11 21:42:02 +00:00
if r < 15:
2016-04-05 19:55:51 +00:00
p.role = 1
p.special = True
2016-04-19 15:12:14 +00:00
p.message("Sei stato assegnato alla squadra \U0001F608 *MIFIA*."
"Apparirai agli altri come un membro del team ROYAL. Depistali e non farti uccidere!"
"Il team ROYAL ucciderà la persona più votata di ogni turno.\n"
"Per votare, scrivi `/vote username`!"
"Scrivi in questa chat `{0} CHAT messaggio` per mandare un"
" messaggio segreto al tuo team."
"Scrivi in questa chat `{0} SPECIAL username` per uccidere"
" qualcuno alla fine del giorno."
"La squadra Mifia vince se tutta la Royal Games è eliminata."
"Perdi se vieni ucciso."
.format(g.groupid))
2016-04-11 21:42:02 +00:00
elif r > 85:
2016-04-05 19:55:51 +00:00
p.role = 2
p.special = True
2016-04-19 15:12:14 +00:00
p.message("Sei stato assegnato alla squadra *ROYAL* con il ruolo di \U0001F46E *DETECTIVE*."
"Apparirai agli altri come un membro del team ROYAL. "
"Non attirare l'attenzione dei Mifiosi su di te!"
"Il team ROYAL ucciderà la persona più votata di ogni turno.\n"
"Per votare, scrivi `/vote username`!"
"Tra di voi si nascondono dei Mifiosi.\n"
"Stanateli e uccideteli votando per le persone giuste!"
"La squadra Royal vince se tutti i Mifiosi sono morti."
"La squadra Royal perde se sono vivi solo Mifiosi."
"Scrivi in questa chat `{0} SPECIAL nomeutente` per usare il tuo "
" potere di detective e indagare sul ruolo di qualcuno per un giorno."
.format(g.groupid))
2016-04-05 19:55:51 +00:00
else:
p.role = 0
2016-04-06 19:53:36 +00:00
p.special = True
2016-04-19 15:12:14 +00:00
p.message("Sei stato assegnato alla squadra \U0001F610 *ROYAL*.")
2016-04-06 19:53:36 +00:00
p.message("Il team ROYAL ucciderà la persona più votata di ogni turno.\n"
"Per votare, scrivi `/vote username`!")
p.message("Tra di voi si nascondono dei Mifiosi.\n"
"Stanateli e uccideteli votando per le persone giuste!")
p.message("La squadra Royal vince se tutti i Mifiosi sono morti.")
p.message("La squadra Royal perde se sono vivi solo Mifiosi.")
2016-04-05 19:55:51 +00:00
g.addplayer(p)
g.message(p.username + " si è unito alla partita!")
2016-04-05 19:24:00 +00:00
elif t['text'].startswith("/status"):
2016-04-19 15:12:14 +00:00
g.message(g.status() + "\n" + g.displaycount())
2016-04-10 12:04:04 +00:00
elif t['text'].startswith("/fullstatus"):
2016-04-05 19:24:00 +00:00
if t['from']['id'] == g.adminid:
2016-04-19 15:12:14 +00:00
g.adminmessage(g.fullstatus() + "\n" + g.displaycount())
2016-04-10 12:04:04 +00:00
elif t['text'].startswith("/save"):
if t['from']['id'] == g.adminid:
g.save()
g.message("Partita salvata!\n_Funzione instabile, speriamo che non succedano casini..._")
elif t['text'].startswith("/endday"):
if t['from']['id'] == g.adminid:
g.endday()
g.message(g.status())
elif t['text'].startswith("/vote"):
username = t['text'].split(' ')
2016-04-08 10:03:46 +00:00
if len(username) > 1 and g.findusername(username[1]) is not None:
voter = g.findid(t['from']['id'])
2016-04-08 10:03:46 +00:00
if voter.alive:
voter.votedfor = username[1]
g.message("Hai votato per " + username[1] + ".")
else:
g.message("I morti non votano.")
else:
2016-04-08 10:03:46 +00:00
g.message("La persona selezionata non esiste.")