Ejemplo n.º 1
0
class XboxThread(threading.Thread):
    """Xbox Worker Thread"""
    def __init__(self, notify_window, addr, name, uuid, liveid, crypto, userhash, token):
        """Init Worker Thread Class."""
        threading.Thread.__init__(self)
        self._notify_window = notify_window
        self.addr = addr
        self.name = name
        self.uuid = uuid
        self.liveid = liveid
        self.crypto = crypto
        self.userhash = userhash
        self.token = token
        self._console = None
        self.daemon = True
        self.start()

    def run(self):
        """Run Worker Thread."""
        print("started worker")
        # Re-instantiate console in-thread to prevent gevent fuckery
        self._console = Console(self.addr, self.name, self.uuid, self.liveid)
        self._console.protocol.crypto = self.crypto
        # make a callback for on_system_input

        def on_text(console, payload):
            wx.PostEvent(self._notify_window, TextPromptEvent(payload))

        print("reached connect")
        self._console.add_manager(TextManager)
        self._console.text.on_systemtext_input += functools.partial(on_text, self._console)
        status = self._console.connect(self.userhash, self.token)
        self._console.wait(1)
        if status == ConnectionState.Connected:
            self._notify_window.GetParent().GetParent().SetStatusText("Connected")
            wx.PostEvent(self._notify_window, ResultEvent("Connected"))
            print("Connected")
            self._console.protocol.serve_forever()
        else:
            self._notify_window.GetParent().GetParent().SetStatusText("Connection Failed")
        self._notify_window.GetParent().GetParent().SetStatusText("Disconnected")
        print("Disconnected")
        wx.PostEvent(self._notify_window, ResultEvent("Disconnected"))

    def abort(self):
        """abort worker thread."""
        # Method for use by main thread to signal an abort
        if self._console:
            self._console.protocol.stop()
            self.join()

    def send_text(self, text):
        self._console.send_systemtext_input(text)
        self._console.finish_text_input()
Ejemplo n.º 2
0
class Xbox:
    def __init__(self):
        self.console = False
        self.console_data = False
        self.request_id = 0

    def findDevice(self, tries=1):
        print("[Xbox.findDevice] called (Try #%d)" % tries)
        console = self.discovery(timeout=5, addr=os.environ['XBOX_IP'])
        if tries == 3:
            print("[Xbox.findDevice] Max tries reached. No consoles found")
            return False

        if isinstance(console, Console):
            self.console_data = {
                "address": console.address,
                "name": console.name,
                "uuid": console.uuid,
                "liveid": console.liveid,
                "flags": console.flags,
                "public_key": console.public_key,
            }
        else:
            self.console_data = self.findDevice(tries=tries + 1)

        return self.console_data

    # def fetchMediaStatus(self, tries = 1):
    #
    #     print("[Xbox.fetchMediaStatus] called (Try #%d)" % tries)
    #     if tries == 5:
    #         return False
    #
    #     if self.console.title_id == None:
    #         self.console.protocol.serve_forever()
    #         return self.fetchMediaStatus(tries = tries+1)
    #     else:
    #         return self.console.media_state
    #

    def onMediaState(self, state):
        print(state)
        print("[Xbox.onMediaState] called (State: %s)" % state)
        self.console.protocol.shutdown()
        return

    def onTimeout(self):
        self.console.protocol.stop()
        print("[Xbox.onTimeout] Connection timed out")
        self.console = False

    def getInstance(self, mode='default', connect=True):

        print("[Xbox.getInstance] called (mode: %s, connect: %s)" %
              (mode, connect))

        if self.console_data == False:
            data = self.findDevice()
            if data == False:
                print("[Xbox.getInstance] Result of self.findDevice() = %s" %
                      data)
                return False

        self.console = Console(
            address=self.console_data.get("address"),
            name=self.console_data.get("name"),
            uuid=self.console_data.get("uuid"),
            liveid=self.console_data.get("liveid"),
            flags=self.console_data.get("flags"),
            public_key=self.console_data.get("public_key"),
        )

        if connect == False:
            return self.console
        else:
            print(
                "[Xbox.getInstance] Checking if console data is still up to date"
            )
            console = self.findDevice()
            if console != False:
                print("[Xbox.getInstance] Connecting to Xbox")

                if mode == 'media':
                    print("[Xbox.getInstance] Activated MediaManager (beta)")
                    self.console.add_manager(MediaManager)
                    #self.console.media.on_media_state += self.onMediaState

                if mode == 'stump':
                    print("[Xbox.getInstance] Activated StumpManager (beta)")
                    self.console.add_manager(StumpManager)
                    #self.console.media.on_media_state += self.onMediaState

                state = self.console.connect()

                if state == ConnectionState.Connected:
                    print("[Xbox.getInstance] Xbox Connected")
                    self.console.wait(0.5)
                    connected = True
                else:
                    print(
                        "[Xbox.getInstance] [ERROR] Could not connect to Xbox")
                    conected = False
            else:
                print("[Xbox.getInstance] Xbox not found on network")
                connected = False

        if connected == True:
            return self.console
        else:
            return False

    def discovery(self, timeout, addr):
        return self.do_discovery(addr=addr, tries=timeout)

    def do_discovery(self, addr, tries):
        consoles = Console.discover(addr=addr, tries=tries)
        print("[Xbox.do_discovery] Consoles found:")
        print(consoles)
        if len(consoles) > 0:
            print("[Xbox.do_discovery] Console found")
            return consoles[0]
        else:
            print("[Xbox.do_discovery] No consoles found")
            return False

    def media_command(self, media_command):
        print("[Xbox.media_command] called (media_command: %s)" %
              media_command)
        action = self.console.media_command(0x54321, media_command,
                                            self.request_id)
        return action

    def power_on(self):

        if os.environ['XBOX_IP'] != "127.0.0.1":
            print(
                "[Xbox.power_on] Booting xbox from config settings (%s, %s)" %
                (os.environ['XBOX_IP'], os.environ['XBOX_LIVEID']))
            Console.power_on(os.environ['XBOX_LIVEID'],
                             os.environ['XBOX_IP'],
                             tries=10)
            time.sleep(1)
            Console.power_on(os.environ['XBOX_LIVEID'],
                             os.environ['XBOX_IP'],
                             tries=10)
            time.sleep(1)
            Console.power_on(os.environ['XBOX_LIVEID'],
                             os.environ['XBOX_IP'],
                             tries=10)
            data = True

        else:
            console = self.getInstance(connect=False)
            if console != False:
                print(
                    "[Xbox.power_on] Booting xbox from discovery settings(%s, %s)"
                    % (self.console_data.get("address"),
                       self.console.get("liveid")))
                Console.power_on(self.console_data.get("liveid"),
                                 self.console.get("address"),
                                 tries=10)
                time.sleep(1)
                Console.power_on(self.console_data.get("liveid"),
                                 self.console.get("address"),
                                 tries=10)
                time.sleep(1)
                Console.power_on(self.console_data.get("liveid"),
                                 self.console.get("address"),
                                 tries=10)
                data = True
            else:
                data = [
                    'No device found in cache. Turn on your xbox and run /api/v1/discovery'
                ]

        return data

    def power_off(self):
        self.console.power_off()
        self.console.wait(1)
        self.console = False
        return True

    def close(self):
        print("[Xbox.close] called ()")
        self.console.disconnect()
        self.console = False
        return True

    def connect(timeout):
        discovered = Console.discover(timeout=1)
        if len(discovered):
            return discovered[0]
        return discovered