Sync history conversation of the Chat (#3281)

* Sync historical message

* Add documentation

* Code simplify

* feat: add syncHistory method in Chat class

* docs: update docs

* chore: update examples

* fix: handle asynchronous function properly

* refactor: include await

---------

Co-authored-by: alechkos <93551621+alechkos@users.noreply.github.com>
This commit is contained in:
Kang 2024-09-20 16:29:08 +08:00 • committed by GitHub
commit 0fa6ebb66d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 42 additions and 3 deletions

View file

@ -458,6 +458,13 @@ client.on('message', async msg => {
*/
let deviceCount = await client.getContactDeviceCount(msg.from);
await msg.reply(`You have *${deviceCount}* devices connected`);
} else if (msg.body === '!syncHistory') {
const isSynced = await client.syncHistory(msg.from);
// Or through the Chat object:
// const chat = await client.getChatById(msg.from);
// const isSynced = await chat.syncHistory();
await msg.reply(isSynced ? 'Historical chat is syncing..' : 'There is no historical chat to sync.');
}
});

5
index.d.ts vendored
View file

@ -185,6 +185,9 @@ declare namespace WAWebJS {
*/
getContactDeviceCount(contactId: string): Promise<Number>
/** Sync history conversation of the Chat */
syncHistory(chatId: string): Promise<boolean>
/** Changes and returns the archive state of the Chat */
unarchiveChat(chatId: string): Promise<boolean>
@ -1440,6 +1443,8 @@ declare namespace WAWebJS {
getLabels: () => Promise<Label[]>,
/** Add or remove labels to this Chat */
changeLabels: (labelIds: Array<string | number>) => Promise<void>
/** Sync history conversation of the Chat */
syncHistory: () => Promise<boolean>
}
export interface MessageSearchOptions {

View file

@ -1739,6 +1739,24 @@ class Client extends EventEmitter {
}
return 0;
}
/**
* Sync chat history conversation
* @param {string} chatId
* @return {Promise<boolean>} True if operation completed successfully, false otherwise.
*/
async syncHistory(chatId) {
return await this.pupPage.evaluate(async (chatId) => {
const chat = await window.WWebJS.getChat(chatId);
if (chat.endOfHistoryTransferType === 0) {
await window.Store.HistorySync.sendPeerDataOperationRequest(3, {
chatId: chat.id
});
return true;
}
return false;
}, chatId);
}
}
module.exports = Client;

View file

@ -270,6 +270,14 @@ class Chat extends Base {
async changeLabels(labelIds) {
return this.client.addOrRemoveLabels(labelIds, [this.id._serialized]);
}
/**
* Sync chat history conversation
* @return {Promise<boolean>} True if operation completed successfully, false otherwise.
*/
async syncHistory() {
return this.client.syncHistory(this.id._serialized);
}
}
module.exports = Chat;

View file

@ -98,6 +98,7 @@ exports.ExposeStore = () => {
window.Store.BotSecret = window.require('WAWebBotMessageSecret');
window.Store.BotProfiles = window.require('WAWebBotProfileCollection');
window.Store.DeviceList = window.require('WAWebApiDeviceList');
window.Store.HistorySync = window.require('WAWebSendNonMessageDataRequest');
if (window.compareWwebVersions(window.Debug.VERSION, '>=', '2.3000.1014111620'))
window.Store.AddonReactionTable = window.require('WAWebAddonReactionTableMode').reactionTableMode;