Add some disconnection handling and a method to set the last message ID map
This commit is contained in:
parent
5c7faa01a6
commit
c3f2a5dfe1
|
@ -115,14 +115,20 @@ export default class Client {
|
||||||
}
|
}
|
||||||
|
|
||||||
handleStart = async (req) => {
|
handleStart = async (req) => {
|
||||||
if (this.puppet !== null) {
|
let started = false
|
||||||
return { started: false, is_logged_in: await this.puppet.isLoggedIn() }
|
if (this.puppet === null) {
|
||||||
}
|
|
||||||
this.log("Opening new puppeteer for", this.userID)
|
this.log("Opening new puppeteer for", this.userID)
|
||||||
this.puppet = new MessagesPuppeteer(this.userID, this)
|
this.puppet = new MessagesPuppeteer(this.userID, this)
|
||||||
this.manager.puppets.set(this.userID, this.puppet)
|
this.manager.puppets.set(this.userID, this.puppet)
|
||||||
await this.puppet.start(!!req.debug)
|
await this.puppet.start(!!req.debug)
|
||||||
return { started: true, is_logged_in: await this.puppet.isLoggedIn() }
|
started = true
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
started,
|
||||||
|
is_logged_in: await this.puppet.isLoggedIn(),
|
||||||
|
is_connected: !await this.puppet.isDisconnected(),
|
||||||
|
is_permanently_disconnected: await this.puppet.isPermanentlyDisconnected(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handleStop = async () => {
|
handleStop = async () => {
|
||||||
|
@ -199,6 +205,7 @@ export default class Client {
|
||||||
disconnect: () => this.stop(),
|
disconnect: () => this.stop(),
|
||||||
login: () => this.puppet.waitForLogin(),
|
login: () => this.puppet.waitForLogin(),
|
||||||
send: req => this.puppet.sendMessage(req.chat_id, req.text),
|
send: req => this.puppet.sendMessage(req.chat_id, req.text),
|
||||||
|
set_last_message_ids: req => this.puppet.setLastMessageIDs(req.msg_ids),
|
||||||
get_chats: () => this.puppet.getRecentChats(),
|
get_chats: () => this.puppet.getRecentChats(),
|
||||||
get_chat: req => this.puppet.getChatInfo(req.chat_id),
|
get_chat: req => this.puppet.getChatInfo(req.chat_id),
|
||||||
get_messages: req => this.puppet.getMessages(req.chat_id),
|
get_messages: req => this.puppet.getMessages(req.chat_id),
|
||||||
|
|
|
@ -91,9 +91,11 @@ export default class MessagesPuppeteer {
|
||||||
// Wait for the page to load (either QR code for login or chat list when already logged in)
|
// Wait for the page to load (either QR code for login or chat list when already logged in)
|
||||||
await Promise.race([
|
await Promise.race([
|
||||||
this.page.waitForSelector("mw-main-container mws-conversations-list .conv-container",
|
this.page.waitForSelector("mw-main-container mws-conversations-list .conv-container",
|
||||||
{ visible: true }),
|
{ visible: true, timeout: 60000 }),
|
||||||
this.page.waitForSelector("mw-authentication-container mw-qr-code",
|
this.page.waitForSelector("mw-authentication-container mw-qr-code",
|
||||||
{ visible: true }),
|
{ visible: true, timeout: 60000 }),
|
||||||
|
this.page.waitForSelector("mw-unable-to-connect-container",
|
||||||
|
{ visible: true, timeout: 60000 }),
|
||||||
])
|
])
|
||||||
this.taskQueue.start()
|
this.taskQueue.start()
|
||||||
if (await this.isLoggedIn()) {
|
if (await this.isLoggedIn()) {
|
||||||
|
@ -153,6 +155,15 @@ export default class MessagesPuppeteer {
|
||||||
return await this.page.$("mw-main-container mws-conversations-list") !== null
|
return await this.page.$("mw-main-container mws-conversations-list") !== null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async isPermanentlyDisconnected() {
|
||||||
|
return await this.page.$("mw-unable-to-connect-container") !== null
|
||||||
|
}
|
||||||
|
|
||||||
|
async isDisconnected() {
|
||||||
|
// TODO we should observe this banner appearing and disappearing to notify about disconnects
|
||||||
|
return await this.page.$("mw-main-container mw-error-banner") !== null
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the IDs of the most recent chats.
|
* Get the IDs of the most recent chats.
|
||||||
*
|
*
|
||||||
|
@ -196,7 +207,20 @@ export default class MessagesPuppeteer {
|
||||||
* @return {Promise<[MessageData]>} - The messages visible in the chat.
|
* @return {Promise<[MessageData]>} - The messages visible in the chat.
|
||||||
*/
|
*/
|
||||||
async getMessages(id) {
|
async getMessages(id) {
|
||||||
return this.taskQueue.push(() => this._getMessagesUnsafe(id))
|
return this.taskQueue.push(async () => {
|
||||||
|
const messages = await this._getMessagesUnsafe(id)
|
||||||
|
if (messages.length > 0) {
|
||||||
|
this.mostRecentMessages.set(id, messages[messages.length - 1].id)
|
||||||
|
}
|
||||||
|
return messages
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
setLastMessageIDs(ids) {
|
||||||
|
for (const [chatID, messageID] of Object.entries(ids)) {
|
||||||
|
this.mostRecentMessages.set(+chatID, messageID)
|
||||||
|
}
|
||||||
|
this.log("Updated most recent message ID map:", this.mostRecentMessages)
|
||||||
}
|
}
|
||||||
|
|
||||||
async startObserving() {
|
async startObserving() {
|
||||||
|
@ -272,7 +296,8 @@ export default class MessagesPuppeteer {
|
||||||
const newFirstID = messages[0].id
|
const newFirstID = messages[0].id
|
||||||
const newLastID = messages[messages.length - 1].id
|
const newLastID = messages[messages.length - 1].id
|
||||||
this.mostRecentMessages.set(id, newLastID)
|
this.mostRecentMessages.set(id, newLastID)
|
||||||
this.log(`Loaded messages in ${id} after ${lastMsgID}: got ${newFirstID}-${newLastID}`)
|
const range = newFirstID === newLastID ? newFirstID : `${newFirstID}-${newLastID}`
|
||||||
|
this.log(`Loaded ${messages.length} messages in ${id} after ${lastMsgID}: got ${range}`)
|
||||||
|
|
||||||
if (this.client) {
|
if (this.client) {
|
||||||
for (const message of messages) {
|
for (const message of messages) {
|
||||||
|
|
Loading…
Reference in New Issue