add updateRefs
This commit is contained in:
parent
57863a6ed5
commit
950243af5c
5 changed files with 146 additions and 24 deletions
|
@ -23,6 +23,14 @@ export class MessageReactionsManager extends BaseManager<
|
||||||
this.message = message
|
this.message = message
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async updateRefs(): Promise<void> {
|
||||||
|
const newVal = await this.message.channel.messages.get(this.message.id)
|
||||||
|
if (newVal !== undefined) {
|
||||||
|
this.message = newVal
|
||||||
|
}
|
||||||
|
await this.message.updateRefs()
|
||||||
|
}
|
||||||
|
|
||||||
async get(id: string): Promise<MessageReaction | undefined> {
|
async get(id: string): Promise<MessageReaction | undefined> {
|
||||||
const raw = await this._get(id)
|
const raw = await this._get(id)
|
||||||
if (raw === undefined) return
|
if (raw === undefined) return
|
||||||
|
@ -32,6 +40,7 @@ export class MessageReactionsManager extends BaseManager<
|
||||||
let emoji = await this.client.emojis.get(emojiID as string)
|
let emoji = await this.client.emojis.get(emojiID as string)
|
||||||
if (emoji === undefined) emoji = new Emoji(this.client, raw.emoji)
|
if (emoji === undefined) emoji = new Emoji(this.client, raw.emoji)
|
||||||
|
|
||||||
|
await this.updateRefs()
|
||||||
const reaction = new MessageReaction(this.client, raw, this.message, emoji)
|
const reaction = new MessageReaction(this.client, raw, this.message, emoji)
|
||||||
return reaction
|
return reaction
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,18 +93,12 @@ export class MessagesManager extends BaseManager<MessagePayload, Message> {
|
||||||
if (channel === undefined)
|
if (channel === undefined)
|
||||||
channel = await this.client.channels.fetch(this.channel.id)
|
channel = await this.client.channels.fetch(this.channel.id)
|
||||||
|
|
||||||
const author = new User(this.client, (data as MessagePayload).author)
|
|
||||||
await this.client.users.set(
|
await this.client.users.set(
|
||||||
author.id,
|
data.author.id,
|
||||||
(data as MessagePayload).author
|
(data as MessagePayload).author
|
||||||
)
|
)
|
||||||
|
|
||||||
const res = new Message(
|
const res = (await this.get(data.id)) as Message
|
||||||
this.client,
|
|
||||||
data as MessagePayload,
|
|
||||||
channel as TextChannel,
|
|
||||||
author
|
|
||||||
)
|
|
||||||
|
|
||||||
await res.mentions.fromPayload(data)
|
await res.mentions.fromPayload(data)
|
||||||
|
|
||||||
|
|
|
@ -1,26 +1,112 @@
|
||||||
import { Guild } from '../structures/guild.ts'
|
import { Guild } from '../structures/guild.ts'
|
||||||
import { VoiceChannel } from '../structures/guildVoiceChannel.ts'
|
import {
|
||||||
|
VoiceChannel,
|
||||||
|
VoiceServerData
|
||||||
|
} from '../structures/guildVoiceChannel.ts'
|
||||||
|
import { VoiceOpcodes } from '../types/voice.ts'
|
||||||
|
import { Collection } from '../utils/collection.ts'
|
||||||
|
import { HarmonyEventEmitter } from '../utils/events.ts'
|
||||||
import { Client } from './client.ts'
|
import { Client } from './client.ts'
|
||||||
|
|
||||||
export interface VoiceOptions {
|
export interface VoiceOptions {
|
||||||
guild: Guild
|
|
||||||
channel: VoiceChannel
|
channel: VoiceChannel
|
||||||
|
data: VoiceServerData
|
||||||
|
manager: VoiceConnectionsManager
|
||||||
}
|
}
|
||||||
|
|
||||||
export class VoiceClient {
|
export class VoiceConnectionsManager {
|
||||||
|
client: Client
|
||||||
|
connections: Collection<string, VoiceConnection> = new Collection()
|
||||||
|
|
||||||
|
constructor(client: Client) {
|
||||||
|
this.client = client
|
||||||
|
}
|
||||||
|
|
||||||
|
async establish(options: VoiceOptions): Promise<VoiceConnection> {
|
||||||
|
if (this.connections.has(options.channel.guild.id) === true)
|
||||||
|
throw new Error('Voice Connection already established')
|
||||||
|
const conn = new VoiceConnection(this, options)
|
||||||
|
this.connections.set(options.channel.guild.id, conn)
|
||||||
|
await conn.connect()
|
||||||
|
return conn
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
|
||||||
|
export type VoiceConnectionEvents = {
|
||||||
|
ready: []
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Represents a Voice Connection made through a Voice Channel */
|
||||||
|
export class VoiceConnection extends HarmonyEventEmitter<VoiceConnectionEvents> {
|
||||||
client: Client
|
client: Client
|
||||||
ws?: WebSocket
|
ws?: WebSocket
|
||||||
guild: Guild
|
guild: Guild
|
||||||
channel: VoiceChannel
|
channel: VoiceChannel
|
||||||
|
data: VoiceServerData
|
||||||
|
manager: VoiceConnectionsManager
|
||||||
|
ssrc?: number
|
||||||
|
ip?: string
|
||||||
|
port?: number
|
||||||
|
|
||||||
constructor(client: Client, options: VoiceOptions) {
|
constructor(manager: VoiceConnectionsManager, options: VoiceOptions) {
|
||||||
this.client = client
|
super()
|
||||||
this.guild = options.guild
|
this.client = manager.client
|
||||||
|
this.manager = manager
|
||||||
this.channel = options.channel
|
this.channel = options.channel
|
||||||
|
this.guild = options.channel.guild
|
||||||
|
this.data = options.data
|
||||||
}
|
}
|
||||||
|
|
||||||
async connect(): Promise<VoiceClient> {
|
/** Connect to Voice Server */
|
||||||
// TODO(DjDeveloperr): understand docs
|
async connect(): Promise<VoiceConnection> {
|
||||||
|
this.ws = new WebSocket(`wss://${this.data.endpoint}`)
|
||||||
|
this.ws.binaryType = 'arraybuffer'
|
||||||
|
this.ws.onopen = this.onopen.bind(this)
|
||||||
|
this.ws.onclose = this.onclose.bind(this)
|
||||||
|
this.ws.onmessage = this.onmessage.bind(this)
|
||||||
|
this.ws.onerror = this.onerror.bind(this)
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private send(data: { op: VoiceOpcodes; d: any }): void {
|
||||||
|
this.ws?.send(JSON.stringify(data))
|
||||||
|
}
|
||||||
|
|
||||||
|
private sendIdentify(): void {
|
||||||
|
this.send({
|
||||||
|
op: VoiceOpcodes.IDENTIFY,
|
||||||
|
d: {
|
||||||
|
server_id: this.guild.id,
|
||||||
|
user_id: this.client.user?.id,
|
||||||
|
session_id: this.data.sessionID,
|
||||||
|
token: this.data.token
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private onopen(): void {
|
||||||
|
this.sendIdentify()
|
||||||
|
}
|
||||||
|
|
||||||
|
private onclose(): void {}
|
||||||
|
|
||||||
|
private onmessage(e: MessageEvent): void {
|
||||||
|
const data = JSON.parse(e.data)
|
||||||
|
if (typeof data !== 'object') return
|
||||||
|
|
||||||
|
switch (data.op) {
|
||||||
|
case VoiceOpcodes.READY:
|
||||||
|
this.ssrc = data.d.ssrc
|
||||||
|
this.ip = data.d.ip
|
||||||
|
this.port = data.d.port
|
||||||
|
this.emit('ready')
|
||||||
|
break
|
||||||
|
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private onerror(): void {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,10 @@ import { Channel } from './channel.ts'
|
||||||
import { Guild } from './guild.ts'
|
import { Guild } from './guild.ts'
|
||||||
import { VoiceState } from './voiceState.ts'
|
import { VoiceState } from './voiceState.ts'
|
||||||
|
|
||||||
|
export interface VoiceServerData extends VoiceServerUpdateData {
|
||||||
|
sessionID: string
|
||||||
|
}
|
||||||
|
|
||||||
export class VoiceChannel extends Channel {
|
export class VoiceChannel extends Channel {
|
||||||
bitrate: string
|
bitrate: string
|
||||||
userLimit: number
|
userLimit: number
|
||||||
|
@ -32,13 +36,15 @@ export class VoiceChannel extends Channel {
|
||||||
this.guild = guild
|
this.guild = guild
|
||||||
this.permissionOverwrites = data.permission_overwrites
|
this.permissionOverwrites = data.permission_overwrites
|
||||||
this.parentID = data.parent_id
|
this.parentID = data.parent_id
|
||||||
// TODO: Cache in Gateway Event Code
|
|
||||||
// cache.set('guildvoicechannel', this.id, this)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async join(options?: VoiceStateOptions): Promise<VoiceServerUpdateData> {
|
/** Join the Voice Channel */
|
||||||
|
async join(
|
||||||
|
options?: VoiceStateOptions & { onlyJoin?: boolean }
|
||||||
|
): Promise<VoiceServerUpdateData> {
|
||||||
return await new Promise((resolve, reject) => {
|
return await new Promise((resolve, reject) => {
|
||||||
let vcdata: VoiceServerUpdateData | undefined
|
let vcdata: VoiceServerData
|
||||||
|
let sessionID: string
|
||||||
let done = 0
|
let done = 0
|
||||||
|
|
||||||
const onVoiceStateAdd = (state: VoiceState): void => {
|
const onVoiceStateAdd = (state: VoiceState): void => {
|
||||||
|
@ -46,15 +52,24 @@ export class VoiceChannel extends Channel {
|
||||||
if (state.channel?.id !== this.id) return
|
if (state.channel?.id !== this.id) return
|
||||||
this.client.off('voiceStateAdd', onVoiceStateAdd)
|
this.client.off('voiceStateAdd', onVoiceStateAdd)
|
||||||
done++
|
done++
|
||||||
if (done >= 2) resolve((vcdata as unknown) as VoiceServerUpdateData)
|
sessionID = state.sessionID
|
||||||
|
if (done >= 2) {
|
||||||
|
vcdata.sessionID = sessionID
|
||||||
|
if (options?.onlyJoin !== true) {
|
||||||
|
}
|
||||||
|
resolve(vcdata)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const onVoiceServerUpdate = (data: VoiceServerUpdateData): void => {
|
const onVoiceServerUpdate = (data: VoiceServerUpdateData): void => {
|
||||||
if (data.guild.id !== this.guild.id) return
|
if (data.guild.id !== this.guild.id) return
|
||||||
vcdata = data
|
vcdata = (data as unknown) as VoiceServerData
|
||||||
this.client.off('voiceServerUpdate', onVoiceServerUpdate)
|
this.client.off('voiceServerUpdate', onVoiceServerUpdate)
|
||||||
done++
|
done++
|
||||||
if (done >= 2) resolve(vcdata)
|
if (done >= 2) {
|
||||||
|
vcdata.sessionID = sessionID
|
||||||
|
resolve(vcdata)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.client.shards
|
this.client.shards
|
||||||
|
@ -78,6 +93,7 @@ export class VoiceChannel extends Channel {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Leave the Voice Channel */
|
||||||
leave(): void {
|
leave(): void {
|
||||||
this.client.shards
|
this.client.shards
|
||||||
.get(this.guild.shardID)
|
.get(this.guild.shardID)
|
||||||
|
|
|
@ -13,7 +13,7 @@ import { Member } from './member.ts'
|
||||||
import { Embed } from './embed.ts'
|
import { Embed } from './embed.ts'
|
||||||
import { CHANNEL_MESSAGE } from '../types/endpoint.ts'
|
import { CHANNEL_MESSAGE } from '../types/endpoint.ts'
|
||||||
import { MessageMentions } from './messageMentions.ts'
|
import { MessageMentions } from './messageMentions.ts'
|
||||||
import { TextChannel } from './textChannel.ts'
|
import { GuildTextChannel, TextChannel } from './textChannel.ts'
|
||||||
import { Guild } from './guild.ts'
|
import { Guild } from './guild.ts'
|
||||||
import { MessageReactionsManager } from '../managers/messageReactions.ts'
|
import { MessageReactionsManager } from '../managers/messageReactions.ts'
|
||||||
import { MessageSticker } from './messageSticker.ts'
|
import { MessageSticker } from './messageSticker.ts'
|
||||||
|
@ -115,6 +115,23 @@ export class Message extends SnowflakeBase {
|
||||||
: this.stickers
|
: this.stickers
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async updateRefs(): Promise<void> {
|
||||||
|
if (this.guildID !== undefined)
|
||||||
|
this.guild = await this.client.guilds.get(this.guildID)
|
||||||
|
const newVal = await this.client.channels.get<TextChannel>(this.channelID)
|
||||||
|
if (newVal !== undefined) this.channel = newVal
|
||||||
|
const newUser = await this.client.users.get(this.author.id)
|
||||||
|
if (newUser !== undefined) this.author = newUser
|
||||||
|
if (this.member !== undefined) {
|
||||||
|
const newMember = await this.guild?.members.get(this.member?.id)
|
||||||
|
if (newMember !== undefined) this.member = newMember
|
||||||
|
}
|
||||||
|
if (((this.channel as unknown) as GuildTextChannel).guild !== undefined)
|
||||||
|
this.guild = ((this.channel as unknown) as GuildTextChannel).guild
|
||||||
|
if (this.guild !== undefined && this.guildID === undefined)
|
||||||
|
this.guildID = this.guild.id
|
||||||
|
}
|
||||||
|
|
||||||
/** Edits this message. */
|
/** Edits this message. */
|
||||||
async edit(
|
async edit(
|
||||||
content?: string | AllMessageOptions,
|
content?: string | AllMessageOptions,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue