308 lines
8.4 KiB
Python
308 lines
8.4 KiB
Python
import json
|
|
import os
|
|
import time
|
|
from typing import List, Union
|
|
|
|
from .utils import remove_none
|
|
|
|
|
|
class Payload:
|
|
|
|
def __init__(self, data, clear_none=True):
|
|
if clear_none:
|
|
data = remove_none(data)
|
|
self.data = data
|
|
|
|
def __str__(self):
|
|
return json.dumps(self.data, indent=2)
|
|
|
|
@staticmethod
|
|
def time():
|
|
return time.time()
|
|
|
|
@classmethod
|
|
def set_activity(cls, pid: int = os.getpid(),
|
|
state: str = None, details: str = None,
|
|
start: int = None, end: int = None,
|
|
large_image: str = None, large_text: str = None,
|
|
small_image: str = None, small_text: str = None,
|
|
party_id: str = None, party_size: list = None,
|
|
join: str = None, spectate: str = None,
|
|
match: str = None, buttons: list = None,
|
|
instance: bool = True, activity: Union[bool, None] = True,
|
|
_rn: bool = True):
|
|
|
|
# They should already be an int because we give typehints, but some people are fucking stupid and use
|
|
# IDLE or some other stupid shit.
|
|
if start:
|
|
start = int(start)
|
|
if end:
|
|
end = int(end)
|
|
|
|
if activity is None:
|
|
act_details = None
|
|
clear = True
|
|
else:
|
|
act_details = {
|
|
"state": state,
|
|
"details": details,
|
|
"timestamps": {
|
|
"start": start,
|
|
"end": end
|
|
},
|
|
"assets": {
|
|
"large_image": large_image,
|
|
"large_text": large_text,
|
|
"small_image": small_image,
|
|
"small_text": small_text
|
|
},
|
|
"party": {
|
|
"id": party_id,
|
|
"size": party_size
|
|
},
|
|
"secrets": {
|
|
"join": join,
|
|
"spectate": spectate,
|
|
"match": match
|
|
},
|
|
"buttons": buttons,
|
|
"instance": instance
|
|
}
|
|
clear = False
|
|
|
|
payload = {
|
|
"cmd": "SET_ACTIVITY",
|
|
"args": {
|
|
"pid": pid,
|
|
"activity": act_details
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
if _rn:
|
|
clear = _rn
|
|
return cls(payload, clear)
|
|
|
|
@classmethod
|
|
def authorize(cls, client_id: str, scopes: List[str]):
|
|
payload = {
|
|
"cmd": "AUTHORIZE",
|
|
"args": {
|
|
"client_id": str(client_id),
|
|
"scopes": scopes
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
return cls(payload)
|
|
|
|
@classmethod
|
|
def authenticate(cls, token: str):
|
|
payload = {
|
|
"cmd": "AUTHENTICATE",
|
|
"args": {
|
|
"access_token": token
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload)
|
|
|
|
@classmethod
|
|
def get_guilds(cls):
|
|
payload = {
|
|
"cmd": "GET_GUILDS",
|
|
"args": {
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload)
|
|
|
|
@classmethod
|
|
def get_guild(cls, guild_id: str):
|
|
payload = {
|
|
"cmd": "GET_GUILD",
|
|
"args": {
|
|
"guild_id": str(guild_id),
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload)
|
|
|
|
@classmethod
|
|
def get_channels(cls, guild_id: str):
|
|
payload = {
|
|
"cmd": "GET_CHANNELS",
|
|
"args": {
|
|
"guild_id": str(guild_id),
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload)
|
|
|
|
@classmethod
|
|
def get_channel(cls, channel_id: str):
|
|
payload = {
|
|
"cmd": "GET_CHANNEL",
|
|
"args": {
|
|
"channel_id": str(channel_id),
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload)
|
|
|
|
@classmethod
|
|
def set_user_voice_settings(cls, user_id: str, pan_left: float = None,
|
|
pan_right: float = None, volume: int = None,
|
|
mute: bool = None):
|
|
payload = {
|
|
"cmd": "SET_USER_VOICE_SETTINGS",
|
|
"args": {
|
|
"user_id": str(user_id),
|
|
"pan": {
|
|
"left": pan_left,
|
|
"right": pan_right
|
|
},
|
|
"volume": volume,
|
|
"mute": mute
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload, True)
|
|
|
|
@classmethod
|
|
def select_voice_channel(cls, channel_id: str):
|
|
payload = {
|
|
"cmd": "SELECT_VOICE_CHANNEL",
|
|
"args": {
|
|
"channel_id": str(channel_id),
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload)
|
|
|
|
@classmethod
|
|
def get_selected_voice_channel(cls):
|
|
payload = {
|
|
"cmd": "GET_SELECTED_VOICE_CHANNEL",
|
|
"args": {
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload)
|
|
|
|
@classmethod
|
|
def select_text_channel(cls, channel_id: str):
|
|
payload = {
|
|
"cmd": "SELECT_TEXT_CHANNEL",
|
|
"args": {
|
|
"channel_id": str(channel_id),
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload)
|
|
|
|
@classmethod
|
|
def subscribe(cls, event: str, args=None):
|
|
if args is None:
|
|
args = {}
|
|
payload = {
|
|
"cmd": "SUBSCRIBE",
|
|
"args": args,
|
|
"evt": event.upper(),
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload)
|
|
|
|
@classmethod
|
|
def unsubscribe(cls, event: str, args=None):
|
|
if args is None:
|
|
args = {}
|
|
payload = {
|
|
"cmd": "UNSUBSCRIBE",
|
|
"args": args,
|
|
"evt": event.upper(),
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload)
|
|
|
|
@classmethod
|
|
def get_voice_settings(cls):
|
|
payload = {
|
|
"cmd": "GET_VOICE_SETTINGS",
|
|
"args": {
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload)
|
|
|
|
@classmethod
|
|
def set_voice_settings(cls, _input: dict = None, output: dict = None,
|
|
mode: dict = None, automatic_gain_control: bool = None,
|
|
echo_cancellation: bool = None, noise_suppression: bool = None,
|
|
qos: bool = None, silence_warning: bool = None,
|
|
deaf: bool = None, mute: bool = None):
|
|
payload = {
|
|
"cmd": "SET_VOICE_SETTINGS",
|
|
"args": {
|
|
"input": _input,
|
|
"output": output,
|
|
"mode": mode,
|
|
"automatic_gain_control": automatic_gain_control,
|
|
"echo_cancellation": echo_cancellation,
|
|
"noise_suppression": noise_suppression,
|
|
"qos": qos,
|
|
"silence_warning": silence_warning,
|
|
"deaf": deaf,
|
|
"mute": mute
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload, True)
|
|
|
|
@classmethod
|
|
def capture_shortcut(cls, action: str):
|
|
payload = {
|
|
"cmd": "CAPTURE_SHORTCUT",
|
|
"args": {
|
|
"action": action.upper()
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload)
|
|
|
|
@classmethod
|
|
def send_activity_join_invite(cls, user_id: str):
|
|
payload = {
|
|
"cmd": "SEND_ACTIVITY_JOIN_INVITE",
|
|
"args": {
|
|
"user_id": str(user_id)
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload)
|
|
|
|
@classmethod
|
|
def close_activity_request(cls, user_id: str):
|
|
payload = {
|
|
"cmd": "CLOSE_ACTIVITY_REQUEST",
|
|
"args": {
|
|
"user_id": str(user_id)
|
|
},
|
|
"nonce": '{:.20f}'.format(cls.time())
|
|
}
|
|
|
|
return cls(payload)
|