Jeu de belote en ligne.

belote_ws.py 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. # -*- coding: utf-8 -*-
  2. import flask_socketio as fio
  3. from flask_login import current_user
  4. from db import Game, Player, User
  5. from belote_jeu import translator, legal_play, colors, N_PLAYERS, N_TURN
  6. NAME_ARBITRE = 'Arbitre'
  7. NAME_BONJOUR = 'Portier'
  8. class CustomNamespacePlay(fio.Namespace):
  9. def __init__(self, id):
  10. self._id = id
  11. self.users = []
  12. fio.Namespace.__init__(self, '/game/{}'.format(id))
  13. def on_connect(self):
  14. if current_user is None or not self.game().authorized(current_user):
  15. fio.disconnect()
  16. if current_user.name not in self.users:
  17. if len(self.users)==1:
  18. fio.emit('text', {'text': '{} est là !'.format(self.users[0]), 'username':None, 'name':NAME_BONJOUR})
  19. elif len(self.users)>1:
  20. fio.emit('text', {'text': '{} sont là !'.format(', '.join(self.users)), 'username':None, 'name':NAME_BONJOUR})
  21. self.users.append(current_user.name)
  22. fio.emit('text', {'text': '{} vient d\'arriver !'.format(current_user.name), 'username':None, 'name':NAME_BONJOUR}, broadcast=True)
  23. pass
  24. def on_disconnect(self):
  25. if current_user.name in self.users:
  26. self.users.remove(current_user.name)
  27. fio.emit('text', {'text': '{} est parti.e.'.format(current_user.name), 'username':None, 'name':NAME_BONJOUR}, broadcast=True)
  28. pass
  29. def on_join(self, data):
  30. pass
  31. def on_choose_color(self, data):
  32. if 'atout' not in data:
  33. return
  34. atout = data['atout']
  35. game = self.game()
  36. if not game.turn<0:
  37. fio.emit('text', {'text': "Choix d'atout indisponible", 'username':None, 'name':NAME_ARBITRE})
  38. return
  39. # C'est mon tour ?
  40. if game.get_nr(current_user) != (game.turn + game.first_player)%4:
  41. fio.emit('text', {'text': "Ce n'est pas votre tour...", 'username':None, 'name':NAME_ARBITRE})
  42. return
  43. # Choix légal pour ce tour ?
  44. if atout is not None and game.turn < -4 and game.played[1] != atout:
  45. fio.emit('text', {'text': "Pour l'instant on prend ou pas, mais on ne peut pas choisir l'atout.", 'username':None, 'name':NAME_ARBITRE})
  46. return
  47. if atout is not None and not atout in colors:
  48. fio.emit('text', {'text': "Couleur d'atout inconnue ({})".format(atout), 'username':None, 'name':NAME_ARBITRE})
  49. return
  50. # OK !
  51. if(game.tour_choix(atout, current_user)):
  52. 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)
  53. else:
  54. fio.emit('text', {'text': "Erreur E0101", 'username':None, 'name':NAME_ARBITRE})
  55. def on_play(self, data):
  56. if 'card' not in data:
  57. return
  58. card = data['card']
  59. game = self.game()
  60. if game.turn<0 or game.atout is None or game.atout =='':
  61. fio.emit('text', {'text': "Jeu pas encore disponible. Il faut choisir l'atout !", 'username':None, 'name':NAME_ARBITRE})
  62. return
  63. # C'est mon tour ?
  64. if game.get_nr(current_user) != (game.turn + game.first_player)%4:
  65. fio.emit('text', {'text': "Ce n'est pas votre tour...", 'username':None, 'name':NAME_ARBITRE})
  66. return
  67. # Choix légal pour ce tour ?
  68. p = game.get_player(current_user)
  69. if legal_play(game.played, game.atout, card, p.cards):
  70. ok, winnr = game.tour_jeu(card, current_user)
  71. if ok:
  72. fio.emit('play', {'turn':game.turn, 'played':game.played.split(',') if game.played is not None and game.played !='' else [], \
  73. '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)
  74. else:
  75. fio.emit('text', {'text': "Vous ne pouvez pas jouer cette carte ({})".format(translator(card)), 'username':None, 'name':NAME_ARBITRE})
  76. return
  77. def on_text(self, data):
  78. if 'text' in data and len(data['text'])>0:
  79. fio.emit('text', {'text':data['text'], 'username':current_user.login, 'name':current_user.name}, broadcast=True);
  80. def on_monjeu(self, data):
  81. cards = self.game().get_player(current_user).cards
  82. cards = cards.split(',') if cards is not None and cards != '' else []
  83. fio.emit('monjeu', {'cards':cards});
  84. def on_restart(self, data):
  85. game = self.game()
  86. if game.isadmin(current_user):
  87. if game.turn==N_TURN*N_PLAYERS or (game.turn==0 and (game.atout is None or game.atout == '')):
  88. game.restart_jeu()
  89. fio.emit('restart', game.serialize_state_anonymous(), broadcast=True)
  90. else:
  91. fio.emit('text', {'text': "Finissez la partie avant d'en recommencer une.", 'username':None, 'name':NAME_ARBITRE})
  92. else:
  93. fio.emit('text', {'text': "Demandez au maitre du jeu pour reprendre une partie.", 'username':None, 'name':NAME_ARBITRE})
  94. def on_state_game(self, data):
  95. game = self.game()
  96. fio.emit('state_game', game.serialize_state_anonymous())
  97. def game(self):
  98. return Game.query.get(self._id)
  99. class CustomNamespaceJoin(fio.Namespace):
  100. def __init__(self, id):
  101. self._id = id
  102. fio.Namespace.__init__(self, '/game/{}/join'.format(id))
  103. def on_connect(self):
  104. pass
  105. def on_disconnect(self):
  106. pass
  107. def on_join(self, data):
  108. if self.game().can_join(current_user):
  109. if not self.game().authorized(current_user):
  110. self.game().join(current_user)
  111. fio.emit('join', {'username':current_user.login, 'name': current_user.name}, broadcast=True)
  112. def on_add_player(self, data):
  113. if self.game().isadmin(current_user):
  114. if 'username' in data:
  115. user = User.query.get(data['username'])
  116. if user is not None and self.game().can_join(user):
  117. if not self.game().authorized(user):
  118. self.game().join(user)
  119. fio.emit('join', {'username':user.login, 'name': user.name}, broadcast=True)
  120. def on_leave(self, data):
  121. if self.game().leave(current_user):
  122. fio.emit('leave', {'username':current_user.login}, broadcast=True)
  123. def on_ban(self, data):
  124. if 'username' in data:
  125. username = data['username']
  126. if self.game().isadmin(current_user):
  127. if 'username' is not None:
  128. if self.game().leave(username):
  129. fio.emit('leave', {'username':username}, broadcast=True)
  130. def on_fixplayers(self, data):
  131. if self.game().isadmin(current_user):
  132. if self.game().can_start():
  133. self.game().fix_players()
  134. fio.emit('fixplayers', {})
  135. def on_start(self, data):
  136. if 'order' in data:
  137. order = data['order']
  138. else:
  139. order = None
  140. if self.game().isadmin(current_user):
  141. if self.game().start_game(order):
  142. fio.emit('start', {}, broadcast=True)
  143. def game(self):
  144. return Game.query.get(self._id)