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

204 lines
6.7 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-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 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 15:12:17 +00:00
tosend += "RRYG "
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)
def save(self):
"""Salva in un file di testo con il numero del gruppo lo stato attuale del gioco"""
try:
file = open(str(self.groupid) + ".txt", "w")
except OSError:
file = open(str(self.groupid) + ".txt", "x")
pickle.dump(self, file)
def endday(self):
for player in self.players:
player.votedfor = str()
if player.role != 0:
player.special = True
killed = self.mostvoted()
killed.alive = False
self.message(killed.username + " è stato il più votato del giorno.")
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:24:00 +00:00
elif t['text'].startswith("/load"):
g = load(t['chat']['id'])
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 19:24:00 +00:00
# else:
# telegram.sendmessage("Comando non riconosciuto. Avvia una partita prima!", t['chat']['id'],
# t['message_id'])
else:
if t['text'].startswith("/join"):
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)
if balanced <= 15:
p.role = 1
p.special = True
p.message("Sei stato assegnato alla squadra *MIFIA*.")
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!")
elif t['text'].startswith("/save"):
g.save()
elif t['text'].startswith("/status"):
if t['from']['id'] == g.adminid:
g.adminmessage(g.fullstatus())