@open-wa/wa-automate 4.68.0 → 4.70.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/lib/wapi.js CHANGED
@@ -7,91 +7,63 @@
7
7
  * functions and creates the Store object.
8
8
  */
9
9
 
10
- if (!window.Store||!window.Store.Msg) {
10
+ if (!window.Store || !window.Store.Msg) {
11
11
  (function () {
12
- function getStore(modules) {
13
- let foundCount = 0;
12
+ function getStore() {
14
13
  let neededObjects = [
15
- { id: "Store", conditions: (module) => (module.default && module.default.Chat && module.default.Msg) ? module.default : null},
16
- { id: "MediaCollection", conditions: (module) => (module.default && module.default.prototype && (module.default.prototype.processFiles !== undefined||module.default.prototype.processAttachments !== undefined)) ? module.default : null },
17
- { id: "MediaProcess", conditions: (module) => (module.BLOB) ? module : null },
18
- { id: "Archive", conditions: (module) => (module.setArchive) ? module : null },
19
- { id: "Block", conditions: (module) => (module.blockContact && module.unblockContact) ? module : null },
20
- { id: "ChatUtil", conditions: (module) => (module.sendClear) ? module : null },
21
- { id: "GroupInvite", conditions: (module) => (module.queryGroupInviteCode) ? module : null },
22
- { id: "Wap", conditions: (module) => (module.createGroup) ? module : null },
23
- { id: "ServiceWorker", conditions: (module) => (module.default && module.default.killServiceWorker) ? module : null },
24
- { id: "State", conditions: (module) => (module.STATE && module.STREAM) ? module : null },
25
- { id: "_Presence", conditions: (module) => (module.setPresenceAvailable && module.setPresenceUnavailable) ? module : null },
26
- { id: "WapDelete", conditions: (module) => (module.sendConversationDelete && module.sendConversationDelete.length == 2) ? module : null },
27
- { id: "Conn", conditions: (module) => (module.default && module.default.ref && module.default.refTTL) ? module.default : null },
28
- { id: "WapQuery", conditions: (module) => (module.queryExist) ? module : ((module.default && module.default.queryExist) ? module.default : null) },
29
- { id: "CryptoLib", conditions: (module) => (module.decryptE2EMedia) ? module : null },
30
- { id: "OpenChat", conditions: (module) => (module.default && module.default.prototype && module.default.prototype.openChat) ? module.default : null },
31
- { id: "UserConstructor", conditions: (module) => (module.default && module.default.prototype && module.default.prototype.isServer && module.default.prototype.isUser) ? module.default : null },
32
- { id: "SendTextMsgToChat", conditions: (module) => (module.sendTextMsgToChat) ? module.sendTextMsgToChat : null },
33
- { id: "ReadSeen", conditions: (module) => (module.sendSeen) ? module : null },
34
- { id: "sendDelete", conditions: (module) => (module.sendDelete) ? module.sendDelete : null },
35
- { id: "addAndSendMsgToChat", conditions: (module) => (module.addAndSendMsgToChat) ? module.addAndSendMsgToChat : null },
36
- { id: "sendMsgToChat", conditions: (module) => (module.sendMsgToChat) ? module.sendMsgToChat : null },
37
- { id: "Catalog", conditions: (module) => (module.Catalog) ? module.Catalog : null },
38
- { id: "bp", conditions: (module) => (module.default&&module.default.toString&&module.default.toString().includes('bp_unknown_version')) ? module.default : null },
39
- { id: "MsgKey", conditions: (module) => (module.default&&module.default.toString&&module.default.toString().includes('MsgKey error: obj is null/undefined')) ? module.default : null },
40
- { id: "Parser", conditions: (module) => (module.convertToTextWithoutSpecialEmojis) ? module.default : null },
41
- { id: "Builders", conditions: (module) => (module.TemplateMessage && module.HydratedFourRowTemplate) ? module : null },
42
- { id: "Me", conditions: (module) => (module.PLATFORMS && module.Conn) ? module.default : null },
43
- { id: "CallUtils", conditions: (module) => (module.sendCallEnd && module.parseCall) ? module : null },
44
- { id: "Identity", conditions: (module) => (module.queryIdentity && module.updateIdentity) ? module : null },
45
- { id: "MyStatus", conditions: (module) => (module.getStatus && module.setMyStatus) ? module : null },
46
- { id: "ChatStates", conditions: (module) => (module.sendChatStatePaused && module.sendChatStateRecording && module.sendChatStateComposing) ? module : null },
47
- { id: "GroupActions", conditions: (module) => (module.sendExitGroup && module.localExitGroup) ? module : null },
48
- { id: "Features", conditions: (module) => (module.FEATURE_CHANGE_EVENT && module.features) ? module : null },
49
- { id: "MessageUtils", conditions: (module) => (module.storeMessages && module.appendMessage) ? module : null },
50
- { id: "WebMessageInfo", conditions: (module) => (module.WebMessageInfo && module.WebFeatures) ? module.WebMessageInfo : null },
51
- { id: "createMessageKey", conditions: (module) => (module.createMessageKey && module.createDeviceSentMessage) ? module.createMessageKey : null },
52
- { id: "Participants", conditions: (module) => (module.addParticipants && module.removeParticipants && module.promoteParticipants && module.demoteParticipants) ? module : null },
53
- { id: "WidFactory", conditions: (module) => (module.isWidlike && module.createWid && module.createWidFromWidLike) ? module : null },
54
- { id: "Base", conditions: (module) => (module.setSubProtocol && module.binSend && module.actionNode) ? module : null },
55
- { id: "Versions", conditions: (module) => (module.loadProtoVersions && module.default && module.default["15"] && module.default["16"] && module.default["17"]) ? module : null },
56
- { id: "Sticker", conditions: (module) => (module.default && module.default.Sticker) ? module.default.Sticker : null },
57
- { id: "MediaUpload", conditions: (module) => (module.default && module.default.mediaUpload) ? module.default : null },
58
- { id: "UploadUtils", conditions: (module) => (module.default && module.default.encryptAndUpload) ? module.default : null }
14
+ { id: "MediaCollection", module: "WAWebAttachMediaCollection", conditions: (module) => (module.default && module.default.prototype && (module.default.prototype.processFiles !== undefined || module.default.prototype.processAttachments !== undefined)) ? module.default : null },
15
+ { id: "Archive", module: "WAWebSetArchiveChatAction", conditions: (module) => (module.setArchive) ? module : null },
16
+ { id: "Block", module: "WAWebBlockContactUtils", conditions: (module) => (module.blockContact && module.unblockContact) ? module : null },
17
+ { id: "ChatUtil", module: "WAWebSendClearChatAction", conditions: (module) => (module.sendClear) ? module : null },
18
+ { id: "GroupInvite", module: "WAWebGroupInviteJob", conditions: (module) => (module.queryGroupInviteCode) ? module : null },
19
+ { id: "Wap", module: "WAWebCreateGroupAction", conditions: (module) => (module.createGroup) ? module : null },
20
+ { id: "State", module: "WAWebSocketModel", conditions: (module) => (module.STATE && module.STREAM) ? module : null },
21
+ { id: "_Presence", module: "WAWebContactPresenceBridge", conditions: (module) => (module.setPresenceAvailable && module.setPresenceUnavailable) ? module : null },
22
+ { id: "WapDelete", module: "WAWebChatDeleteBridge", conditions: (module) => (module.sendConversationDelete && module.sendConversationDelete.length == 2) ? module : null },
23
+ { id: "WapQuery", module: "WAWebQueryExistsJob", conditions: (module) => (module.queryExist) ? module : ((module.default && module.default.queryExist) ? module.default : null) },
24
+ { id: "UserConstructor", module: "WAWebWid", conditions: (module) => (module.default && module.default.prototype && module.default.prototype.isServer && module.default.prototype.isUser) ? module.default : null },
25
+ { id: "SendTextMsgToChat", module: "WAWebSendTextMsgChatAction", resolver: (module) => module.sendTextMsgToChat},
26
+ { id: "ReadSeen", module: "WAWebUpdateUnreadChatAction", conditions: (module) => (module.sendSeen) ? module : null },
27
+ { id: "sendDelete", module: "WAWebDeleteChatAction", conditions: (module) => (module.sendDelete) ? module.sendDelete : null },
28
+ { id: "addAndSendMsgToChat", module: "WAWebSendMsgChatAction", conditions: (module) => (module.addAndSendMsgToChat) ? module.addAndSendMsgToChat : null },
29
+ { id: "Catalog", module: "WAWebCatalogCollection", conditions: (module) => (module.Catalog) ? module.Catalog : null },
30
+ { id: "MsgKey", module: "WAWebMsgKey", conditions: (module) => (module.default && module.default.toString && module.default.toString().includes('MsgKey error: obj is null/undefined')) ? module.default : null },
31
+ { id: "Parser", module: "WAWebE2EProtoUtils", conditions: (module) => (module.convertToTextWithoutSpecialEmojis) ? module.default : null },
32
+ { id: "Builders", module: "WAWebProtobufsE2E.pb", conditions: (module) => (module.TemplateMessage && module.HydratedFourRowTemplate) ? module : null },
33
+ { id: "Me", module: "WAWebUserPrefsMeUser", conditions: (module) => (module.PLATFORMS && module.Conn) ? module.default : null },
34
+ { id: "MyStatus", module: "WAWebContactStatusBridge", conditions: (module) => (module.getStatus && module.setMyStatus) ? module : null },
35
+ { id: "ChatStates", module: "WAWebChatStateBridge", conditions: (module) => (module.sendChatStatePaused && module.sendChatStateRecording && module.sendChatStateComposing) ? module : null },
36
+ { id: "GroupActions", module: "WAWebExitGroupAction", conditions: (module) => (module.sendExitGroup && module.localExitGroup) ? module : null },
37
+ { id: "Participants", module: "WAWebGroupsParticipantsApi", conditions: (module) => (module.addParticipants && module.removeParticipants && module.promoteParticipants && module.demoteParticipants) ? module : null },
38
+ { id: "WidFactory", module: "WAWebWidFactory", conditions: (module) => (module.isWidlike && module.createWid && module.createWidFromWidLike) ? module : null },
39
+ { id: "Sticker", module: "WAWebStickerPackCollection", conditions: (module) => (module.default && module.default.Sticker) ? module.default.Sticker : null },
40
+ { id: "UploadUtils", module: "WAWebUploadManager", conditions: (module) => (module.default && module.default.encryptAndUpload) ? module.default : null }
59
41
  ];
60
- for (let idx in modules) {
61
- if ((typeof modules[idx] === "object") && (modules[idx] !== null)) {
62
- neededObjects.forEach((needObj) => {
63
- if (!needObj.conditions || needObj.foundedModule)
64
- return;
65
- let neededModule = needObj.conditions(modules[idx]);
66
- if (neededModule !== null) {
67
- foundCount++;
68
- needObj.foundedModule = neededModule;
69
- }
70
- });
71
-
72
- if (foundCount == neededObjects.length) {
73
- break;
74
- }
75
- }
76
- }
77
- let neededStore = neededObjects.find((needObj) => needObj.id === "Store");
78
- window.Store = neededStore.foundedModule ? neededStore.foundedModule : {};
79
- neededObjects.splice(neededObjects.indexOf(neededStore), 1);
42
+ neededObjects.map((needObj) => {
43
+ if (!needObj.module) return;
44
+ let neededModule = require(needObj.module)
45
+ needObj.foundedModule = neededModule;
46
+ });
47
+ window.Store = {...Object.values(require("WAWebLoadMainBundleFileDefinitions")).map(x=>{
48
+ const module = x();
49
+ const collectionName = module.modelClass?.prototype?.proxyName
50
+ if(!collectionName) return false;
51
+ const capName = collectionName.charAt(0).toUpperCase() + collectionName.slice(1);
52
+ return [capName, module]
53
+ }).filter(x=>x).reduce((acc,curr) => {return {...acc,[curr[0]]: curr[1]}}, {}),
54
+ ...(window.Store || {})}
80
55
  neededObjects.forEach((needObj) => {
81
56
  if (needObj.foundedModule) {
82
- window.Store[needObj.id] = needObj.foundedModule;
57
+ window.Store[needObj.id] = needObj.resolver ? needObj.resolver(needObj.foundedModule) : needObj.foundedModule;
83
58
  }
84
59
  });
85
- if(window.Store.Chat) window.Store.Chat.modelClass.prototype.sendMessage = function (e) {
86
- window.Store.SendTextMsgToChat(this, ...arguments);
87
- }
60
+ if (window.Store.Chat) window.Store.Chat.modelClass.prototype.sendMessage = function (e) {
61
+ window.Store.SendTextMsgToChat(this, ...arguments);
62
+ }
88
63
  return window.Store;
89
- }
90
- const parasite = `parasite${Date.now()}`
91
- // webpackJsonp([], { [parasite]: (x, y, z) => getStore(z) }, [parasite]);
92
- if (typeof webpackJsonp === 'function') webpackJsonp([], {[parasite]: (x, y, z) => getStore(z)}, [parasite]);
93
- else webpackChunkbuild.push([[parasite], {}, function (o, e, t) {let modules = []; for (let idx in o.m) {modules.push(o(idx));} getStore(modules);}]);
94
- })();
64
+ }
65
+ getStore()
66
+ }) ();
95
67
  }
96
68
 
97
69
  window.WAPI = {};
@@ -153,14 +125,14 @@ window.WAPI._serializeMessageObj = (obj) => {
153
125
  return null;
154
126
  }
155
127
  const _chat = obj['chat'] ? WAPI._serializeChatObj(obj['chat']) : {};
156
- if(obj.quotedMsg) obj.quotedMsgObj();
128
+ if (obj.quotedMsg) obj.quotedMsgObj();
157
129
  return Object.assign(window.WAPI._serializeRawObj(obj), {
158
130
  id: obj.id._serialized,
159
131
  from: obj.from._serialized,
160
- quotedParticipant: obj.quotedParticipant? obj.quotedParticipant._serialized ? obj.quotedParticipant._serialized : undefined : undefined,
161
- author: obj.author? obj.author._serialized ? obj.author._serialized : undefined : undefined,
162
- chatId: obj.chatId? obj.chatId._serialized ? obj.chatId._serialized : undefined : undefined,
163
- to: obj.to? obj.to._serialized ? obj.to._serialized : undefined : undefined,
132
+ quotedParticipant: obj.quotedParticipant ? obj.quotedParticipant._serialized ? obj.quotedParticipant._serialized : undefined : undefined,
133
+ author: obj.author ? obj.author._serialized ? obj.author._serialized : undefined : undefined,
134
+ chatId: obj.chatId ? obj.chatId._serialized ? obj.chatId._serialized : undefined : undefined,
135
+ to: obj.to ? obj.to._serialized ? obj.to._serialized : undefined : undefined,
164
136
  fromMe: obj.id.fromMe,
165
137
  sender: obj["senderObj"] ? WAPI._serializeContactObj(obj["senderObj"]) : null,
166
138
  timestamp: obj["t"],
@@ -253,7 +225,7 @@ window.WAPI.getContact = function (id) {
253
225
  return window.WAPI._serializeContactObj(found);
254
226
  };
255
227
 
256
- window.WAPI.syncContacts = function() {
228
+ window.WAPI.syncContacts = function () {
257
229
  Store.Contact.sync()
258
230
  return true;
259
231
  }
@@ -290,15 +262,15 @@ window.WAPI.getAllNewMessages = async function () {
290
262
 
291
263
  // nnoo longer determined by x.ack==-1
292
264
  window.WAPI.getAllUnreadMessages = async function () {
293
- return Store.Chat.models.filter(chat=>chat.unreadCount&&chat.unreadCount>0).map(unreadChat=>unreadChat.msgs.models.slice(-1*unreadChat.unreadCount)).flat().map(WAPI._serializeMessageObj)
265
+ return Store.Chat.models.filter(chat => chat.unreadCount && chat.unreadCount > 0).map(unreadChat => unreadChat.msgs.models.slice(-1 * unreadChat.unreadCount)).flat().map(WAPI._serializeMessageObj)
294
266
  }
295
267
 
296
268
  window.WAPI.getIndicatedNewMessages = async function () {
297
- return JSON.stringify(Store.Chat.models.filter(chat=>chat.unreadCount).map(chat=>{return {id:chat.id,indicatedNewMessages: chat.msgs.models.slice(Math.max(chat.msgs.length - chat.unreadCount, 0)).filter(msg=>!msg.id.fromMe)}}))
269
+ return JSON.stringify(Store.Chat.models.filter(chat => chat.unreadCount).map(chat => { return { id: chat.id, indicatedNewMessages: chat.msgs.models.slice(Math.max(chat.msgs.length - chat.unreadCount, 0)).filter(msg => !msg.id.fromMe) } }))
298
270
  }
299
271
 
300
- window.WAPI.getSingleProperty = function (namespace,id,property){
301
- if(Store[namespace] && Store[namespace].get(id) && Object.keys(Store[namespace].get(id)).find(x=>x.includes(property))) return Store[namespace].get(id)[property];
272
+ window.WAPI.getSingleProperty = function (namespace, id, property) {
273
+ if (Store[namespace] && Store[namespace].get(id) && Object.keys(Store[namespace].get(id)).find(x => x.includes(property))) return Store[namespace].get(id)[property];
302
274
  return 404
303
275
  }
304
276
 
@@ -328,7 +300,7 @@ window.WAPI.getAllGroups = function () {
328
300
  * returns {boolean}
329
301
  */
330
302
  window.WAPI.sendChatstate = async function (state, chatId) {
331
- switch(state) {
303
+ switch (state) {
332
304
  case 0:
333
305
  await window.Store.ChatStates.sendChatStateComposing(chatId);
334
306
  break;
@@ -364,7 +336,7 @@ window.WAPI.getChat = function (id) {
364
336
  * returns: {string,string} and string -"Hi, I am using WA"
365
337
  */
366
338
  window.WAPI.getStatus = async (id) => {
367
- return await Store.MyStatus.getStatus(id)
339
+ return await Store.MyStatus.getStatus(id)
368
340
  }
369
341
 
370
342
  window.WAPI.getChatByName = function (name) {
@@ -424,7 +396,7 @@ window.WAPI.sendLinkWithAutoPreview = async function (chatId, url, text) {
424
396
  return false;
425
397
  }
426
398
  const linkPreview = await Store.WapQuery.queryLinkPreview(url);
427
- return (await chatSend.sendMessage(text.includes(url) ? text : `${url}\n${text}`, {linkPreview}))=='OK'
399
+ return (await chatSend.sendMessage(text.includes(url) ? text : `${url}\n${text}`, { linkPreview })) == 'OK'
428
400
  }
429
401
 
430
402
  window.WAPI.sendMessageWithThumb = function (thumb, url, title, description, text, chatId) {
@@ -445,20 +417,20 @@ window.WAPI.sendMessageWithThumb = function (thumb, url, title, description, tex
445
417
 
446
418
  window.WAPI.revokeGroupInviteLink = async function (chatId) {
447
419
  var chat = Store.Chat.get(chatId);
448
- if(!chat.isGroup) return false;
420
+ if (!chat.isGroup) return false;
449
421
  await Store.GroupInvite.revokeGroupInvite(chat);
450
422
  return true;
451
423
  }
452
424
 
453
425
  window.WAPI.getGroupInviteLink = async function (chatId) {
454
426
  var chat = Store.Chat.get(chatId);
455
- if(!chat.isGroup) return false;
427
+ if (!chat.isGroup) return false;
456
428
  await Store.GroupInvite.queryGroupInviteCode(chat);
457
429
  return `https://chat.whatsapp.com/${chat.inviteCode}`
458
430
  }
459
431
 
460
- window.WAPI.inviteInfo = async function(link){
461
- return await Store.WapQuery.groupInviteInfo(link.split('\/').pop()).then(r=>r.status===200?WAPI.quickClean(r):r.status);
432
+ window.WAPI.inviteInfo = async function (link) {
433
+ return await Store.WapQuery.groupInviteInfo(link.split('\/').pop()).then(r => r.status === 200 ? WAPI.quickClean(r) : r.status);
462
434
  }
463
435
 
464
436
  window.WAPI.getNewId = function () {
@@ -542,9 +514,9 @@ window.WAPI.getUnreadMessagesInChat = function (id, includeMe, includeNotificati
542
514
  */
543
515
  window.WAPI.loadEarlierMessages = async function (id) {
544
516
  const chat = WAPI.getChat(id);
545
- if(chat){
546
- const someEarlierMessages = await chat.loadEarlierMsgs();
547
- if(someEarlierMessages) return someEarlierMessages.map(WAPI._serializeMessageObj);
517
+ if (chat) {
518
+ const someEarlierMessages = await chat.loadEarlierMsgs();
519
+ if (someEarlierMessages) return someEarlierMessages.map(WAPI._serializeMessageObj);
548
520
  }
549
521
  return false;
550
522
  };
@@ -645,19 +617,21 @@ window.WAPI.getGroupAdmins = async function (id) {
645
617
  .map((admin) => admin.id._serialized);
646
618
  };
647
619
 
648
- WAPI.iAmAdmin = async function(){
649
- return (await Promise.all(Store.GroupMetadata.models.map(({id})=>Store.GroupMetadata.find(id)))).filter(({participants})=>participants.iAmAdmin()||participants.iAmSuperAdmin()).map(({id})=>id._serialized);
620
+ WAPI.iAmAdmin = async function () {
621
+ return (await Promise.all(Store.GroupMetadata.models.map(({ id }) => Store.GroupMetadata.find(id)))).filter(({ participants }) => participants.iAmAdmin() || participants.iAmSuperAdmin()).map(({ id }) => id._serialized);
650
622
  }
651
623
 
652
624
  /**
653
625
  * Returns an object with all of your host device details
654
626
  */
655
- window.WAPI.getMe = function(){
656
- return {...WAPI.quickClean({
657
- ...Store.Contact.get(Store.Me.wid).attributes,
658
- ...Store.Me.attributes
659
- }),
660
- me:Store.Me.me};
627
+ window.WAPI.getMe = function () {
628
+ return {
629
+ ...WAPI.quickClean({
630
+ ...Store.Contact.get(Store.Me.wid).attributes,
631
+ ...Store.Me.attributes
632
+ }),
633
+ me: Store.Me.me
634
+ };
661
635
  }
662
636
 
663
637
  window.WAPI.isLoggedIn = function () {
@@ -668,13 +642,13 @@ window.WAPI.isLoggedIn = function () {
668
642
 
669
643
  window.WAPI.isConnected = function () {
670
644
  // Phone or connection Disconnected icon appears when phone or connection is disconnected
671
- const isConnected=(document.querySelector('[data-testid="alert-phone"]') == null && document.querySelector('[data-testid="alert-computer"]') == null) ? true : false;
645
+ const isConnected = (document.querySelector('[data-testid="alert-phone"]') == null && document.querySelector('[data-testid="alert-computer"]') == null) ? true : false;
672
646
  return isConnected;
673
647
  };
674
648
 
675
649
  //I dont think this will work for group chats.
676
650
  window.WAPI.isChatOnline = async function (id) {
677
- return Store.Chat.get(id)?await Store.Chat.get(id).presence.subscribe().then(_=>Store.Chat.get(id).presence.attributes.isOnline):false;
651
+ return Store.Chat.get(id) ? await Store.Chat.get(id).presence.subscribe().then(_ => Store.Chat.get(id).presence.attributes.isOnline) : false;
678
652
  }
679
653
 
680
654
  window.WAPI.processMessageObj = function (messageObj, includeMe, includeNotifications) {
@@ -694,8 +668,8 @@ window.WAPI.processMessageObj = function (messageObj, includeMe, includeNotifica
694
668
  window.WAPI.getAllMessagesInChat = function (id, includeMe = false, includeNotifications = false, clean = false) {
695
669
  const chat = WAPI.getChat(id);
696
670
  let output = chat.msgs._models || [];
697
- if(!includeMe) output = output.filter(m=> !m.id.fromMe)
698
- if(!includeNotifications) output = output.filter(m=> !m.isNotification)
671
+ if (!includeMe) output = output.filter(m => !m.id.fromMe)
672
+ if (!includeNotifications) output = output.filter(m => !m.isNotification)
699
673
  return (clean ? output.map(WAPI.quickClean) : output.map(WAPI._serializeMessageObj)) || [];
700
674
  };
701
675
 
@@ -743,17 +717,17 @@ window.WAPI.getMessageById = function (id) {
743
717
  result = WAPI.processMessageObj(msg, true, true);
744
718
  }
745
719
  } catch (err) { }
746
- return result;
720
+ return result;
747
721
  };
748
722
 
749
723
  window.WAPI.sendMessageWithMentions = async function (ch, body) {
750
724
  var chat = ch.id ? ch : Store.Chat.get(ch);
751
725
  var chatId = chat.id._serialized;
752
726
  var msgIveSent = chat.msgs.filter(msg => msg.__x_isSentByMe)[0];
753
- if(!msgIveSent) return chat.sendMessage(body);
727
+ if (!msgIveSent) return chat.sendMessage(body);
754
728
  var tempMsg = Object.create(msgIveSent);
755
729
  var newId = window.WAPI.getNewMessageId(chatId);
756
- var mentionedJidList = body.match(/@(\d*)/g).filter(x=>x.length>5).map(x=>Store.Contact.get(x.replace("@","")+"@c.us") ? new Store.WidFactory.createUserWid(x.replace("@","")) : '') || undefined;
730
+ var mentionedJidList = body.match(/@(\d*)/g).filter(x => x.length > 5).map(x => Store.Contact.get(x.replace("@", "") + "@c.us") ? new Store.WidFactory.createUserWid(x.replace("@", "")) : '') || undefined;
757
731
  var extend = {
758
732
  ack: 0,
759
733
  id: newId,
@@ -764,7 +738,7 @@ window.WAPI.sendMessageWithMentions = async function (ch, body) {
764
738
  isNewMsg: !0,
765
739
  type: "chat",
766
740
  body,
767
- quotedMsg:null,
741
+ quotedMsg: null,
768
742
  mentionedJidList
769
743
  };
770
744
  Object.assign(tempMsg, extend);
@@ -776,7 +750,7 @@ window.WAPI.sendMessageReturnId = async function (ch, body) {
776
750
  var chat = ch.id ? ch : Store.Chat.get(ch);
777
751
  var chatId = chat.id._serialized;
778
752
  var msgIveSent = chat.msgs.filter(msg => msg.__x_isSentByMe)[0];
779
- if(!msgIveSent) return chat.sendMessage(body);
753
+ if (!msgIveSent) return chat.sendMessage(body);
780
754
  var tempMsg = Object.create(msgIveSent);
781
755
  var newId = window.WAPI.getNewMessageId(chatId);
782
756
  var extend = {
@@ -789,7 +763,7 @@ window.WAPI.sendMessageReturnId = async function (ch, body) {
789
763
  isNewMsg: !0,
790
764
  type: "chat",
791
765
  body,
792
- quotedMsg:null
766
+ quotedMsg: null
793
767
  };
794
768
  Object.assign(tempMsg, extend);
795
769
  await Store.addAndSendMsgToChat(chat, tempMsg)
@@ -798,28 +772,28 @@ window.WAPI.sendMessageReturnId = async function (ch, body) {
798
772
 
799
773
 
800
774
  window.WAPI.sendMessage = async function (id, message) {
801
- if(id==='status@broadcast') return 'Not able to send message to broadcast';
775
+ if (id === 'status@broadcast') return 'Not able to send message to broadcast';
802
776
  let chat = WAPI.getChat(id);
803
- if((!chat && !id.includes('g') || chat.msgs.models.length == 0)) {
777
+ if ((!chat && !id.includes('g') || chat.msgs.models.length == 0)) {
804
778
  var contact = WAPI.getContact(id)
805
- if(!contact || !contact.isMyContact) return 'Not a contact';
779
+ if (!contact || !contact.isMyContact) return 'Not a contact';
806
780
  await Store.Chat.find(Store.Contact.get(id).id)
807
781
  chat = WAPI.getChat(id);
808
782
  }
809
783
  if (chat !== undefined) {
810
- // return WAPI.sendMessageReturnId(chat,message).then(id=>{return id})
811
- return await chat.sendMessage(message).then(_=>chat.lastReceivedKey._serialized);
812
- }
784
+ // return WAPI.sendMessageReturnId(chat,message).then(id=>{return id})
785
+ return await chat.sendMessage(message).then(_ => chat.lastReceivedKey._serialized);
786
+ }
813
787
  return false;
814
- };
788
+ };
815
789
 
816
790
 
817
791
  window.WAPI.sendSeen = async function (id) {
818
792
  if (!id) return false;
819
793
  var chat = window.WAPI.getChat(id);
820
794
  if (chat !== undefined) {
821
- await Store.ReadSeen.sendSeen(chat, false);
822
- return true;
795
+ await Store.ReadSeen.sendSeen(chat, false);
796
+ return true;
823
797
  }
824
798
  return false;
825
799
  };
@@ -827,8 +801,8 @@ window.WAPI.sendSeen = async function (id) {
827
801
  window.WAPI.markAsUnread = async function (id) {
828
802
  var chat = window.WAPI.getChat(id);
829
803
  if (chat !== undefined) {
830
- await Store.ReadSeen.markUnread(chat, true);
831
- return true;
804
+ await Store.ReadSeen.markUnread(chat, true);
805
+ return true;
832
806
  }
833
807
  return false;
834
808
  };
@@ -847,7 +821,7 @@ window.isChatMessage = function (message) {
847
821
  }
848
822
 
849
823
  window.WAPI.setPresence = function (available) {
850
- if(available)Store._Presence.setPresenceAvailable();
824
+ if (available) Store._Presence.setPresenceAvailable();
851
825
  else Store._Presence.setPresenceUnavailable();
852
826
  }
853
827
 
@@ -943,7 +917,7 @@ window.WAPI.getProfilePicFromServer = function (id) {
943
917
  }
944
918
 
945
919
  window.WAPI.getProfilePicSmallFromId = async function (id) {
946
- return await window.Store.ProfilePicThumb.find(id).then(async d=> {
920
+ return await window.Store.ProfilePicThumb.find(id).then(async d => {
947
921
  if (d.img !== undefined) {
948
922
  return await window.WAPI.downloadFileWithCredentials(d.img);
949
923
  } else {
@@ -967,43 +941,43 @@ window.WAPI.getProfilePicFromId = async function (id) {
967
941
  };
968
942
 
969
943
  window.WAPI.downloadFileWithCredentials = async function (url) {
970
- if(!axios || !url) return false;
971
- const ab = (await axios.get(url,{responseType: 'arraybuffer'})).data
944
+ if (!axios || !url) return false;
945
+ const ab = (await axios.get(url, { responseType: 'arraybuffer' })).data
972
946
  return btoa(new Uint8Array(ab).reduce((data, byte) => data + String.fromCharCode(byte), ''));
973
947
  };
974
948
 
975
949
  window.WAPI.downloadFile = async function (url) {
976
- return await new Promise((resolve,reject) => {
977
- let xhr = new XMLHttpRequest();
978
- xhr.onload = function () {
979
- if (xhr.readyState == 4) {
980
- if (xhr.status == 200) {
981
- let reader = new FileReader();
982
- reader.readAsDataURL(xhr.response);
983
- reader.onload = function (e) {
984
- resolve(reader.result.substr(reader.result.indexOf(',') + 1))
985
- };
950
+ return await new Promise((resolve, reject) => {
951
+ let xhr = new XMLHttpRequest();
952
+ xhr.onload = function () {
953
+ if (xhr.readyState == 4) {
954
+ if (xhr.status == 200) {
955
+ let reader = new FileReader();
956
+ reader.readAsDataURL(xhr.response);
957
+ reader.onload = function (e) {
958
+ resolve(reader.result.substr(reader.result.indexOf(',') + 1))
959
+ };
960
+ } else {
961
+ console.error(xhr.statusText);
962
+ }
986
963
  } else {
987
- console.error(xhr.statusText);
964
+ console.log(err);
965
+ resolve(false);
988
966
  }
989
- } else {
990
- console.log(err);
991
- resolve(false);
992
- }
993
- };
967
+ };
994
968
 
995
- xhr.open("GET", url, true);
996
- xhr.responseType = 'blob';
997
- xhr.send(null);
998
- })
969
+ xhr.open("GET", url, true);
970
+ xhr.responseType = 'blob';
971
+ xhr.send(null);
972
+ })
999
973
  };
1000
974
 
1001
975
  window.WAPI.getBatteryLevel = function () {
1002
- return Store.Conn.battery;
976
+ return 'DEPRECATED'
1003
977
  };
1004
978
 
1005
979
  window.WAPI.getIsPlugged = function () {
1006
- return Store.Conn.plugged;
980
+ return 'DEPRECATED'
1007
981
  };
1008
982
 
1009
983
  window.WAPI.deleteConversation = async function (chatId) {
@@ -1028,20 +1002,20 @@ window.WAPI.smartDeleteMessages = async function (chatId, messageArray, onlyLoca
1028
1002
  messageArray = [messageArray];
1029
1003
  }
1030
1004
 
1031
- let messagesToDelete = messageArray.map(msgId => (typeof msgId == 'string')?window.Store.Msg.get(msgId):msgId).filter(x=>x);
1032
- if(messagesToDelete.length==0) return true;
1033
- let jobs = onlyLocal ? [conversation.sendDeleteMsgs(messagesToDelete,conversation)] :[
1034
- conversation.sendRevokeMsgs(messagesToDelete.filter(msg=>msg.isSentByMe),conversation),
1035
- conversation.sendDeleteMsgs(messagesToDelete.filter(msg=>!msg.isSentByMe),conversation)
1005
+ let messagesToDelete = messageArray.map(msgId => (typeof msgId == 'string') ? window.Store.Msg.get(msgId) : msgId).filter(x => x);
1006
+ if (messagesToDelete.length == 0) return true;
1007
+ let jobs = onlyLocal ? [conversation.sendDeleteMsgs(messagesToDelete, conversation)] : [
1008
+ conversation.sendRevokeMsgs(messagesToDelete.filter(msg => msg.isSentByMe), conversation),
1009
+ conversation.sendDeleteMsgs(messagesToDelete.filter(msg => !msg.isSentByMe), conversation)
1036
1010
  ]
1037
- return Promise.all(jobs).then(_=>true)
1011
+ return Promise.all(jobs).then(_ => true)
1038
1012
  };
1039
1013
 
1040
1014
  window.WAPI.deleteMessage = async function (chatId, messageArray, revoke = false) {
1041
1015
  let userId = new window.Store.UserConstructor(chatId, { intentionallyUsePrivateConstructor: true });
1042
1016
  let conversation = WAPI.getChat(userId);
1043
1017
 
1044
- if (!conversation)return false;
1018
+ if (!conversation) return false;
1045
1019
 
1046
1020
  if (!Array.isArray(messageArray)) {
1047
1021
  messageArray = [messageArray];
@@ -1059,7 +1033,7 @@ window.WAPI.deleteMessage = async function (chatId, messageArray, revoke = false
1059
1033
  };
1060
1034
 
1061
1035
  window.WAPI.clearChat = async function (id) {
1062
- return await Store.ChatUtil.sendClear(Store.Chat.get(id),true);
1036
+ return await Store.ChatUtil.sendClear(Store.Chat.get(id), true);
1063
1037
  }
1064
1038
 
1065
1039
  /**
@@ -1068,7 +1042,7 @@ window.WAPI.clearChat = async function (id) {
1068
1042
  * @return boolean true: worked, false: didnt work (probably already in desired state)
1069
1043
  */
1070
1044
  window.WAPI.archiveChat = async function (id, archive) {
1071
- return await Store.Archive.setArchive(Store.Chat.get(id),archive).then(_=>true).catch(_=>false)
1045
+ return await Store.Archive.setArchive(Store.Chat.get(id), archive).then(_ => true).catch(_ => false)
1072
1046
  }
1073
1047
 
1074
1048
  /**
@@ -1084,17 +1058,17 @@ window.WAPI.archiveChat = async function (id, archive) {
1084
1058
  * ]
1085
1059
  * ``` or false if no valid vcards found
1086
1060
  */
1087
- window.WAPI.getVCards = function(id) {
1061
+ window.WAPI.getVCards = function (id) {
1088
1062
  var msg = Store.Msg.get(id);
1089
- if(msg) {
1090
- if(msg.type=='vcard') {
1063
+ if (msg) {
1064
+ if (msg.type == 'vcard') {
1091
1065
  return [
1092
1066
  {
1093
- displayName:msg.subtype,
1094
- vcard:msg.body
1067
+ displayName: msg.subtype,
1068
+ vcard: msg.body
1095
1069
  }
1096
1070
  ]
1097
- } else if (msg.type=='multi_vcard') {
1071
+ } else if (msg.type == 'multi_vcard') {
1098
1072
  return msg.vcardList
1099
1073
  } else return false;
1100
1074
  } else {
@@ -1110,30 +1084,31 @@ window.WAPI.checkNumberStatus = async function (id) {
1110
1084
  if (data.status == 200) data.numberExists = true
1111
1085
  return data;
1112
1086
  } catch (e) {
1113
- return window.WAPI._serializeNumberStatusObj({
1114
- status: e,
1115
- jid: id
1116
- });
1087
+ return window.WAPI._serializeNumberStatusObj({
1088
+ status: e,
1089
+ jid: id
1090
+ });
1117
1091
  }
1118
1092
  };
1119
1093
 
1120
1094
  window.WAPI.onAnyMessage = callback => window.Store.Msg.on('add', (newMessage) => {
1121
1095
  if (newMessage && newMessage.isNewMsg) {
1122
- if(!newMessage.clientUrl && (newMessage.mediaKeyTimestamp || newMessage.filehash)){
1123
- const cb = (msg) => {
1124
- if(msg.id._serialized === newMessage.id._serialized && msg.clientUrl) {
1125
- callback(WAPI.processMessageObj(msg, true, false));
1126
- Store.Msg.off('change:isUnsentMedia',cb);
1096
+ if (!newMessage.clientUrl && (newMessage.mediaKeyTimestamp || newMessage.filehash)) {
1097
+ const cb = (msg) => {
1098
+ if (msg.id._serialized === newMessage.id._serialized && msg.clientUrl) {
1099
+ callback(WAPI.processMessageObj(msg, true, false));
1100
+ Store.Msg.off('change:isUnsentMedia', cb);
1101
+ }
1102
+ };
1103
+ Store.Msg.on('change:isUnsentMedia', cb);
1104
+ } else {
1105
+ let pm = window.WAPI.processMessageObj(newMessage, true, true);
1106
+ let message = pm ? JSON.parse(JSON.stringify(pm)) : WAPI.quickClean(newMessage.attributes);
1107
+ if (message) {
1108
+ callback(message)
1127
1109
  }
1128
- };
1129
- Store.Msg.on('change:isUnsentMedia',cb);
1130
- } else {
1131
- let pm = window.WAPI.processMessageObj(newMessage, true, true);
1132
- let message = pm? JSON.parse(JSON.stringify(pm)) : WAPI.quickClean(newMessage.attributes);
1133
- if (message) {
1134
- callback(message)
1135
1110
  }
1136
- }}
1111
+ }
1137
1112
  });
1138
1113
 
1139
1114
  /**
@@ -1142,7 +1117,7 @@ window.WAPI.onAnyMessage = callback => window.Store.Msg.on('add', (newMessage) =
1142
1117
  * @returns {boolean}
1143
1118
  */
1144
1119
  window.WAPI.onStateChanged = function (callback) {
1145
- window.Store.State.default.on('change:state', ({state})=>callback(state))
1120
+ window.Store.State.default.on('change:state', ({ state }) => callback(state))
1146
1121
  return true;
1147
1122
  }
1148
1123
 
@@ -1161,7 +1136,7 @@ window.WAPI.onStateChanged = function (callback) {
1161
1136
  * "UNPAIRED"
1162
1137
  * "UNPAIRED_IDLE"
1163
1138
  */
1164
- window.WAPI.getState = function (){
1139
+ window.WAPI.getState = function () {
1165
1140
  return Store.State.default.state;
1166
1141
  }
1167
1142
 
@@ -1171,7 +1146,7 @@ window.WAPI.getState = function (){
1171
1146
  * @returns {boolean}
1172
1147
  */
1173
1148
  window.WAPI.onIncomingCall = function (callback) {
1174
- window.Store.Call.on('add',callback);
1149
+ window.Store.Call.on('add', callback);
1175
1150
  return true;
1176
1151
  }
1177
1152
 
@@ -1182,11 +1157,11 @@ window.WAPI.onIncomingCall = function (callback) {
1182
1157
  * @returns boolean true if it worked otherwise false
1183
1158
  */
1184
1159
  window.WAPI.addOrRemoveLabels = async function (label, objectId, type) {
1185
- var {id} = Store.Label.models.find(x=>x.id==label||x.name==label)
1160
+ var { id } = Store.Label.models.find(x => x.id == label || x.name == label)
1186
1161
  var to = Store.Chat.get(objectId) || Store.Msg.get(objectId) || Store.Contact.get(objectId);
1187
- if(!id || !to) return false;
1188
- const {status} = await Store.Label.addOrRemoveLabels([{id,type}],[to]);
1189
- return status===200;
1162
+ if (!id || !to) return false;
1163
+ const { status } = await Store.Label.addOrRemoveLabels([{ id, type }], [to]);
1164
+ return status === 200;
1190
1165
  }
1191
1166
 
1192
1167
  /**
@@ -1195,30 +1170,31 @@ window.WAPI.addOrRemoveLabels = async function (label, objectId, type) {
1195
1170
  * @returns {boolean}
1196
1171
  */
1197
1172
  window.WAPI.onAck = function (callback) {
1198
- Store.Msg.on("change:ack", m=>callback(WAPI.quickClean(m)));
1173
+ Store.Msg.on("change:ack", m => callback(WAPI.quickClean(m)));
1199
1174
  return true;
1200
1175
  }
1201
1176
 
1202
1177
  //returns an array of liveLocationChangeObjects
1203
1178
  window.WAPI.forceUpdateLiveLocation = async function (chatId) {
1204
- if(!Store.LiveLocation.get(chatId)) return false;
1205
- return WAPI.quickClean(await Store.LiveLocation.update(chatId)).participants.map(l=>{
1179
+ if (!Store.LiveLocation.get(chatId)) return false;
1180
+ return WAPI.quickClean(await Store.LiveLocation.update(chatId)).participants.map(l => {
1206
1181
  return {
1207
- ...l,
1208
- msgId:l.msg.id._serialized
1182
+ ...l,
1183
+ msgId: l.msg.id._serialized
1209
1184
  }
1210
- });
1185
+ });
1211
1186
  }
1212
1187
 
1213
1188
  window.WAPI.onLiveLocation = function (chatId, callback) {
1214
1189
  var lLChat = Store.LiveLocation.get(chatId);
1215
- if(lLChat) {
1190
+ if (lLChat) {
1216
1191
  var validLocs = lLChat.participants.validLocations();
1217
- validLocs.map(x=>x.on('change:lastUpdated',(x,y,z)=>{
1218
- const {id,lat,lng,accuracy,degrees,speed,lastUpdated}=x;
1219
- const l = {
1220
- id:id.toString(),lat,lng,accuracy,degrees,speed,lastUpdated};
1221
- callback(l);
1192
+ validLocs.map(x => x.on('change:lastUpdated', (x, y, z) => {
1193
+ const { id, lat, lng, accuracy, degrees, speed, lastUpdated } = x;
1194
+ const l = {
1195
+ id: id.toString(), lat, lng, accuracy, degrees, speed, lastUpdated
1196
+ };
1197
+ callback(l);
1222
1198
  }));
1223
1199
  return true;
1224
1200
  } else {
@@ -1226,20 +1202,20 @@ window.WAPI.onLiveLocation = function (chatId, callback) {
1226
1202
  }
1227
1203
  }
1228
1204
 
1229
- window.WAPI.onBattery = function(callback) {
1230
- window.Store.Conn.on('change:battery', ({battery}) => callback(battery));
1205
+ window.WAPI.onBattery = function (callback) {
1206
+ // window.Store.Conn.on('change:battery', ({battery}) => callback(battery));
1231
1207
  return true;
1232
1208
  }
1233
1209
 
1234
- window.WAPI.onPlugged = function(callback) {
1235
- window.Store.Conn.on('change:plugged', ({plugged}) => callback(plugged));
1210
+ window.WAPI.onPlugged = function (callback) {
1211
+ // window.Store.Conn.on('change:plugged', ({plugged}) => callback(plugged));
1236
1212
  return true;
1237
1213
  }
1238
1214
 
1239
1215
  /**
1240
1216
  * A new approach to listening to add and remove events from groups. This takes only a callback and is prevents memory leaks
1241
1217
  */
1242
- WAPI.onGlobalParicipantsChanged = function(callback) {
1218
+ WAPI.onGlobalParicipantsChanged = function (callback) {
1243
1219
  const events = [
1244
1220
  'change:isAdmin',
1245
1221
  'remove',
@@ -1280,11 +1256,11 @@ WAPI.onGlobalParicipantsChanged = function(callback) {
1280
1256
  */
1281
1257
  window.WAPI.onParticipantsChanged = function (groupId, callback) {
1282
1258
  const subtypeEvents = [
1283
- "invite" ,
1284
- "add" ,
1285
- "remove" ,
1286
- "leave" ,
1287
- "promote" ,
1259
+ "invite",
1260
+ "add",
1261
+ "remove",
1262
+ "leave",
1263
+ "promote",
1288
1264
  "demote"
1289
1265
  ];
1290
1266
  const events = [
@@ -1294,16 +1270,16 @@ window.WAPI.onParticipantsChanged = function (groupId, callback) {
1294
1270
  ]
1295
1271
  const chat = window.Store.Chat.get(groupId);
1296
1272
  chat.groupMetadata.participants.on('all', (eventName, eventData, extra) => {
1297
- if(events.includes(eventName)) {
1273
+ if (events.includes(eventName)) {
1298
1274
  let action = eventName;
1299
- if(eventName=='change:isAdmin') {
1275
+ if (eventName == 'change:isAdmin') {
1300
1276
  action = extra ? 'promote' : 'demote';
1301
1277
  }
1302
- callback({
1303
- by: undefined,
1304
- action: action,
1305
- who: eventData.id._serialized
1306
- });
1278
+ callback({
1279
+ by: undefined,
1280
+ action: action,
1281
+ who: eventData.id._serialized
1282
+ });
1307
1283
  }
1308
1284
  })
1309
1285
  }
@@ -1317,11 +1293,11 @@ window.WAPI.onParticipantsChanged = function (groupId, callback) {
1317
1293
  window.groupParticpiantsEvents = {};
1318
1294
  window.WAPI._onParticipantsChanged = function (groupId, callback) {
1319
1295
  const subtypeEvents = [
1320
- "invite" ,
1321
- "add" ,
1322
- "remove" ,
1323
- "leave" ,
1324
- "promote" ,
1296
+ "invite",
1297
+ "add",
1298
+ "remove",
1299
+ "leave",
1300
+ "promote",
1325
1301
  "demote"
1326
1302
  ];
1327
1303
  const chat = window.Store.Chat.get(groupId);
@@ -1378,12 +1354,12 @@ window.WAPI._onParticipantsChanged = function (groupId, callback) {
1378
1354
  * @param callback - function - Callback function to be called when a message acknowledgement changes. The callback returns 3 variables
1379
1355
  * @returns {boolean}
1380
1356
  */
1381
- window.WAPI.onAddedToGroup = function(callback){
1357
+ window.WAPI.onAddedToGroup = function (callback) {
1382
1358
  Store.Chat.on('change:previewMessage', async event => {
1383
- if(event.isGroup && event.previewMessage && event.previewMessage.type=='gp2' && event.previewMessage.subtype =='add' && event.previewMessage.recipients && event.previewMessage.recipients.map(x=>x._serialized).includes(Store.Me.wid._serialized)) {
1384
- const tdiff = (Date.now()-Store.Msg.get(event.previewMessage.id._serialized).t*1000)/1000;
1385
- if(tdiff<10.0) {
1386
- console.log('added', tdiff,'seconds ago')
1359
+ if (event.isGroup && event.previewMessage && event.previewMessage.type == 'gp2' && event.previewMessage.subtype == 'add' && event.previewMessage.recipients && event.previewMessage.recipients.map(x => x._serialized).includes(Store.Me.wid._serialized)) {
1360
+ const tdiff = (Date.now() - Store.Msg.get(event.previewMessage.id._serialized).t * 1000) / 1000;
1361
+ if (tdiff < 10.0) {
1362
+ console.log('added', tdiff, 'seconds ago')
1387
1363
  await WAPI.sendSeen(event.id);
1388
1364
  callback(WAPI._serializeChatObj(Store.Chat.get(event.id)));
1389
1365
  } else console.log('Not a new group add', event.id._serialized)
@@ -1410,42 +1386,42 @@ window.WAPI.getBufferedNewMessages = function () {
1410
1386
  * - DHTGJUfFJAV9MxOpZO1fBZ
1411
1387
  * @returns Promise<string | boolean> Either false if it didn't work, or the group id.
1412
1388
  */
1413
- window.WAPI.joinGroupViaLink = async function(link){
1414
- return await Store.WapQuery.acceptGroupInvite(link.split('\/').pop()).then(res=>res.status===200?res.gid._serialized:res.status);
1389
+ window.WAPI.joinGroupViaLink = async function (link) {
1390
+ return await Store.WapQuery.acceptGroupInvite(link.split('\/').pop()).then(res => res.status === 200 ? res.gid._serialized : res.status);
1415
1391
  let code = link;
1416
1392
  //is it a link? if not, assume it's a code, otherwise, process the link to get the code.
1417
- if(link.includes('chat.whatsapp.com')) {
1418
- if(!link.match(/chat.whatsapp.com\/([\w\d]*)/g).length) return false;
1419
- code = link.match(/chat.whatsapp.com\/([\w\d]*)/g)[0].replace('chat.whatsapp.com\/','');
1393
+ if (link.includes('chat.whatsapp.com')) {
1394
+ if (!link.match(/chat.whatsapp.com\/([\w\d]*)/g).length) return false;
1395
+ code = link.match(/chat.whatsapp.com\/([\w\d]*)/g)[0].replace('chat.whatsapp.com\/', '');
1420
1396
  }
1421
1397
  const group = await Store.GroupInvite.joinGroupViaInvite(code);
1422
- if(!group.id) return false;
1398
+ if (!group.id) return false;
1423
1399
  return group.id._serialized
1424
1400
  }
1425
1401
 
1426
1402
  window.WAPI.sendImage = async function (imgBase64, chatid, filename, caption, quotedMsg, waitForKey, ptt) {
1427
- if(!chatid.includes('@g')&&!chatid.includes('@c')) return false;
1403
+ if (!chatid.includes('@g') && !chatid.includes('@c')) return false;
1428
1404
  let extras = {};
1429
- if(quotedMsg){
1405
+ if (quotedMsg) {
1430
1406
  if (typeof quotedMsg !== "object") quotedMsg = Store.Msg.get(quotedMsg);
1431
1407
  extras = {
1432
1408
  quotedMsg,
1433
1409
  quotedParticipant: quotedMsg.author || quotedMsg.from,
1434
- quotedStanzaID:quotedMsg.id.id
1410
+ quotedStanzaID: quotedMsg.id.id
1435
1411
  };
1436
1412
  }
1437
1413
  return await Store.Chat.find(chatid).then(async (chat) => {
1438
1414
  var mediaBlob = window.WAPI.base64ImageToFile(imgBase64, filename);
1439
- return await window.WAPI.procFiles(chat,mediaBlob).then(async mc => {
1415
+ return await window.WAPI.procFiles(chat, mediaBlob).then(async mc => {
1440
1416
  var media = mc.models[0];
1441
- if(ptt) media.mediaPrep._mediaData.type = 'ptt';
1442
- await media.sendToChat(chat, { caption,...extras });
1443
- return waitForKey ? await new Promise(async (resolve,reject) => {
1444
- const cb = msg=>{
1445
- if(media.attributes.file.size === msg.size) resolve(msg.id._serialized);
1446
- Store.Msg.off('change:clientUrl',cb);
1417
+ if (ptt) media.mediaPrep._mediaData.type = 'ptt';
1418
+ await media.sendToChat(chat, { caption, ...extras });
1419
+ return waitForKey ? await new Promise(async (resolve, reject) => {
1420
+ const cb = msg => {
1421
+ if (media.attributes.file.size === msg.size) resolve(msg.id._serialized);
1422
+ Store.Msg.off('change:clientUrl', cb);
1447
1423
  };
1448
- Store.Msg.on('change:clientUrl',cb);
1424
+ Store.Msg.on('change:clientUrl', cb);
1449
1425
  }) : true
1450
1426
  });
1451
1427
  });
@@ -1459,8 +1435,7 @@ window.WAPI.sendImage = async function (imgBase64, chatid, filename, caption, qu
1459
1435
  * @param newName - string the new name to set as profile name
1460
1436
  */
1461
1437
  window.WAPI.setMyName = async function (newName) {
1462
- if(!Store.Versions.default[12].BinaryProtocol) Store.Versions.default[12].BinaryProtocol=new Store.bp(Store.Me.binVersion);
1463
- return (await Store.Versions.default[12].setPushname(newName)).status===200;
1438
+ return require("WAWebSetPushnameConnAction").setPushname(newName)
1464
1439
  }
1465
1440
 
1466
1441
  /** Change the icon for the group chat
@@ -1468,9 +1443,9 @@ window.WAPI.setMyName = async function (newName) {
1468
1443
  * @param imgData 'data:image/jpeg;base64,...` The base 64 data uri
1469
1444
  * @returns boolean true if it was set, false if it didn't work. It usually doesn't work if the image file is too big.
1470
1445
  */
1471
- window.WAPI.setGroupIcon = async function(groupId, imgData) {
1472
- const {status} = await Store.WapQuery.sendSetPicture(groupId,imgData,imgData);
1473
- return status==200;
1446
+ window.WAPI.setGroupIcon = async function (groupId, imgData) {
1447
+ const { status } = await Store.WapQuery.sendSetPicture(groupId, imgData, imgData);
1448
+ return status == 200;
1474
1449
  }
1475
1450
 
1476
1451
  /**
@@ -1483,35 +1458,35 @@ window.WAPI.setMyStatus = function (newStatus) {
1483
1458
 
1484
1459
  window.WAPI.sendVideoAsGif = async function (imgBase64, chatid, filename, caption, quotedMsg) {
1485
1460
  let extras = {};
1486
- if(quotedMsg){
1461
+ if (quotedMsg) {
1487
1462
  if (typeof quotedMsg !== "object") quotedMsg = Store.Msg.get(quotedMsg);
1488
1463
  extras = {
1489
1464
  quotedMsg,
1490
1465
  quotedParticipant: quotedMsg.author || quotedMsg.from,
1491
- quotedStanzaID:quotedMsg.id.id
1466
+ quotedStanzaID: quotedMsg.id.id
1492
1467
  };
1493
1468
  }
1494
1469
  // create new chat
1495
1470
  return await Store.Chat.find(chatid).then(async (chat) => {
1496
1471
  var mediaBlob = window.WAPI.base64ImageToFile(imgBase64, filename);
1497
1472
  var mc = new Store.MediaCollection(chat);
1498
- return await window.WAPI.procFiles(chat,mediaBlob).then(async mc => {
1473
+ return await window.WAPI.procFiles(chat, mediaBlob).then(async mc => {
1499
1474
  var media = mc.models[0];
1500
1475
  media.mediaPrep._mediaData.isGif = true;
1501
1476
  media.mediaPrep._mediaData.gifAttribution = 1;
1502
- await media.mediaPrep.sendToChat(chat, { caption,...extras });
1477
+ await media.mediaPrep.sendToChat(chat, { caption, ...extras });
1503
1478
  return chat.lastReceivedKey._serialized;
1504
1479
  });
1505
1480
  });
1506
1481
  }
1507
1482
 
1508
- window.WAPI.refreshBusinessProfileProducts = async function (){
1509
- await Promise.all(Store.BusinessProfile.models.map(async x=>{
1510
- try{
1511
- await Store.Catalog.findCarouselCatalog(x.id._serialized)
1512
- } catch(error){}
1513
- }));
1514
- return true;
1483
+ window.WAPI.refreshBusinessProfileProducts = async function () {
1484
+ await Promise.all(Store.BusinessProfile.models.map(async x => {
1485
+ try {
1486
+ await Store.Catalog.findCarouselCatalog(x.id._serialized)
1487
+ } catch (error) { }
1488
+ }));
1489
+ return true;
1515
1490
  }
1516
1491
 
1517
1492
  /**
@@ -1521,24 +1496,24 @@ window.WAPI.refreshBusinessProfileProducts = async function (){
1521
1496
  * @returns None
1522
1497
  */
1523
1498
  window.WAPI.getBusinessProfilesProducts = async function (id) {
1524
- try{
1525
- if(!Store.Catalog.get(id)) await Store.Catalog.findCarouselCatalog(id)
1499
+ try {
1500
+ if (!Store.Catalog.get(id)) await Store.Catalog.findCarouselCatalog(id)
1526
1501
  const catalog = Store.Catalog.get(id);
1527
1502
  if (catalog.productCollection && catalog.productCollection._models.length)
1528
- return JSON.parse(JSON.stringify(catalog.productCollection._models));
1503
+ return JSON.parse(JSON.stringify(catalog.productCollection._models));
1529
1504
  else return [];
1530
- } catch(error){
1505
+ } catch (error) {
1531
1506
  return false;
1532
1507
  }
1533
1508
  };
1534
1509
 
1535
1510
 
1536
- window.WAPI.procFiles= async function(chat, blobs) {
1511
+ window.WAPI.procFiles = async function (chat, blobs) {
1537
1512
  if (!Array.isArray(blobs)) {
1538
1513
  blobs = [blobs];
1539
1514
  }
1540
1515
  var mc = new Store.MediaCollection(chat);
1541
- await mc.processFiles((Debug.VERSION === '0.4.613')?blobs:blobs.map(blob=>{return{file:blob}}) , chat, 1);
1516
+ await mc.processFiles((Debug.VERSION === '0.4.613') ? blobs : blobs.map(blob => { return { file: blob } }), chat, 1);
1542
1517
  return mc
1543
1518
  }
1544
1519
  /**
@@ -1578,7 +1553,7 @@ window.WAPI.sendImageWithProduct = async function (imgBase64, chatid, caption, b
1578
1553
  var mediaBlob = window.WAPI.base64ImageToFile(imgBase64, "filename.jpg");
1579
1554
  // var mc = new Store.MediaCollection(chat);
1580
1555
  // mc.processFiles([mediaBlob], chat, 1)
1581
- return await window.WAPI.procFiles(chat,mediaBlob).then(async mc => {
1556
+ return await window.WAPI.procFiles(chat, mediaBlob).then(async mc => {
1582
1557
  var media = mc.models[0];
1583
1558
  Object.entries(temp.productMsgOptions).map(([k, v]) => media.mediaPrep._mediaData[k] = v)
1584
1559
  await media.mediaPrep.sendToChat(chat, temp);
@@ -1627,10 +1602,10 @@ window.WAPI.sendContact = function (to, contact) {
1627
1602
  /**
1628
1603
  * Ghost forwarding is like a normal forward but as if it were sent from the host phone.
1629
1604
  */
1630
- window.WAPI.ghostForward = async function(chatId, messageId) {
1631
- if(!chatId.includes('@g')&&!chatId.includes('@c')) return false;
1605
+ window.WAPI.ghostForward = async function (chatId, messageId) {
1606
+ if (!chatId.includes('@g') && !chatId.includes('@c')) return false;
1632
1607
  var chat = Store.Chat.get(chatId);
1633
- if(!Store.Msg.get(messageId)) return false;
1608
+ if (!Store.Msg.get(messageId)) return false;
1634
1609
  var tempMsg = Object.create(Store.Msg.get(messageId));
1635
1610
  var newId = window.WAPI.getNewMessageId(chatId);
1636
1611
  var extend = {
@@ -1646,7 +1621,7 @@ window.WAPI.ghostForward = async function(chatId, messageId) {
1646
1621
  };
1647
1622
  Object.assign(tempMsg, extend);
1648
1623
  const res = await Promise.all(Store.addAndSendMsgToChat(chat, extend))
1649
- return res[1]=='success';
1624
+ return res[1] == 'success';
1650
1625
  }
1651
1626
 
1652
1627
 
@@ -1716,7 +1691,7 @@ window.WAPI.simulateTyping = async function (chatId, on) {
1716
1691
  window.WAPI.sendLocation = async function (chatId, lat, lng, loc) {
1717
1692
  loc = loc || '';
1718
1693
  var chat = Store.Chat.get(chatId);
1719
- if(!chat) return false;
1694
+ if (!chat) return false;
1720
1695
  var tempMsg = Object.create(Store.Msg.models.filter(msg => msg.__x_isSentByMe && !msg.quotedMsg)[0]);
1721
1696
  var newId = window.WAPI.getNewMessageId(chatId);
1722
1697
  var extend = {
@@ -1731,24 +1706,24 @@ window.WAPI.sendLocation = async function (chatId, lat, lng, loc) {
1731
1706
  lat,
1732
1707
  lng,
1733
1708
  loc,
1734
- clientUrl:undefined,
1735
- directPath:undefined,
1736
- filehash:undefined,
1737
- uploadhash:undefined,
1738
- mediaKey:undefined,
1739
- isQuotedMsgAvailable:false,
1740
- invis:false,
1741
- mediaKeyTimestamp:undefined,
1742
- mimetype:undefined,
1743
- height:undefined,
1744
- width:undefined,
1745
- ephemeralStartTimestamp:undefined,
1746
- body:undefined,
1747
- mediaData:undefined,
1709
+ clientUrl: undefined,
1710
+ directPath: undefined,
1711
+ filehash: undefined,
1712
+ uploadhash: undefined,
1713
+ mediaKey: undefined,
1714
+ isQuotedMsgAvailable: false,
1715
+ invis: false,
1716
+ mediaKeyTimestamp: undefined,
1717
+ mimetype: undefined,
1718
+ height: undefined,
1719
+ width: undefined,
1720
+ ephemeralStartTimestamp: undefined,
1721
+ body: undefined,
1722
+ mediaData: undefined,
1748
1723
  isQuotedMsgAvailable: false
1749
1724
  };
1750
1725
  Object.assign(tempMsg, extend);
1751
- return (await Promise.all(Store.addAndSendMsgToChat(chat, tempMsg)))[1]==='success' ? newId._serialized : false;
1726
+ return (await Promise.all(Store.addAndSendMsgToChat(chat, tempMsg)))[1] === 'success' ? newId._serialized : false;
1752
1727
  };
1753
1728
 
1754
1729
  /**
@@ -1772,38 +1747,38 @@ window.WAPI.sendVCard = async function (chatId, vcard, contactName, contactNumbe
1772
1747
  to: chatId,
1773
1748
  isNewMsg: !0,
1774
1749
  type: "vcard",
1775
- clientUrl:undefined,
1776
- directPath:undefined,
1777
- filehash:undefined,
1778
- uploadhash:undefined,
1779
- mediaKey:undefined,
1780
- isQuotedMsgAvailable:false,
1781
- invis:false,
1782
- mediaKeyTimestamp:undefined,
1783
- mimetype:undefined,
1784
- height:undefined,
1785
- width:undefined,
1786
- ephemeralStartTimestamp:undefined,
1787
- body:contactNumber?vcard.replace('TEL;TYPE=WORK,VOICE:',`TEL;TYPE=WORK,VOICE;waid=${contactNumber}:`):vcard,
1788
- mediaData:undefined,
1750
+ clientUrl: undefined,
1751
+ directPath: undefined,
1752
+ filehash: undefined,
1753
+ uploadhash: undefined,
1754
+ mediaKey: undefined,
1755
+ isQuotedMsgAvailable: false,
1756
+ invis: false,
1757
+ mediaKeyTimestamp: undefined,
1758
+ mimetype: undefined,
1759
+ height: undefined,
1760
+ width: undefined,
1761
+ ephemeralStartTimestamp: undefined,
1762
+ body: contactNumber ? vcard.replace('TEL;TYPE=WORK,VOICE:', `TEL;TYPE=WORK,VOICE;waid=${contactNumber}:`) : vcard,
1763
+ mediaData: undefined,
1789
1764
  isQuotedMsgAvailable: false,
1790
1765
  subtype: contactName
1791
1766
  };
1792
1767
  Object.assign(tempMsg, extend);
1793
- return (await Promise.all(Store.addAndSendMsgToChat(chat, tempMsg)))[1]=="success"
1768
+ return (await Promise.all(Store.addAndSendMsgToChat(chat, tempMsg)))[1] == "success"
1794
1769
  };
1795
1770
 
1796
1771
  window.WAPI.reply = async function (chatId, body, quotedMsg) {
1797
1772
  if (typeof quotedMsg !== "object") quotedMsg = Store.Msg.get(quotedMsg)
1798
1773
  var chat = Store.Chat.get(chatId);
1799
- if(!chat) return false;
1800
- let extras = {};
1801
- if(quotedMsg) {
1802
- extras = {
1803
- quotedParticipant: quotedMsg.author || quotedMsg.from,
1804
- quotedStanzaID:quotedMsg.id.id
1805
- };
1806
- }
1774
+ if (!chat) return false;
1775
+ let extras = {};
1776
+ if (quotedMsg) {
1777
+ extras = {
1778
+ quotedParticipant: quotedMsg.author || quotedMsg.from,
1779
+ quotedStanzaID: quotedMsg.id.id
1780
+ };
1781
+ }
1807
1782
  var tempMsg = Object.create(Store.Msg.models.filter(msg => msg.__x_isSentByMe && !msg.quotedMsg)[0]);
1808
1783
  var newId = window.WAPI.getNewMessageId(chatId);
1809
1784
  var extend = {
@@ -1812,7 +1787,7 @@ window.WAPI.reply = async function (chatId, body, quotedMsg) {
1812
1787
  local: !0,
1813
1788
  self: "out",
1814
1789
  t: parseInt(new Date().getTime() / 1000),
1815
- to: new Store.WidFactory.createWid(chatId),
1790
+ to: new Store.WidFactory.createWid(chatId),
1816
1791
  isNewMsg: !0,
1817
1792
  type: "chat",
1818
1793
  quotedMsg,
@@ -1821,7 +1796,7 @@ window.WAPI.reply = async function (chatId, body, quotedMsg) {
1821
1796
  };
1822
1797
  Object.assign(tempMsg, extend);
1823
1798
  const res = await Promise.all(await Store.addAndSendMsgToChat(chat, tempMsg));
1824
- if(res[1]!='success') return false;
1799
+ if (res[1] != 'success') return false;
1825
1800
  return res[0].id._serialized
1826
1801
  };
1827
1802
 
@@ -1878,7 +1853,7 @@ window.WAPI._sendVCard = function (chatId, vcard) {
1878
1853
  t: parseInt(new Date().getTime() / 1000),
1879
1854
  to: chatId,
1880
1855
  isNewMsg: !0,
1881
- isQuotedMsgAvailable:false,
1856
+ isQuotedMsgAvailable: false,
1882
1857
  };
1883
1858
 
1884
1859
  if (Array.isArray(vcard)) {
@@ -1976,7 +1951,7 @@ window.WAPI.demoteParticipant = async function (idGroup, idParticipant) {
1976
1951
  const demote = chat.groupMetadata.participants.get(idParticipant);
1977
1952
  await window.Store.Participants.demoteParticipants(chat, [demote])
1978
1953
  return true
1979
-
1954
+
1980
1955
  }
1981
1956
 
1982
1957
  /**
@@ -1988,33 +1963,33 @@ window.WAPI.demoteParticipant = async function (idGroup, idParticipant) {
1988
1963
  */
1989
1964
  window.WAPI._sendSticker = async function (sticker, chatId, metadata) {
1990
1965
  var chat = Store.Chat.get(chatId)
1991
- let stick = new window.Store.Sticker.modelClass();
1992
- stick.__x_clientUrl = sticker.clientUrl;
1993
- stick.__x_filehash = sticker.filehash;
1994
- stick.__x_id = sticker.filehash;
1995
- stick.__x_uploadhash = sticker.uploadhash;
1996
- stick.__x_mediaKey = sticker.mediaKey;
1997
- stick.__x_initialized = false;
1998
- stick.__x_mediaData.mediaStage = 'INIT';
1999
- stick.mimetype = 'image/webp';
2000
- stick.height = (metadata && metadata.height) ? metadata.height : 512;
2001
- stick.width = (metadata && metadata.width) ? metadata.width : 512;
2002
- await stick.initialize();
2003
- return await stick.sendToChat(chat);
1966
+ let stick = new window.Store.Sticker.modelClass();
1967
+ stick.__x_clientUrl = sticker.clientUrl;
1968
+ stick.__x_filehash = sticker.filehash;
1969
+ stick.__x_id = sticker.filehash;
1970
+ stick.__x_uploadhash = sticker.uploadhash;
1971
+ stick.__x_mediaKey = sticker.mediaKey;
1972
+ stick.__x_initialized = false;
1973
+ stick.__x_mediaData.mediaStage = 'INIT';
1974
+ stick.mimetype = 'image/webp';
1975
+ stick.height = (metadata && metadata.height) ? metadata.height : 512;
1976
+ stick.width = (metadata && metadata.width) ? metadata.width : 512;
1977
+ await stick.initialize();
1978
+ return await stick.sendToChat(chat);
2004
1979
  };
2005
1980
 
2006
1981
  window.WAPI.getFileHash = async (data) => {
2007
- let buffer = await data.arrayBuffer();
2008
- var sha = new jsSHA("SHA-256", "ARRAYBUFFER");
2009
- sha.update(buffer);
2010
- return sha.getHash("B64");
1982
+ let buffer = await data.arrayBuffer();
1983
+ var sha = new jsSHA("SHA-256", "ARRAYBUFFER");
1984
+ sha.update(buffer);
1985
+ return sha.getHash("B64");
2011
1986
  };
2012
1987
 
2013
1988
  window.WAPI.generateMediaKey = async (length) => {
2014
1989
  var result = '';
2015
1990
  var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
2016
1991
  var charactersLength = characters.length;
2017
- for ( var i = 0; i < length; i++ ) {
1992
+ for (var i = 0; i < length; i++) {
2018
1993
  result += characters.charAt(Math.floor(Math.random() * charactersLength));
2019
1994
  }
2020
1995
  return result;
@@ -2024,8 +1999,8 @@ window.WAPI.generateMediaKey = async (length) => {
2024
1999
  * @param type: The type of file. {'audio' | 'sticker' | 'video' | 'product' | 'document' | 'gif' | 'image' | 'ptt' | 'template' | 'history' | 'ppic'}
2025
2000
  * @param blob: file
2026
2001
  */
2027
- window.WAPI.encryptAndUploadFile = async function (type, blob) {
2028
- let filehash = await window.WAPI.getFileHash(blob);
2002
+ window.WAPI.encryptAndUploadFile = async function (type, blob) {
2003
+ let filehash = await window.WAPI.getFileHash(blob);
2029
2004
  let mediaKey = await window.WAPI.generateMediaKey(32);
2030
2005
  let controller = new AbortController();
2031
2006
  let signal = controller.signal;
@@ -2050,9 +2025,9 @@ window.WAPI.encryptAndUploadFile = async function (type, blob) {
2050
2025
  * @param {*} chatId '000000000000@c.us'
2051
2026
  * @param metadata about the image. Based on [sharp metadata](https://sharp.pixelplumbing.com/api-input#metadata)
2052
2027
  */
2053
- window.WAPI.sendImageAsSticker = async function (imageBase64,chatId, metadata) {
2028
+ window.WAPI.sendImageAsSticker = async function (imageBase64, chatId, metadata) {
2054
2029
  let mediaBlob = await window.WAPI.base64ImageToFile(
2055
- 'data:image/webp;base64,'+imageBase64,
2030
+ 'data:image/webp;base64,' + imageBase64,
2056
2031
  'file.webp'
2057
2032
  );
2058
2033
  let encrypted = await window.WAPI.encryptAndUploadFile("sticker", mediaBlob);
@@ -2064,87 +2039,87 @@ This will dump all possible stickers into the chat. ONLY FOR TESTING. THIS IS RE
2064
2039
  */
2065
2040
  window.WAPI._STICKERDUMP = async function (chatId) {
2066
2041
  var chat = Store.Chat.get(chatId);
2067
- let prIdx = await Store.StickerPack.pageWithIndex(0);
2068
- await Store.StickerPack.fetchAt(0);
2069
- await Store.StickerPack._pageFetchPromises[prIdx];
2070
- return await Promise.race(Store.StickerPack.models.forEach(pack=>pack.stickers.fetch().then(_=>pack.stickers.models.forEach(stkr => stkr.sendToChat(chat))))).catch(e=>{})
2042
+ let prIdx = await Store.StickerPack.pageWithIndex(0);
2043
+ await Store.StickerPack.fetchAt(0);
2044
+ await Store.StickerPack._pageFetchPromises[prIdx];
2045
+ return await Promise.race(Store.StickerPack.models.forEach(pack => pack.stickers.fetch().then(_ => pack.stickers.models.forEach(stkr => stkr.sendToChat(chat))))).catch(e => { })
2071
2046
  }
2072
2047
 
2073
2048
 
2074
2049
  window.WAPI.getLastSeen = async function (id) {
2075
- if(!Store.Chat.get(id)) return false;
2076
- let {presence} = Store.Chat.get(id)
2050
+ if (!Store.Chat.get(id)) return false;
2051
+ let { presence } = Store.Chat.get(id)
2077
2052
  await presence.subscribe();
2078
2053
  return presence.chatstate.t;
2079
- }
2080
-
2081
- window.WAPI.getUseHereString = async function() {
2082
- if (!window.l10n.localeStrings['en']){
2083
- const originalLocale = window.l10n.getLocale();
2084
- await window.l10n.init('en');
2085
- await window.l10n.init(originalLocale)
2086
- }
2087
- return window.l10n.localeStrings[window.l10n.getLocale()][0][window.l10n.localeStrings.en[0].findIndex(x=>x.toLowerCase()==='use here')]
2088
- }
2089
-
2090
- window.WAPI.getAmountOfLoadedMessages = function() {
2054
+ }
2055
+
2056
+ window.WAPI.getUseHereString = async function () {
2057
+ if (!window.l10n.localeStrings['en']) {
2058
+ const originalLocale = window.l10n.getLocale();
2059
+ await window.l10n.init('en');
2060
+ await window.l10n.init(originalLocale)
2061
+ }
2062
+ return window.l10n.localeStrings[window.l10n.getLocale()][0][window.l10n.localeStrings.en[0].findIndex(x => x.toLowerCase() === 'use here')]
2063
+ }
2064
+
2065
+ window.WAPI.getAmountOfLoadedMessages = function () {
2091
2066
  return Store.Msg.models.length;
2092
2067
  }
2093
2068
 
2094
- WAPI.getChatWithNonContacts = async function(){
2095
- return Store.Chat.models.map(chat=>chat.contact && !chat.contact.isMyContact ?chat.contact :null).filter(x=>x && !x.isGroup).map(WAPI._serializeContactObj)
2069
+ WAPI.getChatWithNonContacts = async function () {
2070
+ return Store.Chat.models.map(chat => chat.contact && !chat.contact.isMyContact ? chat.contact : null).filter(x => x && !x.isGroup).map(WAPI._serializeContactObj)
2096
2071
  }
2097
2072
 
2098
- window.WAPI.cutMsgCache = function (){
2099
- Store.Msg.models.map(msg=>Store.Msg.remove(msg));
2073
+ window.WAPI.cutMsgCache = function () {
2074
+ Store.Msg.models.map(msg => Store.Msg.remove(msg));
2100
2075
  return true;
2101
2076
  }
2102
2077
 
2103
- window.WAPI.getHostNumber = function() {
2078
+ window.WAPI.getHostNumber = function () {
2104
2079
  return WAPI.getMe().me.user;
2105
2080
  }
2106
2081
 
2107
2082
  //All of the following features can be unlocked using a license key: https://github.com/open-wa/wa-automate-nodejs#license-key
2108
- window.WAPI.getStoryStatusByTimeStamp = function(){return false;}
2109
- window.WAPI.deleteAllStatus = function(){return false;}
2110
- window.WAPI.getMyStatusArray = function(){return false;}
2111
- window.WAPI.deleteStatus = function(){return false;}
2112
- window.WAPI.setGroupToAdminsOnly = function(){return false;}
2113
- window.WAPI.setGroupEditToAdminsOnly = function(){return false;}
2114
- window.WAPI.postTextStatus = function(){return false;}
2115
- window.WAPI.postImageStatus = function(){return false;}
2116
- window.WAPI.postVideoStatus = function(){return false;}
2117
- window.WAPI.onRemovedFromGroup = function(){return false;}
2118
- window.WAPI.onContactAdded = function(){return false;}
2119
- window.WAPI.sendReplyWithMentions = function(){return false;}
2120
- window.WAPI.clearAllChats = function(){return false;}
2121
- window.WAPI.getCommonGroups = function(){return false;}
2122
- window.WAPI.setChatBackgroundColourHex = function(){return false;}
2123
- window.WAPI.darkMode = function(){return false;}
2124
- window.WAPI.onChatOpened = function(){return false;}
2125
- window.WAPI.onStory = function(){return false;}
2126
- window.WAPI.getStoryViewers = function(){return false;}
2127
- window.WAPI.onChatState = function(){return false;}
2128
- window.WAPI.getStickerDecryptable = function(){return false;}
2129
- window.WAPI.forceStaleMediaUpdate = function(){return false;}
2130
- window.WAPI.setProfilePic = function(){return false;}
2131
- window.WAPI.setGroupDescription = function(){return false;}
2132
- window.WAPI.setGroupTitle = function(){return false;}
2133
- window.WAPI.tagEveryone = function(){return false;}
2083
+ window.WAPI.getStoryStatusByTimeStamp = function () { return false; }
2084
+ window.WAPI.deleteAllStatus = function () { return false; }
2085
+ window.WAPI.getMyStatusArray = function () { return false; }
2086
+ window.WAPI.deleteStatus = function () { return false; }
2087
+ window.WAPI.setGroupToAdminsOnly = function () { return false; }
2088
+ window.WAPI.setGroupEditToAdminsOnly = function () { return false; }
2089
+ window.WAPI.postTextStatus = function () { return false; }
2090
+ window.WAPI.postImageStatus = function () { return false; }
2091
+ window.WAPI.postVideoStatus = function () { return false; }
2092
+ window.WAPI.onRemovedFromGroup = function () { return false; }
2093
+ window.WAPI.onContactAdded = function () { return false; }
2094
+ window.WAPI.sendReplyWithMentions = function () { return false; }
2095
+ window.WAPI.clearAllChats = function () { return false; }
2096
+ window.WAPI.getCommonGroups = function () { return false; }
2097
+ window.WAPI.setChatBackgroundColourHex = function () { return false; }
2098
+ window.WAPI.darkMode = function () { return false; }
2099
+ window.WAPI.onChatOpened = function () { return false; }
2100
+ window.WAPI.onStory = function () { return false; }
2101
+ window.WAPI.getStoryViewers = function () { return false; }
2102
+ window.WAPI.onChatState = function () { return false; }
2103
+ window.WAPI.getStickerDecryptable = function () { return false; }
2104
+ window.WAPI.forceStaleMediaUpdate = function () { return false; }
2105
+ window.WAPI.setProfilePic = function () { return false; }
2106
+ window.WAPI.setGroupDescription = function () { return false; }
2107
+ window.WAPI.setGroupTitle = function () { return false; }
2108
+ window.WAPI.tagEveryone = function () { return false; }
2134
2109
 
2135
2110
  /**
2136
2111
  * Patches
2137
2112
  */
2138
- window.WAPI.sendGiphyAsSticker = function(){return false;}
2139
- window.WAPI.getBlockedIds = function(){return false;}
2113
+ window.WAPI.sendGiphyAsSticker = function () { return false; }
2114
+ window.WAPI.getBlockedIds = function () { return false; }
2140
2115
 
2141
2116
  window.WAPI.quickClean = function (ob) {
2142
2117
  var r = JSON.parse(JSON.stringify(ob));
2143
- if(r.mediaData && Object.keys(r.mediaData).length==0) delete r.mediaData;
2144
- if(r.chat && Object.keys(r.chat).length==0) delete r.chat;
2145
- Object.keys(r).filter(k=>r[k]==""||r[k]==[]||r[k]=={}||r[k]==null).forEach(k=>delete r[k]);
2146
- Object.keys(r).filter(k=>r[k]?r[k]._serialized:false).forEach(k=>r[k]=r[k]._serialized);
2147
- Object.keys(r).filter(k=>r[k]?r[k].id:false).forEach(k=>r[k]=r[k].id);
2118
+ if (r.mediaData && Object.keys(r.mediaData).length == 0) delete r.mediaData;
2119
+ if (r.chat && Object.keys(r.chat).length == 0) delete r.chat;
2120
+ Object.keys(r).filter(k => r[k] == "" || r[k] == [] || r[k] == {} || r[k] == null).forEach(k => delete r[k]);
2121
+ Object.keys(r).filter(k => r[k] ? r[k]._serialized : false).forEach(k => r[k] = r[k]._serialized);
2122
+ Object.keys(r).filter(k => r[k] ? r[k].id : false).forEach(k => r[k] = r[k].id);
2148
2123
  return r;
2149
2124
  };
2150
2125
 
@@ -2161,25 +2136,25 @@ window.WAPI.pyFunc = async function (fn, done) {
2161
2136
  *
2162
2137
  * Please use google to find out how to disable CSP. You can also use this extension: https://chrome.google.com/webstore/detail/disable-content-security/ieelmcmcagommplceebfedjlakkhpden/related?hl=en
2163
2138
  */
2164
- window.WAPI.addLicenseKey = async function (key){
2165
- const pkgR = await fetch('https://raw.githubusercontent.com/open-wa/wa-automate-nodejs/master/package.json');
2139
+ window.WAPI.addLicenseKey = async function (key) {
2140
+ const pkgR = await fetch('https://raw.githubusercontent.com/open-wa/wa-automate-nodejs/master/package.json');
2166
2141
  const pkg = await pkgR.json();
2167
2142
  const body = JSON.stringify({
2168
- number: Store.Me.me._serialized,
2169
- key
2170
- });
2143
+ number: Store.Me.me._serialized,
2144
+ key
2145
+ });
2171
2146
  const r = await fetch(pkg.licenseCheckUrl, {
2172
- method: 'POST',
2173
- mode: 'cors',
2147
+ method: 'POST',
2148
+ mode: 'cors',
2174
2149
  cache: 'no-cache',
2175
2150
  headers: {
2176
- 'Content-Type': 'application/json'
2151
+ 'Content-Type': 'application/json'
2177
2152
  },
2178
- credentials: 'same-origin',
2153
+ credentials: 'same-origin',
2179
2154
  redirect: 'follow',
2180
- referrerPolicy: 'no-referrer',
2155
+ referrerPolicy: 'no-referrer',
2181
2156
  body
2182
- })
2183
- const x = await r.text()
2184
- return eval(x);
2185
- }
2157
+ })
2158
+ const x = await r.text()
2159
+ return eval(x);
2160
+ }