From 6987d426c6008ada02daba859ad746c500f2e129 Mon Sep 17 00:00:00 2001 From: nolhan Date: Thu, 15 Jan 2026 14:41:06 +0100 Subject: [PATCH 1/5] feat(stats): added user installs support --- packages/core/src/index.ts | 4 ++++ packages/discordjs-light/src/index.ts | 6 +++++- packages/discordjs/src/index.ts | 6 +++++- packages/eris/src/index.ts | 2 +- packages/oceanic/src/index.ts | 3 ++- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 2ba9966..b92cb5a 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -39,6 +39,7 @@ export class AnalyticsBase { private_message: 0, }, custom_events: {} as Record, + user_install_count: 0, }; public client_id: string = ''; @@ -160,6 +161,7 @@ export class AnalyticsBase { * @param client_id The client ID of the bot * @param guild_count The number of guilds the bot is in (default: 0) * @param user_count The number of users the bot is in (default: 0) + * @param user_install_count The number of user installs (default: 0) * @param guild_members The number of members in each guild (optional) * @returns {Promise} A promise that resolves when the stats are sent */ @@ -167,6 +169,7 @@ export class AnalyticsBase { client_id: string, guild_count: number = 0, user_count: number = 0, + user_install_count: number = 0, guild_members: number[] = [], ): Promise { this.debug('[DISCORDANALYTICS] Sending stats...'); @@ -197,6 +200,7 @@ export class AnalyticsBase { private_message: 0, }, custom_events: this.stats_data.custom_events, + user_install_count: user_install_count, } } } diff --git a/packages/discordjs-light/src/index.ts b/packages/discordjs-light/src/index.ts index 8d0e1eb..2223eaf 100644 --- a/packages/discordjs-light/src/index.ts +++ b/packages/discordjs-light/src/index.ts @@ -78,13 +78,17 @@ export default class DiscordAnalytics extends AnalyticsBase { ? ((await this._client.shard?.broadcastEval((c: any) => c.guilds.cache.reduce((a: number, g: any) => a + (g.memberCount || 0), 0)))?.reduce((a: number, b: number) => a + b, 0) || 0) : this._client.guilds.cache.reduce((a: number, g: any) => a + (g.memberCount || 0), 0); + const userInstallCount = this._sharded + ? ((await this._client.shard?.broadcastEval((c: any) => c.approximateUserInstallCount))?.reduce((a: number, b: number) => a + b, 0) || 0) + : this._client.approximateUserInstallCount; + const guildMembers: number[] = !this._sharded ? this._client.guilds.cache.map((guild: any) => guild.memberCount) : ((await this._client.shard?.broadcastEval( (c: any) => c.guilds.cache.map((guild: any) => guild.memberCount) ))?.flat() ?? []); - await this.sendStats(this._client.user.id, guildCount, userCount, guildMembers); + await this.sendStats(this._client.user.id, guildCount, userCount, userInstallCount, guildMembers); }, fast_mode ? 30000 : 300000); } diff --git a/packages/discordjs/src/index.ts b/packages/discordjs/src/index.ts index 6eda221..47cfe02 100644 --- a/packages/discordjs/src/index.ts +++ b/packages/discordjs/src/index.ts @@ -79,13 +79,17 @@ export default class DiscordAnalytics extends AnalyticsBase { ? ((await this._client.shard?.broadcastEval((c: any) => c.guilds.cache.reduce((a: number, g: any) => a + (g.memberCount || 0), 0)))?.reduce((a: number, b: number) => a + b, 0) || 0) : this._client.guilds.cache.reduce((a: number, g: any) => a + (g.memberCount || 0), 0); + const userInstallCount = this._sharded + ? ((await this._client.shard?.broadcastEval((c: any) => c.approximateUserInstallCount))?.reduce((a: number, b: number) => a + b, 0) || 0) + : this._client.approximateUserInstallCount; + const guildMembers: number[] = !this._sharded ? this._client.guilds.cache.map((guild: any) => guild.memberCount) : ((await this._client.shard?.broadcastEval( (c: any) => c.guilds.cache.map((guild: any) => guild.memberCount) ))?.flat() ?? []); - await this.sendStats(this._client.user.id, guildCount, userCount, guildMembers); + await this.sendStats(this._client.user.id, guildCount, userCount, userInstallCount, guildMembers); }, fast_mode ? 30000 : 300000); } diff --git a/packages/eris/src/index.ts b/packages/eris/src/index.ts index 80e3422..576940b 100644 --- a/packages/eris/src/index.ts +++ b/packages/eris/src/index.ts @@ -73,7 +73,7 @@ export default class DiscordAnalytics extends AnalyticsBase { const userCount = this._client.guilds.reduce((a: number, g: any) => a + g.memberCount, 0); const guildMembers: number[] = this._client.guilds.map((guild: any) => guild.memberCount); - await this.sendStats(this._client.user.id, guildCount, userCount, guildMembers); + await this.sendStats(this._client.user.id, guildCount, userCount, 0, guildMembers); }, fast_mode ? 30000 : 300000); } diff --git a/packages/oceanic/src/index.ts b/packages/oceanic/src/index.ts index 1b13240..82b1a89 100644 --- a/packages/oceanic/src/index.ts +++ b/packages/oceanic/src/index.ts @@ -74,9 +74,10 @@ export default class DiscordAnalytics extends AnalyticsBase { const guildCount = this._client.guilds.toArray().length; const userCount = this._client.guilds.reduce((a: number, g: any) => a + (g.memberCount || 0), 0); + const userInstallCount = this._client.application.approximateUserInstallCount const guildMembers: number[] = this._client.guilds.map((guild: any) => guild.memberCount); - await this.sendStats(this._client.user.id, guildCount, userCount, guildMembers); + await this.sendStats(this._client.user.id, guildCount, userCount, 0, guildMembers); }, fast_mode ? 30000 : 300000); } From 2d6b2c195cddecc42232b45b89f6bf78446e6318 Mon Sep 17 00:00:00 2001 From: nolhan Date: Thu, 15 Jan 2026 14:41:32 +0100 Subject: [PATCH 2/5] fix(examples): fixed type error in oceanic example --- packages/oceanic/examples/index.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/oceanic/examples/index.ts b/packages/oceanic/examples/index.ts index ff37f95..3aed2b0 100644 --- a/packages/oceanic/examples/index.ts +++ b/packages/oceanic/examples/index.ts @@ -1,5 +1,14 @@ import DiscordAnalytics from '../src/index'; -import { ApplicationCommandOptionTypes, ApplicationCommandTypes, ButtonStyles, Client, ComponentTypes, InteractionTypes, TextInputStyles } from 'oceanic.js'; +import { + Application, + ApplicationCommandOptionTypes, + ApplicationCommandTypes, + ButtonStyles, + Client, + ComponentTypes, + InteractionTypes, + TextInputStyles +} from 'oceanic.js'; import 'dotenv/config'; const client = new Client({ @@ -126,7 +135,7 @@ client.on('interactionCreate', async (interaction) => { components: [], }); } else if (interaction.isModalSubmitInteraction()) { - const input = interaction.data.components.getComponents()[0].value; + const input = interaction.data.components.getComponents()[0].customID; interaction.reply({ content: `You submitted the modal! ${input}`, }); From 4814c7e73fbff1082de64806231ceb4610c0585a Mon Sep 17 00:00:00 2001 From: nolhan Date: Thu, 15 Jan 2026 14:49:37 +0100 Subject: [PATCH 3/5] feat(ci): added pnpm support to semantic release --- .github/workflows/release.yml | 3 ++- .releaserc.json | 13 +++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d525281..a111393 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,6 +13,7 @@ jobs: contents: write issues: write pull-requests: write + id-token: write steps: - name: Checkout uses: actions/checkout@v6 @@ -22,6 +23,6 @@ jobs: extra_plugins: | @semantic-release/changelog @semantic-release/git - @anolilab/multi-semantic-release + @anolilab/semantic-release-pnpm env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.releaserc.json b/.releaserc.json index 511bd71..3ed2716 100644 --- a/.releaserc.json +++ b/.releaserc.json @@ -1,7 +1,16 @@ { "branches": ["master"], "plugins": [ - "@semantic-release/commit-analyzer", + [ + "@semantic-release/commit-analyzer", + { + "releaseRules": [ + { "type": "refactor", "release": "patch" }, + { "type": "chore", "release": "patch" }, + { "type": "ci", "release": "patch" }, + ] + } + ], "@semantic-release/release-notes-generator", [ "@semantic-release/changelog", @@ -13,7 +22,7 @@ "@semantic-release/github" ], "extends": [ - "@anolilab/multi-semantic-release" + "@anolilab/semantic-release-pnpm" ], "dryRun": false } \ No newline at end of file From 5559474744ec0026f4244cb6e3eefb2361f89b72 Mon Sep 17 00:00:00 2001 From: nolhan Date: Thu, 15 Jan 2026 14:52:53 +0100 Subject: [PATCH 4/5] fix(ci): fix semantic release config file --- .releaserc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.releaserc.json b/.releaserc.json index 3ed2716..41c4b2a 100644 --- a/.releaserc.json +++ b/.releaserc.json @@ -7,7 +7,7 @@ "releaseRules": [ { "type": "refactor", "release": "patch" }, { "type": "chore", "release": "patch" }, - { "type": "ci", "release": "patch" }, + { "type": "ci", "release": "patch" } ] } ], From c5a300c4674698bbe2cc39470e87e3d03a79a939 Mon Sep 17 00:00:00 2001 From: Nolhan Date: Fri, 16 Jan 2026 09:37:40 +0100 Subject: [PATCH 5/5] refactor: fixed duplicated variable call --- packages/core/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index b92cb5a..79729b4 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -200,7 +200,7 @@ export class AnalyticsBase { private_message: 0, }, custom_events: this.stats_data.custom_events, - user_install_count: user_install_count, + user_install_count, } } }