110 lines
4.5 KiB
JavaScript
Raw Permalink Normal View History

2023-11-29 18:23:54 +03:00
"use strict";
const Base = require("./Base");
const Guild = require("./Guild");
/**
* Represents an invite. Some properties are only available when fetching invites from channels, which requires the Manage Channel permission.
* @prop {TextChannel | NewsChannel | TextVoiceChannel | GroupChannel | StageChannel | Object} channel Info on the invite channel
* @prop {String} channel.id The ID of the invite's channel
* @prop {String?} channel.name The name of the invite's channel
* @prop {Number} channel.type The type of the invite's channel
* @prop {String?} channel.icon The icon of a channel (group dm)
* @prop {String} code The invite code
* @prop {Number?} createdAt Timestamp of invite creation
* @prop {Guild?} guild Info on the invite guild
* @prop {User?} inviter The invite creator
* @prop {Number?} maxAge How long the invite lasts in seconds
* @prop {Number?} maxUses The max number of invite uses
* @prop {Number?} memberCount The **approximate** member count for the guild
* @prop {Number?} presenceCount The **approximate** presence count for the guild
* @prop {Object?} stageInstance The active public stage instance data for the stage channel this invite is for
* @prop {String?} targetApplicationID The target application id
* @prop {Number?} targetType The type of the target application
* @prop {User?} targetUser The user whose stream is displayed for the invite (voice channel only)
* @prop {Boolean?} temporary Whether the invite grants temporary membership or not
* @prop {Number?} uses The number of invite uses
*/
class Invite extends Base {
constructor(data, client) {
super();
this._client = client;
this.code = data.code;
if(data.guild && client.guilds.has(data.guild.id)) {
this.channel = client.guilds.get(data.guild.id).channels.update(data.channel, client);
} else {
this.channel = data.channel;
}
if(data.guild) {
if(client.guilds.has(data.guild.id)) {
this.guild = client.guilds.update(data.guild, client);
} else {
this.guild = new Guild(data.guild, client);
}
}
if(data.inviter) {
this.inviter = client.users.add(data.inviter, client);
}
this.uses = data.uses !== undefined ? data.uses : null;
this.maxUses = data.max_uses !== undefined ? data.max_uses : null;
this.maxAge = data.max_age !== undefined ? data.max_age : null;
this.temporary = data.temporary !== undefined ? data.temporary : null;
this._createdAt = data.created_at !== undefined ? data.created_at : null;
this.presenceCount = data.approximate_presence_count !== undefined ? data.approximate_presence_count : null;
this.memberCount = data.approximate_member_count !== undefined ? data.approximate_member_count : null;
if(data.stage_instance !== undefined) {
data.stage_instance.members = data.stage_instance.members.map((m) => {
m.id = m.user.id;
return m;
});
this.stageInstance = {
members: data.stage_instance.members.map((m) => this.guild.members.update(m, this.guild)),
participantCount: data.stage_instance.participant_count,
speakerCount: data.stage_instance.speaker_count,
topic: data.stage_instance.topic
};
} else {
this.stageInstance = null;
}
this.targetApplicationID = data.target_application !== undefined ? data.target_application.id : null;
this.targetType = data.target_type !== undefined ? data.target_type : null;
this.targetUser = data.target_user !== undefined ? this._client.users.update(data.target_user, this._client) : null;
}
get createdAt() {
return Date.parse(this._createdAt);
}
/**
* Delete the invite
* @arg {String} [reason] The reason to be displayed in audit logs
* @returns {Promise}
*/
delete(reason) {
return this._client.deleteInvite.call(this._client, this.code, reason);
}
toString() {
return `[Invite ${this.code}]`;
}
toJSON(props = []) {
return super.toJSON([
"channel",
"code",
"createdAt",
"guild",
"maxAge",
"maxUses",
"memberCount",
"presenceCount",
"revoked",
"temporary",
"uses",
...props
]);
}
}
module.exports = Invite;