Skip to content

Instantly share code, notes, and snippets.

@kigiri
Last active April 19, 2021 23:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kigiri/9eac790508dfbcad0fdb929d5748c96b to your computer and use it in GitHub Desktop.
Save kigiri/9eac790508dfbcad0fdb929d5748c96b to your computer and use it in GitHub Desktop.
const ws = new WebSocket(`wss://gateway.discord.gg/?v=8&encoding=json`)
const ONCE = {}
const ON = {}
let s = null
let heartbeatAc
const heartbeat = () => {
console.log('heartbeat')
heartbeatAc = setTimeout(() => {
console.log('the client was ZOMBIFED')
console.log('TODO: try too reconnect+resume!')
Deno.exit(1)
}, 1000)
ws.send(JSON.stringify({ op: 1, d: s }))
}
ws.addEventListener('close', (event) => {
console.log(event)
Deno.exit(1)
})
ws.addEventListener('message', (event) => {
const { t, s, op, d } = JSON.parse(event.data)
switch (op) {
case 0: // DISPATCH
const on = ON[t]
const once = ONCE[t]
if (!on) return
for (const fn of on) fn(d)
for (const fn of once) fn(d)
once.clear()
return
case 1: // HEARTBEAT
return heartbeat()
case 2: // IDENTIFY
return console.log('IDENTIFY', d)
case 3: // STATUSUPDATE
return console.log('STATUSUPDATE', d)
case 4: // VOICESTATEUPDATE
return console.log('VOICESTATEUPDATE', d)
case 6: // RESUME
return console.log('RESUME', d)
case 7: // RECONNECT
return console.log('RECONNECT', d)
case 8: // REQUESTGUILDMEMBERS
return console.log('REQUESTGUILDMEMBERS', d)
case 9: {
// INVALIDSESSION
console.log('Invalid Session, verify your token')
Deno.exit(1)
}
case 10: // HELLO
ws.send(
JSON.stringify({
op: 2, // IDENTIFY
d: {
token: Deno.env.get('BOT_TOKEN'),
intents: 1 << 1, // GUILD_MEMBERS
properties: { $os: 'linux', $browser: 'janus', $device: 'janus' },
},
}),
)
setInterval(heartbeat, d.heartbeat_interval)
return
case 11: // HEARTBEATAC
return clearTimeout(heartbeatAc)
default:
console.log(`OP_${op}`, d)
}
})
const eventTypes = [
//'APPLICATION_COMMAND_CREATE',
//'CHANNEL_CREATE',
//'CHANNEL_DELETE',
//'CHANNEL_UPDATE',
//'GUILD_CREATE',
//'GUILD_DELETE',
//'GUILD_UPDATE',
//'GUILD_BAN_ADD',
//'GUILD_BAN_REMOVE',
//'GUILD_EMOJIS_UPDATE',
//'GUILD_MEMBER_ADD',
//'GUILD_MEMBER_REMOVE',
'GUILD_MEMBER_UPDATE',
//'GUILD_MEMBERS_CHUNK',
//'GUILD_ROLE_CREATE',
//'GUILD_ROLE_DELETE',
//'GUILD_ROLE_UPDATE',
//'INTERACTION_CREATE',
//'MESSAGE_CREATE',
//'MESSAGE_DELETE',
//'MESSAGE_DELETE_BULK',
//'MESSAGE_UPDATE',
//'MESSAGE_REACTION_ADD',
//'MESSAGE_REACTION_REMOVE',
//'MESSAGE_REACTION_REMOVE_ALL',
//'MESSAGE_REACTION_REMOVE_EMOJI',
//'PRESENCE_UPDATE',
'READY',
//'TYPING_START',
//'USER_UPDATE',
//'VOICE_STATE_UPDATE',
//'WEBHOOKS_UPDATE',
]
const janus = { once: {}, on: {} }
for (const type of eventTypes) {
const on = (ON[type] = new Set())
const once = (ONCE[type] = new Set())
const next = (fn) => once.add(fn)
janus.on[type] = (fn) => on.add(fn)
janus.once[type] = () => new Promise(next)
}
await janus.once.READY()
console.log('ready!')
janus.on.GUILD_MEMBER_UPDATE(({ user, roles }) => {
console.log(user.id, 'has', roles.length, 'roles')
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment