@warriorteam/redai-zalo-sdk 1.12.0 → 1.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,230 +0,0 @@
1
- # Webhook Message Helper Functions
2
-
3
- Tài liệu này mô tả các hàm helper để phân biệt các loại sự kiện tin nhắn trong Zalo webhook.
4
-
5
- ## Tổng quan
6
-
7
- RedAI Zalo SDK cung cấp các hàm helper để dễ dàng phân biệt các loại sự kiện tin nhắn:
8
-
9
- 1. **Tin nhắn từ người dùng cá nhân** - `isUserMessageEvent()`
10
- 2. **Tin nhắn từ group** - `isGroupMessageEvent()`
11
- 3. **Tin nhắn OA gửi cho cá nhân** - `isOAToUserMessageEvent()`
12
- 4. **Tin nhắn OA gửi tới group** - `isOAToGroupMessageEvent()`
13
- 5. **Xác định hướng và đích của tin nhắn** - `getMessageDirection()`
14
-
15
- ## Import
16
-
17
- ```typescript
18
- import {
19
- isUserMessageEvent,
20
- isGroupMessageEvent,
21
- isOAToUserMessageEvent,
22
- isOAToGroupMessageEvent,
23
- getMessageDirection,
24
- WebhookEvent,
25
- } from '@warriorteam/redai-zalo-sdk';
26
- ```
27
-
28
- ## Sử dụng
29
-
30
- ### 1. Phân biệt tin nhắn từ người dùng cá nhân
31
-
32
- ```typescript
33
- function handleWebhook(event: WebhookEvent) {
34
- if (isUserMessageEvent(event)) {
35
- console.log('Nhận được tin nhắn từ người dùng cá nhân');
36
- console.log('Sender:', event.sender.id);
37
- console.log('Content:', event.message.text);
38
-
39
- // Xử lý tin nhắn từ user cá nhân
40
- handleUserMessage(event);
41
- }
42
- }
43
- ```
44
-
45
- ### 2. Phân biệt tin nhắn từ group
46
-
47
- ```typescript
48
- function handleWebhook(event: WebhookEvent) {
49
- if (isGroupMessageEvent(event)) {
50
- console.log('Nhận được tin nhắn từ group');
51
- console.log('Group ID:', event.recipient.id);
52
- console.log('Sender:', event.sender.id);
53
- console.log('Content:', event.message.text);
54
-
55
- // Xử lý tin nhắn từ group
56
- handleGroupMessage(event);
57
- }
58
- }
59
- ```
60
-
61
- ### 3. Phân biệt tin nhắn OA gửi cho cá nhân
62
-
63
- ```typescript
64
- function handleWebhook(event: WebhookEvent) {
65
- if (isOAToUserMessageEvent(event)) {
66
- console.log('OA đã gửi tin nhắn cho người dùng cá nhân');
67
- console.log('Recipient:', event.recipient.id);
68
- console.log('Content:', event.message.text);
69
-
70
- // Xử lý tin nhắn OA gửi cho user
71
- handleOAToUserMessage(event);
72
- }
73
- }
74
- ```
75
-
76
- ### 4. Phân biệt tin nhắn OA gửi tới group
77
-
78
- ```typescript
79
- function handleWebhook(event: WebhookEvent) {
80
- if (isOAToGroupMessageEvent(event)) {
81
- console.log('OA đã gửi tin nhắn tới group');
82
- console.log('Group ID:', event.recipient.id);
83
- console.log('Content:', event.message.text);
84
-
85
- // Xử lý tin nhắn OA gửi tới group
86
- handleOAToGroupMessage(event);
87
- }
88
- }
89
- ```
90
-
91
- ### 5. Xác định hướng và đích của tin nhắn
92
-
93
- ```typescript
94
- function handleWebhook(event: WebhookEvent) {
95
- const messageInfo = getMessageDirection(event);
96
-
97
- console.log('Direction:', messageInfo.direction); // 'incoming' | 'outgoing' | 'unknown'
98
- console.log('Target:', messageInfo.target); // 'user' | 'group' | 'unknown'
99
- console.log('Description:', messageInfo.description);
100
-
101
- // Xử lý dựa trên hướng và đích
102
- switch (`${messageInfo.direction}-${messageInfo.target}`) {
103
- case 'incoming-user':
104
- handleIncomingUserMessage(event);
105
- break;
106
- case 'incoming-group':
107
- handleIncomingGroupMessage(event);
108
- break;
109
- case 'outgoing-user':
110
- handleOutgoingUserMessage(event);
111
- break;
112
- case 'outgoing-group':
113
- handleOutgoingGroupMessage(event);
114
- break;
115
- default:
116
- console.log('Unknown message type');
117
- }
118
- }
119
- ```
120
-
121
- ## Ví dụ tổng hợp
122
-
123
- ```typescript
124
- import {
125
- isUserMessageEvent,
126
- isGroupMessageEvent,
127
- isOAToUserMessageEvent,
128
- isOAToGroupMessageEvent,
129
- getMessageDirection,
130
- WebhookEvent,
131
- } from '@warriorteam/redai-zalo-sdk';
132
-
133
- class ZaloWebhookHandler {
134
- handleWebhook(event: WebhookEvent) {
135
- // Cách 1: Sử dụng các hàm kiểm tra riêng lẻ
136
- if (isUserMessageEvent(event)) {
137
- this.handleUserMessage(event);
138
- } else if (isGroupMessageEvent(event)) {
139
- this.handleGroupMessage(event);
140
- } else if (isOAToUserMessageEvent(event)) {
141
- this.handleOAToUserMessage(event);
142
- } else if (isOAToGroupMessageEvent(event)) {
143
- this.handleOAToGroupMessage(event);
144
- }
145
-
146
- // Cách 2: Sử dụng getMessageDirection
147
- const messageInfo = getMessageDirection(event);
148
- this.logMessageInfo(messageInfo);
149
- }
150
-
151
- private handleUserMessage(event: UserMessageWebhookEvent) {
152
- console.log('Processing user message:', event.message.text);
153
- // Logic xử lý tin nhắn từ user cá nhân
154
- }
155
-
156
- private handleGroupMessage(event: GroupWebhookEvent) {
157
- console.log('Processing group message:', event.message.text);
158
- // Logic xử lý tin nhắn từ group
159
- }
160
-
161
- private handleOAToUserMessage(event: OAMessageWebhookEvent) {
162
- console.log('Processing OA to user message:', event.message.text);
163
- // Logic xử lý tin nhắn OA gửi cho user
164
- }
165
-
166
- private handleOAToGroupMessage(event: GroupWebhookEvent) {
167
- console.log('Processing OA to group message:', event.message.text);
168
- // Logic xử lý tin nhắn OA gửi tới group
169
- }
170
-
171
- private logMessageInfo(messageInfo: ReturnType<typeof getMessageDirection>) {
172
- console.log(`Message: ${messageInfo.direction} -> ${messageInfo.target}`);
173
- console.log(`Description: ${messageInfo.description}`);
174
- }
175
- }
176
- ```
177
-
178
- ## Các loại sự kiện được hỗ trợ
179
-
180
- ### User Message Events (Tin nhắn từ người dùng cá nhân)
181
- - `user_send_text`
182
- - `user_send_image`
183
- - `user_send_location`
184
- - `user_send_link`
185
- - `user_send_sticker`
186
- - `user_send_gif`
187
- - `user_send_audio`
188
- - `user_send_video`
189
- - `user_send_file`
190
- - `user_received_message`
191
- - `user_seen_message`
192
- - `user_send_business_card`
193
-
194
- ### Group Message Events (Tin nhắn từ group)
195
- - `user_send_group_text`
196
- - `user_send_group_link`
197
- - `user_send_group_audio`
198
- - `user_send_group_location`
199
- - `user_send_group_video`
200
- - `user_send_group_business_card`
201
- - `user_send_group_sticker`
202
- - `user_send_group_gif`
203
- - `user_send_group_file`
204
-
205
- ### OA to User Events (OA gửi cho cá nhân)
206
- - `oa_send_text`
207
- - `oa_send_image`
208
- - `oa_send_gif`
209
- - `oa_send_list`
210
- - `oa_send_file`
211
- - `oa_send_sticker`
212
- - `oa_send_template`
213
-
214
- ### OA to Group Events (OA gửi tới group)
215
- - `oa_send_group_text`
216
- - `oa_send_group_image`
217
- - `oa_send_group_link`
218
- - `oa_send_group_audio`
219
- - `oa_send_group_location`
220
- - `oa_send_group_video`
221
- - `oa_send_group_business_card`
222
- - `oa_send_group_sticker`
223
- - `oa_send_group_gif`
224
- - `oa_send_group_file`
225
-
226
- ## Lưu ý
227
-
228
- 1. Các hàm helper này chỉ hoạt động với các sự kiện tin nhắn, không áp dụng cho các sự kiện khác như follow/unfollow.
229
- 2. Sử dụng TypeScript để có type safety tốt nhất.
230
- 3. Các hàm này đã được test kỹ lưỡng và an toàn để sử dụng trong production.
@@ -1,285 +0,0 @@
1
- /**
2
- * Ví dụ sử dụng các hàm helper để phân loại tin nhắn webhook
3
- */
4
-
5
- import {
6
- isUserMessageEvent,
7
- isGroupMessageEvent,
8
- isOAToUserMessageEvent,
9
- isOAToGroupMessageEvent,
10
- getMessageDirection,
11
- WebhookEvent,
12
- UserMessageWebhookEvent,
13
- GroupWebhookEvent,
14
- OAMessageWebhookEvent,
15
- } from '@warriorteam/redai-zalo-sdk';
16
-
17
- /**
18
- * Service xử lý webhook với phân loại tin nhắn
19
- */
20
- export class ZaloWebhookMessageHandler {
21
- /**
22
- * Xử lý webhook event chính
23
- */
24
- public handleWebhook(event: WebhookEvent): void {
25
- console.log('=== Webhook Event Received ===');
26
- console.log('Event Name:', event.event_name);
27
- console.log('Timestamp:', event.timestamp);
28
-
29
- // Phương pháp 1: Sử dụng các hàm kiểm tra riêng lẻ
30
- this.classifyBySpecificChecks(event);
31
-
32
- // Phương pháp 2: Sử dụng getMessageDirection
33
- this.classifyByDirection(event);
34
-
35
- // Xử lý tin nhắn dựa trên loại
36
- this.processMessage(event);
37
- }
38
-
39
- /**
40
- * Phân loại bằng các hàm kiểm tra riêng lẻ
41
- */
42
- private classifyBySpecificChecks(event: WebhookEvent): void {
43
- console.log('\n--- Classification by Specific Checks ---');
44
-
45
- if (isUserMessageEvent(event)) {
46
- console.log('✅ Tin nhắn từ người dùng cá nhân');
47
- this.logUserMessageDetails(event);
48
- } else if (isGroupMessageEvent(event)) {
49
- console.log('✅ Tin nhắn từ group');
50
- this.logGroupMessageDetails(event);
51
- } else if (isOAToUserMessageEvent(event)) {
52
- console.log('✅ OA gửi tin nhắn cho người dùng cá nhân');
53
- this.logOAToUserDetails(event);
54
- } else if (isOAToGroupMessageEvent(event)) {
55
- console.log('✅ OA gửi tin nhắn tới group');
56
- this.logOAToGroupDetails(event);
57
- } else {
58
- console.log('❓ Sự kiện không phải tin nhắn hoặc không xác định');
59
- }
60
- }
61
-
62
- /**
63
- * Phân loại bằng getMessageDirection
64
- */
65
- private classifyByDirection(event: WebhookEvent): void {
66
- console.log('\n--- Classification by Direction ---');
67
-
68
- const messageInfo = getMessageDirection(event);
69
- console.log(`Direction: ${messageInfo.direction}`);
70
- console.log(`Target: ${messageInfo.target}`);
71
- console.log(`Description: ${messageInfo.description}`);
72
-
73
- // Xử lý dựa trên direction và target
74
- const key = `${messageInfo.direction}-${messageInfo.target}`;
75
- switch (key) {
76
- case 'incoming-user':
77
- console.log('🔵 Xử lý tin nhắn đến từ user cá nhân');
78
- break;
79
- case 'incoming-group':
80
- console.log('🟢 Xử lý tin nhắn đến từ group');
81
- break;
82
- case 'outgoing-user':
83
- console.log('🟡 Xử lý tin nhắn OA gửi cho user');
84
- break;
85
- case 'outgoing-group':
86
- console.log('🟠 Xử lý tin nhắn OA gửi tới group');
87
- break;
88
- default:
89
- console.log('⚪ Sự kiện không xác định');
90
- }
91
- }
92
-
93
- /**
94
- * Xử lý tin nhắn dựa trên loại
95
- */
96
- private processMessage(event: WebhookEvent): void {
97
- console.log('\n--- Message Processing ---');
98
-
99
- if (isUserMessageEvent(event)) {
100
- this.processUserMessage(event);
101
- } else if (isGroupMessageEvent(event)) {
102
- this.processGroupMessage(event);
103
- } else if (isOAToUserMessageEvent(event)) {
104
- this.processOAToUserMessage(event);
105
- } else if (isOAToGroupMessageEvent(event)) {
106
- this.processOAToGroupMessage(event);
107
- }
108
- }
109
-
110
- /**
111
- * Xử lý tin nhắn từ user cá nhân
112
- */
113
- private processUserMessage(event: UserMessageWebhookEvent): void {
114
- console.log('Processing user message...');
115
-
116
- // Logic xử lý tin nhắn từ user cá nhân
117
- // - Lưu vào database
118
- // - Trigger AI response
119
- // - Update conversation state
120
-
121
- console.log('✅ User message processed');
122
- }
123
-
124
- /**
125
- * Xử lý tin nhắn từ group
126
- */
127
- private processGroupMessage(event: GroupWebhookEvent): void {
128
- console.log('Processing group message...');
129
-
130
- // Logic xử lý tin nhắn từ group
131
- // - Check if OA is mentioned
132
- // - Apply group-specific rules
133
- // - Handle group moderation
134
-
135
- console.log('✅ Group message processed');
136
- }
137
-
138
- /**
139
- * Xử lý tin nhắn OA gửi cho user
140
- */
141
- private processOAToUserMessage(event: OAMessageWebhookEvent): void {
142
- console.log('Processing OA to user message...');
143
-
144
- // Logic xử lý tin nhắn OA gửi
145
- // - Log outbound message
146
- // - Update delivery status
147
- // - Track engagement metrics
148
-
149
- console.log('✅ OA to user message processed');
150
- }
151
-
152
- /**
153
- * Xử lý tin nhắn OA gửi tới group
154
- */
155
- private processOAToGroupMessage(event: GroupWebhookEvent): void {
156
- console.log('Processing OA to group message...');
157
-
158
- // Logic xử lý tin nhắn OA gửi tới group
159
- // - Log group broadcast
160
- // - Track group engagement
161
- // - Update group statistics
162
-
163
- console.log('✅ OA to group message processed');
164
- }
165
-
166
- /**
167
- * Log chi tiết tin nhắn user
168
- */
169
- private logUserMessageDetails(event: UserMessageWebhookEvent): void {
170
- console.log(` - Sender ID: ${event.sender.id}`);
171
- console.log(` - Recipient ID: ${event.recipient.id}`);
172
- if ('message' in event && event.message.text) {
173
- console.log(` - Text: ${event.message.text}`);
174
- }
175
- }
176
-
177
- /**
178
- * Log chi tiết tin nhắn group
179
- */
180
- private logGroupMessageDetails(event: GroupWebhookEvent): void {
181
- console.log(` - Sender ID: ${event.sender.id}`);
182
- console.log(` - Group ID: ${event.recipient.id}`);
183
- if ('oa_id' in event) {
184
- console.log(` - OA ID: ${event.oa_id}`);
185
- }
186
- if ('message' in event && event.message.text) {
187
- console.log(` - Text: ${event.message.text}`);
188
- }
189
- }
190
-
191
- /**
192
- * Log chi tiết OA to user
193
- */
194
- private logOAToUserDetails(event: OAMessageWebhookEvent): void {
195
- console.log(` - OA ID: ${event.sender.id}`);
196
- console.log(` - User ID: ${event.recipient.id}`);
197
- if ('message' in event && event.message.text) {
198
- console.log(` - Text: ${event.message.text}`);
199
- }
200
- }
201
-
202
- /**
203
- * Log chi tiết OA to group
204
- */
205
- private logOAToGroupDetails(event: GroupWebhookEvent): void {
206
- console.log(` - OA ID: ${event.sender.id}`);
207
- console.log(` - Group ID: ${event.recipient.id}`);
208
- if ('oa_id' in event) {
209
- console.log(` - OA ID: ${event.oa_id}`);
210
- }
211
- if ('message' in event && event.message.text) {
212
- console.log(` - Text: ${event.message.text}`);
213
- }
214
- }
215
- }
216
-
217
- /**
218
- * Ví dụ sử dụng
219
- */
220
- export function exampleUsage(): void {
221
- const handler = new ZaloWebhookMessageHandler();
222
-
223
- // Ví dụ 1: Tin nhắn từ user cá nhân
224
- const userMessage = {
225
- app_id: 'test-app',
226
- user_id_by_app: 'test-user',
227
- event_name: 'user_send_text',
228
- timestamp: '1234567890',
229
- sender: { id: 'user123' },
230
- recipient: { id: 'oa123' },
231
- message: { msg_id: 'msg123', text: 'Xin chào!' }
232
- };
233
-
234
- console.log('=== Example 1: User Message ===');
235
- handler.handleWebhook(userMessage as any);
236
-
237
- // Ví dụ 2: Tin nhắn từ group
238
- const groupMessage = {
239
- app_id: 'test-app',
240
- user_id_by_app: 'test-user',
241
- event_name: 'user_send_group_text',
242
- timestamp: '1234567890',
243
- oa_id: 'oa123',
244
- sender: { id: 'user456' },
245
- recipient: { id: 'group789' },
246
- message: { msg_id: 'msg456', text: 'Hello group!' }
247
- };
248
-
249
- console.log('\n=== Example 2: Group Message ===');
250
- handler.handleWebhook(groupMessage as any);
251
-
252
- // Ví dụ 3: OA gửi cho user
253
- const oaToUserMessage = {
254
- app_id: 'test-app',
255
- user_id_by_app: 'test-user',
256
- event_name: 'oa_send_text',
257
- timestamp: '1234567890',
258
- sender: { id: 'oa123' },
259
- recipient: { id: 'user789' },
260
- message: { msg_id: 'msg789', text: 'Cảm ơn bạn đã liên hệ!' }
261
- };
262
-
263
- console.log('\n=== Example 3: OA to User Message ===');
264
- handler.handleWebhook(oaToUserMessage as any);
265
-
266
- // Ví dụ 4: OA gửi tới group
267
- const oaToGroupMessage = {
268
- app_id: 'test-app',
269
- user_id_by_app: 'test-user',
270
- event_name: 'oa_send_group_text',
271
- timestamp: '1234567890',
272
- oa_id: 'oa123',
273
- sender: { id: 'oa123' },
274
- recipient: { id: 'group456' },
275
- message: { msg_id: 'msg101', text: 'Thông báo từ OA!' }
276
- };
277
-
278
- console.log('\n=== Example 4: OA to Group Message ===');
279
- handler.handleWebhook(oaToGroupMessage as any);
280
- }
281
-
282
- // Chạy ví dụ nếu file được execute trực tiếp
283
- if (require.main === module) {
284
- exampleUsage();
285
- }