feat(Call): Get users in dm call

This commit is contained in:
March 7th 2022-08-14 17:16:51 +07:00
parent a24f29b802
commit bb24adc1dc
6 changed files with 118 additions and 12 deletions

View File

@ -61,7 +61,7 @@
"axios": "^0.27.2",
"bignumber.js": "^9.1.0",
"chalk": "^4.1.2",
"discord-api-types": "^0.37.1",
"discord-api-types": "^0.37.2",
"form-data": "^4.0.0",
"json-bigint": "^1.0.0",
"node-fetch": "^2.6.1",
@ -81,7 +81,7 @@
"@types/node": "^16.11.12",
"conventional-changelog-cli": "^2.2.2",
"dtslint": "^4.2.1",
"eslint": "^8.21.0",
"eslint": "^8.22.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-import": "^2.25.3",
"eslint-plugin-prettier": "^4.0.0",

View File

@ -118,6 +118,10 @@ class Client extends BaseClient {
*/
this.voice = new ClientVoiceManager(this);
/**
* A manager of the voice states of this client (Support DM / Group DM)
* @type {VoiceStateManager}
*/
this.voiceStates = new VoiceStateManager({ client: this });
/**
@ -240,6 +244,10 @@ class Client extends BaseClient {
this.options.messageSweepInterval * 1_000,
).unref();
}
if (this.options.intents) {
process.emitWarning('Intent is not available.', 'DeprecationWarning');
}
}
/**

View File

@ -5,7 +5,6 @@ const { GuildMember } = require('../structures/GuildMember');
const { Message } = require('../structures/Message');
const ThreadMember = require('../structures/ThreadMember');
const User = require('../structures/User');
const { Opcodes } = require('../util/Constants');
/**
* Manages API methods for users and stores their cache.
@ -65,12 +64,7 @@ class UserManager extends CachedManager {
},
});
const dm_channel = await this.client.channels._add(data, null, { cache });
await this.client.ws.broadcast({
op: Opcodes.DM_UPDATE,
d: {
channel_id: dm_channel.id,
},
});
await dm_channel.sync();
return dm_channel;
}

View File

@ -1,10 +1,11 @@
'use strict';
const { Collection } = require('@discordjs/collection');
const { joinVoiceChannel, entersState, VoiceConnectionStatus } = require('@discordjs/voice');
const { Channel } = require('./Channel');
const TextBasedChannel = require('./interfaces/TextBasedChannel');
const MessageManager = require('../managers/MessageManager');
const { Status } = require('../util/Constants');
const { Status, Opcodes } = require('../util/Constants');
/**
* Represents a direct message channel between two users.
@ -135,9 +136,57 @@ class DMChannel extends Channel {
});
});
}
/**
* Sync VoiceState of this DMChannel.
* @returns {undefined}
*/
sync() {
this.client.ws.broadcast({
op: Opcodes.DM_UPDATE,
d: {
channel_id: this.id,
},
});
}
/**
* The user in this voice-based channel
* @type {Collection<Snowflake, User>}
* @readonly
*/
get voiceUsers() {
const coll = new Collection();
for (const state of this.client.voiceStates.cache.values()) {
if (state.channelId === this.id && state.user) {
coll.set(state.id, state.user);
}
}
return coll;
}
/**
* Get connection to current call
* @type {?VoiceConnection}
* @readonly
*/
get voiceConnection() {
const check = this.client.callVoice?.joinConfig?.channelId == this.id;
if (check) {
return this.client.callVoice;
}
return null;
}
/**
* Get current shard
* @type {WebSocketShard}
* @readonly
*/
get shard() {
return this.client.ws.shards.first();
}
/**
* The voice state adapter for this client that can be used with @discordjs/voice to play audio in DM / Group DM channels.
* @type {?Function}
* @readonly
*/
get voiceAdapterCreator() {
return methods => {
this.client.voice.adapters.set(this.id, methods);

View File

@ -7,7 +7,7 @@ const Invite = require('./Invite');
const TextBasedChannel = require('./interfaces/TextBasedChannel');
const { Error } = require('../errors');
const MessageManager = require('../managers/MessageManager');
const { Status } = require('../util/Constants');
const { Status, Opcodes } = require('../util/Constants');
const DataResolver = require('../util/DataResolver');
/**
@ -279,9 +279,57 @@ class PartialGroupDMChannel extends Channel {
});
});
}
/**
* Sync VoiceState of this Group DMChannel.
* @returns {undefined}
*/
sync() {
this.client.ws.broadcast({
op: Opcodes.DM_UPDATE,
d: {
channel_id: this.id,
},
});
}
/**
* The user in this voice-based channel
* @type {Collection<Snowflake, User>}
* @readonly
*/
get voiceUsers() {
const coll = new Collection();
for (const state of this.client.voiceStates.cache.values()) {
if (state.channelId === this.id && state.user) {
coll.set(state.id, state.user);
}
}
return coll;
}
/**
* Get connection to current call
* @type {?VoiceConnection}
* @readonly
*/
get voiceConnection() {
const check = this.client.callVoice?.joinConfig?.channelId == this.id;
if (check) {
return this.client.callVoice;
}
return null;
}
/**
* Get current shard
* @type {WebSocketShard}
* @readonly
*/
get shard() {
return this.client.ws.shards.first();
}
/**
* The voice state adapter for this client that can be used with @discordjs/voice to play audio in DM / Group DM channels.
* @type {?Function}
* @readonly
*/
get voiceAdapterCreator() {
return methods => {
this.client.voice.adapters.set(this.id, methods);

9
typings/index.d.ts vendored
View File

@ -796,6 +796,8 @@ export class Client<Ready extends boolean = boolean> extends BaseClient {
public setting: ClientUserSettingManager;
public relationships: RelationshipsManager;
public updateCookie(): Promise<void>;
public readonly callVoice?: VoiceConnection;
public voiceStates: VoiceStateManager;
// End
public channels: ChannelManager;
public readonly emojis: BaseGuildEmojiManager;
@ -828,7 +830,6 @@ export class Client<Ready extends boolean = boolean> extends BaseClient {
public QRLogin(debug?: boolean): DiscordAuthWebsocket;
public remoteAuth(url: string, forceAccept?: boolean): Promise<remoteAuthConfrim | undefined>;
public createToken(): Promise<string>;
public readonly callVoice: VoiceConnection | undefined;
public isReady(): this is Client<true>;
/** @deprecated Use {@link Sweepers#sweepMessages} instead */
public sweepMessages(lifetime?: number): number;
@ -1158,7 +1159,10 @@ export class DMChannel extends TextBasedChannelMixin(Channel, [
public fetch(force?: boolean): Promise<this>;
public readonly voiceAdapterCreator: InternalDiscordGatewayAdapterCreator;
public call(options?: object): Promise<VoiceConnection>;
public sync(): undefined;
public readonly shard: WebSocketShard;
public readonly voiceUsers: Collection<Snowflake, User>;
public readonly voiceConnection?: VoiceConnection;
}
export class Emoji extends Base {
@ -2323,7 +2327,10 @@ export class PartialGroupDMChannel extends TextBasedChannelMixin(Channel, [
public removeInvite(invite: Invite): Promise<PartialGroupDMChannel>;
public readonly voiceAdapterCreator: InternalDiscordGatewayAdapterCreator;
public call(options?: object): Promise<VoiceConnection>;
public sync(): undefined;
public readonly shard: WebSocketShard;
public readonly voiceUsers: Collection<Snowflake, User>;
public readonly voiceConnection?: VoiceConnection;
}
export class PermissionOverwrites extends Base {