payload-plugin-telegram 0.1.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/collections/TelegramChats.d.ts +4 -0
- package/dist/collections/TelegramChats.d.ts.map +1 -0
- package/dist/collections/TelegramChats.js +41 -0
- package/dist/collections/TelegramChats.js.map +1 -0
- package/dist/collections/TelegramUploads.d.ts +4 -0
- package/dist/collections/TelegramUploads.d.ts.map +1 -0
- package/dist/collections/TelegramUploads.js +51 -0
- package/dist/collections/TelegramUploads.js.map +1 -0
- package/dist/endpoints/webhook.d.ts +4 -0
- package/dist/endpoints/webhook.d.ts.map +1 -0
- package/dist/endpoints/webhook.js +260 -0
- package/dist/endpoints/webhook.js.map +1 -0
- package/dist/hooks/injectTelegramId.d.ts +3 -0
- package/dist/hooks/injectTelegramId.d.ts.map +1 -0
- package/dist/hooks/injectTelegramId.js +18 -0
- package/dist/hooks/injectTelegramId.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/responses.d.ts +3 -0
- package/dist/lib/responses.d.ts.map +1 -0
- package/dist/lib/responses.js +10 -0
- package/dist/lib/responses.js.map +1 -0
- package/dist/lib/telegram.d.ts +6 -0
- package/dist/lib/telegram.d.ts.map +1 -0
- package/dist/lib/telegram.js +64 -0
- package/dist/lib/telegram.js.map +1 -0
- package/dist/plugin.d.ts +3 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +40 -0
- package/dist/plugin.js.map +1 -0
- package/dist/types.d.ts +115 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelegramChats.d.ts","sourceRoot":"","sources":["../../src/collections/TelegramChats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,GAAG,gBAAgB,CAuCvE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function buildTelegramChats(ctx) {
|
|
2
|
+
return {
|
|
3
|
+
slug: ctx.collectionSlugs.chats,
|
|
4
|
+
admin: {
|
|
5
|
+
group: 'Telegram',
|
|
6
|
+
useAsTitle: 'chatTitle',
|
|
7
|
+
},
|
|
8
|
+
access: ctx.config.access?.admin ?? {},
|
|
9
|
+
fields: [
|
|
10
|
+
{
|
|
11
|
+
name: 'chatId',
|
|
12
|
+
type: 'text',
|
|
13
|
+
required: true,
|
|
14
|
+
unique: true,
|
|
15
|
+
index: true,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'chatTitle',
|
|
19
|
+
type: 'text',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'tenant',
|
|
23
|
+
type: 'relationship',
|
|
24
|
+
relationTo: ctx.tenantsSlug,
|
|
25
|
+
required: true,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'status',
|
|
29
|
+
type: 'select',
|
|
30
|
+
required: true,
|
|
31
|
+
defaultValue: 'active',
|
|
32
|
+
options: [
|
|
33
|
+
{ label: 'Active', value: 'active' },
|
|
34
|
+
{ label: 'Inactive', value: 'inactive' },
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
timestamps: true,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=TelegramChats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelegramChats.js","sourceRoot":"","sources":["../../src/collections/TelegramChats.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,kBAAkB,CAAC,GAAkB;IACnD,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,eAAe,CAAC,KAAK;QAC/B,KAAK,EAAE;YACL,KAAK,EAAE,UAAU;YACjB,UAAU,EAAE,WAAW;SACxB;QACD,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,IAAI;aACZ;YACD;gBACE,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,MAAM;aACb;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,cAAc;gBACpB,UAAU,EAAE,GAAG,CAAC,WAAW;gBAC3B,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI;gBACd,YAAY,EAAE,QAAQ;gBACtB,OAAO,EAAE;oBACP,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACpC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;iBACzC;aACF;SACF;QACD,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelegramUploads.d.ts","sourceRoot":"","sources":["../../src/collections/TelegramUploads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,gBAAgB,CAkDzE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export function buildTelegramUploads(ctx) {
|
|
2
|
+
const mediaCollection = ctx.config.mediaCollection ?? 'media';
|
|
3
|
+
return {
|
|
4
|
+
slug: ctx.collectionSlugs.uploads,
|
|
5
|
+
admin: {
|
|
6
|
+
group: 'Telegram',
|
|
7
|
+
useAsTitle: 'fileId',
|
|
8
|
+
},
|
|
9
|
+
access: ctx.config.access?.admin ?? {},
|
|
10
|
+
fields: [
|
|
11
|
+
{
|
|
12
|
+
name: 'fileId',
|
|
13
|
+
type: 'text',
|
|
14
|
+
required: true,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'mediaDoc',
|
|
18
|
+
type: 'relationship',
|
|
19
|
+
relationTo: mediaCollection,
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'tenant',
|
|
23
|
+
type: 'relationship',
|
|
24
|
+
relationTo: ctx.tenantsSlug,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'telegramUser',
|
|
28
|
+
type: 'json',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'chatId',
|
|
32
|
+
type: 'text',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'status',
|
|
36
|
+
type: 'select',
|
|
37
|
+
required: true,
|
|
38
|
+
options: [
|
|
39
|
+
{ label: 'Success', value: 'success' },
|
|
40
|
+
{ label: 'Failed', value: 'failed' },
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'error',
|
|
45
|
+
type: 'text',
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
timestamps: true,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=TelegramUploads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelegramUploads.js","sourceRoot":"","sources":["../../src/collections/TelegramUploads.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,oBAAoB,CAAC,GAAkB;IACrD,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,OAAO,CAAC;IAE9D,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,eAAe,CAAC,OAAO;QACjC,KAAK,EAAE;YACL,KAAK,EAAE,UAAU;YACjB,UAAU,EAAE,QAAQ;SACrB;QACD,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,cAAc;gBACpB,UAAU,EAAE,eAAe;aAC5B;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,cAAc;gBACpB,UAAU,EAAE,GAAG,CAAC,WAAW;aAC5B;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,MAAM;aACb;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,MAAM;aACb;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE;oBACP,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;oBACtC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;iBACrC;aACF;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,MAAM;aACb;SACF;QACD,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/endpoints/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA2B,MAAM,SAAS,CAAC;AACjE,OAAO,KAAK,EACV,aAAa,EAKd,MAAM,aAAa,CAAC;AAIrB,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,QAAQ,CAuCjE"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { getFile, downloadFile, sendMessage, answerCallbackQuery } from '../lib/telegram.js';
|
|
2
|
+
import { jsonResponse, errorResponse } from '../lib/responses.js';
|
|
3
|
+
export function buildWebhookEndpoint(ctx) {
|
|
4
|
+
const mediaCollection = ctx.config.mediaCollection ?? 'media';
|
|
5
|
+
const defaultAlt = ctx.config.defaultAlt ?? 'Uploaded via Telegram';
|
|
6
|
+
return {
|
|
7
|
+
path: '/telegram/webhook',
|
|
8
|
+
method: 'post',
|
|
9
|
+
handler: async (req) => {
|
|
10
|
+
// Validate webhook secret
|
|
11
|
+
const secretHeader = req.headers.get('x-telegram-bot-api-secret-token');
|
|
12
|
+
if (secretHeader !== ctx.config.webhookSecret) {
|
|
13
|
+
return errorResponse('Invalid secret token', 403);
|
|
14
|
+
}
|
|
15
|
+
const payload = req.payload;
|
|
16
|
+
let update;
|
|
17
|
+
try {
|
|
18
|
+
if (!req.json)
|
|
19
|
+
return errorResponse('No JSON parser available', 500);
|
|
20
|
+
update = (await req.json());
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return errorResponse('Invalid JSON body', 400);
|
|
24
|
+
}
|
|
25
|
+
// Handle callback queries (tenant selection from /link)
|
|
26
|
+
if (update.callback_query) {
|
|
27
|
+
await handleCallbackQuery(payload, update.callback_query, ctx);
|
|
28
|
+
return jsonResponse({ ok: true });
|
|
29
|
+
}
|
|
30
|
+
// Handle messages
|
|
31
|
+
if (update.message) {
|
|
32
|
+
await handleMessage(payload, update.message, ctx, mediaCollection, defaultAlt);
|
|
33
|
+
return jsonResponse({ ok: true });
|
|
34
|
+
}
|
|
35
|
+
return jsonResponse({ ok: true });
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async function handleMessage(payload, message, ctx, mediaCollection, defaultAlt) {
|
|
40
|
+
const token = ctx.config.botToken;
|
|
41
|
+
// Check for /link command
|
|
42
|
+
if (message.text && message.entities) {
|
|
43
|
+
const commandEntity = message.entities.find((e) => e.type === 'bot_command');
|
|
44
|
+
if (commandEntity) {
|
|
45
|
+
const command = message.text.slice(commandEntity.offset, commandEntity.offset + commandEntity.length);
|
|
46
|
+
if (command === '/link' || command.startsWith('/link@')) {
|
|
47
|
+
await handleLinkCommand(payload, message, ctx);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (command === '/start' || command.startsWith('/start@')) {
|
|
51
|
+
await sendMessage(token, message.chat.id, 'Send photos to upload them to the CMS. Use /link to connect this chat to a tenant.');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Must have a photo or image document
|
|
57
|
+
const hasPhoto = message.photo && message.photo.length > 0;
|
|
58
|
+
const hasImageDoc = message.document?.mime_type?.startsWith('image/');
|
|
59
|
+
if (!hasPhoto && !hasImageDoc) {
|
|
60
|
+
return; // Silently ignore non-image messages
|
|
61
|
+
}
|
|
62
|
+
// Verify sender is in allowlist
|
|
63
|
+
if (!message.from)
|
|
64
|
+
return;
|
|
65
|
+
const users = await payload.find({
|
|
66
|
+
collection: ctx.usersSlug,
|
|
67
|
+
where: { telegramId: { equals: String(message.from.id) } },
|
|
68
|
+
limit: 1,
|
|
69
|
+
});
|
|
70
|
+
if (users.docs.length === 0) {
|
|
71
|
+
await sendMessage(token, message.chat.id, 'You are not authorized to upload. Ask an admin to add your Telegram ID to your CMS user profile.');
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Look up chat → tenant mapping
|
|
75
|
+
const chatMapping = await payload.find({
|
|
76
|
+
collection: ctx.collectionSlugs.chats,
|
|
77
|
+
where: {
|
|
78
|
+
chatId: { equals: String(message.chat.id) },
|
|
79
|
+
status: { equals: 'active' },
|
|
80
|
+
},
|
|
81
|
+
limit: 1,
|
|
82
|
+
});
|
|
83
|
+
if (chatMapping.docs.length === 0) {
|
|
84
|
+
await sendMessage(token, message.chat.id, 'This chat is not linked to a tenant. Use /link to set it up.');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const chatDoc = chatMapping.docs[0];
|
|
88
|
+
const tenantId = typeof chatDoc.tenant === 'object' ? chatDoc.tenant.id : chatDoc.tenant;
|
|
89
|
+
// Get the file ID — at this point we know either photo or document exists
|
|
90
|
+
let fileId;
|
|
91
|
+
let fileName;
|
|
92
|
+
let mimeType;
|
|
93
|
+
if (hasPhoto && message.photo) {
|
|
94
|
+
const largestPhoto = message.photo[message.photo.length - 1];
|
|
95
|
+
fileId = largestPhoto.file_id;
|
|
96
|
+
fileName = `telegram_${message.message_id}.jpg`;
|
|
97
|
+
mimeType = 'image/jpeg';
|
|
98
|
+
}
|
|
99
|
+
else if (message.document) {
|
|
100
|
+
fileId = message.document.file_id;
|
|
101
|
+
fileName = message.document.file_name ?? `telegram_${message.message_id}`;
|
|
102
|
+
mimeType = message.document.mime_type ?? 'application/octet-stream';
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
// Download file from Telegram
|
|
109
|
+
const fileInfo = await getFile(token, fileId);
|
|
110
|
+
if (!fileInfo.file_path) {
|
|
111
|
+
throw new Error('No file_path returned from Telegram');
|
|
112
|
+
}
|
|
113
|
+
const fileBuffer = await downloadFile(token, fileInfo.file_path);
|
|
114
|
+
// Create Media document
|
|
115
|
+
const altText = message.caption ?? defaultAlt;
|
|
116
|
+
const mediaDoc = await payload.create({
|
|
117
|
+
collection: mediaCollection,
|
|
118
|
+
data: {
|
|
119
|
+
alt: altText,
|
|
120
|
+
tenant: tenantId,
|
|
121
|
+
},
|
|
122
|
+
file: {
|
|
123
|
+
data: fileBuffer,
|
|
124
|
+
mimetype: mimeType,
|
|
125
|
+
name: fileName,
|
|
126
|
+
size: fileBuffer.length,
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
// Log the upload
|
|
130
|
+
await payload.create({
|
|
131
|
+
collection: ctx.collectionSlugs.uploads,
|
|
132
|
+
data: {
|
|
133
|
+
fileId,
|
|
134
|
+
mediaDoc: mediaDoc.id,
|
|
135
|
+
tenant: tenantId,
|
|
136
|
+
telegramUser: {
|
|
137
|
+
id: message.from.id,
|
|
138
|
+
firstName: message.from.first_name,
|
|
139
|
+
username: message.from.username,
|
|
140
|
+
},
|
|
141
|
+
chatId: String(message.chat.id),
|
|
142
|
+
status: 'success',
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
await sendMessage(token, message.chat.id, `Uploaded <b>${fileName}</b>`);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
const errorMessage = err instanceof Error ? err.message : 'Unknown error';
|
|
149
|
+
// Log the failed upload
|
|
150
|
+
await payload.create({
|
|
151
|
+
collection: ctx.collectionSlugs.uploads,
|
|
152
|
+
data: {
|
|
153
|
+
fileId,
|
|
154
|
+
tenant: tenantId,
|
|
155
|
+
telegramUser: {
|
|
156
|
+
id: message.from.id,
|
|
157
|
+
firstName: message.from.first_name,
|
|
158
|
+
username: message.from.username,
|
|
159
|
+
},
|
|
160
|
+
chatId: String(message.chat.id),
|
|
161
|
+
status: 'failed',
|
|
162
|
+
error: errorMessage,
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
await sendMessage(token, message.chat.id, `Upload failed: ${errorMessage}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async function handleLinkCommand(payload, message, ctx) {
|
|
169
|
+
const token = ctx.config.botToken;
|
|
170
|
+
// Verify sender is in allowlist
|
|
171
|
+
if (!message.from)
|
|
172
|
+
return;
|
|
173
|
+
const users = await payload.find({
|
|
174
|
+
collection: ctx.usersSlug,
|
|
175
|
+
where: { telegramId: { equals: String(message.from.id) } },
|
|
176
|
+
limit: 1,
|
|
177
|
+
});
|
|
178
|
+
if (users.docs.length === 0) {
|
|
179
|
+
await sendMessage(token, message.chat.id, 'You are not authorized. Ask an admin to add your Telegram ID to your CMS user profile.');
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
// Fetch all tenants
|
|
183
|
+
const tenants = await payload.find({
|
|
184
|
+
collection: ctx.tenantsSlug,
|
|
185
|
+
limit: 100,
|
|
186
|
+
});
|
|
187
|
+
if (tenants.docs.length === 0) {
|
|
188
|
+
await sendMessage(token, message.chat.id, 'No tenants found in the CMS.');
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
// Build inline keyboard with tenant options
|
|
192
|
+
const keyboard = tenants.docs.map((tenant) => [
|
|
193
|
+
{
|
|
194
|
+
text: tenant.name,
|
|
195
|
+
callback_data: `link:${tenant.id}`,
|
|
196
|
+
},
|
|
197
|
+
]);
|
|
198
|
+
await sendMessage(token, message.chat.id, 'Select the tenant to link this chat to:', { inline_keyboard: keyboard });
|
|
199
|
+
}
|
|
200
|
+
async function handleCallbackQuery(payload, query, ctx) {
|
|
201
|
+
const token = ctx.config.botToken;
|
|
202
|
+
if (!query.data?.startsWith('link:')) {
|
|
203
|
+
await answerCallbackQuery(token, query.id);
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const tenantId = query.data.slice(5);
|
|
207
|
+
const chatId = query.message?.chat.id;
|
|
208
|
+
const chatTitle = query.message?.chat.title;
|
|
209
|
+
if (!chatId) {
|
|
210
|
+
await answerCallbackQuery(token, query.id, 'Could not determine chat.');
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
// Verify sender is in allowlist
|
|
214
|
+
const users = await payload.find({
|
|
215
|
+
collection: ctx.usersSlug,
|
|
216
|
+
where: { telegramId: { equals: String(query.from.id) } },
|
|
217
|
+
limit: 1,
|
|
218
|
+
});
|
|
219
|
+
if (users.docs.length === 0) {
|
|
220
|
+
await answerCallbackQuery(token, query.id, 'Not authorized.');
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
// Upsert the chat mapping
|
|
224
|
+
const existing = await payload.find({
|
|
225
|
+
collection: ctx.collectionSlugs.chats,
|
|
226
|
+
where: { chatId: { equals: String(chatId) } },
|
|
227
|
+
limit: 1,
|
|
228
|
+
});
|
|
229
|
+
if (existing.docs.length > 0) {
|
|
230
|
+
await payload.update({
|
|
231
|
+
collection: ctx.collectionSlugs.chats,
|
|
232
|
+
id: existing.docs[0].id,
|
|
233
|
+
data: {
|
|
234
|
+
tenant: tenantId,
|
|
235
|
+
chatTitle: chatTitle ?? undefined,
|
|
236
|
+
status: 'active',
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
await payload.create({
|
|
242
|
+
collection: ctx.collectionSlugs.chats,
|
|
243
|
+
data: {
|
|
244
|
+
chatId: String(chatId),
|
|
245
|
+
chatTitle: chatTitle ?? undefined,
|
|
246
|
+
tenant: tenantId,
|
|
247
|
+
status: 'active',
|
|
248
|
+
},
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
// Fetch tenant name for confirmation
|
|
252
|
+
const tenant = await payload.findByID({
|
|
253
|
+
collection: ctx.tenantsSlug,
|
|
254
|
+
id: tenantId,
|
|
255
|
+
});
|
|
256
|
+
const tenantName = tenant.name;
|
|
257
|
+
await answerCallbackQuery(token, query.id, `Linked to ${tenantName}`);
|
|
258
|
+
await sendMessage(token, chatId, `This chat is now linked to <b>${tenantName}</b>. Send photos to upload them.`);
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/endpoints/webhook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injectTelegramId.d.ts","sourceRoot":"","sources":["../../src/hooks/injectTelegramId.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,gBAAgB,GAAG,gBAAgB,CAgBpF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function injectTelegramIdField(collection) {
|
|
2
|
+
return {
|
|
3
|
+
...collection,
|
|
4
|
+
fields: [
|
|
5
|
+
...collection.fields,
|
|
6
|
+
{
|
|
7
|
+
name: 'telegramId',
|
|
8
|
+
type: 'text',
|
|
9
|
+
admin: {
|
|
10
|
+
position: 'sidebar',
|
|
11
|
+
description: 'Telegram user ID for bot upload allowlist',
|
|
12
|
+
},
|
|
13
|
+
index: true,
|
|
14
|
+
},
|
|
15
|
+
],
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=injectTelegramId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injectTelegramId.js","sourceRoot":"","sources":["../../src/hooks/injectTelegramId.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,UAA4B;IAChE,OAAO;QACL,GAAG,UAAU;QACb,MAAM,EAAE;YACN,GAAG,UAAU,CAAC,MAAM;YACpB;gBACE,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE;oBACL,QAAQ,EAAE,SAAS;oBACnB,WAAW,EAAE,2CAA2C;iBACzD;gBACD,KAAK,EAAE,IAAI;aACZ;SACF;KACF,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { telegramPlugin } from './plugin.js';
|
|
2
|
+
export type { TelegramPluginConfig, TelegramPlugin, PluginContext, TelegramChatDoc, TelegramUploadDoc, TelegramUserInfo, TelegramUpdate, TelegramMessage, TelegramUser, TelegramChat, TelegramPhotoSize, TelegramDocument, TelegramCallbackQuery, TelegramFile, } from './types.js';
|
|
3
|
+
export { getFile, downloadFile, sendMessage, answerCallbackQuery } from './lib/telegram.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,YAAY,EACV,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAoB7C,+BAA+B;AAC/B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../src/lib/responses.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,SAAM,GAAG,QAAQ,CAKlE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAM,GAAG,QAAQ,CAErE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function jsonResponse(data, status = 200) {
|
|
2
|
+
return new Response(JSON.stringify(data), {
|
|
3
|
+
status,
|
|
4
|
+
headers: { 'Content-Type': 'application/json' },
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
export function errorResponse(message, status = 400) {
|
|
8
|
+
return jsonResponse({ error: message }, status);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=responses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/lib/responses.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG;IACtD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,MAAM,GAAG,GAAG;IACzD,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { TelegramFile } from '../types.js';
|
|
2
|
+
export declare function getFile(token: string, fileId: string): Promise<TelegramFile>;
|
|
3
|
+
export declare function downloadFile(token: string, filePath: string): Promise<Buffer>;
|
|
4
|
+
export declare function sendMessage(token: string, chatId: number, text: string, replyMarkup?: Record<string, unknown>): Promise<void>;
|
|
5
|
+
export declare function answerCallbackQuery(token: string, callbackQueryId: string, text?: string): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=telegram.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/lib/telegram.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQhD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAiBlF;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASnF;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,EACvB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
const API_BASE = 'https://api.telegram.org';
|
|
2
|
+
function botUrl(token, method) {
|
|
3
|
+
return `${API_BASE}/bot${token}/${method}`;
|
|
4
|
+
}
|
|
5
|
+
export async function getFile(token, fileId) {
|
|
6
|
+
const res = await fetch(botUrl(token, 'getFile'), {
|
|
7
|
+
method: 'POST',
|
|
8
|
+
headers: { 'Content-Type': 'application/json' },
|
|
9
|
+
body: JSON.stringify({ file_id: fileId }),
|
|
10
|
+
});
|
|
11
|
+
if (!res.ok) {
|
|
12
|
+
throw new Error(`getFile failed: ${res.status} ${res.statusText}`);
|
|
13
|
+
}
|
|
14
|
+
const data = (await res.json());
|
|
15
|
+
if (!data.ok) {
|
|
16
|
+
throw new Error('getFile returned ok=false');
|
|
17
|
+
}
|
|
18
|
+
return data.result;
|
|
19
|
+
}
|
|
20
|
+
export async function downloadFile(token, filePath) {
|
|
21
|
+
const url = `${API_BASE}/file/bot${token}/${filePath}`;
|
|
22
|
+
const res = await fetch(url);
|
|
23
|
+
if (!res.ok) {
|
|
24
|
+
throw new Error(`downloadFile failed: ${res.status} ${res.statusText}`);
|
|
25
|
+
}
|
|
26
|
+
return Buffer.from(await res.arrayBuffer());
|
|
27
|
+
}
|
|
28
|
+
export async function sendMessage(token, chatId, text, replyMarkup) {
|
|
29
|
+
const body = {
|
|
30
|
+
chat_id: chatId,
|
|
31
|
+
text,
|
|
32
|
+
parse_mode: 'HTML',
|
|
33
|
+
};
|
|
34
|
+
if (replyMarkup) {
|
|
35
|
+
body.reply_markup = replyMarkup;
|
|
36
|
+
}
|
|
37
|
+
const res = await fetch(botUrl(token, 'sendMessage'), {
|
|
38
|
+
method: 'POST',
|
|
39
|
+
headers: { 'Content-Type': 'application/json' },
|
|
40
|
+
body: JSON.stringify(body),
|
|
41
|
+
});
|
|
42
|
+
if (!res.ok) {
|
|
43
|
+
const err = await res.text();
|
|
44
|
+
throw new Error(`sendMessage failed: ${res.status} ${err}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export async function answerCallbackQuery(token, callbackQueryId, text) {
|
|
48
|
+
const body = {
|
|
49
|
+
callback_query_id: callbackQueryId,
|
|
50
|
+
};
|
|
51
|
+
if (text) {
|
|
52
|
+
body.text = text;
|
|
53
|
+
}
|
|
54
|
+
const res = await fetch(botUrl(token, 'answerCallbackQuery'), {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
headers: { 'Content-Type': 'application/json' },
|
|
57
|
+
body: JSON.stringify(body),
|
|
58
|
+
});
|
|
59
|
+
if (!res.ok) {
|
|
60
|
+
const err = await res.text();
|
|
61
|
+
throw new Error(`answerCallbackQuery failed: ${res.status} ${err}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=telegram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/lib/telegram.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAMtF,wBAAgB,cAAc,CAAC,YAAY,EAAE,oBAAoB,GAAG,cAAc,CAqCjF"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { buildTelegramChats } from './collections/TelegramChats.js';
|
|
2
|
+
import { buildTelegramUploads } from './collections/TelegramUploads.js';
|
|
3
|
+
import { injectTelegramIdField } from './hooks/injectTelegramId.js';
|
|
4
|
+
import { buildWebhookEndpoint } from './endpoints/webhook.js';
|
|
5
|
+
export function telegramPlugin(pluginConfig) {
|
|
6
|
+
return (incomingConfig) => {
|
|
7
|
+
const prefix = pluginConfig.slugPrefix ?? 'telegram';
|
|
8
|
+
const collectionSlugs = {
|
|
9
|
+
chats: `${prefix}-chats`,
|
|
10
|
+
uploads: `${prefix}-uploads`,
|
|
11
|
+
};
|
|
12
|
+
const usersSlug = incomingConfig.admin?.user ?? 'users';
|
|
13
|
+
const tenantsSlug = pluginConfig.tenantsCollection ?? 'tenants';
|
|
14
|
+
const ctx = {
|
|
15
|
+
config: pluginConfig,
|
|
16
|
+
collectionSlugs,
|
|
17
|
+
usersSlug,
|
|
18
|
+
tenantsSlug,
|
|
19
|
+
};
|
|
20
|
+
const modifiedCollections = (incomingConfig.collections ?? []).map((collection) => {
|
|
21
|
+
if (collection.slug === usersSlug) {
|
|
22
|
+
return injectTelegramIdField(collection);
|
|
23
|
+
}
|
|
24
|
+
return collection;
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
...incomingConfig,
|
|
28
|
+
collections: [
|
|
29
|
+
...modifiedCollections,
|
|
30
|
+
buildTelegramChats(ctx),
|
|
31
|
+
buildTelegramUploads(ctx),
|
|
32
|
+
],
|
|
33
|
+
endpoints: [
|
|
34
|
+
...(incomingConfig.endpoints ?? []),
|
|
35
|
+
buildWebhookEndpoint(ctx),
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,UAAU,cAAc,CAAC,YAAkC;IAC/D,OAAO,CAAC,cAAsB,EAAU,EAAE;QACxC,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,IAAI,UAAU,CAAC;QACrD,MAAM,eAAe,GAAG;YACtB,KAAK,EAAE,GAAG,MAAM,QAAQ;YACxB,OAAO,EAAE,GAAG,MAAM,UAAU;SAC7B,CAAC;QAEF,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,IAAI,OAAO,CAAC;QACxD,MAAM,WAAW,GAAG,YAAY,CAAC,iBAAiB,IAAI,SAAS,CAAC;QAEhE,MAAM,GAAG,GAAkB;YACzB,MAAM,EAAE,YAAY;YACpB,eAAe;YACf,SAAS;YACT,WAAW;SACZ,CAAC;QACF,MAAM,mBAAmB,GAAG,CAAC,cAAc,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;YAChF,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAClC,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,GAAG,cAAc;YACjB,WAAW,EAAE;gBACX,GAAG,mBAAmB;gBACtB,kBAAkB,CAAC,GAAG,CAAC;gBACvB,oBAAoB,CAAC,GAAG,CAAC;aAC1B;YACD,SAAS,EAAE;gBACT,GAAG,CAAC,cAAc,CAAC,SAAS,IAAI,EAAE,CAAC;gBACnC,oBAAoB,CAAC,GAAG,CAAC;aAC1B;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { CollectionConfig, Config } from 'payload';
|
|
2
|
+
export interface TelegramPluginConfig {
|
|
3
|
+
/** Telegram Bot API token from @BotFather */
|
|
4
|
+
botToken: string;
|
|
5
|
+
/** Secret token for webhook validation (X-Telegram-Bot-Api-Secret-Token) */
|
|
6
|
+
webhookSecret: string;
|
|
7
|
+
/** Target media collection slug (default: 'media') */
|
|
8
|
+
mediaCollection?: string;
|
|
9
|
+
/** Tenants collection slug (default: 'tenants') */
|
|
10
|
+
tenantsCollection?: string;
|
|
11
|
+
/** Slug prefix for plugin collections (default: 'telegram') */
|
|
12
|
+
slugPrefix?: string;
|
|
13
|
+
/** Default alt text for uploaded images (default: 'Uploaded via Telegram') */
|
|
14
|
+
defaultAlt?: string;
|
|
15
|
+
/** Access control overrides for plugin collections */
|
|
16
|
+
access?: {
|
|
17
|
+
admin?: CollectionConfig['access'];
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export type TelegramPlugin = (config: Config) => Config;
|
|
21
|
+
export interface PluginContext {
|
|
22
|
+
config: TelegramPluginConfig;
|
|
23
|
+
collectionSlugs: {
|
|
24
|
+
chats: string;
|
|
25
|
+
uploads: string;
|
|
26
|
+
};
|
|
27
|
+
usersSlug: string;
|
|
28
|
+
tenantsSlug: string;
|
|
29
|
+
}
|
|
30
|
+
export interface TelegramChatDoc {
|
|
31
|
+
id: string;
|
|
32
|
+
chatId: string;
|
|
33
|
+
chatTitle?: string;
|
|
34
|
+
tenant: string | number;
|
|
35
|
+
status: 'active' | 'inactive';
|
|
36
|
+
createdAt: string;
|
|
37
|
+
updatedAt: string;
|
|
38
|
+
}
|
|
39
|
+
export interface TelegramUploadDoc {
|
|
40
|
+
id: string;
|
|
41
|
+
fileId: string;
|
|
42
|
+
mediaDoc?: string | number;
|
|
43
|
+
tenant?: string | number;
|
|
44
|
+
telegramUser?: TelegramUserInfo;
|
|
45
|
+
chatId?: string;
|
|
46
|
+
status: 'success' | 'failed';
|
|
47
|
+
error?: string;
|
|
48
|
+
createdAt: string;
|
|
49
|
+
updatedAt: string;
|
|
50
|
+
}
|
|
51
|
+
export interface TelegramUserInfo {
|
|
52
|
+
id: number;
|
|
53
|
+
firstName: string;
|
|
54
|
+
username?: string;
|
|
55
|
+
}
|
|
56
|
+
export interface TelegramUpdate {
|
|
57
|
+
update_id: number;
|
|
58
|
+
message?: TelegramMessage;
|
|
59
|
+
callback_query?: TelegramCallbackQuery;
|
|
60
|
+
}
|
|
61
|
+
export interface TelegramMessage {
|
|
62
|
+
message_id: number;
|
|
63
|
+
from?: TelegramUser;
|
|
64
|
+
chat: TelegramChat;
|
|
65
|
+
date: number;
|
|
66
|
+
text?: string;
|
|
67
|
+
photo?: TelegramPhotoSize[];
|
|
68
|
+
document?: TelegramDocument;
|
|
69
|
+
caption?: string;
|
|
70
|
+
entities?: TelegramMessageEntity[];
|
|
71
|
+
}
|
|
72
|
+
export interface TelegramUser {
|
|
73
|
+
id: number;
|
|
74
|
+
is_bot: boolean;
|
|
75
|
+
first_name: string;
|
|
76
|
+
last_name?: string;
|
|
77
|
+
username?: string;
|
|
78
|
+
}
|
|
79
|
+
export interface TelegramChat {
|
|
80
|
+
id: number;
|
|
81
|
+
type: 'private' | 'group' | 'supergroup' | 'channel';
|
|
82
|
+
title?: string;
|
|
83
|
+
}
|
|
84
|
+
export interface TelegramPhotoSize {
|
|
85
|
+
file_id: string;
|
|
86
|
+
file_unique_id: string;
|
|
87
|
+
width: number;
|
|
88
|
+
height: number;
|
|
89
|
+
file_size?: number;
|
|
90
|
+
}
|
|
91
|
+
export interface TelegramDocument {
|
|
92
|
+
file_id: string;
|
|
93
|
+
file_unique_id: string;
|
|
94
|
+
file_name?: string;
|
|
95
|
+
mime_type?: string;
|
|
96
|
+
file_size?: number;
|
|
97
|
+
}
|
|
98
|
+
export interface TelegramMessageEntity {
|
|
99
|
+
type: string;
|
|
100
|
+
offset: number;
|
|
101
|
+
length: number;
|
|
102
|
+
}
|
|
103
|
+
export interface TelegramCallbackQuery {
|
|
104
|
+
id: string;
|
|
105
|
+
from: TelegramUser;
|
|
106
|
+
message?: TelegramMessage;
|
|
107
|
+
data?: string;
|
|
108
|
+
}
|
|
109
|
+
export interface TelegramFile {
|
|
110
|
+
file_id: string;
|
|
111
|
+
file_unique_id: string;
|
|
112
|
+
file_size?: number;
|
|
113
|
+
file_path?: string;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAIxD,MAAM,WAAW,oBAAoB;IACnC,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;KACpC,CAAC;CACH;AAID,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,eAAe,EAAE;QACf,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,cAAc,CAAC,EAAE,qBAAqB,CAAC;CACxC;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,CAAC;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "payload-plugin-telegram",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Payload CMS 3.x plugin for uploading media via Telegram bot",
|
|
5
|
+
"license": "Elastic-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"packageManager": "pnpm@10.29.3",
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc",
|
|
21
|
+
"dev": "tsc --watch",
|
|
22
|
+
"lint": "eslint src/",
|
|
23
|
+
"typecheck": "tsc --noEmit",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"test:watch": "vitest",
|
|
26
|
+
"test:coverage": "vitest run --coverage"
|
|
27
|
+
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"payload": "^3.0.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@typescript-eslint/eslint-plugin": "^8.56.0",
|
|
33
|
+
"@typescript-eslint/parser": "^8.56.0",
|
|
34
|
+
"eslint": "^10.0.1",
|
|
35
|
+
"payload": "^3.77.0",
|
|
36
|
+
"typescript": "^5.9.3",
|
|
37
|
+
"typescript-eslint": "^8.56.0",
|
|
38
|
+
"vitest": "^4.0.18"
|
|
39
|
+
}
|
|
40
|
+
}
|