コード例 #1
0
ファイル: controller.py プロジェクト: pond3r/pyqtggpo
 def parseListChannelsResponse(self, data):
     #self.channels = {}
     if len(data) <= 8:
         logdebug().error('No channels found')
         self.sigChannelsLoaded.emit()
         return
     status1, data = Protocol.extractInt(data)
     status2, data = Protocol.extractInt(data)
     logdebug().info("Load channels header " + repr(status1) + repr(status2))
     while len(data) > 4:
         room, data = Protocol.extractTLV(data)
         romname, data = Protocol.extractTLV(data)
         title, data = Protocol.extractTLV(data)
         users, data = Protocol.extractInt(data)
         index, data = Protocol.extractInt(data)
         # 'sfa3': {'title': 'Street Fighter Alpha 3', 'rom': 'sfa3:sfa3u', 'room': 'sfa3'},
         # 'sfa2': {'title': 'Street Fighter Alpha 2', 'rom': 'sfa2', 'room': 'sfa2'},
         channel = {
             'rom': romname.split(':')[0],
             'room': room,
             'title': title,
             'users': users,
         }
         self.channels[room] = channel
     logdebug().info(repr(self.channels))
     self.sigChannelsLoaded.emit()
     if len(data) > 0:
         logdebug().error('Channel REMAINING DATA len {} {}'.format(len(data), repr(data)))
コード例 #2
0
 def parseChallengeReceivedResponse(self, data):
     name, data = Protocol.extractTLV(data)
     rom, data = Protocol.extractTLV(data)
     if rom != self.rom or name in self.ignored:
         return
     self.challengers.add(name)
     self.sigChallengeReceived.emit(name)
コード例 #3
0
ファイル: controller.py プロジェクト: pond3r/pyqtggpo
 def parseChallengeReceivedResponse(self, data):
     name, data = Protocol.extractTLV(data)
     rom, data = Protocol.extractTLV(data)
     if rom != self.rom or name in self.ignored:
         return
     self.challengers.add(name)
     self.sigChallengeReceived.emit(name)
コード例 #4
0
 def parseListChannelsResponse(self, data):
     #self.channels = {}
     if len(data) <= 8:
         logdebug().error('No channels found')
         self.sigChannelsLoaded.emit()
         return
     status1, data = Protocol.extractInt(data)
     status2, data = Protocol.extractInt(data)
     logdebug().info("Load channels header " + repr(status1) +
                     repr(status2))
     while len(data) > 4:
         room, data = Protocol.extractTLV(data)
         romname, data = Protocol.extractTLV(data)
         title, data = Protocol.extractTLV(data)
         users, data = Protocol.extractInt(data)
         port, data = Protocol.extractInt(data)
         index, data = Protocol.extractInt(data)
         # 'sfa3': {'title': 'Street Fighter Alpha 3', 'rom': 'sfa3:sfa3u', 'room': 'sfa3'},
         # 'sfa2': {'title': 'Street Fighter Alpha 2', 'rom': 'sfa2', 'room': 'sfa2'},
         channel = {
             'rom': romname.split(':')[0],
             'room': room,
             'title': title,
             'users': users,
             'port': port,
         }
         self.channels[room] = channel
     logdebug().info(repr(self.channels))
     self.sigChannelsLoaded.emit()
     if len(data) > 0:
         logdebug().error('Channel REMAINING DATA len {} {}'.format(
             len(data), repr(data)))
コード例 #5
0
 def parseMotdResponse(self, data):
     if not data:
         return
     status, data = Protocol.extractInt(data)
     channel, data = Protocol.extractTLV(data)
     topic, data = Protocol.extractTLV(data)
     msg, data = Protocol.extractTLV(data)
     self.sigMotdReceived.emit(channel, topic, msg)
コード例 #6
0
ファイル: controller.py プロジェクト: pond3r/pyqtggpo
 def parseMotdResponse(self, data):
     if not data:
         return
     status, data = Protocol.extractInt(data)
     channel, data = Protocol.extractTLV(data)
     topic, data = Protocol.extractTLV(data)
     msg, data = Protocol.extractTLV(data)
     self.sigMotdReceived.emit(channel, topic, msg)
コード例 #7
0
ファイル: controller.py プロジェクト: 0nepice/pyqtggpo
 def parseChatResponse(self, data):
     name, data = Protocol.extractTLV(data)
     if name in self.ignored:
         return
     msg, data = Protocol.extractTLV(data)
     try:
         msg = msg.decode('utf-8')
     except ValueError:
         msg = msg
     self.sigChatReceived.emit(name, msg)
コード例 #8
0
ファイル: controller.py プロジェクト: pond3r/pyqtggpo
 def parseChatResponse(self, data):
     name, data = Protocol.extractTLV(data)
     if name in self.ignored:
         return
     msg, data = Protocol.extractTLV(data)
     try:
         msg = msg.decode('utf-8')
     except ValueError:
         msg = msg
     if Settings.USER_LOG_CHAT:
         loguser().info(u"<{}> {}".format(name, msg))
     self.sigChatReceived.emit(name, msg)
コード例 #9
0
 def parseChatResponse(self, data):
     name, data = Protocol.extractTLV(data)
     if name in self.ignored:
         return
     msg, data = Protocol.extractTLV(data)
     try:
         msg = msg.decode('utf-8')
     except ValueError:
         msg = msg
     if Settings.value(Settings.USER_LOG_CHAT):
         loguser().info(u"<{}> {}".format(name, msg))
     self.sigChatReceived.emit(name, msg)
コード例 #10
0
ファイル: controller.py プロジェクト: fcoventuraa/pyqtggpo
    def parseChatResponse(self, data):
        name, data = Protocol.extractTLV(data)
        if name in self.ignored:
            return
        msg, data = Protocol.extractTLV(data)

        if hasattr(name, 'decode'):
            name = name.decode()
        if hasattr(msg, 'decode'):
            msg = msg.decode()

        if Settings.value(Settings.USER_LOG_CHAT):
            loguser().info(u"<{}> {}".format(name, msg))
        self.sigChatReceived.emit(name, msg)
コード例 #11
0
ファイル: controller.py プロジェクト: pond3r/pyqtggpo
 def parseChallengeDeclinedResponse(self, data):
     name, data = Protocol.extractTLV(data)
     if name == self.challenged:
         self.challenged = None
     if name in self.ignored:
         return
     self.sigChallengeDeclined.emit(name)
コード例 #12
0
ファイル: controller.py プロジェクト: pond3r/pyqtggpo
 def parseSpectateResponse(self, data):
     p1, data = Protocol.extractTLV(data)
     p2, data = Protocol.extractTLV(data)
     # if the guy I challenged accepted, remove him as challenged
     if self.challenged and self.challenged in [p1, p2] and self.username in [p1, p2]:
         self.challenged = None
         # quark len(53) = 'quark:stream,ssf2t,challenge-07389-1393539605.46,7000'
     quark, data = Protocol.extractTLV(data)
     logdebug().info("Quark " + repr(quark))
     if quark.startswith('quark:served'):
         smooth = Settings.value(Settings.SMOOTHING)
         if smooth:
             match = re.search(r'[0-9]+', smooth)
             if match:
                 quark += ',{}'.format(match.group(0))
     self.runFBA(quark)
コード例 #13
0
 def parseChallengeCancelledResponse(self, data):
     name, data = Protocol.extractTLV(data)
     if name in list(self.challengers):
         self.challengers.remove(name)
     if name in self.ignored:
         return
     self.sigChallengeCancelled.emit(name)
コード例 #14
0
ファイル: controller.py プロジェクト: pond3r/pyqtggpo
 def parseChallengeCancelledResponse(self, data):
     name, data = Protocol.extractTLV(data)
     if name in list(self.challengers):
         self.challengers.remove(name)
     if name in self.ignored:
         return
     self.sigChallengeCancelled.emit(name)
コード例 #15
0
 def parseChallengeDeclinedResponse(self, data):
     name, data = Protocol.extractTLV(data)
     if name == self.challenged:
         self.challenged = None
     if name in self.ignored:
         return
     self.sigChallengeDeclined.emit(name)
コード例 #16
0
    def parseMessage(self, data):
        """ Decode and route a message received from server

        Message is encoded as follows:
            byte 0-3 - positive integer, 0 for internal messages, 1 for referee messages, otherwise the extension ID of
                       the extension to receive the message.
            byte 4-7 - extension-defined positive integer
            byte 8+ - json-packed python object parameter

        Args:
            data: Encoded message data
        """

        cmd, data = Protocol.extractTLV(data)
        extID, cmd = Protocol.extractInt(cmd)
        prefix, cmd = Protocol.extractInt(cmd)
        params = None if cmd == '' else json.loads(cmd)

        # DEBUG
        dispext = "Extension" if extID == 0 else _ExtensionDict[extID].__name__
        dispprefix = self._codeToString.get((extID, prefix), prefix)
        self.controller.sigStatusMessage.emit(
            "Ext Rcv: ext=%s, prefix=%s, params=%s" %
            (dispext, dispprefix, params))

        if extID == 0:
            # internal message

            if prefix == _Message.InitializationDataResponse:
                # initialization data received from server

                #                self.referee = ExtensionReferee(gamedata=params[1], extensionIO=self)
                self.gameVariableData = params[1]
                self._commandDict = {("/" + chatcommand): extID
                                     for chatcommand, extID in params[2]}
                self._sigInstantiate.emit(params[0])
                self._evtInstantiationFinished.wait(
                )  # Block message loop until extensions are initialized
                # If it hangs here, the __init__() in some extension is freezing

            elif prefix == _Message.ChatMessage:
                self.chatMessage(params)

            elif prefix == _Message.KillEmulator:
                self.controller.killEmulator()

            elif prefix == _Message.BeginMonitoring:
                if self._monitorThread != None and self._monitorThread.is_alive(
                ):
                    return

                self._monitorThread = threading.Thread(
                    target=self._monitorCurrentMatch)
                self._monitorThread.daemon = True
                self._monitorThread.start()

        elif extID in self._instanceDict:
            # message for another extension
            if extID in self._instanceDict:
                self._instanceDict[extID].receiveMessage(prefix, params)
コード例 #17
0
 def parseSpectateResponse(self, data):
     p1, data = Protocol.extractTLV(data)
     p2, data = Protocol.extractTLV(data)
     # if the guy I challenged accepted, remove him as challenged
     if self.challenged and self.challenged in [
             p1, p2
     ] and self.username in [p1, p2]:
         self.challenged = None
         # quark len(53) = 'quark:stream,ssf2t,challenge-07389-1393539605.46,7000'
     quark, data = Protocol.extractTLV(data)
     logdebug().info("Quark " + repr(quark))
     if quark.startswith('quark:served'):
         smooth = Settings.value(Settings.SMOOTHING)
         if smooth:
             match = re.search(r'[0-9]+', smooth)
             if match:
                 quark += ',{}'.format(match.group(0))
     self.runFBA(quark)
コード例 #18
0
 def extractStateChangesResponse(data):
     if len(data) >= 4:
         code, data = Protocol.extractInt(data)
         p1, data = Protocol.extractTLV(data)
         if code == 0:
             p2 = ''
             return PlayerStates.QUIT, p1, p2, None, data
         elif code != 1:
             logdebug().error(
                 "Unknown player state change code {}".format(code))
         state, data = Protocol.extractInt(data)
         p2, data = Protocol.extractTLV(data)
         if not p2:
             p2 = "null"
         ip, data = Protocol.extractTLV(data)
         # \xff\xff\xff\x9f
         # \x00\x00\x00&
         unknown1, data = Protocol.extractInt(data)
         unknown2, data = Protocol.extractInt(data)
         city, data = Protocol.extractTLV(data)
         cc, data = Protocol.extractTLV(data)
         if cc:
             cc = cc.lower()
         country, data = Protocol.extractTLV(data)
         # \x00\x00\x17y
         marker, data = Protocol.extractInt(data)
         playerinfo = dict(
             player=p1,
             ip=ip,
             city=city,
             cc=cc,
             country=country,
             spectators=0,
         )
         return state, p1, p2, playerinfo, data
コード例 #19
0
ファイル: controller.py プロジェクト: pond3r/pyqtggpo
 def extractStateChangesResponse(data):
     if len(data) >= 4:
         code, data = Protocol.extractInt(data)
         p1, data = Protocol.extractTLV(data)
         if code == 0:
             p2 = ''
             return PlayerStates.QUIT, p1, p2, None, data
         elif code != 1:
             logdebug().error("Unknown player state change code {}".format(code))
         state, data = Protocol.extractInt(data)
         p2, data = Protocol.extractTLV(data)
         if not p2:
             p2 = "null"
         ip, data = Protocol.extractTLV(data)
         # \xff\xff\xff\x9f
         # \x00\x00\x00&
         unknown1, data = Protocol.extractInt(data)
         unknown2, data = Protocol.extractInt(data)
         city, data = Protocol.extractTLV(data)
         cc, data = Protocol.extractTLV(data)
         if cc:
             cc = cc.lower()
         country, data = Protocol.extractTLV(data)
         # \x00\x00\x17y
         marker, data = Protocol.extractInt(data)
         playerinfo = dict(
             player=p1,
             ip=ip,
             city=city,
             cc=cc,
             country=country,
         )
         return state, p1, p2, playerinfo, data
コード例 #20
0
 def parseListUsersResponse(self, data):
     self.resetPlayers()
     if not data:
         return
     status, data = Protocol.extractInt(data)
     status2, data = Protocol.extractInt(data)
     while len(data) > 8:
         p1, data = Protocol.extractTLV(data)
         # if len(data) <= 4: break
         state, data = Protocol.extractInt(data)
         p2, data = Protocol.extractTLV(data)
         ip, data = Protocol.extractTLV(data)
         unk1, data = Protocol.extractInt(data)
         unk2, data = Protocol.extractInt(data)
         city, data = Protocol.extractTLV(data)
         cc, data = Protocol.extractTLV(data)
         if cc:
             cc = cc.lower()
         country, data = Protocol.extractTLV(data)
         port, data = Protocol.extractInt(data)
         color, data = Protocol.extractInt(data)
         color = None if color >= 0x1000000 else QtGui.QColor((color & 0xFF0000) >> 16, (color & 0xFF00) >> 8, color & 0xFF)
         spectators, data = Protocol.extractInt(data)
         self.addUser(
             player=p1,
             ip=ip,
             port=port,
             city=city,
             cc=cc,
             country=country,
             color=color,
             spectators=spectators+1,
         )
         if state == PlayerStates.AVAILABLE:
             self.available[p1] = True
         elif state == PlayerStates.AFK:
             self.awayfromkb[p1] = True
         elif state == PlayerStates.PLAYING:
             if not p2:
                 p2 = 'null'
             self.playing[p1] = p2
     self.sigPlayersLoaded.emit()
     if len(data) > 0:
         logdebug().error('List users - REMAINING DATA len {} {}'.format(len(data), repr(data)))
コード例 #21
0
ファイル: controller.py プロジェクト: Miinky-Arcade/pyqtggpo
 def parseListUsersResponse(self, data):
     self.resetPlayers()
     if not data:
         return
     status, data = Protocol.extractInt(data)
     status2, data = Protocol.extractInt(data)
     while len(data) > 8:
         p1, data = Protocol.extractTLV(data)
         # if len(data) <= 4: break
         state, data = Protocol.extractInt(data)
         p2, data = Protocol.extractTLV(data)
         ip, data = Protocol.extractTLV(data)
         unk1, data = Protocol.extractInt(data)
         unk2, data = Protocol.extractInt(data)
         city, data = Protocol.extractTLV(data)
         cc, data = Protocol.extractTLV(data)
         if cc:
             cc = cc.lower()
         country, data = Protocol.extractTLV(data)
         port, data = Protocol.extractInt(data)
         spectators, data = Protocol.extractInt(data)
         self.addUser(
             player=p1,
             ip=ip,
             port=port,
             city=city,
             cc=cc,
             country=country,
             spectators=spectators+1,
         )
         if state == PlayerStates.AVAILABLE:
             self.available[p1] = True
         elif state == PlayerStates.AFK:
             self.awayfromkb[p1] = True
         elif state == PlayerStates.PLAYING:
             if not p2:
                 p2 = 'null'
             self.playing[p1] = p2
     self.sigPlayersLoaded.emit()
     if len(data) > 0:
         logdebug().error('List users - REMAINING DATA len {} {}'.format(len(data), repr(data)))