@juzi/wechaty-puppet-whatsapp
Version:
Wechaty Puppet for WhatsApp
329 lines • 14.3 kB
JavaScript
;
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.roomRawPayloadParser = exports.roomRawPayload = exports.roomInvitationRawPayloadParser = exports.roomInvitationRawPayload = exports.roomInvitationAccept = exports.roomAnnounce = exports.roomMemberRawPayloadParser = exports.roomMemberRawPayload = exports.roomMemberList = exports.roomQRCode = exports.roomTopic = exports.roomAvatar = exports.roomQuit = exports.roomDel = exports.roomAdd = exports.roomCreate = exports.roomList = void 0;
/* eslint-disable no-redeclare */
const PUPPET = __importStar(require("@juzi/wechaty-puppet"));
const config_js_1 = require("../config.js");
const error_type_js_1 = require("../exception/error-type.js");
const whatsapp_error_js_1 = __importDefault(require("../exception/whatsapp-error.js"));
const contact_js_1 = require("./contact.js");
const miscellaneous_js_1 = require("../helper/miscellaneous.js");
const room_raw_payload_parser_js_1 = require("../helper/pure-function/room-raw-payload-parser.js");
const messageMedia_js_1 = require("../helper/pure-function/messageMedia.js");
const PRE = 'MIXIN_ROOM';
async function roomList() {
config_js_1.log.verbose(PRE, 'roomList()');
const cacheManager = await this.manager.getCacheManager();
const roomIdList = await cacheManager.getRoomIdList();
return roomIdList;
}
exports.roomList = roomList;
/**
* Filter friend list and non-friend list from member id list
* @param { PuppetWhatsApp } this
* @param { string[] } memberIdList
* @returns { friendsList: string[]; nonFriendsList: string[]; }
*/
async function checkRoomMember(memberIdList) {
const friendsList = [];
const nonFriendsList = [];
for (const memberId of memberIdList) {
const memberPayload = await this.manager.getContactById(memberId);
if (memberPayload.isMyContact) {
friendsList.push(memberId);
}
else {
nonFriendsList.push(memberId);
}
}
const botId = this.manager.whatsAppManager.getBotId();
if (!friendsList.includes(botId)) {
friendsList.push(botId);
}
return {
friendsList,
nonFriendsList,
};
}
async function updateRoomRawPayloadToCache(roomId, params) {
const { name, avatar, memberIdList } = params;
const cacheManager = await this.manager.getCacheManager();
const roomInCache = await cacheManager.getContactOrRoomRawPayload(roomId);
if (roomInCache) {
if (name) {
roomInCache.name = name;
}
if (avatar) {
roomInCache.avatar = avatar;
}
if (memberIdList && memberIdList.length > 0) {
await cacheManager.setRoomMemberIdList(roomId, memberIdList);
}
await cacheManager.setContactOrRoomRawPayload(roomId, roomInCache);
}
return roomInCache;
}
async function roomCreate(contactIdList, topic) {
config_js_1.log.verbose(PRE, 'roomCreate(%s, %s)', contactIdList, topic);
const { friendsList, nonFriendsList } = await checkRoomMember.call(this, contactIdList);
const group = await this.manager.createRoom(topic, friendsList);
const roomId = group.gid._serialized;
if (roomId) {
if (nonFriendsList.length > 0) {
await addMemberListToRoom.call(this, roomId, nonFriendsList);
}
await updateRoomRawPayloadToCache.call(this, roomId, {
memberIdList: contactIdList,
name: topic,
});
return roomId;
}
else {
throw (0, whatsapp_error_js_1.default)(error_type_js_1.WA_ERROR_TYPE.ERR_CREATE_ROOM, `An error occurred while creating the group, detail: ${contactIdList}, topic: ${topic}`);
}
}
exports.roomCreate = roomCreate;
async function roomAdd(roomId, contactId) {
config_js_1.log.verbose(PRE, 'roomAdd(%s, %s)', roomId, contactId);
await addMemberListToRoom.call(this, roomId, contactId);
}
exports.roomAdd = roomAdd;
async function addMemberListToRoom(roomId, contactIds) {
const roomChat = await this.manager.getRoomChatById(roomId);
const contactIdList = Array.isArray(contactIds) ? contactIds : [contactIds];
const result = await roomChat.addParticipants(contactIdList);
const cacheManager = await this.manager.getCacheManager();
const successContactIdList = [];
if (typeof result === 'string') {
throw (0, whatsapp_error_js_1.default)(error_type_js_1.WA_ERROR_TYPE.ERR_ADD_ROOM, `cannot add contact: ${contactIdList.join(', ')} to room ${roomId}, ${result}`);
}
for (const key in result) {
const item = result[key];
for (const contactId in item) {
const contactResult = item[contactId];
if (Number(contactResult?.code) === 200) {
config_js_1.log.silly(PRE, `add member ${contactId} to room ${roomId} succeded`);
successContactIdList.push(contactId);
}
else {
switch (Number(contactResult?.code)) {
case 409:
config_js_1.log.warn(PRE, `add member ${contactId} to room ${roomId} failed, contact is already in room`);
break;
default:
config_js_1.log.warn(PRE, `add member ${contactId} to room ${roomId} failed for unknown reason`);
}
}
}
}
await cacheManager.addRoomMemberToList(roomId, successContactIdList);
}
async function roomDel(roomId, contactIds) {
config_js_1.log.verbose(PRE, 'roomDel(%s, %s)', roomId, contactIds);
const roomChat = await this.manager.getRoomChatById(roomId);
const contactIdList = Array.isArray(contactIds) ? contactIds : [contactIds];
await roomChat.removeParticipants(contactIdList);
const cacheManager = await this.manager.getCacheManager();
await cacheManager.removeRoomMemberFromList(roomId, contactIdList);
}
exports.roomDel = roomDel;
async function roomQuit(roomId) {
config_js_1.log.verbose(PRE, 'roomQuit(%s)', roomId);
const roomChat = await this.manager.getRoomChatById(roomId);
await roomChat.leave();
const cacheManager = await this.manager.getCacheManager();
await cacheManager.deleteContactOrRoom(roomId);
await cacheManager.deleteRoomMemberIdList(roomId);
}
exports.roomQuit = roomQuit;
async function roomAvatar(roomId, avatar) {
config_js_1.log.verbose(PRE, 'roomAvatar(%s)', roomId);
if (avatar) {
const media = await (0, messageMedia_js_1.getMessageMediaFromFilebox)(avatar);
const roomChat = await this.manager.getRoomChatById(roomId);
const result = await roomChat.setPicture(media);
if (!result) {
throw (0, whatsapp_error_js_1.default)(error_type_js_1.WA_ERROR_TYPE.ERR_ROOM_AVATAR_SET_FAILED, `can not set room avatar, room id: ${roomId}`);
}
}
else {
const payload = await this.roomPayload(roomId);
if (payload.avatar) {
return config_js_1.FileBox.fromUrl(payload.avatar);
}
throw (0, whatsapp_error_js_1.default)(error_type_js_1.WA_ERROR_TYPE.ERR_ROOM_AVATAR_NOT_FOUND, `can not find this room avatar, room id: ${roomId}`);
}
}
exports.roomAvatar = roomAvatar;
async function roomTopic(roomId, topic) {
config_js_1.log.verbose(PRE, 'roomTopic(%s, %s)', roomId, topic);
if (typeof topic === 'undefined') {
const payload = await this.roomPayload(roomId);
return payload.topic;
}
const roomChat = await this.manager.getRoomChatById(roomId);
if (roomChat.isGroup) {
await roomChat.setSubject(topic);
}
await this.dirtyPayload(PUPPET.types.Payload.Room, roomId);
}
exports.roomTopic = roomTopic;
async function roomQRCode(roomId) {
config_js_1.log.verbose(PRE, 'roomQRCode(%s)', roomId);
const roomChat = await this.manager.getRoomChatById(roomId);
const code = await roomChat.getInviteCode();
const url = `https://chat.whatsapp.com/${code}`;
return url;
}
exports.roomQRCode = roomQRCode;
/**
* Get member id list from cache
* @param { PuppetWhatsApp } this whatsapp client
* @param { string } roomId roomId
* @returns { string[] } member id list
*/
async function roomMemberList(roomId) {
config_js_1.log.verbose(PRE, 'roomMemberList(%s)', roomId);
const cacheManager = await this.manager.getCacheManager();
const memberList = await cacheManager.getRoomMemberIdList(roomId);
if (memberList.length === 0) {
return this.manager.syncRoomMemberList(roomId);
}
return memberList;
}
exports.roomMemberList = roomMemberList;
async function roomMemberRawPayload(roomId, contactId) {
config_js_1.log.verbose(PRE, 'roomMemberRawPayload(%s, %s)', roomId, contactId);
const member = await contact_js_1.contactRawPayload.call(this, contactId);
return {
avatar: member.avatar,
id: member.id._serialized,
name: member.pushname || member.name || '',
// roomAlias : contact.name,
};
}
exports.roomMemberRawPayload = roomMemberRawPayload;
async function roomMemberRawPayloadParser(rawPayload) {
config_js_1.log.verbose(PRE, 'roomMemberRawPayloadParser(%s)', JSON.stringify(rawPayload));
return rawPayload;
}
exports.roomMemberRawPayloadParser = roomMemberRawPayloadParser;
async function roomAnnounce(roomId, text) {
if (typeof text === 'undefined') {
const roomChat = await this.manager.getRoomChatById(roomId);
return roomChat.description;
}
const roomChat = await this.manager.getRoomChatById(roomId);
await roomChat.setDescription((text || undefined));
await this.dirtyPayload(PUPPET.types.Payload.Room, roomId);
}
exports.roomAnnounce = roomAnnounce;
/**
*
* Room Invitation
*
*/
async function roomInvitationAccept(roomInvitationId) {
config_js_1.log.verbose(PRE, 'roomInvitationAccept(%s)', roomInvitationId);
const info = await roomInvitationRawPayload.call(this, roomInvitationId);
if (Object.keys(info).length === 1) {
await this.manager.acceptRoomInvite(info.inviteCode);
}
else {
await this.manager.acceptPrivateRoomInvite(info);
}
}
exports.roomInvitationAccept = roomInvitationAccept;
async function roomInvitationRawPayload(roomInvitationId) {
config_js_1.log.verbose(PRE, 'roomInvitationRawPayload(%s)', roomInvitationId);
const cacheManager = await this.manager.getCacheManager();
const info = await cacheManager.getRoomInvitationRawPayload(roomInvitationId);
if (info) {
return info;
}
else {
return {
inviteCode: roomInvitationId,
};
}
}
exports.roomInvitationRawPayload = roomInvitationRawPayload;
/**
*
* @param this PuppetWhatsapp
* @param rawPayload Partial<InviteV4Data>
* @returns Partial<InviteV4Data>
* TODO: Here we return Partial<InviteV4Data> for roomInvitationAccept usage, We may need other fields required by RoomInvitationPayload
*/
async function roomInvitationRawPayloadParser(rawPayload) {
config_js_1.log.verbose(PRE, 'roomInvitationRawPayloadParser(%s)', JSON.stringify(rawPayload));
return rawPayload;
}
exports.roomInvitationRawPayloadParser = roomInvitationRawPayloadParser;
async function roomRawPayload(id) {
config_js_1.log.verbose(PRE, 'roomRawPayload(%s)', id);
if (!(0, miscellaneous_js_1.isRoomId)(id)) {
throw (0, whatsapp_error_js_1.default)(error_type_js_1.WA_ERROR_TYPE.ERR_ROOM_NOT_FOUND, `please check room id: ${id} again.`);
}
const cacheManager = await this.manager.getCacheManager();
const room = await cacheManager.getContactOrRoomRawPayload(id);
const roomAnnounce = await this.roomAnnounce(id);
if (room) {
room.announce = roomAnnounce;
return room;
}
else {
try {
const rawRoom = await this.manager.getContactById(id);
const avatar = await rawRoom.getProfilePicUrl() || '';
const room = Object.assign(rawRoom, { avatar, announce: roomAnnounce });
await cacheManager.setContactOrRoomRawPayload(id, room);
return room;
}
catch (error) {
throw (0, whatsapp_error_js_1.default)(error_type_js_1.WA_ERROR_TYPE.ERR_ROOM_NOT_FOUND, `roomRawPayload(${id}) not found.`);
}
}
}
exports.roomRawPayload = roomRawPayload;
async function roomRawPayloadParser(roomPayload) {
const roomId = roomPayload.id._serialized;
try {
const roomChat = await this.manager.getRoomChatById(roomId);
const result = (0, room_raw_payload_parser_js_1.parserRoomRawPayload)(roomPayload, roomChat);
config_js_1.log.verbose(PRE, 'roomRawPayloadParser roomPayload(%s) roomChat(%s) result(%s)', JSON.stringify(roomPayload), JSON.stringify(roomChat), JSON.stringify(result));
return result;
}
catch (error) {
config_js_1.log.error(PRE, `roomRawPayloadParser(${roomId}) failed, error message: ${error.message}`);
throw (0, whatsapp_error_js_1.default)(error_type_js_1.WA_ERROR_TYPE.ERR_ROOM_NOT_FOUND, `roomRawPayloadParser(${roomId}) failed, error message: ${error.message}`);
}
}
exports.roomRawPayloadParser = roomRawPayloadParser;
//# sourceMappingURL=room.js.map