diff --git a/src/puppet-padchat/bridge.ts b/src/puppet-padchat/bridge.ts index 0226f2c72aa0fbf717a117390fc56b636a84c00d..677d64e90c2daf4171965a7ee2b84214972e82ce 100644 --- a/src/puppet-padchat/bridge.ts +++ b/src/puppet-padchat/bridge.ts @@ -74,8 +74,6 @@ export class Bridge extends EventEmitter { // private password? : string // private nickname? : string - // private loginSucceed = false - private cacheRoomRawPayload : { [id: string]: PadchatRoomPayload } private cacheContactRawPayload : { [id: string]: PadchatContactPayload } @@ -88,12 +86,12 @@ export class Bridge extends EventEmitter { log.verbose('PuppetPadchatBridge', 'constructor()') // this.userId = options.token - this.cacheRoomRawPayload = {} + this.cacheRoomRawPayload = {} this.cacheContactRawPayload = {} + this.autoData = {} - this.state = new StateSwitch('PuppetPadchatBridge') - this.autoData = {} this.padchatRpc = new PadchatRpc(options.endpoint, options.token) + this.state = new StateSwitch('PuppetPadchatBridge') } public async start(): Promise { @@ -103,7 +101,7 @@ export class Bridge extends EventEmitter { this.cacheContactRawPayload = {} if (this.selfId) { - throw new Error('username exist') + throw new Error('selfId exist') } this.state.on('pending') @@ -152,10 +150,11 @@ export class Bridge extends EventEmitter { this.stopLogin() - this.saveAutoData() - this.selfId = username this.emit('login', this.selfId) + + this.saveAutoData(this.selfId) + } public logout(): void { @@ -271,46 +270,58 @@ export class Bridge extends EventEmitter { return } + /** + * Offline, then relogin + * emit qrcode or send login request to the user. + */ protected async restoreLogin(): Promise { - /** - * 1. The following `if/else` block: emit qrcode or send login request to the user. - */ - if (this.autoData && this.autoData.token) { - log.silly('PuppetPadchatBridge', `initLogin() autoData.token exist for %s`, - this.autoData.nick_name || 'no nick_name', - ) - // Offline, then relogin - const autoLoginResult = await this.padchatRpc.WXAutoLogin(this.autoData.token) - - if (autoLoginResult) { - if (autoLoginResult.status === 0) { - /** - * 1.1 Auto Login Success, return username as the result - */ - this.login(autoLoginResult.user_name) - return true + log.verbose('PuppetPadchatBridge', `initLogin()`) - } else { - /** - * 1.2. Send Login Request to User to be confirm(the same as the user had scaned the QrCode) - */ - const loginRequestResult = await this.padchatRpc.WXLoginRequest(this.autoData.token) - - if (!loginRequestResult || loginRequestResult.status !== 0) { - /** - * 1.2.1 Login Request Not Valid, emit QrCode for scan. - */ - await this.emitLoginQrCode() - } - } - } else { + if (!this.autoData || !this.autoData.token) { + return false + } + + log.silly('PuppetPadchatBridge', `initLogin() autoData.token exist for %s`, + this.autoData.nick_name || 'no nick_name', + ) + + const autoLoginResult = await this.padchatRpc.WXAutoLogin(this.autoData.token) + + if (!autoLoginResult) { + /** + * 1. No Auto Login, emit QrCode for scan + */ + await this.emitLoginQrCode() + return false + } + + if (autoLoginResult.status === 0) { + /** + * 2 Auto Login Success + */ + this.login(autoLoginResult.user_name) + return true + + } else { + /** + * 3. Send Login Request to User to be confirm(the same as the user had scaned the QrCode) + */ + const loginRequestResult = await this.padchatRpc.WXLoginRequest(this.autoData.token) + + if (!loginRequestResult || loginRequestResult.status !== 0) { /** - * 1.3. No Auto Login, emit QrCode for scan + * 3.1 Login Request Not Valid, emit QrCode for scan. */ await this.emitLoginQrCode() + return false + + } else { + /** + * 3.2 Login Request Valid, wait user to confirm on the phone. + */ + return false } } - return false } protected async emitLoginQrCode(): Promise { @@ -322,8 +333,9 @@ export class Bridge extends EventEmitter { const result = await this.padchatRpc.WXGetQRCode() if (!result) { - // if fail, do we need to await this.WXInitialize() again??? - throw new Error('waitLogin() WXGetQrCode() return nothing') + log.verbose('PuppetPadchatBridge', `emitLoginQrCode() result not found. Call WXInitialize() and try again ...`) + await this.padchatRpc.WXInitialize() + return await this.emitLoginQrCode() } const qrCodeText = await pfHelper.imageBase64ToQrCode(result.qr_code) @@ -339,14 +351,21 @@ export class Bridge extends EventEmitter { } - protected async saveAutoData(): Promise { - log.verbose('PuppetPadchatBridge', `loadAutoData()`) + protected async saveAutoData(selfId: string): Promise { + log.verbose('PuppetPadchatBridge', `loadAutoData(%s)`, selfId) await this.padchatRpc.WXHeartBeat() + if (!this.autoData.wxData || this.autoData.user_name !== selfId) { + log.verbose('PuppetPadchatBridge', `loadAutoData() user_name(%s) !== selfId(%s)`, + this.autoData.user_name, + selfId, + ) + this.autoData.wxData = (await this.padchatRpc.WXGenerateWxDat()).data + } + // Check 62 data. If has then use, or save 62 data here. this.autoData.token = (await this.padchatRpc.WXGetLoginToken()).token - this.autoData.wxData = (await this.padchatRpc.WXGenerateWxDat()).data if (!this.autoData.user_name || !this.autoData.wxData || !this.autoData.token) { throw new Error('autoData error') @@ -365,7 +384,7 @@ export class Bridge extends EventEmitter { // Check for 62 data, if has, then use WXLoadWxDat if (this.autoData.wxData) { - log.silly('PuppetPadchatBridge', `start(), get 62 data`) + log.silly('PuppetPadchatBridge', `loadAutoData() load 62 data`) await this.padchatRpc.WXLoadWxDat(this.autoData.wxData) } } diff --git a/src/puppet-padchat/puppet-padchat.ts b/src/puppet-padchat/puppet-padchat.ts index c43915f1ff6e36b73f329537f6958ba0902c3e71..557ebef83da4aa2777c83e20b30a444cb409201f 100644 --- a/src/puppet-padchat/puppet-padchat.ts +++ b/src/puppet-padchat/puppet-padchat.ts @@ -115,7 +115,6 @@ export class PuppetPadchat extends Puppet { memory : this.options.memory, token : WECHATY_PUPPET_PADCHAT_TOKEN, endpoint: WECHATY_PUPPET_PADCHAT_ENDPOINT, - // profile: profile, // should be profile in the future }) } @@ -263,7 +262,7 @@ export class PuppetPadchat extends Puppet { this.emit('logout', this.id) // becore we will throw above by logonoff() when this.user===undefined this.id = undefined - // TODO: this.bridge.logout + await this.bridge.logout() } /** @@ -381,7 +380,7 @@ export class PuppetPadchat extends Puppet { log.verbose('PuppetPadchat', 'messageSend(%s, %s)', receiver, text) const id = receiver.contactId || receiver.roomId if (!id) { - throw Error('No id') + throw Error('no id') } await this.bridge.WXSendMsg(id, text) }