@discord-flow/multibots 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # @discord-flow/multibots
2
+
3
+ Multi-bot server support for discord-flow. Run multiple Discord bots on a single HTTP server.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @discord-flow/multibots
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import { createMultiBotServer } from '@discord-flow/multibots';
15
+
16
+ // Create individual bot instances
17
+ const bot1 = createBot({ publicKey: '...', token: '...' });
18
+ const bot2 = createBot({ publicKey: '...', token: '...' });
19
+ const bot3 = createBot({ publicKey: '...', token: '...' });
20
+
21
+ // Run all bots on a single server
22
+ createMultiBotServer({
23
+ bots: [bot1, bot2, bot3],
24
+ port: 3000
25
+ }).start();
26
+ ```
27
+
28
+ ## Features
29
+
30
+ - 🚀 **Single Server** - Run multiple bots on one HTTP server
31
+ - 📦 **Resource Efficient** - Share resources between bots
32
+ - 🔀 **Auto Routing** - Routes interactions to correct bot by `application_id`
33
+ - ⚡ **Scalable** - Perfect for bot hosting platforms
34
+
35
+ ## API
36
+
37
+ ### `createMultiBotServer(options)`
38
+ Creates a multi-bot HTTP server.
39
+
40
+ #### Options
41
+ - `bots` - Array of bot instances
42
+ - `port` - Server port (default: 3000)
43
+
44
+ ### `server.start()`
45
+ Starts the multi-bot server.
46
+
47
+ ### `server.stop()`
48
+ Stops the server.
49
+
50
+ ## License
51
+
52
+ MIT
@@ -0,0 +1,3 @@
1
+ export { createMultiBotServer } from './server.js';
2
+ export type { BotConfig, MultiBotServerOptions, MultiBotServer } from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,SAAS,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { createMultiBotServer } from './server.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { MultiBotServerOptions, MultiBotServer } from './types.js';
2
+ export declare function createMultiBotServer(options: MultiBotServerOptions): MultiBotServer;
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,qBAAqB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAkBnF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CAiNnF"}
package/dist/server.js ADDED
@@ -0,0 +1,188 @@
1
+ import { DiscordAPI, parseInteraction } from '@discord-flow/adapter-discord-http';
2
+ import { InteractionType } from '@discord-flow/types';
3
+ import chalk from 'chalk';
4
+ import nacl from 'tweetnacl';
5
+ function verifySignature(publicKey, signature, timestamp, body) {
6
+ try {
7
+ return nacl.sign.detached.verify(new TextEncoder().encode(timestamp + body), Buffer.from(signature, 'hex'), Buffer.from(publicKey, 'hex'));
8
+ }
9
+ catch {
10
+ return false;
11
+ }
12
+ }
13
+ export function createMultiBotServer(options) {
14
+ const { port = 3000, bots: initialBots, autoRegisterCommands = true } = options;
15
+ const bots = new Map();
16
+ initialBots.forEach(bot => bots.set(bot.applicationId, bot));
17
+ const handler = async (request) => {
18
+ const url = new URL(request.url);
19
+ if (request.method === 'GET' && url.pathname === '/health') {
20
+ return new Response('OK', { status: 200 });
21
+ }
22
+ if (request.method === 'GET' && url.pathname === '/') {
23
+ return new Response(JSON.stringify({
24
+ status: 'running',
25
+ bots: Array.from(bots.keys())
26
+ }), {
27
+ status: 200,
28
+ headers: { 'Content-Type': 'application/json' }
29
+ });
30
+ }
31
+ if (request.method !== 'POST' || url.pathname !== '/interactions') {
32
+ return new Response('Not Found', { status: 404 });
33
+ }
34
+ const signature = request.headers.get('x-signature-ed25519');
35
+ const timestamp = request.headers.get('x-signature-timestamp');
36
+ const body = await request.text();
37
+ if (!signature || !timestamp) {
38
+ return new Response('Missing headers', { status: 401 });
39
+ }
40
+ let interaction;
41
+ try {
42
+ interaction = JSON.parse(body);
43
+ }
44
+ catch {
45
+ return new Response('Invalid JSON', { status: 400 });
46
+ }
47
+ const applicationId = interaction.application_id;
48
+ if (!applicationId) {
49
+ return new Response('Missing application_id', { status: 400 });
50
+ }
51
+ const bot = bots.get(applicationId);
52
+ if (!bot) {
53
+ return new Response(`Bot not found for application: ${applicationId}`, { status: 404 });
54
+ }
55
+ if (!verifySignature(bot.publicKey, signature, timestamp, body)) {
56
+ return new Response('Invalid signature', { status: 401 });
57
+ }
58
+ if (interaction.type === InteractionType.PING) {
59
+ return new Response(JSON.stringify({ type: 1 }), {
60
+ headers: { 'Content-Type': 'application/json' }
61
+ });
62
+ }
63
+ try {
64
+ const event = parseInteraction(interaction);
65
+ if (!event) {
66
+ return new Response(JSON.stringify({
67
+ type: 4,
68
+ data: { content: 'Unknown interaction type', flags: 64 }
69
+ }), {
70
+ headers: { 'Content-Type': 'application/json' }
71
+ });
72
+ }
73
+ const result = await bot.engine.process(event);
74
+ if (!result) {
75
+ return new Response(JSON.stringify({
76
+ type: 4,
77
+ data: { content: 'No handler found', flags: 64 }
78
+ }), {
79
+ headers: { 'Content-Type': 'application/json' }
80
+ });
81
+ }
82
+ const responseType = event.type === 'command' ? 4 : 7;
83
+ return new Response(JSON.stringify({
84
+ type: responseType,
85
+ data: result
86
+ }), {
87
+ headers: { 'Content-Type': 'application/json' }
88
+ });
89
+ }
90
+ catch (error) {
91
+ console.error(`[${applicationId}] Error:`, error);
92
+ return new Response(JSON.stringify({
93
+ type: 4,
94
+ data: { content: 'Internal error', flags: 64 }
95
+ }), {
96
+ headers: { 'Content-Type': 'application/json' }
97
+ });
98
+ }
99
+ };
100
+ return {
101
+ addBot(config) {
102
+ bots.set(config.applicationId, config);
103
+ },
104
+ removeBot(applicationId) {
105
+ return bots.delete(applicationId);
106
+ },
107
+ getBots() {
108
+ return new Map(bots);
109
+ },
110
+ async start() {
111
+ const globalObj = globalThis;
112
+ if (globalObj.Bun) {
113
+ globalObj.Bun.serve({ port, hostname: '0.0.0.0', fetch: handler });
114
+ }
115
+ else {
116
+ const { createServer: createHttpServer } = await import('node:http');
117
+ const httpServer = createHttpServer(async (req, res) => {
118
+ const chunks = [];
119
+ for await (const chunk of req) {
120
+ chunks.push(chunk);
121
+ }
122
+ const body = Buffer.concat(chunks).toString();
123
+ const url = `http://0.0.0.0:${port}${req.url ?? '/'}`;
124
+ const headers = new Headers();
125
+ for (const [key, value] of Object.entries(req.headers)) {
126
+ if (value)
127
+ headers.set(key, Array.isArray(value) ? value[0] : value);
128
+ }
129
+ const method = req.method ?? 'GET';
130
+ const hasBody = method !== 'GET' && method !== 'HEAD';
131
+ const request = new Request(url, {
132
+ method,
133
+ headers,
134
+ body: hasBody ? body : null
135
+ });
136
+ const response = await handler(request);
137
+ const responseBody = await response.text();
138
+ res.writeHead(response.status, Object.fromEntries(response.headers.entries()));
139
+ res.end(responseBody);
140
+ });
141
+ httpServer.listen(port, '0.0.0.0');
142
+ }
143
+ console.log();
144
+ console.log(` ${chalk.bold.hex('#5865F2')('discord-flow')} ${chalk.bold.hex('#1EBE38')('multibots')}`);
145
+ console.log();
146
+ console.log(` ${chalk.green('➜')} ${chalk.bold('Local:')} ${chalk.cyan(`http://localhost:${port}/interactions`)}`);
147
+ console.log(` ${chalk.green('➜')} ${chalk.bold('Bots:')} ${chalk.white(bots.size)}`);
148
+ console.log();
149
+ if (autoRegisterCommands) {
150
+ for (const [appId, bot] of bots) {
151
+ try {
152
+ const discord = new DiscordAPI({ token: bot.token });
153
+ const commandsMeta = bot.engine.getRegistry().getCommandsMetadata();
154
+ if (commandsMeta.length > 0) {
155
+ const commands = commandsMeta.map(cmd => {
156
+ const command = {
157
+ name: cmd.name,
158
+ description: cmd.description
159
+ };
160
+ if (cmd.options) {
161
+ command.options = cmd.options;
162
+ }
163
+ return command;
164
+ });
165
+ if (bot.guildId) {
166
+ await discord.registerGuildCommands(appId, bot.guildId, commands);
167
+ }
168
+ else {
169
+ await discord.registerCommands(appId, commands);
170
+ }
171
+ console.log(` ${chalk.green('✓')} ${chalk.bold(appId.slice(-6))} ${chalk.dim(`${commands.length} comando(s)`)}`);
172
+ commands.forEach(cmd => {
173
+ console.log(chalk.gray(` /${cmd.name}`));
174
+ });
175
+ }
176
+ }
177
+ catch (error) {
178
+ console.log(chalk.red(` ✗ ${appId.slice(-6)}: ${error}`));
179
+ }
180
+ }
181
+ console.log();
182
+ }
183
+ console.log(chalk.dim(' Pressione Ctrl+C para parar'));
184
+ console.log();
185
+ }
186
+ };
187
+ }
188
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { FlowEngine } from '@discord-flow/core';
2
+ export interface BotConfig {
3
+ applicationId: string;
4
+ publicKey: string;
5
+ token: string;
6
+ engine: FlowEngine;
7
+ guildId?: string;
8
+ }
9
+ export interface MultiBotServerOptions {
10
+ port?: number;
11
+ bots: BotConfig[];
12
+ autoRegisterCommands?: boolean;
13
+ }
14
+ export interface MultiBotServer {
15
+ start(): Promise<void>;
16
+ addBot(config: BotConfig): void;
17
+ removeBot(applicationId: string): boolean;
18
+ getBots(): Map<string, BotConfig>;
19
+ }
20
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,WAAW,SAAS;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IAChC,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1C,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACrC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@discord-flow/multibots",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Multi-bot server for discord-flow - run multiple bots on a single HTTP server",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -33,9 +33,10 @@
33
33
  "server"
34
34
  ],
35
35
  "license": "MIT",
36
+ "homepage": "https://flow.loopbot.app",
36
37
  "repository": {
37
38
  "type": "git",
38
39
  "url": "https://github.com/discord-flow/discord-flow.git",
39
40
  "directory": "packages/multibots"
40
41
  }
41
- }
42
+ }