UNPKG

@juzi/wechaty-puppet-whatsapp

Version:
146 lines 8.07 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const whatsapp_interface_js_1 = require("../schema/whatsapp-interface.js"); const whatsapp_base_js_1 = __importDefault(require("./whatsapp-base.js")); const config_js_1 = require("../config.js"); const rxjs_1 = require("rxjs"); const login_event_handler_js_1 = __importDefault(require("./event-handler/login-event-handler.js")); const message_event_handler_js_1 = __importDefault(require("./event-handler/message-event-handler.js")); const group_event_handler_js_1 = __importDefault(require("./event-handler/group-event-handler.js")); const contact_event_handler_js_1 = __importDefault(require("./event-handler/contact-event-handler.js")); const PRE = 'WhatsAppManager'; class WhatsAppManager extends whatsapp_base_js_1.default { botEventHandler; messageEventHandler; groupEventHandler; contactEventHandler; constructor(manager) { super(manager); this.botEventHandler = new login_event_handler_js_1.default(manager); this.messageEventHandler = new message_event_handler_js_1.default(manager); this.groupEventHandler = new group_event_handler_js_1.default(manager); this.contactEventHandler = new contact_event_handler_js_1.default(manager); this.botEventHandler.on({ login: data => this.emit('login', data), logout: (botId, data) => this.emit('logout', botId, data), ready: () => this.emit('ready'), scan: data => this.emit('scan', data), }); this.messageEventHandler.on({ friendship: data => this.emit('friendship', data), message: data => this.emit('message', data), 'room-invite': data => this.emit('room-invite', data), dirty: data => this.emit('dirty', data), }); this.groupEventHandler.on({ 'room-join': data => this.emit('room-join', data), 'room-leave': data => this.emit('room-leave', data), 'room-topic': data => this.emit('room-topic', data), dirty: data => this.emit('dirty', data), }); this.contactEventHandler.on({ friendship: data => this.emit('friendship', data), dirty: data => this.emit('dirty', data), }); } async stop() { await this.getWhatsAppClient().stop(); this.baseStop(); this.botEventHandler.clearQrcodeOrLoginCheckTimer(); } async genWhatsAppClient(options = {}, session = 'default-client') { config_js_1.log.verbose(PRE, 'initWhatsAppClient()'); const { puppeteer = {}, ...restOptions } = options; const { args, ...restPuppeteerOptions } = puppeteer; const puppeteerOptions = { /** * No usable sandbox! * https://github.com/pedroslopez/whatsapp-web.js/issues/344#issuecomment-691570764 */ args: [ '--no-sandbox', '--disable-setuid-sandbox', ...(puppeteer.args || []), ], headless: true, ...restPuppeteerOptions, }; this.whatsAppClient = new whatsapp_interface_js_1.Client({ authStrategy: new whatsapp_interface_js_1.LocalAuth({ clientId: session }), puppeteer: puppeteerOptions, // can no longer customize refresh interval // refresh time gap is set to 15 seconds restartOnAuthFail: true, ...restOptions, }); await this.setSession(session); return this.whatsAppClient; } async initWhatsAppClient() { const whatsAppClient = this.getWhatsAppClient(); whatsAppClient .initialize() .then(() => config_js_1.log.verbose(PRE, 'start() whatsapp.initialize() done.')) .catch(async (e) => { config_js_1.log.error(PRE, 'start() whatsapp.initialize() rejection: %s', e); }); } async initWhatsAppEvents() { config_js_1.log.verbose(PRE, 'initWhatsAppEvents()'); const whatsAppClient = this.getWhatsAppClient(); whatsAppClient.on('qr', this.botEventHandler.onQRCode.bind(this.botEventHandler)); whatsAppClient.on('authenticated', this.botEventHandler.onAuthenticated.bind(this.botEventHandler)); /** * There is only one situation that will cause this event, invalid session causing timeout * https://github.com/pedroslopez/whatsapp-web.js/blob/d86c39de3ca5699a50db98ee93e264ab8c4f25a3/src/Client.js#L116-L129 */ whatsAppClient.on('auth_failure', this.botEventHandler.onAuthFailure.bind(this.botEventHandler)); whatsAppClient.on('ready', this.botEventHandler.onWhatsAppReady.bind(this.botEventHandler)); whatsAppClient.on('change_state', this.botEventHandler.onChangeState.bind(this.botEventHandler)); whatsAppClient.on('change_battery', this.botEventHandler.onChangeBattery.bind(this.botEventHandler)); whatsAppClient.on('message', this.messageEventHandler.onMessage.bind(this.messageEventHandler)); whatsAppClient.on('message_ack', this.messageEventHandler.onMessageAck.bind(this.messageEventHandler)); whatsAppClient.on('message_create', this.messageEventHandler.onMessageCreate.bind(this.messageEventHandler)); whatsAppClient.on('message_revoke_everyone', this.messageEventHandler.onMessageRevokeEveryone.bind(this.messageEventHandler)); whatsAppClient.on('message_revoke_me', this.messageEventHandler.onMessageRevokeMe.bind(this.messageEventHandler)); whatsAppClient.on('media_uploaded', this.messageEventHandler.onMediaUploaded.bind(this.messageEventHandler)); whatsAppClient.on('incoming_call', this.messageEventHandler.onIncomingCall.bind(this.messageEventHandler)); whatsAppClient.on('group_join', this.groupEventHandler.onRoomJoin.bind(this.groupEventHandler)); whatsAppClient.on('group_leave', this.groupEventHandler.onRoomLeave.bind(this.groupEventHandler)); whatsAppClient.on('group_update', this.groupEventHandler.onRoomUpdate.bind(this.groupEventHandler)); whatsAppClient.on('contact_name_change', this.contactEventHandler.onContactNameChange.bind(this.contactEventHandler)); whatsAppClient.on('contact_add', this.contactEventHandler.onContactAdd.bind(this.contactEventHandler)); whatsAppClient.on('contact_remove', this.contactEventHandler.onContactRemove.bind(this.contactEventHandler)); const events = [ 'authenticated', 'ready', 'disconnected', ]; const eventStreams = events.map((event) => (0, rxjs_1.fromEvent)(whatsAppClient, event).pipe((0, rxjs_1.map)((value) => ({ event, value })))); const allEvents$ = (0, rxjs_1.merge)(...eventStreams); allEvents$.pipe((0, rxjs_1.distinctUntilKeyChanged)('event')).subscribe(({ event, value }) => { config_js_1.log.info(PRE, `initWhatsAppEvents: ${JSON.stringify(event)}, value: ${JSON.stringify(value)}`); if (event === 'disconnected') { switch (value) { case 'NAVIGATION': void this.botEventHandler.onLogout(config_js_1.STRINGS[config_js_1.LANGUAGE].LOGOUT_REASON.DEFAULT); break; case 'CONFLICT': void this.botEventHandler.onLogout(config_js_1.STRINGS[config_js_1.LANGUAGE].LOGOUT_REASON.LOGIN_CONFLICT); break; default: void this.botEventHandler.onLogout(config_js_1.STRINGS[config_js_1.LANGUAGE].LOGOUT_REASON.DEFAULT); break; } } }); } getMessageEventHandler() { return this.messageEventHandler; } } exports.default = WhatsAppManager; //# sourceMappingURL=whatsapp-manager.js.map