ruby-baileys 0.0.0-stage → 1.5.17

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 (296) hide show
  1. package/EXPERIMENTAL.md +350 -0
  2. package/LICENSE +23 -0
  3. package/NOTICE.md +14 -0
  4. package/README.md +6265 -2
  5. package/WAProto/GenerateStatics.sh +3 -0
  6. package/WAProto/WAProto.proto +5479 -0
  7. package/WAProto/fix-imports.js +81 -0
  8. package/WAProto/index.d.ts +16877 -0
  9. package/WAProto/index.js +122159 -0
  10. package/assets/ruby_aspirant.jpg +0 -0
  11. package/assets/ruby_aspirant_4k.jpg +88 -0
  12. package/assets/ruby_aspirant_full.jpg +0 -0
  13. package/assets/ruby_aspirant_render.png +1 -0
  14. package/assets/ruby_aspirants_hd.jpg +0 -0
  15. package/assets/thumb.jpg +0 -0
  16. package/engine-requirements.js +14 -0
  17. package/index.cjs +29 -0
  18. package/index.d.ts +2 -0
  19. package/package.json +178 -4
  20. package/src/Defaults/index.d.ts +153 -0
  21. package/src/Defaults/index.js +165 -0
  22. package/src/MessageBuilder/bot-signature.d.ts +22 -0
  23. package/src/MessageBuilder/bot-signature.js +123 -0
  24. package/src/MessageBuilder/extras.d.ts +396 -0
  25. package/src/MessageBuilder/extras.js +1229 -0
  26. package/src/MessageBuilder/index.d.ts +210 -0
  27. package/src/MessageBuilder/index.js +3521 -0
  28. package/src/MessageBuilder/metaai.d.ts +438 -0
  29. package/src/MessageBuilder/metaai.js +891 -0
  30. package/src/Signal/Group/ciphertext-message.d.ts +10 -0
  31. package/src/Signal/Group/ciphertext-message.js +12 -0
  32. package/src/Signal/Group/group-session-builder.d.ts +8 -0
  33. package/src/Signal/Group/group-session-builder.js +28 -0
  34. package/src/Signal/Group/group_cipher.d.ts +11 -0
  35. package/src/Signal/Group/group_cipher.js +79 -0
  36. package/src/Signal/Group/index.d.ts +12 -0
  37. package/src/Signal/Group/index.js +12 -0
  38. package/src/Signal/Group/keyhelper.d.ts +7 -0
  39. package/src/Signal/Group/keyhelper.js +18 -0
  40. package/src/Signal/Group/sender-chain-key.d.ts +14 -0
  41. package/src/Signal/Group/sender-chain-key.js +26 -0
  42. package/src/Signal/Group/sender-key-distribution-message.d.ts +17 -0
  43. package/src/Signal/Group/sender-key-distribution-message.js +63 -0
  44. package/src/Signal/Group/sender-key-message.d.ts +19 -0
  45. package/src/Signal/Group/sender-key-message.js +66 -0
  46. package/src/Signal/Group/sender-key-name.d.ts +12 -0
  47. package/src/Signal/Group/sender-key-name.js +48 -0
  48. package/src/Signal/Group/sender-key-record.d.ts +13 -0
  49. package/src/Signal/Group/sender-key-record.js +41 -0
  50. package/src/Signal/Group/sender-key-state.d.ts +17 -0
  51. package/src/Signal/Group/sender-key-state.js +84 -0
  52. package/src/Signal/Group/sender-message-key.d.ts +12 -0
  53. package/src/Signal/Group/sender-message-key.js +26 -0
  54. package/src/Signal/libsignal.d.ts +55 -0
  55. package/src/Signal/libsignal.js +429 -0
  56. package/src/Signal/lid-mapping.d.ts +21 -0
  57. package/src/Signal/lid-mapping.js +275 -0
  58. package/src/Socket/Client/index.d.ts +3 -0
  59. package/src/Socket/Client/index.js +3 -0
  60. package/src/Socket/Client/types.d.ts +6 -0
  61. package/src/Socket/Client/types.js +10 -0
  62. package/src/Socket/Client/websocket.d.ts +13 -0
  63. package/src/Socket/Client/websocket.js +54 -0
  64. package/src/Socket/business.d.ts +432 -0
  65. package/src/Socket/business.js +380 -0
  66. package/src/Socket/chats.d.ts +248 -0
  67. package/src/Socket/chats.js +1485 -0
  68. package/src/Socket/communities.d.ts +599 -0
  69. package/src/Socket/communities.js +422 -0
  70. package/src/Socket/groups.d.ts +299 -0
  71. package/src/Socket/groups.js +340 -0
  72. package/src/Socket/index.d.ts +582 -0
  73. package/src/Socket/index.js +48 -0
  74. package/src/Socket/messages-recv.d.ts +371 -0
  75. package/src/Socket/messages-recv.js +1803 -0
  76. package/src/Socket/messages-send.d.ts +391 -0
  77. package/src/Socket/messages-send.js +1575 -0
  78. package/src/Socket/mex.d.ts +2 -0
  79. package/src/Socket/mex.js +45 -0
  80. package/src/Socket/newsletter.d.ts +469 -0
  81. package/src/Socket/newsletter.js +643 -0
  82. package/src/Socket/socket.d.ts +78 -0
  83. package/src/Socket/socket.js +1088 -0
  84. package/src/Store/index.d.ts +4 -0
  85. package/src/Store/index.js +4 -0
  86. package/src/Store/make-in-memory-store.d.ts +63 -0
  87. package/src/Store/make-in-memory-store.js +398 -0
  88. package/src/Store/make-ordered-dictionary.d.ts +13 -0
  89. package/src/Store/make-ordered-dictionary.js +79 -0
  90. package/src/Store/object-repository.d.ts +11 -0
  91. package/src/Store/object-repository.js +24 -0
  92. package/src/Types/Auth.d.ts +2 -0
  93. package/src/Types/Auth.js +2 -0
  94. package/src/Types/Bussines.d.ts +2 -0
  95. package/src/Types/Bussines.js +2 -0
  96. package/src/Types/Call.d.ts +2 -0
  97. package/src/Types/Call.js +2 -0
  98. package/src/Types/Chat.d.ts +3 -0
  99. package/src/Types/Chat.js +25 -0
  100. package/src/Types/Contact.d.ts +2 -0
  101. package/src/Types/Contact.js +2 -0
  102. package/src/Types/Events.d.ts +2 -0
  103. package/src/Types/Events.js +1 -0
  104. package/src/Types/GroupMetadata.d.ts +6 -0
  105. package/src/Types/GroupMetadata.js +7 -0
  106. package/src/Types/Label.d.ts +3 -0
  107. package/src/Types/Label.js +25 -0
  108. package/src/Types/LabelAssociation.d.ts +3 -0
  109. package/src/Types/LabelAssociation.js +7 -0
  110. package/src/Types/Message.d.ts +14 -0
  111. package/src/Types/Message.js +24 -0
  112. package/src/Types/Mex.d.ts +3 -0
  113. package/src/Types/Mex.js +96 -0
  114. package/src/Types/Product.d.ts +2 -0
  115. package/src/Types/Product.js +2 -0
  116. package/src/Types/Signal.d.ts +2 -0
  117. package/src/Types/Signal.js +1 -0
  118. package/src/Types/Socket.d.ts +2 -0
  119. package/src/Types/Socket.js +1 -0
  120. package/src/Types/State.d.ts +6 -0
  121. package/src/Types/State.js +55 -0
  122. package/src/Types/USync.d.ts +2 -0
  123. package/src/Types/USync.js +1 -0
  124. package/src/Types/index.d.ts +14 -0
  125. package/src/Types/index.js +26 -0
  126. package/src/Utils/auth-store.d.ts +30 -0
  127. package/src/Utils/auth-store.js +77 -0
  128. package/src/Utils/auth-utils.d.ts +59 -0
  129. package/src/Utils/auth-utils.js +274 -0
  130. package/src/Utils/browser-utils.d.ts +10 -0
  131. package/src/Utils/browser-utils.js +29 -0
  132. package/src/Utils/business.d.ts +50 -0
  133. package/src/Utils/business.js +227 -0
  134. package/src/Utils/chat-utils.d.ts +409 -0
  135. package/src/Utils/chat-utils.js +847 -0
  136. package/src/Utils/companion-reg-client-utils.d.ts +5 -0
  137. package/src/Utils/companion-reg-client-utils.js +40 -0
  138. package/src/Utils/crypto.d.ts +40 -0
  139. package/src/Utils/crypto.js +111 -0
  140. package/src/Utils/decode-wa-message.d.ts +100 -0
  141. package/src/Utils/decode-wa-message.js +374 -0
  142. package/src/Utils/event-buffer.d.ts +23 -0
  143. package/src/Utils/event-buffer.js +625 -0
  144. package/src/Utils/generics.d.ts +64 -0
  145. package/src/Utils/generics.js +376 -0
  146. package/src/Utils/group-metadata-cache.d.ts +5 -0
  147. package/src/Utils/group-metadata-cache.js +26 -0
  148. package/src/Utils/history.d.ts +76 -0
  149. package/src/Utils/history.js +132 -0
  150. package/src/Utils/html-app.d.ts +19 -0
  151. package/src/Utils/html-app.js +97 -0
  152. package/src/Utils/html-multiplayer.d.ts +10 -0
  153. package/src/Utils/html-multiplayer.js +95 -0
  154. package/src/Utils/identity-change-handler.d.ts +14 -0
  155. package/src/Utils/identity-change-handler.js +49 -0
  156. package/src/Utils/index.d.ts +45 -0
  157. package/src/Utils/index.js +45 -0
  158. package/src/Utils/link-preview-metadata.d.ts +47 -0
  159. package/src/Utils/link-preview-metadata.js +89 -0
  160. package/src/Utils/link-preview.d.ts +13 -0
  161. package/src/Utils/link-preview.js +80 -0
  162. package/src/Utils/logger.d.ts +3 -0
  163. package/src/Utils/logger.js +3 -0
  164. package/src/Utils/lt-hash.d.ts +7 -0
  165. package/src/Utils/lt-hash.js +4 -0
  166. package/src/Utils/make-mutex.d.ts +7 -0
  167. package/src/Utils/make-mutex.js +33 -0
  168. package/src/Utils/message-retry-manager.d.ts +80 -0
  169. package/src/Utils/message-retry-manager.js +256 -0
  170. package/src/Utils/messages-media.d.ts +137 -0
  171. package/src/Utils/messages-media.js +815 -0
  172. package/src/Utils/messages.d.ts +63 -0
  173. package/src/Utils/messages.js +2149 -0
  174. package/src/Utils/modern-messages.d.ts +150 -0
  175. package/src/Utils/modern-messages.js +496 -0
  176. package/src/Utils/native-flow.d.ts +11 -0
  177. package/src/Utils/native-flow.js +116 -0
  178. package/src/Utils/newsletter-status.d.ts +158 -0
  179. package/src/Utils/newsletter-status.js +651 -0
  180. package/src/Utils/noise-handler.d.ts +21 -0
  181. package/src/Utils/noise-handler.js +201 -0
  182. package/src/Utils/offline-node-processor.d.ts +10 -0
  183. package/src/Utils/offline-node-processor.js +34 -0
  184. package/src/Utils/optional-media.d.ts +3 -0
  185. package/src/Utils/optional-media.js +46 -0
  186. package/src/Utils/payment-messages.d.ts +66 -0
  187. package/src/Utils/payment-messages.js +161 -0
  188. package/src/Utils/pre-key-manager.d.ts +26 -0
  189. package/src/Utils/pre-key-manager.js +96 -0
  190. package/src/Utils/process-message.d.ts +61 -0
  191. package/src/Utils/process-message.js +689 -0
  192. package/src/Utils/reporting-utils.d.ts +13 -0
  193. package/src/Utils/reporting-utils.js +257 -0
  194. package/src/Utils/scheduled-message.d.ts +51 -0
  195. package/src/Utils/scheduled-message.js +113 -0
  196. package/src/Utils/sender-key-memory.d.ts +20 -0
  197. package/src/Utils/sender-key-memory.js +52 -0
  198. package/src/Utils/signal.d.ts +83 -0
  199. package/src/Utils/signal.js +194 -0
  200. package/src/Utils/stanza-ack.d.ts +17 -0
  201. package/src/Utils/stanza-ack.js +31 -0
  202. package/src/Utils/status-stickers.d.ts +127 -0
  203. package/src/Utils/status-stickers.js +261 -0
  204. package/src/Utils/sync-action-utils.d.ts +3 -0
  205. package/src/Utils/sync-action-utils.js +45 -0
  206. package/src/Utils/tc-token-utils.d.ts +30 -0
  207. package/src/Utils/tc-token-utils.js +156 -0
  208. package/src/Utils/ttl-cache.d.ts +29 -0
  209. package/src/Utils/ttl-cache.js +121 -0
  210. package/src/Utils/use-mongo-auth-state.d.ts +22 -0
  211. package/src/Utils/use-mongo-auth-state.js +68 -0
  212. package/src/Utils/use-multi-file-auth-state.d.ts +12 -0
  213. package/src/Utils/use-multi-file-auth-state.js +107 -0
  214. package/src/Utils/use-mysql-auth-state.d.ts +20 -0
  215. package/src/Utils/use-mysql-auth-state.js +80 -0
  216. package/src/Utils/use-postgres-auth-state.d.ts +20 -0
  217. package/src/Utils/use-postgres-auth-state.js +80 -0
  218. package/src/Utils/use-redis-auth-state.d.ts +20 -0
  219. package/src/Utils/use-redis-auth-state.js +90 -0
  220. package/src/Utils/use-single-file-auth-state.d.ts +11 -0
  221. package/src/Utils/use-single-file-auth-state.js +109 -0
  222. package/src/Utils/use-sqlite-auth-state.d.ts +13 -0
  223. package/src/Utils/use-sqlite-auth-state.js +121 -0
  224. package/src/Utils/useNekoDBAuth.d.ts +19 -0
  225. package/src/Utils/useNekoDBAuth.js +111 -0
  226. package/src/Utils/username.d.ts +12 -0
  227. package/src/Utils/username.js +59 -0
  228. package/src/Utils/validate-connection.d.ts +44 -0
  229. package/src/Utils/validate-connection.js +208 -0
  230. package/src/Utils/voice-recognition.d.ts +53 -0
  231. package/src/Utils/voice-recognition.js +219 -0
  232. package/src/Voip/audio-feeder.d.ts +25 -0
  233. package/src/Voip/audio-feeder.js +269 -0
  234. package/src/Voip/index.d.ts +89 -0
  235. package/src/Voip/index.js +937 -0
  236. package/src/Voip/relay-transport.d.ts +6 -0
  237. package/src/Voip/relay-transport.js +825 -0
  238. package/src/Voip/signaling.d.ts +12 -0
  239. package/src/Voip/signaling.js +1100 -0
  240. package/src/Voip/types.d.ts +3 -0
  241. package/src/Voip/types.js +13 -0
  242. package/src/Voip/video-feeder.d.ts +25 -0
  243. package/src/Voip/video-feeder.js +269 -0
  244. package/src/Voip/wasm-engine.d.ts +27 -0
  245. package/src/Voip/wasm-engine.js +1308 -0
  246. package/src/Voip/worker-bootstrap.js +1024 -0
  247. package/src/WABinary/constants.d.ts +23 -0
  248. package/src/WABinary/constants.js +1301 -0
  249. package/src/WABinary/decode.d.ts +10 -0
  250. package/src/WABinary/decode.js +262 -0
  251. package/src/WABinary/encode.d.ts +3 -0
  252. package/src/WABinary/encode.js +220 -0
  253. package/src/WABinary/generic-utils.d.ts +77 -0
  254. package/src/WABinary/generic-utils.js +214 -0
  255. package/src/WABinary/index.d.ts +6 -0
  256. package/src/WABinary/index.js +6 -0
  257. package/src/WABinary/jid-utils.d.ts +31 -0
  258. package/src/WABinary/jid-utils.js +98 -0
  259. package/src/WABinary/types.d.ts +2 -0
  260. package/src/WABinary/types.js +1 -0
  261. package/src/WAM/BinaryInfo.d.ts +8 -0
  262. package/src/WAM/BinaryInfo.js +10 -0
  263. package/src/WAM/constants.d.ts +34927 -0
  264. package/src/WAM/constants.js +22853 -0
  265. package/src/WAM/encode.d.ts +2 -0
  266. package/src/WAM/encode.js +149 -0
  267. package/src/WAM/index.d.ts +4 -0
  268. package/src/WAM/index.js +4 -0
  269. package/src/WAUSync/Protocols/USyncContactProtocol.d.ts +37 -0
  270. package/src/WAUSync/Protocols/USyncContactProtocol.js +51 -0
  271. package/src/WAUSync/Protocols/USyncDeviceProtocol.d.ts +23 -0
  272. package/src/WAUSync/Protocols/USyncDeviceProtocol.js +52 -0
  273. package/src/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +13 -0
  274. package/src/WAUSync/Protocols/USyncDisappearingModeProtocol.js +27 -0
  275. package/src/WAUSync/Protocols/USyncStatusProtocol.d.ts +13 -0
  276. package/src/WAUSync/Protocols/USyncStatusProtocol.js +38 -0
  277. package/src/WAUSync/Protocols/USyncUsernameProtocol.d.ts +10 -0
  278. package/src/WAUSync/Protocols/USyncUsernameProtocol.js +24 -0
  279. package/src/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +39 -0
  280. package/src/WAUSync/Protocols/UsyncBotProfileProtocol.js +50 -0
  281. package/src/WAUSync/Protocols/UsyncLIDProtocol.d.ts +15 -0
  282. package/src/WAUSync/Protocols/UsyncLIDProtocol.js +29 -0
  283. package/src/WAUSync/Protocols/index.d.ts +6 -0
  284. package/src/WAUSync/Protocols/index.js +6 -0
  285. package/src/WAUSync/USyncQuery.d.ts +21 -0
  286. package/src/WAUSync/USyncQuery.js +94 -0
  287. package/src/WAUSync/USyncUser.d.ts +17 -0
  288. package/src/WAUSync/USyncUser.js +31 -0
  289. package/src/WAUSync/index.d.ts +4 -0
  290. package/src/WAUSync/index.js +4 -0
  291. package/src/assets/wasm/README.md +76 -0
  292. package/src/assets/wasm/loader.js +5 -0
  293. package/src/assets/wasm/whatsapp.wasm +0 -0
  294. package/src/assets/wasm/worker-modules.js +273 -0
  295. package/src/index.d.ts +49 -0
  296. package/src/index.js +54 -0
@@ -0,0 +1,422 @@
1
+ /* Elaina Baileys maintained distribution. Upstream notices and license are preserved in LICENSE and NOTICE.md. */
2
+ import { proto } from '../../WAProto/index.js';
3
+ import { WAMessageStubType } from '../Types/index.js';
4
+ import { generateMessageID, generateMessageIDV2, unixTimestampSeconds } from '../Utils/index.js';
5
+ import logger from '../Utils/logger.js';
6
+ import { getBinaryNodeChild, getBinaryNodeChildren, getBinaryNodeChildString, jidEncode, jidNormalizedUser } from '../WABinary/index.js';
7
+ import { makeBusinessSocket } from './business.js';
8
+ export const makeCommunitiesSocket = (config) => {
9
+ const sock = makeBusinessSocket(config);
10
+ const { authState, ev, query, upsertMessage } = sock;
11
+ const communityQuery = async (jid, type, content) => query({
12
+ tag: 'iq',
13
+ attrs: {
14
+ type,
15
+ xmlns: 'w:g2',
16
+ to: jid
17
+ },
18
+ content
19
+ });
20
+ const communityMetadata = async (jid) => {
21
+ const result = await communityQuery(jid, 'get', [{ tag: 'query', attrs: { request: 'interactive' } }]);
22
+ return extractCommunityMetadata(result);
23
+ };
24
+ const communityFetchAllParticipating = async () => {
25
+ const result = await query({
26
+ tag: 'iq',
27
+ attrs: {
28
+ to: '@g.us',
29
+ xmlns: 'w:g2',
30
+ type: 'get'
31
+ },
32
+ content: [
33
+ {
34
+ tag: 'participating',
35
+ attrs: {},
36
+ content: [
37
+ { tag: 'participants', attrs: {} },
38
+ { tag: 'description', attrs: {} }
39
+ ]
40
+ }
41
+ ]
42
+ });
43
+ const data = {};
44
+ const communitiesChild = getBinaryNodeChild(result, 'communities');
45
+ if (communitiesChild) {
46
+ const communities = getBinaryNodeChildren(communitiesChild, 'community');
47
+ for (const communityNode of communities) {
48
+ const meta = extractCommunityMetadata({
49
+ tag: 'result',
50
+ attrs: {},
51
+ content: [communityNode]
52
+ });
53
+ data[meta.id] = meta;
54
+ }
55
+ }
56
+ sock.ev.emit('groups.update', Object.values(data));
57
+ return data;
58
+ };
59
+ async function parseGroupResult(node) {
60
+ logger.info({ node }, 'parseGroupResult');
61
+ const groupNode = getBinaryNodeChild(node, 'group');
62
+ if (groupNode) {
63
+ try {
64
+ logger.info({ groupNode }, 'groupNode');
65
+ const metadata = await sock.groupMetadata(`${groupNode.attrs.id}@g.us`);
66
+ return metadata ? metadata : Optional.empty();
67
+ }
68
+ catch (error) {
69
+ console.error('Error parsing group metadata:', error);
70
+ return Optional.empty();
71
+ }
72
+ }
73
+ return Optional.empty();
74
+ }
75
+ const Optional = {
76
+ empty: () => null,
77
+ of: (value) => (value !== null ? { value } : null)
78
+ };
79
+ sock.ws.on('CB:ib,,dirty', async (node) => {
80
+ const { attrs } = getBinaryNodeChild(node, 'dirty');
81
+ if (attrs.type !== 'communities') {
82
+ return;
83
+ }
84
+ await communityFetchAllParticipating();
85
+ await sock.cleanDirtyBits('groups');
86
+ });
87
+ return {
88
+ ...sock,
89
+ communityQuery,
90
+ communityMetadata,
91
+ communityCreate: async (subject, body) => {
92
+ const descriptionId = generateMessageID().substring(0, 12);
93
+ const result = await communityQuery('@g.us', 'set', [
94
+ {
95
+ tag: 'create',
96
+ attrs: { subject },
97
+ content: [
98
+ {
99
+ tag: 'description',
100
+ attrs: { id: descriptionId },
101
+ content: [
102
+ {
103
+ tag: 'body',
104
+ attrs: {},
105
+ content: Buffer.from(body || '', 'utf-8')
106
+ }
107
+ ]
108
+ },
109
+ {
110
+ tag: 'parent',
111
+ attrs: { default_membership_approval_mode: 'request_required' }
112
+ },
113
+ {
114
+ tag: 'allow_non_admin_sub_group_creation',
115
+ attrs: {}
116
+ },
117
+ {
118
+ tag: 'create_general_chat',
119
+ attrs: {}
120
+ }
121
+ ]
122
+ }
123
+ ]);
124
+ return await parseGroupResult(result);
125
+ },
126
+ communityCreateGroup: async (subject, participants, parentCommunityJid) => {
127
+ const key = generateMessageIDV2();
128
+ const result = await communityQuery('@g.us', 'set', [
129
+ {
130
+ tag: 'create',
131
+ attrs: {
132
+ subject,
133
+ key
134
+ },
135
+ content: [
136
+ ...participants.map(jid => ({
137
+ tag: 'participant',
138
+ attrs: { jid }
139
+ })),
140
+ { tag: 'linked_parent', attrs: { jid: parentCommunityJid } }
141
+ ]
142
+ }
143
+ ]);
144
+ return await parseGroupResult(result);
145
+ },
146
+ communityLeave: async (id) => {
147
+ await communityQuery('@g.us', 'set', [
148
+ {
149
+ tag: 'leave',
150
+ attrs: {},
151
+ content: [{ tag: 'community', attrs: { id } }]
152
+ }
153
+ ]);
154
+ },
155
+ communityUpdateSubject: async (jid, subject) => {
156
+ await communityQuery(jid, 'set', [
157
+ {
158
+ tag: 'subject',
159
+ attrs: {},
160
+ content: Buffer.from(subject, 'utf-8')
161
+ }
162
+ ]);
163
+ },
164
+ communityLinkGroup: async (groupJid, parentCommunityJid) => {
165
+ await communityQuery(parentCommunityJid, 'set', [
166
+ {
167
+ tag: 'links',
168
+ attrs: {},
169
+ content: [
170
+ {
171
+ tag: 'link',
172
+ attrs: { link_type: 'sub_group' },
173
+ content: [{ tag: 'group', attrs: { jid: groupJid } }]
174
+ }
175
+ ]
176
+ }
177
+ ]);
178
+ },
179
+ communityUnlinkGroup: async (groupJid, parentCommunityJid) => {
180
+ await communityQuery(parentCommunityJid, 'set', [
181
+ {
182
+ tag: 'unlink',
183
+ attrs: { unlink_type: 'sub_group' },
184
+ content: [{ tag: 'group', attrs: { jid: groupJid } }]
185
+ }
186
+ ]);
187
+ },
188
+ communityFetchLinkedGroups: async (jid) => {
189
+ let communityJid = jid;
190
+ let isCommunity = false;
191
+
192
+ const metadata = await sock.groupMetadata(jid);
193
+ if (metadata.linkedParent) {
194
+
195
+ communityJid = metadata.linkedParent;
196
+ }
197
+ else {
198
+
199
+ isCommunity = true;
200
+ }
201
+
202
+ const result = await communityQuery(communityJid, 'get', [{ tag: 'sub_groups', attrs: {} }]);
203
+ const linkedGroupsData = [];
204
+ const subGroupsNode = getBinaryNodeChild(result, 'sub_groups');
205
+ if (subGroupsNode) {
206
+ const groupNodes = getBinaryNodeChildren(subGroupsNode, 'group');
207
+ for (const groupNode of groupNodes) {
208
+ linkedGroupsData.push({
209
+ id: groupNode.attrs.id ? jidEncode(groupNode.attrs.id, 'g.us') : undefined,
210
+ subject: groupNode.attrs.subject || '',
211
+ creation: groupNode.attrs.creation ? Number(groupNode.attrs.creation) : undefined,
212
+ owner: groupNode.attrs.creator ? jidNormalizedUser(groupNode.attrs.creator) : undefined,
213
+ size: groupNode.attrs.size ? Number(groupNode.attrs.size) : undefined
214
+ });
215
+ }
216
+ }
217
+ return {
218
+ communityJid,
219
+ isCommunity,
220
+ linkedGroups: linkedGroupsData
221
+ };
222
+ },
223
+ communityRequestParticipantsList: async (jid) => {
224
+ const result = await communityQuery(jid, 'get', [
225
+ {
226
+ tag: 'membership_approval_requests',
227
+ attrs: {}
228
+ }
229
+ ]);
230
+ const node = getBinaryNodeChild(result, 'membership_approval_requests');
231
+ const participants = getBinaryNodeChildren(node, 'membership_approval_request');
232
+ return participants.map(v => v.attrs);
233
+ },
234
+ communityRequestParticipantsUpdate: async (jid, participants, action) => {
235
+ const result = await communityQuery(jid, 'set', [
236
+ {
237
+ tag: 'membership_requests_action',
238
+ attrs: {},
239
+ content: [
240
+ {
241
+ tag: action,
242
+ attrs: {},
243
+ content: participants.map(jid => ({
244
+ tag: 'participant',
245
+ attrs: { jid }
246
+ }))
247
+ }
248
+ ]
249
+ }
250
+ ]);
251
+ const node = getBinaryNodeChild(result, 'membership_requests_action');
252
+ const nodeAction = getBinaryNodeChild(node, action);
253
+ const participantsAffected = getBinaryNodeChildren(nodeAction, 'participant');
254
+ return participantsAffected.map(p => {
255
+ return { status: p.attrs.error || '200', jid: p.attrs.jid };
256
+ });
257
+ },
258
+ communityParticipantsUpdate: async (jid, participants, action) => {
259
+ const result = await communityQuery(jid, 'set', [
260
+ {
261
+ tag: action,
262
+ attrs: action === 'remove' ? { linked_groups: 'true' } : {},
263
+ content: participants.map(jid => ({
264
+ tag: 'participant',
265
+ attrs: { jid }
266
+ }))
267
+ }
268
+ ]);
269
+ const node = getBinaryNodeChild(result, action);
270
+ const participantsAffected = getBinaryNodeChildren(node, 'participant');
271
+ return participantsAffected.map(p => {
272
+ return { status: p.attrs.error || '200', jid: p.attrs.jid, content: p };
273
+ });
274
+ },
275
+ communityUpdateDescription: async (jid, description) => {
276
+ const metadata = await communityMetadata(jid);
277
+ const prev = metadata.descId ?? null;
278
+ await communityQuery(jid, 'set', [
279
+ {
280
+ tag: 'description',
281
+ attrs: {
282
+ ...(description ? { id: generateMessageID() } : { delete: 'true' }),
283
+ ...(prev ? { prev } : {})
284
+ },
285
+ content: description ? [{ tag: 'body', attrs: {}, content: Buffer.from(description, 'utf-8') }] : undefined
286
+ }
287
+ ]);
288
+ },
289
+ communityInviteCode: async (jid) => {
290
+ const result = await communityQuery(jid, 'get', [{ tag: 'invite', attrs: {} }]);
291
+ const inviteNode = getBinaryNodeChild(result, 'invite');
292
+ return inviteNode?.attrs.code;
293
+ },
294
+ communityRevokeInvite: async (jid) => {
295
+ const result = await communityQuery(jid, 'set', [{ tag: 'invite', attrs: {} }]);
296
+ const inviteNode = getBinaryNodeChild(result, 'invite');
297
+ return inviteNode?.attrs.code;
298
+ },
299
+ communityAcceptInvite: async (code) => {
300
+ const results = await communityQuery('@g.us', 'set', [{ tag: 'invite', attrs: { code } }]);
301
+ const result = getBinaryNodeChild(results, 'community');
302
+ return result?.attrs.jid;
303
+ },
304
+
305
+ communityRevokeInviteV4: async (communityJid, invitedJid) => {
306
+ const result = await communityQuery(communityJid, 'set', [
307
+ { tag: 'revoke', attrs: {}, content: [{ tag: 'participant', attrs: { jid: invitedJid } }] }
308
+ ]);
309
+ return !!result;
310
+ },
311
+
312
+ communityAcceptInviteV4: ev.createBufferedFunction(async (key, inviteMessage) => {
313
+ key = typeof key === 'string' ? { remoteJid: key } : key;
314
+ const results = await communityQuery(inviteMessage.groupJid, 'set', [
315
+ {
316
+ tag: 'accept',
317
+ attrs: {
318
+ code: inviteMessage.inviteCode,
319
+ expiration: inviteMessage.inviteExpiration.toString(),
320
+ admin: key.remoteJid
321
+ }
322
+ }
323
+ ]);
324
+
325
+ if (key.id) {
326
+
327
+ inviteMessage = proto.Message.GroupInviteMessage.fromObject(inviteMessage);
328
+ inviteMessage.inviteExpiration = 0;
329
+ inviteMessage.inviteCode = '';
330
+ ev.emit('messages.update', [
331
+ {
332
+ key,
333
+ update: {
334
+ message: {
335
+ groupInviteMessage: inviteMessage
336
+ }
337
+ }
338
+ }
339
+ ]);
340
+ }
341
+
342
+ await upsertMessage({
343
+ key: {
344
+ remoteJid: inviteMessage.groupJid,
345
+ id: generateMessageIDV2(sock.user?.id),
346
+ fromMe: false,
347
+ participant: key.remoteJid
348
+ },
349
+ messageStubType: WAMessageStubType.GROUP_PARTICIPANT_ADD,
350
+ messageStubParameters: [JSON.stringify(authState.creds.me)],
351
+ participant: key.remoteJid,
352
+ messageTimestamp: unixTimestampSeconds()
353
+ }, 'notify');
354
+ return results.attrs.from;
355
+ }),
356
+ communityGetInviteInfo: async (code) => {
357
+ const results = await communityQuery('@g.us', 'get', [{ tag: 'invite', attrs: { code } }]);
358
+ return extractCommunityMetadata(results);
359
+ },
360
+ communityToggleEphemeral: async (jid, ephemeralExpiration) => {
361
+ const content = ephemeralExpiration
362
+ ? { tag: 'ephemeral', attrs: { expiration: ephemeralExpiration.toString() } }
363
+ : { tag: 'not_ephemeral', attrs: {} };
364
+ await communityQuery(jid, 'set', [content]);
365
+ },
366
+ communitySettingUpdate: async (jid, setting) => {
367
+ await communityQuery(jid, 'set', [{ tag: setting, attrs: {} }]);
368
+ },
369
+ communityMemberAddMode: async (jid, mode) => {
370
+ await communityQuery(jid, 'set', [{ tag: 'member_add_mode', attrs: {}, content: mode }]);
371
+ },
372
+ communityJoinApprovalMode: async (jid, mode) => {
373
+ await communityQuery(jid, 'set', [
374
+ { tag: 'membership_approval_mode', attrs: {}, content: [{ tag: 'community_join', attrs: { state: mode } }] }
375
+ ]);
376
+ },
377
+ communityFetchAllParticipating
378
+ };
379
+ };
380
+ export const extractCommunityMetadata = (result) => {
381
+ const community = getBinaryNodeChild(result, 'community');
382
+ const descChild = getBinaryNodeChild(community, 'description');
383
+ let desc;
384
+ let descId;
385
+ if (descChild) {
386
+ desc = getBinaryNodeChildString(descChild, 'body');
387
+ descId = descChild.attrs.id;
388
+ }
389
+ const communityId = community.attrs.id?.includes('@')
390
+ ? community.attrs.id
391
+ : jidEncode(community.attrs.id || '', 'g.us');
392
+ const eph = getBinaryNodeChild(community, 'ephemeral')?.attrs.expiration;
393
+ const memberAddMode = getBinaryNodeChildString(community, 'member_add_mode') === 'all_member_add';
394
+ const metadata = {
395
+ id: communityId,
396
+ subject: community.attrs.subject || '',
397
+ subjectOwner: community.attrs.s_o,
398
+ subjectTime: Number(community.attrs.s_t || 0),
399
+ size: getBinaryNodeChildren(community, 'participant').length,
400
+ creation: Number(community.attrs.creation || 0),
401
+ owner: community.attrs.creator ? jidNormalizedUser(community.attrs.creator) : undefined,
402
+ desc,
403
+ descId,
404
+ linkedParent: getBinaryNodeChild(community, 'linked_parent')?.attrs.jid || undefined,
405
+ restrict: !!getBinaryNodeChild(community, 'locked'),
406
+ announce: !!getBinaryNodeChild(community, 'announcement'),
407
+ isCommunity: !!getBinaryNodeChild(community, 'parent'),
408
+ isCommunityAnnounce: !!getBinaryNodeChild(community, 'default_sub_community'),
409
+ joinApprovalMode: !!getBinaryNodeChild(community, 'membership_approval_mode'),
410
+ memberAddMode,
411
+ participants: getBinaryNodeChildren(community, 'participant').map(({ attrs }) => {
412
+ return {
413
+
414
+ id: attrs.jid,
415
+ admin: (attrs.type || null)
416
+ };
417
+ }),
418
+ ephemeralDuration: eph ? +eph : undefined,
419
+ addressingMode: getBinaryNodeChildString(community, 'addressing_mode')
420
+ };
421
+ return metadata;
422
+ };