openbotgate 1.0.0
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/LICENSE +21 -0
- package/README.md +293 -0
- package/bin/openbotgate.js +31 -0
- package/dist/config/config.d.ts +56 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +136 -0
- package/dist/config/config.js.map +1 -0
- package/dist/debug.d.ts +2 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +33 -0
- package/dist/debug.js.map +1 -0
- package/dist/gateway/bluebubbles.d.ts +12 -0
- package/dist/gateway/bluebubbles.d.ts.map +1 -0
- package/dist/gateway/bluebubbles.js +80 -0
- package/dist/gateway/bluebubbles.js.map +1 -0
- package/dist/gateway/catalog.d.ts +10 -0
- package/dist/gateway/catalog.d.ts.map +1 -0
- package/dist/gateway/catalog.js +28 -0
- package/dist/gateway/catalog.js.map +1 -0
- package/dist/gateway/discord.d.ts +12 -0
- package/dist/gateway/discord.d.ts.map +1 -0
- package/dist/gateway/discord.js +83 -0
- package/dist/gateway/discord.js.map +1 -0
- package/dist/gateway/feishu.d.ts +35 -0
- package/dist/gateway/feishu.d.ts.map +1 -0
- package/dist/gateway/feishu.js +290 -0
- package/dist/gateway/feishu.js.map +1 -0
- package/dist/gateway/googlechat.d.ts +11 -0
- package/dist/gateway/googlechat.d.ts.map +1 -0
- package/dist/gateway/googlechat.js +92 -0
- package/dist/gateway/googlechat.js.map +1 -0
- package/dist/gateway/imessage.d.ts +12 -0
- package/dist/gateway/imessage.d.ts.map +1 -0
- package/dist/gateway/imessage.js +84 -0
- package/dist/gateway/imessage.js.map +1 -0
- package/dist/gateway/index.d.ts +9 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +27 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/line.d.ts +13 -0
- package/dist/gateway/line.d.ts.map +1 -0
- package/dist/gateway/line.js +80 -0
- package/dist/gateway/line.js.map +1 -0
- package/dist/gateway/matrix.d.ts +12 -0
- package/dist/gateway/matrix.d.ts.map +1 -0
- package/dist/gateway/matrix.js +105 -0
- package/dist/gateway/matrix.js.map +1 -0
- package/dist/gateway/mattermost.d.ts +14 -0
- package/dist/gateway/mattermost.d.ts.map +1 -0
- package/dist/gateway/mattermost.js +92 -0
- package/dist/gateway/mattermost.js.map +1 -0
- package/dist/gateway/msteams.d.ts +12 -0
- package/dist/gateway/msteams.d.ts.map +1 -0
- package/dist/gateway/msteams.js +119 -0
- package/dist/gateway/msteams.js.map +1 -0
- package/dist/gateway/nextcloud-talk.d.ts +11 -0
- package/dist/gateway/nextcloud-talk.d.ts.map +1 -0
- package/dist/gateway/nextcloud-talk.js +93 -0
- package/dist/gateway/nextcloud-talk.js.map +1 -0
- package/dist/gateway/nostr.d.ts +15 -0
- package/dist/gateway/nostr.d.ts.map +1 -0
- package/dist/gateway/nostr.js +95 -0
- package/dist/gateway/nostr.js.map +1 -0
- package/dist/gateway/qq-guild.d.ts +14 -0
- package/dist/gateway/qq-guild.d.ts.map +1 -0
- package/dist/gateway/qq-guild.js +121 -0
- package/dist/gateway/qq-guild.js.map +1 -0
- package/dist/gateway/qq.d.ts +14 -0
- package/dist/gateway/qq.d.ts.map +1 -0
- package/dist/gateway/qq.js +121 -0
- package/dist/gateway/qq.js.map +1 -0
- package/dist/gateway/registry.d.ts +4 -0
- package/dist/gateway/registry.d.ts.map +1 -0
- package/dist/gateway/registry.js +38 -0
- package/dist/gateway/registry.js.map +1 -0
- package/dist/gateway/signal.d.ts +12 -0
- package/dist/gateway/signal.d.ts.map +1 -0
- package/dist/gateway/signal.js +80 -0
- package/dist/gateway/signal.js.map +1 -0
- package/dist/gateway/slack.d.ts +12 -0
- package/dist/gateway/slack.d.ts.map +1 -0
- package/dist/gateway/slack.js +83 -0
- package/dist/gateway/slack.js.map +1 -0
- package/dist/gateway/stub.d.ts +7 -0
- package/dist/gateway/stub.d.ts.map +1 -0
- package/dist/gateway/stub.js +23 -0
- package/dist/gateway/stub.js.map +1 -0
- package/dist/gateway/telegram.d.ts +12 -0
- package/dist/gateway/telegram.d.ts.map +1 -0
- package/dist/gateway/telegram.js +61 -0
- package/dist/gateway/telegram.js.map +1 -0
- package/dist/gateway/tlon.d.ts +12 -0
- package/dist/gateway/tlon.d.ts.map +1 -0
- package/dist/gateway/tlon.js +105 -0
- package/dist/gateway/tlon.js.map +1 -0
- package/dist/gateway/types.d.ts +21 -0
- package/dist/gateway/types.d.ts.map +1 -0
- package/dist/gateway/types.js +3 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/gateway/whatsapp.d.ts +12 -0
- package/dist/gateway/whatsapp.d.ts.map +1 -0
- package/dist/gateway/whatsapp.js +81 -0
- package/dist/gateway/whatsapp.js.map +1 -0
- package/dist/gateway/zalo.d.ts +12 -0
- package/dist/gateway/zalo.d.ts.map +1 -0
- package/dist/gateway/zalo.js +77 -0
- package/dist/gateway/zalo.js.map +1 -0
- package/dist/gateway/zalouser.d.ts +12 -0
- package/dist/gateway/zalouser.d.ts.map +1 -0
- package/dist/gateway/zalouser.js +85 -0
- package/dist/gateway/zalouser.js.map +1 -0
- package/dist/handler/code/agent.d.ts +10 -0
- package/dist/handler/code/agent.d.ts.map +1 -0
- package/dist/handler/code/agent.js +63 -0
- package/dist/handler/code/agent.js.map +1 -0
- package/dist/handler/code/code.d.ts +15 -0
- package/dist/handler/code/code.d.ts.map +1 -0
- package/dist/handler/code/code.js +129 -0
- package/dist/handler/code/code.js.map +1 -0
- package/dist/handler/code/model.d.ts +10 -0
- package/dist/handler/code/model.d.ts.map +1 -0
- package/dist/handler/code/model.js +63 -0
- package/dist/handler/code/model.js.map +1 -0
- package/dist/handler/code/new.d.ts +7 -0
- package/dist/handler/code/new.d.ts.map +1 -0
- package/dist/handler/code/new.js +27 -0
- package/dist/handler/code/new.js.map +1 -0
- package/dist/handler/code/opencode.d.ts +12 -0
- package/dist/handler/code/opencode.d.ts.map +1 -0
- package/dist/handler/code/opencode.js +88 -0
- package/dist/handler/code/opencode.js.map +1 -0
- package/dist/handler/code/session.d.ts +9 -0
- package/dist/handler/code/session.d.ts.map +1 -0
- package/dist/handler/code/session.js +55 -0
- package/dist/handler/code/session.js.map +1 -0
- package/dist/handler/code/workspace.d.ts +10 -0
- package/dist/handler/code/workspace.d.ts.map +1 -0
- package/dist/handler/code/workspace.js +80 -0
- package/dist/handler/code/workspace.js.map +1 -0
- package/dist/handler/commands/agent.d.ts +10 -0
- package/dist/handler/commands/agent.d.ts.map +1 -0
- package/dist/handler/commands/agent.js +63 -0
- package/dist/handler/commands/agent.js.map +1 -0
- package/dist/handler/commands/async.d.ts +3 -0
- package/dist/handler/commands/async.d.ts.map +1 -0
- package/dist/handler/commands/async.js +30 -0
- package/dist/handler/commands/async.js.map +1 -0
- package/dist/handler/commands/claude.d.ts +3 -0
- package/dist/handler/commands/claude.d.ts.map +1 -0
- package/dist/handler/commands/claude.js +19 -0
- package/dist/handler/commands/claude.js.map +1 -0
- package/dist/handler/commands/code.d.ts +15 -0
- package/dist/handler/commands/code.d.ts.map +1 -0
- package/dist/handler/commands/code.js +133 -0
- package/dist/handler/commands/code.js.map +1 -0
- package/dist/handler/commands/git.d.ts +3 -0
- package/dist/handler/commands/git.d.ts.map +1 -0
- package/dist/handler/commands/git.js +25 -0
- package/dist/handler/commands/git.js.map +1 -0
- package/dist/handler/commands/help.d.ts +3 -0
- package/dist/handler/commands/help.d.ts.map +1 -0
- package/dist/handler/commands/help.js +49 -0
- package/dist/handler/commands/help.js.map +1 -0
- package/dist/handler/commands/index.d.ts +10 -0
- package/dist/handler/commands/index.d.ts.map +1 -0
- package/dist/handler/commands/index.js +43 -0
- package/dist/handler/commands/index.js.map +1 -0
- package/dist/handler/commands/model.d.ts +10 -0
- package/dist/handler/commands/model.d.ts.map +1 -0
- package/dist/handler/commands/model.js +63 -0
- package/dist/handler/commands/model.js.map +1 -0
- package/dist/handler/commands/new.d.ts +3 -0
- package/dist/handler/commands/new.d.ts.map +1 -0
- package/dist/handler/commands/new.js +25 -0
- package/dist/handler/commands/new.js.map +1 -0
- package/dist/handler/commands/opencode.d.ts +12 -0
- package/dist/handler/commands/opencode.d.ts.map +1 -0
- package/dist/handler/commands/opencode.js +131 -0
- package/dist/handler/commands/opencode.js.map +1 -0
- package/dist/handler/commands/session.d.ts +9 -0
- package/dist/handler/commands/session.d.ts.map +1 -0
- package/dist/handler/commands/session.js +55 -0
- package/dist/handler/commands/session.js.map +1 -0
- package/dist/handler/commands/shell.d.ts +11 -0
- package/dist/handler/commands/shell.d.ts.map +1 -0
- package/dist/handler/commands/shell.js +142 -0
- package/dist/handler/commands/shell.js.map +1 -0
- package/dist/handler/commands/status.d.ts +3 -0
- package/dist/handler/commands/status.d.ts.map +1 -0
- package/dist/handler/commands/status.js +21 -0
- package/dist/handler/commands/status.js.map +1 -0
- package/dist/handler/commands/sync.d.ts +3 -0
- package/dist/handler/commands/sync.d.ts.map +1 -0
- package/dist/handler/commands/sync.js +26 -0
- package/dist/handler/commands/sync.js.map +1 -0
- package/dist/handler/commands/tasks.d.ts +10 -0
- package/dist/handler/commands/tasks.d.ts.map +1 -0
- package/dist/handler/commands/tasks.js +58 -0
- package/dist/handler/commands/tasks.js.map +1 -0
- package/dist/handler/commands/utils.d.ts +10 -0
- package/dist/handler/commands/utils.d.ts.map +1 -0
- package/dist/handler/commands/utils.js +63 -0
- package/dist/handler/commands/utils.js.map +1 -0
- package/dist/handler/commands/workspace.d.ts +10 -0
- package/dist/handler/commands/workspace.d.ts.map +1 -0
- package/dist/handler/commands/workspace.js +80 -0
- package/dist/handler/commands/workspace.js.map +1 -0
- package/dist/handler/dedup.d.ts +3 -0
- package/dist/handler/dedup.d.ts.map +1 -0
- package/dist/handler/dedup.js +29 -0
- package/dist/handler/dedup.js.map +1 -0
- package/dist/handler/index.d.ts +21 -0
- package/dist/handler/index.d.ts.map +1 -0
- package/dist/handler/index.js +189 -0
- package/dist/handler/index.js.map +1 -0
- package/dist/handler/parse.d.ts +30 -0
- package/dist/handler/parse.d.ts.map +1 -0
- package/dist/handler/parse.js +57 -0
- package/dist/handler/parse.js.map +1 -0
- package/dist/handler/session/agent.d.ts +10 -0
- package/dist/handler/session/agent.d.ts.map +1 -0
- package/dist/handler/session/agent.js +63 -0
- package/dist/handler/session/agent.js.map +1 -0
- package/dist/handler/session/model.d.ts +10 -0
- package/dist/handler/session/model.d.ts.map +1 -0
- package/dist/handler/session/model.js +63 -0
- package/dist/handler/session/model.js.map +1 -0
- package/dist/handler/session/new.d.ts +3 -0
- package/dist/handler/session/new.d.ts.map +1 -0
- package/dist/handler/session/new.js +25 -0
- package/dist/handler/session/new.js.map +1 -0
- package/dist/handler/session/session.d.ts +9 -0
- package/dist/handler/session/session.d.ts.map +1 -0
- package/dist/handler/session/session.js +55 -0
- package/dist/handler/session/session.js.map +1 -0
- package/dist/handler/session/workspace.d.ts +10 -0
- package/dist/handler/session/workspace.d.ts.map +1 -0
- package/dist/handler/session/workspace.js +80 -0
- package/dist/handler/session/workspace.js.map +1 -0
- package/dist/handler/shell/git.d.ts +3 -0
- package/dist/handler/shell/git.d.ts.map +1 -0
- package/dist/handler/shell/git.js +25 -0
- package/dist/handler/shell/git.js.map +1 -0
- package/dist/handler/shell/runShell.d.ts +7 -0
- package/dist/handler/shell/runShell.d.ts.map +1 -0
- package/dist/handler/shell/runShell.js +42 -0
- package/dist/handler/shell/runShell.js.map +1 -0
- package/dist/handler/shell/utils.d.ts +10 -0
- package/dist/handler/shell/utils.d.ts.map +1 -0
- package/dist/handler/shell/utils.js +63 -0
- package/dist/handler/shell/utils.js.map +1 -0
- package/dist/handler/streamHandler.d.ts +9 -0
- package/dist/handler/streamHandler.d.ts.map +1 -0
- package/dist/handler/streamHandler.js +49 -0
- package/dist/handler/streamHandler.js.map +1 -0
- package/dist/handler/types.d.ts +36 -0
- package/dist/handler/types.d.ts.map +1 -0
- package/dist/handler/types.js +3 -0
- package/dist/handler/types.js.map +1 -0
- package/dist/handlers/messageHandler.d.ts +3 -0
- package/dist/handlers/messageHandler.d.ts.map +1 -0
- package/dist/handlers/messageHandler.js +249 -0
- package/dist/handlers/messageHandler.js.map +1 -0
- package/dist/handlers/messageHandlerOfficial.d.ts +2 -0
- package/dist/handlers/messageHandlerOfficial.d.ts.map +1 -0
- package/dist/handlers/messageHandlerOfficial.js +302 -0
- package/dist/handlers/messageHandlerOfficial.js.map +1 -0
- package/dist/handlers/messageHandlerV2.d.ts +2 -0
- package/dist/handlers/messageHandlerV2.d.ts.map +1 -0
- package/dist/handlers/messageHandlerV2.js +250 -0
- package/dist/handlers/messageHandlerV2.js.map +1 -0
- package/dist/helloWorld.d.ts +5 -0
- package/dist/helloWorld.d.ts.map +1 -0
- package/dist/helloWorld.js +19 -0
- package/dist/helloWorld.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/indexOfficial.d.ts +4 -0
- package/dist/indexOfficial.d.ts.map +1 -0
- package/dist/indexOfficial.js +92 -0
- package/dist/indexOfficial.js.map +1 -0
- package/dist/indexV2.d.ts +4 -0
- package/dist/indexV2.d.ts.map +1 -0
- package/dist/indexV2.js +109 -0
- package/dist/indexV2.js.map +1 -0
- package/dist/runtime/cliTools.d.ts +17 -0
- package/dist/runtime/cliTools.d.ts.map +1 -0
- package/dist/runtime/cliTools.js +97 -0
- package/dist/runtime/cliTools.js.map +1 -0
- package/dist/runtime/executor.d.ts +27 -0
- package/dist/runtime/executor.d.ts.map +1 -0
- package/dist/runtime/executor.js +108 -0
- package/dist/runtime/executor.js.map +1 -0
- package/dist/runtime/sessionManager.d.ts +42 -0
- package/dist/runtime/sessionManager.d.ts.map +1 -0
- package/dist/runtime/sessionManager.js +161 -0
- package/dist/runtime/sessionManager.js.map +1 -0
- package/dist/runtime/streamHandler.d.ts +9 -0
- package/dist/runtime/streamHandler.d.ts.map +1 -0
- package/dist/runtime/streamHandler.js +49 -0
- package/dist/runtime/streamHandler.js.map +1 -0
- package/dist/runtime/taskManager.d.ts +26 -0
- package/dist/runtime/taskManager.d.ts.map +1 -0
- package/dist/runtime/taskManager.js +153 -0
- package/dist/runtime/taskManager.js.map +1 -0
- package/dist/runtime/tools/base.d.ts +81 -0
- package/dist/runtime/tools/base.d.ts.map +1 -0
- package/dist/runtime/tools/base.js +100 -0
- package/dist/runtime/tools/base.js.map +1 -0
- package/dist/runtime/tools/claudecode.d.ts +19 -0
- package/dist/runtime/tools/claudecode.d.ts.map +1 -0
- package/dist/runtime/tools/claudecode.js +59 -0
- package/dist/runtime/tools/claudecode.js.map +1 -0
- package/dist/runtime/tools/codex.d.ts +19 -0
- package/dist/runtime/tools/codex.d.ts.map +1 -0
- package/dist/runtime/tools/codex.js +68 -0
- package/dist/runtime/tools/codex.js.map +1 -0
- package/dist/runtime/tools/cursor.d.ts +15 -0
- package/dist/runtime/tools/cursor.d.ts.map +1 -0
- package/dist/runtime/tools/cursor.js +33 -0
- package/dist/runtime/tools/cursor.js.map +1 -0
- package/dist/runtime/tools/cursorcode.d.ts +20 -0
- package/dist/runtime/tools/cursorcode.d.ts.map +1 -0
- package/dist/runtime/tools/cursorcode.js +99 -0
- package/dist/runtime/tools/cursorcode.js.map +1 -0
- package/dist/runtime/tools/geminicode.d.ts +20 -0
- package/dist/runtime/tools/geminicode.d.ts.map +1 -0
- package/dist/runtime/tools/geminicode.js +65 -0
- package/dist/runtime/tools/geminicode.js.map +1 -0
- package/dist/runtime/tools/index.d.ts +11 -0
- package/dist/runtime/tools/index.d.ts.map +1 -0
- package/dist/runtime/tools/index.js +36 -0
- package/dist/runtime/tools/index.js.map +1 -0
- package/dist/runtime/tools/kimi.d.ts +16 -0
- package/dist/runtime/tools/kimi.d.ts.map +1 -0
- package/dist/runtime/tools/kimi.js +32 -0
- package/dist/runtime/tools/kimi.js.map +1 -0
- package/dist/runtime/tools/kimicode.d.ts +16 -0
- package/dist/runtime/tools/kimicode.d.ts.map +1 -0
- package/dist/runtime/tools/kimicode.js +43 -0
- package/dist/runtime/tools/kimicode.js.map +1 -0
- package/dist/runtime/tools/nanobot.d.ts +19 -0
- package/dist/runtime/tools/nanobot.d.ts.map +1 -0
- package/dist/runtime/tools/nanobot.js +94 -0
- package/dist/runtime/tools/nanobot.js.map +1 -0
- package/dist/runtime/tools/openaicodex.d.ts +17 -0
- package/dist/runtime/tools/openaicodex.d.ts.map +1 -0
- package/dist/runtime/tools/openaicodex.js +54 -0
- package/dist/runtime/tools/openaicodex.js.map +1 -0
- package/dist/runtime/tools/openclaw.d.ts +24 -0
- package/dist/runtime/tools/openclaw.d.ts.map +1 -0
- package/dist/runtime/tools/openclaw.js +88 -0
- package/dist/runtime/tools/openclaw.js.map +1 -0
- package/dist/runtime/tools/opencode.d.ts +23 -0
- package/dist/runtime/tools/opencode.d.ts.map +1 -0
- package/dist/runtime/tools/opencode.js +82 -0
- package/dist/runtime/tools/opencode.js.map +1 -0
- package/dist/runtime/tools/qwencode.d.ts +17 -0
- package/dist/runtime/tools/qwencode.d.ts.map +1 -0
- package/dist/runtime/tools/qwencode.js +49 -0
- package/dist/runtime/tools/qwencode.js.map +1 -0
- package/dist/runtime/tools/registerAll.d.ts +9 -0
- package/dist/runtime/tools/registerAll.d.ts.map +1 -0
- package/dist/runtime/tools/registerAll.js +29 -0
- package/dist/runtime/tools/registerAll.js.map +1 -0
- package/dist/runtime/tools/registry.d.ts +21 -0
- package/dist/runtime/tools/registry.d.ts.map +1 -0
- package/dist/runtime/tools/registry.js +41 -0
- package/dist/runtime/tools/registry.js.map +1 -0
- package/dist/runtime/tools/types.d.ts +67 -0
- package/dist/runtime/tools/types.d.ts.map +1 -0
- package/dist/runtime/tools/types.js +3 -0
- package/dist/runtime/tools/types.js.map +1 -0
- package/dist/services/cliTools.d.ts +32 -0
- package/dist/services/cliTools.d.ts.map +1 -0
- package/dist/services/cliTools.js +149 -0
- package/dist/services/cliTools.js.map +1 -0
- package/dist/services/commandExecutor.d.ts +29 -0
- package/dist/services/commandExecutor.d.ts.map +1 -0
- package/dist/services/commandExecutor.js +125 -0
- package/dist/services/commandExecutor.js.map +1 -0
- package/dist/services/commandExecutor.test.d.ts +2 -0
- package/dist/services/commandExecutor.test.d.ts.map +1 -0
- package/dist/services/commandExecutor.test.js +54 -0
- package/dist/services/commandExecutor.test.js.map +1 -0
- package/dist/services/feishuService.d.ts +14 -0
- package/dist/services/feishuService.d.ts.map +1 -0
- package/dist/services/feishuService.js +103 -0
- package/dist/services/feishuService.js.map +1 -0
- package/dist/services/feishuServiceOfficial.d.ts +15 -0
- package/dist/services/feishuServiceOfficial.d.ts.map +1 -0
- package/dist/services/feishuServiceOfficial.js +167 -0
- package/dist/services/feishuServiceOfficial.js.map +1 -0
- package/dist/services/feishuServiceV2.d.ts +20 -0
- package/dist/services/feishuServiceV2.d.ts.map +1 -0
- package/dist/services/feishuServiceV2.js +222 -0
- package/dist/services/feishuServiceV2.js.map +1 -0
- package/dist/services/taskManager.d.ts +25 -0
- package/dist/services/taskManager.d.ts.map +1 -0
- package/dist/services/taskManager.js +129 -0
- package/dist/services/taskManager.js.map +1 -0
- package/dist/services/taskManagerSimple.d.ts +25 -0
- package/dist/services/taskManagerSimple.d.ts.map +1 -0
- package/dist/services/taskManagerSimple.js +147 -0
- package/dist/services/taskManagerSimple.js.map +1 -0
- package/dist/testHelloWorld.d.ts +2 -0
- package/dist/testHelloWorld.d.ts.map +1 -0
- package/dist/testHelloWorld.js +18 -0
- package/dist/testHelloWorld.js.map +1 -0
- package/dist/utils/encoding.d.ts +3 -0
- package/dist/utils/encoding.d.ts.map +1 -0
- package/dist/utils/encoding.js +110 -0
- package/dist/utils/encoding.js.map +1 -0
- package/dist/utils/logger.d.ts +19 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +192 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/shellEncoding.d.ts +5 -0
- package/dist/utils/shellEncoding.d.ts.map +1 -0
- package/dist/utils/shellEncoding.js +117 -0
- package/dist/utils/shellEncoding.js.map +1 -0
- package/openbotgate.example.yml +60 -0
- package/package.json +81 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.msteams = exports.MsteamsGateway = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Microsoft Teams gateway: receives Bot Framework activities via HTTP, replies via Connector API.
|
|
9
|
+
* Configure Bot in Azure, set messaging endpoint to https://your-host/api/teams.
|
|
10
|
+
*/
|
|
11
|
+
const express_1 = __importDefault(require("express"));
|
|
12
|
+
const logger_1 = __importDefault(require("../utils/logger"));
|
|
13
|
+
const config_1 = require("../config/config");
|
|
14
|
+
const MAX_MESSAGE_CACHE = 5000;
|
|
15
|
+
class MsteamsGateway {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.id = 'msteams';
|
|
18
|
+
this.server = null;
|
|
19
|
+
this.messageToConversation = new Map();
|
|
20
|
+
}
|
|
21
|
+
start(messageHandler) {
|
|
22
|
+
const cfg = config_1.config.msteams;
|
|
23
|
+
if (!cfg?.appId || !cfg?.appPassword) {
|
|
24
|
+
throw new Error('MS Teams app id and password required (MSTEAMS_APP_ID, MSTEAMS_APP_PASSWORD)');
|
|
25
|
+
}
|
|
26
|
+
const port = cfg.port ?? 3005;
|
|
27
|
+
const app = (0, express_1.default)();
|
|
28
|
+
app.use(express_1.default.json());
|
|
29
|
+
app.post(cfg.path ?? '/api/messages', (req, res) => {
|
|
30
|
+
const body = req.body;
|
|
31
|
+
res.status(200).end();
|
|
32
|
+
if (body.type !== 'message' || !body.text)
|
|
33
|
+
return;
|
|
34
|
+
const messageId = body.id ?? `${body.conversation?.id}-${Date.now()}`;
|
|
35
|
+
const serviceUrl = body.serviceUrl ?? '';
|
|
36
|
+
const conversationId = body.conversation?.id ?? '';
|
|
37
|
+
if (this.messageToConversation.size >= MAX_MESSAGE_CACHE) {
|
|
38
|
+
const first = this.messageToConversation.keys().next().value;
|
|
39
|
+
if (first)
|
|
40
|
+
this.messageToConversation.delete(first);
|
|
41
|
+
}
|
|
42
|
+
this.messageToConversation.set(messageId, { serviceUrl, conversationId });
|
|
43
|
+
messageHandler({
|
|
44
|
+
messageId,
|
|
45
|
+
chatId: conversationId,
|
|
46
|
+
senderId: body.from?.id ?? '',
|
|
47
|
+
senderName: body.from?.name,
|
|
48
|
+
text: body.text,
|
|
49
|
+
chatType: 'group',
|
|
50
|
+
}).catch((err) => logger_1.default.error('MS Teams handler error', err));
|
|
51
|
+
});
|
|
52
|
+
this.server = app.listen(port, () => {
|
|
53
|
+
logger_1.default.info(`🟢 MS Teams bot listening on port ${port}`);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
async reply(messageId, text) {
|
|
57
|
+
const cached = this.messageToConversation.get(messageId);
|
|
58
|
+
if (!cached || !config_1.config.msteams?.appId)
|
|
59
|
+
return;
|
|
60
|
+
const token = await this.getToken();
|
|
61
|
+
if (!token)
|
|
62
|
+
return;
|
|
63
|
+
const url = `${cached.serviceUrl}/v3/conversations/${encodeURIComponent(cached.conversationId)}/activities`;
|
|
64
|
+
const res = await fetch(url, {
|
|
65
|
+
method: 'POST',
|
|
66
|
+
headers: {
|
|
67
|
+
Authorization: `Bearer ${token}`,
|
|
68
|
+
'Content-Type': 'application/json',
|
|
69
|
+
},
|
|
70
|
+
body: JSON.stringify({ type: 'message', text }),
|
|
71
|
+
});
|
|
72
|
+
if (!res.ok)
|
|
73
|
+
logger_1.default.error('MS Teams reply failed', res.status, await res.text());
|
|
74
|
+
}
|
|
75
|
+
async send(chatId, _chatIdType, title, content) {
|
|
76
|
+
const text = title ? `${title}\n\n${content}` : content;
|
|
77
|
+
const cached = this.messageToConversation.get(chatId);
|
|
78
|
+
const convId = cached?.conversationId ?? chatId;
|
|
79
|
+
const serviceUrl = cached?.serviceUrl ?? config_1.config.msteams?.serviceUrl ?? '';
|
|
80
|
+
if (!serviceUrl)
|
|
81
|
+
return;
|
|
82
|
+
const token = await this.getToken();
|
|
83
|
+
if (!token)
|
|
84
|
+
return;
|
|
85
|
+
const url = `${serviceUrl}/v3/conversations/${encodeURIComponent(convId)}/activities`;
|
|
86
|
+
const res = await fetch(url, {
|
|
87
|
+
method: 'POST',
|
|
88
|
+
headers: {
|
|
89
|
+
Authorization: `Bearer ${token}`,
|
|
90
|
+
'Content-Type': 'application/json',
|
|
91
|
+
},
|
|
92
|
+
body: JSON.stringify({ type: 'message', text }),
|
|
93
|
+
});
|
|
94
|
+
if (!res.ok)
|
|
95
|
+
logger_1.default.error('MS Teams send failed', res.status, await res.text());
|
|
96
|
+
}
|
|
97
|
+
async getToken() {
|
|
98
|
+
const cfg = config_1.config.msteams;
|
|
99
|
+
if (!cfg?.appId || !cfg?.appPassword)
|
|
100
|
+
return null;
|
|
101
|
+
const res = await fetch('https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token', {
|
|
102
|
+
method: 'POST',
|
|
103
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
104
|
+
body: new URLSearchParams({
|
|
105
|
+
grant_type: 'client_credentials',
|
|
106
|
+
client_id: cfg.appId,
|
|
107
|
+
client_secret: cfg.appPassword,
|
|
108
|
+
scope: 'https://api.botframework.com/.default',
|
|
109
|
+
}),
|
|
110
|
+
});
|
|
111
|
+
if (!res.ok)
|
|
112
|
+
return null;
|
|
113
|
+
const data = (await res.json());
|
|
114
|
+
return data.access_token ?? null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
exports.MsteamsGateway = MsteamsGateway;
|
|
118
|
+
exports.msteams = new MsteamsGateway();
|
|
119
|
+
//# sourceMappingURL=msteams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"msteams.js","sourceRoot":"","sources":["../../src/gateway/msteams.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IGateway } from './types';
|
|
2
|
+
export declare class NextcloudTalkGateway implements IGateway {
|
|
3
|
+
readonly id = "nextcloud-talk";
|
|
4
|
+
private server;
|
|
5
|
+
private messageToRoom;
|
|
6
|
+
start(messageHandler: (data: unknown) => Promise<void>): void;
|
|
7
|
+
reply(messageId: string, text: string): Promise<void>;
|
|
8
|
+
send(chatId: string, _chatIdType: string, title: string, content: string): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare const nextcloudTalk: NextcloudTalkGateway;
|
|
11
|
+
//# sourceMappingURL=nextcloud-talk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextcloud-talk.d.ts","sourceRoot":"","sources":["../../src/gateway/nextcloud-talk.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxC,qBAAa,oBAAqB,YAAW,QAAQ;IACnD,QAAQ,CAAC,EAAE,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAsD;IACpE,OAAO,CAAC,aAAa,CAA0D;IAE/E,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAwCvD,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBrD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAe/F;AAED,eAAO,MAAM,aAAa,sBAA6B,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.nextcloudTalk = exports.NextcloudTalkGateway = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Nextcloud Talk gateway: incoming webhook + Talk REST API to send messages.
|
|
9
|
+
*/
|
|
10
|
+
const express_1 = __importDefault(require("express"));
|
|
11
|
+
const logger_1 = __importDefault(require("../utils/logger"));
|
|
12
|
+
const config_1 = require("../config/config");
|
|
13
|
+
const MAX_MESSAGE_CACHE = 5000;
|
|
14
|
+
class NextcloudTalkGateway {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.id = 'nextcloud-talk';
|
|
17
|
+
this.server = null;
|
|
18
|
+
this.messageToRoom = new Map();
|
|
19
|
+
}
|
|
20
|
+
start(messageHandler) {
|
|
21
|
+
const cfg = config_1.config.nextcloudTalk;
|
|
22
|
+
if (!cfg?.baseUrl || !cfg?.appToken) {
|
|
23
|
+
throw new Error('Nextcloud Talk base URL and app token required (NEXTCLOUD_TALK_BASE_URL, NEXTCLOUD_TALK_APP_TOKEN)');
|
|
24
|
+
}
|
|
25
|
+
const port = cfg.webhookPort ?? 3003;
|
|
26
|
+
const app = (0, express_1.default)();
|
|
27
|
+
app.use(express_1.default.json());
|
|
28
|
+
app.post(cfg.webhookPath ?? '/webhook', (req, res) => {
|
|
29
|
+
const body = req.body;
|
|
30
|
+
res.status(200).end();
|
|
31
|
+
const token = body.room?.token ?? '';
|
|
32
|
+
const roomType = body.room?.type ?? 2;
|
|
33
|
+
const messageId = body.message?.id ?? `${token}-${Date.now()}`;
|
|
34
|
+
const text = (body.message?.message ?? '').trim();
|
|
35
|
+
const senderId = body.actor?.id ?? '';
|
|
36
|
+
const senderName = body.actor?.name;
|
|
37
|
+
if (this.messageToRoom.size >= MAX_MESSAGE_CACHE) {
|
|
38
|
+
const first = this.messageToRoom.keys().next().value;
|
|
39
|
+
if (first)
|
|
40
|
+
this.messageToRoom.delete(first);
|
|
41
|
+
}
|
|
42
|
+
this.messageToRoom.set(messageId, { token, roomType });
|
|
43
|
+
messageHandler({
|
|
44
|
+
messageId,
|
|
45
|
+
chatId: token,
|
|
46
|
+
senderId,
|
|
47
|
+
senderName,
|
|
48
|
+
text,
|
|
49
|
+
chatType: roomType === 1 ? 'p2p' : 'group',
|
|
50
|
+
}).catch((err) => logger_1.default.error('Nextcloud Talk handler error', err));
|
|
51
|
+
});
|
|
52
|
+
this.server = app.listen(port, () => {
|
|
53
|
+
logger_1.default.info(`🟢 Nextcloud Talk webhook listening on port ${port}`);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
async reply(messageId, text) {
|
|
57
|
+
const cached = this.messageToRoom.get(messageId);
|
|
58
|
+
if (!cached || !config_1.config.nextcloudTalk?.baseUrl)
|
|
59
|
+
return;
|
|
60
|
+
const base = config_1.config.nextcloudTalk.baseUrl.replace(/\/$/, '');
|
|
61
|
+
const url = `${base}/ocs/v2.php/apps/spreed/api/v4/chat/${cached.token}`;
|
|
62
|
+
const res = await fetch(url, {
|
|
63
|
+
method: 'POST',
|
|
64
|
+
headers: {
|
|
65
|
+
Authorization: `Basic ${Buffer.from(`app:${config_1.config.nextcloudTalk.appToken}`).toString('base64')}`,
|
|
66
|
+
'OCS-APIRequest': 'true',
|
|
67
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
68
|
+
},
|
|
69
|
+
body: new URLSearchParams({ message: text }),
|
|
70
|
+
});
|
|
71
|
+
if (!res.ok)
|
|
72
|
+
logger_1.default.error('Nextcloud Talk reply failed', res.status, await res.text());
|
|
73
|
+
}
|
|
74
|
+
async send(chatId, _chatIdType, title, content) {
|
|
75
|
+
const text = title ? `${title}\n\n${content}` : content;
|
|
76
|
+
const base = config_1.config.nextcloudTalk.baseUrl.replace(/\/$/, '');
|
|
77
|
+
const url = `${base}/ocs/v2.php/apps/spreed/api/v4/chat/${chatId}`;
|
|
78
|
+
const res = await fetch(url, {
|
|
79
|
+
method: 'POST',
|
|
80
|
+
headers: {
|
|
81
|
+
Authorization: `Basic ${Buffer.from(`app:${config_1.config.nextcloudTalk.appToken}`).toString('base64')}`,
|
|
82
|
+
'OCS-APIRequest': 'true',
|
|
83
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
84
|
+
},
|
|
85
|
+
body: new URLSearchParams({ message: text }),
|
|
86
|
+
});
|
|
87
|
+
if (!res.ok)
|
|
88
|
+
logger_1.default.error('Nextcloud Talk send failed', res.status, await res.text());
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
exports.NextcloudTalkGateway = NextcloudTalkGateway;
|
|
92
|
+
exports.nextcloudTalk = new NextcloudTalkGateway();
|
|
93
|
+
//# sourceMappingURL=nextcloud-talk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextcloud-talk.js","sourceRoot":"","sources":["../../src/gateway/nextcloud-talk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { IGateway } from './types';
|
|
2
|
+
export declare class NostrGateway implements IGateway {
|
|
3
|
+
readonly id = "nostr";
|
|
4
|
+
private pool;
|
|
5
|
+
private secret;
|
|
6
|
+
private pubkey;
|
|
7
|
+
private messageToPeer;
|
|
8
|
+
private sub;
|
|
9
|
+
start(messageHandler: (data: unknown) => Promise<void>): void;
|
|
10
|
+
private createAndPublishDm;
|
|
11
|
+
reply(messageId: string, text: string): Promise<void>;
|
|
12
|
+
send(chatId: string, _chatIdType: string, title: string, content: string): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export declare const nostr: NostrGateway;
|
|
15
|
+
//# sourceMappingURL=nostr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nostr.d.ts","sourceRoot":"","sources":["../../src/gateway/nostr.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAYxC,qBAAa,YAAa,YAAW,QAAQ;IAC3C,QAAQ,CAAC,EAAE,WAAW;IACtB,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,GAAG,CAAqD;IAEhE,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;YA0C/C,kBAAkB;IAY1B,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAI/F;AAED,eAAO,MAAM,KAAK,cAAqB,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.nostr = exports.NostrGateway = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Nostr gateway: NIP-04 encrypted DMs.
|
|
9
|
+
* Uses nostr-tools: connect to relays, subscribe to kind 4 (DM), decrypt and reply.
|
|
10
|
+
*/
|
|
11
|
+
const nostr_tools_1 = require("nostr-tools");
|
|
12
|
+
const logger_1 = __importDefault(require("../utils/logger"));
|
|
13
|
+
const config_1 = require("../config/config");
|
|
14
|
+
const MAX_MESSAGE_CACHE = 5000;
|
|
15
|
+
function parseSecret(secret) {
|
|
16
|
+
const s = secret.trim();
|
|
17
|
+
if (s.length === 64 && /^[0-9a-fA-F]+$/.test(s)) {
|
|
18
|
+
return new Uint8Array(Buffer.from(s, 'hex'));
|
|
19
|
+
}
|
|
20
|
+
throw new Error('NOSTR_PRIVATE_KEY must be 64-char hex string');
|
|
21
|
+
}
|
|
22
|
+
class NostrGateway {
|
|
23
|
+
constructor() {
|
|
24
|
+
this.id = 'nostr';
|
|
25
|
+
this.pool = null;
|
|
26
|
+
this.secret = null;
|
|
27
|
+
this.pubkey = '';
|
|
28
|
+
this.messageToPeer = new Map();
|
|
29
|
+
this.sub = null;
|
|
30
|
+
}
|
|
31
|
+
start(messageHandler) {
|
|
32
|
+
const cfg = config_1.config.nostr;
|
|
33
|
+
if (!cfg?.privateKey || !cfg?.relays?.length) {
|
|
34
|
+
throw new Error('Nostr private key and relays required (NOSTR_PRIVATE_KEY, NOSTR_RELAYS)');
|
|
35
|
+
}
|
|
36
|
+
this.secret = parseSecret(cfg.privateKey);
|
|
37
|
+
this.pubkey = (0, nostr_tools_1.getPublicKey)(this.secret);
|
|
38
|
+
this.pool = new nostr_tools_1.SimplePool();
|
|
39
|
+
const relays = cfg.relays;
|
|
40
|
+
this.sub = this.pool.subscribe(relays, { kinds: [4], '#p': [this.pubkey] }, {
|
|
41
|
+
onevent: async (event) => {
|
|
42
|
+
if (event.pubkey === this.pubkey)
|
|
43
|
+
return;
|
|
44
|
+
let text = '';
|
|
45
|
+
try {
|
|
46
|
+
text = await nostr_tools_1.nip04.decrypt(this.secret, event.pubkey, event.content);
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
logger_1.default.warn('Nostr decrypt failed', e);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const messageId = event.id;
|
|
53
|
+
const peer = event.pubkey;
|
|
54
|
+
if (this.messageToPeer.size >= MAX_MESSAGE_CACHE) {
|
|
55
|
+
const first = this.messageToPeer.keys().next().value;
|
|
56
|
+
if (first)
|
|
57
|
+
this.messageToPeer.delete(first);
|
|
58
|
+
}
|
|
59
|
+
this.messageToPeer.set(messageId, peer);
|
|
60
|
+
await messageHandler({
|
|
61
|
+
messageId,
|
|
62
|
+
chatId: peer,
|
|
63
|
+
senderId: peer,
|
|
64
|
+
text,
|
|
65
|
+
chatType: 'p2p',
|
|
66
|
+
}).catch((err) => logger_1.default.error('Nostr handler error', err));
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
logger_1.default.info('🟢 Nostr subscribed to DMs');
|
|
70
|
+
}
|
|
71
|
+
async createAndPublishDm(peerPubkey, text) {
|
|
72
|
+
const cipher = await nostr_tools_1.nip04.encrypt(this.secret, peerPubkey, text);
|
|
73
|
+
const template = {
|
|
74
|
+
kind: 4,
|
|
75
|
+
content: cipher,
|
|
76
|
+
tags: [['p', peerPubkey]],
|
|
77
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
78
|
+
};
|
|
79
|
+
const signed = (0, nostr_tools_1.finalizeEvent)(template, this.secret);
|
|
80
|
+
await this.pool.publish(config_1.config.nostr.relays, signed);
|
|
81
|
+
}
|
|
82
|
+
async reply(messageId, text) {
|
|
83
|
+
const peer = this.messageToPeer.get(messageId);
|
|
84
|
+
if (!peer || !this.pool)
|
|
85
|
+
return;
|
|
86
|
+
await this.createAndPublishDm(peer, text);
|
|
87
|
+
}
|
|
88
|
+
async send(chatId, _chatIdType, title, content) {
|
|
89
|
+
const text = title ? `${title}\n\n${content}` : content;
|
|
90
|
+
await this.createAndPublishDm(chatId, text);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.NostrGateway = NostrGateway;
|
|
94
|
+
exports.nostr = new NostrGateway();
|
|
95
|
+
//# sourceMappingURL=nostr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nostr.js","sourceRoot":"","sources":["../../src/gateway/nostr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { IGateway } from './types';
|
|
2
|
+
export declare class QqGuildGateway implements IGateway {
|
|
3
|
+
readonly id = "qq-guild";
|
|
4
|
+
private client;
|
|
5
|
+
private ws;
|
|
6
|
+
private messageToTarget;
|
|
7
|
+
start(messageHandler: (data: unknown) => Promise<void>): void;
|
|
8
|
+
private handleMessage;
|
|
9
|
+
private getClient;
|
|
10
|
+
reply(messageId: string, text: string): Promise<void>;
|
|
11
|
+
send(chatId: string, chatIdType: string, title: string, content: string): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export declare const qqGuild: QqGuildGateway;
|
|
14
|
+
//# sourceMappingURL=qq-guild.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qq-guild.d.ts","sourceRoot":"","sources":["../../src/gateway/qq-guild.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMxC,qBAAa,cAAe,YAAW,QAAQ;IAC7C,QAAQ,CAAC,EAAE,cAAc;IACzB,OAAO,CAAC,MAAM,CAAiD;IAC/D,OAAO,CAAC,EAAE,CAAmD;IAC7D,OAAO,CAAC,eAAe,CAAmC;IAE1D,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAkC7D,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,SAAS;IAKX,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBrD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAa9F;AAED,eAAO,MAAM,OAAO,gBAAuB,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.qqGuild = exports.QqGuildGateway = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* QQ 频道网关:使用官方 qq-guild-bot SDK,长连接收消息、OpenAPI 发消息。
|
|
9
|
+
* 无需公网 IP,本机连接腾讯网关即可。
|
|
10
|
+
*/
|
|
11
|
+
const qq_guild_bot_1 = require("qq-guild-bot");
|
|
12
|
+
const logger_1 = __importDefault(require("../utils/logger"));
|
|
13
|
+
const config_1 = require("../config/config");
|
|
14
|
+
const MAX_CACHE = 5000;
|
|
15
|
+
class QqGuildGateway {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.id = 'qq-guild';
|
|
18
|
+
this.client = null;
|
|
19
|
+
this.ws = null;
|
|
20
|
+
this.messageToTarget = new Map();
|
|
21
|
+
}
|
|
22
|
+
start(messageHandler) {
|
|
23
|
+
const cfg = config_1.config.qqGuild;
|
|
24
|
+
if (!cfg?.appID || !cfg?.token) {
|
|
25
|
+
throw new Error('QQ 频道 appID 与 token 必填 (QQ_GUILD_APP_ID, QQ_GUILD_TOKEN)');
|
|
26
|
+
}
|
|
27
|
+
const intents = cfg.intents ?? ['PUBLIC_GUILD_MESSAGES', 'DIRECT_MESSAGE'];
|
|
28
|
+
const botConfig = {
|
|
29
|
+
appID: cfg.appID,
|
|
30
|
+
token: cfg.token,
|
|
31
|
+
intents,
|
|
32
|
+
sandbox: cfg.sandbox ?? false,
|
|
33
|
+
};
|
|
34
|
+
this.client = (0, qq_guild_bot_1.createOpenAPI)(botConfig);
|
|
35
|
+
this.ws = (0, qq_guild_bot_1.createWebsocket)(botConfig);
|
|
36
|
+
this.ws.on('PUBLIC_GUILD_MESSAGES', (data) => {
|
|
37
|
+
if (data.eventType !== 'AT_MESSAGE_CREATE' || !data.msg)
|
|
38
|
+
return;
|
|
39
|
+
this.handleMessage(data.msg, false, messageHandler);
|
|
40
|
+
});
|
|
41
|
+
this.ws.on('DIRECT_MESSAGE', (data) => {
|
|
42
|
+
if (data.eventType !== 'DIRECT_MESSAGE_CREATE' || !data.msg)
|
|
43
|
+
return;
|
|
44
|
+
this.handleMessage(data.msg, true, messageHandler);
|
|
45
|
+
});
|
|
46
|
+
this.ws.on('READY', () => {
|
|
47
|
+
logger_1.default.info('🟢 QQ 频道 WebSocket 已连接');
|
|
48
|
+
});
|
|
49
|
+
this.ws.on('ERROR', (err) => {
|
|
50
|
+
logger_1.default.warn('QQ 频道 WS 错误', err);
|
|
51
|
+
});
|
|
52
|
+
this.ws.connect(botConfig);
|
|
53
|
+
}
|
|
54
|
+
handleMessage(msg, isDirect, messageHandler) {
|
|
55
|
+
const messageId = String(msg.id ?? '');
|
|
56
|
+
const content = String(msg.content ?? '').trim();
|
|
57
|
+
const author = msg.author;
|
|
58
|
+
const authorId = author ? String(author.id ?? '') : '';
|
|
59
|
+
const authorName = author ? String(author.username ?? '') : '';
|
|
60
|
+
const channelId = String(msg.channel_id ?? '');
|
|
61
|
+
const guildId = String(msg.guild_id ?? '');
|
|
62
|
+
if (!messageId)
|
|
63
|
+
return;
|
|
64
|
+
if (this.messageToTarget.size >= MAX_CACHE) {
|
|
65
|
+
const first = this.messageToTarget.keys().next().value;
|
|
66
|
+
if (first)
|
|
67
|
+
this.messageToTarget.delete(first);
|
|
68
|
+
}
|
|
69
|
+
this.messageToTarget.set(messageId, { channelId, guildId, isDirect });
|
|
70
|
+
const chatId = isDirect ? guildId : channelId;
|
|
71
|
+
messageHandler({
|
|
72
|
+
messageId,
|
|
73
|
+
chatId,
|
|
74
|
+
senderId: authorId,
|
|
75
|
+
senderName: authorName || undefined,
|
|
76
|
+
text: content,
|
|
77
|
+
chatType: isDirect ? 'p2p' : 'group',
|
|
78
|
+
}).catch((err) => logger_1.default.error('QQ 频道 handler 错误', err));
|
|
79
|
+
}
|
|
80
|
+
getClient() {
|
|
81
|
+
if (!this.client)
|
|
82
|
+
throw new Error('QQ 频道 client 未初始化');
|
|
83
|
+
return this.client;
|
|
84
|
+
}
|
|
85
|
+
async reply(messageId, text) {
|
|
86
|
+
const cached = this.messageToTarget.get(messageId);
|
|
87
|
+
if (!cached) {
|
|
88
|
+
logger_1.default.warn('QQ 频道: 未知 messageId,无法回复');
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const client = this.getClient();
|
|
92
|
+
const body = { content: text, msg_id: messageId };
|
|
93
|
+
if (cached.isDirect) {
|
|
94
|
+
await client.directMessageApi.postDirectMessage(cached.guildId, body).catch((err) => {
|
|
95
|
+
logger_1.default.warn('QQ 频道 私信回复失败', err);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
await client.messageApi.postMessage(cached.channelId, body).catch((err) => {
|
|
100
|
+
logger_1.default.warn('QQ 频道 频道消息回复失败', err);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async send(chatId, chatIdType, title, content) {
|
|
105
|
+
const text = title ? `${title}\n\n${content}` : content;
|
|
106
|
+
const client = this.getClient();
|
|
107
|
+
if (chatIdType === 'private' || chatIdType === 'p2p') {
|
|
108
|
+
await client.directMessageApi.postDirectMessage(chatId, { content: text }).catch((err) => {
|
|
109
|
+
logger_1.default.warn('QQ 频道 私信发送失败', err);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
await client.messageApi.postMessage(chatId, { content: text }).catch((err) => {
|
|
114
|
+
logger_1.default.warn('QQ 频道 频道消息发送失败', err);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.QqGuildGateway = QqGuildGateway;
|
|
120
|
+
exports.qqGuild = new QqGuildGateway();
|
|
121
|
+
//# sourceMappingURL=qq-guild.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qq-guild.js","sourceRoot":"","sources":["../../src/gateway/qq-guild.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { IGateway } from './types';
|
|
2
|
+
export declare class QqGateway implements IGateway {
|
|
3
|
+
readonly id = "qq";
|
|
4
|
+
private client;
|
|
5
|
+
private ws;
|
|
6
|
+
private messageToTarget;
|
|
7
|
+
start(messageHandler: (data: unknown) => Promise<void>): void;
|
|
8
|
+
private handleMessage;
|
|
9
|
+
private getClient;
|
|
10
|
+
reply(messageId: string, text: string): Promise<void>;
|
|
11
|
+
send(chatId: string, chatIdType: string, title: string, content: string): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export declare const qq: QqGateway;
|
|
14
|
+
//# sourceMappingURL=qq.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qq.d.ts","sourceRoot":"","sources":["../../src/gateway/qq.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMxC,qBAAa,SAAU,YAAW,QAAQ;IACxC,QAAQ,CAAC,EAAE,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAiD;IAC/D,OAAO,CAAC,EAAE,CAAmD;IAC7D,OAAO,CAAC,eAAe,CAA8B;IAErD,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAkC7D,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,SAAS;IAKX,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBrD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAa9F;AAED,eAAO,MAAM,EAAE,WAAkB,CAAC"}
|