feat: new class Call

This commit is contained in:
Elysia
2023-03-05 17:05:40 +07:00
parent 11ac55fcf0
commit ee906b544e
7 changed files with 94 additions and 15 deletions

View File

@@ -1,4 +1,5 @@
'use strict';
const Call = require('../../../structures/Call');
const { Events } = require('../../../util/Constants');
module.exports = (client, packet) => {
for (const voice of packet.d.voice_states) {
@@ -7,9 +8,7 @@ module.exports = (client, packet) => {
/**
* Emitted whenever received a call
* @event Client#callCreate
* @param {Snowflake} channelId DM / Group DM channel ID
* @param {string} region Voice server region
* @param {?Snowflake[]} ringing List of user ID who is ringing
* @param {Call} call Call
*/
client.emit(Events.CALL_CREATE, packet.d.channel_id, packet.d.region, packet.d.ringing);
client.emit(Events.CALL_CREATE, new Call(client, packet.d));
};

View File

@@ -1,10 +1,11 @@
'use strict';
const Call = require('../../../structures/Call');
const { Events } = require('../../../util/Constants');
module.exports = (client, packet) => {
/**
* Emitted whenever delete a call
* @event Client#callDelete
* @param {Snowflake} channelId DM / Group DM channel ID
* @param {Call} call Call
*/
client.emit(Events.CALL_DELETE, packet.d.channel_id);
client.emit(Events.CALL_DELETE, new Call(client, packet.d));
};

View File

@@ -1,12 +1,11 @@
'use strict';
const Call = require('../../../structures/Call');
const { Events } = require('../../../util/Constants');
module.exports = (client, packet) => {
/**
* Emitted whenever update a call
* @event Client#callUpdate
* @param {Snowflake} channelId DM / Group DM channel ID
* @param {string} region Voice server region
* @param {?Snowflake[]} ringing List of user ID who is ringing
* @param {Call} call Call
*/
client.emit(Events.CALL_UPDATE, packet.d.channel_id, packet.d.region, packet.d.ringing);
client.emit(Events.CALL_UPDATE, new Call(client, packet.d));
};

56
src/structures/Call.js Normal file
View File

@@ -0,0 +1,56 @@
'use strict';
const { Collection } = require('@discordjs/collection');
const Base = require('./Base');
/**
* Represents a call
* @extends {Base}
*/
class Call extends Base {
constructor(client, data) {
super(client);
/**
* The channel ID of the call
* @type {Snowflake}
*/
this.channelId = data.channel_id;
/**
* The list of user ID who is ringing
* @type {Collection<Snowflake, User>}
*/
this.ringing = new Collection();
}
_patch(data) {
if ('region' in data) {
/**
* The region of the call
* @type {string}
*/
this.region = data.region;
}
if ('ringing' in data) {
for (const userId of data.ringing) {
this.ringing.set(userId, this.client.users.cache.get(userId));
}
}
}
/**
* The channel of the call
* @type {?DMChannel|PartialGroupDMChannel}
*/
get channel() {
return this.client.channels.cache.get(this.channelId);
}
/**
* Sets the voice region of the call
* @param {string} region Region of the call
* @returns {Promise<void>}
*/
setVoiceRegion(region) {
return this.client.api.channels(this.channelId).call.patch({ data: { region } });
}
}
module.exports = Call;

View File

@@ -563,6 +563,19 @@ class ClientUser extends User {
else this._packageName = null;
return this;
}
/**
* Stop ringing
* @param {ChannelResolvable} channel DMChannel | GroupDMChannel
* @returns {Promise<void>}
*/
stopRinging(channel) {
const id = this.client.channels.resolveId(channel);
if (!channel) return false;
return this.client.api.channels(id).call['stop-ringing'].post({
data: {},
});
}
}
module.exports = ClientUser;

View File

@@ -471,7 +471,7 @@ class User extends Base {
* @returns {Promise<boolean>}
*/
ring() {
if (!this.dmChannel?.id) return Promise.reject(new Error('USER_NO_DM_CHANNEL'));
if (this.relationships !== 'FRIEND') return Promise.reject(new Error('USER_NOT_FRIEND'));
if (!this.client.user.voice?.channelId || !this.client.callVoice) {
return Promise.reject(new Error('CLIENT_NO_CALL'));
}