Try to remove those anys (NOT TESTED)

This commit is contained in:
Helloyunho 2020-11-25 20:53:40 +09:00
parent ce444630d0
commit be2945c5eb
16 changed files with 206 additions and 149 deletions

View file

@ -1,13 +1,17 @@
import { Gateway, GatewayEventHandler } from '../index.ts' import { Gateway, GatewayEventHandler } from '../index.ts'
import getChannelByType from '../../utils/getChannelByType.ts' import getChannelByType from '../../utils/getChannelByType.ts'
import { ChannelPayload } from '../../types/channel.ts' import { ChannelPayload, GuildChannelPayload } from '../../types/channel.ts'
import { Guild } from "../../structures/guild.ts" import { Guild } from '../../structures/guild.ts'
export const channelCreate: GatewayEventHandler = async ( export const channelCreate: GatewayEventHandler = async (
gateway: Gateway, gateway: Gateway,
d: ChannelPayload d: ChannelPayload
) => { ) => {
const guild: undefined | Guild = (d as any).guild_id !== undefined ? await gateway.client.guilds.get((d as any).guild_id) : undefined const guild: undefined | Guild =
'guild_id' in d
? // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
await gateway.client.guilds.get((d as GuildChannelPayload).guild_id)
: undefined
const channel = getChannelByType(gateway.client, d, guild) const channel = getChannelByType(gateway.client, d, guild)
if (channel !== undefined) { if (channel !== undefined) {
await gateway.client.channels.set(d.id, d) await gateway.client.channels.set(d.id, d)

View file

@ -1,9 +1,8 @@
import { Gateway, GatewayEventHandler } from '../index.ts' import { Gateway, GatewayEventHandler } from '../index.ts'
import { Guild } from '../../structures/guild.ts' import { Guild } from '../../structures/guild.ts'
import { GuildPayload, MemberPayload } from '../../types/guild.ts' import { GuildPayload } from '../../types/guild.ts'
import { MembersManager } from '../../managers/members.ts' import { MembersManager } from '../../managers/members.ts'
import { GuildChannelPayload } from '../../types/channel.ts' import { GuildChannelPayload } from '../../types/channel.ts'
import { RolePayload } from '../../types/role.ts'
import { RolesManager } from '../../managers/roles.ts' import { RolesManager } from '../../managers/roles.ts'
export const guildCreate: GatewayEventHandler = async ( export const guildCreate: GatewayEventHandler = async (
@ -17,7 +16,7 @@ export const guildCreate: GatewayEventHandler = async (
if (d.members !== undefined) { if (d.members !== undefined) {
const members = new MembersManager(gateway.client, guild) const members = new MembersManager(gateway.client, guild)
await members.fromPayload(d.members as MemberPayload[]) await members.fromPayload(d.members)
guild.members = members guild.members = members
} }
@ -30,7 +29,7 @@ export const guildCreate: GatewayEventHandler = async (
if (d.roles !== undefined) { if (d.roles !== undefined) {
const roles = new RolesManager(gateway.client, guild) const roles = new RolesManager(gateway.client, guild)
await roles.fromPayload(d.roles as RolePayload[]) await roles.fromPayload(d.roles)
guild.roles = roles guild.roles = roles
} }
@ -39,15 +38,15 @@ export const guildCreate: GatewayEventHandler = async (
await gateway.client.guilds.set(d.id, d) await gateway.client.guilds.set(d.id, d)
guild = new Guild(gateway.client, d) guild = new Guild(gateway.client, d)
if ((d as any).members !== undefined) { if (d.members !== undefined) {
const members = new MembersManager(gateway.client, guild) const members = new MembersManager(gateway.client, guild)
await members.fromPayload(d.members as MemberPayload[]) await members.fromPayload(d.members)
guild.members = members guild.members = members
} }
if (d.channels !== undefined) { if (d.channels !== undefined) {
for (const ch of d.channels as GuildChannelPayload[]) { for (const ch of d.channels as GuildChannelPayload[]) {
;(ch as any).guild_id = d.id ch.guild_id = d.id
await gateway.client.channels.set(ch.id, ch) await gateway.client.channels.set(ch.id, ch)
} }
} }

View file

@ -3,7 +3,7 @@ import { Guild } from '../../structures/guild.ts'
export const guildMemberAdd: GatewayEventHandler = async ( export const guildMemberAdd: GatewayEventHandler = async (
gateway: Gateway, gateway: Gateway,
d: any d:
) => { ) => {
const guild: Guild | undefined = await gateway.client.guilds.get(d.guild_id) const guild: Guild | undefined = await gateway.client.guilds.get(d.guild_id)
// Weird case, shouldn't happen // Weird case, shouldn't happen

View file

@ -1,17 +1,18 @@
import { Gateway, GatewayEventHandler } from '../index.ts' import { Gateway, GatewayEventHandler } from '../index.ts'
import { Guild } from '../../structures/guild.ts' import { Guild } from '../../structures/guild.ts'
import { User } from "../../structures/user.ts" import { User } from '../../structures/user.ts'
import { GuildMemberRemovePayload } from '../../types/gateway.ts'
export const guildMemberRemove: GatewayEventHandler = async ( export const guildMemberRemove: GatewayEventHandler = async (
gateway: Gateway, gateway: Gateway,
d: any d: GuildMemberRemovePayload
) => { ) => {
const guild: Guild | undefined = await gateway.client.guilds.get(d.guild_id) const guild: Guild | undefined = await gateway.client.guilds.get(d.guild_id)
// Weird case, shouldn't happen // Weird case, shouldn't happen
if (guild === undefined) return if (guild === undefined) return
const member = await guild.members.get(d.id) const member = await guild.members.get(d.user.id)
await guild.members.delete(d.id) await guild.members.delete(d.user.id)
if (member !== undefined) gateway.client.emit('guildMemberRemove', member) if (member !== undefined) gateway.client.emit('guildMemberRemove', member)
else { else {

View file

@ -1,19 +1,31 @@
import { Gateway, GatewayEventHandler } from '../index.ts' import { Gateway, GatewayEventHandler } from '../index.ts'
import { Guild } from '../../structures/guild.ts' import { Guild } from '../../structures/guild.ts'
import { GuildMemberUpdatePayload } from '../../types/gateway.ts'
import { MemberPayload } from '../../types/guild.ts'
export const guildMemberUpdate: GatewayEventHandler = async ( export const guildMemberUpdate: GatewayEventHandler = async (
gateway: Gateway, gateway: Gateway,
d: any d: GuildMemberUpdatePayload
) => { ) => {
const guild: Guild | undefined = await gateway.client.guilds.get(d.guild_id) const guild: Guild | undefined = await gateway.client.guilds.get(d.guild_id)
// Weird case, shouldn't happen // Weird case, shouldn't happen
if (guild === undefined) return if (guild === undefined) return
const member = await guild.members.get(d.id) const member = await guild.members.get(d.user.id)
await guild.members.set(d.id, d) const newMemberPayload: MemberPayload = {
const newMember = await guild.members.get(d.id) user: d.user,
roles: d.roles,
joined_at: d.joined_at,
nick: d.nick,
premium_since: d.premium_since,
deaf: member?.deaf ?? false,
mute: member?.mute ?? false
}
await guild.members.set(d.user.id, newMemberPayload)
const newMember = await guild.members.get(d.user.id)
if (member !== undefined) gateway.client.emit('guildMemberRemove', member, newMember) if (member !== undefined)
gateway.client.emit('guildMemberRemove', member, newMember)
else { else {
gateway.client.emit('guildMemberUpdateUncached', newMember) gateway.client.emit('guildMemberUpdateUncached', newMember)
} }

View file

@ -26,7 +26,7 @@ export const messageCreate: GatewayEventHandler = async (
await guild.members.set(d.author.id, d.member) await guild.members.set(d.author.id, d.member)
member = await guild.members.get(d.author.id) member = await guild.members.get(d.author.id)
} }
const message = new Message(gateway.client, d, channel as any, user) const message = new Message(gateway.client, d, channel, user)
if (guild !== undefined) message.guild = guild if (guild !== undefined) message.guild = guild
await message.mentions.fromPayload(d) await message.mentions.fromPayload(d)
message.member = member message.member = member

View file

@ -1,11 +1,12 @@
import { Message } from "../../structures/message.ts" import { Message } from '../../structures/message.ts'
import { TextChannel } from '../../structures/textChannel.ts' import { TextChannel } from '../../structures/textChannel.ts'
import { User } from "../../structures/user.ts" import { User } from '../../structures/user.ts'
import { MessagePayload } from '../../types/channel.ts'
import { Gateway, GatewayEventHandler } from '../index.ts' import { Gateway, GatewayEventHandler } from '../index.ts'
export const messageUpdate: GatewayEventHandler = async ( export const messageUpdate: GatewayEventHandler = async (
gateway: Gateway, gateway: Gateway,
d: any d: MessagePayload
) => { ) => {
let channel = await gateway.client.channels.get<TextChannel>(d.channel_id) let channel = await gateway.client.channels.get<TextChannel>(d.channel_id)
// Fetch the channel if not cached // Fetch the channel if not cached
@ -14,7 +15,10 @@ export const messageUpdate: GatewayEventHandler = async (
channel = (await gateway.client.channels.fetch(d.channel_id)) as TextChannel channel = (await gateway.client.channels.fetch(d.channel_id)) as TextChannel
const message = await channel.messages.get(d.id) const message = await channel.messages.get(d.id)
const author = message?.author !== undefined ? message.author : new User(gateway.client, d) const author =
message?.author !== undefined
? message.author
: new User(gateway.client, d.author)
const newMsg = new Message(gateway.client, d, channel, author) const newMsg = new Message(gateway.client, d, channel, author)
if (message === undefined) { if (message === undefined) {
await channel.messages.set(d.id, d) await channel.messages.set(d.id, d)

View file

@ -1,15 +1,19 @@
import { User } from '../../structures/user.ts' import { User } from '../../structures/user.ts'
import { Ready } from "../../types/gateway.ts"
import { GuildPayload } from '../../types/guild.ts' import { GuildPayload } from '../../types/guild.ts'
import { Gateway, GatewayEventHandler } from '../index.ts' import { Gateway, GatewayEventHandler } from '../index.ts'
export const ready: GatewayEventHandler = async (gateway: Gateway, d: any) => { export const ready: GatewayEventHandler = async (gateway: Gateway, d: Ready) => {
await gateway.client.guilds.flush() await gateway.client.guilds.flush()
gateway.client.user = new User(gateway.client, d.user) gateway.client.user = new User(gateway.client, d.user)
gateway.sessionID = d.session_id gateway.sessionID = d.session_id
gateway.debug(`Received READY. Session: ${gateway.sessionID}`) gateway.debug(`Received READY. Session: ${gateway.sessionID}`)
await gateway.cache.set("session_id", gateway.sessionID) await gateway.cache.set("session_id", gateway.sessionID)
d.guilds.forEach((guild: GuildPayload) => { d.guilds.forEach((guild: GuildPayload) => {
gateway.client.guilds.set(guild.id, guild) gateway.client.guilds.set(guild.id, guild)
}) })
gateway.client.emit('ready') gateway.client.emit('ready')
} }

View file

@ -1,10 +1,18 @@
import { User } from '../../structures/user.ts' import { User } from '../../structures/user.ts'
import { CLIENT_USER } from '../../types/endpoint.ts' import { CLIENT_USER } from '../../types/endpoint.ts'
import { Resume } from '../../types/gateway.ts'
import { Gateway, GatewayEventHandler } from '../index.ts' import { Gateway, GatewayEventHandler } from '../index.ts'
export const resume: GatewayEventHandler = async (gateway: Gateway, d: any) => { export const resume: GatewayEventHandler = async (
gateway: Gateway,
d: Resume
) => {
gateway.debug(`Session Resumed!`) gateway.debug(`Session Resumed!`)
gateway.client.emit('resume') gateway.client.emit('resume')
if (gateway.client.user === undefined) gateway.client.user = new User(gateway.client, await gateway.client.rest.get(CLIENT_USER())) if (gateway.client.user === undefined)
gateway.client.user = new User(
gateway.client,
await gateway.client.rest.get(CLIENT_USER())
)
gateway.client.emit('ready') gateway.client.emit('ready')
} }

View file

@ -8,13 +8,14 @@ import { GatewayResponse } from '../types/gatewayResponse.ts'
import { import {
GatewayOpcodes, GatewayOpcodes,
GatewayIntents, GatewayIntents,
GatewayCloseCodes GatewayCloseCodes,
IdentityPayload,
StatusUpdatePayload
} from '../types/gateway.ts' } from '../types/gateway.ts'
import { gatewayHandlers } from './handlers/index.ts' import { gatewayHandlers } from './handlers/index.ts'
import { GATEWAY_BOT } from '../types/endpoint.ts' import { GATEWAY_BOT } from '../types/endpoint.ts'
import { GatewayCache } from '../managers/gatewayCache.ts' import { GatewayCache } from '../managers/gatewayCache.ts'
import { ClientActivityPayload } from '../structures/presence.ts' import { delay } from '../utils/delay.ts'
import { delay } from "../utils/delay.ts"
/** /**
* Handles Discord gateway connection. * Handles Discord gateway connection.
@ -181,7 +182,9 @@ class Gateway {
} else if (event.code === GatewayCloseCodes.DISALLOWED_INTENTS) { } else if (event.code === GatewayCloseCodes.DISALLOWED_INTENTS) {
throw new Error("Given Intents aren't allowed") throw new Error("Given Intents aren't allowed")
} else { } else {
this.debug('Unknown Close code, probably connection error. Reconnecting in 5s.') this.debug(
'Unknown Close code, probably connection error. Reconnecting in 5s.'
)
await delay(5000) await delay(5000)
// eslint-disable-next-line @typescript-eslint/no-floating-promises // eslint-disable-next-line @typescript-eslint/no-floating-promises
this.reconnect() this.reconnect()
@ -217,9 +220,7 @@ class Gateway {
} }
} }
const payload: any = { const payload: IdentityPayload = {
op: GatewayOpcodes.IDENTIFY,
d: {
token: this.token, token: this.token,
properties: { properties: {
$os: Deno.build.os, $os: Deno.build.os,
@ -234,23 +235,24 @@ class Gateway {
), ),
presence: this.client.presence.create() presence: this.client.presence.create()
} }
}
if (this.client.bot === false) { if (this.client.bot === false) {
this.debug('Modify Identify Payload for Self-bot..') this.debug('Modify Identify Payload for Self-bot..')
delete payload.d.intents delete payload.intents
payload.d.presence = null payload.presence = undefined
payload.d.properties = { payload.properties = {
$os: 'Windows', $os: 'windows',
$browser: 'Firefox', $browser: 'Firefox',
$device: '', $device: '',
$referrer: '', $referrer: '',
$referring_domain: '' $referring_domain: ''
} }
payload.d.synced_guilds = []
} }
this.send(payload) this.send({
op: GatewayOpcodes.IDENTIFY,
d: payload
})
} }
private async sendResume (): Promise<void> { private async sendResume (): Promise<void> {
@ -313,7 +315,7 @@ class Gateway {
return true return true
} }
sendPresence (data: ClientActivityPayload): void { sendPresence (data: StatusUpdatePayload): void {
this.send({ this.send({
op: GatewayOpcodes.PRESENCE_UPDATE, op: GatewayOpcodes.PRESENCE_UPDATE,
d: data d: data

View file

@ -33,7 +33,8 @@ export class BaseManager<T, T2> {
} }
async array (): Promise<undefined | T2[]> { async array (): Promise<undefined | T2[]> {
const arr = await (this.client.cache.array(this.cacheName) as T[]) let arr = await (this.client.cache.array(this.cacheName) as T[])
if (arr === undefined) arr = []
return arr.map(e => new this.DataType(this.client, e)) as any return arr.map(e => new this.DataType(this.client, e)) as any
} }

View file

@ -1,13 +1,13 @@
import { Client } from '../models/client.ts' import { Client } from '../models/client.ts'
import { Channel } from '../structures/channel.ts' import { Channel } from '../structures/channel.ts'
import { ChannelPayload } from '../types/channel.ts' import { ChannelPayload, GuildChannelPayload } from '../types/channel.ts'
import { CHANNEL } from '../types/endpoint.ts' import { CHANNEL } from '../types/endpoint.ts'
import getChannelByType from '../utils/getChannelByType.ts' import getChannelByType from '../utils/getChannelByType.ts'
import { BaseManager } from './base.ts' import { BaseManager } from './base.ts'
export class ChannelsManager extends BaseManager<ChannelPayload, Channel> { export class ChannelsManager extends BaseManager<ChannelPayload, Channel> {
constructor (client: Client) { constructor (client: Client) {
super(client, "channels", Channel) super(client, 'channels', Channel)
} }
// Override get method as Generic // Override get method as Generic
@ -15,20 +15,28 @@ export class ChannelsManager extends BaseManager<ChannelPayload, Channel> {
const data = await this._get(key) const data = await this._get(key)
if (data === undefined) return if (data === undefined) return
let guild let guild
if ((data as any).guild_id !== undefined) { if ('guild_id' in data) {
guild = await this.client.guilds.get((data as any).guild_id) guild = await this.client.guilds.get(
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
(data as GuildChannelPayload).guild_id
)
} }
const res = getChannelByType(this.client, data, guild) const res = getChannelByType(this.client, data, guild)
return res as any return res as any
} }
async array (): Promise<undefined | Channel[]> { async array (): Promise<undefined | Channel[]> {
const arr = await (this.client.cache.array(this.cacheName) as ChannelPayload[]) const arr = await (this.client.cache.array(
this.cacheName
) as ChannelPayload[])
const result: any[] = [] const result: any[] = []
for (const elem of arr) { for (const elem of arr) {
let guild let guild
if ((elem as any).guild_id !== undefined) { if ('guild_id' in elem) {
guild = await this.client.guilds.get((elem as any).guild_id) guild = await this.client.guilds.get(
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
(elem as GuildChannelPayload).guild_id
)
} }
result.push(getChannelByType(this.client, elem, guild)) result.push(getChannelByType(this.client, elem, guild))
} }
@ -37,14 +45,17 @@ export class ChannelsManager extends BaseManager<ChannelPayload, Channel> {
async fetch (id: string): Promise<Channel> { async fetch (id: string): Promise<Channel> {
return await new Promise((resolve, reject) => { return await new Promise((resolve, reject) => {
this.client.rest.get(CHANNEL(id)).then(async data => { this.client.rest
.get(CHANNEL(id))
.then(async data => {
this.set(id, data as ChannelPayload) this.set(id, data as ChannelPayload)
let guild let guild
if (data.guild_id !== undefined) { if (data.guild_id !== undefined) {
guild = await this.client.guilds.get(data.guild_id) guild = await this.client.guilds.get(data.guild_id)
} }
resolve(getChannelByType(this.client, data as ChannelPayload, guild)) resolve(getChannelByType(this.client, data as ChannelPayload, guild))
}).catch(e => reject(e)) })
.catch(e => reject(e))
}) })
} }
} }

View file

@ -1,33 +1,13 @@
export type ActivityType = 'PLAYING' | 'STREAMING' | 'LISTENING' | 'WATCHING' | 'CUSTOM_STATUS' | 'COMPETING'; import { ActivityGame, ClientActivity, StatusType } from '../types/presence.ts'
export type StatusType = 'online' | 'invisible' | 'offline' | 'idle' | 'dnd'; import { StatusUpdatePayload } from '../types/gateway.ts'
export enum ActivityTypes { enum ActivityTypes {
PLAYING = 0, PLAYING = 0,
STREAMING = 1, STREAMING = 1,
LISTENING = 2, LISTENING = 2,
WATCHING = 3, WATCHING = 3,
CUSTOM_STATUS = 4, CUSTOM_STATUS = 4,
COMPETING = 5, COMPETING = 5
}
export interface ActivityGame {
name: string;
type: 0 | 1 | 2 | 3 | 4 | 5 | ActivityType;
url?: string;
}
export interface ClientActivity {
status?: StatusType
activity?: ActivityGame | ActivityGame[]
since?: number | null
afk?: boolean
}
export interface ClientActivityPayload {
status: StatusType
activities: ActivityGame[] | null
since: number | null
afk: boolean
} }
export class ClientPresence { export class ClientPresence {
@ -36,12 +16,11 @@ export class ClientPresence {
since?: number | null since?: number | null
afk?: boolean afk?: boolean
constructor(data?: ClientActivity | ClientActivityPayload | ActivityGame) { constructor (data?: ClientActivity | StatusUpdatePayload | ActivityGame) {
if (data !== undefined) { if (data !== undefined) {
if ((data as ClientActivity).activity !== undefined) { if ((data as ClientActivity).activity !== undefined) {
Object.assign(this, data) Object.assign(this, data)
} else if ((data as ClientActivityPayload).activities !== undefined) { } else if ((data as StatusUpdatePayload).activities !== undefined) {
} else if ((data as ActivityGame).name !== undefined) { } else if ((data as ActivityGame).name !== undefined) {
if (this.activity === undefined) { if (this.activity === undefined) {
this.activity = data as ActivityGame this.activity = data as ActivityGame
@ -52,7 +31,7 @@ export class ClientPresence {
} }
} }
parse(payload: ClientActivityPayload): ClientPresence { parse (payload: StatusUpdatePayload): ClientPresence {
this.afk = payload.afk this.afk = payload.afk
this.activity = payload.activities ?? undefined this.activity = payload.activities ?? undefined
this.since = payload.since this.since = payload.since
@ -60,11 +39,11 @@ export class ClientPresence {
return this return this
} }
static parse(payload: ClientActivityPayload): ClientPresence { static parse (payload: StatusUpdatePayload): ClientPresence {
return new ClientPresence().parse(payload) return new ClientPresence().parse(payload)
} }
create(): ClientActivityPayload { create (): StatusUpdatePayload {
return { return {
afk: this.afk === undefined ? false : this.afk, afk: this.afk === undefined ? false : this.afk,
activities: this.createActivity(), activities: this.createActivity(),
@ -75,11 +54,16 @@ export class ClientPresence {
createActivity (): ActivityGame[] | null { createActivity (): ActivityGame[] | null {
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
const activity = this.activity === undefined ? null : (this.activity instanceof Array ? this.activity : [this.activity]) || null const activity =
this.activity === undefined
? null
: this.activity instanceof Array
? this.activity
: [this.activity]
if (activity === null) return activity if (activity === null) return activity
else { else {
activity.map(e => { activity.map(e => {
if (typeof e.type === "string") e.type = ActivityTypes[e.type] if (typeof e.type === 'string') e.type = ActivityTypes[e.type]
return e return e
}) })
return activity return activity

View file

@ -100,10 +100,10 @@ export interface MessagePayload {
export interface MessageOption { export interface MessageOption {
tts?: boolean tts?: boolean
embed: Embed embed?: Embed
file?: Attachment file?: Attachment
allowedMention?: { allowedMention?: {
parse: ['everyone', 'users', 'roles'] parse: 'everyone' | 'users' | 'roles'
roles: string[] roles: string[]
users: string[] users: string[]
} }

View file

@ -1,9 +1,13 @@
// https://discord.com/developers/docs/topics/opcodes-and-status-codes#gateway // https://discord.com/developers/docs/topics/opcodes-and-status-codes#gateway
// https://discord.com/developers/docs/topics/gateway#commands-and-events-gateway-events // https://discord.com/developers/docs/topics/gateway#commands-and-events-gateway-events
import { StatusType } from '../../mod.ts'
import { EmojiPayload } from './emoji.ts' import { EmojiPayload } from './emoji.ts'
import { MemberPayload } from './guild.ts' import { MemberPayload } from './guild.ts'
import { ActivityPayload } from './presence.ts' import {
ActivityGame,
ActivityPayload,
StatusType,
ClientStatus
} from './presence.ts'
import { RolePayload } from './role.ts' import { RolePayload } from './role.ts'
import { UserPayload } from './user.ts' import { UserPayload } from './user.ts'
@ -107,23 +111,17 @@ export interface IdentityPayload {
compress?: boolean compress?: boolean
large_threshold?: number large_threshold?: number
shard?: number[] shard?: number[]
presence?: UpdateStatus presence?: StatusUpdatePayload
guildSubscriptions?: boolean guildSubscriptions?: boolean
intents: number intents?: number
}
export enum UpdateStatus {
online = 'online',
dnd = 'dnd',
afk = 'idle',
invisible = 'invisible',
offline = 'offline'
} }
export interface IdentityConnection { export interface IdentityConnection {
$os: 'darwin' | 'windows' | 'linux' | 'custom os' $os: 'darwin' | 'windows' | 'linux' | 'custom os'
$browser: 'harmony' $browser: 'harmony' | 'Firefox'
$device: 'harmony' $device: 'harmony' | ''
$referrer?: ''
$referring_domain?: ''
} }
export interface Resume { export interface Resume {
@ -159,7 +157,7 @@ export interface Hello {
heartbeat_interval: number heartbeat_interval: number
} }
export interface ReadyEvent { export interface Ready {
v: number v: number
user: UserPayload user: UserPayload
privateChannels: [] privateChannels: []
@ -294,7 +292,14 @@ export interface PresenceUpdatePayload {
guild_id: string guild_id: string
status: StatusType status: StatusType
activities: ActivityPayload[] activities: ActivityPayload[]
client_status: UpdateStatus[] client_status: ClientStatus
}
export interface StatusUpdatePayload {
status: StatusType
activities: ActivityGame[] | null
since: number | null
afk: boolean
} }
export interface TypeStart { export interface TypeStart {

View file

@ -1,7 +1,7 @@
export interface ClientStatus { export interface ClientStatus {
desktop?: string desktop?: StatusType
mobile?: string mobile?: StatusType
web?: string web?: StatusType
} }
export interface ActivityPayload { export interface ActivityPayload {
@ -58,3 +58,25 @@ export enum ActivityFlags {
SYNC = 1 << 4, SYNC = 1 << 4,
PLAY = 1 << 5 PLAY = 1 << 5
} }
export type ActivityType =
| 'PLAYING'
| 'STREAMING'
| 'LISTENING'
| 'WATCHING'
| 'CUSTOM_STATUS'
| 'COMPETING'
export type StatusType = 'online' | 'invisible' | 'offline' | 'idle' | 'dnd'
export interface ActivityGame {
name: string
type: 0 | 1 | 2 | 3 | 4 | 5 | ActivityType
url?: string
}
export interface ClientActivity {
status?: StatusType
activity?: ActivityGame | ActivityGame[]
since?: number | null
afk?: boolean
}