@juzi/wechaty-puppet-whatsapp
Version:
Wechaty Puppet for WhatsApp
331 lines • 13.2 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PuppetWhatsapp = void 0;
/**
* Wechaty - https://github.com/chatie/wechaty
*
* @copyright 2016-2018 Huan LI <zixia@zixia.net>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
const PUPPET = __importStar(require("@juzi/wechaty-puppet"));
const wechaty_puppet_1 = require("@juzi/wechaty-puppet");
const config_js_1 = require("./config.js");
const manager_js_1 = __importDefault(require("./manager.js"));
const whatsapp_error_js_1 = __importDefault(require("./exception/whatsapp-error.js"));
const error_type_js_1 = require("./exception/error-type.js");
const event_name_js_1 = require("./schema/event-name.js");
const request_pool_js_1 = require("./request/request-pool.js");
const contact_self_js_1 = require("./puppet-mixin/contact-self.js");
const contact_js_1 = require("./puppet-mixin/contact.js");
const conversation_js_1 = require("./puppet-mixin/conversation.js");
const friendship_js_1 = require("./puppet-mixin/friendship.js");
const message_js_1 = require("./puppet-mixin/message.js");
const room_js_1 = require("./puppet-mixin/room.js");
const tag_js_1 = require("./puppet-mixin/tag.js");
const PRE = 'PuppetWhatsapp';
class PuppetWhatsapp extends PUPPET.Puppet {
options;
static VERSION = config_js_1.VERSION;
manager;
constructor(options = {}) {
super(options);
this.options = options;
wechaty_puppet_1.log.verbose(PRE, 'constructor()');
this.manager = new manager_js_1.default(this.options);
}
version() {
return config_js_1.VERSION;
}
async onStart() {
wechaty_puppet_1.log.verbose(PRE, 'onStart()');
let whatsapp;
try {
whatsapp = await this.startManager(this.manager);
}
catch (err) {
wechaty_puppet_1.log.error(PRE, `Can not start whatsapp, error: ${err.message}`);
throw (0, whatsapp_error_js_1.default)(error_type_js_1.WA_ERROR_TYPE.ERR_INIT, `Can not start whatsapp, error: ${err.message}`);
}
/**
* Huan(202102): Wait for Puppeteer to be inited before resolve start() for robust state management
*/
const future = new Promise(resolve => {
function check() {
if (whatsapp.pupBrowser) {
resolve();
}
else {
setTimeout(check, 100);
}
}
check();
});
return Promise.race([
future,
this.state.stable('inactive'),
]);
}
async startManager(manager) {
manager.on({
dirty: data => {
this.emit('dirty', data);
},
error: this.onError.bind(this),
friendship: this.onFriendship.bind(this),
heartbeat: data => this.emit('heartbeat', {
data,
}),
login: this.onLogin.bind(this),
logout: this.onLogout.bind(this),
message: this.onMessage.bind(this),
ready: this.onReady.bind(this),
reset: this.onReset.bind(this),
'room-invite': this.onRoomInvite.bind(this),
'room-join': this.onRoomJoin.bind(this),
'room-leave': this.onRoomLeave.bind(this),
'room-topic': this.onRoomTopic.bind(this),
'room-announce': this.onRoomAnnounce.bind(this),
scan: this.onScan.bind(this),
});
const memory = this.memory;
const whatsapp = await this.manager.start(memory);
return whatsapp;
}
async onStop() {
wechaty_puppet_1.log.verbose(PRE, 'onStop()');
try {
await this.stopManager();
}
catch (err) {
wechaty_puppet_1.log.error(PRE, `Can not stop, error: ${err.message}`);
}
}
async stopManager() {
this.manager.off('*');
await this.manager.stop();
}
/**
* Event section: onXXX
*/
async onLogin(wxid) {
wechaty_puppet_1.log.verbose(PRE, 'onLogin(%s)', wxid);
if (this.isLoggedIn) {
wechaty_puppet_1.log.warn(PRE, 'onLogin(%s) already login? NOOP', wxid);
return;
}
wechaty_puppet_1.log.info(PRE, `${event_name_js_1.EventName.LOGIN}, ${wxid}`);
await super.login(wxid);
// no need to emit login since super.login will do that
// this.emit('login', { contactId: wxid })
}
async onLogout(wxid, message) {
wechaty_puppet_1.log.verbose(PRE, 'onLogout(%s, %s)', wxid, message);
if (!this.isLoggedIn) {
wechaty_puppet_1.log.warn(PRE, 'onLogout(%s) already logged out?', wxid);
}
wechaty_puppet_1.log.info(PRE, `${event_name_js_1.EventName.LOGOUT}, ${wxid}`);
const requestPool = request_pool_js_1.RequestPool.Instance;
requestPool.clearPool();
this.emit('logout', { contactId: wxid, data: message });
}
async onMessage(message) {
wechaty_puppet_1.log.verbose(PRE, 'onMessage(%s)', JSON.stringify(message));
this.emit('message', message);
}
async onScan(payload) {
wechaty_puppet_1.log.verbose(PRE, 'onScan(%s)', JSON.stringify(payload));
wechaty_puppet_1.log.info(PRE, `${event_name_js_1.EventName.SCAN}`);
this.emit('scan', payload);
}
async onError(e) {
wechaty_puppet_1.log.info(PRE, `${event_name_js_1.EventName.ERROR}, ${e}`);
this.emit('error', {
data: e,
});
}
async onReset(reason) {
wechaty_puppet_1.log.info(PRE, `${event_name_js_1.EventName.RESET}, ${reason}`);
this.emit('reset', { data: reason });
}
async onFriendship(payload) {
const friendshipPayload = await this.friendshipRawPayload(payload.friendshipId);
if (friendshipPayload.type === PUPPET.types.Friendship.Receive) {
// 收到好友请求暂不冒泡,直接接受
await this.friendshipAccept(payload.friendshipId);
return;
}
this.emit('friendship', payload);
}
async onRoomJoin(payload) {
const roomId = payload.roomId;
await this.dirtyPayload(PUPPET.types.Payload.Room, roomId);
this.emit('room-join', payload);
}
async onRoomLeave(payload) {
const roomId = payload.roomId;
await this.dirtyPayload(PUPPET.types.Payload.Room, roomId);
this.emit('room-leave', payload);
}
async onRoomTopic(payload) {
const roomId = payload.roomId;
await this.dirtyPayload(PUPPET.types.Payload.Room, roomId);
this.emit('room-topic', payload);
}
async onRoomInvite(payload) {
this.emit('room-invite', payload);
}
async onRoomAnnounce(payload) {
const roomId = payload.roomId;
await this.dirtyPayload(PUPPET.types.Payload.Room, roomId);
this.emit('room-announce', payload);
}
async onReady() {
wechaty_puppet_1.log.verbose(PRE, 'onReady()');
wechaty_puppet_1.log.info(PRE, `${event_name_js_1.EventName.READY}`);
this.emit('ready', { data: 'ready' });
}
/**
* Override Methods
*/
async logout() {
await super.logout();
if (!this.isLoggedIn) {
wechaty_puppet_1.log.verbose(PRE, 'logout() do nothing');
return;
}
return this.manager.logout();
}
ding(data) {
wechaty_puppet_1.log.silly(PRE, 'ding(%s)', data || '');
setTimeout(() => this.emit('dong', { data: data || '' }), 1000);
}
/**
* ContactSelf
*/
contactSelfQRCode = contact_self_js_1.contactSelfQRCode;
contactSelfName = contact_self_js_1.contactSelfName;
contactSelfSignature = contact_self_js_1.contactSelfSignature;
/**
* Contact
*/
contactAlias = contact_js_1.contactAlias;
contactPhone = contact_js_1.contactPhone;
contactCorporationRemark = contact_js_1.contactCorporationRemark;
contactDescription = contact_js_1.contactDescription;
contactList = contact_js_1.contactList;
contactAvatar = contact_js_1.contactAvatar;
contactRawPayloadParser = contact_js_1.contactRawPayloadParser;
contactRawPayload = contact_js_1.contactRawPayload;
/**
* Conversation
*/
conversationReadMark = conversation_js_1.conversationReadMark;
/**
* Message
*/
// FIXME: need to implement in wechaty-puppet
messagePost = message_js_1.messagePost;
messageContact = message_js_1.messageContact;
messageImage = message_js_1.messageImage;
messageRecall = message_js_1.messageRecall;
messageFile = message_js_1.messageFile;
messageUrl = message_js_1.messageUrl;
messageMiniProgram = message_js_1.messageMiniProgram;
messageChannel = message_js_1.messageChannel;
messageSendText = message_js_1.messageSendText;
messageSendFile = message_js_1.messageSendFile;
messageSendContact = message_js_1.messageSendContact;
messageSendUrl = message_js_1.messageSendUrl;
messageSendMiniProgram = message_js_1.messageSendMiniProgram;
messageSendChannel = message_js_1.messageSendChannel;
messageSendLocation = message_js_1.messageSendLocation;
messageLocation = message_js_1.messageLocation;
messageForward = message_js_1.messageForward;
messageRawPayloadParser = message_js_1.messageRawPayloadParser;
messageRawPayload = message_js_1.messageRawPayload;
/**
* Room
*/
roomRawPayloadParser = room_js_1.roomRawPayloadParser;
roomRawPayload = room_js_1.roomRawPayload;
roomList = room_js_1.roomList;
roomDel = room_js_1.roomDel;
roomAvatar = room_js_1.roomAvatar;
roomAdd = room_js_1.roomAdd;
roomTopic = room_js_1.roomTopic;
roomCreate = room_js_1.roomCreate;
roomQuit = room_js_1.roomQuit;
roomQRCode = room_js_1.roomQRCode;
roomMemberList = room_js_1.roomMemberList;
roomMemberRawPayload = room_js_1.roomMemberRawPayload;
roomMemberRawPayloadParser = room_js_1.roomMemberRawPayloadParser;
roomAnnounce = room_js_1.roomAnnounce;
roomInvitationAccept = room_js_1.roomInvitationAccept;
roomInvitationRawPayload = room_js_1.roomInvitationRawPayload;
roomInvitationRawPayloadParser = room_js_1.roomInvitationRawPayloadParser;
/**
* Friendship
*/
friendshipRawPayload = friendship_js_1.friendshipRawPayload;
friendshipRawPayloadParser = friendship_js_1.friendshipRawPayloadParser;
friendshipSearchPhone = friendship_js_1.friendshipSearchPhone;
friendshipSearchWeixin = friendship_js_1.friendshipSearchWeixin;
friendshipSearchHandle = friendship_js_1.friendshipSearchHandle;
friendshipAdd = friendship_js_1.friendshipAdd;
friendshipAccept = friendship_js_1.friendshipAccept;
/**
* Tag
*/
tagContactTagAdd = tag_js_1.tagContactTagAdd;
tagContactTagRemove = tag_js_1.tagContactTagRemove;
tagContactTagList = tag_js_1.tagContactTagList;
tagGroupAdd = tag_js_1.tagGroupAdd;
tagGroupDelete = tag_js_1.tagGroupDelete;
tagGroupList = tag_js_1.tagGroupList;
tagGroupTagList = tag_js_1.tagGroupTagList;
tagTagAdd = tag_js_1.tagTagAdd;
tagTagDelete = tag_js_1.tagTagDelete;
tagTagList = tag_js_1.tagTagList;
tagTagContactList = tag_js_1.tagTagContactList;
}
exports.PuppetWhatsapp = PuppetWhatsapp;
exports.default = PuppetWhatsapp;
//# sourceMappingURL=puppet-whatsapp.js.map