From 2a430befbf793101b13fe75fd909362c4af966be Mon Sep 17 00:00:00 2001 From: qwerinope Date: Tue, 24 Jun 2025 01:36:43 +0200 Subject: [PATCH] change sendMessage wrapper, migrate from websocket connection to webhook for EventSub (reverse proxy) --- .example.env | 5 +++++ bot/commands/index.ts | 4 ++-- bot/commands/ping.ts | 2 +- bot/commands/yabai.ts | 11 +++++----- bot/events/index.ts | 11 +++++++--- bot/events/message.ts | 1 - bot/index.ts | 19 +++++++++++------ bun.lock | 48 +++++++++++++++++++++++++++++++++++-------- package.json | 4 ++-- 9 files changed, 75 insertions(+), 30 deletions(-) diff --git a/.example.env b/.example.env index 88da0ee..46d0942 100644 --- a/.example.env +++ b/.example.env @@ -7,6 +7,11 @@ CLIENT_SECRET= # Client_secret gotten from the twitch dev console # REDIRECT_PORT= # Redirect port if the REDIRECT_URL has not been set. Defaults to 3456. This is also the port the bot will listen on to authenticate # COMMAND_PREFIX= # The prefix which will be used to activate commands. Defaults to '!'. When requiring a space between prefix and command, escape the space with a backslash +# EventSub webhook config +# This only works when behind a reverse proxy secured with SSL +EVENTSUB_HOSTNAME= # Hostname that points to the reverse proxy +EVENTSUB_PORT= # Port the reverse proxy forwards requests to + # The Twitch IDs required below can be gotten from this website: https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/ # Streamer config diff --git a/bot/commands/index.ts b/bot/commands/index.ts index 6d64a66..551a3d3 100644 --- a/bot/commands/index.ts +++ b/bot/commands/index.ts @@ -37,6 +37,6 @@ export { intents }; import { singleUserMode, chatterApi, chatterId, streamerId } from ".."; /** Helper function to send a message to the stream */ -export const sendMessage = async (message: string, options?: HelixSendChatMessageParams) => { - singleUserMode ? await chatterApi.chat.sendChatMessage(streamerId, message, options) : chatterApi.asUser(chatterId, async newapi => newapi.chat.sendChatMessage(streamerId, message, options)); +export const sendMessage = async (message: string, replyParentMessageId?: string) => { + singleUserMode ? await chatterApi.chat.sendChatMessage(streamerId, message, { replyParentMessageId }) : chatterApi.asUser(chatterId, async newapi => newapi.chat.sendChatMessage(streamerId, message, { replyParentMessageId })); }; diff --git a/bot/commands/ping.ts b/bot/commands/ping.ts index d76d1c0..3866dfe 100644 --- a/bot/commands/ping.ts +++ b/bot/commands/ping.ts @@ -5,6 +5,6 @@ export default new Command('ping', ['ping'], [], async msg => { - await sendMessage('pong!', { replyParentMessageId: msg.messageId }); + await sendMessage('pong!', msg.messageId); } ); diff --git a/bot/commands/yabai.ts b/bot/commands/yabai.ts index 892d80e..59c09cb 100644 --- a/bot/commands/yabai.ts +++ b/bot/commands/yabai.ts @@ -6,12 +6,11 @@ export default new Command('yabai', ['yabai', 'goon'], [], async msg => { - const replyobj: HelixSendChatMessageParams = { replyParentMessageId: msg.messageId } const rand = Math.floor(Math.random() * 100) + 1; - if (rand < 25) await sendMessage(`${rand}% yabai! chumpi4Bewwy`, replyobj); - else if (rand < 50) await sendMessage(`${rand}% yabai chumpi4Hustle`, replyobj); - else if (rand === 50) await sendMessage(`${rand}% yabai kiawaBlank`, replyobj); - else if (rand < 80) await sendMessage(`${rand}% yabai chumpi4Shock`, replyobj); - else await sendMessage(`${rand}% yabai chumpi4Jail`, replyobj); + if (rand < 25) await sendMessage(`${rand}% yabai! chumpi4Bewwy`, msg.messageId); + else if (rand < 50) await sendMessage(`${rand}% yabai chumpi4Hustle`, msg.messageId); + else if (rand === 50) await sendMessage(`${rand}% yabai kiawaBlank`, msg.messageId); + else if (rand < 80) await sendMessage(`${rand}% yabai chumpi4Shock`, msg.messageId); + else await sendMessage(`${rand}% yabai chumpi4Jail`, msg.messageId); } ); diff --git a/bot/events/index.ts b/bot/events/index.ts index 3e5cd11..00daa05 100644 --- a/bot/events/index.ts +++ b/bot/events/index.ts @@ -1,4 +1,7 @@ -import { eventSub } from ".."; +import { eventSub, streamerApi } from ".."; + +await streamerApi.eventSub.deleteAllSubscriptions(); +console.info('Succesfully deleted all unused EventSub subscriptions'); eventSub.onRevoke(event => { console.info(`Successfully revoked EventSub subscription: ${event.id}`); @@ -9,9 +12,9 @@ eventSub.onSubscriptionCreateSuccess(event => { }); eventSub.onSubscriptionCreateFailure(event => { - eventSub.stop() console.error(`Failed to create EventSub subscription: ${event.id}`); - eventSub.start() + event.stop() + event.start() }); eventSub.onSubscriptionDeleteSuccess(event => { @@ -29,3 +32,5 @@ for (const file of files) { if (file === import.meta.file) continue; await import(import.meta.dir + '/' + file.slice(0, -3)); }; + +eventSub.start(); diff --git a/bot/events/message.ts b/bot/events/message.ts index 86d4c32..3f292a8 100644 --- a/bot/events/message.ts +++ b/bot/events/message.ts @@ -1,4 +1,3 @@ -import { redis } from "bun"; import { chatterId, streamerId, eventSub, commandPrefix, singleUserMode } from ".."; import { User } from "../user"; import commands, { sendMessage } from "../commands"; diff --git a/bot/index.ts b/bot/index.ts index 073a18a..479a253 100644 --- a/bot/index.ts +++ b/bot/index.ts @@ -1,16 +1,21 @@ import { createAuthProvider } from "./auth"; import { ApiClient } from "@twurple/api"; -import { EventSubWsListener } from "@twurple/eventsub-ws"; +import { EventSubHttpListener, ReverseProxyAdapter } from "@twurple/eventsub-http"; import { intents } from "./commands"; const CHATTERBASEINTENTS = ["user:read:chat", "user:write:chat", "user:bot"]; -const STREAMERBASEINTENTS = ["user:read:chat"]; +const STREAMERBASEINTENTS = ["user:read:chat", "channel:bot", "moderation:read"]; export const singleUserMode = process.env.CHATTER_IS_STREAMER === 'true'; export const chatterId = process.env.CHATTER_ID ?? ""; if (chatterId === "") { console.error('Please set a CHATTER_ID in the .env'); process.exit(1); }; export const streamerId = process.env.STREAMER_ID ?? ""; -if (streamerId === "") { console.log('Please set a STREAMER_ID in the .env'); process.exit(1); }; +if (streamerId === "") { console.error('Please set a STREAMER_ID in the .env'); process.exit(1); }; + +const hostName = process.env.EVENTSUB_HOSTNAME ?? ""; +if (hostName === "") { console.error('Please set a EVENTSUB_HOSTNAME in the .env'); process.exit(1); }; +const port = Number(process.env.EVENTSUB_PORT) ?? 0; +if (port === 0) { console.error('Please set a EVENTSUB_PORT in the .env'); process.exit(1); }; const chatterIntents = singleUserMode ? CHATTERBASEINTENTS.concat(STREAMERBASEINTENTS) : CHATTERBASEINTENTS; const streamerIntents = STREAMERBASEINTENTS.concat(intents); @@ -25,10 +30,12 @@ export const chatterApi = new ApiClient({ authProvider: chatterAuthProvider }); export const streamerApi = streamerAuthProvider ? new ApiClient({ authProvider: streamerAuthProvider }) : chatterApi; // if there is no streamer user, use the chatter user /** As the streamerApi has either the streamer or the chatter if the chatter IS the streamer this has streamer permissions */ -export const eventSub = new EventSubWsListener({ apiClient: streamerApi }); +export const eventSub = new EventSubHttpListener({ + apiClient: streamerApi, + adapter: new ReverseProxyAdapter({ hostName, port }), + secret: Bun.randomUUIDv7() +}); export const commandPrefix = process.env.COMMAND_PREFIX ?? "!"; await import("./events"); - -eventSub.start(); diff --git a/bun.lock b/bun.lock index 320896e..3e88499 100644 --- a/bun.lock +++ b/bun.lock @@ -5,7 +5,7 @@ "name": "qweribot", "dependencies": { "@twurple/auth": "^7.3.0", - "@twurple/eventsub-ws": "^7.3.0", + "@twurple/eventsub-http": "^7.3.0", "surrealdb": "^1.3.2", }, "devDependencies": { @@ -19,20 +19,18 @@ "packages": { "@d-fischer/cache-decorators": ["@d-fischer/cache-decorators@4.0.1", "", { "dependencies": { "@d-fischer/shared-utils": "^3.6.3", "tslib": "^2.6.2" } }, "sha512-HNYLBLWs/t28GFZZeqdIBqq8f37mqDIFO6xNPof94VjpKvuP6ROqCZGafx88dk5zZUlBfViV9jD8iNNlXfc4CA=="], - "@d-fischer/connection": ["@d-fischer/connection@9.0.0", "", { "dependencies": { "@d-fischer/isomorphic-ws": "^7.0.0", "@d-fischer/logger": "^4.2.1", "@d-fischer/shared-utils": "^3.5.0", "@d-fischer/typed-event-emitter": "^3.3.0", "@types/ws": "^8.5.4", "tslib": "^2.4.1", "ws": "^8.11.0" } }, "sha512-Mljp/EbaE+eYWfsFXUOk+RfpbHgrWGL/60JkAvjYixw6KREfi5r17XdUiXe54ByAQox6jwgdN2vebdmW1BT+nQ=="], - "@d-fischer/cross-fetch": ["@d-fischer/cross-fetch@5.0.5", "", { "dependencies": { "node-fetch": "^2.6.12" } }, "sha512-symjDUPInTrkfIsZc2n2mo9hiAJLcTJsZkNICjZajEWnWpJ3s3zn50/FY8xpNUAf5w3eFuQii2wxztTGpvG1Xg=="], "@d-fischer/detect-node": ["@d-fischer/detect-node@3.0.1", "", {}, "sha512-0Rf3XwTzuTh8+oPZW9SfxTIiL+26RRJ0BRPwj5oVjZFyFKmsj9RGfN2zuTRjOuA3FCK/jYm06HOhwNK+8Pfv8w=="], - "@d-fischer/isomorphic-ws": ["@d-fischer/isomorphic-ws@7.0.2", "", { "peerDependencies": { "ws": "^8.2.0" } }, "sha512-xK+qIJUF0ne3dsjq5Y3BviQ4M+gx9dzkN+dPP7abBMje4YRfow+X9jBgeEoTe5e+Q6+8hI9R0b37Okkk8Vf0hQ=="], - "@d-fischer/logger": ["@d-fischer/logger@4.2.3", "", { "dependencies": { "@d-fischer/detect-node": "^3.0.1", "@d-fischer/shared-utils": "^3.2.0", "tslib": "^2.0.3" } }, "sha512-mJUx9OgjrNVLQa4od/+bqnmD164VTCKnK5B4WOW8TX5y/3w2i58p+PMRE45gUuFjk2BVtOZUg55JQM3d619fdw=="], "@d-fischer/qs": ["@d-fischer/qs@7.0.2", "", {}, "sha512-yAu3xDooiL+ef84Jo8nLjDjWBRk7RXk163Y6aTvRB7FauYd3spQD/dWvgT7R4CrN54Juhrrc3dMY7mc+jZGurQ=="], "@d-fischer/rate-limiter": ["@d-fischer/rate-limiter@1.1.0", "", { "dependencies": { "@d-fischer/logger": "^4.2.3", "@d-fischer/shared-utils": "^3.6.3", "tslib": "^2.6.2" } }, "sha512-O5HgACwApyCZhp4JTEBEtbv/W3eAwEkrARFvgWnEsDmXgCMWjIHwohWoHre5BW6IYXFSHBGsuZB/EvNL3942kQ=="], + "@d-fischer/raw-body": ["@d-fischer/raw-body@2.4.3", "", { "dependencies": { "bytes": "3.1.0", "http-errors": "1.7.3", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-rtPTezQLROnTDdRij0Vo5OJ41aGvfKj9pQ7CkzFssQy+Jyc9BUVLV/DXLIGgvEGUaWt09Jq3im4WgvvPYqTomw=="], + "@d-fischer/shared-utils": ["@d-fischer/shared-utils@3.6.4", "", { "dependencies": { "tslib": "^2.4.1" } }, "sha512-BPkVLHfn2Lbyo/ENDBwtEB8JVQ+9OzkjJhUunLaxkw4k59YFlQxUUwlDBejVSFcpQT0t+D3CQlX+ySZnQj0wxw=="], "@d-fischer/typed-event-emitter": ["@d-fischer/typed-event-emitter@3.3.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-OvSEOa8icfdWDqcRtjSEZtgJTFOFNgTjje7zaL0+nAtu2/kZtRCSK5wUMrI/aXtCH8o0Qz2vA8UqkhWUTARFQQ=="], @@ -47,15 +45,35 @@ "@twurple/eventsub-base": ["@twurple/eventsub-base@7.3.0", "", { "dependencies": { "@d-fischer/logger": "^4.2.1", "@d-fischer/shared-utils": "^3.6.1", "@d-fischer/typed-event-emitter": "^3.3.0", "@twurple/api": "7.3.0", "@twurple/auth": "7.3.0", "@twurple/common": "7.3.0", "tslib": "^2.0.3" } }, "sha512-Wc/3qpyFfyvjabk/tQJVjAke+ixp5QWUT7LsuU+kMcCf46jsRQMB3InoXsZMRgX5sD1frBZzxUEJ7ujhxb8Ngw=="], - "@twurple/eventsub-ws": ["@twurple/eventsub-ws@7.3.0", "", { "dependencies": { "@d-fischer/connection": "^9.0.0", "@d-fischer/logger": "^4.2.1", "@d-fischer/shared-utils": "^3.6.1", "@d-fischer/typed-event-emitter": "^3.3.0", "@twurple/auth": "7.3.0", "@twurple/common": "7.3.0", "@twurple/eventsub-base": "7.3.0", "tslib": "^2.0.3" }, "peerDependencies": { "@twurple/api": "7.3.0" } }, "sha512-jtIMdW/atTrn5Eo3XGS8Lw0EIsK3GQsZGJDLYRwqw2bCV8ZnQoZ8YaXUJb5Wd+gebUfeBr4j7mvZlGc+Wkp17w=="], + "@twurple/eventsub-http": ["@twurple/eventsub-http@7.3.0", "", { "dependencies": { "@d-fischer/logger": "^4.2.1", "@d-fischer/raw-body": "^2.4.3", "@d-fischer/shared-utils": "^3.6.1", "@d-fischer/typed-event-emitter": "^3.3.0", "@twurple/auth": "7.3.0", "@twurple/common": "7.3.0", "@twurple/eventsub-base": "7.3.0", "@types/express-serve-static-core": "^4.17.24", "httpanda": "^0.4.6", "tslib": "^2.0.3" }, "peerDependencies": { "@twurple/api": "7.3.0" } }, "sha512-JYh/Kl60AN/Yw/zYZ901gcaxi39NS8XdBdk4nVL7sK3i8Vvgu2y2RnPjBcTyugNDzpCarhloMoy9u9V95HgprQ=="], - "@types/bun": ["@types/bun@1.2.13", "", { "dependencies": { "bun-types": "1.2.13" } }, "sha512-u6vXep/i9VBxoJl3GjZsl/BFIsvML8DfVDO0RYLEwtSZSp981kEO1V5NwRcO1CPJ7AmvpbnDCiMKo3JvbDEjAg=="], + "@types/bun": ["@types/bun@1.2.17", "", { "dependencies": { "bun-types": "1.2.17" } }, "sha512-l/BYs/JYt+cXA/0+wUhulYJB6a6p//GTPiJ7nV+QHa8iiId4HZmnu/3J/SowP5g0rTiERY2kfGKXEK5Ehltx4Q=="], + + "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.6", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A=="], + + "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="], "@types/node": ["@types/node@22.15.18", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg=="], - "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], + "@types/qs": ["@types/qs@6.14.0", "", {}, "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="], - "bun-types": ["bun-types@1.2.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-rRjA1T6n7wto4gxhAO/ErZEtOXyEZEmnIHQfl0Dt1QQSB4QV0iP6BZ9/YB5fZaHFQ2dwHFrmPaRQ9GGMX01k9Q=="], + "@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="], + + "@types/send": ["@types/send@0.17.5", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w=="], + + "bun-types": ["bun-types@1.2.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ=="], + + "bytes": ["bytes@3.1.0", "", {}, "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="], + + "depd": ["depd@1.1.2", "", {}, "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="], + + "http-errors": ["http-errors@1.7.3", "", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" } }, "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw=="], + + "httpanda": ["httpanda@0.4.7", "", { "dependencies": { "@types/node": "^14.11.2", "tslib": "^2.0.3" } }, "sha512-NieTiR7kfOheL9OeEi6+JKFmJ2JP9ZRqUQ4tiXZ9J+EMMKxApHUQlEM5l4gZ+l67lxE9Er6oigZnujmhlodNCg=="], + + "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], "isows": ["isows@1.0.7", "", { "peerDependencies": { "ws": "*" } }, "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg=="], @@ -65,8 +83,16 @@ "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "setprototypeof": ["setprototypeof@1.1.1", "", {}, "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="], + + "statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], + "surrealdb": ["surrealdb@1.3.2", "", { "dependencies": { "isows": "^1.0.6", "uuidv7": "^1.0.1" }, "peerDependencies": { "tslib": "^2.6.3", "typescript": "^5.0.0" } }, "sha512-mL7nij33iuon3IQP72F46fgX3p2LAxFCWCBDbZB7IohZ13RTEwJVNq7nZeP1eMSceQUpKzS6OHIWOuF9LYAkNw=="], + "toidentifier": ["toidentifier@1.0.0", "", {}, "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="], + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -75,6 +101,8 @@ "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + "uuidv7": ["uuidv7@1.0.2", "", { "bin": { "uuidv7": "cli.js" } }, "sha512-8JQkH4ooXnm1JCIhqTMbtmdnYEn6oKukBxHn1Ic9878jMkL7daTI7anTExfY18VRCX7tcdn5quzvCb6EWrR8PA=="], "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], @@ -82,5 +110,7 @@ "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], "ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], + + "httpanda/@types/node": ["@types/node@14.18.63", "", {}, "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ=="], } } diff --git a/package.json b/package.json index e0e78ca..894c77c 100644 --- a/package.json +++ b/package.json @@ -5,13 +5,13 @@ "@types/bun": "latest" }, "peerDependencies": { - "typescript": "^5" + "typescript": "^5.8.3" }, "private": true, "type": "module", "dependencies": { "@twurple/auth": "^7.3.0", - "@twurple/eventsub-ws": "^7.3.0", + "@twurple/eventsub-http": "^7.3.0", "surrealdb": "^1.3.2" } }