2016-04-01 15:39:38 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
2016-04-01 16:20:10 +00:00
|
|
|
import telegram
|
2016-04-05 15:12:17 +00:00
|
|
|
import pickle
|
2016-04-05 19:24:00 +00:00
|
|
|
import random
|
2016-04-05 19:01:25 +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
|
|
|
|
|
|
|
class Game:
|
2016-04-03 11:14:05 +00:00
|
|
|
groupid = int()
|
|
|
|
adminid = int()
|
2016-04-01 16:20:10 +00:00
|
|
|
players = list()
|
2016-04-05 21:26:23 +00:00
|
|
|
tokill = list()
|
2016-04-05 19:24:00 +00:00
|
|
|
joinphase = True
|
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:
|
|
|
|
telegram.sendmessage(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:
|
|
|
|
tosend += "Detective "
|
2016-04-01 20:28:41 +00:00
|
|
|
else:
|
2016-04-03 11:14:05 +00:00
|
|
|
tosend += "\U0001F636 "
|
2016-04-01 20:28:41 +00:00
|
|
|
tosend += player.username + "\n"
|
2016-04-03 11:14:05 +00:00
|
|
|
return tosend
|
|
|
|
|
2016-04-05 19:01:25 +00:00
|
|
|
def findusername(self, username) -> Player:
|
2016-04-03 11:14:05 +00:00
|
|
|
"""Trova un giocatore con un certo nome utente
|
|
|
|
:param username: Nome utente da cercare
|
|
|
|
"""
|
|
|
|
for player in self.players:
|
|
|
|
if player.username == username:
|
|
|
|
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:
|
|
|
|
if player.votedfor != str():
|
|
|
|
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]
|
|
|
|
return self.findusername(mostvoted)
|
|
|
|
|
2016-04-05 19:55:51 +00:00
|
|
|
# def save(self):
|
|
|
|
# """Salva in un file di testo con il numero del gruppo lo stato attuale del gioco"""
|
|
|
|
# file = open(str(self.groupid) + ".txt", "x")
|
|
|
|
# pickle.dump(self, file)
|
2016-04-05 15:12:17 +00:00
|
|
|
|
|
|
|
def endday(self):
|
2016-04-05 21:26:23 +00:00
|
|
|
self.message(self.mostvoted().username + " è stato il più votato del giorno.")
|
|
|
|
self.tokill.append(self.mostvoted())
|
|
|
|
for killed in self.tokill:
|
|
|
|
self.message(killed.username + " è stato ucciso.")
|
|
|
|
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-05 19:01:25 +00:00
|
|
|
def load(filename) -> Game:
|
2016-04-05 15:12:17 +00:00
|
|
|
"""Restituisci da un file di testo con il numero del gruppo lo stato del gioco (Funzione non sicura, non importare
|
|
|
|
file a caso pls)
|
|
|
|
:param filename: Nome del file da cui caricare lo stato"""
|
|
|
|
try:
|
|
|
|
file = open(str(filename) + ".txt", "r")
|
|
|
|
except OSError:
|
|
|
|
return None
|
|
|
|
else:
|
|
|
|
return pickle.load(file)
|
|
|
|
|
2016-04-05 19:01:25 +00:00
|
|
|
|
2016-04-05 15:12:17 +00:00
|
|
|
partiteincorso = list()
|
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
|
|
|
|
|
|
|
|
|
|
|
|
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!")
|
|
|
|
# elif t['text'].startswith("/load"):
|
|
|
|
# g = load(t['chat']['id'])
|
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'])
|
2016-04-05 21:26:23 +00:00
|
|
|
else:
|
|
|
|
xtra = t['text'].split(' ')
|
|
|
|
try:
|
|
|
|
g = findgame(int(xtra[0]))
|
|
|
|
except ValueError:
|
|
|
|
g = None
|
|
|
|
if g is not None:
|
|
|
|
if xtra[1] == "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
|
|
|
|
g.evilmessage("Il bersaglio di " + t['from']['username'] + " è " + target.username +
|
|
|
|
".")
|
2016-04-05 19:24:00 +00:00
|
|
|
else:
|
|
|
|
if t['text'].startswith("/join"):
|
2016-04-05 19:55:51 +00:00
|
|
|
if g.joinphase:
|
|
|
|
p = Player()
|
|
|
|
p.telegramid = t['from']['id']
|
|
|
|
# Qui crasha se non è stato impostato un username. Fare qualcosa?
|
|
|
|
p.username = t['from']['username']
|
|
|
|
# Assegnazione dei ruoli
|
|
|
|
# Spiegare meglio cosa deve fare ogni ruolo?
|
|
|
|
balanced = random.randrange(0, 100, 1)
|
2016-04-05 21:26:23 +00:00
|
|
|
if balanced <= 100:
|
2016-04-05 19:55:51 +00:00
|
|
|
p.role = 1
|
|
|
|
p.special = True
|
|
|
|
p.message("Sei stato assegnato alla squadra *MIFIA*.")
|
2016-04-05 21:26:23 +00:00
|
|
|
p.message("L'ID della partita è " + str(g.groupid) + ".\n"
|
2016-04-05 19:55:51 +00:00
|
|
|
"Non dimenticarlo. ")
|
|
|
|
elif balanced >= 95:
|
|
|
|
p.role = 2
|
|
|
|
p.special = True
|
|
|
|
p.message("Sei stato assegnato alla squadra *ROYAL*.")
|
|
|
|
p.message("Hai il ruolo speciale di detective.")
|
|
|
|
else:
|
|
|
|
p.role = 0
|
|
|
|
p.message("Sei stato assegnato alla squadra *ROYAL*.")
|
|
|
|
g.addplayer(p)
|
|
|
|
g.message(p.username + " si è unito alla partita!")
|
2016-04-05 19:24:00 +00:00
|
|
|
else:
|
2016-04-05 19:55:51 +00:00
|
|
|
g.message("La fase di iscrizione è terminata.")
|
|
|
|
# elif t['text'].startswith("/save"):
|
|
|
|
# g.save()
|
2016-04-05 19:24:00 +00:00
|
|
|
elif t['text'].startswith("/status"):
|
|
|
|
if t['from']['id'] == g.adminid:
|
|
|
|
g.adminmessage(g.fullstatus())
|
2016-04-05 19:55:51 +00:00
|
|
|
else:
|
|
|
|
g.message(g.status())
|
|
|
|
elif t['text'].startswith("/endjoin"):
|
|
|
|
if t['from']['id'] == g.adminid:
|
|
|
|
g.message("Fase di iscrizione chiusa.")
|
|
|
|
g.message(g.status())
|
2016-04-05 21:26:23 +00:00
|
|
|
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(' ')
|
|
|
|
if g.findusername(username[1]) is not None:
|
|
|
|
voter = g.findid(t['from']['id'])
|
|
|
|
voter.votedfor = username[1]
|
|
|
|
g.message("Hai votato per " + username[1] + ".")
|
|
|
|
else:
|
|
|
|
g.message("La persona selezionata non esiste.")
|