Alyssa

discord_gateway

Jun 10th, 2016
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.96 KB | None | 0 0
  1. import discord
  2. import json
  3. import random
  4. from threading import Thread
  5. import time
  6. import websocket
  7.  
  8. version = "2.1"
  9.  
  10. def default_handler(self, message):
  11.     msg = json.loads(message)
  12.     event_data = msg["d"]
  13.     user = event_data["author"]["username"]
  14.     discrim = event_data["author"]["discriminator"]
  15.     content = event_data["content"]
  16.     print(user + "#" + str(discrim) + ": " + content)
  17.     return True
  18.  
  19. class Client:
  20.     def __init__(self, auth_token, uid, discord, is_bot, message_handler = default_handler, device = "Tron#0056's discord_gateway.py"):
  21.         self.auth = auth_token
  22.         self.uid = uid
  23.         self.discord = discord
  24.         self.bot = is_bot
  25.         self.alive = True
  26.         self.channels = {}
  27.         self.guilds = {}
  28.         self.last = 0
  29.         self.message_handler = message_handler
  30.         self.device = device
  31.         self.ws = websocket.create_connection("wss://gateway.discord.gg/")
  32.         if self.bot:
  33.             self.send(2, {"token": self.auth,
  34.                 "properties": {
  35.                     "os": "linux",
  36.                     "browser": device,
  37.                     "device": device,
  38.                     "referrer": "",
  39.                     "referring_domain": ""
  40.                 },
  41.                 "compress": False,
  42.                 "large_threshold": 250,
  43.                 "shard": [0, 1]
  44.             } )
  45.         else:
  46.             self.send(2, {"token": self.auth,
  47.                 "properties": {
  48.                     "os": "Windows",
  49.                     "browser": "Chrome",
  50.                     "device": "",
  51.                     "referrer": "https://discordapp.com/",
  52.                     "referring_domain": "discordapp.com"
  53.                 },
  54.                 "compress": False,
  55.                 "large_threshold" : 100,
  56.                 "synced_guilds": [],
  57.                 } )
  58.         resp = self.ws.recv()
  59.         try:
  60.             ready = json.loads(resp)
  61.         except ValueError:
  62.             print(resp)
  63.             self.alive = False
  64.         self.session = ready["d"]["session_id"]
  65.         self.interval = ready["d"]["heartbeat_interval"]
  66.         self.last = ready["s"]
  67.         self.thread = Thread(target = self.receive)
  68.         self.thread.start()
  69.         self.heart = Thread(target = self.heartbeat)
  70.         self.heart.start()
  71.                
  72.     def send(self, opcode, data, event = None, sequence = None):
  73.         if opcode != 0:
  74.             payload = json.dumps({"op": int(opcode), "d": data})
  75.             try:
  76.                 return self.ws.send(payload)
  77.             except BrokenPipeError:
  78.                 self.resume()
  79.                 return False
  80.         else:
  81.             payload = json.dumps( {"op": int(opcode), "d": data, "s": sequence, "t": event} )
  82.             try:
  83.                 return self.ws.send(payload)
  84.             except BrokenPipeError:
  85.                 self.resume()
  86.                 return False
  87.    
  88.     def heartbeat(self):
  89.         while self.alive:
  90.             time.sleep(self.interval / 1000)
  91.             self.send(1, self.last)
  92.    
  93.     def resume(self):
  94.         try:
  95.             self.ws = websocket.create_connection("wss://gateway.discord.gg/")
  96.             self.send(6, {"token": self.auth, "session_id": self.session, "seq": self.last} )
  97.         except websocket._exceptions.WebSocketBadStatusException:
  98.             print("Connection failed.")
  99.     def receive(self):
  100.         while self.alive:
  101.             try:
  102.                 message = self.ws.recv()
  103.                 self.handle(message)
  104.             except websocket._exceptions.WebSocketConnectionClosedException:
  105.                 self.resume()
  106.             except ConnectionResetError:
  107.                 self.resume()
  108.    
  109.     def handle(self, message):
  110.         return self.message_handler(self, message)
Advertisement
Add Comment
Please, Sign In to add comment