@sixcore/baileys 1.0.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 (278) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +606 -0
  3. package/WAProto/GenerateStatics.sh +4 -0
  4. package/WAProto/WAProto.proto +4357 -0
  5. package/WAProto/index.d.ts +50383 -0
  6. package/WAProto/index.js +155693 -0
  7. package/WASignalGroup/GroupProtocol.js +1697 -0
  8. package/WASignalGroup/ciphertext_message.js +16 -0
  9. package/WASignalGroup/generate-proto.sh +1 -0
  10. package/WASignalGroup/group.proto +42 -0
  11. package/WASignalGroup/group_cipher.js +120 -0
  12. package/WASignalGroup/group_session_builder.js +46 -0
  13. package/WASignalGroup/index.js +5 -0
  14. package/WASignalGroup/keyhelper.js +21 -0
  15. package/WASignalGroup/protobufs.js +3 -0
  16. package/WASignalGroup/queue_job.js +69 -0
  17. package/WASignalGroup/sender_chain_key.js +50 -0
  18. package/WASignalGroup/sender_key_distribution_message.js +78 -0
  19. package/WASignalGroup/sender_key_message.js +92 -0
  20. package/WASignalGroup/sender_key_name.js +70 -0
  21. package/WASignalGroup/sender_key_record.js +56 -0
  22. package/WASignalGroup/sender_key_state.js +129 -0
  23. package/WASignalGroup/sender_message_key.js +39 -0
  24. package/lib/Defaults/baileys-version.json +3 -0
  25. package/lib/Defaults/index.d.ts +53 -0
  26. package/lib/Defaults/index.js +108 -0
  27. package/lib/Signal/libsignal.d.ts +3 -0
  28. package/lib/Signal/libsignal.js +152 -0
  29. package/lib/Socket/Client/abstract-socket-client.d.ts +17 -0
  30. package/lib/Socket/Client/abstract-socket-client.js +13 -0
  31. package/lib/Socket/Client/index.d.ts +3 -0
  32. package/lib/Socket/Client/index.js +19 -0
  33. package/lib/Socket/Client/mobile-socket-client.d.ts +13 -0
  34. package/lib/Socket/Client/mobile-socket-client.js +65 -0
  35. package/lib/Socket/Client/web-socket-client.d.ts +12 -0
  36. package/lib/Socket/Client/web-socket-client.js +62 -0
  37. package/lib/Socket/business.d.ts +170 -0
  38. package/lib/Socket/business.js +260 -0
  39. package/lib/Socket/chats.d.ts +81 -0
  40. package/lib/Socket/chats.js +950 -0
  41. package/lib/Socket/groups.d.ts +115 -0
  42. package/lib/Socket/groups.js +315 -0
  43. package/lib/Socket/index.d.ts +172 -0
  44. package/lib/Socket/index.js +10 -0
  45. package/lib/Socket/messages-recv.d.ts +158 -0
  46. package/lib/Socket/messages-recv.js +972 -0
  47. package/lib/Socket/messages-send.d.ts +155 -0
  48. package/lib/Socket/messages-send.js +1087 -0
  49. package/lib/Socket/newsletter.d.ts +132 -0
  50. package/lib/Socket/newsletter.js +236 -0
  51. package/lib/Socket/registration.d.ts +264 -0
  52. package/lib/Socket/registration.js +166 -0
  53. package/lib/Socket/socket.d.ts +44 -0
  54. package/lib/Socket/socket.js +643 -0
  55. package/lib/Socket/usync.d.ts +37 -0
  56. package/lib/Socket/usync.js +70 -0
  57. package/lib/Store/index.d.ts +3 -0
  58. package/lib/Store/index.js +10 -0
  59. package/lib/Store/make-cache-manager-store.d.ts +14 -0
  60. package/lib/Store/make-cache-manager-store.js +83 -0
  61. package/lib/Store/make-in-memory-store.d.ts +118 -0
  62. package/lib/Store/make-in-memory-store.js +431 -0
  63. package/lib/Store/make-ordered-dictionary.d.ts +13 -0
  64. package/lib/Store/make-ordered-dictionary.js +81 -0
  65. package/lib/Store/object-repository.d.ts +10 -0
  66. package/lib/Store/object-repository.js +27 -0
  67. package/lib/Types/Auth.d.ts +109 -0
  68. package/lib/Types/Auth.js +2 -0
  69. package/lib/Types/Call.d.ts +13 -0
  70. package/lib/Types/Call.js +2 -0
  71. package/lib/Types/Chat.d.ts +107 -0
  72. package/lib/Types/Chat.js +4 -0
  73. package/lib/Types/Contact.d.ts +19 -0
  74. package/lib/Types/Contact.js +2 -0
  75. package/lib/Types/Events.d.ts +172 -0
  76. package/lib/Types/Events.js +2 -0
  77. package/lib/Types/GroupMetadata.d.ts +56 -0
  78. package/lib/Types/GroupMetadata.js +2 -0
  79. package/lib/Types/Label.d.ts +46 -0
  80. package/lib/Types/Label.js +27 -0
  81. package/lib/Types/LabelAssociation.d.ts +29 -0
  82. package/lib/Types/LabelAssociation.js +9 -0
  83. package/lib/Types/Message.d.ts +433 -0
  84. package/lib/Types/Message.js +9 -0
  85. package/lib/Types/Newsletter.d.ts +92 -0
  86. package/lib/Types/Newsletter.js +32 -0
  87. package/lib/Types/Product.d.ts +78 -0
  88. package/lib/Types/Product.js +2 -0
  89. package/lib/Types/Signal.d.ts +57 -0
  90. package/lib/Types/Signal.js +2 -0
  91. package/lib/Types/Socket.d.ts +116 -0
  92. package/lib/Types/Socket.js +2 -0
  93. package/lib/Types/State.d.ts +27 -0
  94. package/lib/Types/State.js +2 -0
  95. package/lib/Types/USync.d.ts +25 -0
  96. package/lib/Types/USync.js +2 -0
  97. package/lib/Types/index.d.ts +66 -0
  98. package/lib/Types/index.js +42 -0
  99. package/lib/Utils/auth-utils.d.ts +18 -0
  100. package/lib/Utils/auth-utils.js +227 -0
  101. package/lib/Utils/baileys-event-stream.d.ts +16 -0
  102. package/lib/Utils/baileys-event-stream.js +63 -0
  103. package/lib/Utils/business.d.ts +22 -0
  104. package/lib/Utils/business.js +234 -0
  105. package/lib/Utils/chat-utils.d.ts +70 -0
  106. package/lib/Utils/chat-utils.js +745 -0
  107. package/lib/Utils/crypto.d.ts +40 -0
  108. package/lib/Utils/crypto.js +199 -0
  109. package/lib/Utils/decode-wa-message.d.ts +36 -0
  110. package/lib/Utils/decode-wa-message.js +234 -0
  111. package/lib/Utils/event-buffer.d.ts +35 -0
  112. package/lib/Utils/event-buffer.js +517 -0
  113. package/lib/Utils/generics.d.ts +88 -0
  114. package/lib/Utils/generics.js +402 -0
  115. package/lib/Utils/history.d.ts +19 -0
  116. package/lib/Utils/history.js +94 -0
  117. package/lib/Utils/index.d.ts +17 -0
  118. package/lib/Utils/index.js +33 -0
  119. package/lib/Utils/link-preview.d.ts +21 -0
  120. package/lib/Utils/link-preview.js +93 -0
  121. package/lib/Utils/logger.d.ts +2 -0
  122. package/lib/Utils/logger.js +7 -0
  123. package/lib/Utils/lt-hash.d.ts +12 -0
  124. package/lib/Utils/lt-hash.js +51 -0
  125. package/lib/Utils/make-mutex.d.ts +7 -0
  126. package/lib/Utils/make-mutex.js +43 -0
  127. package/lib/Utils/messages-media.d.ts +113 -0
  128. package/lib/Utils/messages-media.js +643 -0
  129. package/lib/Utils/messages.d.ts +77 -0
  130. package/lib/Utils/messages.js +1221 -0
  131. package/lib/Utils/noise-handler.d.ts +20 -0
  132. package/lib/Utils/noise-handler.js +160 -0
  133. package/lib/Utils/process-message.d.ts +41 -0
  134. package/lib/Utils/process-message.js +373 -0
  135. package/lib/Utils/signal.d.ts +33 -0
  136. package/lib/Utils/signal.js +159 -0
  137. package/lib/Utils/use-multi-file-auth-state.d.ts +12 -0
  138. package/lib/Utils/use-multi-file-auth-state.js +295 -0
  139. package/lib/Utils/use-single-file-auth-state.d.ts +12 -0
  140. package/lib/Utils/use-single-file-auth-state.js +75 -0
  141. package/lib/Utils/validate-connection.d.ts +11 -0
  142. package/lib/Utils/validate-connection.js +205 -0
  143. package/lib/WABinary/constants.d.ts +27 -0
  144. package/lib/WABinary/constants.js +40 -0
  145. package/lib/WABinary/decode.d.ts +6 -0
  146. package/lib/WABinary/decode.js +264 -0
  147. package/lib/WABinary/encode.d.ts +2 -0
  148. package/lib/WABinary/encode.js +252 -0
  149. package/lib/WABinary/generic-utils.d.ts +14 -0
  150. package/lib/WABinary/generic-utils.js +110 -0
  151. package/lib/WABinary/index.d.ts +5 -0
  152. package/lib/WABinary/index.js +21 -0
  153. package/lib/WABinary/jid-utils.d.ts +31 -0
  154. package/lib/WABinary/jid-utils.js +62 -0
  155. package/lib/WABinary/types.d.ts +18 -0
  156. package/lib/WABinary/types.js +2 -0
  157. package/lib/WAM/BinaryInfo.d.ts +8 -0
  158. package/lib/WAM/BinaryInfo.js +13 -0
  159. package/lib/WAM/constants.d.ts +38 -0
  160. package/lib/WAM/constants.js +15350 -0
  161. package/lib/WAM/encode.d.ts +2 -0
  162. package/lib/WAM/encode.js +155 -0
  163. package/lib/WAM/index.d.ts +3 -0
  164. package/lib/WAM/index.js +19 -0
  165. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -0
  166. package/lib/WAUSync/Protocols/USyncContactProtocol.js +32 -0
  167. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -0
  168. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +57 -0
  169. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  170. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +30 -0
  171. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  172. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +42 -0
  173. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +25 -0
  174. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +53 -0
  175. package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +8 -0
  176. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +24 -0
  177. package/lib/WAUSync/Protocols/index.d.ts +4 -0
  178. package/lib/WAUSync/Protocols/index.js +20 -0
  179. package/lib/WAUSync/USyncQuery.d.ts +28 -0
  180. package/lib/WAUSync/USyncQuery.js +89 -0
  181. package/lib/WAUSync/USyncUser.d.ts +10 -0
  182. package/lib/WAUSync/USyncUser.js +26 -0
  183. package/lib/WAUSync/index.d.ts +3 -0
  184. package/lib/WAUSync/index.js +19 -0
  185. package/lib/index.js +31 -0
  186. package/package.json +51 -0
  187. package/src/Defaults/baileys-version.json +3 -0
  188. package/src/Defaults/index.ts +133 -0
  189. package/src/Signal/Group/ciphertext-message.ts +9 -0
  190. package/src/Signal/Group/group-session-builder.ts +56 -0
  191. package/src/Signal/Group/group_cipher.ts +117 -0
  192. package/src/Signal/Group/index.ts +11 -0
  193. package/src/Signal/Group/keyhelper.ts +28 -0
  194. package/src/Signal/Group/sender-chain-key.ts +34 -0
  195. package/src/Signal/Group/sender-key-distribution-message.ts +95 -0
  196. package/src/Signal/Group/sender-key-message.ts +96 -0
  197. package/src/Signal/Group/sender-key-name.ts +66 -0
  198. package/src/Signal/Group/sender-key-record.ts +69 -0
  199. package/src/Signal/Group/sender-key-state.ts +134 -0
  200. package/src/Signal/Group/sender-message-key.ts +36 -0
  201. package/src/Signal/libsignal.ts +447 -0
  202. package/src/Signal/lid-mapping.ts +209 -0
  203. package/src/Socket/Client/index.ts +2 -0
  204. package/src/Socket/Client/types.ts +22 -0
  205. package/src/Socket/Client/websocket.ts +56 -0
  206. package/src/Socket/business.ts +421 -0
  207. package/src/Socket/chats.ts +1223 -0
  208. package/src/Socket/communities.ts +477 -0
  209. package/src/Socket/groups.ts +361 -0
  210. package/src/Socket/index.ts +22 -0
  211. package/src/Socket/messages-recv.ts +1563 -0
  212. package/src/Socket/messages-send.ts +1210 -0
  213. package/src/Socket/mex.ts +58 -0
  214. package/src/Socket/newsletter.ts +229 -0
  215. package/src/Socket/socket.ts +1072 -0
  216. package/src/Types/Auth.ts +115 -0
  217. package/src/Types/Bussines.ts +20 -0
  218. package/src/Types/Call.ts +14 -0
  219. package/src/Types/Chat.ts +138 -0
  220. package/src/Types/Contact.ts +24 -0
  221. package/src/Types/Events.ts +132 -0
  222. package/src/Types/GroupMetadata.ts +70 -0
  223. package/src/Types/Label.ts +48 -0
  224. package/src/Types/LabelAssociation.ts +35 -0
  225. package/src/Types/Message.ts +424 -0
  226. package/src/Types/Newsletter.ts +98 -0
  227. package/src/Types/Product.ts +85 -0
  228. package/src/Types/Signal.ts +76 -0
  229. package/src/Types/Socket.ts +150 -0
  230. package/src/Types/State.ts +43 -0
  231. package/src/Types/USync.ts +27 -0
  232. package/src/Types/globals.d.ts +8 -0
  233. package/src/Types/index.ts +67 -0
  234. package/src/Utils/auth-utils.ts +331 -0
  235. package/src/Utils/browser-utils.ts +31 -0
  236. package/src/Utils/business.ts +286 -0
  237. package/src/Utils/chat-utils.ts +933 -0
  238. package/src/Utils/crypto.ts +184 -0
  239. package/src/Utils/decode-wa-message.ts +355 -0
  240. package/src/Utils/event-buffer.ts +662 -0
  241. package/src/Utils/generics.ts +470 -0
  242. package/src/Utils/history.ts +114 -0
  243. package/src/Utils/index.ts +18 -0
  244. package/src/Utils/link-preview.ts +111 -0
  245. package/src/Utils/logger.ts +13 -0
  246. package/src/Utils/lt-hash.ts +65 -0
  247. package/src/Utils/make-mutex.ts +45 -0
  248. package/src/Utils/message-retry-manager.ts +229 -0
  249. package/src/Utils/messages-media.ts +820 -0
  250. package/src/Utils/messages.ts +1137 -0
  251. package/src/Utils/noise-handler.ts +192 -0
  252. package/src/Utils/pre-key-manager.ts +126 -0
  253. package/src/Utils/process-message.ts +622 -0
  254. package/src/Utils/signal.ts +214 -0
  255. package/src/Utils/use-multi-file-auth-state.ts +136 -0
  256. package/src/Utils/validate-connection.ts +253 -0
  257. package/src/WABinary/constants.ts +1305 -0
  258. package/src/WABinary/decode.ts +281 -0
  259. package/src/WABinary/encode.ts +253 -0
  260. package/src/WABinary/generic-utils.ts +127 -0
  261. package/src/WABinary/index.ts +5 -0
  262. package/src/WABinary/jid-utils.ts +128 -0
  263. package/src/WABinary/types.ts +17 -0
  264. package/src/WAM/BinaryInfo.ts +12 -0
  265. package/src/WAM/constants.ts +22889 -0
  266. package/src/WAM/encode.ts +169 -0
  267. package/src/WAM/index.ts +3 -0
  268. package/src/WAUSync/Protocols/USyncContactProtocol.ts +32 -0
  269. package/src/WAUSync/Protocols/USyncDeviceProtocol.ts +78 -0
  270. package/src/WAUSync/Protocols/USyncDisappearingModeProtocol.ts +35 -0
  271. package/src/WAUSync/Protocols/USyncStatusProtocol.ts +44 -0
  272. package/src/WAUSync/Protocols/UsyncBotProfileProtocol.ts +76 -0
  273. package/src/WAUSync/Protocols/UsyncLIDProtocol.ts +33 -0
  274. package/src/WAUSync/Protocols/index.ts +4 -0
  275. package/src/WAUSync/USyncQuery.ts +133 -0
  276. package/src/WAUSync/USyncUser.ts +32 -0
  277. package/src/WAUSync/index.ts +3 -0
  278. package/src/index.ts +13 -0
@@ -0,0 +1,361 @@
1
+ import { proto } from '../../WAProto/index.js'
2
+ import type { GroupMetadata, GroupParticipant, ParticipantAction, SocketConfig, WAMessageKey } from '../Types'
3
+ import { WAMessageAddressingMode, WAMessageStubType } from '../Types'
4
+ import { generateMessageIDV2, unixTimestampSeconds } from '../Utils'
5
+ import {
6
+ type BinaryNode,
7
+ getBinaryNodeChild,
8
+ getBinaryNodeChildren,
9
+ getBinaryNodeChildString,
10
+ isLidUser,
11
+ isPnUser,
12
+ jidEncode,
13
+ jidNormalizedUser
14
+ } from '../WABinary'
15
+ import { makeChatsSocket } from './chats'
16
+
17
+ export const makeGroupsSocket = (config: SocketConfig) => {
18
+ const sock = makeChatsSocket(config)
19
+ const { authState, ev, query, upsertMessage } = sock
20
+
21
+ const groupQuery = async (jid: string, type: 'get' | 'set', content: BinaryNode[]) =>
22
+ query({
23
+ tag: 'iq',
24
+ attrs: {
25
+ type,
26
+ xmlns: 'w:g2',
27
+ to: jid
28
+ },
29
+ content
30
+ })
31
+
32
+ const groupMetadata = async (jid: string) => {
33
+ const result = await groupQuery(jid, 'get', [{ tag: 'query', attrs: { request: 'interactive' } }])
34
+ return extractGroupMetadata(result)
35
+ }
36
+
37
+ const groupFetchAllParticipating = async () => {
38
+ const result = await query({
39
+ tag: 'iq',
40
+ attrs: {
41
+ to: '@g.us',
42
+ xmlns: 'w:g2',
43
+ type: 'get'
44
+ },
45
+ content: [
46
+ {
47
+ tag: 'participating',
48
+ attrs: {},
49
+ content: [
50
+ { tag: 'participants', attrs: {} },
51
+ { tag: 'description', attrs: {} }
52
+ ]
53
+ }
54
+ ]
55
+ })
56
+ const data: { [_: string]: GroupMetadata } = {}
57
+ const groupsChild = getBinaryNodeChild(result, 'groups')
58
+ if (groupsChild) {
59
+ const groups = getBinaryNodeChildren(groupsChild, 'group')
60
+ for (const groupNode of groups) {
61
+ const meta = extractGroupMetadata({
62
+ tag: 'result',
63
+ attrs: {},
64
+ content: [groupNode]
65
+ })
66
+ data[meta.id] = meta
67
+ }
68
+ }
69
+
70
+ // TODO: properly parse LID / PN DATA
71
+ sock.ev.emit('groups.update', Object.values(data))
72
+
73
+ return data
74
+ }
75
+
76
+ sock.ws.on('CB:ib,,dirty', async (node: BinaryNode) => {
77
+ const { attrs } = getBinaryNodeChild(node, 'dirty')!
78
+ if (attrs.type !== 'groups') {
79
+ return
80
+ }
81
+
82
+ await groupFetchAllParticipating()
83
+ await sock.cleanDirtyBits('groups')
84
+ })
85
+
86
+ return {
87
+ ...sock,
88
+ groupMetadata,
89
+ groupCreate: async (subject: string, participants: string[]) => {
90
+ const key = generateMessageIDV2()
91
+ const result = await groupQuery('@g.us', 'set', [
92
+ {
93
+ tag: 'create',
94
+ attrs: {
95
+ subject,
96
+ key
97
+ },
98
+ content: participants.map(jid => ({
99
+ tag: 'participant',
100
+ attrs: { jid }
101
+ }))
102
+ }
103
+ ])
104
+ return extractGroupMetadata(result)
105
+ },
106
+ groupLeave: async (id: string) => {
107
+ await groupQuery('@g.us', 'set', [
108
+ {
109
+ tag: 'leave',
110
+ attrs: {},
111
+ content: [{ tag: 'group', attrs: { id } }]
112
+ }
113
+ ])
114
+ },
115
+ groupUpdateSubject: async (jid: string, subject: string) => {
116
+ await groupQuery(jid, 'set', [
117
+ {
118
+ tag: 'subject',
119
+ attrs: {},
120
+ content: Buffer.from(subject, 'utf-8')
121
+ }
122
+ ])
123
+ },
124
+ groupRequestParticipantsList: async (jid: string) => {
125
+ const result = await groupQuery(jid, 'get', [
126
+ {
127
+ tag: 'membership_approval_requests',
128
+ attrs: {}
129
+ }
130
+ ])
131
+ const node = getBinaryNodeChild(result, 'membership_approval_requests')
132
+ const participants = getBinaryNodeChildren(node, 'membership_approval_request')
133
+ return participants.map(v => v.attrs)
134
+ },
135
+ groupRequestParticipantsUpdate: async (jid: string, participants: string[], action: 'approve' | 'reject') => {
136
+ const result = await groupQuery(jid, 'set', [
137
+ {
138
+ tag: 'membership_requests_action',
139
+ attrs: {},
140
+ content: [
141
+ {
142
+ tag: action,
143
+ attrs: {},
144
+ content: participants.map(jid => ({
145
+ tag: 'participant',
146
+ attrs: { jid }
147
+ }))
148
+ }
149
+ ]
150
+ }
151
+ ])
152
+ const node = getBinaryNodeChild(result, 'membership_requests_action')
153
+ const nodeAction = getBinaryNodeChild(node, action)
154
+ const participantsAffected = getBinaryNodeChildren(nodeAction, 'participant')
155
+ return participantsAffected.map(p => {
156
+ return { status: p.attrs.error || '200', jid: p.attrs.jid }
157
+ })
158
+ },
159
+ groupParticipantsUpdate: async (jid: string, participants: string[], action: ParticipantAction) => {
160
+ const result = await groupQuery(jid, 'set', [
161
+ {
162
+ tag: action,
163
+ attrs: {},
164
+ content: participants.map(jid => ({
165
+ tag: 'participant',
166
+ attrs: { jid }
167
+ }))
168
+ }
169
+ ])
170
+ const node = getBinaryNodeChild(result, action)
171
+ const participantsAffected = getBinaryNodeChildren(node, 'participant')
172
+ return participantsAffected.map(p => {
173
+ return { status: p.attrs.error || '200', jid: p.attrs.jid, content: p }
174
+ })
175
+ },
176
+ groupUpdateDescription: async (jid: string, description?: string) => {
177
+ const metadata = await groupMetadata(jid)
178
+ const prev = metadata.descId ?? null
179
+
180
+ await groupQuery(jid, 'set', [
181
+ {
182
+ tag: 'description',
183
+ attrs: {
184
+ ...(description ? { id: generateMessageIDV2() } : { delete: 'true' }),
185
+ ...(prev ? { prev } : {})
186
+ },
187
+ content: description ? [{ tag: 'body', attrs: {}, content: Buffer.from(description, 'utf-8') }] : undefined
188
+ }
189
+ ])
190
+ },
191
+ groupInviteCode: async (jid: string) => {
192
+ const result = await groupQuery(jid, 'get', [{ tag: 'invite', attrs: {} }])
193
+ const inviteNode = getBinaryNodeChild(result, 'invite')
194
+ return inviteNode?.attrs.code
195
+ },
196
+ groupRevokeInvite: async (jid: string) => {
197
+ const result = await groupQuery(jid, 'set', [{ tag: 'invite', attrs: {} }])
198
+ const inviteNode = getBinaryNodeChild(result, 'invite')
199
+ return inviteNode?.attrs.code
200
+ },
201
+ groupAcceptInvite: async (code: string) => {
202
+ const results = await groupQuery('@g.us', 'set', [{ tag: 'invite', attrs: { code } }])
203
+ const result = getBinaryNodeChild(results, 'group')
204
+ return result?.attrs.jid
205
+ },
206
+
207
+ /**
208
+ * revoke a v4 invite for someone
209
+ * @param groupJid group jid
210
+ * @param invitedJid jid of person you invited
211
+ * @returns true if successful
212
+ */
213
+ groupRevokeInviteV4: async (groupJid: string, invitedJid: string) => {
214
+ const result = await groupQuery(groupJid, 'set', [
215
+ { tag: 'revoke', attrs: {}, content: [{ tag: 'participant', attrs: { jid: invitedJid } }] }
216
+ ])
217
+ return !!result
218
+ },
219
+
220
+ /**
221
+ * accept a GroupInviteMessage
222
+ * @param key the key of the invite message, or optionally only provide the jid of the person who sent the invite
223
+ * @param inviteMessage the message to accept
224
+ */
225
+ groupAcceptInviteV4: ev.createBufferedFunction(
226
+ async (key: string | WAMessageKey, inviteMessage: proto.Message.IGroupInviteMessage) => {
227
+ key = typeof key === 'string' ? { remoteJid: key } : key
228
+ const results = await groupQuery(inviteMessage.groupJid!, 'set', [
229
+ {
230
+ tag: 'accept',
231
+ attrs: {
232
+ code: inviteMessage.inviteCode!,
233
+ expiration: inviteMessage.inviteExpiration!.toString(),
234
+ admin: key.remoteJid!
235
+ }
236
+ }
237
+ ])
238
+
239
+ // if we have the full message key
240
+ // update the invite message to be expired
241
+ if (key.id) {
242
+ // create new invite message that is expired
243
+ inviteMessage = proto.Message.GroupInviteMessage.fromObject(inviteMessage)
244
+ inviteMessage.inviteExpiration = 0
245
+ inviteMessage.inviteCode = ''
246
+ ev.emit('messages.update', [
247
+ {
248
+ key,
249
+ update: {
250
+ message: {
251
+ groupInviteMessage: inviteMessage
252
+ }
253
+ }
254
+ }
255
+ ])
256
+ }
257
+
258
+ // generate the group add message
259
+ await upsertMessage(
260
+ {
261
+ key: {
262
+ remoteJid: inviteMessage.groupJid,
263
+ id: generateMessageIDV2(sock.user?.id),
264
+ fromMe: false,
265
+ participant: key.remoteJid
266
+ },
267
+ messageStubType: WAMessageStubType.GROUP_PARTICIPANT_ADD,
268
+ messageStubParameters: [JSON.stringify(authState.creds.me)],
269
+ participant: key.remoteJid,
270
+ messageTimestamp: unixTimestampSeconds()
271
+ },
272
+ 'notify'
273
+ )
274
+
275
+ return results.attrs.from
276
+ }
277
+ ),
278
+ groupGetInviteInfo: async (code: string) => {
279
+ const results = await groupQuery('@g.us', 'get', [{ tag: 'invite', attrs: { code } }])
280
+ return extractGroupMetadata(results)
281
+ },
282
+ groupToggleEphemeral: async (jid: string, ephemeralExpiration: number) => {
283
+ const content: BinaryNode = ephemeralExpiration
284
+ ? { tag: 'ephemeral', attrs: { expiration: ephemeralExpiration.toString() } }
285
+ : { tag: 'not_ephemeral', attrs: {} }
286
+ await groupQuery(jid, 'set', [content])
287
+ },
288
+ groupSettingUpdate: async (jid: string, setting: 'announcement' | 'not_announcement' | 'locked' | 'unlocked') => {
289
+ await groupQuery(jid, 'set', [{ tag: setting, attrs: {} }])
290
+ },
291
+ groupMemberAddMode: async (jid: string, mode: 'admin_add' | 'all_member_add') => {
292
+ await groupQuery(jid, 'set', [{ tag: 'member_add_mode', attrs: {}, content: mode }])
293
+ },
294
+ groupJoinApprovalMode: async (jid: string, mode: 'on' | 'off') => {
295
+ await groupQuery(jid, 'set', [
296
+ { tag: 'membership_approval_mode', attrs: {}, content: [{ tag: 'group_join', attrs: { state: mode } }] }
297
+ ])
298
+ },
299
+ groupFetchAllParticipating
300
+ }
301
+ }
302
+
303
+ export const extractGroupMetadata = (result: BinaryNode) => {
304
+ const group = getBinaryNodeChild(result, 'group')!
305
+ const descChild = getBinaryNodeChild(group, 'description')
306
+ let desc: string | undefined
307
+ let descId: string | undefined
308
+ let descOwner: string | undefined
309
+ let descOwnerPn: string | undefined
310
+ let descTime: number | undefined
311
+ if (descChild) {
312
+ desc = getBinaryNodeChildString(descChild, 'body')
313
+ descOwner = descChild.attrs.participant ? jidNormalizedUser(descChild.attrs.participant) : undefined
314
+ descOwnerPn = descChild.attrs.participant_pn ? jidNormalizedUser(descChild.attrs.participant_pn) : undefined
315
+ descTime = +descChild.attrs.t!
316
+ descId = descChild.attrs.id
317
+ }
318
+
319
+ const groupId = group.attrs.id!.includes('@') ? group.attrs.id : jidEncode(group.attrs.id!, 'g.us')
320
+ const eph = getBinaryNodeChild(group, 'ephemeral')?.attrs.expiration
321
+ const memberAddMode = getBinaryNodeChildString(group, 'member_add_mode') === 'all_member_add'
322
+ const metadata: GroupMetadata = {
323
+ id: groupId!,
324
+ notify: group.attrs.notify,
325
+ addressingMode: group.attrs.addressing_mode === 'lid' ? WAMessageAddressingMode.LID : WAMessageAddressingMode.PN,
326
+ subject: group.attrs.subject!,
327
+ subjectOwner: group.attrs.s_o,
328
+ subjectOwnerPn: group.attrs.s_o_pn,
329
+ subjectTime: +group.attrs.s_t!,
330
+ size: group.attrs.size ? +group.attrs.size : getBinaryNodeChildren(group, 'participant').length,
331
+ creation: +group.attrs.creation!,
332
+ owner: group.attrs.creator ? jidNormalizedUser(group.attrs.creator) : undefined,
333
+ ownerPn: group.attrs.creator_pn ? jidNormalizedUser(group.attrs.creator_pn) : undefined,
334
+ owner_country_code: group.attrs.creator_country_code,
335
+ desc,
336
+ descId,
337
+ descOwner,
338
+ descOwnerPn,
339
+ descTime,
340
+ linkedParent: getBinaryNodeChild(group, 'linked_parent')?.attrs.jid || undefined,
341
+ restrict: !!getBinaryNodeChild(group, 'locked'),
342
+ announce: !!getBinaryNodeChild(group, 'announcement'),
343
+ isCommunity: !!getBinaryNodeChild(group, 'parent'),
344
+ isCommunityAnnounce: !!getBinaryNodeChild(group, 'default_sub_group'),
345
+ joinApprovalMode: !!getBinaryNodeChild(group, 'membership_approval_mode'),
346
+ memberAddMode,
347
+ participants: getBinaryNodeChildren(group, 'participant').map(({ attrs }) => {
348
+ // TODO: Store LID MAPPINGS
349
+ return {
350
+ id: attrs.jid!,
351
+ phoneNumber: isLidUser(attrs.jid) && isPnUser(attrs.phone_number) ? attrs.phone_number : undefined,
352
+ lid: isPnUser(attrs.jid) && isLidUser(attrs.lid) ? attrs.lid : undefined,
353
+ admin: (attrs.type || null) as GroupParticipant['admin']
354
+ }
355
+ }),
356
+ ephemeralDuration: eph ? +eph : undefined
357
+ }
358
+ return metadata
359
+ }
360
+
361
+ export type GroupsSocket = ReturnType<typeof makeGroupsSocket>
@@ -0,0 +1,22 @@
1
+ import { DEFAULT_CONNECTION_CONFIG } from '../Defaults'
2
+ import type { UserFacingSocketConfig } from '../Types'
3
+ import { makeCommunitiesSocket } from './communities'
4
+
5
+ // export the last socket layer
6
+ const makeWASocket = (config: UserFacingSocketConfig) => {
7
+ const newConfig = {
8
+ ...DEFAULT_CONNECTION_CONFIG,
9
+ ...config
10
+ }
11
+
12
+ // If the user hasn't provided their own history sync function,
13
+ // let's create a default one that respects the syncFullHistory flag.
14
+ // TODO: Change
15
+ if (config.shouldSyncHistoryMessage === undefined) {
16
+ newConfig.shouldSyncHistoryMessage = () => !!newConfig.syncFullHistory
17
+ }
18
+
19
+ return makeCommunitiesSocket(newConfig)
20
+ }
21
+
22
+ export default makeWASocket