@badzz88/baileys 8.4.7 → 8.5.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.
Files changed (144) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1055 -337
  3. package/WAProto/index.js +5 -5
  4. package/lib/Defaults/index.js +187 -127
  5. package/lib/Defaults/phonenumber-mcc.json +223 -0
  6. package/lib/Signal/Group/ciphertext-message.js +14 -11
  7. package/lib/Signal/Group/group-session-builder.js +91 -29
  8. package/lib/Signal/Group/group_cipher.js +88 -81
  9. package/lib/Signal/Group/index.js +136 -12
  10. package/lib/Signal/Group/keyhelper.js +70 -15
  11. package/lib/Signal/Group/sender-chain-key.js +31 -25
  12. package/lib/Signal/Group/sender-key-distribution-message.js +65 -62
  13. package/lib/Signal/Group/sender-key-message.js +68 -65
  14. package/lib/Signal/Group/sender-key-name.js +43 -41
  15. package/lib/Signal/Group/sender-key-record.js +43 -40
  16. package/lib/Signal/Group/sender-key-state.js +96 -83
  17. package/lib/Signal/Group/sender-message-key.js +29 -25
  18. package/lib/Signal/libsignal.js +483 -424
  19. package/lib/Signal/lid-mapping.js +261 -276
  20. package/lib/Socket/Client/index.js +30 -3
  21. package/lib/Socket/Client/types.js +12 -10
  22. package/lib/Socket/Client/websocket.js +61 -53
  23. package/lib/Socket/aigroups.js +240 -0
  24. package/lib/Socket/business.js +422 -379
  25. package/lib/Socket/chats.js +1816 -1193
  26. package/lib/Socket/communities.js +549 -431
  27. package/lib/Socket/graphql.js +656 -0
  28. package/lib/Socket/groups.js +764 -374
  29. package/lib/Socket/index.js +38 -11
  30. package/lib/Socket/interactive-handler.js +522 -0
  31. package/lib/Socket/interop.js +549 -0
  32. package/lib/Socket/luxu.js +6 -5
  33. package/lib/Socket/managed-account.js +183 -0
  34. package/lib/Socket/messages-recv.js +2439 -1915
  35. package/lib/Socket/messages-send.js +1642 -1242
  36. package/lib/Socket/mex.js +59 -40
  37. package/lib/Socket/newsletter.js +812 -249
  38. package/lib/Socket/privacy.js +449 -0
  39. package/lib/Socket/registration.js +427 -0
  40. package/lib/Socket/socket.js +1077 -965
  41. package/lib/Socket/text-router.js +83 -0
  42. package/lib/Socket/username.js +237 -140
  43. package/lib/Store/index.js +36 -10
  44. package/lib/Store/make-cache-manager-store.js +85 -80
  45. package/lib/Store/make-in-memory-store.js +591 -185
  46. package/lib/Store/make-ordered-dictionary.js +78 -72
  47. package/lib/Store/object-repository.js +25 -28
  48. package/lib/Types/Auth.js +38 -2
  49. package/lib/Types/Bussines.js +2 -2
  50. package/lib/Types/Call.js +2 -2
  51. package/lib/Types/Chat.js +4 -8
  52. package/lib/Types/Contact.js +2 -2
  53. package/lib/Types/Events.js +2 -2
  54. package/lib/Types/GroupMetadata.js +2 -2
  55. package/lib/Types/Label.js +26 -24
  56. package/lib/Types/LabelAssociation.js +8 -6
  57. package/lib/Types/Message.js +95 -11
  58. package/lib/Types/Mex.js +112 -37
  59. package/lib/Types/Newsletter.js +121 -0
  60. package/lib/Types/Product.js +2 -2
  61. package/lib/Types/Signal.js +2 -2
  62. package/lib/Types/Socket.js +2 -3
  63. package/lib/Types/State.js +70 -56
  64. package/lib/Types/USync.js +2 -2
  65. package/lib/Types/index.js +55 -26
  66. package/lib/Utils/auth-utils.js +292 -288
  67. package/lib/Utils/browser-utils.js +113 -48
  68. package/lib/Utils/business.js +240 -224
  69. package/lib/Utils/chat-utils.js +1205 -869
  70. package/lib/Utils/command-loader.d.ts +31 -0
  71. package/lib/Utils/command-loader.js +100 -0
  72. package/lib/Utils/companion-reg-client-utils.js +41 -34
  73. package/lib/Utils/consumer-application.js +107 -0
  74. package/lib/Utils/crypto.js +144 -107
  75. package/lib/Utils/curve25519-js.js +275 -0
  76. package/lib/Utils/decode-wa-message.js +518 -308
  77. package/lib/Utils/event-buffer.js +596 -611
  78. package/lib/Utils/generics.js +514 -354
  79. package/lib/Utils/group-history.js +60 -0
  80. package/lib/Utils/history.js +244 -134
  81. package/lib/Utils/identity-change-handler.js +51 -49
  82. package/lib/Utils/index.js +57 -23
  83. package/lib/Utils/jid-display-normalization.js +218 -0
  84. package/lib/Utils/link-preview.js +135 -77
  85. package/lib/Utils/logger.js +9 -3
  86. package/lib/Utils/lt-hash.js +37 -6
  87. package/lib/Utils/make-mutex.js +36 -33
  88. package/lib/Utils/message-composer.js +439 -233
  89. package/lib/Utils/message-retry-manager.js +265 -260
  90. package/lib/Utils/messages-media.js +855 -747
  91. package/lib/Utils/messages.js +2528 -884
  92. package/lib/Utils/meta-ai-msmsg.js +262 -0
  93. package/lib/Utils/native-bridge.js +82 -0
  94. package/lib/Utils/noise-handler.js +195 -200
  95. package/lib/Utils/offline-node-processor.js +35 -33
  96. package/lib/Utils/pre-key-manager.js +103 -102
  97. package/lib/Utils/process-message.js +978 -560
  98. package/lib/Utils/reporting-utils.js +257 -253
  99. package/lib/Utils/session-pool.d.ts +16 -0
  100. package/lib/Utils/session-pool.js +94 -0
  101. package/lib/Utils/signal.js +218 -195
  102. package/lib/Utils/stanza-ack.js +31 -29
  103. package/lib/Utils/sticker.d.ts +17 -0
  104. package/lib/Utils/sticker.js +145 -0
  105. package/lib/Utils/sync-action-utils.js +50 -45
  106. package/lib/Utils/tc-token-utils.js +137 -139
  107. package/lib/Utils/use-multi-file-auth-state.js +109 -109
  108. package/lib/Utils/validate-connection.js +218 -202
  109. package/lib/Utils/view-once-cache.d.ts +9 -0
  110. package/lib/Utils/view-once-cache.js +79 -0
  111. package/lib/Utils/voip-rekey.js +22 -0
  112. package/lib/WABinary/constants.js +1302 -1299
  113. package/lib/WABinary/decode.js +343 -262
  114. package/lib/WABinary/encode.js +12 -4
  115. package/lib/WABinary/generic-utils.js +223 -187
  116. package/lib/WABinary/index.js +33 -6
  117. package/lib/WABinary/jid-utils.js +351 -88
  118. package/lib/WABinary/types.js +2 -2
  119. package/lib/WAM/BinaryInfo.js +12 -9
  120. package/lib/WAM/constants.js +39486 -22853
  121. package/lib/WAM/encode.js +132 -140
  122. package/lib/WAM/index.js +31 -4
  123. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +55 -0
  124. package/lib/WAUSync/Protocols/USyncBusinessProtocol.js +43 -0
  125. package/lib/WAUSync/Protocols/USyncContactProtocol.js +53 -51
  126. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +56 -53
  127. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +29 -26
  128. package/lib/WAUSync/Protocols/USyncFeatureProtocol.js +59 -0
  129. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +31 -0
  130. package/lib/WAUSync/Protocols/USyncPictureProtocol.js +32 -0
  131. package/lib/WAUSync/Protocols/USyncSidelistProtocol.js +29 -0
  132. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +38 -37
  133. package/lib/WAUSync/Protocols/USyncTextStatusProtocol.js +38 -0
  134. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +26 -24
  135. package/lib/WAUSync/Protocols/index.js +39 -6
  136. package/lib/WAUSync/USyncQuery.js +132 -97
  137. package/lib/WAUSync/USyncUser.js +49 -30
  138. package/lib/WAUSync/index.js +31 -4
  139. package/lib/antiban.js +4637 -0
  140. package/lib/index.js +48 -15
  141. package/package.json +55 -92
  142. package/lib/WAUSync/Protocols/USyncNewsletterProtocol.js +0 -263
  143. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +0 -51
  144. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +0 -29
@@ -1,273 +1,479 @@
1
- import { proto } from '../../WAProto/index.js'
2
- import { generateMessageIDV2 } from './generics.js'
1
+ 'use strict'
2
+
3
+ const { proto } = require('../../WAProto/index.js')
4
+ const { generateMessageIDV2 } = require('./generics.js')
3
5
 
4
6
  const JS_KEYWORDS = new Set([
5
- 'import', 'export', 'from', 'default', 'as', 'const', 'let', 'var',
6
- 'function', 'class', 'extends', 'new', 'return', 'if', 'else', 'for',
7
- 'while', 'do', 'switch', 'case', 'break', 'continue', 'try', 'catch',
8
- 'finally', 'throw', 'async', 'await', 'yield', 'typeof', 'instanceof',
9
- 'in', 'of', 'delete', 'void', 'true', 'false', 'null', 'undefined',
10
- 'NaN', 'Infinity', 'this', 'super', 'static', 'get', 'set', 'debugger', 'with'
7
+ 'import',
8
+ 'export',
9
+ 'from',
10
+ 'default',
11
+ 'as',
12
+ 'const',
13
+ 'let',
14
+ 'var',
15
+ 'function',
16
+ 'class',
17
+ 'extends',
18
+ 'new',
19
+ 'return',
20
+ 'if',
21
+ 'else',
22
+ 'for',
23
+ 'while',
24
+ 'do',
25
+ 'switch',
26
+ 'case',
27
+ 'break',
28
+ 'continue',
29
+ 'try',
30
+ 'catch',
31
+ 'finally',
32
+ 'throw',
33
+ 'async',
34
+ 'await',
35
+ 'yield',
36
+ 'typeof',
37
+ 'instanceof',
38
+ 'in',
39
+ 'of',
40
+ 'delete',
41
+ 'void',
42
+ 'true',
43
+ 'false',
44
+ 'null',
45
+ 'undefined',
46
+ 'NaN',
47
+ 'Infinity',
48
+ 'this',
49
+ 'super',
50
+ 'static',
51
+ 'get',
52
+ 'set',
53
+ 'debugger',
54
+ 'with'
11
55
  ])
12
56
 
13
57
  const PYTHON_KEYWORDS = new Set([
14
- 'import', 'from', 'as', 'def', 'class', 'return', 'if', 'elif', 'else',
15
- 'for', 'while', 'break', 'continue', 'try', 'except', 'finally', 'raise',
16
- 'with', 'yield', 'lambda', 'pass', 'del', 'global', 'nonlocal', 'assert',
17
- 'True', 'False', 'None', 'and', 'or', 'not', 'in', 'is', 'async', 'await',
18
- 'self', 'print'
58
+ 'import',
59
+ 'from',
60
+ 'as',
61
+ 'def',
62
+ 'class',
63
+ 'return',
64
+ 'if',
65
+ 'elif',
66
+ 'else',
67
+ 'for',
68
+ 'while',
69
+ 'break',
70
+ 'continue',
71
+ 'try',
72
+ 'except',
73
+ 'finally',
74
+ 'raise',
75
+ 'with',
76
+ 'yield',
77
+ 'lambda',
78
+ 'pass',
79
+ 'del',
80
+ 'global',
81
+ 'nonlocal',
82
+ 'assert',
83
+ 'True',
84
+ 'False',
85
+ 'None',
86
+ 'and',
87
+ 'or',
88
+ 'not',
89
+ 'in',
90
+ 'is',
91
+ 'async',
92
+ 'await',
93
+ 'self',
94
+ 'print'
19
95
  ])
20
96
 
21
97
  const LANGUAGE_KEYWORDS = {
22
- javascript: JS_KEYWORDS,
23
- typescript: JS_KEYWORDS,
24
- js: JS_KEYWORDS,
25
- ts: JS_KEYWORDS,
26
- python: PYTHON_KEYWORDS,
27
- py: PYTHON_KEYWORDS
98
+ javascript: JS_KEYWORDS,
99
+ typescript: JS_KEYWORDS,
100
+ js: JS_KEYWORDS,
101
+ ts: JS_KEYWORDS,
102
+ python: PYTHON_KEYWORDS,
103
+ py: PYTHON_KEYWORDS
28
104
  }
29
105
 
30
- export var CodeHighlightType
106
+ var CodeHighlightType
31
107
  ;(function (CodeHighlightType) {
32
- CodeHighlightType[(CodeHighlightType['DEFAULT'] = 0)] = 'DEFAULT'
33
- CodeHighlightType[(CodeHighlightType['KEYWORD'] = 1)] = 'KEYWORD'
34
- CodeHighlightType[(CodeHighlightType['METHOD'] = 2)] = 'METHOD'
35
- CodeHighlightType[(CodeHighlightType['STRING'] = 3)] = 'STRING'
36
- CodeHighlightType[(CodeHighlightType['NUMBER'] = 4)] = 'NUMBER'
37
- CodeHighlightType[(CodeHighlightType['COMMENT'] = 5)] = 'COMMENT'
108
+ CodeHighlightType[(CodeHighlightType['DEFAULT'] = 0)] = 'DEFAULT'
109
+ CodeHighlightType[(CodeHighlightType['KEYWORD'] = 1)] = 'KEYWORD'
110
+ CodeHighlightType[(CodeHighlightType['METHOD'] = 2)] = 'METHOD'
111
+ CodeHighlightType[(CodeHighlightType['STRING'] = 3)] = 'STRING'
112
+ CodeHighlightType[(CodeHighlightType['NUMBER'] = 4)] = 'NUMBER'
113
+ CodeHighlightType[(CodeHighlightType['COMMENT'] = 5)] = 'COMMENT'
38
114
  })(CodeHighlightType || (CodeHighlightType = {}))
39
115
 
40
- export var RichSubMessageType
116
+ var RichSubMessageType
41
117
  ;(function (RichSubMessageType) {
42
- RichSubMessageType[(RichSubMessageType['UNKNOWN'] = 0)] = 'UNKNOWN'
43
- RichSubMessageType[(RichSubMessageType['GRID_IMAGE'] = 1)] = 'GRID_IMAGE'
44
- RichSubMessageType[(RichSubMessageType['TEXT'] = 2)] = 'TEXT'
45
- RichSubMessageType[(RichSubMessageType['INLINE_IMAGE'] = 3)] = 'INLINE_IMAGE'
46
- RichSubMessageType[(RichSubMessageType['TABLE'] = 4)] = 'TABLE'
47
- RichSubMessageType[(RichSubMessageType['CODE'] = 5)] = 'CODE'
48
- RichSubMessageType[(RichSubMessageType['DYNAMIC'] = 6)] = 'DYNAMIC'
49
- RichSubMessageType[(RichSubMessageType['MAP'] = 7)] = 'MAP'
50
- RichSubMessageType[(RichSubMessageType['LATEX'] = 8)] = 'LATEX'
51
- RichSubMessageType[(RichSubMessageType['CONTENT_ITEMS'] = 9)] = 'CONTENT_ITEMS'
118
+ RichSubMessageType[(RichSubMessageType['UNKNOWN'] = 0)] = 'UNKNOWN'
119
+ RichSubMessageType[(RichSubMessageType['GRID_IMAGE'] = 1)] = 'GRID_IMAGE'
120
+ RichSubMessageType[(RichSubMessageType['TEXT'] = 2)] = 'TEXT'
121
+ RichSubMessageType[(RichSubMessageType['INLINE_IMAGE'] = 3)] = 'INLINE_IMAGE'
122
+ RichSubMessageType[(RichSubMessageType['TABLE'] = 4)] = 'TABLE'
123
+ RichSubMessageType[(RichSubMessageType['CODE'] = 5)] = 'CODE'
124
+ RichSubMessageType[(RichSubMessageType['DYNAMIC'] = 6)] = 'DYNAMIC'
125
+ RichSubMessageType[(RichSubMessageType['MAP'] = 7)] = 'MAP'
126
+ RichSubMessageType[(RichSubMessageType['LATEX'] = 8)] = 'LATEX'
127
+ RichSubMessageType[(RichSubMessageType['CONTENT_ITEMS'] = 9)] = 'CONTENT_ITEMS'
52
128
  })(RichSubMessageType || (RichSubMessageType = {}))
53
129
 
54
- export const tokenizeCode = (codeStr, language = 'javascript') => {
55
- const keywords = LANGUAGE_KEYWORDS[language] || JS_KEYWORDS
56
- const blocks = []
57
- const lines = codeStr.split('\n')
58
- for (let li = 0; li < lines.length; li++) {
59
- const line = lines[li]
60
- const isLast = li === lines.length - 1
61
- const nl = isLast? '' : '\n'
62
- if (!line.trim()) {
63
- blocks.push({ highlightType: CodeHighlightType.DEFAULT, codeContent: line + nl })
64
- continue
65
- }
66
- if (line.trim().startsWith('//') || line.trim().startsWith('#')) {
67
- blocks.push({ highlightType: CodeHighlightType.COMMENT, codeContent: line + nl })
68
- continue
69
- }
70
- const regex = /(\/\/.*$|#.*$)|(["'`](?:[^"'`\\]|\\.)*["'`])|(\b\d+(?:\.\d+)?\b)|(\b[a-zA-Z_$][\w$]*\b)|([^\s\w$"'`]+)|(\s+)/g
71
- let match
72
- const tokens = []
73
- while ((match = regex.exec(line))!== null) {
74
- const val = match[0]
75
- if (match[1]) {
76
- tokens.push({ highlightType: CodeHighlightType.COMMENT, codeContent: val })
77
- } else if (match[2]) {
78
- tokens.push({ highlightType: CodeHighlightType.STRING, codeContent: val })
79
- } else if (match[3]) {
80
- tokens.push({ highlightType: CodeHighlightType.NUMBER, codeContent: val })
81
- } else if (match[4]) {
82
- if (keywords.has(val)) {
83
- tokens.push({ highlightType: CodeHighlightType.KEYWORD, codeContent: val })
84
- } else {
85
- const after = line.slice(regex.lastIndex).trimStart()
86
- if (after.startsWith('(')) {
87
- tokens.push({ highlightType: CodeHighlightType.METHOD, codeContent: val })
88
- } else {
89
- tokens.push({ highlightType: CodeHighlightType.DEFAULT, codeContent: val })
90
- }
91
- }
92
- } else {
93
- tokens.push({ highlightType: CodeHighlightType.DEFAULT, codeContent: val })
94
- }
95
- }
96
- if (tokens.length === 0) {
97
- blocks.push({ highlightType: CodeHighlightType.DEFAULT, codeContent: line + nl })
98
- continue
99
- }
100
- const merged = []
101
- for (const t of tokens) {
102
- const prev = merged.length > 0? merged[merged.length - 1] : undefined
103
- if (prev && prev.highlightType === t.highlightType) {
104
- prev.codeContent += t.codeContent
105
- } else {
106
- merged.push({...t })
107
- }
108
- }
109
- if (merged.length > 0) {
110
- merged[merged.length - 1].codeContent += nl
111
- }
112
- blocks.push(...merged)
113
- }
114
- return blocks
130
+ const tokenizeCode = (codeStr, language = 'javascript') => {
131
+ const keywords = LANGUAGE_KEYWORDS[language] || JS_KEYWORDS
132
+ const blocks = []
133
+ const lines = codeStr.split('\n')
134
+ for (let li = 0; li < lines.length; li++) {
135
+ const line = lines[li]
136
+ const isLast = li === lines.length - 1
137
+ const nl = isLast ? '' : '\n'
138
+ if (!line.trim()) {
139
+ blocks.push({
140
+ highlightType: CodeHighlightType.DEFAULT,
141
+ codeContent: line + nl
142
+ })
143
+ continue
144
+ }
145
+ if (line.trim().startsWith('//') || line.trim().startsWith('#')) {
146
+ blocks.push({
147
+ highlightType: CodeHighlightType.COMMENT,
148
+ codeContent: line + nl
149
+ })
150
+ continue
151
+ }
152
+ const regex =
153
+ /(\/\/.*$|#.*$)|(["'`](?:[^"'`\\]|\\.)*["'`])|(\b\d+(?:\.\d+)?\b)|(\b[a-zA-Z_$][\w$]*\b)|([^\s\w$"'`]+)|(\s+)/g
154
+ let match
155
+ const tokens = []
156
+ while ((match = regex.exec(line)) !== null) {
157
+ const val = match[0]
158
+ if (match[1]) {
159
+ tokens.push({
160
+ highlightType: CodeHighlightType.COMMENT,
161
+ codeContent: val
162
+ })
163
+ } else if (match[2]) {
164
+ tokens.push({
165
+ highlightType: CodeHighlightType.STRING,
166
+ codeContent: val
167
+ })
168
+ } else if (match[3]) {
169
+ tokens.push({
170
+ highlightType: CodeHighlightType.NUMBER,
171
+ codeContent: val
172
+ })
173
+ } else if (match[4]) {
174
+ if (keywords.has(val)) {
175
+ tokens.push({
176
+ highlightType: CodeHighlightType.KEYWORD,
177
+ codeContent: val
178
+ })
179
+ } else {
180
+ const after = line.slice(regex.lastIndex).trimStart()
181
+ if (after.startsWith('(')) {
182
+ tokens.push({
183
+ highlightType: CodeHighlightType.METHOD,
184
+ codeContent: val
185
+ })
186
+ } else {
187
+ tokens.push({
188
+ highlightType: CodeHighlightType.DEFAULT,
189
+ codeContent: val
190
+ })
191
+ }
192
+ }
193
+ } else {
194
+ tokens.push({
195
+ highlightType: CodeHighlightType.DEFAULT,
196
+ codeContent: val
197
+ })
198
+ }
199
+ }
200
+ if (tokens.length === 0) {
201
+ blocks.push({
202
+ highlightType: CodeHighlightType.DEFAULT,
203
+ codeContent: line + nl
204
+ })
205
+ continue
206
+ }
207
+ const merged = []
208
+ for (const t of tokens) {
209
+ const prev = merged.length > 0 ? merged[merged.length - 1] : undefined
210
+ if (prev && prev.highlightType === t.highlightType) {
211
+ prev.codeContent += t.codeContent
212
+ } else {
213
+ merged.push({ ...t })
214
+ }
215
+ }
216
+ if (merged.length > 0) {
217
+ merged[merged.length - 1].codeContent += nl
218
+ }
219
+ blocks.push(...merged)
220
+ }
221
+ return blocks
115
222
  }
116
223
 
117
- export const buildRichContextInfo = (quoted, options) => {
118
- const ctxInfo = {
119
- forwardingScore: 1,
120
- isForwarded: true,
121
- forwardedAiBotMessageInfo: { botJid: options?.botJid? options.botJid : '867051314767696@bot' },
122
- forwardOrigin: 4,
123
- ...(options?.mentions? { mentionedJid: options.mentions } : {})
124
- }
125
- if (quoted?.key) {
126
- ctxInfo.stanzaId = quoted.key.id
127
- ctxInfo.participant = quoted.key.participant || quoted.sender || quoted.key.remoteJid
128
- ctxInfo.quotedMessage = quoted.message
129
- }
130
- return ctxInfo
224
+ const buildRichContextInfo = (quoted, options) => {
225
+ const ctxInfo = {
226
+ forwardingScore: 1,
227
+ isForwarded: true,
228
+ forwardedAiBotMessageInfo: { botJid: options.botJid ? options.botJid : '867051314767696@bot' },
229
+ forwardOrigin: 4,
230
+ ...(options.mentions ? { mentionedJid: options.mentions } : {})
231
+ }
232
+ if (quoted?.key) {
233
+ ctxInfo.stanzaId = quoted.key.id
234
+ ctxInfo.participant = quoted.key.participant || quoted.sender || quoted.key.remoteJid
235
+ ctxInfo.quotedMessage = quoted.message
236
+ }
237
+ return ctxInfo
131
238
  }
132
239
 
133
- export const buildBotForwardedMessage = (submessages, contextInfo, unifiedResponse) => {
134
- const richResponse = { messageType: 1, submessages, contextInfo }
135
- if (unifiedResponse) {
136
- richResponse.unifiedResponse = unifiedResponse
137
- }
138
- return {
139
- botForwardedMessage: {
140
- message: { richResponseMessage: richResponse }
141
- }
142
- }
240
+ const buildBotForwardedMessage = (submessages, contextInfo, unifiedResponse) => {
241
+ const richResponse = {
242
+ messageType: 1,
243
+ submessages,
244
+ contextInfo
245
+ }
246
+ if (unifiedResponse) {
247
+ richResponse.unifiedResponse = unifiedResponse
248
+ }
249
+ return {
250
+ botForwardedMessage: {
251
+ message: {
252
+ richResponseMessage: richResponse
253
+ }
254
+ }
255
+ }
143
256
  }
144
257
 
145
- export const generateTableContent = (title, headers, rows, quoted, options = {}) => {
146
- const { footer, headerText } = options
147
- const tableRows = [{ items: headers, isHeading: true },...rows.map(row => ({ items: row.map(String) }))]
148
- const submessages = []
149
- if (headerText) submessages.push({ messageType: 2, messageText: headerText })
150
- submessages.push({ messageType: 4, tableMetadata: { title, rows: tableRows } })
151
- if (footer) submessages.push({ messageType: 2, messageText: footer })
152
- const ctxInfo = buildRichContextInfo(quoted)
153
- return { message: buildBotForwardedMessage(submessages, ctxInfo), messageId: generateMessageIDV2() }
258
+ const generateTableContent = (title, headers, rows, quoted, options = {}) => {
259
+ const { footer, headerText } = options
260
+ const tableRows = [{ items: headers, isHeading: true }, ...rows.map(row => ({ items: row.map(String) }))]
261
+ const submessages = []
262
+ if (headerText) {
263
+ submessages.push({ messageType: 2, messageText: headerText })
264
+ }
265
+ submessages.push({
266
+ messageType: 4,
267
+ tableMetadata: { title, rows: tableRows }
268
+ })
269
+ if (footer) {
270
+ submessages.push({ messageType: 2, messageText: footer })
271
+ }
272
+ const ctxInfo = buildRichContextInfo(quoted)
273
+ return {
274
+ message: buildBotForwardedMessage(submessages, ctxInfo),
275
+ messageId: generateMessageIDV2()
276
+ }
154
277
  }
155
278
 
156
- export const generateListContent = (title, items, quoted, options = {}) => {
157
- const { footer, headerText } = options
158
- const tableRows = items.map(item => ({
159
- items: Array.isArray(item)? item.map(String) : [String(item)]
160
- }))
161
- const submessages = []
162
- if (headerText) submessages.push({ messageType: 2, messageText: headerText })
163
- submessages.push({ messageType: 4, tableMetadata: { title, rows: tableRows } })
164
- if (footer) submessages.push({ messageType: 2, messageText: footer })
165
- const ctxInfo = buildRichContextInfo(quoted)
166
- return { message: buildBotForwardedMessage(submessages, ctxInfo), messageId: generateMessageIDV2() }
279
+ const generateListContent = (title, items, quoted, options = {}) => {
280
+ const { footer, headerText } = options
281
+ const tableRows = items.map(item => ({
282
+ items: Array.isArray(item) ? item.map(String) : [String(item)]
283
+ }))
284
+ const submessages = []
285
+ if (headerText) {
286
+ submessages.push({ messageType: 2, messageText: headerText })
287
+ }
288
+ submessages.push({
289
+ messageType: 4,
290
+ tableMetadata: { title, rows: tableRows }
291
+ })
292
+ if (footer) {
293
+ submessages.push({ messageType: 2, messageText: footer })
294
+ }
295
+ const ctxInfo = buildRichContextInfo(quoted)
296
+ return {
297
+ message: buildBotForwardedMessage(submessages, ctxInfo),
298
+ messageId: generateMessageIDV2()
299
+ }
167
300
  }
168
301
 
169
- export const generateCodeBlockContent = (code, quoted, options = {}) => {
170
- const { title, footer, language = 'javascript' } = options
171
- const submessages = []
172
- if (title) submessages.push({ messageType: 2, messageText: title })
173
- submessages.push({
174
- messageType: 5,
175
- codeMetadata: { codeLanguage: language, codeBlocks: tokenizeCode(code, language) }
176
- })
177
- if (footer) submessages.push({ messageType: 2, messageText: footer })
178
- const ctxInfo = buildRichContextInfo(quoted)
179
- return { message: buildBotForwardedMessage(submessages, ctxInfo), messageId: generateMessageIDV2() }
302
+ const generateCodeBlockContent = (code, quoted, options = {}) => {
303
+ const { title, footer, language = 'javascript' } = options
304
+ const submessages = []
305
+ if (title) {
306
+ submessages.push({ messageType: 2, messageText: title })
307
+ }
308
+ submessages.push({
309
+ messageType: 5,
310
+ codeMetadata: {
311
+ codeLanguage: language,
312
+ codeBlocks: tokenizeCode(code, language)
313
+ }
314
+ })
315
+ if (footer) {
316
+ submessages.push({ messageType: 2, messageText: footer })
317
+ }
318
+ const ctxInfo = buildRichContextInfo(quoted)
319
+ return {
320
+ message: buildBotForwardedMessage(submessages, ctxInfo),
321
+ messageId: generateMessageIDV2()
322
+ }
180
323
  }
181
324
 
182
- export const generateLatexContent = (quoted, options) => {
183
- const { text, expressions, headerText, footer } = options
184
- const submessages = []
185
- if (headerText) submessages.push({ messageType: 2, messageText: headerText })
186
- const latexExpressions = expressions.map(expr => {
187
- const entry = {
188
- latexExpression: expr.latexExpression,
189
- url: expr.url,
190
- width: expr.width,
191
- height: expr.height
192
- }
193
- if (expr.fontHeight!== undefined) entry.fontHeight = expr.fontHeight
194
- if (expr.imageTopPadding!== undefined) entry.imageTopPadding = expr.imageTopPadding
195
- if (expr.imageLeadingPadding!== undefined) entry.imageLeadingPadding = expr.imageLeadingPadding
196
- if (expr.imageBottomPadding!== undefined) entry.imageBottomPadding = expr.imageBottomPadding
197
- if (expr.imageTrailingPadding!== undefined) entry.imageTrailingPadding = expr.imageTrailingPadding
198
- return entry
199
- })
200
- submessages.push({ messageType: 8, latexMetadata: { text: text || '', expressions: latexExpressions } })
201
- if (footer) submessages.push({ messageType: 2, messageText: footer })
202
- const ctxInfo = buildRichContextInfo(quoted)
203
- return { message: buildBotForwardedMessage(submessages, ctxInfo), messageId: generateMessageIDV2() }
325
+ const generateLatexContent = (quoted, options) => {
326
+ const { text, expressions, headerText, footer } = options
327
+ const submessages = []
328
+ if (headerText) {
329
+ submessages.push({ messageType: 2, messageText: headerText })
330
+ }
331
+ const latexExpressions = expressions.map(expr => {
332
+ const entry = {
333
+ latexExpression: expr.latexExpression,
334
+ url: expr.url,
335
+ width: expr.width,
336
+ height: expr.height
337
+ }
338
+ if (expr.fontHeight !== undefined) entry.fontHeight = expr.fontHeight
339
+ if (expr.imageTopPadding !== undefined) entry.imageTopPadding = expr.imageTopPadding
340
+ if (expr.imageLeadingPadding !== undefined) entry.imageLeadingPadding = expr.imageLeadingPadding
341
+ if (expr.imageBottomPadding !== undefined) entry.imageBottomPadding = expr.imageBottomPadding
342
+ if (expr.imageTrailingPadding !== undefined) entry.imageTrailingPadding = expr.imageTrailingPadding
343
+ return entry
344
+ })
345
+ submessages.push({
346
+ messageType: 8,
347
+ latexMetadata: {
348
+ text: text || '',
349
+ expressions: latexExpressions
350
+ }
351
+ })
352
+ if (footer) {
353
+ submessages.push({ messageType: 2, messageText: footer })
354
+ }
355
+ const ctxInfo = buildRichContextInfo(quoted)
356
+ return {
357
+ message: buildBotForwardedMessage(submessages, ctxInfo),
358
+ messageId: generateMessageIDV2()
359
+ }
204
360
  }
205
361
 
206
- export const generateLatexImageContent = async (quoted, options, uploadFn, renderLatexToPng) => {
207
- const { text, expressions, headerText, footer } = options
208
- const submessages = []
209
- if (headerText) submessages.push({ messageType: 2, messageText: headerText })
210
- const latexExpressions = await Promise.all(
211
- expressions.map(async expr => {
212
- const { buffer, width, height } = await renderLatexToPng(expr.latexExpression)
213
- const uploadResult = await uploadFn(buffer, 'image')
214
- const imageUrl = uploadResult.url || uploadResult.directPath
215
- return { latexExpression: expr.latexExpression, url: imageUrl, width, height }
216
- })
217
- )
218
- submessages.push({ messageType: 8, latexMetadata: { text: text || '', expressions: latexExpressions } })
219
- if (footer) submessages.push({ messageType: 2, messageText: footer })
220
- const ctxInfo = buildRichContextInfo(quoted)
221
- return { message: buildBotForwardedMessage(submessages, ctxInfo), messageId: generateMessageIDV2() }
362
+ const generateLatexImageContent = async (quoted, options, uploadFn, renderLatexToPng) => {
363
+ const { text, expressions, headerText, footer } = options
364
+ const submessages = []
365
+ if (headerText) {
366
+ submessages.push({ messageType: 2, messageText: headerText })
367
+ }
368
+ const latexExpressions = await Promise.all(
369
+ expressions.map(async expr => {
370
+ const { buffer, width, height } = await renderLatexToPng(expr.latexExpression)
371
+ const uploadResult = await uploadFn(buffer, 'image')
372
+ const imageUrl = uploadResult.url || uploadResult.directPath
373
+ return {
374
+ latexExpression: expr.latexExpression,
375
+ url: imageUrl,
376
+ width,
377
+ height
378
+ }
379
+ })
380
+ )
381
+ submessages.push({
382
+ messageType: 8,
383
+ latexMetadata: {
384
+ text: text || '',
385
+ expressions: latexExpressions
386
+ }
387
+ })
388
+ if (footer) {
389
+ submessages.push({ messageType: 2, messageText: footer })
390
+ }
391
+ const ctxInfo = buildRichContextInfo(quoted)
392
+ return {
393
+ message: buildBotForwardedMessage(submessages, ctxInfo),
394
+ messageId: generateMessageIDV2()
395
+ }
222
396
  }
223
397
 
224
- export const generateLatexInlineImageContent = async (quoted, options, uploadFn, renderLatexToPng) => {
225
- const { text, expressions, headerText, footer } = options
226
- const submessages = []
227
- if (headerText) submessages.push({ messageType: 2, messageText: headerText })
228
- if (text) submessages.push({ messageType: 2, messageText: text })
229
- for (const expr of expressions) {
230
- const { buffer, width, height } = await renderLatexToPng(expr.latexExpression)
231
- const uploadResult = await uploadFn(buffer, 'image')
232
- const imageUrl = uploadResult.url || uploadResult.directPath
233
- submessages.push({
234
- messageType: 3,
235
- imageMetadata: {
236
- imageUrl: { imagePreviewUrl: imageUrl, imageHighResUrl: imageUrl },
237
- imageText: expr.latexExpression,
238
- alignment: 2
239
- }
240
- })
241
- }
242
- if (footer) submessages.push({ messageType: 2, messageText: footer })
243
- const ctxInfo = buildRichContextInfo(quoted)
244
- return { message: buildBotForwardedMessage(submessages, ctxInfo), messageId: generateMessageIDV2() }
398
+ const generateLatexInlineImageContent = async (quoted, options, uploadFn, renderLatexToPng) => {
399
+ const { text, expressions, headerText, footer } = options
400
+ const submessages = []
401
+ if (headerText) {
402
+ submessages.push({ messageType: 2, messageText: headerText })
403
+ }
404
+ if (text) {
405
+ submessages.push({ messageType: 2, messageText: text })
406
+ }
407
+ for (const expr of expressions) {
408
+ const { buffer, width, height } = await renderLatexToPng(expr.latexExpression)
409
+ const uploadResult = await uploadFn(buffer, 'image')
410
+ const imageUrl = uploadResult.url || uploadResult.directPath
411
+ submessages.push({
412
+ messageType: 3,
413
+ imageMetadata: {
414
+ imageUrl: {
415
+ imagePreviewUrl: imageUrl,
416
+ imageHighResUrl: imageUrl
417
+ },
418
+ imageText: expr.latexExpression,
419
+ alignment: 2
420
+ }
421
+ })
422
+ }
423
+ if (footer) {
424
+ submessages.push({ messageType: 2, messageText: footer })
425
+ }
426
+ const ctxInfo = buildRichContextInfo(quoted)
427
+ return {
428
+ message: buildBotForwardedMessage(submessages, ctxInfo),
429
+ messageId: generateMessageIDV2()
430
+ }
245
431
  }
246
432
 
247
- export const captureUnifiedResponse = msg => {
248
- const botFwd = msg?.botForwardedMessage?.message
249
- if (!botFwd) return null
250
- const rich = botFwd.richResponseMessage
251
- if (!rich?.unifiedResponse?.data) return null
252
- return {
253
- unifiedResponse: { data: rich.unifiedResponse.data },
254
- submessages: rich.submessages || [],
255
- contextInfo: rich.contextInfo || {}
256
- }
433
+ const captureUnifiedResponse = msg => {
434
+ const botFwd = msg?.botForwardedMessage?.message
435
+ if (!botFwd) return null
436
+ const rich = botFwd.richResponseMessage
437
+ if (!rich?.unifiedResponse?.data) return null
438
+ return {
439
+ unifiedResponse: { data: rich.unifiedResponse.data },
440
+ submessages: rich.submessages || [],
441
+ contextInfo: rich.contextInfo || {}
442
+ }
257
443
  }
258
444
 
259
- export const generateUnifiedResponseContent = (quoted, captured) => {
260
- const ctxInfo = buildRichContextInfo(quoted)
261
- return { message: buildBotForwardedMessage(captured.submessages, ctxInfo, captured.unifiedResponse), messageId: generateMessageIDV2() }
445
+ const generateUnifiedResponseContent = (quoted, captured) => {
446
+ const ctxInfo = buildRichContextInfo(quoted)
447
+ return {
448
+ message: buildBotForwardedMessage(captured.submessages, ctxInfo, captured.unifiedResponse),
449
+ messageId: generateMessageIDV2()
450
+ }
262
451
  }
263
452
 
264
- export const generateRichMessageContent = (submessages, quoted, options) => {
265
- const ctxInfo = buildRichContextInfo(quoted, options)
266
- return { message: buildBotForwardedMessage(submessages, ctxInfo), messageId: generateMessageIDV2() }
453
+ const generateRichMessageContent = (submessages, quoted, options) => {
454
+ const ctxInfo = buildRichContextInfo(quoted, options)
455
+ return {
456
+ message: buildBotForwardedMessage(submessages, ctxInfo),
457
+ messageId: generateMessageIDV2()
458
+ }
267
459
  }
268
460
 
269
- export {
270
- JS_KEYWORDS,
271
- PYTHON_KEYWORDS,
272
- LANGUAGE_KEYWORDS
273
- }
461
+ module.exports = {
462
+ JS_KEYWORDS,
463
+ PYTHON_KEYWORDS,
464
+ LANGUAGE_KEYWORDS,
465
+ CodeHighlightType,
466
+ RichSubMessageType,
467
+ tokenizeCode,
468
+ buildRichContextInfo,
469
+ buildBotForwardedMessage,
470
+ generateTableContent,
471
+ generateListContent,
472
+ generateCodeBlockContent,
473
+ generateLatexContent,
474
+ generateLatexImageContent,
475
+ generateLatexInlineImageContent,
476
+ captureUnifiedResponse,
477
+ generateUnifiedResponseContent,
478
+ generateRichMessageContent
479
+ }