2017-05-29 01:46:00 +03:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
2017-05-29 02:00:21 +03:00
< meta name = "viewport" content = "width=device-width,initial-scale=1" >
< title > index.js - Documentation< / title >
2017-05-29 01:46:00 +03:00
2017-05-29 02:00:21 +03:00
< script src = "scripts/prettify/prettify.js" > < / script >
< script src = "scripts/prettify/lang-css.js" > < / script >
2017-05-29 01:46:00 +03:00
<!-- [if lt IE 9]>
< script src = "//html5shiv.googlecode.com/svn/trunk/html5.js" > < / script >
<![endif]-->
2017-05-29 02:00:21 +03:00
< link type = "text/css" rel = "stylesheet" href = "https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css" >
2017-05-29 01:46:00 +03:00
< link type = "text/css" rel = "stylesheet" href = "styles/prettify-tomorrow.css" >
< link type = "text/css" rel = "stylesheet" href = "styles/jsdoc-default.css" >
< / head >
< body >
2017-05-29 02:00:21 +03:00
< input type = "checkbox" id = "nav-trigger" class = "nav-trigger" / >
< label for = "nav-trigger" class = "navicon-button x" >
< div class = "navicon" > < / div >
< / label >
< label for = "nav-trigger" class = "overlay" > < / label >
< nav >
2017-05-30 16:03:39 +03:00
< li class = "nav-link nav-home-link" > < a href = "index.html" > Home< / a > < / li > < li class = "nav-heading" > < a href = "global.html" > Globals< / a > < / li > < li class = "nav-item" > < span class = "nav-item-type type-function" > F< / span > < span class = "nav-item-name" > < a href = "global.html#connect" > connect< / a > < / span > < / li > < li class = "nav-item" > < span class = "nav-item-type type-function" > F< / span > < span class = "nav-item-name" > < a href = "global.html#createPackage" > createPackage< / a > < / span > < / li > < li class = "nav-item" > < span class = "nav-item-type type-function" > F< / span > < span class = "nav-item-name" > < a href = "global.html#decrypt" > decrypt< / a > < / span > < / li > < li class = "nav-item" > < span class = "nav-item-type type-function" > F< / span > < span class = "nav-item-name" > < a href = "global.html#decryptJSON" > decryptJSON< / a > < / span > < / li > < li class = "nav-item" > < span class = "nav-item-type type-function" > F< / span > < span class = "nav-item-name" > < a href = "global.html#encrypt" > encrypt< / a > < / span > < / li > < li class = "nav-item" > < span class = "nav-item-type type-member" > M< / span > < span class = "nav-item-name" > < a href = "global.html#http" > http< / a > < / span > < / li > < li class = "nav-item" > < span class = "nav-item-type type-function" > F< / span > < span class = "nav-item-name" > < a href = "global.html#isVerification" > isVerification< / a > < / span > < / li > < li class = "nav-item" > < span class = "nav-item-type type-function" > F< / span > < span class = "nav-item-name" > < a href = "global.html#mergerString" > mergerString< / a > < / span > < / li > < li class = "nav-item" > < span class = "nav-item-type type-function" > F< / span > < span class = "nav-item-name" > < a href = "global.html#send" > send< / a > < / span > < / li >
2017-05-29 02:00:21 +03:00
< / nav >
2017-05-29 01:46:00 +03:00
2017-05-29 02:00:21 +03:00
< div id = "main" >
< h1 class = "page-title" > index.js< / h1 >
2017-05-29 01:46:00 +03:00
< section >
< article >
< pre class = "prettyprint source linenums" > < code > /**
* @project iii-client
* @author Valentin Popov < info@valentineus.link>
* @license See LICENSE.md file included in this distribution.
*/
var http = require('http');
2017-05-29 07:02:09 +03:00
exports.connect = connect;
2017-05-29 01:46:00 +03:00
/**
* Connects to the server and returns the connection data.
* @param {String} uuid - The bot UUID.
* @param {requestCallback} callback - The callback that handles the response.
*/
2017-05-29 07:02:09 +03:00
function connect(uuid, callback) {
2017-05-29 01:46:00 +03:00
uuid = uuid || '';
2017-05-30 16:03:39 +03:00
if (!isVerification(uuid)) {
2017-05-29 01:46:00 +03:00
throw new Error('The UUID is not a valid value!');
}
const query = {
port: 80,
hostname: 'iii.ru',
path: '/api/2.0/json/Chat.init/' + uuid + '/',
method: 'GET',
2017-05-29 07:02:09 +03:00
};
2017-05-29 01:46:00 +03:00
const request = http.request(query, function(response) {
var json = '';
2017-05-30 16:03:39 +03:00
response.on('data', (raw) => json = decryptJSON(raw));
2017-06-10 20:42:29 +00:00
response.on('end', () => {
if (json.error) throw new Error(json.error.message);
callback(json.result);
});
2017-05-29 01:46:00 +03:00
});
2017-05-29 07:02:09 +03:00
request.on('error', (error) => Error(error.message));
2017-05-29 01:46:00 +03:00
request.end();
}
2017-05-29 07:02:09 +03:00
exports.send = send;
2017-05-29 01:46:00 +03:00
/**
* Send a message to the server and return a response.
* @param {Object} raw - The data to send.
* @param {String} raw.cuid - Session identifier.
* @param {String} raw.text - Message text.
* @param {requestCallback} callback - The callback that handles the response.
*/
2017-05-29 07:02:09 +03:00
function send(raw, callback) {
2017-05-29 01:46:00 +03:00
raw = raw || {};
const query = {
port: 80,
hostname: 'iii.ru',
path: '/api/2.0/json/Chat.request',
method: 'POST',
2017-05-29 07:02:09 +03:00
};
2017-05-29 01:46:00 +03:00
2017-05-30 16:03:39 +03:00
const data = createPackage(raw);
2017-05-29 01:46:00 +03:00
const request = http.request(query, function(response) {
var json = '';
2017-05-30 16:03:39 +03:00
response.on('data', (raw) => json = decryptJSON(raw));
2017-06-10 20:42:29 +00:00
response.on('end', () => {
if (json.error) throw new Error(json.error.message);
callback(json.result);
});
2017-05-29 01:46:00 +03:00
});
2017-05-29 07:02:09 +03:00
request.on('error', (error) => Error(error));
2017-05-29 01:46:00 +03:00
request.write(data);
request.end();
}
2017-05-30 16:03:39 +03:00
exports.encrypt = encrypt;
2017-05-29 01:46:00 +03:00
/**
* Encrypts the incoming data.
* @param {String} raw - Decrypted data.
* @returns {String} - Encrypted string.
*/
2017-05-30 16:03:39 +03:00
function encrypt(raw) {
2017-05-29 01:46:00 +03:00
raw = raw || '';
var base64 = Buffer.from(raw).toString('base64');
var string = Buffer.from(base64);
2017-05-30 16:03:39 +03:00
return mergerString(string).toString('base64');
2017-05-29 01:46:00 +03:00
}
2017-05-30 16:03:39 +03:00
exports.decrypt = decrypt;
2017-05-29 01:46:00 +03:00
/**
* Decrypts the incoming data.
* @param {String} raw - Encrypted data.
* @returns {String} - Decrypted string.
*/
2017-05-30 16:03:39 +03:00
function decrypt(raw) {
2017-05-29 01:46:00 +03:00
raw = raw || '';
var string = Buffer.from(raw, 'base64');
2017-05-30 16:03:39 +03:00
var decrypted = mergerString(string).toString();
2017-05-29 01:46:00 +03:00
return Buffer.from(decrypted, 'base64');
}
2017-05-30 16:03:39 +03:00
exports.decryptJSON = decryptJSON;
2017-05-29 01:46:00 +03:00
/**
* Decrypts an encrypted JSON object.
* @param {String} raw - Encrypted data.
* @returns {Object} - Decrypted JSON.
*/
2017-05-30 16:03:39 +03:00
function decryptJSON(raw) {
2017-05-29 01:46:00 +03:00
raw = raw || '';
var string = raw.toString('ascii');
2017-05-30 16:03:39 +03:00
var data = decrypt(string);
2017-05-29 01:46:00 +03:00
return JSON.parse(data);
}
2017-05-30 16:03:39 +03:00
exports.mergerString = mergerString;
2017-05-29 01:46:00 +03:00
/**
* Merge and convert a string.
* @param {String} raw - The string to convert.
* @returns {String} - The converted string.
*/
2017-05-30 16:03:39 +03:00
function mergerString(data) {
2017-05-29 01:46:00 +03:00
data = data || '';
const salt = Buffer.from('some very-very long string without any non-latin characters due to different string representations inside of variable programming languages');
for (var i = 0; i < data.length; i++) {
data[i] = data[i] ^ salt[i % salt.length];
}
return data;
}
2017-05-30 16:03:39 +03:00
exports.createPackage = createPackage;
2017-05-29 01:46:00 +03:00
/**
* Creates an encrypted package to send.
* @param {Object} raw - The data to send.
* @param {String} raw.cuid - Session identifier.
* @param {String} raw.text - Message text.
* @returns {String} - Encrypted string.
*/
2017-05-30 16:03:39 +03:00
function createPackage(raw) {
2017-05-29 01:46:00 +03:00
raw = raw || {};
if (!raw.text) {
throw new Error('There is no data to send!');
}
2017-05-30 16:03:39 +03:00
if (!isVerification(raw.cuid)) {
2017-05-29 01:46:00 +03:00
throw new Error('Parameter \'CUID\' is not a valid UUID value!');
}
var data = [];
data.push(raw.cuid);
data.push(raw.text.toString());
var json = JSON.stringify(data);
2017-05-30 16:03:39 +03:00
return encrypt(json);
2017-05-29 01:46:00 +03:00
}
2017-05-30 16:03:39 +03:00
exports.isVerification = isVerification;
2017-05-29 01:46:00 +03:00
/**
* Validation UUID format string.
* @param {String} data - The string to check.
* @returns {Boolean}
*/
2017-05-30 16:03:39 +03:00
function isVerification(data) {
2017-05-29 01:46:00 +03:00
data = data || '';
const regexp = new RegExp('^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$', 'i');
return regexp.test(data);
}
< / code > < / pre >
< / article >
< / section >
< / div >
< br class = "clear" >
< footer >
2017-06-14 22:00:24 +00:00
Generated by < a href = "https://github.com/jsdoc3/jsdoc" > JSDoc 3.4.3< / a > on Wed Jun 14 2017 22:00:09 GMT+0000 (UTC) using the Minami theme.
2017-05-29 01:46:00 +03:00
< / footer >
2017-05-29 02:00:21 +03:00
< script > prettyPrint ( ) ; < / script >
< script src = "scripts/linenumber.js" > < / script >
2017-05-29 01:46:00 +03:00
< / body >
< / html >