@tryforge/forgescript
Version:
ForgeScript is a comprehensive package that empowers you to effortlessly interact with Discord's API. It ensures scripting remains easy to learn and consistently effective.
122 lines • 4.52 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.InviteTracker = void 0;
const discord_js_1 = require("discord.js");
const noop_1 = __importDefault(require("../../functions/noop"));
const ForgeError_1 = require("../forge/ForgeError");
const managers_1 = require("../../managers");
const Logger_1 = require("../@internal/Logger");
class InviteTracker {
static Invites = new discord_js_1.Collection();
static RequiredIntents = ["Guilds", "GuildInvites", "GuildMembers"];
static RequiredEvents = [
"inviteCreate",
"inviteDelete",
"guildMemberAdd",
"guildMemberUpdate",
"guildMemberRemove",
"guildCreate",
"guildDelete",
];
/**
* Guild => invited user => invited by
*/
static Inviters = new discord_js_1.Collection();
static init(client) {
if (!client.options.intents.has(InviteTracker.RequiredIntents))
throw new ForgeError_1.ForgeError(null, ForgeError_1.ErrorType.Custom, `The next intents must be enabled: ${this.RequiredIntents.join(", ")}`);
client.events.load(managers_1.NativeEventName, this.RequiredEvents);
Logger_1.Logger.warn("The Invite Tracker is still beta, correct functionality is not guaranteed");
}
static hasPermissions(guild) {
return guild.members.me.permissions.has("ManageGuild");
}
static uncache(guild) {
this.Invites.delete(guild.id);
this.Inviters.delete(guild.id);
}
static async cacheAll(client) {
for (const [, guild] of client.guilds.cache) {
await this.cache(guild);
}
}
static async cache(guild) {
const invites = this.hasPermissions(guild) ? await guild.invites.fetch().catch(noop_1.default) : undefined;
if (!invites) {
Logger_1.Logger.warn(`Failed to cache invites for guild ${guild.name}.`);
return;
}
const arr = new Array();
for (const [, invite] of invites) {
if (invite.uses === null || invite.inviterId === null)
continue;
arr.push({
uses: invite.uses,
code: invite.code,
userId: invite.inviterId,
});
}
this.Invites.set(guild.id, arr);
}
static async inviteCreateHandler(invite) {
const invites = this.Invites.get(invite.guild?.id);
if (invites !== undefined) {
invites.push({
code: invite.code,
userId: invite.inviterId,
uses: 0,
});
return;
}
// Cache
await this.cache(invite.guild);
}
static async inviteDeleteHandler(invite) {
const invites = this.Invites.get(invite.guild?.id);
if (!invites)
return;
const index = invites.findIndex((x) => x.code === invite.code);
if (index !== -1)
invites.splice(index, 1);
}
static deleteInviter(member) {
this.Inviters.get(member.guild.id)?.delete(member.id);
}
static async findInviter(member) {
const guild = member.guild;
const newInvites = await guild.invites.fetch().catch(noop_1.default);
const oldInvites = this.Invites.get(guild.id);
if (!newInvites || !oldInvites) {
Logger_1.Logger.warn(`Failed to cache invites for guild ${guild.name}.`);
return;
}
let used = null;
for (let i = 0, len = oldInvites.length; i < len; i++) {
const old = oldInvites[i];
const inv = newInvites.get(old.code);
// Invite does no longer exist
if (!inv) {
continue;
}
if (old.uses !== inv.uses) {
used = old;
old.uses = inv.uses;
break;
}
}
if (used !== null) {
const invitedUsers = this.Inviters.ensure(guild.id, () => new discord_js_1.Collection());
invitedUsers.set(member.id, {
code: used.code,
inviterId: used.userId,
});
}
else
Logger_1.Logger.warn(`Could not resolve the invitation used by ${member.displayName} (${member.id}).`);
}
}
exports.InviteTracker = InviteTracker;
//# sourceMappingURL=InviteTracker.js.map
;