// Modules to install separately
const request = require('request');
const AsciiTable = require('ascii-table');
const countries = require('./config/countries.json');
function sortByKey(in_key){
return function(a, b) {
if(a[in_key] > b[in_key]){
return -1;
}else if (a[in_key] < b[in_key]){
return 1;
}else{
return 0;
}
}
}
var pad = function(n, width, z) {
z = z || '0';
n = n + '';
return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}
var generateAsciiTable = function(data, in_title = '', in_sort = {}){
if(data.table.rows.length > 0){
var table = new AsciiTable().fromJSON({
title: in_title,
heading: data.table.headers,
rows: data.table.rows
})
for(var i=0; i < data.table.rows[0].length; i++){
table.setAlign(i, AsciiTable.CENTER);
}
if(typeof in_sort.column != 'undefined' && in_sort.column != undefined){
table.sortColumn(in_sort.column, function(a, b) {
if(typeof in_sort.order != 'undefined' && in_sort.order != undefined){
if(in_sort.order == 'DESC'){
return b - a
}else{
return a - b
}
}else{
return b - a
}
})
}
const message = table.toString();
return message;
}else{
return '';
}
}
function getAllCases(){
return new Promise(function(resolve, reject) {
request('https://corona.lmao.ninja/v2/countries', function(error, response, body) {
if(error){
reject(error);
}else if(response.statusCode != 200){
reject(body.toString('utf8'));
}else{
let _info = JSON.parse(body.toString('utf8'));
resolve(_info);
}
});
})
}
const defaultConfig = {
idChat: '',
search: '',
title: 'Coronavirus',
rowsToDisplay: 10,
headers: ["Country", "Cases", "Today", "Deaths", "Recovery", "Actives"],
filters: [
{
"name": "deaths",
"values": ["death", "deaths", "muerte", "muertes", "muertos"]
},
{
"name": "cases",
"values": ["cases", "case", "casos", "caso"]
},
{
"name": "todayDeaths",
"values": ["today", "hoy"]
},
{
"name": "active",
"values": ["active", "activos", "activo"]
}
],
messageError: '*Ooops, an error occurred while trying to search, try again later*',
messageNoDataFound: '*No information about your search could be found*'
}
/**
* Plugin to obtain information on the coronavirus by countries, cases, deaths, etc.
* @function coronavirus
* @memberof Plugins
* @param {string} idChat - Chat id to send the new image to
* @param {string} search - Search parameter (country, cases, deaths, etc)
* @param {string} title - Title to display in image
* @param {number} rowsToDisplay - Number of countries to show in the image
* @param {string[]} headers - Name of the headers to display
* @param {object[]} filters - Configuration of the filters to be able to search
* @param {string} filters.name - Filter name
* @param {string[]} filters.values - Possible values that the user can enter
* @param {string} messageError - Message to send in case of error
* @param {string} messageNoDataFound - Message to send in case of not finding information
* @see {@link https://deepai.org/machine-learning-model/toonify|DeepAiToonify}
*/
module.exports = {
/**
* Id - Name of the plugin to use
* @property {string} id - Name of the plugin to use
*/
id: 'coronavirus',
plugin(_args) {
const args = this.mergeOpts(defaultConfig, _args);
if (args.idChat !== '') {
let params = args.search.trim();
getAllCases()
.then(data => {
let _info = [];
let sortKey = '';
let _country = '';
let _data;
let _exists = false;
if(params.length > 0){
let args_ = params.split(' ');
args_.forEach(fil_ => {
_exists = false;
const _value = fil_.toLowerCase();
args.filters.forEach(filter => {
if(filter.values.indexOf(_value) !== -1){
_exists = true;
sortKey = filter.name;
}
})
/*SI NO ENCONTRO COMO FILTRO DEBE SER PAIS*/
if(!_exists){
let infoCountry = countries.find(obj => (obj.nombre.toLowerCase().indexOf(_value) !== -1 || obj.name.toLowerCase().indexOf(_value) !== -1))
if(infoCountry !== undefined){
_country = infoCountry.name.toLowerCase();
}
}
})
}
if(_country !== ''){
orderedData = data.find(obj => obj.country.toLowerCase() === _country);
if(orderedData !== undefined){
_info.push({
'country': orderedData.country,
'cases': orderedData.cases,
'today': orderedData.todayCases,
'deaths': orderedData.deaths,
'recovered': orderedData.recovered,
'active': orderedData.active,
'casesPerMillon': orderedData.casesPerOneMillion,
'deathsPerMillon': orderedData.deathsPerOneMillion
});
}
}else{
_data = data;
let orderedData;
if(sortKey === ''){
orderedData = _data.sort(sortByKey('cases'));
}else{
orderedData = _data.sort(sortByKey(sortKey));
}
let cont = 0;
orderedData.forEach(register => {
cont++;
if(cont <= args.rowsToDisplay){
_info.push({
'country': register.country,
'cases': register.cases,
'today': register.todayCases,
'deaths': register.deaths,
'recovered': register.recovered,
'active': register.active,
'casesPerMillon': register.casesPerOneMillion,
'deathsPerMillon': register.deathsPerOneMillion
});
}
})
}
if(_info.length === 0){
this.sendMessage({
"idChat": args.idChat,
"message": args.messageNoDataFound
});
}else{
let registers = [];
_info.forEach(register => {
registers.push([register.country, register.cases, register.today, register.deaths, register.recovered, register.active]);
})
let dataAscii = {
"table": {
"headers": args.headers,
"rows": registers
}
}
let title = args.title;
const message = generateAsciiTable(dataAscii, title);
if (message != ''){
this.sendText2Image({
"idChat": args.idChat,
"message": message
});
}else{
this.sendMessage({
"idChat": args.idChat,
"message": args.messageError
});
}
}
})
.catch(err => {
this.sendMessage({
"idChat": args.idChat,
"message": args.messageError
});
})
}
}
};
Source