diff --git a/discord/client.py b/discord/client.py index b9d0350e7..73f7c9567 100644 --- a/discord/client.py +++ b/discord/client.py @@ -31,7 +31,7 @@ from collections import deque from threading import Timer from ws4py.client.threadedclient import WebSocketClient from sys import platform as sys_platform -from errors import InvalidEventName, InvalidDestination +from errors import InvalidEventName, InvalidDestination, GatewayNotFound from user import User from channel import Channel, PrivateChannel from server import Server, Member, Permissions, Role @@ -100,7 +100,15 @@ class Client(object): 'on_channel_create': _null_event, } - self.ws = WebSocketClient(endpoints.WEBSOCKET_HUB, protocols=['http-only', 'chat']) + gateway = requests.get(endpoints.GATEWAY) + if gateway.status_code != 200: + raise GatewayNotFound() + gateway_js = gateway.json() + url = gateway_js.get('url') + if url is None: + raise GatewayNotFound() + + self.ws = WebSocketClient(url, protocols=['http-only', 'chat']) # this is kind of hacky, but it's to avoid deadlocks. # i.e. python does not allow me to have the current thread running if it's self diff --git a/discord/endpoints.py b/discord/endpoints.py index 315e63d17..6be7e01c7 100644 --- a/discord/endpoints.py +++ b/discord/endpoints.py @@ -24,9 +24,9 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ -WEBSOCKET_HUB = 'wss://discordapp.com/hub' BASE = 'https://discordapp.com' API_BASE = BASE + '/api' +GATEWAY = API_BASE + '/gateway' USERS = API_BASE + '/users' LOGIN = API_BASE + '/auth/login' LOGOUT = API_BASE + '/auth/logout' diff --git a/discord/errors.py b/discord/errors.py index b0a6679cb..6a016149f 100644 --- a/discord/errors.py +++ b/discord/errors.py @@ -31,3 +31,7 @@ class InvalidEventName(Exception): class InvalidDestination(Exception): """Thrown when the destination from :meth:`Client.send_message` is invalid.""" pass + +class GatewayNotFound(Exception): + """Thrown when the gateway hub for the :class:`Client` websocket is not found.""" + pass