Spaces:
Paused
Paused
| /* | |
| * This file is part of WPPConnect. | |
| * | |
| * WPPConnect is free software: you can redistribute it and/or modify | |
| * it under the terms of the GNU Lesser General Public License as published by | |
| * the Free Software Foundation, either version 3 of the License, or | |
| * (at your option) any later version. | |
| * | |
| * WPPConnect is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| * GNU Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public License | |
| * along with WPPConnect. If not, see <https://www.gnu.org/licenses/>. | |
| */ | |
| import { getBusinessProfilesProducts, getOrderbyMsg } from './business'; | |
| import { | |
| _getGroupParticipants, | |
| areAllMessagesLoaded, | |
| asyncLoadAllEarlierMessages, | |
| createProduct, | |
| downloadFile, | |
| encryptAndUploadFile, | |
| forwardMessages, | |
| getAllChatIds, | |
| getAllChats, | |
| getAllChatsWithMessages, | |
| getAllChatsWithNewMessages, | |
| getAllContacts, | |
| getAllGroupMetadata, | |
| getAllGroups, | |
| getAllMessagesInChat, | |
| getAllNewMessages, | |
| getAllUnreadMessages, | |
| getBatteryLevel, | |
| getChat, | |
| getChatById, | |
| getChatByName, | |
| getchatId, | |
| getCommonGroups, | |
| getContact, | |
| getGroupMetadata, | |
| getGroupParticipantIDs, | |
| getHost, | |
| getListMute, | |
| getMe, | |
| getMessageById, | |
| getMessages, | |
| getMyContacts, | |
| getNewId, | |
| getNumberProfile, | |
| getSessionTokenBrowser, | |
| getTheme, | |
| getUnreadMessages, | |
| getUnreadMessagesInChat, | |
| getWid, | |
| hasUndreadMessages, | |
| interfaceMute, | |
| isConnected, | |
| isLoggedIn, | |
| loadAllEarlierMessages, | |
| loadAndGetAllMessagesInChat, | |
| loadChatEarlierMessages, | |
| loadEarlierMessagesTillDate, | |
| pinChat, | |
| processFiles, | |
| processMessageObj, | |
| scope, | |
| sendChatstate, | |
| sendExist, | |
| sendFile, | |
| sendImage, | |
| sendImageWithProduct, | |
| sendLinkPreview, | |
| sendLocation, | |
| sendMessage, | |
| sendMessage2, | |
| sendMessageOptions, | |
| sendMessageWithTags, | |
| sendMessageWithThumb, | |
| sendMute, | |
| sendPtt, | |
| sendVideoAsGif, | |
| setMyName, | |
| setOnlinePresence, | |
| setProfilePic, | |
| setTemporaryMessages, | |
| setTheme, | |
| starMessages, | |
| startPhoneWatchdog, | |
| stopPhoneWatchdog, | |
| subscribePresence, | |
| unsubscribePresence, | |
| } from './functions'; | |
| import { | |
| arrayBufferToBase64, | |
| base64ToFile, | |
| generateMediaKey, | |
| getFileHash, | |
| } from './helper'; | |
| import { | |
| addNewMessagesListener, | |
| addOnAddedToGroup, | |
| addOnLiveLocation, | |
| addOnNewAcks, | |
| addOnNotificationMessage, | |
| addOnParticipantsChange, | |
| addOnPresenceChanged, | |
| addOnStateChange, | |
| addOnStreamChange, | |
| allNewMessagesListener, | |
| initNewMessagesListener, | |
| } from './listeners'; | |
| import { | |
| _profilePicfunc, | |
| _serializeChatObj, | |
| _serializeContactObj, | |
| _serializeMessageObj, | |
| _serializeNumberStatusObj, | |
| _serializeProfilePicThumb, | |
| _serializeRawObj, | |
| } from './serializers'; | |
| import { storeObjects } from './store/store-objects'; | |
| const readyPromise = new Promise((resolve) => { | |
| if (WPP.isReady) { | |
| resolve(); | |
| return; | |
| } | |
| WPP.webpack.onReady(resolve); | |
| }); | |
| if (typeof window.Store === 'undefined') { | |
| window.Store = {}; | |
| window.Store.promises = {}; | |
| readyPromise.then(() => { | |
| for (const store of storeObjects) { | |
| window.Store.promises[store.id] = Promise.resolve( | |
| WPP.webpack.search(store.conditions) | |
| ) | |
| .then((m) => { | |
| if (!m) { | |
| console.error(`Store Object '${store.id}' was not found`); | |
| } | |
| return m; | |
| }) | |
| .then(store.conditions) | |
| .then((m) => { | |
| if (store.id === 'Store') { | |
| window.Store = Object.assign({}, window.Store, m); | |
| } else { | |
| window.Store[store.id] = m; | |
| } | |
| }); | |
| } | |
| }); | |
| } | |
| if (typeof window.WAPI === 'undefined') { | |
| window.WAPI = { | |
| lastRead: {}, | |
| }; | |
| //others | |
| window.WAPI.interfaceMute = interfaceMute; | |
| //Profile | |
| window.WAPI.setProfilePic = setProfilePic; | |
| window.WAPI.getSessionTokenBrowser = getSessionTokenBrowser; | |
| // Chat Functions | |
| window.WAPI.scope = scope; | |
| window.WAPI.getchatId = getchatId; | |
| window.WAPI.sendExist = sendExist; | |
| window.WAPI.pinChat = pinChat; | |
| window.WAPI.setTemporaryMessages = setTemporaryMessages; | |
| // Layout Functions | |
| window.WAPI.setTheme = setTheme; | |
| window.WAPI.getTheme = getTheme; | |
| // Serializers assignations | |
| window.WAPI._serializeRawObj = _serializeRawObj; | |
| window.WAPI._serializeChatObj = _serializeChatObj; | |
| window.WAPI._serializeContactObj = _serializeContactObj; | |
| window.WAPI._serializeMessageObj = _serializeMessageObj; | |
| window.WAPI._serializeNumberStatusObj = _serializeNumberStatusObj; | |
| window.WAPI._serializeProfilePicThumb = _serializeProfilePicThumb; | |
| window.WAPI._profilePicfunc = _profilePicfunc; | |
| // Chatting functions | |
| window.WAPI.sendChatstate = sendChatstate; | |
| window.WAPI.sendMessageWithThumb = sendMessageWithThumb; | |
| window.WAPI.processMessageObj = processMessageObj; | |
| window.WAPI.sendMessageWithTags = sendMessageWithTags; | |
| window.WAPI.sendMessage = sendMessage; | |
| window.WAPI.sendMessage2 = sendMessage2; | |
| window.WAPI.sendImage = sendImage; | |
| window.WAPI.sendPtt = sendPtt; | |
| window.WAPI.sendFile = sendFile; | |
| window.WAPI.setMyName = setMyName; | |
| window.WAPI.sendVideoAsGif = sendVideoAsGif; | |
| window.WAPI.processFiles = processFiles; | |
| window.WAPI.sendImageWithProduct = sendImageWithProduct; | |
| window.WAPI.createProduct = createProduct; | |
| window.WAPI.forwardMessages = forwardMessages; | |
| window.WAPI.encryptAndUploadFile = encryptAndUploadFile; | |
| window.WAPI.setOnlinePresence = setOnlinePresence; | |
| window.WAPI.sendLocation = sendLocation; | |
| window.WAPI.sendLinkPreview = sendLinkPreview; | |
| window.WAPI.sendMessageOptions = sendMessageOptions; | |
| window.WAPI.starMessages = starMessages; | |
| // Retrieving functions | |
| window.WAPI.getAllContacts = getAllContacts; | |
| window.WAPI.getMyContacts = getMyContacts; | |
| window.WAPI.getContact = getContact; | |
| window.WAPI.getAllChats = getAllChats; | |
| window.WAPI.haveNewMsg = hasUndreadMessages; | |
| window.WAPI.getAllChatsWithNewMsg = getAllChatsWithNewMessages; | |
| window.WAPI.getAllChatIds = getAllChatIds; | |
| window.WAPI.getAllNewMessages = getAllNewMessages; | |
| window.WAPI.getAllUnreadMessages = getAllUnreadMessages; | |
| window.WAPI.getAllChatsWithMessages = getAllChatsWithMessages; | |
| window.WAPI.getAllGroups = getAllGroups; | |
| window.WAPI.getChat = getChat; | |
| window.WAPI.getChatByName = getChatByName; | |
| window.WAPI.getNewId = getNewId; | |
| window.WAPI.getChatById = getChatById; | |
| window.WAPI.getUnreadMessagesInChat = getUnreadMessagesInChat; | |
| window.WAPI.loadEarlierMessages = loadChatEarlierMessages; | |
| window.WAPI.loadAllEarlierMessages = loadAllEarlierMessages; | |
| window.WAPI.asyncLoadAllEarlierMessages = asyncLoadAllEarlierMessages; | |
| window.WAPI.areAllMessagesLoaded = areAllMessagesLoaded; | |
| window.WAPI.loadEarlierMessagesTillDate = loadEarlierMessagesTillDate; | |
| window.WAPI.getAllGroupMetadata = getAllGroupMetadata; | |
| window.WAPI.getGroupMetadata = getGroupMetadata; | |
| window.WAPI._getGroupParticipants = _getGroupParticipants; | |
| window.WAPI.getGroupParticipantIDs = getGroupParticipantIDs; | |
| window.WAPI.getAllMessagesInChat = getAllMessagesInChat; | |
| window.WAPI.loadAndGetAllMessagesInChat = loadAndGetAllMessagesInChat; | |
| window.WAPI.getUnreadMessages = getUnreadMessages; | |
| window.WAPI.getCommonGroups = getCommonGroups; | |
| window.WAPI.downloadFile = downloadFile; | |
| window.WAPI.getNumberProfile = getNumberProfile; | |
| window.WAPI.getMessageById = getMessageById; | |
| window.WAPI.getMessages = getMessages; | |
| window.WAPI.getFileHash = getFileHash; | |
| window.WAPI.generateMediaKey = generateMediaKey; | |
| window.WAPI.arrayBufferToBase64 = arrayBufferToBase64; | |
| window.WAPI.getListMute = getListMute; | |
| // Device functions | |
| window.WAPI.getHost = getHost; | |
| window.WAPI.getWid = getWid; | |
| window.WAPI.getMe = getMe; | |
| window.WAPI.isConnected = isConnected; | |
| window.WAPI.isLoggedIn = isLoggedIn; | |
| window.WAPI.getBatteryLevel = getBatteryLevel; | |
| window.WAPI.base64ImageToFile = base64ToFile; | |
| window.WAPI.base64ToFile = base64ToFile; | |
| window.WAPI.sendMute = sendMute; | |
| window.WAPI.startPhoneWatchdog = startPhoneWatchdog; | |
| window.WAPI.stopPhoneWatchdog = stopPhoneWatchdog; | |
| window.WAPI.subscribePresence = subscribePresence; | |
| window.WAPI.unsubscribePresence = unsubscribePresence; | |
| // business functions | |
| window.WAPI.getBusinessProfilesProducts = getBusinessProfilesProducts; | |
| window.WAPI.getOrderbyMsg = getOrderbyMsg; | |
| // Listeners initialization | |
| window.WAPI._newMessagesQueue = []; | |
| window.WAPI._newMessagesBuffer = | |
| sessionStorage.getItem('saved_msgs') != null | |
| ? JSON.parse(sessionStorage.getItem('saved_msgs')) | |
| : []; | |
| window.WAPI._newMessagesDebouncer = null; | |
| window.WAPI._newMessagesCallbacks = []; | |
| // Listeners | |
| window.addEventListener('unload', window.WAPI._unloadInform, false); | |
| window.addEventListener('beforeunload', window.WAPI._unloadInform, false); | |
| window.addEventListener('pageunload', window.WAPI._unloadInform, false); | |
| // On-work below: | |
| window.WAPI.getProfilePicSmallFromId = async function (id) { | |
| return await WPP.whatsapp.ProfilePicThumbStore.find(id).then( | |
| async function (d) { | |
| if (d.img !== undefined) { | |
| return await window.WAPI.downloadFileWithCredentials(d.img); | |
| } else { | |
| return false; | |
| } | |
| }, | |
| function (e) { | |
| return false; | |
| } | |
| ); | |
| }; | |
| window.WAPI.getProfilePicFromId = async function (id) { | |
| return await WPP.whatsapp.ProfilePicThumbStore.find(id).then( | |
| async function (d) { | |
| if (d.imgFull !== undefined) { | |
| return await window.WAPI.downloadFileWithCredentials(d.imgFull); | |
| } else { | |
| return false; | |
| } | |
| }, | |
| function (e) { | |
| return false; | |
| } | |
| ); | |
| }; | |
| window.WAPI.downloadFileWithCredentials = async function (url) { | |
| if (!axios || !url) return false; | |
| const ab = ( | |
| await axios.get(url, { | |
| responseType: 'arraybuffer', | |
| }) | |
| ).data; | |
| return btoa( | |
| new Uint8Array(ab).reduce( | |
| (data, byte) => data + String.fromCharCode(byte), | |
| '' | |
| ) | |
| ); | |
| }; | |
| window.WAPI._serializeNumberStatusObj = (obj) => { | |
| if (obj == undefined) { | |
| return null; | |
| } | |
| return Object.assign( | |
| {}, | |
| { | |
| id: obj.jid, | |
| status: obj.status, | |
| isBusiness: obj.biz === true, | |
| canReceiveMessage: obj.status === 200, | |
| } | |
| ); | |
| }; | |
| window.WAPI.checkNumberStatus = async function (id) { | |
| const result = await WPP.contact.queryExists(id); | |
| if (!result) { | |
| return { | |
| id: id, | |
| isBusiness: false, | |
| canReceiveMessage: false, | |
| numberExists: false, | |
| status: 404, | |
| }; | |
| } | |
| return { | |
| id: result.wid, | |
| isBusiness: result.biz, | |
| canReceiveMessage: true, | |
| numberExists: true, | |
| status: 200, | |
| }; | |
| }; | |
| window.WAPI.getChatIsOnline = async function (chatId) { | |
| const chat = WPP.whatsapp.ChatStore.get(chatId); | |
| if (!chat) { | |
| return false; | |
| } | |
| await chat.presence.subscribe(); | |
| return chat.presence.attributes.isOnline; | |
| }; | |
| window.WAPI.getLastSeen = async function (chatId) { | |
| const chat = WPP.whatsapp.ChatStore.get(chatId); | |
| if (!chat) { | |
| return false; | |
| } | |
| if (!chat.presence.hasData) { | |
| await chat.presence.subscribe(); | |
| await new Promise((resolve) => setTimeout(resolve, 100)); | |
| } | |
| return chat.presence.chatstate.t || false; | |
| }; | |
| window.WAPI.getWAVersion = function () { | |
| return window.Debug.VERSION; | |
| }; | |
| /** | |
| * @param NumberChatsDelete Number of chats that will be deleted | |
| */ | |
| //Add Marcelo 21/10/2023 | |
| window.WAPI.deleteOldChats = async function (NumberChatsDelete) { | |
| const options = { | |
| onlyWithUnreadMessage: false, | |
| onlyUsers: true, | |
| }; | |
| try { | |
| const chats = await window.WAPI.chat.list(options); | |
| chats.reverse(); | |
| const numChatsToDelete = Math.min(NumberChatsDelete, chats.length); | |
| for (let i = 0; i < numChatsToDelete; i++) { | |
| await window.WAPI.chat | |
| .delete(chats[i].id._serialized) | |
| .then((_) => true) | |
| .catch((_) => false); | |
| } | |
| } catch (e) { | |
| console.error('Erro:', e); | |
| return e; | |
| } | |
| }; | |
| /** | |
| * @param id The id of the conversation | |
| * @param archive boolean true => archive, false => unarchive | |
| * @return boolean true: worked, false: didnt work (probably already in desired state) | |
| */ | |
| window.WAPI.archiveChat = async function (id, archive) { | |
| const promise = Store.Archive.setArchive( | |
| WPP.whatsapp.ChatStore.get(id), | |
| archive | |
| ) | |
| .then((_) => true) | |
| .catch((_) => false); | |
| return await Promise.resolve(promise); | |
| }; | |
| /** | |
| * @param content Status Message Text | |
| * @param options {backgroundColor: '#0275d8', font: 2} | |
| */ | |
| window.WAPI.sendTextStatus = async function (content, options) { | |
| try { | |
| const result = await WPP.status.sendTextStatus(content, options); | |
| return result; | |
| } catch (err) { | |
| console.log(err); | |
| return err; | |
| } | |
| }; | |
| /** | |
| * @param base64 data:image/jpeg;base64,<a long base64 file...> | |
| * @param options {backgroundColor: '#0275d8', font: 2} | |
| */ | |
| window.WAPI.sendImageStatus = async function (base64, options) { | |
| try { | |
| const result = await WPP.status.sendImageStatus(base64, options); | |
| return result; | |
| } catch (err) { | |
| console.log(err); | |
| return err; | |
| } | |
| }; | |
| /** | |
| * @param base64 data:video/mp4;base64,<a long base64 file...> | |
| * @param options {backgroundColor: '#0275d8', font: 2} | |
| */ | |
| window.WAPI.sendVideoStatus = async function (base64, options) { | |
| try { | |
| const result = await WPP.status.sendVideoStatus(base64, options); | |
| return result; | |
| } catch (err) { | |
| console.log(err); | |
| return err; | |
| } | |
| }; | |
| window.WAPI.takeOver = async function () { | |
| await WPP.whatsapp.Socket.takeover(); | |
| return true; | |
| }; | |
| /** | |
| * Registers a callback to be called when your phone receives a new call request. | |
| * @param callback - function - Callback function to be called upon a new call. returns a call object. | |
| * @returns {boolean} | |
| */ | |
| window.WAPI.onIncomingCall = function (callback) { | |
| WPP.whatsapp.CallStore.on('add', callback); | |
| return true; | |
| }; | |
| /** | |
| * Registers a callback to be called when the interface change | |
| * @param callback - function - Callback function to be called upon interface change. returns a call object. | |
| * @returns {boolean} | |
| */ | |
| window.WAPI.onInterfaceChange = function (callback) { | |
| const getData = () => ({ | |
| displayInfo: WPP.whatsapp.Stream.displayInfo, | |
| mode: WPP.whatsapp.Stream.mode, | |
| info: WPP.whatsapp.Stream.info, | |
| }); | |
| callback(getData()); | |
| WPP.whatsapp.Stream.on('change:info change:displayInfo change:mode', () => { | |
| callback(getData()); | |
| }); | |
| return true; | |
| }; | |
| window.WAPI.onStreamModeChanged = function (callback) { | |
| callback(WPP.conn.getStreamData().mode); | |
| WPP.on('conn.stream_mode_changed', (mode) => { | |
| callback(mode); | |
| }); | |
| return true; | |
| }; | |
| window.WAPI.onStreamInfoChanged = function (callback) { | |
| callback(WPP.conn.getStreamData().info); | |
| WPP.on('conn.stream_info_changed', (info) => { | |
| callback(info); | |
| }); | |
| return true; | |
| }; | |
| window.WAPI.setMessagesAdminsOnly = async function (chatId, option) { | |
| await WPP.group.setProperty(chatId, 'announcement', option); | |
| return true; | |
| }; | |
| window.WAPI.logout = async function () { | |
| return await WPP.conn.logout(); | |
| }; | |
| /** | |
| * @todo Temporary fix while is not implemented on WA-JS | |
| */ | |
| window.WAPI.isRegistered = function () { | |
| const m = WPP.webpack.search((m) => m.isRegistered); | |
| return m.isRegistered(); | |
| }; | |
| readyPromise.then(addOnStreamChange); | |
| readyPromise.then(addOnStateChange); | |
| readyPromise.then(initNewMessagesListener); | |
| readyPromise.then(addNewMessagesListener); | |
| readyPromise.then(allNewMessagesListener); | |
| readyPromise.then(addOnNewAcks); | |
| readyPromise.then(addOnAddedToGroup); | |
| readyPromise.then(addOnLiveLocation); | |
| readyPromise.then(addOnParticipantsChange); | |
| readyPromise.then(addOnNotificationMessage); | |
| readyPromise.then(addOnPresenceChanged); | |
| } | |