From d90cc09620704980c0d2914d9e60fa0e232bf00c Mon Sep 17 00:00:00 2001 From: Evan Song <52982404+ferothefox@users.noreply.github.com> Date: Fri, 22 Nov 2024 16:25:33 -0700 Subject: [PATCH] Implements MOD-171: Intercom messenger integration on servers panel (#2959) * feat: intercom Signed-off-by: Evan Song * fix: double check Signed-off-by: Evan Song * fix: address double booting Signed-off-by: Evan Song --------- Signed-off-by: Evan Song --- apps/frontend/package.json | 1 + .../src/pages/servers/manage/[id].vue | 37 ++++++ pnpm-lock.yaml | 116 +++++++++++------- 3 files changed, 110 insertions(+), 44 deletions(-) diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 8311f3689..e3f10d292 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -34,6 +34,7 @@ }, "dependencies": { "@formatjs/intl-localematcher": "^0.5.4", + "@intercom/messenger-js-sdk": "^0.0.14", "@ltd/j-toml": "^1.38.0", "@modrinth/assets": "workspace:*", "@modrinth/ui": "workspace:*", diff --git a/apps/frontend/src/pages/servers/manage/[id].vue b/apps/frontend/src/pages/servers/manage/[id].vue index 2348558ee..c5d680d7f 100644 --- a/apps/frontend/src/pages/servers/manage/[id].vue +++ b/apps/frontend/src/pages/servers/manage/[id].vue @@ -266,6 +266,7 @@ import { import DOMPurify from "dompurify"; import { ButtonStyled } from "@modrinth/ui"; import { refThrottled } from "@vueuse/core"; +import { Intercom, shutdown } from "@intercom/messenger-js-sdk"; import type { ServerState, Stats, WSEvent, WSInstallationResultEvent } from "~/types/servers"; const socket = ref(null); @@ -275,6 +276,19 @@ const reconnectInterval = ref | null>(null); const isFirstMount = ref(true); const isMounted = ref(true); +const INTERCOM_APP_ID = ref("ykeritl9"); +const auth = await useAuth(); +// @ts-expect-error - Auth is untyped +const userId = ref(auth.value?.user?.id ?? null); +// @ts-expect-error - Auth is untyped +const username = ref(auth.value?.user?.username ?? null); +// @ts-expect-error - Auth is untyped +const email = ref(auth.value?.user?.email ?? null); +const createdAt = ref( + // @ts-expect-error - Auth is untyped + auth.value?.user?.created ? Math.floor(new Date(auth.value.user.created).getTime() / 1000) : null, +); + const route = useNativeRoute(); const router = useRouter(); const serverId = route.params.id as string; @@ -735,6 +749,8 @@ const openInstallLog = () => { const cleanup = () => { isMounted.value = false; + shutdown(); + stopPolling(); stopUptimeUpdates(); if (reconnectInterval.value) { @@ -774,6 +790,27 @@ onMounted(() => { connectWebSocket(); } + if (username.value && email.value && userId.value && createdAt.value) { + const currentUser = auth.value?.user as any; + const matches = + username.value === currentUser?.username && + email.value === currentUser?.email && + userId.value === currentUser?.id && + createdAt.value === Math.floor(new Date(currentUser?.created).getTime() / 1000); + + if (matches) { + Intercom({ + app_id: INTERCOM_APP_ID.value, + userId: userId.value, + name: username.value, + email: email.value, + created_at: createdAt.value, + }); + } else { + console.warn("[PYROSERVERS][INTERCOM] mismatch"); + } + } + DOMPurify.addHook( "afterSanitizeAttributes", (node: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5bf0ba244..daea7ec19 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -79,7 +79,7 @@ importers: version: 1.11.11 floating-vue: specifier: ^5.2.2 - version: 5.2.2(@nuxt/kit@3.12.3)(vue@3.4.31(typescript@5.5.4)) + version: 5.2.2(@nuxt/kit@3.12.3(magicast@0.3.5)(rollup@4.21.2))(vue@3.4.31(typescript@5.5.4)) ofetch: specifier: ^1.3.4 version: 1.3.4 @@ -188,6 +188,9 @@ importers: '@formatjs/intl-localematcher': specifier: ^0.5.4 version: 0.5.4 + '@intercom/messenger-js-sdk': + specifier: ^0.0.14 + version: 0.0.14 '@ltd/j-toml': specifier: ^1.38.0 version: 1.38.0 @@ -410,7 +413,7 @@ importers: version: 1.11.11 floating-vue: specifier: 2.0.0-beta.24 - version: 2.0.0-beta.24(@nuxt/kit@3.12.3(rollup@3.29.4))(vue@3.4.31(typescript@5.5.4)) + version: 2.0.0-beta.24(@nuxt/kit@3.12.3(magicast@0.3.5)(rollup@3.29.4))(vue@3.4.31(typescript@5.5.4)) highlight.js: specifier: ^11.9.0 version: 11.9.0 @@ -438,7 +441,7 @@ importers: version: 6.2.12(@vue/compiler-core@3.4.31)(vue@3.4.31(typescript@5.5.4)) '@vintl/unplugin': specifier: ^1.5.1 - version: 1.5.2(@vue/compiler-core@3.4.31)(rollup@3.29.4)(vite@4.5.3)(vue@3.4.31(typescript@5.5.4))(webpack@5.92.1) + version: 1.5.2(@vue/compiler-core@3.4.31)(rollup@3.29.4)(vite@4.5.3(@types/node@22.4.1)(sass@1.77.6)(terser@5.31.6))(vue@3.4.31(typescript@5.5.4))(webpack@5.92.1) '@vintl/vintl': specifier: ^4.4.1 version: 4.4.1(typescript@5.5.4)(vue@3.4.31(typescript@5.5.4)) @@ -1760,6 +1763,9 @@ packages: cpu: [x64] os: [win32] + '@intercom/messenger-js-sdk@0.0.14': + resolution: {integrity: sha512-2dH4BDAh9EI90K7hUkAdZ76W79LM45Sd1OBX7t6Vzy8twpNiQ5X+7sH9G5hlJlkSGnf+vFWlFcy9TOYAyEs1hA==} + '@ioredis/commands@1.2.0': resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} @@ -9323,6 +9329,8 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true + '@intercom/messenger-js-sdk@0.0.14': {} + '@ioredis/commands@1.2.0': {} '@isaacs/cliui@8.0.2': @@ -9586,9 +9594,9 @@ snapshots: - supports-color - typescript - '@nuxt/kit@3.12.3': + '@nuxt/kit@3.12.3(magicast@0.3.4)(rollup@4.18.0)': dependencies: - '@nuxt/schema': 3.12.3 + '@nuxt/schema': 3.12.3(rollup@4.18.0) c12: 1.11.1(magicast@0.3.4) consola: 3.2.3 defu: 6.1.4 @@ -9606,18 +9614,17 @@ snapshots: semver: 7.6.2 ufo: 1.5.3 unctx: 2.3.1 - unimport: 3.7.2 + unimport: 3.7.2(rollup@4.18.0) untyped: 1.4.2 transitivePeerDependencies: - magicast - rollup - supports-color - optional: true - '@nuxt/kit@3.12.3(magicast@0.3.4)(rollup@4.18.0)': + '@nuxt/kit@3.12.3(magicast@0.3.5)(rollup@3.29.4)': dependencies: - '@nuxt/schema': 3.12.3(rollup@4.18.0) - c12: 1.11.1(magicast@0.3.4) + '@nuxt/schema': 3.12.3(rollup@3.29.4) + c12: 1.11.1(magicast@0.3.5) consola: 3.2.3 defu: 6.1.4 destr: 2.0.3 @@ -9634,17 +9641,18 @@ snapshots: semver: 7.6.2 ufo: 1.5.3 unctx: 2.3.1 - unimport: 3.7.2(rollup@4.18.0) + unimport: 3.7.2(rollup@3.29.4) untyped: 1.4.2 transitivePeerDependencies: - magicast - rollup - supports-color + optional: true - '@nuxt/kit@3.12.3(rollup@3.29.4)': + '@nuxt/kit@3.12.3(magicast@0.3.5)(rollup@4.21.2)': dependencies: - '@nuxt/schema': 3.12.3(rollup@3.29.4) - c12: 1.11.1(magicast@0.3.4) + '@nuxt/schema': 3.12.3(rollup@4.21.2) + c12: 1.11.1(magicast@0.3.5) consola: 3.2.3 defu: 6.1.4 destr: 2.0.3 @@ -9661,7 +9669,7 @@ snapshots: semver: 7.6.2 ufo: 1.5.3 unctx: 2.3.1 - unimport: 3.7.2(rollup@3.29.4) + unimport: 3.7.2(rollup@4.21.2) untyped: 1.4.2 transitivePeerDependencies: - magicast @@ -9669,7 +9677,7 @@ snapshots: - supports-color optional: true - '@nuxt/schema@3.12.3': + '@nuxt/schema@3.12.3(rollup@3.29.4)': dependencies: compatx: 0.1.8 consola: 3.2.3 @@ -9681,14 +9689,14 @@ snapshots: std-env: 3.7.0 ufo: 1.5.3 uncrypto: 0.1.3 - unimport: 3.7.2 + unimport: 3.7.2(rollup@3.29.4) untyped: 1.4.2 transitivePeerDependencies: - rollup - supports-color optional: true - '@nuxt/schema@3.12.3(rollup@3.29.4)': + '@nuxt/schema@3.12.3(rollup@4.18.0)': dependencies: compatx: 0.1.8 consola: 3.2.3 @@ -9700,14 +9708,13 @@ snapshots: std-env: 3.7.0 ufo: 1.5.3 uncrypto: 0.1.3 - unimport: 3.7.2(rollup@3.29.4) + unimport: 3.7.2(rollup@4.18.0) untyped: 1.4.2 transitivePeerDependencies: - rollup - supports-color - optional: true - '@nuxt/schema@3.12.3(rollup@4.18.0)': + '@nuxt/schema@3.12.3(rollup@4.21.2)': dependencies: compatx: 0.1.8 consola: 3.2.3 @@ -9719,11 +9726,12 @@ snapshots: std-env: 3.7.0 ufo: 1.5.3 uncrypto: 0.1.3 - unimport: 3.7.2(rollup@4.18.0) + unimport: 3.7.2(rollup@4.21.2) untyped: 1.4.2 transitivePeerDependencies: - rollup - supports-color + optional: true '@nuxt/telemetry@2.5.4(magicast@0.3.4)(rollup@4.18.0)': dependencies: @@ -9808,7 +9816,7 @@ snapshots: '@nuxtjs/eslint-config-typescript@12.1.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3)': dependencies: - '@nuxtjs/eslint-config': 12.0.0(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6)) + '@nuxtjs/eslint-config': 12.0.0(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@9.13.0(jiti@1.21.6)) '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3) '@typescript-eslint/parser': 6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3) eslint: 9.13.0(jiti@1.21.6) @@ -9821,10 +9829,10 @@ snapshots: - supports-color - typescript - '@nuxtjs/eslint-config@12.0.0(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6))': + '@nuxtjs/eslint-config@12.0.0(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@9.13.0(jiti@1.21.6))': dependencies: eslint: 9.13.0(jiti@1.21.6) - eslint-config-standard: 17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@9.13.0(jiti@1.21.6)))(eslint-plugin-n@15.7.0(eslint@9.13.0(jiti@1.21.6)))(eslint-plugin-promise@6.4.0(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6)) + eslint-config-standard: 17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@15.7.0(eslint@9.13.0(jiti@1.21.6)))(eslint-plugin-promise@6.4.0(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6)) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@9.13.0(jiti@1.21.6)) eslint-plugin-n: 15.7.0(eslint@9.13.0(jiti@1.21.6)) eslint-plugin-node: 11.1.0(eslint@9.13.0(jiti@1.21.6)) @@ -10943,7 +10951,7 @@ snapshots: - vue - webpack - '@vintl/unplugin@1.5.2(@vue/compiler-core@3.4.31)(rollup@3.29.4)(vite@4.5.3)(vue@3.4.31(typescript@5.5.4))(webpack@5.92.1)': + '@vintl/unplugin@1.5.2(@vue/compiler-core@3.4.31)(rollup@3.29.4)(vite@4.5.3(@types/node@22.4.1)(sass@1.77.6)(terser@5.31.6))(vue@3.4.31(typescript@5.5.4))(webpack@5.92.1)': dependencies: '@formatjs/cli-lib': 6.4.2(@vue/compiler-core@3.4.31)(vue@3.4.31(typescript@5.5.4)) '@formatjs/icu-messageformat-parser': 2.7.8 @@ -10954,7 +10962,7 @@ snapshots: unplugin: 1.11.0 optionalDependencies: rollup: 3.29.4 - vite: 4.5.3 + vite: 4.5.3(@types/node@22.4.1)(sass@1.77.6)(terser@5.31.6) webpack: 5.92.1 transitivePeerDependencies: - '@glimmer/env' @@ -11881,6 +11889,24 @@ snapshots: optionalDependencies: magicast: 0.3.4 + c12@1.11.1(magicast@0.3.5): + dependencies: + chokidar: 3.6.0 + confbox: 0.1.7 + defu: 6.1.4 + dotenv: 16.4.5 + giget: 1.2.3 + jiti: 1.21.6 + mlly: 1.7.1 + ohash: 1.1.3 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.1.3 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.5 + optional: true + cac@6.7.14: {} call-bind@1.0.7: @@ -12596,10 +12622,10 @@ snapshots: dependencies: eslint: 9.13.0(jiti@1.21.6) - eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@9.13.0(jiti@1.21.6)))(eslint-plugin-n@15.7.0(eslint@9.13.0(jiti@1.21.6)))(eslint-plugin-promise@6.4.0(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6)): + eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1)(eslint-plugin-n@15.7.0(eslint@9.13.0(jiti@1.21.6)))(eslint-plugin-promise@6.4.0(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6)): dependencies: eslint: 9.13.0(jiti@1.21.6) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@9.13.0(jiti@1.21.6)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.16.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint@9.13.0(jiti@1.21.6)) eslint-plugin-n: 15.7.0(eslint@9.13.0(jiti@1.21.6)) eslint-plugin-promise: 6.4.0(eslint@9.13.0(jiti@1.21.6)) @@ -12625,7 +12651,7 @@ snapshots: debug: 4.3.5 enhanced-resolve: 5.17.0 eslint: 9.13.0(jiti@1.21.6) - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6)) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@9.13.0(jiti@1.21.6)) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.16.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint@9.13.0(jiti@1.21.6)) fast-glob: 3.3.2 get-tsconfig: 4.7.5 @@ -12637,13 +12663,12 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@9.13.0(jiti@1.21.6)))(eslint@9.13.0(jiti@1.21.6)): + eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@9.13.0(jiti@1.21.6)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3) eslint: 9.13.0(jiti@1.21.6) - eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@9.13.0(jiti@1.21.6)) transitivePeerDependencies: - supports-color @@ -13226,21 +13251,21 @@ snapshots: vue: 3.4.31(typescript@5.5.3) vue-resize: 2.0.0-alpha.1(vue@3.4.31(typescript@5.5.3)) - floating-vue@2.0.0-beta.24(@nuxt/kit@3.12.3(rollup@3.29.4))(vue@3.4.31(typescript@5.5.4)): + floating-vue@2.0.0-beta.24(@nuxt/kit@3.12.3(magicast@0.3.5)(rollup@3.29.4))(vue@3.4.31(typescript@5.5.4)): dependencies: '@floating-ui/dom': 1.1.1 vue: 3.4.31(typescript@5.5.4) vue-resize: 2.0.0-alpha.1(vue@3.4.31(typescript@5.5.4)) optionalDependencies: - '@nuxt/kit': 3.12.3(rollup@3.29.4) + '@nuxt/kit': 3.12.3(magicast@0.3.5)(rollup@3.29.4) - floating-vue@5.2.2(@nuxt/kit@3.12.3)(vue@3.4.31(typescript@5.5.4)): + floating-vue@5.2.2(@nuxt/kit@3.12.3(magicast@0.3.5)(rollup@4.21.2))(vue@3.4.31(typescript@5.5.4)): dependencies: '@floating-ui/dom': 1.1.1 vue: 3.4.31(typescript@5.5.4) vue-resize: 2.0.0-alpha.1(vue@3.4.31(typescript@5.5.4)) optionalDependencies: - '@nuxt/kit': 3.12.3 + '@nuxt/kit': 3.12.3(magicast@0.3.5)(rollup@4.21.2) for-each@0.3.3: dependencies: @@ -16747,9 +16772,9 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 - unimport@3.7.2: + unimport@3.7.2(rollup@3.29.4): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) acorn: 8.12.1 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 @@ -16766,9 +16791,9 @@ snapshots: - rollup optional: true - unimport@3.7.2(rollup@3.29.4): + unimport@3.7.2(rollup@4.18.0): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) acorn: 8.12.1 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 @@ -16783,11 +16808,10 @@ snapshots: unplugin: 1.11.0 transitivePeerDependencies: - rollup - optional: true - unimport@3.7.2(rollup@4.18.0): + unimport@3.7.2(rollup@4.21.2): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) acorn: 8.12.1 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 @@ -16802,6 +16826,7 @@ snapshots: unplugin: 1.11.0 transitivePeerDependencies: - rollup + optional: true unist-util-find-after@5.0.0: dependencies: @@ -17059,13 +17084,16 @@ snapshots: svgo: 3.3.2 vue: 3.4.31(typescript@5.5.4) - vite@4.5.3: + vite@4.5.3(@types/node@22.4.1)(sass@1.77.6)(terser@5.31.6): dependencies: esbuild: 0.18.20 postcss: 8.4.45 rollup: 3.29.4 optionalDependencies: + '@types/node': 22.4.1 fsevents: 2.3.3 + sass: 1.77.6 + terser: 5.31.6 optional: true vite@5.3.3(@types/node@20.14.9)(sass@1.77.6)(terser@5.31.6):