UNPKG

@juzi/wechaty-puppet-whatsapp

Version:
329 lines 14.3 kB
"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.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