@ebowwa/channel-telegram 1.13.7 → 1.14.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/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts +30 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +266 -0
- package/dist/plugin.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/normalize.d.ts +76 -0
- package/dist/utils/normalize.d.ts.map +1 -0
- package/dist/utils/normalize.js +125 -0
- package/dist/utils/normalize.js.map +1 -0
- package/package.json +1 -1
- package/src/index.ts +31 -0
- package/src/plugin.ts +332 -0
- package/src/utils/index.ts +11 -0
- package/src/utils/normalize.ts +132 -0
package/dist/index.d.ts
CHANGED
|
@@ -17,9 +17,17 @@ import TelegramBot from "node-telegram-bot-api";
|
|
|
17
17
|
import { type ChannelId, type ChannelResponse, type ChannelCapabilities, type MessageHandler } from "@ebowwa/channel-types";
|
|
18
18
|
import { ConversationMemory } from "./conversation-memory.js";
|
|
19
19
|
import type { Tool } from "./types.js";
|
|
20
|
+
/**
|
|
21
|
+
* Telegram ChannelPlugin implementation.
|
|
22
|
+
*
|
|
23
|
+
* Use this for composable channel integration with the plugin registry.
|
|
24
|
+
*/
|
|
25
|
+
export { createTelegramPlugin, telegramPlugin, telegramMeta, telegramConfigAdapter, telegramThreadingAdapter, } from "./plugin.js";
|
|
26
|
+
export type { ResolvedTelegramAccount } from "./plugin.js";
|
|
20
27
|
export { ConversationMemory } from "./conversation-memory.js";
|
|
21
28
|
export { registerAllCommands, isQuiet } from "./commands/index.js";
|
|
22
29
|
export type { Tool } from "./types.js";
|
|
30
|
+
export { normalizeTelegramMessagingTarget, looksLikeTelegramTargetId, extractRawTarget, isUsernameTarget, isNumericIdTarget, } from "./utils/index.js";
|
|
23
31
|
export interface TelegramConfig {
|
|
24
32
|
botToken: string;
|
|
25
33
|
testChatId?: string;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,eAAe,EACpB,KAAK,mBAAmB,EAGxB,KAAK,cAAc,EAEpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -17,9 +17,23 @@ import TelegramBot from "node-telegram-bot-api";
|
|
|
17
17
|
import { createChannelId, } from "@ebowwa/channel-types";
|
|
18
18
|
import { ConversationMemory } from "./conversation-memory.js";
|
|
19
19
|
import { registerAllCommands } from "./commands/index.js";
|
|
20
|
+
// ============================================================
|
|
21
|
+
// PLUGIN EXPORTS (ChannelPlugin Pattern)
|
|
22
|
+
// ============================================================
|
|
23
|
+
/**
|
|
24
|
+
* Telegram ChannelPlugin implementation.
|
|
25
|
+
*
|
|
26
|
+
* Use this for composable channel integration with the plugin registry.
|
|
27
|
+
*/
|
|
28
|
+
export { createTelegramPlugin, telegramPlugin, telegramMeta, telegramConfigAdapter, telegramThreadingAdapter, } from "./plugin.js";
|
|
29
|
+
// ============================================================
|
|
30
|
+
// LEGACY EXPORTS (ChannelConnector Pattern)
|
|
31
|
+
// ============================================================
|
|
20
32
|
// Re-export for external use
|
|
21
33
|
export { ConversationMemory } from "./conversation-memory.js";
|
|
22
34
|
export { registerAllCommands, isQuiet } from "./commands/index.js";
|
|
35
|
+
// Normalization utilities
|
|
36
|
+
export { normalizeTelegramMessagingTarget, looksLikeTelegramTargetId, extractRawTarget, isUsernameTarget, isNumericIdTarget, } from "./utils/index.js";
|
|
23
37
|
export function createTelegramConfigFromEnv() {
|
|
24
38
|
const allowedUsers = process.env.TELEGRAM_ALLOWED_USERS
|
|
25
39
|
?.split(",")
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ebowwa/channel-telegram
|
|
3
|
+
*
|
|
4
|
+
* Telegram ChannelPlugin implementation following OpenClaw adapter pattern.
|
|
5
|
+
*
|
|
6
|
+
* This module provides:
|
|
7
|
+
* - ChannelPlugin implementation for Telegram
|
|
8
|
+
* - Config adapter for account management
|
|
9
|
+
* - Outbound adapter for message delivery
|
|
10
|
+
* - Gateway adapter for bot lifecycle
|
|
11
|
+
* - Threading adapter for reply modes
|
|
12
|
+
* - Auto-registration with pluginRegistry
|
|
13
|
+
*/
|
|
14
|
+
import type { ChannelPlugin, ChannelMeta, ChannelConfigAdapter, ChannelThreadingAdapter } from "@ebowwa/channel-types/plugins";
|
|
15
|
+
import type TelegramBot from "node-telegram-bot-api";
|
|
16
|
+
export interface ResolvedTelegramAccount {
|
|
17
|
+
botToken: string;
|
|
18
|
+
bot?: TelegramBot;
|
|
19
|
+
allowedUsers?: number[];
|
|
20
|
+
allowedChats?: number[];
|
|
21
|
+
pollingInterval: number;
|
|
22
|
+
}
|
|
23
|
+
export declare const telegramMeta: ChannelMeta;
|
|
24
|
+
export declare const telegramConfigAdapter: ChannelConfigAdapter<ResolvedTelegramAccount>;
|
|
25
|
+
export declare const telegramThreadingAdapter: ChannelThreadingAdapter;
|
|
26
|
+
export declare function createTelegramPlugin(config?: {
|
|
27
|
+
botToken?: string;
|
|
28
|
+
}, TelegramBotClass?: typeof TelegramBot): ChannelPlugin<ResolvedTelegramAccount>;
|
|
29
|
+
export declare const telegramPlugin: ChannelPlugin<ResolvedTelegramAccount>;
|
|
30
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,oBAAoB,EAGpB,uBAAuB,EAExB,MAAM,+BAA+B,CAAC;AAMvC,OAAO,KAAK,WAAW,MAAM,uBAAuB,CAAC;AAMrD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AAMD,eAAO,MAAM,YAAY,EAAE,WAM1B,CAAC;AAMF,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,CAAC,uBAAuB,CAqB/E,CAAC;AAgGF,eAAO,MAAM,wBAAwB,EAAE,uBAGtC,CAAC;AAwFF,wBAAgB,oBAAoB,CAClC,MAAM,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,EAClC,gBAAgB,CAAC,EAAE,OAAO,WAAW,GACpC,aAAa,CAAC,uBAAuB,CAAC,CA2CxC;AAMD,eAAO,MAAM,cAAc,wCAAyB,CAAC"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ebowwa/channel-telegram
|
|
3
|
+
*
|
|
4
|
+
* Telegram ChannelPlugin implementation following OpenClaw adapter pattern.
|
|
5
|
+
*
|
|
6
|
+
* This module provides:
|
|
7
|
+
* - ChannelPlugin implementation for Telegram
|
|
8
|
+
* - Config adapter for account management
|
|
9
|
+
* - Outbound adapter for message delivery
|
|
10
|
+
* - Gateway adapter for bot lifecycle
|
|
11
|
+
* - Threading adapter for reply modes
|
|
12
|
+
* - Auto-registration with pluginRegistry
|
|
13
|
+
*/
|
|
14
|
+
import { pluginRegistry } from "@ebowwa/channel-types/plugins";
|
|
15
|
+
// ============================================================
|
|
16
|
+
// META
|
|
17
|
+
// ============================================================
|
|
18
|
+
export const telegramMeta = {
|
|
19
|
+
label: "Telegram",
|
|
20
|
+
blurb: "Telegram Bot API for direct and group chats",
|
|
21
|
+
icon: "📱",
|
|
22
|
+
docsPath: "/docs/channels/telegram",
|
|
23
|
+
quickstartAllowFrom: true,
|
|
24
|
+
};
|
|
25
|
+
// ============================================================
|
|
26
|
+
// CONFIG ADAPTER
|
|
27
|
+
// ============================================================
|
|
28
|
+
export const telegramConfigAdapter = {
|
|
29
|
+
listAccountIds: async (config) => {
|
|
30
|
+
const botToken = config.botToken;
|
|
31
|
+
if (!botToken)
|
|
32
|
+
return [];
|
|
33
|
+
return ["default"];
|
|
34
|
+
},
|
|
35
|
+
resolveAccount: async (config, accountId) => {
|
|
36
|
+
return {
|
|
37
|
+
botToken: config.botToken,
|
|
38
|
+
allowedUsers: config.allowedUsers,
|
|
39
|
+
allowedChats: config.allowedChats,
|
|
40
|
+
pollingInterval: config.pollingInterval || 1000,
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
validateAccount: async (account) => {
|
|
44
|
+
if (!account.botToken)
|
|
45
|
+
return false;
|
|
46
|
+
// Could validate by calling getMe
|
|
47
|
+
return true;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
// ============================================================
|
|
51
|
+
// OUTBOUND ADAPTER
|
|
52
|
+
// ============================================================
|
|
53
|
+
const createOutboundAdapter = (getBot) => ({
|
|
54
|
+
deliveryMode: "direct",
|
|
55
|
+
textChunkLimit: 4096,
|
|
56
|
+
chunker: (text, limit) => {
|
|
57
|
+
// Simple chunking - could be smarter with markdown
|
|
58
|
+
const chunks = [];
|
|
59
|
+
for (let i = 0; i < text.length; i += limit) {
|
|
60
|
+
chunks.push(text.slice(i, i + limit));
|
|
61
|
+
}
|
|
62
|
+
return { chunks, totalChunks: chunks.length };
|
|
63
|
+
},
|
|
64
|
+
sendText: async ({ to, text, accountId, account, replyToId, threadId }) => {
|
|
65
|
+
const bot = getBot();
|
|
66
|
+
if (!bot) {
|
|
67
|
+
return { success: false, error: "Bot not initialized", timestamp: new Date() };
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const chatId = parseInt(to, 10);
|
|
71
|
+
const options = {
|
|
72
|
+
parse_mode: "Markdown",
|
|
73
|
+
};
|
|
74
|
+
if (replyToId) {
|
|
75
|
+
options.reply_to_message_id = parseInt(replyToId, 10);
|
|
76
|
+
}
|
|
77
|
+
if (threadId) {
|
|
78
|
+
options.message_thread_id = parseInt(threadId, 10);
|
|
79
|
+
}
|
|
80
|
+
const result = await bot.sendMessage(chatId, text, options);
|
|
81
|
+
return {
|
|
82
|
+
success: true,
|
|
83
|
+
messageId: result.message_id.toString(),
|
|
84
|
+
timestamp: new Date(),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
return {
|
|
89
|
+
success: false,
|
|
90
|
+
error: error.message,
|
|
91
|
+
timestamp: new Date(),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
sendMedia: async ({ to, text, mediaUrl, mediaType, accountId, account }) => {
|
|
96
|
+
const bot = getBot();
|
|
97
|
+
if (!bot) {
|
|
98
|
+
return { success: false, error: "Bot not initialized", timestamp: new Date() };
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
const chatId = parseInt(to, 10);
|
|
102
|
+
let result;
|
|
103
|
+
if (mediaType === "image") {
|
|
104
|
+
result = await bot.sendPhoto(chatId, mediaUrl, { caption: text });
|
|
105
|
+
}
|
|
106
|
+
else if (mediaType === "video") {
|
|
107
|
+
result = await bot.sendVideo(chatId, mediaUrl, { caption: text });
|
|
108
|
+
}
|
|
109
|
+
else if (mediaType === "audio") {
|
|
110
|
+
result = await bot.sendAudio(chatId, mediaUrl, { caption: text });
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
result = await bot.sendDocument(chatId, mediaUrl, { caption: text });
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
success: true,
|
|
117
|
+
messageId: result.message_id.toString(),
|
|
118
|
+
timestamp: new Date(),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
return {
|
|
123
|
+
success: false,
|
|
124
|
+
error: error.message,
|
|
125
|
+
timestamp: new Date(),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
// ============================================================
|
|
131
|
+
// THREADING ADAPTER
|
|
132
|
+
// ============================================================
|
|
133
|
+
export const telegramThreadingAdapter = {
|
|
134
|
+
replyModes: ["quote", "thread"],
|
|
135
|
+
defaultReplyMode: "quote",
|
|
136
|
+
};
|
|
137
|
+
// ============================================================
|
|
138
|
+
// GATEWAY ADAPTER
|
|
139
|
+
// ============================================================
|
|
140
|
+
const createGatewayAdapter = (createBot) => {
|
|
141
|
+
const activeBots = new Map();
|
|
142
|
+
const messageHandlers = new Map();
|
|
143
|
+
return {
|
|
144
|
+
startAccount: async ({ accountId, account, onMessage }) => {
|
|
145
|
+
const bot = createBot(account.botToken);
|
|
146
|
+
const handler = (msg) => {
|
|
147
|
+
// Check allowed users/chats
|
|
148
|
+
if (account.allowedUsers?.length && !account.allowedUsers.includes(msg.from?.id || 0)) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (account.allowedChats?.length && !account.allowedChats.includes(msg.chat.id)) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
// Create ChannelId for this message
|
|
155
|
+
const channelId = {
|
|
156
|
+
platform: "telegram",
|
|
157
|
+
accountId: msg.chat.id.toString(),
|
|
158
|
+
};
|
|
159
|
+
// Normalize to ChannelMessage format
|
|
160
|
+
const channelMessage = {
|
|
161
|
+
messageId: msg.message_id.toString(),
|
|
162
|
+
channelId,
|
|
163
|
+
timestamp: new Date(msg.date * 1000),
|
|
164
|
+
sender: {
|
|
165
|
+
id: msg.from?.id.toString() || "unknown",
|
|
166
|
+
username: msg.from?.username,
|
|
167
|
+
displayName: msg.from?.first_name,
|
|
168
|
+
isBot: msg.from?.is_bot || false,
|
|
169
|
+
},
|
|
170
|
+
text: msg.text || "",
|
|
171
|
+
context: {
|
|
172
|
+
isDM: msg.chat.type === "private",
|
|
173
|
+
groupName: msg.chat.title,
|
|
174
|
+
threadId: msg.message_thread_id?.toString(),
|
|
175
|
+
},
|
|
176
|
+
replyTo: msg.reply_to_message
|
|
177
|
+
? {
|
|
178
|
+
messageId: msg.reply_to_message.message_id.toString(),
|
|
179
|
+
channelId,
|
|
180
|
+
}
|
|
181
|
+
: undefined,
|
|
182
|
+
};
|
|
183
|
+
onMessage(channelMessage);
|
|
184
|
+
};
|
|
185
|
+
bot.on("message", handler);
|
|
186
|
+
activeBots.set(accountId, bot);
|
|
187
|
+
messageHandlers.set(accountId, handler);
|
|
188
|
+
},
|
|
189
|
+
stopAccount: async ({ accountId, account }) => {
|
|
190
|
+
const bot = activeBots.get(accountId);
|
|
191
|
+
const handler = messageHandlers.get(accountId);
|
|
192
|
+
if (bot && handler) {
|
|
193
|
+
bot.off("message", handler);
|
|
194
|
+
if (bot.isPolling()) {
|
|
195
|
+
await bot.stopPolling();
|
|
196
|
+
}
|
|
197
|
+
activeBots.delete(accountId);
|
|
198
|
+
messageHandlers.delete(accountId);
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
isAccountActive: (accountId) => {
|
|
202
|
+
return activeBots.has(accountId);
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
};
|
|
206
|
+
// ============================================================
|
|
207
|
+
// PLUGIN FACTORY
|
|
208
|
+
// ============================================================
|
|
209
|
+
export function createTelegramPlugin(config = {}, TelegramBotClass) {
|
|
210
|
+
let bot = null;
|
|
211
|
+
const createBot = (token) => {
|
|
212
|
+
if (!TelegramBotClass) {
|
|
213
|
+
throw new Error("TelegramBot class not provided");
|
|
214
|
+
}
|
|
215
|
+
return new TelegramBotClass(token, { polling: true });
|
|
216
|
+
};
|
|
217
|
+
return {
|
|
218
|
+
id: "telegram",
|
|
219
|
+
meta: telegramMeta,
|
|
220
|
+
capabilities: {
|
|
221
|
+
chatTypes: ["direct", "group", "channel", "thread"],
|
|
222
|
+
supports: {
|
|
223
|
+
text: true,
|
|
224
|
+
media: true,
|
|
225
|
+
replies: true,
|
|
226
|
+
threads: true,
|
|
227
|
+
reactions: true,
|
|
228
|
+
editing: true,
|
|
229
|
+
streaming: false,
|
|
230
|
+
buttons: true,
|
|
231
|
+
},
|
|
232
|
+
nativeCommands: true,
|
|
233
|
+
rateLimits: {
|
|
234
|
+
messagesPerMinute: 30,
|
|
235
|
+
charactersPerMessage: 4096,
|
|
236
|
+
},
|
|
237
|
+
media: {
|
|
238
|
+
maxFileSize: 50 * 1024 * 1024, // 50MB
|
|
239
|
+
supportedMimeTypes: ["image/*", "video/*", "audio/*", "application/pdf"],
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
config: telegramConfigAdapter,
|
|
243
|
+
outbound: createOutboundAdapter(() => bot),
|
|
244
|
+
gateway: createGatewayAdapter((token) => {
|
|
245
|
+
bot = createBot(token);
|
|
246
|
+
return bot;
|
|
247
|
+
}),
|
|
248
|
+
threading: telegramThreadingAdapter,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
// ============================================================
|
|
252
|
+
// DEFAULT PLUGIN INSTANCE
|
|
253
|
+
// ============================================================
|
|
254
|
+
export const telegramPlugin = createTelegramPlugin();
|
|
255
|
+
// ============================================================
|
|
256
|
+
// AUTO-REGISTER
|
|
257
|
+
// ============================================================
|
|
258
|
+
// Note: Only register if botToken is available
|
|
259
|
+
if (process.env.TELEGRAM_BOT_TOKEN) {
|
|
260
|
+
pluginRegistry.registerChannel({
|
|
261
|
+
pluginId: "telegram",
|
|
262
|
+
plugin: telegramPlugin,
|
|
263
|
+
source: "core",
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAeH,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAe/D,+DAA+D;AAC/D,OAAO;AACP,+DAA+D;AAE/D,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,6CAA6C;IACpD,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,yBAAyB;IACnC,mBAAmB,EAAE,IAAI;CAC1B,CAAC;AAEF,+DAA+D;AAC/D,iBAAiB;AACjB,+DAA+D;AAE/D,MAAM,CAAC,MAAM,qBAAqB,GAAkD;IAClF,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAkB,CAAC;QAC3C,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QACzB,OAAO,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC;IAED,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;QAC1C,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,QAAkB;YACnC,YAAY,EAAE,MAAM,CAAC,YAAoC;YACzD,YAAY,EAAE,MAAM,CAAC,YAAoC;YACzD,eAAe,EAAG,MAAM,CAAC,eAA0B,IAAI,IAAI;SAC5D,CAAC;IACJ,CAAC;IAED,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACjC,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QACpC,kCAAkC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAEF,+DAA+D;AAC/D,mBAAmB;AACnB,+DAA+D;AAE/D,MAAM,qBAAqB,GAAG,CAC5B,MAAgC,EACiB,EAAE,CAAC,CAAC;IACrD,YAAY,EAAE,QAAQ;IACtB,cAAc,EAAE,IAAI;IAEpB,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACvB,mDAAmD;QACnD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAChD,CAAC;IAED,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;QACxE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QACjF,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAChC,MAAM,OAAO,GAAmC;gBAC9C,UAAU,EAAE,UAAU;aACvB,CAAC;YAEF,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,mBAAmB,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACxD,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,iBAAiB,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAE5D,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE;gBACvC,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;QACzE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QACjF,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAChC,IAAI,MAA2B,CAAC;YAEhC,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAC1B,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,CAAC;iBAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBACjC,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,CAAC;iBAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBACjC,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE;gBACvC,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,+DAA+D;AAC/D,oBAAoB;AACpB,+DAA+D;AAE/D,MAAM,CAAC,MAAM,wBAAwB,GAA4B;IAC/D,UAAU,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;IAC/B,gBAAgB,EAAE,OAAO;CAC1B,CAAC;AAEF,+DAA+D;AAC/D,kBAAkB;AAClB,+DAA+D;AAE/D,MAAM,oBAAoB,GAAG,CAC3B,SAAyC,EACO,EAAE;IAClD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAuB,CAAC;IAClD,MAAM,eAAe,GAAG,IAAI,GAAG,EAA8B,CAAC;IAE9D,OAAO;QACL,YAAY,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;YACxD,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAExC,MAAM,OAAO,GAAG,CAAC,GAAwB,EAAE,EAAE;gBAC3C,4BAA4B;gBAC5B,IAAI,OAAO,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;oBACtF,OAAO;gBACT,CAAC;gBACD,IAAI,OAAO,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBAChF,OAAO;gBACT,CAAC;gBAED,oCAAoC;gBACpC,MAAM,SAAS,GAAc;oBAC3B,QAAQ,EAAE,UAAU;oBACpB,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE;iBAClC,CAAC;gBAEF,qCAAqC;gBACrC,MAAM,cAAc,GAAmB;oBACrC,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE;oBACpC,SAAS;oBACT,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;oBACpC,MAAM,EAAE;wBACN,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,SAAS;wBACxC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ;wBAC5B,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU;wBACjC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK;qBACjC;oBACD,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;oBACpB,OAAO,EAAE;wBACP,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS;wBACjC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK;wBACzB,QAAQ,EAAE,GAAG,CAAC,iBAAiB,EAAE,QAAQ,EAAE;qBAC5C;oBACD,OAAO,EAAE,GAAG,CAAC,gBAAgB;wBAC3B,CAAC,CAAC;4BACE,SAAS,EAAE,GAAG,CAAC,gBAAgB,CAAC,UAAU,CAAC,QAAQ,EAAE;4BACrD,SAAS;yBACV;wBACH,CAAC,CAAC,SAAS;iBACd,CAAC;gBAEF,SAAS,CAAC,cAAc,CAAC,CAAC;YAC5B,CAAC,CAAC;YAEF,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC3B,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAC/B,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QAED,WAAW,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;YAC5C,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAE/C,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC5B,IAAI,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC;oBACpB,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;gBAC1B,CAAC;gBACD,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC7B,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAED,eAAe,EAAE,CAAC,SAAS,EAAE,EAAE;YAC7B,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,+DAA+D;AAC/D,iBAAiB;AACjB,+DAA+D;AAE/D,MAAM,UAAU,oBAAoB,CAClC,SAAgC,EAAE,EAClC,gBAAqC;IAErC,IAAI,GAAG,GAAuB,IAAI,CAAC;IAEnC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAe,EAAE;QAC/C,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,IAAI,gBAAgB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC;IAEF,OAAO;QACL,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,YAAY;QAClB,YAAY,EAAE;YACZ,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;YACnD,QAAQ,EAAE;gBACR,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,IAAI;gBACX,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,IAAI;aACd;YACD,cAAc,EAAE,IAAI;YACpB,UAAU,EAAE;gBACV,iBAAiB,EAAE,EAAE;gBACrB,oBAAoB,EAAE,IAAI;aAC3B;YACD,KAAK,EAAE;gBACL,WAAW,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;gBACtC,kBAAkB,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,CAAC;aACzE;SACF;QACD,MAAM,EAAE,qBAAqB;QAC7B,QAAQ,EAAE,qBAAqB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;QAC1C,OAAO,EAAE,oBAAoB,CAAC,CAAC,KAAK,EAAE,EAAE;YACtC,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;QACF,SAAS,EAAE,wBAAwB;KACpC,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,0BAA0B;AAC1B,+DAA+D;AAE/D,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,EAAE,CAAC;AAErD,+DAA+D;AAC/D,gBAAgB;AAChB,+DAA+D;AAE/D,+CAA+C;AAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;IACnC,cAAc,CAAC,eAAe,CAAC;QAC7B,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,MAAM;KACf,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gCAAgC,EAChC,yBAAyB,EACzB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gCAAgC,EAChC,yBAAyB,EACzB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram Target Normalization Utilities
|
|
3
|
+
*
|
|
4
|
+
* Utilities for normalizing various Telegram target formats to a standardized
|
|
5
|
+
* `telegram:@username` or `telegram:123456` format.
|
|
6
|
+
*
|
|
7
|
+
* Supported input formats:
|
|
8
|
+
* - @username
|
|
9
|
+
* - telegram:@username
|
|
10
|
+
* - tg:@username
|
|
11
|
+
* - https://t.me/username
|
|
12
|
+
* - t.me/username
|
|
13
|
+
* - 123456789 (numeric ID)
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Normalize a Telegram messaging target to standard format.
|
|
17
|
+
*
|
|
18
|
+
* @param raw - Raw input string (username, URL, numeric ID, etc.)
|
|
19
|
+
* @returns Normalized format like `telegram:@username` or `telegram:123456`, or undefined if invalid
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* normalizeTelegramMessagingTarget("@durov") // "telegram:@durov"
|
|
23
|
+
* normalizeTelegramMessagingTarget("t.me/durov") // "telegram:@durov"
|
|
24
|
+
* normalizeTelegramMessagingTarget("telegram:123") // "telegram:123"
|
|
25
|
+
* normalizeTelegramMessagingTarget("") // undefined
|
|
26
|
+
*/
|
|
27
|
+
export declare function normalizeTelegramMessagingTarget(raw: string): string | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Check if a string looks like a Telegram target ID.
|
|
30
|
+
*
|
|
31
|
+
* @param raw - Raw input string
|
|
32
|
+
* @returns true if the string appears to be a Telegram target
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* looksLikeTelegramTargetId("@durov") // true
|
|
36
|
+
* looksLikeTelegramTargetId("telegram:123") // true
|
|
37
|
+
* looksLikeTelegramTargetId("tg:@bot") // true
|
|
38
|
+
* looksLikeTelegramTargetId("123456789") // true (numeric ID)
|
|
39
|
+
* looksLikeTelegramTargetId("hello world") // false
|
|
40
|
+
*/
|
|
41
|
+
export declare function looksLikeTelegramTargetId(raw: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Extract the raw target from a normalized Telegram target string.
|
|
44
|
+
*
|
|
45
|
+
* @param normalized - Normalized format like `telegram:@username`
|
|
46
|
+
* @returns The raw target (@username or numeric ID) or undefined
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* extractRawTarget("telegram:@durov") // "@durov"
|
|
50
|
+
* extractRawTarget("telegram:123456") // "123456"
|
|
51
|
+
* extractRawTarget("invalid") // undefined
|
|
52
|
+
*/
|
|
53
|
+
export declare function extractRawTarget(normalized: string): string | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* Check if a normalized target is a username (vs numeric ID).
|
|
56
|
+
*
|
|
57
|
+
* @param normalized - Normalized format like `telegram:@username`
|
|
58
|
+
* @returns true if target is a username
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* isUsernameTarget("telegram:@durov") // true
|
|
62
|
+
* isUsernameTarget("telegram:123456") // false
|
|
63
|
+
*/
|
|
64
|
+
export declare function isUsernameTarget(normalized: string): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Check if a normalized target is a numeric ID.
|
|
67
|
+
*
|
|
68
|
+
* @param normalized - Normalized format like `telegram:123456`
|
|
69
|
+
* @returns true if target is a numeric ID
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* isNumericIdTarget("telegram:123456") // true
|
|
73
|
+
* isNumericIdTarget("telegram:@durov") // false
|
|
74
|
+
*/
|
|
75
|
+
export declare function isNumericIdTarget(normalized: string): boolean;
|
|
76
|
+
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;;;;;;;GAWG;AACH,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA2BhF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAY9D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMvE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAG5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAI7D"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram Target Normalization Utilities
|
|
3
|
+
*
|
|
4
|
+
* Utilities for normalizing various Telegram target formats to a standardized
|
|
5
|
+
* `telegram:@username` or `telegram:123456` format.
|
|
6
|
+
*
|
|
7
|
+
* Supported input formats:
|
|
8
|
+
* - @username
|
|
9
|
+
* - telegram:@username
|
|
10
|
+
* - tg:@username
|
|
11
|
+
* - https://t.me/username
|
|
12
|
+
* - t.me/username
|
|
13
|
+
* - 123456789 (numeric ID)
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Normalize a Telegram messaging target to standard format.
|
|
17
|
+
*
|
|
18
|
+
* @param raw - Raw input string (username, URL, numeric ID, etc.)
|
|
19
|
+
* @returns Normalized format like `telegram:@username` or `telegram:123456`, or undefined if invalid
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* normalizeTelegramMessagingTarget("@durov") // "telegram:@durov"
|
|
23
|
+
* normalizeTelegramMessagingTarget("t.me/durov") // "telegram:@durov"
|
|
24
|
+
* normalizeTelegramMessagingTarget("telegram:123") // "telegram:123"
|
|
25
|
+
* normalizeTelegramMessagingTarget("") // undefined
|
|
26
|
+
*/
|
|
27
|
+
export function normalizeTelegramMessagingTarget(raw) {
|
|
28
|
+
const trimmed = raw.trim();
|
|
29
|
+
if (!trimmed)
|
|
30
|
+
return undefined;
|
|
31
|
+
let normalized = trimmed;
|
|
32
|
+
// Strip telegram: or tg: prefix
|
|
33
|
+
if (normalized.startsWith("telegram:")) {
|
|
34
|
+
normalized = normalized.slice("telegram:".length).trim();
|
|
35
|
+
}
|
|
36
|
+
else if (normalized.startsWith("tg:")) {
|
|
37
|
+
normalized = normalized.slice("tg:".length).trim();
|
|
38
|
+
}
|
|
39
|
+
if (!normalized)
|
|
40
|
+
return undefined;
|
|
41
|
+
// Convert t.me URLs to @username format
|
|
42
|
+
const tmeMatch = /^https?:\/\/t\.me\/([A-Za-z0-9_]+)$/i.exec(normalized) ??
|
|
43
|
+
/^t\.me\/([A-Za-z0-9_]+)$/i.exec(normalized);
|
|
44
|
+
if (tmeMatch?.[1]) {
|
|
45
|
+
normalized = `@${tmeMatch[1]}`;
|
|
46
|
+
}
|
|
47
|
+
if (!normalized)
|
|
48
|
+
return undefined;
|
|
49
|
+
return `telegram:${normalized}`.toLowerCase();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if a string looks like a Telegram target ID.
|
|
53
|
+
*
|
|
54
|
+
* @param raw - Raw input string
|
|
55
|
+
* @returns true if the string appears to be a Telegram target
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* looksLikeTelegramTargetId("@durov") // true
|
|
59
|
+
* looksLikeTelegramTargetId("telegram:123") // true
|
|
60
|
+
* looksLikeTelegramTargetId("tg:@bot") // true
|
|
61
|
+
* looksLikeTelegramTargetId("123456789") // true (numeric ID)
|
|
62
|
+
* looksLikeTelegramTargetId("hello world") // false
|
|
63
|
+
*/
|
|
64
|
+
export function looksLikeTelegramTargetId(raw) {
|
|
65
|
+
const trimmed = raw.trim();
|
|
66
|
+
if (!trimmed)
|
|
67
|
+
return false;
|
|
68
|
+
// Has telegram: or tg: prefix
|
|
69
|
+
if (/^(telegram|tg):/i.test(trimmed))
|
|
70
|
+
return true;
|
|
71
|
+
// Starts with @ (username format)
|
|
72
|
+
if (trimmed.startsWith("@"))
|
|
73
|
+
return true;
|
|
74
|
+
// Numeric ID (6+ digits, Telegram user/chat IDs are typically long)
|
|
75
|
+
return /^-?\d{6,}$/.test(trimmed);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Extract the raw target from a normalized Telegram target string.
|
|
79
|
+
*
|
|
80
|
+
* @param normalized - Normalized format like `telegram:@username`
|
|
81
|
+
* @returns The raw target (@username or numeric ID) or undefined
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* extractRawTarget("telegram:@durov") // "@durov"
|
|
85
|
+
* extractRawTarget("telegram:123456") // "123456"
|
|
86
|
+
* extractRawTarget("invalid") // undefined
|
|
87
|
+
*/
|
|
88
|
+
export function extractRawTarget(normalized) {
|
|
89
|
+
const trimmed = normalized.trim();
|
|
90
|
+
if (!trimmed.startsWith("telegram:"))
|
|
91
|
+
return undefined;
|
|
92
|
+
const raw = trimmed.slice("telegram:".length);
|
|
93
|
+
return raw || undefined;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Check if a normalized target is a username (vs numeric ID).
|
|
97
|
+
*
|
|
98
|
+
* @param normalized - Normalized format like `telegram:@username`
|
|
99
|
+
* @returns true if target is a username
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* isUsernameTarget("telegram:@durov") // true
|
|
103
|
+
* isUsernameTarget("telegram:123456") // false
|
|
104
|
+
*/
|
|
105
|
+
export function isUsernameTarget(normalized) {
|
|
106
|
+
const raw = extractRawTarget(normalized);
|
|
107
|
+
return raw?.startsWith("@") ?? false;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Check if a normalized target is a numeric ID.
|
|
111
|
+
*
|
|
112
|
+
* @param normalized - Normalized format like `telegram:123456`
|
|
113
|
+
* @returns true if target is a numeric ID
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* isNumericIdTarget("telegram:123456") // true
|
|
117
|
+
* isNumericIdTarget("telegram:@durov") // false
|
|
118
|
+
*/
|
|
119
|
+
export function isNumericIdTarget(normalized) {
|
|
120
|
+
const raw = extractRawTarget(normalized);
|
|
121
|
+
if (!raw)
|
|
122
|
+
return false;
|
|
123
|
+
return /^-?\d+$/.test(raw);
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gCAAgC,CAAC,GAAW;IAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,IAAI,UAAU,GAAG,OAAO,CAAC;IAEzB,gCAAgC;IAChC,IAAI,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACvC,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,CAAC;SAAM,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,CAAC;IAED,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAElC,wCAAwC;IACxC,MAAM,QAAQ,GACZ,sCAAsC,CAAC,IAAI,CAAC,UAAU,CAAC;QACvD,2BAA2B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE/C,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClB,UAAU,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAElC,OAAO,YAAY,UAAU,EAAE,CAAC,WAAW,EAAE,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAW;IACnD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3B,8BAA8B;IAC9B,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAElD,kCAAkC;IAClC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,oEAAoE;IACpE,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IAEvD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,GAAG,IAAI,SAAS,CAAC;AAC1B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,MAAM,GAAG,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACzC,OAAO,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;AACvC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,MAAM,GAAG,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -31,11 +31,42 @@ import { ConversationMemory } from "./conversation-memory.js";
|
|
|
31
31
|
import { registerAllCommands, isQuiet } from "./commands/index.js";
|
|
32
32
|
import type { Tool } from "./types.js";
|
|
33
33
|
|
|
34
|
+
// ============================================================
|
|
35
|
+
// PLUGIN EXPORTS (ChannelPlugin Pattern)
|
|
36
|
+
// ============================================================
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Telegram ChannelPlugin implementation.
|
|
40
|
+
*
|
|
41
|
+
* Use this for composable channel integration with the plugin registry.
|
|
42
|
+
*/
|
|
43
|
+
export {
|
|
44
|
+
createTelegramPlugin,
|
|
45
|
+
telegramPlugin,
|
|
46
|
+
telegramMeta,
|
|
47
|
+
telegramConfigAdapter,
|
|
48
|
+
telegramThreadingAdapter,
|
|
49
|
+
} from "./plugin.js";
|
|
50
|
+
export type { ResolvedTelegramAccount } from "./plugin.js";
|
|
51
|
+
|
|
52
|
+
// ============================================================
|
|
53
|
+
// LEGACY EXPORTS (ChannelConnector Pattern)
|
|
54
|
+
// ============================================================
|
|
55
|
+
|
|
34
56
|
// Re-export for external use
|
|
35
57
|
export { ConversationMemory } from "./conversation-memory.js";
|
|
36
58
|
export { registerAllCommands, isQuiet } from "./commands/index.js";
|
|
37
59
|
export type { Tool } from "./types.js";
|
|
38
60
|
|
|
61
|
+
// Normalization utilities
|
|
62
|
+
export {
|
|
63
|
+
normalizeTelegramMessagingTarget,
|
|
64
|
+
looksLikeTelegramTargetId,
|
|
65
|
+
extractRawTarget,
|
|
66
|
+
isUsernameTarget,
|
|
67
|
+
isNumericIdTarget,
|
|
68
|
+
} from "./utils/index.js";
|
|
69
|
+
|
|
39
70
|
// ============================================================
|
|
40
71
|
// CONFIG
|
|
41
72
|
// ============================================================
|
package/src/plugin.ts
ADDED
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ebowwa/channel-telegram
|
|
3
|
+
*
|
|
4
|
+
* Telegram ChannelPlugin implementation following OpenClaw adapter pattern.
|
|
5
|
+
*
|
|
6
|
+
* This module provides:
|
|
7
|
+
* - ChannelPlugin implementation for Telegram
|
|
8
|
+
* - Config adapter for account management
|
|
9
|
+
* - Outbound adapter for message delivery
|
|
10
|
+
* - Gateway adapter for bot lifecycle
|
|
11
|
+
* - Threading adapter for reply modes
|
|
12
|
+
* - Auto-registration with pluginRegistry
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type {
|
|
16
|
+
ChannelPlugin,
|
|
17
|
+
ChannelMeta,
|
|
18
|
+
ChannelConfigAdapter,
|
|
19
|
+
ChannelOutboundAdapter,
|
|
20
|
+
ChannelGatewayAdapter,
|
|
21
|
+
ChannelThreadingAdapter,
|
|
22
|
+
OutboundResult,
|
|
23
|
+
} from "@ebowwa/channel-types/plugins";
|
|
24
|
+
import type {
|
|
25
|
+
ChannelId,
|
|
26
|
+
ChannelMessage,
|
|
27
|
+
} from "@ebowwa/channel-types";
|
|
28
|
+
import { pluginRegistry } from "@ebowwa/channel-types/plugins";
|
|
29
|
+
import type TelegramBot from "node-telegram-bot-api";
|
|
30
|
+
|
|
31
|
+
// ============================================================
|
|
32
|
+
// RESOLVED ACCOUNT TYPE
|
|
33
|
+
// ============================================================
|
|
34
|
+
|
|
35
|
+
export interface ResolvedTelegramAccount {
|
|
36
|
+
botToken: string;
|
|
37
|
+
bot?: TelegramBot;
|
|
38
|
+
allowedUsers?: number[];
|
|
39
|
+
allowedChats?: number[];
|
|
40
|
+
pollingInterval: number;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// ============================================================
|
|
44
|
+
// META
|
|
45
|
+
// ============================================================
|
|
46
|
+
|
|
47
|
+
export const telegramMeta: ChannelMeta = {
|
|
48
|
+
label: "Telegram",
|
|
49
|
+
blurb: "Telegram Bot API for direct and group chats",
|
|
50
|
+
icon: "📱",
|
|
51
|
+
docsPath: "/docs/channels/telegram",
|
|
52
|
+
quickstartAllowFrom: true,
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// ============================================================
|
|
56
|
+
// CONFIG ADAPTER
|
|
57
|
+
// ============================================================
|
|
58
|
+
|
|
59
|
+
export const telegramConfigAdapter: ChannelConfigAdapter<ResolvedTelegramAccount> = {
|
|
60
|
+
listAccountIds: async (config) => {
|
|
61
|
+
const botToken = config.botToken as string;
|
|
62
|
+
if (!botToken) return [];
|
|
63
|
+
return ["default"];
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
resolveAccount: async (config, accountId) => {
|
|
67
|
+
return {
|
|
68
|
+
botToken: config.botToken as string,
|
|
69
|
+
allowedUsers: config.allowedUsers as number[] | undefined,
|
|
70
|
+
allowedChats: config.allowedChats as number[] | undefined,
|
|
71
|
+
pollingInterval: (config.pollingInterval as number) || 1000,
|
|
72
|
+
};
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
validateAccount: async (account) => {
|
|
76
|
+
if (!account.botToken) return false;
|
|
77
|
+
// Could validate by calling getMe
|
|
78
|
+
return true;
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// ============================================================
|
|
83
|
+
// OUTBOUND ADAPTER
|
|
84
|
+
// ============================================================
|
|
85
|
+
|
|
86
|
+
const createOutboundAdapter = (
|
|
87
|
+
getBot: () => TelegramBot | null
|
|
88
|
+
): ChannelOutboundAdapter<ResolvedTelegramAccount> => ({
|
|
89
|
+
deliveryMode: "direct",
|
|
90
|
+
textChunkLimit: 4096,
|
|
91
|
+
|
|
92
|
+
chunker: (text, limit) => {
|
|
93
|
+
// Simple chunking - could be smarter with markdown
|
|
94
|
+
const chunks: string[] = [];
|
|
95
|
+
for (let i = 0; i < text.length; i += limit) {
|
|
96
|
+
chunks.push(text.slice(i, i + limit));
|
|
97
|
+
}
|
|
98
|
+
return { chunks, totalChunks: chunks.length };
|
|
99
|
+
},
|
|
100
|
+
|
|
101
|
+
sendText: async ({ to, text, accountId, account, replyToId, threadId }) => {
|
|
102
|
+
const bot = getBot();
|
|
103
|
+
if (!bot) {
|
|
104
|
+
return { success: false, error: "Bot not initialized", timestamp: new Date() };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
const chatId = parseInt(to, 10);
|
|
109
|
+
const options: TelegramBot.SendMessageOptions = {
|
|
110
|
+
parse_mode: "Markdown",
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
if (replyToId) {
|
|
114
|
+
options.reply_to_message_id = parseInt(replyToId, 10);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (threadId) {
|
|
118
|
+
options.message_thread_id = parseInt(threadId, 10);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const result = await bot.sendMessage(chatId, text, options);
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
success: true,
|
|
125
|
+
messageId: result.message_id.toString(),
|
|
126
|
+
timestamp: new Date(),
|
|
127
|
+
};
|
|
128
|
+
} catch (error) {
|
|
129
|
+
return {
|
|
130
|
+
success: false,
|
|
131
|
+
error: (error as Error).message,
|
|
132
|
+
timestamp: new Date(),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
sendMedia: async ({ to, text, mediaUrl, mediaType, accountId, account }) => {
|
|
138
|
+
const bot = getBot();
|
|
139
|
+
if (!bot) {
|
|
140
|
+
return { success: false, error: "Bot not initialized", timestamp: new Date() };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
try {
|
|
144
|
+
const chatId = parseInt(to, 10);
|
|
145
|
+
let result: TelegramBot.Message;
|
|
146
|
+
|
|
147
|
+
if (mediaType === "image") {
|
|
148
|
+
result = await bot.sendPhoto(chatId, mediaUrl, { caption: text });
|
|
149
|
+
} else if (mediaType === "video") {
|
|
150
|
+
result = await bot.sendVideo(chatId, mediaUrl, { caption: text });
|
|
151
|
+
} else if (mediaType === "audio") {
|
|
152
|
+
result = await bot.sendAudio(chatId, mediaUrl, { caption: text });
|
|
153
|
+
} else {
|
|
154
|
+
result = await bot.sendDocument(chatId, mediaUrl, { caption: text });
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
success: true,
|
|
159
|
+
messageId: result.message_id.toString(),
|
|
160
|
+
timestamp: new Date(),
|
|
161
|
+
};
|
|
162
|
+
} catch (error) {
|
|
163
|
+
return {
|
|
164
|
+
success: false,
|
|
165
|
+
error: (error as Error).message,
|
|
166
|
+
timestamp: new Date(),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// ============================================================
|
|
173
|
+
// THREADING ADAPTER
|
|
174
|
+
// ============================================================
|
|
175
|
+
|
|
176
|
+
export const telegramThreadingAdapter: ChannelThreadingAdapter = {
|
|
177
|
+
replyModes: ["quote", "thread"],
|
|
178
|
+
defaultReplyMode: "quote",
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
// ============================================================
|
|
182
|
+
// GATEWAY ADAPTER
|
|
183
|
+
// ============================================================
|
|
184
|
+
|
|
185
|
+
const createGatewayAdapter = (
|
|
186
|
+
createBot: (token: string) => TelegramBot
|
|
187
|
+
): ChannelGatewayAdapter<ResolvedTelegramAccount> => {
|
|
188
|
+
const activeBots = new Map<string, TelegramBot>();
|
|
189
|
+
const messageHandlers = new Map<string, (msg: any) => void>();
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
startAccount: async ({ accountId, account, onMessage }) => {
|
|
193
|
+
const bot = createBot(account.botToken);
|
|
194
|
+
|
|
195
|
+
const handler = (msg: TelegramBot.Message) => {
|
|
196
|
+
// Check allowed users/chats
|
|
197
|
+
if (account.allowedUsers?.length && !account.allowedUsers.includes(msg.from?.id || 0)) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (account.allowedChats?.length && !account.allowedChats.includes(msg.chat.id)) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Create ChannelId for this message
|
|
205
|
+
const channelId: ChannelId = {
|
|
206
|
+
platform: "telegram",
|
|
207
|
+
accountId: msg.chat.id.toString(),
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
// Normalize to ChannelMessage format
|
|
211
|
+
const channelMessage: ChannelMessage = {
|
|
212
|
+
messageId: msg.message_id.toString(),
|
|
213
|
+
channelId,
|
|
214
|
+
timestamp: new Date(msg.date * 1000),
|
|
215
|
+
sender: {
|
|
216
|
+
id: msg.from?.id.toString() || "unknown",
|
|
217
|
+
username: msg.from?.username,
|
|
218
|
+
displayName: msg.from?.first_name,
|
|
219
|
+
isBot: msg.from?.is_bot || false,
|
|
220
|
+
},
|
|
221
|
+
text: msg.text || "",
|
|
222
|
+
context: {
|
|
223
|
+
isDM: msg.chat.type === "private",
|
|
224
|
+
groupName: msg.chat.title,
|
|
225
|
+
threadId: msg.message_thread_id?.toString(),
|
|
226
|
+
},
|
|
227
|
+
replyTo: msg.reply_to_message
|
|
228
|
+
? {
|
|
229
|
+
messageId: msg.reply_to_message.message_id.toString(),
|
|
230
|
+
channelId,
|
|
231
|
+
}
|
|
232
|
+
: undefined,
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
onMessage(channelMessage);
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
bot.on("message", handler);
|
|
239
|
+
activeBots.set(accountId, bot);
|
|
240
|
+
messageHandlers.set(accountId, handler);
|
|
241
|
+
},
|
|
242
|
+
|
|
243
|
+
stopAccount: async ({ accountId, account }) => {
|
|
244
|
+
const bot = activeBots.get(accountId);
|
|
245
|
+
const handler = messageHandlers.get(accountId);
|
|
246
|
+
|
|
247
|
+
if (bot && handler) {
|
|
248
|
+
bot.off("message", handler);
|
|
249
|
+
if (bot.isPolling()) {
|
|
250
|
+
await bot.stopPolling();
|
|
251
|
+
}
|
|
252
|
+
activeBots.delete(accountId);
|
|
253
|
+
messageHandlers.delete(accountId);
|
|
254
|
+
}
|
|
255
|
+
},
|
|
256
|
+
|
|
257
|
+
isAccountActive: (accountId) => {
|
|
258
|
+
return activeBots.has(accountId);
|
|
259
|
+
},
|
|
260
|
+
};
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
// ============================================================
|
|
264
|
+
// PLUGIN FACTORY
|
|
265
|
+
// ============================================================
|
|
266
|
+
|
|
267
|
+
export function createTelegramPlugin(
|
|
268
|
+
config: { botToken?: string } = {},
|
|
269
|
+
TelegramBotClass?: typeof TelegramBot
|
|
270
|
+
): ChannelPlugin<ResolvedTelegramAccount> {
|
|
271
|
+
let bot: TelegramBot | null = null;
|
|
272
|
+
|
|
273
|
+
const createBot = (token: string): TelegramBot => {
|
|
274
|
+
if (!TelegramBotClass) {
|
|
275
|
+
throw new Error("TelegramBot class not provided");
|
|
276
|
+
}
|
|
277
|
+
return new TelegramBotClass(token, { polling: true });
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
return {
|
|
281
|
+
id: "telegram",
|
|
282
|
+
meta: telegramMeta,
|
|
283
|
+
capabilities: {
|
|
284
|
+
chatTypes: ["direct", "group", "channel", "thread"],
|
|
285
|
+
supports: {
|
|
286
|
+
text: true,
|
|
287
|
+
media: true,
|
|
288
|
+
replies: true,
|
|
289
|
+
threads: true,
|
|
290
|
+
reactions: true,
|
|
291
|
+
editing: true,
|
|
292
|
+
streaming: false,
|
|
293
|
+
buttons: true,
|
|
294
|
+
},
|
|
295
|
+
nativeCommands: true,
|
|
296
|
+
rateLimits: {
|
|
297
|
+
messagesPerMinute: 30,
|
|
298
|
+
charactersPerMessage: 4096,
|
|
299
|
+
},
|
|
300
|
+
media: {
|
|
301
|
+
maxFileSize: 50 * 1024 * 1024, // 50MB
|
|
302
|
+
supportedMimeTypes: ["image/*", "video/*", "audio/*", "application/pdf"],
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
config: telegramConfigAdapter,
|
|
306
|
+
outbound: createOutboundAdapter(() => bot),
|
|
307
|
+
gateway: createGatewayAdapter((token) => {
|
|
308
|
+
bot = createBot(token);
|
|
309
|
+
return bot;
|
|
310
|
+
}),
|
|
311
|
+
threading: telegramThreadingAdapter,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// ============================================================
|
|
316
|
+
// DEFAULT PLUGIN INSTANCE
|
|
317
|
+
// ============================================================
|
|
318
|
+
|
|
319
|
+
export const telegramPlugin = createTelegramPlugin();
|
|
320
|
+
|
|
321
|
+
// ============================================================
|
|
322
|
+
// AUTO-REGISTER
|
|
323
|
+
// ============================================================
|
|
324
|
+
|
|
325
|
+
// Note: Only register if botToken is available
|
|
326
|
+
if (process.env.TELEGRAM_BOT_TOKEN) {
|
|
327
|
+
pluginRegistry.registerChannel({
|
|
328
|
+
pluginId: "telegram",
|
|
329
|
+
plugin: telegramPlugin,
|
|
330
|
+
source: "core",
|
|
331
|
+
});
|
|
332
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram Target Normalization Utilities
|
|
3
|
+
*
|
|
4
|
+
* Utilities for normalizing various Telegram target formats to a standardized
|
|
5
|
+
* `telegram:@username` or `telegram:123456` format.
|
|
6
|
+
*
|
|
7
|
+
* Supported input formats:
|
|
8
|
+
* - @username
|
|
9
|
+
* - telegram:@username
|
|
10
|
+
* - tg:@username
|
|
11
|
+
* - https://t.me/username
|
|
12
|
+
* - t.me/username
|
|
13
|
+
* - 123456789 (numeric ID)
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Normalize a Telegram messaging target to standard format.
|
|
18
|
+
*
|
|
19
|
+
* @param raw - Raw input string (username, URL, numeric ID, etc.)
|
|
20
|
+
* @returns Normalized format like `telegram:@username` or `telegram:123456`, or undefined if invalid
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* normalizeTelegramMessagingTarget("@durov") // "telegram:@durov"
|
|
24
|
+
* normalizeTelegramMessagingTarget("t.me/durov") // "telegram:@durov"
|
|
25
|
+
* normalizeTelegramMessagingTarget("telegram:123") // "telegram:123"
|
|
26
|
+
* normalizeTelegramMessagingTarget("") // undefined
|
|
27
|
+
*/
|
|
28
|
+
export function normalizeTelegramMessagingTarget(raw: string): string | undefined {
|
|
29
|
+
const trimmed = raw.trim();
|
|
30
|
+
if (!trimmed) return undefined;
|
|
31
|
+
|
|
32
|
+
let normalized = trimmed;
|
|
33
|
+
|
|
34
|
+
// Strip telegram: or tg: prefix
|
|
35
|
+
if (normalized.startsWith("telegram:")) {
|
|
36
|
+
normalized = normalized.slice("telegram:".length).trim();
|
|
37
|
+
} else if (normalized.startsWith("tg:")) {
|
|
38
|
+
normalized = normalized.slice("tg:".length).trim();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (!normalized) return undefined;
|
|
42
|
+
|
|
43
|
+
// Convert t.me URLs to @username format
|
|
44
|
+
const tmeMatch =
|
|
45
|
+
/^https?:\/\/t\.me\/([A-Za-z0-9_]+)$/i.exec(normalized) ??
|
|
46
|
+
/^t\.me\/([A-Za-z0-9_]+)$/i.exec(normalized);
|
|
47
|
+
|
|
48
|
+
if (tmeMatch?.[1]) {
|
|
49
|
+
normalized = `@${tmeMatch[1]}`;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (!normalized) return undefined;
|
|
53
|
+
|
|
54
|
+
return `telegram:${normalized}`.toLowerCase();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Check if a string looks like a Telegram target ID.
|
|
59
|
+
*
|
|
60
|
+
* @param raw - Raw input string
|
|
61
|
+
* @returns true if the string appears to be a Telegram target
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* looksLikeTelegramTargetId("@durov") // true
|
|
65
|
+
* looksLikeTelegramTargetId("telegram:123") // true
|
|
66
|
+
* looksLikeTelegramTargetId("tg:@bot") // true
|
|
67
|
+
* looksLikeTelegramTargetId("123456789") // true (numeric ID)
|
|
68
|
+
* looksLikeTelegramTargetId("hello world") // false
|
|
69
|
+
*/
|
|
70
|
+
export function looksLikeTelegramTargetId(raw: string): boolean {
|
|
71
|
+
const trimmed = raw.trim();
|
|
72
|
+
if (!trimmed) return false;
|
|
73
|
+
|
|
74
|
+
// Has telegram: or tg: prefix
|
|
75
|
+
if (/^(telegram|tg):/i.test(trimmed)) return true;
|
|
76
|
+
|
|
77
|
+
// Starts with @ (username format)
|
|
78
|
+
if (trimmed.startsWith("@")) return true;
|
|
79
|
+
|
|
80
|
+
// Numeric ID (6+ digits, Telegram user/chat IDs are typically long)
|
|
81
|
+
return /^-?\d{6,}$/.test(trimmed);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Extract the raw target from a normalized Telegram target string.
|
|
86
|
+
*
|
|
87
|
+
* @param normalized - Normalized format like `telegram:@username`
|
|
88
|
+
* @returns The raw target (@username or numeric ID) or undefined
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* extractRawTarget("telegram:@durov") // "@durov"
|
|
92
|
+
* extractRawTarget("telegram:123456") // "123456"
|
|
93
|
+
* extractRawTarget("invalid") // undefined
|
|
94
|
+
*/
|
|
95
|
+
export function extractRawTarget(normalized: string): string | undefined {
|
|
96
|
+
const trimmed = normalized.trim();
|
|
97
|
+
if (!trimmed.startsWith("telegram:")) return undefined;
|
|
98
|
+
|
|
99
|
+
const raw = trimmed.slice("telegram:".length);
|
|
100
|
+
return raw || undefined;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Check if a normalized target is a username (vs numeric ID).
|
|
105
|
+
*
|
|
106
|
+
* @param normalized - Normalized format like `telegram:@username`
|
|
107
|
+
* @returns true if target is a username
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* isUsernameTarget("telegram:@durov") // true
|
|
111
|
+
* isUsernameTarget("telegram:123456") // false
|
|
112
|
+
*/
|
|
113
|
+
export function isUsernameTarget(normalized: string): boolean {
|
|
114
|
+
const raw = extractRawTarget(normalized);
|
|
115
|
+
return raw?.startsWith("@") ?? false;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Check if a normalized target is a numeric ID.
|
|
120
|
+
*
|
|
121
|
+
* @param normalized - Normalized format like `telegram:123456`
|
|
122
|
+
* @returns true if target is a numeric ID
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* isNumericIdTarget("telegram:123456") // true
|
|
126
|
+
* isNumericIdTarget("telegram:@durov") // false
|
|
127
|
+
*/
|
|
128
|
+
export function isNumericIdTarget(normalized: string): boolean {
|
|
129
|
+
const raw = extractRawTarget(normalized);
|
|
130
|
+
if (!raw) return false;
|
|
131
|
+
return /^-?\d+$/.test(raw);
|
|
132
|
+
}
|