def listen(self, wait=60, blocking=True):
        """Listen for events and call any associated callbacks when there is an event.
        There are three events you can subscribe too; **status_change**, **play_state_change**, **track_change**

        :param wait: how long to wait for a response before starting a new connection
        :param blocking: if listen should block the current process or not
        """
        url = get_url("/remote/status.json")

        def listen_for_status_change():
            params = {"oauth": self._oauth_token, "csrf": self._csrf_token}
            r = self._request(url=url, params=params)
            old = r.json()
            self.emit("status_change", old)
            params = {
                "oauth": self._oauth_token,
                "csrf": self._csrf_token,
                "returnon": "play,pause,error,ap",
                "returnafter": wait,
            }
            while True:
                r = self._request(url=url, params=params)
                new = r.json()

                if new != old:
                    self.emit("status_change", new)

                if new["playing"] != old["playing"]:
                    self.emit("play_state_change", new)

                if (
                    new["track"]["track_resource"]["uri"]
                    != old["track"]["track_resource"]["uri"]
                ):
                    self.emit("track_change", new)

                old = new

        if blocking:
            listen_for_status_change()
        else:
            thread = Thread(target=listen_for_status_change)
            thread.daemon = True
            thread.start()