diff --git a/package.json b/package.json index 4a6b367..f32dd63 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ }, "dependencies": { "@anthropic-ai/sdk": "0.36.3", - "@nhcarrigan/logger": "1.0.0", + "@nhcarrigan/discord-analytics": "0.0.6", + "@nhcarrigan/logger": "1.1.1", "@prisma/client": "6.4.1", "discord.js": "14.18.0", "fastify": "5.2.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 17e69b8..6a33a7e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,9 +11,12 @@ importers: '@anthropic-ai/sdk': specifier: 0.36.3 version: 0.36.3 + '@nhcarrigan/discord-analytics': + specifier: 0.0.6 + version: 0.0.6(@nhcarrigan/logger@1.1.1)(discord.js@14.18.0) '@nhcarrigan/logger': - specifier: 1.0.0 - version: 1.0.0 + specifier: 1.1.1 + version: 1.1.1 '@prisma/client': specifier: 6.4.1 version: 6.4.1(prisma@6.4.1(typescript@5.7.3))(typescript@5.7.3) @@ -424,6 +427,12 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@nhcarrigan/discord-analytics@0.0.6': + resolution: {integrity: sha512-Mci/zSY2nE24BM2cZx5EiYqwpRTTCBznFfs2BphejzDAaWPt1P12V5ln7OSUbFLGhvTD/Qwi0za3yPv6shQLoA==} + peerDependencies: + '@nhcarrigan/logger': '>=1.1.0-hotfix' + discord.js: ^14.0.0 + '@nhcarrigan/eslint-config@5.1.0': resolution: {integrity: sha512-TS6kwPTcm8pFzp34FRq+8PR+0jgVr7FDUDrfilAKtWDArqZSabTMtTt+N1rJyNHQqBHs7de/pUYNWiLpThy2Bw==} engines: {node: '>=22', pnpm: '>=9'} @@ -434,8 +443,8 @@ packages: typescript: '>=5' vitest: '>=2' - '@nhcarrigan/logger@1.0.0': - resolution: {integrity: sha512-2e19Bie+ZKb6yKPKjhawqsENkhHatYkvBAmFZx9eToOXdOca+CYi51tldRMtejg6e0+4hOOf2bo5zdBQKmH0dw==} + '@nhcarrigan/logger@1.1.1': + resolution: {integrity: sha512-P6OEQFHDtf6psybYGljuCxkSW6DLQCsx1aZZ3w4YKBXHBFjDbhuvpM9K1kPhVN48hakitx2WPLEoIFr6YZELYw==} '@nhcarrigan/typescript-config@4.0.0': resolution: {integrity: sha512-969HVha7A/Sg77fuMwOm6p14a+7C5iE6g55OD71srqwKIgksQl+Ex/hAI/pyzTQFDQ/FBJbpnHlR4Ov25QV/rw==} @@ -997,6 +1006,10 @@ packages: core-js-compat@3.40.0: resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==} + cron-parser@4.9.0: + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1713,6 +1726,9 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + long-timeout@0.1.1: + resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -1726,6 +1742,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + luxon@3.7.2: + resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} + engines: {node: '>=12'} + magic-bytes.js@1.10.0: resolution: {integrity: sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==} @@ -1804,6 +1824,10 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-schedule@2.1.1: + resolution: {integrity: sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==} + engines: {node: '>=6'} + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -2151,6 +2175,9 @@ packages: sonic-boom@4.2.0: resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + sorted-array-functions@1.3.0: + resolution: {integrity: sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2867,6 +2894,12 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@nhcarrigan/discord-analytics@0.0.6(@nhcarrigan/logger@1.1.1)(discord.js@14.18.0)': + dependencies: + '@nhcarrigan/logger': 1.1.1 + discord.js: 14.18.0 + node-schedule: 2.1.1 + '@nhcarrigan/eslint-config@5.1.0(@typescript-eslint/utils@8.24.0(eslint@9.20.0)(typescript@5.7.3))(eslint@9.20.0)(playwright@1.50.1)(react@19.0.0)(typescript@5.7.3)(vitest@3.0.5(@types/node@22.13.1))': dependencies: '@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.20.0) @@ -2896,7 +2929,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - '@nhcarrigan/logger@1.0.0': {} + '@nhcarrigan/logger@1.1.1': {} '@nhcarrigan/typescript-config@4.0.0(typescript@5.7.3)': dependencies: @@ -3497,6 +3530,10 @@ snapshots: dependencies: browserslist: 4.24.4 + cron-parser@4.9.0: + dependencies: + luxon: 3.7.2 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -4427,6 +4464,8 @@ snapshots: lodash@4.17.21: {} + long-timeout@0.1.1: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -4439,6 +4478,8 @@ snapshots: dependencies: yallist: 3.1.1 + luxon@3.7.2: {} + magic-bytes.js@1.10.0: {} magic-string@0.30.17: @@ -4498,6 +4539,12 @@ snapshots: node-releases@2.0.19: {} + node-schedule@2.1.1: + dependencies: + cron-parser: 4.9.0 + long-timeout: 0.1.1 + sorted-array-functions: 1.3.0 + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -4888,6 +4935,8 @@ snapshots: dependencies: atomic-sleep: 1.0.0 + sorted-array-functions@1.3.0: {} + source-map-js@1.2.1: {} spdx-correct@3.2.0: diff --git a/src/config/entitledGuilds.ts b/src/config/entitledGuilds.ts index 7fa4541..ec3d6a7 100644 --- a/src/config/entitledGuilds.ts +++ b/src/config/entitledGuilds.ts @@ -10,6 +10,5 @@ */ export const entitledGuilds = [ "443134315778539530", - "1146133490933436476", - "1341981919180750898" + "1354624415861833870", ]; diff --git a/src/index.ts b/src/index.ts index 9fa9d1a..7b995a5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,6 +12,7 @@ import { role } from "./modules/role.js"; import { start } from "./modules/start.js"; import { instantiateServer } from "./server/serve.js"; import { logger } from "./utils/logger.js"; +import { DiscordAnalytics } from "@nhcarrigan/discord-analytics"; process.on("unhandledRejection", (error) => { if (error instanceof Error) { @@ -33,6 +34,8 @@ const client = new Client({ intents: [ GatewayIntentBits.Guilds ], }); +const analytics = new DiscordAnalytics(client, logger); + const database = new PrismaClient(); // eslint-disable-next-line max-lines-per-function -- One too many... @@ -98,6 +101,7 @@ client.on(Events.EntitlementDelete, (entitlement) => { client.on(Events.ClientReady, () => { void logger.log("debug", "Bot is ready."); + analytics.startCron(); }); instantiateServer(); diff --git a/src/modules/about.ts b/src/modules/about.ts index c157289..675d81d 100644 --- a/src/modules/about.ts +++ b/src/modules/about.ts @@ -69,6 +69,7 @@ export const about = async( components: [ row ], embeds: [ embed ], }); + await logger.metric("about_command", 1, {}); } catch (error) { await replyToError(interaction); if (error instanceof Error) { diff --git a/src/modules/close.ts b/src/modules/close.ts index 0c3ac1d..b1b3c04 100644 --- a/src/modules/close.ts +++ b/src/modules/close.ts @@ -106,6 +106,7 @@ Discord will auto-archive it, or if you are done discussing and want it out of t }).catch(() => { return null; }); + await logger.metric("close_command", 1, {}); } catch (error) { await replyToError(interaction); if (error instanceof Error) { diff --git a/src/modules/open.ts b/src/modules/open.ts index c409891..1bdcb95 100644 --- a/src/modules/open.ts +++ b/src/modules/open.ts @@ -107,6 +107,7 @@ export const open = async( await interaction.editReply({ content: `Ticket created~!`, }); + await logger.metric("open_command", 1, {}); } catch (error) { await replyToError(interaction); if (error instanceof Error) { diff --git a/src/modules/role.ts b/src/modules/role.ts index 0d2377b..db9154c 100644 --- a/src/modules/role.ts +++ b/src/modules/role.ts @@ -60,6 +60,7 @@ export const role = async( await interaction.editReply({ content: `Your support role has been set to <@&${supportRole.id}>. This role will be pinged in new tickets.`, }); + await logger.metric("role_command", 1, {}); } catch (error) { await replyToError(interaction); if (error instanceof Error) { diff --git a/src/modules/start.ts b/src/modules/start.ts index b2f42fc..8252090 100644 --- a/src/modules/start.ts +++ b/src/modules/start.ts @@ -109,6 +109,7 @@ export const start = async( await interaction.editReply({ content: "Your ticket system is ready!", }); + await logger.metric("start_command", 1, {}); } catch (error) { await replyToError(interaction); if (error instanceof Error) {