Belote/belote_ws.py

169 lines
7.2 KiB
Python

# -*- coding: utf-8 -*-
import flask_socketio as fio
from flask_login import current_user
from db import Game, Player, User
from belote_jeu import translator, legal_play, colors, N_PLAYERS, N_TURN
NAME_ARBITRE = 'Arbitre'
NAME_BONJOUR = 'Portier'
class CustomNamespacePlay(fio.Namespace):
def __init__(self, id):
self._id = id
self.users = []
fio.Namespace.__init__(self, '/game/{}'.format(id))
def on_connect(self):
if current_user is None or not self.game().authorized(current_user):
fio.disconnect()
if current_user.name not in self.users:
if len(self.users)==1:
fio.emit('text', {'text': '{} est là !'.format(self.users[0]), 'username':None, 'name':NAME_BONJOUR})
elif len(self.users)>1:
fio.emit('text', {'text': '{} sont là !'.format(', '.join(self.users)), 'username':None, 'name':NAME_BONJOUR})
self.users.append(current_user.name)
fio.emit('text', {'text': '{} vient d\'arriver !'.format(current_user.name), 'username':None, 'name':NAME_BONJOUR}, broadcast=True)
pass
def on_disconnect(self):
if current_user.name in self.users:
self.users.remove(current_user.name)
fio.emit('text', {'text': '{} est parti.e.'.format(current_user.name), 'username':None, 'name':NAME_BONJOUR}, broadcast=True)
pass
def on_join(self, data):
pass
def on_choose_color(self, data):
if 'atout' not in data:
return
atout = data['atout']
game = self.game()
if not game.turn<0:
fio.emit('text', {'text': "Choix d'atout indisponible", 'username':None, 'name':NAME_ARBITRE})
return
# C'est mon tour ?
if game.get_nr(current_user) != (game.turn + game.first_player)%4:
fio.emit('text', {'text': "Ce n'est pas votre tour...", 'username':None, 'name':NAME_ARBITRE})
return
# Choix légal pour ce tour ?
if atout is not None and game.turn < -4 and game.played[1] != atout:
fio.emit('text', {'text': "Pour l'instant on prend ou pas, mais on ne peut pas choisir l'atout.", 'username':None, 'name':NAME_ARBITRE})
return
if atout is not None and not atout in colors:
fio.emit('text', {'text': "Couleur d'atout inconnue ({})".format(atout), 'username':None, 'name':NAME_ARBITRE})
return
# OK !
print('atout choix')
print(atout)
if(game.tour_choix(atout, current_user)):
print('Emit atout choix')
fio.emit('choose_color', {'turn':game.turn, 'first_player':game.first_player, 'atout':game.atout, 'preneur':game.preneur if game.preneur is not None else current_user.login}, broadcast=True)
else:
fio.emit('text', {'text': "Erreur E0101", 'username':None, 'name':NAME_ARBITRE})
def on_play(self, data):
if 'card' not in data:
return
card = data['card']
game = self.game()
if game.turn<0 or game.atout is None or game.atout =='':
fio.emit('text', {'text': "Jeu pas encore disponible. Il faut choisir l'atout !", 'username':None, 'name':NAME_ARBITRE})
return
# C'est mon tour ?
if game.get_nr(current_user) != (game.turn + game.first_player)%4:
fio.emit('text', {'text': "Ce n'est pas votre tour...", 'username':None, 'name':NAME_ARBITRE})
return
# Choix légal pour ce tour ?
p = game.get_player(current_user)
if legal_play(game.played, game.atout, card, p.cards):
ok, winnr = game.tour_jeu(card, current_user)
if ok:
fio.emit('play', {'turn':game.turn, 'played':game.played.split(',') if game.played is not None and game.played !='' else [], \
'last_played':game.last_played.split(',') if game.last_played is not None else [] , 'first_player': game.first_player, 'points':[game.points_0, game.points_1]}, broadcast=True)
else:
fio.emit('text', {'text': "Vous ne pouvez pas jouer cette carte ({})".format(translator(card)), 'username':None, 'name':NAME_ARBITRE})
return
def on_text(self, data):
if 'text' in data and len(data['text'])>0:
fio.emit('text', {'text':data['text'], 'username':current_user.login, 'name':current_user.name}, broadcast=True);
def on_monjeu(self, data):
cards = self.game().get_player(current_user).cards
cards = cards.split(',') if cards is not None and cards != '' else []
fio.emit('monjeu', {'cards':cards});
def on_restart(self, data):
game = self.game()
if game.isadmin(current_user):
if game.turn==N_TURN*N_PLAYERS or (game.turn==0 and (game.atout is None or game.atout == '')):
game.restart_jeu()
fio.emit('restart', game.serialize_state_anonymous(), broadcast=True)
else:
fio.emit('text', {'text': "Finissez la partie avant d'en recommencer une.", 'username':None, 'name':NAME_ARBITRE})
else:
fio.emit('text', {'text': "Demandez au maitre du jeu pour reprendre une partie.", 'username':None, 'name':NAME_ARBITRE})
def game(self):
return Game.query.get(self._id)
class CustomNamespaceJoin(fio.Namespace):
def __init__(self, id):
self._id = id
fio.Namespace.__init__(self, '/game/{}/join'.format(id))
def on_connect(self):
pass
def on_disconnect(self):
pass
def on_join(self, data):
if self.game().can_join(current_user):
if not self.game().authorized(current_user):
self.game().join(current_user)
fio.emit('join', {'username':current_user.login, 'name': current_user.name}, broadcast=True)
def on_add_player(self, data):
if self.game().isadmin(current_user):
if 'username' in data:
user = User.query.get(data['username'])
if user is not None and self.game().can_join(user):
if not self.game().authorized(user):
self.game().join(user)
fio.emit('join', {'username':user.login, 'name': user.name}, broadcast=True)
def on_leave(self, data):
if self.game().leave(current_user):
fio.emit('leave', {'username':current_user.login}, broadcast=True)
def on_ban(self, data):
if 'username' in data:
username = data['username']
if self.game().isadmin(current_user):
if 'username' is not None:
if self.game().leave(username):
fio.emit('leave', {'username':username})
def on_fixplayers(self, data):
if self.game().isadmin(current_user):
if self.game().can_start():
self.game().fix_players()
fio.emit('fixplayers', {})
def on_start(self, data):
if 'order' in data:
order = data['order']
else:
order = None
if self.game().isadmin(current_user):
if self.game().start_game(order):
fio.emit('start', {}, broadcast=True)
def game(self):
return Game.query.get(self._id)