@discordanalytics/discordjs 2.9.0 → 2.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -5
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ pnpm add @discordanalytics/discordjs
|
|
|
16
16
|
|
|
17
17
|
## Usage
|
|
18
18
|
|
|
19
|
-
> **Note:** To use Discord Analytics, you need to have an API key. Check the docs for more informations : https://discordanalytics.xyz/docs/
|
|
19
|
+
> **Note:** To use Discord Analytics, you need to have an API key. Check the docs for more informations : https://discordanalytics.xyz/docs/get-started/bot-registration
|
|
20
20
|
|
|
21
21
|
### Example
|
|
22
22
|
|
package/dist/index.cjs
CHANGED
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["AnalyticsBase","npmPackageData.version","ErrorCodes","InteractionType","ApplicationCommandType"],"sources":["../package.json","../src/index.ts"],"sourcesContent":["","import {\n AnalyticsBase,\n ApplicationCommandType,\n AnalyticsOptions,\n ErrorCodes,\n InteractionType,\n LocaleData,\n Locale,\n InteractionData,\n GuildData,\n} from '@discordanalytics/core';\nimport type { CacheType, Client, GuildMember, Interaction } from 'discord.js';\nimport npmPackageData from '../package.json';\n\n/**\n * @class DiscordAnalytics\n * @description The Discord.js class for the DiscordAnalytics library.\n * @param {AnalyticsOptions} options Configuration options.\n * @property {Client} options.client The Discord.js client to track events for.\n * @property {string} options.api_key The API token for DiscordAnalytics.\n * @property {boolean} options.sharded Whether the Discord.js client is sharded.\n * @property {boolean} options.debug Enable or not the debug mode /!\\ MUST BE USED ONLY FOR DEVELOPMENT PURPOSES /!\\\n * @example\n * const { default: DiscordAnalytics } = require('discord-analytics/discordjs');\n * const { Client, IntentsBitField } = require('discord.js');\n * const client = new Client({\n * intents: [IntentsBitField.Flags.Guilds]\n * })\n * client.on('ready', () => {\n * const analytics = new DiscordAnalytics({\n * client: client,\n * api_key: 'YOUR_API_TOKEN'\n * });\n * analytics.init();\n * analytics.trackEvents();\n * });\n * client.login('YOUR_BOT_TOKEN');\n * @link https://discordanalytics.xyz/docs/main/get-started/installation/discord.js Check docs for more informations about advanced usages\n */\nexport default class DiscordAnalytics extends AnalyticsBase {\n private readonly _client: Client;\n private readonly _sharded: boolean = false;\n private _isReady: boolean = false;\n\n constructor(options: AnalyticsOptions<Client>) {\n super(options.api_key, options.api_url, options.debug);\n this._client = options.client;\n this._sharded = options.sharded || false;\n }\n\n /**\n * Initialize DiscordAnalytics on your bot\n * /!\\ Advanced users only\n * /!\\ Required to use DiscordAnalytics\n * /!\\ Must be used when the client is ready (recommended to use in ready event to prevent problems)\n */\n public async init(): Promise<void> {\n if (process.env.NODE_ENV !== 'production')\n return console.log(\"[DISCORDANALYTICS] NODE_ENV != 'production', initialization skipped\");\n\n if (!this._client.user)\n return console.log('[DISCORDANALYTICS] client is not ready, initialization skipped');\n\n this.client_id = this._client.user.id;\n\n await this.updateBotInformations(\n this._client.user.username,\n 'discord.js',\n npmPackageData.version,\n this._client.user.avatar,\n );\n\n this.debug('[DISCORDANALYTICS] Instance successfully initialized');\n this._isReady = true;\n\n const fast_mode = process.argv[2] === '--fast';\n this.debug(\n `[DISCORDANALYTICS] Fast mode is ${fast_mode ? 'enabled' : 'disabled'}. Stats will be sent every ${fast_mode ? '30s' : '5min'}.`,\n );\n\n setInterval(\n async () => {\n this.debug('[DISCORDANALYTICS] Sending stats...');\n\n const guildCount = this._sharded\n ? (await this._client.shard?.broadcastEval((c) => c.guilds.cache.size))?.reduce(\n (a: number, b: number) => a + b,\n 0,\n ) || 0\n : this._client.guilds.cache.size;\n\n const userCount = this._sharded\n ? (\n await this._client.shard?.broadcastEval((c) =>\n c.guilds.cache.reduce((a: number, g) => a + (g.memberCount || 0), 0),\n )\n )?.reduce((a: number, b: number) => a + b, 0) || 0\n : this._client.guilds.cache.reduce((a: number, g) => a + (g.memberCount || 0), 0);\n\n const userInstallCount = this._sharded\n ? (\n await this._client.shard?.broadcastEval(\n (c) => c.application!.approximateUserInstallCount,\n )\n )?.reduce((a, b) => a! + b!, 0) || 0\n : this._client.application!.approximateUserInstallCount || 0;\n\n const guildMembers: number[] = !this._sharded\n ? this._client.guilds.cache.map((guild) => guild.memberCount)\n : ((\n await this._client.shard?.broadcastEval((c) =>\n c.guilds.cache.map((guild) => guild.memberCount),\n )\n )?.flat() ?? []);\n\n const guildLocales: LocaleData[] = [];\n this._client.guilds.cache.map((current) =>\n guildLocales.find((x) => x.locale === current.preferredLocale)\n ? ++guildLocales.find((x) => x.locale === current.preferredLocale)!.number\n : guildLocales.push({ locale: current.preferredLocale as Locale, number: 1 }),\n );\n\n this.stats_data.guildLocales = guildLocales;\n\n await this.sendStats(\n this._client.user!.id,\n guildCount,\n userCount,\n userInstallCount,\n guildMembers,\n );\n },\n fast_mode ? 30000 : 300000,\n );\n }\n\n /**\n * Track interactions\n * /!\\ Advanced users only\n * /!\\ You need to initialize the class first\n * @param interaction BaseInteraction class and its extensions only\n * @param interactionNameResolver A function that will resolve the name of the interaction\n */\n public async trackInteractions(\n interaction: Interaction<CacheType>,\n interactionNameResolver?: (interaction: Interaction<CacheType>) => string,\n ): Promise<void> {\n this.debug(`[DISCORDANALYTICS] trackInteractions(${interaction.type}) triggered`);\n if (!this._isReady) return this.error(ErrorCodes.INSTANCE_NOT_INITIALIZED);\n\n this.updateOrInsert(\n this.stats_data.interactionsLocales,\n (x) => x.locale === interaction.locale,\n (x) => x.number++,\n (): LocaleData => ({ locale: interaction.locale as Locale, number: 1 }),\n );\n\n if (interaction.type === InteractionType.ApplicationCommand) {\n const commandType = interaction.command\n ? interaction.command.type\n : ApplicationCommandType.ChatInputCommand;\n const commandName = interactionNameResolver\n ? interactionNameResolver(interaction)\n : interaction.commandName;\n this.updateOrInsert(\n this.stats_data.interactions,\n (x) =>\n x.name === commandName && x.type === interaction.type && x.commandType === commandType,\n (x) => x.number++,\n (): InteractionData => ({\n name: commandName,\n number: 1,\n type: interaction.type,\n commandType: commandType as ApplicationCommandType,\n }),\n );\n } else if (\n interaction.type === InteractionType.MessageComponent ||\n interaction.type === InteractionType.ModalSubmit\n ) {\n const interactionName = interactionNameResolver\n ? interactionNameResolver(interaction)\n : interaction.customId;\n this.updateOrInsert(\n this.stats_data.interactions,\n (x) => x.name === interactionName && x.type === interaction.type,\n (x) => x.number++,\n (): InteractionData => ({\n name: interactionName,\n number: 1,\n type: interaction.type,\n }),\n );\n }\n\n this.updateOrInsert(\n this.stats_data.guilds,\n (x) => x.guildId === (interaction.guild ? interaction.guild.id : 'dm'),\n (x) => x.interactions++,\n (): GuildData => ({\n guildId: interaction.guild ? interaction.guild.id : 'dm',\n name: interaction.guild ? interaction.guild.name : 'DM',\n icon: interaction.guild && interaction.guild.icon,\n interactions: 1,\n members: interaction.guild ? interaction.guild.memberCount : 0,\n }),\n );\n\n const oneWeekAgo = new Date();\n oneWeekAgo.setDate(oneWeekAgo.getDate() - 7);\n\n if (!interaction.inGuild() || !interaction.guild) ++this.stats_data.usersType.privateMessage;\n else if (\n (interaction.member && interaction.memberPermissions.has(8n)) ||\n interaction.memberPermissions.has(32n)\n )\n ++this.stats_data.usersType.admin;\n else if (\n (interaction.member && interaction.memberPermissions.has(8192n)) ||\n interaction.memberPermissions.has(2n) ||\n interaction.memberPermissions.has(4n) ||\n interaction.memberPermissions.has(4194304n) ||\n interaction.memberPermissions.has(8388608n) ||\n interaction.memberPermissions.has(16777216n) ||\n interaction.memberPermissions.has(1099511627776n)\n )\n ++this.stats_data.usersType.moderator;\n else if (\n interaction.member &&\n (interaction.member as GuildMember).joinedAt &&\n (interaction.member as GuildMember).joinedAt! > oneWeekAgo\n )\n ++this.stats_data.usersType.newMember;\n }\n\n /**\n * Let DiscordAnalytics declare the events necessary for its operation.\n * /!\\ Not recommended for big bots\n * /!\\ Not compatible with other functions\n * @param interactionNameResolver A function that will resolve the name of the interaction\n */\n public trackEvents(\n interactionNameResolver?: (interaction: Interaction<CacheType>) => string,\n ): void {\n this.debug('[DISCORDANALYTICS] trackEvents() triggered');\n if (!this._isReady) return this.error(ErrorCodes.INSTANCE_NOT_INITIALIZED);\n\n this._client.on(\n 'interactionCreate',\n async (interaction) => await this.trackInteractions(interaction, interactionNameResolver),\n );\n this._client.on('guildCreate', () => this.trackGuilds('create'));\n this._client.on('guildDelete', () => this.trackGuilds('delete'));\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["AnalyticsBase","npmPackageData.version","ErrorCodes","InteractionType","ApplicationCommandType"],"sources":["../package.json","../src/index.ts"],"sourcesContent":["","import {\n AnalyticsBase,\n ApplicationCommandType,\n AnalyticsOptions,\n ErrorCodes,\n InteractionType,\n LocaleData,\n Locale,\n InteractionData,\n GuildData,\n} from '@discordanalytics/core';\nimport type { CacheType, Client, GuildMember, Interaction } from 'discord.js';\nimport npmPackageData from '../package.json';\n\n/**\n * @class DiscordAnalytics\n * @description The Discord.js class for the DiscordAnalytics library.\n * @param {AnalyticsOptions} options Configuration options.\n * @property {Client} options.client The Discord.js client to track events for.\n * @property {string} options.api_key The API token for DiscordAnalytics.\n * @property {boolean} options.sharded Whether the Discord.js client is sharded.\n * @property {boolean} options.debug Enable or not the debug mode /!\\ MUST BE USED ONLY FOR DEVELOPMENT PURPOSES /!\\\n * @example\n * const { default: DiscordAnalytics } = require('discord-analytics/discordjs');\n * const { Client, IntentsBitField } = require('discord.js');\n * const client = new Client({\n * intents: [IntentsBitField.Flags.Guilds]\n * })\n * client.on('ready', () => {\n * const analytics = new DiscordAnalytics({\n * client: client,\n * api_key: 'YOUR_API_TOKEN'\n * });\n * analytics.init();\n * analytics.trackEvents();\n * });\n * client.login('YOUR_BOT_TOKEN');\n * @link https://discordanalytics.xyz/docs/main/get-started/installation/discord.js Check docs for more informations about advanced usages\n */\nexport default class DiscordAnalytics extends AnalyticsBase {\n private readonly _client: Client;\n private readonly _sharded: boolean = false;\n private _isReady: boolean = false;\n\n constructor(options: AnalyticsOptions<Client>) {\n super(options.api_key, options.api_url, options.debug);\n this._client = options.client;\n this._sharded = options.sharded || false;\n }\n\n /**\n * Initialize DiscordAnalytics on your bot\n * /!\\ Advanced users only\n * /!\\ Required to use DiscordAnalytics\n * /!\\ Must be used when the client is ready (recommended to use in ready event to prevent problems)\n */\n public async init(): Promise<void> {\n if (process.env.NODE_ENV !== 'production')\n return console.log(\"[DISCORDANALYTICS] NODE_ENV != 'production', initialization skipped\");\n\n if (!this._client.user)\n return console.log('[DISCORDANALYTICS] client is not ready, initialization skipped');\n\n this.client_id = this._client.user.id;\n\n await this.updateBotInformations(\n this._client.user.username,\n 'discord.js',\n npmPackageData.version,\n this._client.user.avatar,\n );\n\n this.debug('[DISCORDANALYTICS] Instance successfully initialized');\n this._isReady = true;\n\n const fast_mode = process.argv[2] === '--fast';\n this.debug(\n `[DISCORDANALYTICS] Fast mode is ${fast_mode ? 'enabled' : 'disabled'}. Stats will be sent every ${fast_mode ? '30s' : '5min'}.`,\n );\n\n setInterval(\n async () => {\n this.debug('[DISCORDANALYTICS] Sending stats...');\n\n const guildCount = this._sharded\n ? (await this._client.shard?.broadcastEval((c) => c.guilds.cache.size))?.reduce(\n (a: number, b: number) => a + b,\n 0,\n ) || 0\n : this._client.guilds.cache.size;\n\n const userCount = this._sharded\n ? (\n await this._client.shard?.broadcastEval((c) =>\n c.guilds.cache.reduce((a: number, g) => a + (g.memberCount || 0), 0),\n )\n )?.reduce((a: number, b: number) => a + b, 0) || 0\n : this._client.guilds.cache.reduce((a: number, g) => a + (g.memberCount || 0), 0);\n\n const userInstallCount = this._sharded\n ? (\n await this._client.shard?.broadcastEval(\n (c) => c.application!.approximateUserInstallCount,\n )\n )?.reduce((a, b) => a! + b!, 0) || 0\n : this._client.application!.approximateUserInstallCount || 0;\n\n const guildMembers: number[] = !this._sharded\n ? this._client.guilds.cache.map((guild) => guild.memberCount)\n : ((\n await this._client.shard?.broadcastEval((c) =>\n c.guilds.cache.map((guild) => guild.memberCount),\n )\n )?.flat() ?? []);\n\n const guildLocales: LocaleData[] = [];\n this._client.guilds.cache.map((current) =>\n guildLocales.find((x) => x.locale === current.preferredLocale)\n ? ++guildLocales.find((x) => x.locale === current.preferredLocale)!.number\n : guildLocales.push({ locale: current.preferredLocale as Locale, number: 1 }),\n );\n\n this.stats_data.guildLocales = guildLocales;\n\n await this.sendStats(\n this._client.user!.id,\n guildCount,\n userCount,\n userInstallCount,\n guildMembers,\n );\n },\n fast_mode ? 30000 : 300000,\n );\n }\n\n /**\n * Track interactions\n * /!\\ Advanced users only\n * /!\\ You need to initialize the class first\n * @param interaction BaseInteraction class and its extensions only\n * @param interactionNameResolver A function that will resolve the name of the interaction\n */\n public async trackInteractions(\n interaction: Interaction<CacheType>,\n interactionNameResolver?: (interaction: Interaction<CacheType>) => string,\n ): Promise<void> {\n this.debug(`[DISCORDANALYTICS] trackInteractions(${interaction.type}) triggered`);\n if (!this._isReady) return this.error(ErrorCodes.INSTANCE_NOT_INITIALIZED);\n\n this.updateOrInsert(\n this.stats_data.interactionsLocales,\n (x) => x.locale === interaction.locale,\n (x) => x.number++,\n (): LocaleData => ({ locale: interaction.locale as Locale, number: 1 }),\n );\n\n if (interaction.type === InteractionType.ApplicationCommand) {\n const commandType = interaction.command\n ? interaction.command.type\n : ApplicationCommandType.ChatInputCommand;\n const commandName = interactionNameResolver\n ? interactionNameResolver(interaction)\n : interaction.commandName;\n this.updateOrInsert(\n this.stats_data.interactions,\n (x) =>\n x.name === commandName && x.type === interaction.type && x.commandType === commandType,\n (x) => x.number++,\n (): InteractionData => ({\n name: commandName,\n number: 1,\n type: interaction.type,\n commandType: commandType as ApplicationCommandType,\n }),\n );\n } else if (\n interaction.type === InteractionType.MessageComponent ||\n interaction.type === InteractionType.ModalSubmit\n ) {\n const interactionName = interactionNameResolver\n ? interactionNameResolver(interaction)\n : interaction.customId;\n this.updateOrInsert(\n this.stats_data.interactions,\n (x) => x.name === interactionName && x.type === interaction.type,\n (x) => x.number++,\n (): InteractionData => ({\n name: interactionName,\n number: 1,\n type: interaction.type,\n }),\n );\n }\n\n this.updateOrInsert(\n this.stats_data.guilds,\n (x) => x.guildId === (interaction.guild ? interaction.guild.id : 'dm'),\n (x) => x.interactions++,\n (): GuildData => ({\n guildId: interaction.guild ? interaction.guild.id : 'dm',\n name: interaction.guild ? interaction.guild.name : 'DM',\n icon: interaction.guild && interaction.guild.icon,\n interactions: 1,\n members: interaction.guild ? interaction.guild.memberCount : 0,\n }),\n );\n\n const oneWeekAgo = new Date();\n oneWeekAgo.setDate(oneWeekAgo.getDate() - 7);\n\n if (!interaction.inGuild() || !interaction.guild) ++this.stats_data.usersType.privateMessage;\n else if (\n (interaction.member && interaction.memberPermissions.has(8n)) ||\n interaction.memberPermissions.has(32n)\n )\n ++this.stats_data.usersType.admin;\n else if (\n (interaction.member && interaction.memberPermissions.has(8192n)) ||\n interaction.memberPermissions.has(2n) ||\n interaction.memberPermissions.has(4n) ||\n interaction.memberPermissions.has(4194304n) ||\n interaction.memberPermissions.has(8388608n) ||\n interaction.memberPermissions.has(16777216n) ||\n interaction.memberPermissions.has(1099511627776n)\n )\n ++this.stats_data.usersType.moderator;\n else if (\n interaction.member &&\n (interaction.member as GuildMember).joinedAt &&\n (interaction.member as GuildMember).joinedAt! > oneWeekAgo\n )\n ++this.stats_data.usersType.newMember;\n }\n\n /**\n * Let DiscordAnalytics declare the events necessary for its operation.\n * /!\\ Not recommended for big bots\n * /!\\ Not compatible with other functions\n * @param interactionNameResolver A function that will resolve the name of the interaction\n */\n public trackEvents(\n interactionNameResolver?: (interaction: Interaction<CacheType>) => string,\n ): void {\n this.debug('[DISCORDANALYTICS] trackEvents() triggered');\n if (!this._isReady) return this.error(ErrorCodes.INSTANCE_NOT_INITIALIZED);\n\n this._client.on(\n 'interactionCreate',\n async (interaction) => await this.trackInteractions(interaction, interactionNameResolver),\n );\n this._client.on('guildCreate', () => this.trackGuilds('create'));\n this._client.on('guildDelete', () => this.trackGuilds('delete'));\n }\n}\n"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["npmPackageData.version"],"sources":["../package.json","../src/index.ts"],"sourcesContent":["","import {\n AnalyticsBase,\n ApplicationCommandType,\n AnalyticsOptions,\n ErrorCodes,\n InteractionType,\n LocaleData,\n Locale,\n InteractionData,\n GuildData,\n} from '@discordanalytics/core';\nimport type { CacheType, Client, GuildMember, Interaction } from 'discord.js';\nimport npmPackageData from '../package.json';\n\n/**\n * @class DiscordAnalytics\n * @description The Discord.js class for the DiscordAnalytics library.\n * @param {AnalyticsOptions} options Configuration options.\n * @property {Client} options.client The Discord.js client to track events for.\n * @property {string} options.api_key The API token for DiscordAnalytics.\n * @property {boolean} options.sharded Whether the Discord.js client is sharded.\n * @property {boolean} options.debug Enable or not the debug mode /!\\ MUST BE USED ONLY FOR DEVELOPMENT PURPOSES /!\\\n * @example\n * const { default: DiscordAnalytics } = require('discord-analytics/discordjs');\n * const { Client, IntentsBitField } = require('discord.js');\n * const client = new Client({\n * intents: [IntentsBitField.Flags.Guilds]\n * })\n * client.on('ready', () => {\n * const analytics = new DiscordAnalytics({\n * client: client,\n * api_key: 'YOUR_API_TOKEN'\n * });\n * analytics.init();\n * analytics.trackEvents();\n * });\n * client.login('YOUR_BOT_TOKEN');\n * @link https://discordanalytics.xyz/docs/main/get-started/installation/discord.js Check docs for more informations about advanced usages\n */\nexport default class DiscordAnalytics extends AnalyticsBase {\n private readonly _client: Client;\n private readonly _sharded: boolean = false;\n private _isReady: boolean = false;\n\n constructor(options: AnalyticsOptions<Client>) {\n super(options.api_key, options.api_url, options.debug);\n this._client = options.client;\n this._sharded = options.sharded || false;\n }\n\n /**\n * Initialize DiscordAnalytics on your bot\n * /!\\ Advanced users only\n * /!\\ Required to use DiscordAnalytics\n * /!\\ Must be used when the client is ready (recommended to use in ready event to prevent problems)\n */\n public async init(): Promise<void> {\n if (process.env.NODE_ENV !== 'production')\n return console.log(\"[DISCORDANALYTICS] NODE_ENV != 'production', initialization skipped\");\n\n if (!this._client.user)\n return console.log('[DISCORDANALYTICS] client is not ready, initialization skipped');\n\n this.client_id = this._client.user.id;\n\n await this.updateBotInformations(\n this._client.user.username,\n 'discord.js',\n npmPackageData.version,\n this._client.user.avatar,\n );\n\n this.debug('[DISCORDANALYTICS] Instance successfully initialized');\n this._isReady = true;\n\n const fast_mode = process.argv[2] === '--fast';\n this.debug(\n `[DISCORDANALYTICS] Fast mode is ${fast_mode ? 'enabled' : 'disabled'}. Stats will be sent every ${fast_mode ? '30s' : '5min'}.`,\n );\n\n setInterval(\n async () => {\n this.debug('[DISCORDANALYTICS] Sending stats...');\n\n const guildCount = this._sharded\n ? (await this._client.shard?.broadcastEval((c) => c.guilds.cache.size))?.reduce(\n (a: number, b: number) => a + b,\n 0,\n ) || 0\n : this._client.guilds.cache.size;\n\n const userCount = this._sharded\n ? (\n await this._client.shard?.broadcastEval((c) =>\n c.guilds.cache.reduce((a: number, g) => a + (g.memberCount || 0), 0),\n )\n )?.reduce((a: number, b: number) => a + b, 0) || 0\n : this._client.guilds.cache.reduce((a: number, g) => a + (g.memberCount || 0), 0);\n\n const userInstallCount = this._sharded\n ? (\n await this._client.shard?.broadcastEval(\n (c) => c.application!.approximateUserInstallCount,\n )\n )?.reduce((a, b) => a! + b!, 0) || 0\n : this._client.application!.approximateUserInstallCount || 0;\n\n const guildMembers: number[] = !this._sharded\n ? this._client.guilds.cache.map((guild) => guild.memberCount)\n : ((\n await this._client.shard?.broadcastEval((c) =>\n c.guilds.cache.map((guild) => guild.memberCount),\n )\n )?.flat() ?? []);\n\n const guildLocales: LocaleData[] = [];\n this._client.guilds.cache.map((current) =>\n guildLocales.find((x) => x.locale === current.preferredLocale)\n ? ++guildLocales.find((x) => x.locale === current.preferredLocale)!.number\n : guildLocales.push({ locale: current.preferredLocale as Locale, number: 1 }),\n );\n\n this.stats_data.guildLocales = guildLocales;\n\n await this.sendStats(\n this._client.user!.id,\n guildCount,\n userCount,\n userInstallCount,\n guildMembers,\n );\n },\n fast_mode ? 30000 : 300000,\n );\n }\n\n /**\n * Track interactions\n * /!\\ Advanced users only\n * /!\\ You need to initialize the class first\n * @param interaction BaseInteraction class and its extensions only\n * @param interactionNameResolver A function that will resolve the name of the interaction\n */\n public async trackInteractions(\n interaction: Interaction<CacheType>,\n interactionNameResolver?: (interaction: Interaction<CacheType>) => string,\n ): Promise<void> {\n this.debug(`[DISCORDANALYTICS] trackInteractions(${interaction.type}) triggered`);\n if (!this._isReady) return this.error(ErrorCodes.INSTANCE_NOT_INITIALIZED);\n\n this.updateOrInsert(\n this.stats_data.interactionsLocales,\n (x) => x.locale === interaction.locale,\n (x) => x.number++,\n (): LocaleData => ({ locale: interaction.locale as Locale, number: 1 }),\n );\n\n if (interaction.type === InteractionType.ApplicationCommand) {\n const commandType = interaction.command\n ? interaction.command.type\n : ApplicationCommandType.ChatInputCommand;\n const commandName = interactionNameResolver\n ? interactionNameResolver(interaction)\n : interaction.commandName;\n this.updateOrInsert(\n this.stats_data.interactions,\n (x) =>\n x.name === commandName && x.type === interaction.type && x.commandType === commandType,\n (x) => x.number++,\n (): InteractionData => ({\n name: commandName,\n number: 1,\n type: interaction.type,\n commandType: commandType as ApplicationCommandType,\n }),\n );\n } else if (\n interaction.type === InteractionType.MessageComponent ||\n interaction.type === InteractionType.ModalSubmit\n ) {\n const interactionName = interactionNameResolver\n ? interactionNameResolver(interaction)\n : interaction.customId;\n this.updateOrInsert(\n this.stats_data.interactions,\n (x) => x.name === interactionName && x.type === interaction.type,\n (x) => x.number++,\n (): InteractionData => ({\n name: interactionName,\n number: 1,\n type: interaction.type,\n }),\n );\n }\n\n this.updateOrInsert(\n this.stats_data.guilds,\n (x) => x.guildId === (interaction.guild ? interaction.guild.id : 'dm'),\n (x) => x.interactions++,\n (): GuildData => ({\n guildId: interaction.guild ? interaction.guild.id : 'dm',\n name: interaction.guild ? interaction.guild.name : 'DM',\n icon: interaction.guild && interaction.guild.icon,\n interactions: 1,\n members: interaction.guild ? interaction.guild.memberCount : 0,\n }),\n );\n\n const oneWeekAgo = new Date();\n oneWeekAgo.setDate(oneWeekAgo.getDate() - 7);\n\n if (!interaction.inGuild() || !interaction.guild) ++this.stats_data.usersType.privateMessage;\n else if (\n (interaction.member && interaction.memberPermissions.has(8n)) ||\n interaction.memberPermissions.has(32n)\n )\n ++this.stats_data.usersType.admin;\n else if (\n (interaction.member && interaction.memberPermissions.has(8192n)) ||\n interaction.memberPermissions.has(2n) ||\n interaction.memberPermissions.has(4n) ||\n interaction.memberPermissions.has(4194304n) ||\n interaction.memberPermissions.has(8388608n) ||\n interaction.memberPermissions.has(16777216n) ||\n interaction.memberPermissions.has(1099511627776n)\n )\n ++this.stats_data.usersType.moderator;\n else if (\n interaction.member &&\n (interaction.member as GuildMember).joinedAt &&\n (interaction.member as GuildMember).joinedAt! > oneWeekAgo\n )\n ++this.stats_data.usersType.newMember;\n }\n\n /**\n * Let DiscordAnalytics declare the events necessary for its operation.\n * /!\\ Not recommended for big bots\n * /!\\ Not compatible with other functions\n * @param interactionNameResolver A function that will resolve the name of the interaction\n */\n public trackEvents(\n interactionNameResolver?: (interaction: Interaction<CacheType>) => string,\n ): void {\n this.debug('[DISCORDANALYTICS] trackEvents() triggered');\n if (!this._isReady) return this.error(ErrorCodes.INSTANCE_NOT_INITIALIZED);\n\n this._client.on(\n 'interactionCreate',\n async (interaction) => await this.trackInteractions(interaction, interactionNameResolver),\n );\n this._client.on('guildCreate', () => this.trackGuilds('create'));\n this._client.on('guildDelete', () => this.trackGuilds('delete'));\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["npmPackageData.version"],"sources":["../package.json","../src/index.ts"],"sourcesContent":["","import {\n AnalyticsBase,\n ApplicationCommandType,\n AnalyticsOptions,\n ErrorCodes,\n InteractionType,\n LocaleData,\n Locale,\n InteractionData,\n GuildData,\n} from '@discordanalytics/core';\nimport type { CacheType, Client, GuildMember, Interaction } from 'discord.js';\nimport npmPackageData from '../package.json';\n\n/**\n * @class DiscordAnalytics\n * @description The Discord.js class for the DiscordAnalytics library.\n * @param {AnalyticsOptions} options Configuration options.\n * @property {Client} options.client The Discord.js client to track events for.\n * @property {string} options.api_key The API token for DiscordAnalytics.\n * @property {boolean} options.sharded Whether the Discord.js client is sharded.\n * @property {boolean} options.debug Enable or not the debug mode /!\\ MUST BE USED ONLY FOR DEVELOPMENT PURPOSES /!\\\n * @example\n * const { default: DiscordAnalytics } = require('discord-analytics/discordjs');\n * const { Client, IntentsBitField } = require('discord.js');\n * const client = new Client({\n * intents: [IntentsBitField.Flags.Guilds]\n * })\n * client.on('ready', () => {\n * const analytics = new DiscordAnalytics({\n * client: client,\n * api_key: 'YOUR_API_TOKEN'\n * });\n * analytics.init();\n * analytics.trackEvents();\n * });\n * client.login('YOUR_BOT_TOKEN');\n * @link https://discordanalytics.xyz/docs/main/get-started/installation/discord.js Check docs for more informations about advanced usages\n */\nexport default class DiscordAnalytics extends AnalyticsBase {\n private readonly _client: Client;\n private readonly _sharded: boolean = false;\n private _isReady: boolean = false;\n\n constructor(options: AnalyticsOptions<Client>) {\n super(options.api_key, options.api_url, options.debug);\n this._client = options.client;\n this._sharded = options.sharded || false;\n }\n\n /**\n * Initialize DiscordAnalytics on your bot\n * /!\\ Advanced users only\n * /!\\ Required to use DiscordAnalytics\n * /!\\ Must be used when the client is ready (recommended to use in ready event to prevent problems)\n */\n public async init(): Promise<void> {\n if (process.env.NODE_ENV !== 'production')\n return console.log(\"[DISCORDANALYTICS] NODE_ENV != 'production', initialization skipped\");\n\n if (!this._client.user)\n return console.log('[DISCORDANALYTICS] client is not ready, initialization skipped');\n\n this.client_id = this._client.user.id;\n\n await this.updateBotInformations(\n this._client.user.username,\n 'discord.js',\n npmPackageData.version,\n this._client.user.avatar,\n );\n\n this.debug('[DISCORDANALYTICS] Instance successfully initialized');\n this._isReady = true;\n\n const fast_mode = process.argv[2] === '--fast';\n this.debug(\n `[DISCORDANALYTICS] Fast mode is ${fast_mode ? 'enabled' : 'disabled'}. Stats will be sent every ${fast_mode ? '30s' : '5min'}.`,\n );\n\n setInterval(\n async () => {\n this.debug('[DISCORDANALYTICS] Sending stats...');\n\n const guildCount = this._sharded\n ? (await this._client.shard?.broadcastEval((c) => c.guilds.cache.size))?.reduce(\n (a: number, b: number) => a + b,\n 0,\n ) || 0\n : this._client.guilds.cache.size;\n\n const userCount = this._sharded\n ? (\n await this._client.shard?.broadcastEval((c) =>\n c.guilds.cache.reduce((a: number, g) => a + (g.memberCount || 0), 0),\n )\n )?.reduce((a: number, b: number) => a + b, 0) || 0\n : this._client.guilds.cache.reduce((a: number, g) => a + (g.memberCount || 0), 0);\n\n const userInstallCount = this._sharded\n ? (\n await this._client.shard?.broadcastEval(\n (c) => c.application!.approximateUserInstallCount,\n )\n )?.reduce((a, b) => a! + b!, 0) || 0\n : this._client.application!.approximateUserInstallCount || 0;\n\n const guildMembers: number[] = !this._sharded\n ? this._client.guilds.cache.map((guild) => guild.memberCount)\n : ((\n await this._client.shard?.broadcastEval((c) =>\n c.guilds.cache.map((guild) => guild.memberCount),\n )\n )?.flat() ?? []);\n\n const guildLocales: LocaleData[] = [];\n this._client.guilds.cache.map((current) =>\n guildLocales.find((x) => x.locale === current.preferredLocale)\n ? ++guildLocales.find((x) => x.locale === current.preferredLocale)!.number\n : guildLocales.push({ locale: current.preferredLocale as Locale, number: 1 }),\n );\n\n this.stats_data.guildLocales = guildLocales;\n\n await this.sendStats(\n this._client.user!.id,\n guildCount,\n userCount,\n userInstallCount,\n guildMembers,\n );\n },\n fast_mode ? 30000 : 300000,\n );\n }\n\n /**\n * Track interactions\n * /!\\ Advanced users only\n * /!\\ You need to initialize the class first\n * @param interaction BaseInteraction class and its extensions only\n * @param interactionNameResolver A function that will resolve the name of the interaction\n */\n public async trackInteractions(\n interaction: Interaction<CacheType>,\n interactionNameResolver?: (interaction: Interaction<CacheType>) => string,\n ): Promise<void> {\n this.debug(`[DISCORDANALYTICS] trackInteractions(${interaction.type}) triggered`);\n if (!this._isReady) return this.error(ErrorCodes.INSTANCE_NOT_INITIALIZED);\n\n this.updateOrInsert(\n this.stats_data.interactionsLocales,\n (x) => x.locale === interaction.locale,\n (x) => x.number++,\n (): LocaleData => ({ locale: interaction.locale as Locale, number: 1 }),\n );\n\n if (interaction.type === InteractionType.ApplicationCommand) {\n const commandType = interaction.command\n ? interaction.command.type\n : ApplicationCommandType.ChatInputCommand;\n const commandName = interactionNameResolver\n ? interactionNameResolver(interaction)\n : interaction.commandName;\n this.updateOrInsert(\n this.stats_data.interactions,\n (x) =>\n x.name === commandName && x.type === interaction.type && x.commandType === commandType,\n (x) => x.number++,\n (): InteractionData => ({\n name: commandName,\n number: 1,\n type: interaction.type,\n commandType: commandType as ApplicationCommandType,\n }),\n );\n } else if (\n interaction.type === InteractionType.MessageComponent ||\n interaction.type === InteractionType.ModalSubmit\n ) {\n const interactionName = interactionNameResolver\n ? interactionNameResolver(interaction)\n : interaction.customId;\n this.updateOrInsert(\n this.stats_data.interactions,\n (x) => x.name === interactionName && x.type === interaction.type,\n (x) => x.number++,\n (): InteractionData => ({\n name: interactionName,\n number: 1,\n type: interaction.type,\n }),\n );\n }\n\n this.updateOrInsert(\n this.stats_data.guilds,\n (x) => x.guildId === (interaction.guild ? interaction.guild.id : 'dm'),\n (x) => x.interactions++,\n (): GuildData => ({\n guildId: interaction.guild ? interaction.guild.id : 'dm',\n name: interaction.guild ? interaction.guild.name : 'DM',\n icon: interaction.guild && interaction.guild.icon,\n interactions: 1,\n members: interaction.guild ? interaction.guild.memberCount : 0,\n }),\n );\n\n const oneWeekAgo = new Date();\n oneWeekAgo.setDate(oneWeekAgo.getDate() - 7);\n\n if (!interaction.inGuild() || !interaction.guild) ++this.stats_data.usersType.privateMessage;\n else if (\n (interaction.member && interaction.memberPermissions.has(8n)) ||\n interaction.memberPermissions.has(32n)\n )\n ++this.stats_data.usersType.admin;\n else if (\n (interaction.member && interaction.memberPermissions.has(8192n)) ||\n interaction.memberPermissions.has(2n) ||\n interaction.memberPermissions.has(4n) ||\n interaction.memberPermissions.has(4194304n) ||\n interaction.memberPermissions.has(8388608n) ||\n interaction.memberPermissions.has(16777216n) ||\n interaction.memberPermissions.has(1099511627776n)\n )\n ++this.stats_data.usersType.moderator;\n else if (\n interaction.member &&\n (interaction.member as GuildMember).joinedAt &&\n (interaction.member as GuildMember).joinedAt! > oneWeekAgo\n )\n ++this.stats_data.usersType.newMember;\n }\n\n /**\n * Let DiscordAnalytics declare the events necessary for its operation.\n * /!\\ Not recommended for big bots\n * /!\\ Not compatible with other functions\n * @param interactionNameResolver A function that will resolve the name of the interaction\n */\n public trackEvents(\n interactionNameResolver?: (interaction: Interaction<CacheType>) => string,\n ): void {\n this.debug('[DISCORDANALYTICS] trackEvents() triggered');\n if (!this._isReady) return this.error(ErrorCodes.INSTANCE_NOT_INITIALIZED);\n\n this._client.on(\n 'interactionCreate',\n async (interaction) => await this.trackInteractions(interaction, interactionNameResolver),\n );\n this._client.on('guildCreate', () => this.trackGuilds('create'));\n this._client.on('guildDelete', () => this.trackGuilds('delete'));\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@discordanalytics/discordjs",
|
|
3
|
-
"version": "2.9.
|
|
3
|
+
"version": "2.9.1",
|
|
4
4
|
"description": "Discord.js package for working with Discord Analytics",
|
|
5
|
+
"license": "LGPL-2.1-only",
|
|
5
6
|
"files": [
|
|
6
7
|
"dist"
|
|
7
8
|
],
|
|
@@ -32,12 +33,12 @@
|
|
|
32
33
|
"url": "https://github.com/DiscordAnalytics/node-package/issues"
|
|
33
34
|
},
|
|
34
35
|
"dependencies": {
|
|
35
|
-
"@discordanalytics/core": "2.9.
|
|
36
|
+
"@discordanalytics/core": "2.9.1"
|
|
36
37
|
},
|
|
37
38
|
"devDependencies": {
|
|
38
|
-
"discord.js": "14.26.
|
|
39
|
-
"tsdown": "
|
|
40
|
-
"typescript": "
|
|
39
|
+
"discord.js": "14.26.4",
|
|
40
|
+
"tsdown": "0.22.1",
|
|
41
|
+
"typescript": "6.0.3"
|
|
41
42
|
},
|
|
42
43
|
"peerDependencies": {
|
|
43
44
|
"discord.js": "14.x"
|