FoBot/bot/modules/avalon.py

135 lines
6.6 KiB
Python
Raw Permalink Normal View History

2018-10-19 20:21:25 +02:00
import random
from bot import traductions as tr
import json
def to_str(entier):
return str(entier).replace("1", "a").replace("2", "b").replace("3", "c").replace("4", "d").replace("5", "e") \
.replace("6", "f").replace("7", "g").replace("8", "h").replace("9", "i").replace("0", "j")
class MainClass:
name = "avalon"
def __init__(self, guild):
self.guild = guild
# Init database
self.curent_games = []
self.current_waiting_players = []
self.current_roles = []
self.current_players = []
with self.guild.bot.database.cursor() as cursor:
sql_init = "CREATE TABLE IF NOT EXISTS {guild_id}avalon (" \
" id int(5) NOT NULL AUTO_INCREMENT PRIMARY KEY," \
" nb_joueurs int(5) NOT NULL," \
" gentil_a varchar(50) NOT NULL," \
" gentil_b varchar(50) NOT NULL," \
" gentil_c varchar(50)," \
" gentil_d varchar(50)," \
" gentil_e varchar(50)," \
" gentil_f varchar(50)," \
" mechant_a varchar(50) NOT NULL," \
" mechant_b varchar(50)," \
" mechant_c varchar(50)," \
" mechant_d varchar(50)," \
" merlin varchar(50) NOT NULL," \
" assassin varchar(50) NOT NULL," \
" mordred varchar(50)," \
" perceval varchar(50)," \
" morgane varchar(50)," \
" oberon varchar(50)," \
" vainqueur varchar(50)" \
")".format(guild_id=self.guild.id)
cursor.execute(sql_init)
async def start(self, msg, command, args):
if len(self.current_waiting_players) >= 5:
await msg.channel.send(
tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonstart"]["notenoughtplayers"])
return
elif len(self.current_waiting_players) != len(self.current_roles):
await msg.channel.send(tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonstart"]["rolesnotmatch"])
return
else:
self.current_games.append({
"channel": msg.channel.id,
"players": self.current_waiting_players,
"gentils": [],
"mechants": [],
"merlin": None,
"assassin": None,
"mordred": None,
"perceval": None,
"morgane": None,
"oberon": None
})
for player in self.current_waiting_players:
role = random.choose(self.current_roles)
self.current_roles.remove()
self.current_waiting_players = []
async def quit(self, msg, command, args):
if msg.author.id in self.current_waiting_players:
self.current_waiting_players.remove(msg.author.id)
await msg.channel.send(tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonquit"]["quit"]
.format(player_id=msg.author.id,
nb_players=len(self.current_waiting_players)))
elif msg.author.id in self.current_players:
self.quitting_players.append(msg.author.id)
to_del = []
# Verify if everyone want to quit game
for game in self.curent_games:
stop_game = True
for game_player in game.players:
if game_player not in self.quitting_player:
stop_game = False
if stop_game:
to_del.append(game)
for game in to_del:
self.curent_games.remove(game)
await msg.channel.send(tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonquit"]["alreadyplaying"]
.format(player_id=msg.authpr.id))
async def join(self, msg, command, args):
# Personne pas déjà en train d'attendre, ni en train de jouer
if msg.author.id not in self.current_waiting_players + self.current_players:
self.current_waiting_players.append(msg.author.id)
await msg.channel.send(
tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonjoin"]["join"]
.format(player_id=msg.author.id,
nb_players=len(self.current_waiting_players)))
if len(self.current_waiting_players) >= 5:
await msg.channel.send(tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonjoin"]["canplay"]
.format(prefix=self.guild.config["prefix"]))
elif msg.author.id in self.current_players:
await msg.channel.send(
tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonjoin"]["alreadyplaying"]
.format(player_id=msg.author.id))
elif msg.author.id in self.current_waiting_players:
await msg.channel.send(tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonjoin"]["alreadywaiting"]
.format(player_id=msg.author.id))
async def stats(self, msg, command, args):
with self.guild.bot.database.cursor() as cursor:
cursor.execute("SELECT id,nb_joueurs,vainqueur FROM {guild_id}avalon;".format(guild_id=self.guild.id))
results = cursor.fetchall()
nb_games = len(results)
nb_victoire_gentil = len(list([result for result in results if results["vainqueur"] == "gentil"]))
nb_victoire_mechant = nb_games - nb_victoire_gentil
await msg.channel.send(tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonstats"]
.format(nb_games=nb_games,
nb_victoire_gentil=nb_victoire_gentil,
nb_victoire_mechant=nb_victoire_mechant))
async def on_message(self, msg):
if msg.content.startswith(self.guild.config["prefix"]):
command, *args = msg.content.lstrip(self.guild.config["prefix"]).split(" ")
if command == "avalonstats":
await self.stats(msg, command, args)
elif command == "avalonjoin":
await self.join(msg, command, args)
elif command == "avalonquit":
await self.quit(msg, command, args)
return