# HG changeset patch # User souliane # Date 1393377463 -3600 # Node ID 36c6495d86b075b8500161cf3d00ab96c2bb660d # Parent 386ab96af5751e1bd7091c8ed8dd3addad067c4e plugin card_game: update to use the new XMLUI mechanism: TODO: the new round is not starting after the scores have been displayed diff -r 386ab96af575 -r 36c6495d86b0 frontends/src/primitivus/card_game.py --- a/frontends/src/primitivus/card_game.py Wed Feb 26 02:13:29 2014 +0100 +++ b/frontends/src/primitivus/card_game.py Wed Feb 26 02:17:43 2014 +0100 @@ -249,6 +249,13 @@ def newGame(self, hand): """Start a new game, with given hand""" + if hand is []: # reset the display after the scores have been showed + self.resetRound() + for location in ['top', 'left', 'bottom', 'right']: + self.table.putCard(location, None) + self.parent.host.redraw() + self.parent.host.bridge.tarotGameReady(self.player_nick, self.referee, self.parent.host.profile) + return QuickCardGame.newGame(self, hand) self.hand_wid.update(self.hand) self.parent.host.redraw() @@ -260,10 +267,9 @@ QuickCardGame.contratSelected(self, contrat) def chooseContrat(self, xml_data): - """Called when the player as to select his contrat + """Called when the player has to select his contrat @param xml_data: SàT xml representation of the form""" - misc = {'callback': self.contratSelected} - form = XMLUI(self.parent.host, xml_data, title=_('Please choose your contrat'), options=['NO_CANCEL'], misc=misc) + form = XMLUI(self.parent.host, xml_data, title=_('Please choose your contrat'), flags=['NO_CANCEL']) form.show(valign='top') def showCards(self, game_stage, cards, data): @@ -276,19 +282,13 @@ QuickCardGame.myTurn(self) def showScores(self, xml_data, winners, loosers): - """Called when the player as to select hist contrat + """Called when the round is over, display the scores @param xml_data: SàT xml representation of the form""" - def _new_game(ignore): - self.resetRound() - for location in ['top', 'left', 'bottom', 'right']: - self.table.putCard(location, None) - self.parent.host.redraw() - self.parent.host.bridge.tarotGameReady(self.player_nick, self.referee, self.parent.host.profile) if not winners and not loosers: title = _("Draw game") else: title = _('You win \o/') if self.player_nick in winners else _('You loose :(') - form = XMLUI(self.parent.host, xml_data, title=title, options=['NO_CANCEL'], misc={'callback': _new_game}) + form = XMLUI(self.parent.host, xml_data, title=title, flags=['NO_CANCEL']) form.show() def invalidCards(self, phase, played_cards, invalid_cards): diff -r 386ab96af575 -r 36c6495d86b0 frontends/src/wix/card_game.py --- a/frontends/src/wix/card_game.py Wed Feb 26 02:13:29 2014 +0100 +++ b/frontends/src/wix/card_game.py Wed Feb 26 02:17:43 2014 +0100 @@ -85,6 +85,11 @@ def newGame(self, hand): """Start a new game, with given hand""" + if hand is []: # reset the display after the scores have been showed + self.resetRound() + self.Refresh() + self.parent.host.bridge.tarotGameReady(self.player_nick, self.referee, self.parent.host.profile) + return QuickCardGame.newGame(self, hand) self._recalc_ori() self.Refresh() @@ -97,24 +102,18 @@ QuickCardGame.contratSelected(self, contrat) def chooseContrat(self, xml_data): - """Called when the player as to select his contrat + """Called when the player has to select his contrat @param xml_data: SàT xml representation of the form""" - misc = {'callback': self.contratSelected} - form = XMLUI(self.parent.host, xml_data, title = _('Please choose your contrat'), options = ['NO_CANCEL'], misc = misc) + XMLUI(self.parent.host, xml_data, title=_('Please choose your contrat'), flags=['NO_CANCEL']) def showScores(self, xml_data, winners, loosers): - """Called when the player as to select hist contrat + """Called when the round is over, display the scores @param xml_data: SàT xml representation of the form""" - def _new_game(ignore): - self.resetRound() - self.Refresh() - self.parent.host.bridge.tarotGameReady(self.player_nick, self.referee, self.parent.host.profile) - if not winners and not loosers: title = _("Draw game") else: title = _('You win \o/') if self.player_nick in winners else _('You loose :(') - form = XMLUI(self.parent.host, xml_data, title = title, options = ['NO_CANCEL'], misc={'callback':_new_game}) + XMLUI(self.parent.host, xml_data, title=title, flags=['NO_CANCEL']) def cardsPlayed(self, player, cards): """A card has been played by player""" diff -r 386ab96af575 -r 36c6495d86b0 src/plugins/plugin_misc_tarot.py --- a/src/plugins/plugin_misc_tarot.py Wed Feb 26 02:13:29 2014 +0100 +++ b/src/plugins/plugin_misc_tarot.py Wed Feb 26 02:17:43 2014 +0100 @@ -21,9 +21,11 @@ from logging import debug, info, warning, error from twisted.words.xish import domish from twisted.words.protocols.jabber import jid +from twisted.internet import defer from wokkel import data_form -from sat.tools.xml_tools import dataForm2XMLUI +from sat.memory import memory +from sat.tools import xml_tools from sat_frontends.tools.games import TarotCard from time import time import random @@ -53,6 +55,7 @@ def __init__(self, host): info(_("Plugin Tarot initialization")) + self._sessions = memory.Sessions() self.inheritFromRoomGame(host) RoomGame._init_(self, host, PLUGIN_INFO, (NS_CG, CG_TAG), game_init={'hand_size': 18, 'init_player': 0, 'current_player': None, 'contrat': None, 'stage': None}, @@ -61,7 +64,6 @@ host.bridge.addMethod("tarotGameLaunch", ".plugin", in_sign='asss', out_sign='', method=self.prepareRoom) # args: players, room_jid, profile host.bridge.addMethod("tarotGameCreate", ".plugin", in_sign='sass', out_sign='', method=self.createGame) # args: room_jid, players, profile host.bridge.addMethod("tarotGameReady", ".plugin", in_sign='sss', out_sign='', method=self.playerReady) # args: player, referee, profile - host.bridge.addMethod("tarotGameContratChoosed", ".plugin", in_sign='ssss', out_sign='', method=self.contratChoosed) # args: player, referee, contrat, profile host.bridge.addMethod("tarotGamePlayCards", ".plugin", in_sign='ssa(ss)s', out_sign='', method=self.play_cards) # args: player, referee, cards, profile host.bridge.addSignal("tarotGamePlayers", ".plugin", signature='ssass') # args: room_jid, referee, players, profile host.bridge.addSignal("tarotGameStarted", ".plugin", signature='ssass') # args: room_jid, referee, players, profile @@ -78,6 +80,9 @@ for suit in ["pique", "coeur", "carreau", "trefle"]: for value in map(str, range(1, 11)) + ["valet", "cavalier", "dame", "roi"]: self.deck_ordered.append(TarotCard((suit, value))) + self.__choose_contrat_id = host.registerCallback(self._contratChoosed, with_data=True) + self.__score_id = host.registerCallback(self._scoreShowed, with_data=True) + def __card_list_to_xml(self, cards_list, elt_name): """Convert a card list to domish element""" @@ -380,19 +385,46 @@ to_jid = jid.JID(room_jid.userhost() + "/" + next_player) # FIXME: gof: self.send(to_jid, 'your_turn', profile=profile) - def contratChoosed(self, player, referee, contrat, profile_key='@NONE@'): - """Must be call by player when the contrat is selected - @param player: player's name - @param referee: arbiter jid - @contrat: contrat choosed (must be the exact same string than in the give list options) - @profile_key: profile + def _contratChoosed(self, raw_data, profile): + """Will be called when the contrat is selected + @param raw_data: contains the choosed session id and the chosen contrat + @param profile_key: profile """ - profile = self.host.memory.getProfileName(profile_key) - if not profile: - error(_("profile %s is unknown") % profile_key) - return + try: + session_data = self._sessions.profileGet(raw_data["session_id"], profile) + except KeyError: + warning(_("session id doesn't exist, session has probably expired")) + # TODO: send error dialog + return defer.succeed({}) + + room_jid_s = session_data['room_jid'].userhost() + referee = self.games[room_jid_s]['referee'] + player = self.host.plugins["XEP-0045"].getRoomNick(room_jid_s, profile) + data = xml_tools.XMLUIResult2DataFormResult(raw_data) + contrat = data['contrat'] debug(_('contrat [%(contrat)s] choosed by %(profile)s') % {'contrat': contrat, 'profile': profile}) - self.send(jid.JID(referee), ('', 'contrat_choosed'), {'player': player}, content=contrat, profile=profile) + d = self.send(jid.JID(referee), ('', 'contrat_choosed'), {'player': player}, content=contrat, profile=profile) + d.addCallback(lambda ignore: {}) + del self._sessions[raw_data["session_id"]] + return d + + def _scoreShowed(self, raw_data, profile): + """Will be called when the player closes the score dialog + @param raw_data: nothing to retrieve from here but the session id + @param profile_key: profile + """ + try: + session_data = self._sessions.profileGet(raw_data["session_id"], profile) + except KeyError: + warning(_("session id doesn't exist, session has probably expired")) + # TODO: send error dialog + return defer.succeed({}) + + room_jid_s = session_data['room_jid'].userhost() + # XXX: empty hand means to the frontend "reset the display"... + self.host.bridge.tarotGameNew(room_jid_s, [], profile) + del self._sessions[raw_data["session_id"]] + return defer.succeed({}) def play_cards(self, player, referee, cards, profile_key='@NONE@'): """Must be call by player when the contrat is selected @@ -480,7 +512,9 @@ elif elt.name == 'contrat': # it's time to choose contrat form = data_form.Form.fromElement(elt.firstChildElement()) - xml_data = dataForm2XMLUI(form, "").toXml() + session_id, session_data = self._sessions.newSession(profile=profile) + session_data["room_jid"] = room_jid + xml_data = xml_tools.dataForm2XMLUI(form, self.__choose_contrat_id, session_id).toXml() self.host.bridge.tarotGameChooseContrat(room_jid.userhost(), xml_data, profile) elif elt.name == 'contrat_choosed': @@ -619,7 +653,9 @@ for looser in elt.elements(name='looser', uri=NS_CG): loosers.append(unicode(looser)) form = data_form.Form.fromElement(form_elt) - xml_data = dataForm2XMLUI(form, "").toXml() + session_id, session_data = self._sessions.newSession(profile=profile) + session_data["room_jid"] = room_jid + xml_data = xml_tools.dataForm2XMLUI(form, self.__score_id, session_id).toXml() self.host.bridge.tarotGameScore(room_jid.userhost(), xml_data, winners, loosers, profile) elif elt.name == 'error': if elt['type'] == 'invalid_cards':