UNPKG

airship-server

Version:

Airship is a framework for Node.JS & TypeScript that helps you to write big, scalable and maintainable API servers.

182 lines 8.51 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const crypto_1 = require("crypto"); const TextContent_1 = require("../../../hhEvents/domain/entity/notifications/message/TextContent"); const ImageContent_1 = require("../../../hhEvents/domain/entity/notifications/message/ImageContent"); const VideoContent_1 = require("../../../hhEvents/domain/entity/notifications/message/VideoContent"); const AudioContent_1 = require("../../../hhEvents/domain/entity/notifications/message/AudioContent"); const DocumentContent_1 = require("../../../hhEvents/domain/entity/notifications/message/DocumentContent"); const WallContent_1 = require("../../../hhEvents/domain/entity/notifications/message/WallContent"); const StickerContent_1 = require("../../../hhEvents/domain/entity/notifications/message/StickerContent"); const BaseOutputMessageSender_1 = require("../domain/BaseOutputMessageSender"); class VKOutputMessageSender extends BaseOutputMessageSender_1.BaseOutputMessageSender { constructor(vkApi) { super(); this._vkApi = vkApi; } send(message, token) { return __awaiter(this, void 0, void 0, function* () { let req = { user_id: message.userId, random_id: crypto_1.randomBytes(4).readUInt32BE(0, true) }; let attachments = []; message.content.forEach(payload => { if (payload instanceof TextContent_1.default) req['message'] = payload.text; if (payload instanceof ImageContent_1.default) attachments.push(`photo${payload.ownerId}_${payload.photoId}`); if (payload instanceof VideoContent_1.default) attachments.push(`video${payload.ownerId}_${payload.videoId}`); if (payload instanceof AudioContent_1.default) attachments.push(`audio${payload.ownerId}_${payload.audioId}`); if (payload instanceof DocumentContent_1.default) attachments.push(`doc${payload.ownerId}_${payload.documentId}`); if (payload instanceof WallContent_1.default) attachments.push(`wall${payload.ownerId}_${payload.postId}`); if (payload instanceof StickerContent_1.default) req['message'] = `[стикер] ${payload.photo}`; }); req['attachment'] = attachments.join(','); if (req['message'] == '' && req['attachment'] == '') { console.log('Empty message'); return undefined; } if (req['attachment'] && req['message'] == '') delete req['message']; let response = yield this._vkApi.callWithRetry('messages.send', token, req); console.log(`Response for`, { message, response }); return; }); } sendBatch(messages, token) { return __awaiter(this, void 0, void 0, function* () { let executeCode = 'var Data = [];'; let messagesToSend = 0; messages.forEach(message => { let params = this.renderSendMessageParams(message); if (params) { messagesToSend++; executeCode += `\nData.push(${this.renderExecuteApiCall('messages.send', params)});`; } }); executeCode += 'return Data;'; console.log(executeCode); // no messages to send if (messagesToSend == 0) throw new Error('no messages to send'); //let response = await this._vkApi.callWithAsyncLock('execute', token, { code: executeCode }) let response = yield this._vkApi.call('execute', token, { code: executeCode }, false); console.log(`Response for`, { messages, response }); console.dir(response, { depth: null }); return response; }); } // max 2500 messages broadcast(messages, token) { return __awaiter(this, void 0, void 0, function* () { let batches = this.broadcastMessagesToBatches(messages); console.log(batches); let executeCode = 'var Data = [];\n'; for (let batch of batches) { let params = this.renderSendMessageParams(batch[0]); delete params['user_id']; params['user_ids'] = batch .map(message => message.userId) .join(','); executeCode += `Data.push(${this.renderExecuteApiCall('messages.send', params)});\n`; } executeCode += 'return Data;'; console.log(executeCode); let response = yield this._vkApi.call('execute', token, { code: executeCode }, false); console.log(`Response for`, { messages, response }); console.dir(response, { depth: null }); return response; }); } isEmpty(message) { if (message.content.length == 0) return true; let text = null; message.content.forEach(c => { if (c instanceof TextContent_1.default) text = c.text; }); return text == '' && message.content.length == 1; } broadcastMessagesToBatches(messages) { let batches = []; let buff = []; let i = 0; for (let message of messages) { buff.push(message); if (buff.length === 100 || i == messages.length - 1) { batches.push([...buff]); buff = []; } i++; } return batches; } renderExecuteApiCall(method, options) { return `API.${method}(${JSON.stringify(options)})`; } renderSendMessageParams(message) { let req = { user_id: message.userId, random_id: crypto_1.randomBytes(4).readUInt32BE(0, true) }; let attachments = []; message.content.forEach(payload => { if (payload instanceof TextContent_1.default) req['message'] = payload.text; if (payload instanceof ImageContent_1.default) attachments.push(this.renderAttachment('photo', payload.ownerId, payload.photoId, payload.accessKey)); if (payload instanceof VideoContent_1.default) attachments.push(`video${payload.ownerId}_${payload.videoId}`); if (payload instanceof AudioContent_1.default) attachments.push(`audio${payload.ownerId}_${payload.audioId}`); if (payload instanceof DocumentContent_1.default) attachments.push(`doc${payload.ownerId}_${payload.documentId}`); if (payload instanceof WallContent_1.default) attachments.push(`wall${payload.ownerId}_${payload.postId}`); if (payload instanceof StickerContent_1.default) req['message'] = `[стикер] ${payload.photo}`; }); req['attachment'] = attachments.join(','); if (req['message'] == '' && req['attachment'] == '') { console.log('Empty message'); return undefined; } if (req['attachment'] && req['message'] == '') delete req['message']; if (attachments.length == 0) delete req['attachment']; return req; } renderAttachment(attachmentType, ownerId, attachmentId, accessKey) { if (accessKey) return `${attachmentType}${ownerId}_${attachmentId}_${accessKey}`; else return `${attachmentType}${ownerId}_${attachmentId}`; } } exports.default = VKOutputMessageSender; //# sourceMappingURL=VKOutputMessageSender.js.map