diff --git a/package.json b/package.json index 71207c9..9ec6fea 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "typescript": "5.9.2" }, "dependencies": { - "@nhcarrigan/logger": "1.0.0", + "@nhcarrigan/discord-analytics": "0.0.6", + "@nhcarrigan/logger": "1.1.1", "discord.js": "14.22.1", "fastify": "5.6.1" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 56f8aa7..ed836e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,12 @@ importers: .: dependencies: + '@nhcarrigan/discord-analytics': + specifier: 0.0.6 + version: 0.0.6(@nhcarrigan/logger@1.1.1)(discord.js@14.22.1) '@nhcarrigan/logger': - specifier: 1.0.0 - version: 1.0.0 + specifier: 1.1.1 + version: 1.1.1 discord.js: specifier: 14.22.1 version: 14.22.1 @@ -333,6 +336,12 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@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.2.0': resolution: {integrity: sha512-YpTTqhviKMlRwKF+RC/GYiA5i2jTCmg8uftuiufldneNV5HMbGpTfBbV7tpa8++5mpYJc4+eZaf40QbDiz84dQ==} engines: {node: '>=22', pnpm: '>=9'} @@ -343,8 +352,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==} @@ -868,6 +877,10 @@ packages: core-js-compat@3.45.1: resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==} + 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'} @@ -1517,6 +1530,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 @@ -1524,6 +1540,10 @@ packages: loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + luxon@3.7.2: + resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} + engines: {node: '>=12'} + magic-bytes.js@1.12.1: resolution: {integrity: sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA==} @@ -1570,6 +1590,10 @@ packages: node-releases@2.0.21: resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + 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==} @@ -1905,6 +1929,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'} @@ -2469,6 +2496,12 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} + '@nhcarrigan/discord-analytics@0.0.6(@nhcarrigan/logger@1.1.1)(discord.js@14.22.1)': + dependencies: + '@nhcarrigan/logger': 1.1.1 + discord.js: 14.22.1 + node-schedule: 2.1.1 + '@nhcarrigan/eslint-config@5.2.0(@typescript-eslint/utils@8.45.0(eslint@9.36.0)(typescript@5.9.2))(eslint@9.36.0)(playwright@1.55.1)(react@19.1.1)(typescript@5.9.2)(vitest@3.2.4(@types/node@24.6.0)(tsx@4.20.6))': dependencies: '@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.36.0) @@ -2498,7 +2531,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.9.2)': dependencies: @@ -3059,6 +3092,10 @@ snapshots: dependencies: browserslist: 4.26.2 + cron-parser@4.9.0: + dependencies: + luxon: 3.7.2 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -3912,12 +3949,16 @@ snapshots: lodash@4.17.21: {} + long-timeout@0.1.1: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 loupe@3.2.1: {} + luxon@3.7.2: {} + magic-bytes.js@1.12.1: {} magic-string@0.30.19: @@ -3953,6 +3994,12 @@ snapshots: node-releases@2.0.21: {} + 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 @@ -4333,6 +4380,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/index.ts b/src/index.ts index f6eb039..619e463 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,7 @@ * @author Naomi Carrigan */ +import { DiscordAnalytics } from "@nhcarrigan/discord-analytics"; import { ActionRowBuilder, Client, @@ -24,10 +25,13 @@ const callista = new Client({ intents: [], }); +const analytics = new DiscordAnalytics(callista, logger); + // eslint-disable-next-line max-statements, complexity, max-lines-per-function -- Reason: It's fine like this const handleInteraction = async( interaction: BaseInteraction, ): Promise => { + await analytics.logGatewayEvent(Events.InteractionCreate, { ...interaction }); if (interaction.isButton()) { if (!interaction.channel) { await callista.channels.fetch(interaction.channelId); @@ -83,6 +87,7 @@ const handleInteraction = async( callista.once("ready", () => { void logger.log("debug", "Callista is online!"); + analytics.startCron(); }); callista.on(Events.InteractionCreate, (interaction) => { diff --git a/src/interactions/bookmark.ts b/src/interactions/bookmark.ts index 3a91ebd..4a149c5 100644 --- a/src/interactions/bookmark.ts +++ b/src/interactions/bookmark.ts @@ -12,6 +12,7 @@ import { import { addNote } from "../buttons/addNote.js"; import { discord } from "../buttons/discord.js"; import { donate } from "../buttons/donate.js"; +import { logger } from "../utils/logger.js"; /** * Bookmarks the target message by sending the user a DM with the message link. @@ -50,4 +51,5 @@ export const bookmark = async( await interaction.editReply({ content: "✅ I've sent you a DM with the message link!", }); + await logger.metric("bookmarks", 1, { user: user.id }); }; diff --git a/src/interactions/deleteCmd.ts b/src/interactions/deleteCmd.ts index aeb9512..5b32ebb 100644 --- a/src/interactions/deleteCmd.ts +++ b/src/interactions/deleteCmd.ts @@ -4,6 +4,7 @@ * @author Naomi Carrigan */ +import { logger } from "../utils/logger.js"; import type { MessageContextMenuCommandInteraction } from "discord.js"; /** @@ -20,4 +21,5 @@ export const deleteCmd = async( await interaction.editReply({ content: "✅ I've deleted the target message!", }); + await logger.metric("bookmark", -1, { user: interaction.user.id }); };