UNPKG

wechaty-puppet-service

Version:
1,064 lines (1,063 loc) 56.7 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; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.puppetImplementation = void 0; const wechaty_grpc_1 = require("wechaty-grpc"); const PUPPET = __importStar(require("wechaty-puppet")); const gerror_1 = require("gerror"); const mod_js_1 = require("../deprecated/mod.js"); const timestamp_js_1 = require("../pure-functions/timestamp.js"); const mod_js_2 = require("../file-box-helper/mod.js"); const config_js_1 = require("../config.js"); const grpc_error_js_1 = require("./grpc-error.js"); const event_stream_manager_js_1 = require("./event-stream-manager.js"); function puppetImplementation(puppet, FileBoxUuid) { /** * Save scan payload to send it to the puppet-service right after connected (if needed) * * TODO: clean the listeners if necessary */ let scanPayload; let readyPayload; let readyTimeout; puppet.on('scan', payload => { scanPayload = payload; }); puppet.on('ready', payload => { readyPayload = payload; }); puppet.on('logout', _ => { readyPayload = undefined; if (readyTimeout) { clearTimeout(readyTimeout); } }); puppet.on('login', _ => { scanPayload = undefined; readyTimeout = setTimeout(() => { // Huan(202110): should we emit ready event here? readyPayload && eventStreamManager.grpcEmit(wechaty_grpc_1.puppet.EventType.EVENT_TYPE_READY, readyPayload); }, 5 * 1000); }); const eventStreamManager = new event_stream_manager_js_1.EventStreamManager(puppet); const serializeFileBox = async (fileBox) => { /** * 1. if the fileBox is one of type `Url`, `QRCode`, `Uuid`, etc, * then it can be serialized by `fileBox.toString()` * 2. if the fileBox is one of type `Stream`, `Buffer`, `File`, etc, * then it need to be convert to type `Uuid` * before serialized by `fileBox.toString()` */ const normalizedFileBox = await (0, mod_js_2.normalizeFileBoxUuid)(FileBoxUuid)(fileBox); return JSON.stringify(normalizedFileBox); }; const puppetServerImpl = { contactAlias: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'contactAlias()'); const id = call.request.getId(); /** * Set */ if (call.request.hasAlias()) { try { await puppet.contactAlias(id, call.request.getAlias()); return callback(null, new wechaty_grpc_1.puppet.ContactAliasResponse()); } catch (e) { return (0, grpc_error_js_1.grpcError)('contactAlias', e, callback); } } /** * Get */ try { const alias = await puppet.contactAlias(id); const response = new wechaty_grpc_1.puppet.ContactAliasResponse(); response.setAlias(alias); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('contactAlias', e, callback); } }, contactAvatar: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'contactAvatar()'); const id = call.request.getId(); /** * Set */ try { if (call.request.hasFileBox()) { const fileBox = FileBoxUuid.fromJSON(call.request.getFileBox()); await puppet.contactAvatar(id, fileBox); return callback(null, new wechaty_grpc_1.puppet.ContactAvatarResponse()); } } catch (e) { return (0, grpc_error_js_1.grpcError)('contactAvatar', e, callback); } /** * Get */ try { const fileBox = await puppet.contactAvatar(id); const serializedFileBox = await serializeFileBox(fileBox); const response = new wechaty_grpc_1.puppet.ContactAvatarResponse(); response.setFileBox(serializedFileBox); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('contactAvatar', e, callback); } }, contactCorporationRemark: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'contactCorporationRemark()'); const contactId = call.request.getContactId(); try { await puppet.contactCorporationRemark(contactId, call.request.getCorporationRemark() || null); return callback(null, new wechaty_grpc_1.puppet.ContactCorporationRemarkResponse()); } catch (e) { return (0, grpc_error_js_1.grpcError)('contactCorporationRemark', e, callback); } }, contactDescription: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'contactDescription()'); const contactId = call.request.getContactId(); try { const description = call.request.getDescription(); await puppet.contactDescription(contactId, description || null); return callback(null, new wechaty_grpc_1.puppet.ContactDescriptionResponse()); } catch (e) { return (0, grpc_error_js_1.grpcError)('contactDescription', e, callback); } }, contactList: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'contactList()'); void call; // empty request try { const idList = await puppet.contactList(); const response = new wechaty_grpc_1.puppet.ContactListResponse(); response.setIdsList(idList); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('contactList', e, callback); } }, contactPayload: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'contactPayload()'); const id = call.request.getId(); try { const payload = await puppet.contactPayload(id); const response = new wechaty_grpc_1.puppet.ContactPayloadResponse(); response.setAddress(payload.address || ''); response.setAlias(payload.alias || ''); response.setAvatar(payload.avatar); response.setCity(payload.city || ''); response.setFriend(payload.friend || false); response.setGender(payload.gender); response.setId(payload.id); response.setName(payload.name); response.setProvince(payload.province || ''); response.setSignature(payload.signature || ''); response.setStar(payload.star || false); response.setType(payload.type); response.setWeixin(payload.weixin || ''); response.setPhonesList(payload.phone); response.setCoworker(payload.coworker || false); response.setCorporation(payload.corporation || ''); response.setTitle(payload.title || ''); response.setDescription(payload.description || ''); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('contactPayload', e, callback); } }, contactPhone: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'contactPhone()'); try { const contactId = call.request.getContactId(); const phoneList = call.request.getPhonesList(); await puppet.contactPhone(contactId, phoneList); return callback(null, new wechaty_grpc_1.puppet.ContactPhoneResponse()); } catch (e) { return (0, grpc_error_js_1.grpcError)('contactPhone', e, callback); } }, contactSelfName: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'contactSelfName()'); try { const name = call.request.getName(); await puppet.contactSelfName(name); return callback(null, new wechaty_grpc_1.puppet.ContactSelfNameResponse()); } catch (e) { return (0, grpc_error_js_1.grpcError)('contactSelfName', e, callback); } }, contactSelfQRCode: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'contactSelfName()'); void call; try { const qrcode = await puppet.contactSelfQRCode(); const response = new wechaty_grpc_1.puppet.ContactSelfQRCodeResponse(); response.setQrcode(qrcode); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('contactSelfQRCode', e, callback); } }, contactSelfSignature: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'contactSelfSignature()'); try { const signature = call.request.getSignature(); await puppet.contactSelfSignature(signature); return callback(null, new wechaty_grpc_1.puppet.ContactSelfSignatureResponse()); } catch (e) { return (0, grpc_error_js_1.grpcError)('contactSelfSignature', e, callback); } }, ding: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'ding()'); try { const data = call.request.getData(); await puppet.ding(data); return callback(null, new wechaty_grpc_1.puppet.DingResponse()); } catch (e) { return (0, grpc_error_js_1.grpcError)('ding', e, callback); } }, dirtyPayload: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'dirtyPayload()'); try { const id = call.request.getId(); const type = call.request.getType(); await puppet.dirtyPayload(type, id); return callback(null, new wechaty_grpc_1.puppet.DirtyPayloadResponse()); } catch (e) { return (0, grpc_error_js_1.grpcError)('puppet.dirtyPayload() rejection: ', e, callback); } }, /** * * Bridge Event Emitter Events * */ event: (streamingCall) => { config_js_1.log.verbose('PuppetServiceImpl', 'event()'); if (eventStreamManager.busy()) { config_js_1.log.error('PuppetServiceImpl', 'event() there is another event() call not end when receiving a new one.'); const error = { ...new Error('GrpcServerImpl.event() can not call twice.'), code: wechaty_grpc_1.grpc.status.ALREADY_EXISTS, details: 'GrpcServerImpl.event() can not call twice.', metadata: streamingCall.metadata, }; /** * Send error from gRPC server stream: * https://github.com/grpc/grpc-node/issues/287#issuecomment-383218225 * * Streaming RPCs * - https://grpc.io/docs/tutorials/basic/node/ * Only one of 'error' or 'end' will be emitted. Finally, the 'status' event fires when the server sends the status. */ streamingCall.emit('error', error); return; } eventStreamManager.start(streamingCall); /** * If `scanPayload` is not undefined, then we emit it to downstream immediatelly */ if (scanPayload) { eventStreamManager.grpcEmit(wechaty_grpc_1.puppet.EventType.EVENT_TYPE_SCAN, scanPayload); } }, friendshipAccept: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'friendshipAccept()'); try { const id = call.request.getId(); await puppet.friendshipAccept(id); return callback(null, new wechaty_grpc_1.puppet.FriendshipAcceptResponse()); } catch (e) { return (0, grpc_error_js_1.grpcError)('friendshipAccept', e, callback); } }, friendshipAdd: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'friendshipAdd()'); try { const contactId = call.request.getContactId(); // FIXME: for backward compatibility, need to be removed after all puppet has updated. const hello = call.request.getHello(); const referrer = call.request.getReferrer(); const friendshipAddOptions = { hello, ...referrer, }; { // Deprecated: will be removed after Dec 31, 2022 const sourceContactId = call.request.getSourceContactIdStringValueDeprecated()?.getValue(); const sourceRoomId = call.request.getSourceRoomIdStringValueDeprecated()?.getValue(); if (sourceContactId) { friendshipAddOptions['contactId'] = sourceContactId; } if (sourceRoomId) { friendshipAddOptions['roomId'] = sourceRoomId; } } await puppet.friendshipAdd(contactId, friendshipAddOptions); return callback(null, new wechaty_grpc_1.puppet.FriendshipAddResponse()); } catch (e) { return (0, grpc_error_js_1.grpcError)('friendshipAdd', e, callback); } }, friendshipPayload: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'friendshipPayload()'); try { const id = call.request.getId(); const payload = await puppet.friendshipPayload(id); const payloadReceive = payload; const response = new wechaty_grpc_1.puppet.FriendshipPayloadResponse(); response.setContactId(payload.contactId); response.setHello(payload.hello || ''); response.setId(payload.id); response.setScene(payloadReceive.scene || PUPPET.types.FriendshipScene.Unknown); response.setStranger(payloadReceive.stranger || ''); response.setTicket(payloadReceive.ticket); response.setType(payload.type); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('friendshipPayload', e, callback); } }, friendshipSearchPhone: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'friendshipSearchPhone()'); try { const phone = call.request.getPhone(); const contactId = await puppet.friendshipSearchPhone(phone); const response = new wechaty_grpc_1.puppet.FriendshipSearchPhoneResponse(); if (contactId) { response.setContactId(contactId); } return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('friendshipSearchPhone', e, callback); } }, friendshipSearchWeixin: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'friendshipSearchWeixin()'); try { const weixin = call.request.getWeixin(); const contactId = await puppet.friendshipSearchWeixin(weixin); const response = new wechaty_grpc_1.puppet.FriendshipSearchWeixinResponse(); if (contactId) { response.setContactId(contactId); } return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('friendshipSearchWeixin', e, callback); } }, logout: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'logout()'); void call; // empty arguments try { await puppet.logout(); return callback(null, new wechaty_grpc_1.puppet.LogoutResponse()); } catch (e) { return (0, grpc_error_js_1.grpcError)('logout', e, callback); } }, messageContact: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageContact()'); try { const id = call.request.getId(); const contactId = await puppet.messageContact(id); const response = new wechaty_grpc_1.puppet.MessageContactResponse(); response.setId(contactId); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messageContact', e, callback); } }, messageFile: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageFile()'); try { const id = call.request.getId(); const fileBox = await puppet.messageFile(id); const serializedFileBox = await serializeFileBox(fileBox); const response = new wechaty_grpc_1.puppet.MessageFileResponse(); response.setFileBox(serializedFileBox); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messageFile', e, callback); } }, /** * @deprecated will be removed after Dec 31, 2022 */ messageFileStream: async (call) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageFileStream()'); try { const id = call.request.getId(); const fileBox = await puppet.messageFile(id); const response = await (0, mod_js_1.packFileBoxToPb)(wechaty_grpc_1.puppet.MessageFileStreamResponse)(fileBox); response.on('error', e => call.destroy(e)); response.pipe(call); // Huan(202203): FIXME: as unknown as } catch (e) { config_js_1.log.error('PuppetServiceImpl', 'grpcError() messageFileStream() rejection: %s', e && e.message); call.destroy(e); } }, messageForward: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageForward()'); try { const conversationId = call.request.getConversationId(); const messageId = call.request.getMessageId(); const id = await puppet.messageForward(conversationId, messageId); const response = new wechaty_grpc_1.puppet.MessageForwardResponse(); if (id) { response.setId(id); { /** * Huan(202110): Deprecated: will be removed after Dec 31, 2022 */ const idWrapper = new wechaty_grpc_1.StringValue(); idWrapper.setValue(id); response.setIdStringValueDeprecated(idWrapper); } } return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messageForward', e, callback); } }, messageImage: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageImage()'); try { const id = call.request.getId(); const type = call.request.getType(); const fileBox = await puppet.messageImage(id, type); const serializedFileBox = await serializeFileBox(fileBox); const response = new wechaty_grpc_1.puppet.MessageImageResponse(); response.setFileBox(serializedFileBox); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messageImage', e, callback); } }, /** * @deprecated will be removed after Dec 31, 2022 */ messageImageStream: async (call) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageImageStream()'); try { const id = call.request.getId(); const type = call.request.getType(); const fileBox = await puppet.messageImage(id, type); // as number as PUPPET.types.Image const response = await (0, mod_js_1.packFileBoxToPb)(wechaty_grpc_1.puppet.MessageImageStreamResponse)(fileBox); response.on('error', e => call.destroy(e)); response.pipe(call); // Huan(202203) FIXME: as unknown as } catch (e) { config_js_1.log.error('PuppetServiceImpl', 'grpcError() messageImageStream() rejection: %s', e.message); call.destroy(e); } }, messageLocation: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageLocation()'); try { const id = call.request.getId(); const payload = await puppet.messageLocation(id); const response = new wechaty_grpc_1.puppet.MessageLocationResponse(); const pbLocationPayload = new wechaty_grpc_1.puppet.LocationPayload(); pbLocationPayload.setLatitude(payload.latitude); pbLocationPayload.setLongitude(payload.longitude); pbLocationPayload.setAccuracy(payload.accuracy); pbLocationPayload.setAddress(payload.address); pbLocationPayload.setName(payload.name); response.setLocation(pbLocationPayload); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messageLocation', e, callback); } }, messageMiniProgram: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageMiniProgram()'); try { const id = call.request.getId(); const payload = await puppet.messageMiniProgram(id); const response = new wechaty_grpc_1.puppet.MessageMiniProgramResponse(); const pbMiniProgramPayload = new wechaty_grpc_1.puppet.MiniProgramPayload(); if (payload.appid) { pbMiniProgramPayload.setAppid(payload.appid); } if (payload.description) { pbMiniProgramPayload.setDescription(payload.description); } if (payload.iconUrl) { pbMiniProgramPayload.setIconUrl(payload.iconUrl); } if (payload.pagePath) { pbMiniProgramPayload.setPagePath(payload.pagePath); } if (payload.shareId) { pbMiniProgramPayload.setShareId(payload.shareId); } if (payload.thumbKey) { pbMiniProgramPayload.setThumbKey(payload.thumbKey); } if (payload.thumbUrl) { pbMiniProgramPayload.setThumbUrl(payload.thumbUrl); } if (payload.title) { pbMiniProgramPayload.setTitle(payload.title); } if (payload.username) { pbMiniProgramPayload.setUsername(payload.username); } response.setMiniProgram(pbMiniProgramPayload); // Deprecated after Dec 31, 2022 response.setMiniProgramDeprecated(JSON.stringify(payload)); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messageMiniProgram', e, callback); } }, messagePayload: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messagePayload()'); try { const id = call.request.getId(); const payload = await puppet.messagePayload(id); const mentionIdList = ('mentionIdList' in payload) ? payload.mentionIdList || [] : []; const response = new wechaty_grpc_1.puppet.MessagePayloadResponse(); response.setFilename(payload.filename || ''); /** * Huan(202203):`payload.fromId` is deprecated, will be removed in v2.0 */ response.setTalkerId(payload.talkerId || payload.fromId || ''); response.setId(payload.id); response.setMentionIdsList(mentionIdList); response.setRoomId(payload.roomId || ''); response.setText(payload.text || ''); response.setReceiveTime((0, timestamp_js_1.timestampFromMilliseconds)(payload.timestamp)); // Deprecated: will be removed after Dec 31, 2022 response.setTimestampDeprecated(Math.floor(payload.timestamp)); /** * Huan(202203):`payload.toId` is deprecated, will be removed in v2.0 */ response.setListenerId(payload.listenerId || payload.toId || ''); response.setType(payload.type); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messagePayload', e, callback); } }, messageRecall: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageRecall()'); try { const id = call.request.getId(); const success = await puppet.messageRecall(id); const response = new wechaty_grpc_1.puppet.MessageRecallResponse(); response.setSuccess(success); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messageRecall', e, callback); } }, messageSendContact: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageSendContact()'); try { const conversationId = call.request.getConversationId(); const contactId = call.request.getContactId(); const messageId = await puppet.messageSendContact(conversationId, contactId); const response = new wechaty_grpc_1.puppet.MessageSendContactResponse(); if (messageId) { response.setId(messageId); { /** * Huan(202110): Deprecated: will be removed after Dec 31, 2022 */ const idWrapper = new wechaty_grpc_1.StringValue(); idWrapper.setValue(messageId); response.setIdStringValueDeprecated(idWrapper); } } return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messageSendContact', e, callback); } }, messageSendFile: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageSendFile()'); try { const conversationId = call.request.getConversationId(); const jsonText = call.request.getFileBox(); const fileBox = FileBoxUuid.fromJSON(jsonText); const messageId = await puppet.messageSendFile(conversationId, fileBox); const response = new wechaty_grpc_1.puppet.MessageSendFileResponse(); if (messageId) { response.setId(messageId); { /** * Huan(202110): Deprecated: will be removed after Dec 31, 2022 */ const idWrapper = new wechaty_grpc_1.StringValue(); idWrapper.setValue(messageId); response.setIdStringValueDeprecated(idWrapper); } } return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messageSendFile', e, callback); } }, /** * @deprecated will be removed after Dec 31, 2022 */ messageSendFileStream: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageSendFileStream()'); try { const requestArgs = await (0, mod_js_1.unpackConversationIdFileBoxArgsFromPb)(call); const conversationId = requestArgs.conversationId; const fileBox = requestArgs.fileBox; const messageId = await puppet.messageSendFile(conversationId, fileBox); const response = new wechaty_grpc_1.puppet.MessageSendFileStreamResponse(); if (messageId) { response.setId(messageId); { /** * Huan(202110): Deprecated: will be removed after Dec 31, 2022 */ const idWrapper = new wechaty_grpc_1.StringValue(); idWrapper.setValue(messageId); response.setIdStringValueDeprecated(idWrapper); } } return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messageSendFileStream', e, callback); } }, messageSendLocation: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageSendLocation()'); try { const conversationId = call.request.getConversationId(); const pbLocationPayload = call.request.getLocation(); const payload = { accuracy: 0, address: 'NOADDRESS', latitude: 0, longitude: 0, name: 'NONAME', ...pbLocationPayload, }; const messageId = await puppet.messageSendLocation(conversationId, payload); const response = new wechaty_grpc_1.puppet.MessageSendLocationResponse(); if (messageId) { response.setId(messageId); } return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messageSendLocation', e, callback); } }, messageSendMiniProgram: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageSendMiniProgram()'); try { const conversationId = call.request.getConversationId(); let pbMiniProgramPayload = call.request.getMiniProgram()?.toObject(); if (!pbMiniProgramPayload) { // Deprecated: will be removed after Dec 31, 2022 const jsonText = call.request.getMiniProgramDeprecated(); pbMiniProgramPayload = JSON.parse(jsonText); } const payload = { ...pbMiniProgramPayload, }; const messageId = await puppet.messageSendMiniProgram(conversationId, payload); const response = new wechaty_grpc_1.puppet.MessageSendMiniProgramResponse(); if (messageId) { response.setId(messageId); { /** * Huan(202110): Deprecated: will be removed after Dec 31, 2022 */ const idWrapper = new wechaty_grpc_1.StringValue(); idWrapper.setValue(messageId); response.setIdStringValueDeprecated(idWrapper); } } return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messageSendMiniProgram', e, callback); } }, messageSendText: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageSendText()'); try { const conversationId = call.request.getConversationId(); const text = call.request.getText(); const mentionIdList = call.request.getMentionalIdsList(); const messageId = await puppet.messageSendText(conversationId, text, mentionIdList); const response = new wechaty_grpc_1.puppet.MessageSendTextResponse(); if (messageId) { response.setId(messageId); { /** * Huan(202110): Deprecated: will be removed after Dec 31, 2022 */ const idWrapper = new wechaty_grpc_1.StringValue(); idWrapper.setValue(messageId); response.setIdStringValueDeprecated(idWrapper); } } return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messageSendText', e, callback); } }, messageSendUrl: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageSendUrl()'); try { const conversationId = call.request.getConversationId(); let pbUrlLinkPayload = call.request.getUrlLink()?.toObject(); if (!pbUrlLinkPayload) { // Deprecated: will be removed after Dec 31, 2022 const jsonText = call.request.getUrlLinkDeprecated(); pbUrlLinkPayload = JSON.parse(jsonText); } const payload = { title: 'NOTITLE', url: 'NOURL', ...pbUrlLinkPayload, }; const messageId = await puppet.messageSendUrl(conversationId, payload); const response = new wechaty_grpc_1.puppet.MessageSendUrlResponse(); if (messageId) { response.setId(messageId); { /** * Huan(202110): Deprecated: will be removed after Dec 31, 2022 */ const idWrapper = new wechaty_grpc_1.StringValue(); idWrapper.setValue(messageId); response.setIdStringValueDeprecated(idWrapper); } } return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messageSendUrl', e, callback); } }, messageUrl: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'messageUrl()'); try { const id = call.request.getId(); const payload = await puppet.messageUrl(id); const response = new wechaty_grpc_1.puppet.MessageUrlResponse(); const pbUrlLinkPayload = new wechaty_grpc_1.puppet.UrlLinkPayload(); pbUrlLinkPayload.setTitle(payload.title); pbUrlLinkPayload.setUrl(payload.url); if (payload.thumbnailUrl) { pbUrlLinkPayload.setThumbnailUrl(payload.thumbnailUrl); } if (payload.description) { pbUrlLinkPayload.setDescription(payload.description); } response.setUrlLink(pbUrlLinkPayload); // Deprecated: will be removed after Dec 31, 2022 response.setUrlLinkDeprecated(JSON.stringify(payload)); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('messageUrl', e, callback); } }, roomAdd: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'roomAdd()'); try { const roomId = call.request.getId(); const contactId = call.request.getContactId(); const inviteOnly = call.request.getInviteOnly(); await puppet.roomAdd(roomId, contactId, inviteOnly); return callback(null, new wechaty_grpc_1.puppet.RoomAddResponse()); } catch (e) { return (0, grpc_error_js_1.grpcError)('roomAdd', e, callback); } }, roomAnnounce: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'roomAnnounce()'); try { const roomId = call.request.getId(); /** * Set */ if (call.request.hasText()) { await puppet.roomAnnounce(roomId, call.request.getText()); return callback(null, new wechaty_grpc_1.puppet.RoomAnnounceResponse()); } /** * Get */ const text = await puppet.roomAnnounce(roomId); const response = new wechaty_grpc_1.puppet.RoomAnnounceResponse(); response.setText(text); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('roomAnnounce', e, callback); } }, roomAvatar: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'roomAvatar()'); try { const roomId = call.request.getId(); const fileBox = await puppet.roomAvatar(roomId); const serializedFileBox = await serializeFileBox(fileBox); const response = new wechaty_grpc_1.puppet.RoomAvatarResponse(); response.setFileBox(serializedFileBox); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('roomAvatar', e, callback); } }, roomCreate: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'roomCreate()'); try { const contactIdList = call.request.getContactIdsList(); const topic = call.request.getTopic(); const roomId = await puppet.roomCreate(contactIdList, topic); const response = new wechaty_grpc_1.puppet.RoomCreateResponse(); response.setId(roomId); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('roomCreate', e, callback); } }, roomDel: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'roomDel()'); try { const roomId = call.request.getId(); const contactId = call.request.getContactId(); await puppet.roomDel(roomId, contactId); return callback(null, new wechaty_grpc_1.puppet.RoomDelResponse()); } catch (e) { return (0, grpc_error_js_1.grpcError)('roomDel', e, callback); } }, roomInvitationAccept: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'roomInvitationAccept()'); try { const id = call.request.getId(); await puppet.roomInvitationAccept(id); return callback(null, new wechaty_grpc_1.puppet.RoomInvitationAcceptResponse()); } catch (e) { return (0, grpc_error_js_1.grpcError)('roomInvitationAccept', e, callback); } }, roomInvitationPayload: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'roomInvitationPayload()'); try { const roomInvitationId = call.request.getId(); /** * Set */ { const jsonText = call.request.getPayload(); if (jsonText) { const payload = JSON.parse(jsonText); await puppet.roomInvitationPayload(roomInvitationId, payload); return callback(null, new wechaty_grpc_1.puppet.RoomInvitationPayloadResponse()); } { /** * Huan(202110): Deprecated: will be removed after Dec 31, 2022 */ const payloadWrapper = call.request.getPayloadStringValueDeprecated(); if (payloadWrapper) { const jsonText = payloadWrapper.getValue(); const payload = JSON.parse(jsonText); await puppet.roomInvitationPayload(roomInvitationId, payload); return callback(null, new wechaty_grpc_1.puppet.RoomInvitationPayloadResponse()); } } } /** * Get */ const payload = await puppet.roomInvitationPayload(roomInvitationId); const response = new wechaty_grpc_1.puppet.RoomInvitationPayloadResponse(); response.setAvatar(payload.avatar); response.setId(payload.id); response.setInvitation(payload.invitation); response.setInviterId(payload.inviterId); response.setReceiverId(payload.receiverId); response.setMemberCount(payload.memberCount); response.setMemberIdsList(payload.memberIdList); response.setReceiveTime((0, timestamp_js_1.timestampFromMilliseconds)(payload.timestamp)); { // Deprecated: will be removed after Dec 31, 2022 const deprecated = true; void deprecated; response.setTimestampUint64Deprecated(Math.floor(payload.timestamp)); } response.setTopic(payload.topic); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('roomInvitationPayload', e, callback); } }, roomList: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'roomList()'); void call; try { const roomIdList = await puppet.roomList(); const response = new wechaty_grpc_1.puppet.RoomListResponse(); response.setIdsList(roomIdList); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('roomList', e, callback); } }, roomMemberList: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'roomMemberList()'); try { const roomId = call.request.getId(); const roomMemberIdList = await puppet.roomMemberList(roomId); const response = new wechaty_grpc_1.puppet.RoomMemberListResponse(); response.setMemberIdsList(roomMemberIdList); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('roomMemberList', e, callback); } }, roomMemberPayload: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'roomMemberPayload()'); try { const roomId = call.request.getId(); const memberId = call.request.getMemberId(); const payload = await puppet.roomMemberPayload(roomId, memberId); const response = new wechaty_grpc_1.puppet.RoomMemberPayloadResponse(); response.setAvatar(payload.avatar); response.setId(payload.id); response.setInviterId(payload.inviterId || ''); response.setName(payload.name); response.setRoomAlias(payload.roomAlias || ''); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('roomMemberPayload', e, callback); } }, roomPayload: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'roomPayload()'); try { const roomId = call.request.getId(); const payload = await puppet.roomPayload(roomId); const response = new wechaty_grpc_1.puppet.RoomPayloadResponse(); response.setAdminIdsList(payload.adminIdList); response.setAvatar(payload.avatar || ''); response.setId(payload.id); response.setMemberIdsList(payload.memberIdList); response.setOwnerId(payload.ownerId || ''); response.setTopic(payload.topic); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('roomPayload', e, callback); } }, roomQRCode: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'roomQRCode()'); try { const roomId = call.request.getId(); const qrcode = await puppet.roomQRCode(roomId); const response = new wechaty_grpc_1.puppet.RoomQRCodeResponse(); response.setQrcode(qrcode); return callback(null, response); } catch (e) { return (0, grpc_error_js_1.grpcError)('roomQRCode', e, callback); } }, roomQuit: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'roomQuit()'); try { const roomId = call.request.getId(); await puppet.roomQuit(roomId); return callback(null, new wechaty_grpc_1.puppet.RoomQuitResponse()); } catch (e) { return (0, grpc_error_js_1.grpcError)('roomQuit', e, callback); } }, roomTopic: async (call, callback) => { config_js_1.log.verbose('PuppetServiceImpl', 'roomTopic()'); try { const roomId = call.request.getId(); /** * Set */ if (call.request.hasTopic()) { await puppet.roomTopic(roomId, call.request.getTopic()); return callback(null, new wechaty_grpc_1.puppet.RoomTopicResponse()); } /**