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
JavaScript
;
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