@juzi/wechaty-puppet-whatsapp
Version:
Wechaty Puppet for WhatsApp
146 lines • 8.07 kB
JavaScript
"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