From afbf980043881c61c1e1a19b677f4203dc4f0bca Mon Sep 17 00:00:00 2001 From: Sayak Mukhopadhyay Date: Wed, 22 Nov 2017 12:41:47 +0530 Subject: [PATCH] Added automated BGS Report --- package-lock.json | 8 +- package.json | 2 + src/db/interfaces/guild.ts | 1 + src/db/schemas/guild.ts | 1 + src/interfaces/typings.ts | 8 + src/modules/cron/autoReport.ts | 140 ++++++ src/modules/cron/index.ts | 17 + src/modules/discord/commands/bgsReport.ts | 545 ++++++++++++++-------- src/server.ts | 12 + 9 files changed, 545 insertions(+), 189 deletions(-) create mode 100644 src/modules/cron/autoReport.ts create mode 100644 src/modules/cron/index.ts diff --git a/package-lock.json b/package-lock.json index d8b61c1..01780a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -69,6 +69,12 @@ "@types/express": "4.0.39" } }, + "@types/cron": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/cron/-/cron-1.2.1.tgz", + "integrity": "sha1-lcHkMtYQbKNMkvB0Nji8eGwHP6o=", + "dev": true + }, "@types/debug": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", @@ -729,7 +735,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/cron/-/cron-1.3.0.tgz", "integrity": "sha512-K/SF7JlgMmNjcThWxkKvsHhey2EDB4CeOEWJ9aXWj3fbQJppsvTPIeyLdHfNq5IbbsMUUjRW1nr5dSO95f2E4w==", - "dev": true, "requires": { "moment-timezone": "0.5.14" } @@ -2883,7 +2888,6 @@ "version": "0.5.14", "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.14.tgz", "integrity": "sha1-TrOP+VOLgBCLpGekWPPtQmjM/LE=", - "dev": true, "requires": { "moment": "2.19.2" } diff --git a/package.json b/package.json index aab60fc..e4e4a73 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "dependencies": { "body-parser": "^1.18.2", "cookie-parser": "^1.4.3", + "cron": "^1.3.0", "debug": "^3.1.0", "discord.js": "^11.2.1", "express": "^4.16.2", @@ -20,6 +21,7 @@ "devDependencies": { "@types/body-parser": "^1.16.8", "@types/cookie-parser": "^1.4.1", + "@types/cron": "^1.2.1", "@types/debug": "0.0.30", "@types/express": "^4.0.39", "@types/mongoose": "^4.7.27", diff --git a/src/db/interfaces/guild.ts b/src/db/interfaces/guild.ts index 16a3b51..6462cdf 100644 --- a/src/db/interfaces/guild.ts +++ b/src/db/interfaces/guild.ts @@ -18,6 +18,7 @@ export interface IGuild { guild_id: string, bgs_channel_id: string, bgs_role_id: string, + bgs_time: string, admin_roles_id: string[], forbidden_roles_id: string[], created_at: Date, diff --git a/src/db/schemas/guild.ts b/src/db/schemas/guild.ts index 8725ee7..fb6eea3 100644 --- a/src/db/schemas/guild.ts +++ b/src/db/schemas/guild.ts @@ -23,6 +23,7 @@ export let guildSchema: Schema = new Schema({ }, bgs_channel_id: String, bgs_role_id: String, + bgs_time: String, admin_roles_id: [String], forbidden_roles_id: [String], created_at: { diff --git a/src/interfaces/typings.ts b/src/interfaces/typings.ts index 01b2af4..ba84190 100644 --- a/src/interfaces/typings.ts +++ b/src/interfaces/typings.ts @@ -1,5 +1,6 @@ import * as mongoosePaginate from 'mongoose-paginate'; import { PaginateResult } from 'mongoose'; +import { CronJob } from 'cron'; interface FactionSchema { _id: string; @@ -197,6 +198,12 @@ export interface EBGSSystemV3SchemaWOHistory { updated_at: string; } +export interface CronJobStoreSchema { + cronJob: CronJob; + guildid: String; + time: String; +} + export type FactionsV3 = PaginateResult; export type PopulatedSystemsV3 = PaginateResult; @@ -204,3 +211,4 @@ export type EBGSFactionsV3 = PaginateResult; export type EBGSSystemsV3 = PaginateResult; export type EBGSFactionsV3WOHistory = PaginateResult; export type EBGSSystemsV3WOHistory = PaginateResult; +export type CronJobStore = CronJobStoreSchema; diff --git a/src/modules/cron/autoReport.ts b/src/modules/cron/autoReport.ts new file mode 100644 index 0000000..c943d92 --- /dev/null +++ b/src/modules/cron/autoReport.ts @@ -0,0 +1,140 @@ +/* + * KodeBlox Copyright 2017 Sayak Mukhopadhyay + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http: //www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { CronJob } from 'cron'; +import { IGuildModel } from '../../db/models/index'; +import { Client, GuildChannel, TextChannel } from 'discord.js'; +import { CronJobStore } from '../../interfaces/typings'; +import { BGSReport } from '../discord/commands/bgsReport'; + +export class AutoReport { + private static jobs: CronJobStore[] = []; + + public static initiateJob(guilds: IGuildModel[], client: Client) { + guilds.forEach(guild => { + if (guild.bgs_time && guild.bgs_time.length > 0 && guild.bgs_channel_id && guild.bgs_channel_id.length > 0) { + try { + let cronPattern = `${guild.bgs_time.split(':')[2]} ${guild.bgs_time.split(':')[1]} ${guild.bgs_time.split(':')[0]} * * *`; + let cronJob = new CronJob(cronPattern, () => { + let bgsChannel: GuildChannel = client.guilds.get(guild.guild_id).channels.get(guild.bgs_channel_id); + if (bgsChannel && bgsChannel.type === 'text') { + let bgsReport = new BGSReport(); + bgsReport.getBGSReportEmbed(guild.guild_id) + .then(embed => { + (bgsChannel as TextChannel).send(embed); + }); + } else { + console.log(`Guild ${guild.guild_id} has not been set up`) + } + }); + this.jobs.push({ + cronJob: cronJob, + guildid: guild.guild_id, + time: guild.bgs_time + }); + cronJob.start(); + } + catch (err) { + console.log(err); + console.log(`Time ${guild.bgs_time} is not a suitable cron time`); + } + } + }); + } + + public static createJob(guild: IGuildModel, client: Client) { + if (guild.bgs_time && guild.bgs_time.length > 0 && guild.bgs_channel_id && guild.bgs_channel_id.length > 0) { + if (this.jobs.findIndex(element => { + return element.guildid === guild.guild_id; + }) !== -1) { + this.editJob(guild, client); + } else { + try { + let cronPattern = `${guild.bgs_time.split(':')[2]} ${guild.bgs_time.split(':')[1]} ${guild.bgs_time.split(':')[0]} * * *`; + let cronJob = new CronJob(cronPattern, () => { + let bgsChannel: GuildChannel = client.guilds.get(guild.guild_id).channels.get(guild.bgs_channel_id); + if (bgsChannel && bgsChannel.type === 'text') { + let bgsReport = new BGSReport(); + bgsReport.getBGSReportEmbed(guild.guild_id) + .then(embed => { + (bgsChannel as TextChannel).send(embed); + }); + } else { + console.log(`Guild ${guild.guild_id} has not been set up`) + } + }); + this.jobs.push({ + cronJob: cronJob, + guildid: guild.guild_id, + time: guild.bgs_time + }); + cronJob.start(); + } + catch (err) { + console.log(err); + console.log(`Time ${guild.bgs_time} is not a suitable cron time`); + } + } + } + } + + public static editJob(guild: IGuildModel, client: Client) { + if (guild.bgs_time && guild.bgs_time.length > 0 && guild.bgs_channel_id && guild.bgs_channel_id.length > 0) { + let indexOfJob = this.jobs.findIndex(element => { + return element.guildid === guild.guild_id; + }); + if (indexOfJob === -1) { + this.createJob(guild, client); + } else { + let existingCronJob = this.jobs[indexOfJob].cronJob; + existingCronJob.stop(); + try { + let cronPattern = `${guild.bgs_time.split(':')[2]} ${guild.bgs_time.split(':')[1]} ${guild.bgs_time.split(':')[0]} * * *`; + let cronJob = new CronJob(cronPattern, () => { + let bgsChannel: GuildChannel = client.guilds.get(guild.guild_id).channels.get(guild.bgs_channel_id); + if (bgsChannel && bgsChannel.type === 'text') { + let bgsReport = new BGSReport(); + bgsReport.getBGSReportEmbed(guild.guild_id) + .then(embed => { + (bgsChannel as TextChannel).send(embed); + }); + } else { + console.log(`Guild ${guild.guild_id} has not been set up`) + } + }); + this.jobs[indexOfJob].cronJob = cronJob; + this.jobs[indexOfJob].time = guild.bgs_time; + cronJob.start(); + } + catch (err) { + console.log(err); + console.log(`Time ${guild.bgs_time} is not a suitable cron time`); + } + } + } + } + + public static deleteJob(guild: IGuildModel, client: Client) { + let indexOfJob = this.jobs.findIndex(element => { + return element.guildid === guild.guild_id; + }); + if (indexOfJob !== -1) { + let existingCronJob = this.jobs[indexOfJob].cronJob; + existingCronJob.stop(); + this.jobs.splice(indexOfJob); + } + } +} diff --git a/src/modules/cron/index.ts b/src/modules/cron/index.ts new file mode 100644 index 0000000..4551168 --- /dev/null +++ b/src/modules/cron/index.ts @@ -0,0 +1,17 @@ +/* + * KodeBlox Copyright 2017 Sayak Mukhopadhyay + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http: //www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './autoReport'; diff --git a/src/modules/discord/commands/bgsReport.ts b/src/modules/discord/commands/bgsReport.ts index 8078090..18069b2 100644 --- a/src/modules/discord/commands/bgsReport.ts +++ b/src/modules/discord/commands/bgsReport.ts @@ -23,6 +23,8 @@ import { DB } from '../../../db/index'; import { Access } from './../access'; import { EBGSFactionsV3WOHistory, EBGSSystemsV3WOHistory } from "../../../interfaces/typings"; import { OptionsWithUrl } from 'request'; +import { RichEmbed } from 'discord.js'; +import { AutoReport } from '../../cron/autoReport'; export class BGSReport { db: DB; @@ -51,216 +53,385 @@ export class BGSReport { .then(() => { if (argsArray.length === 1) { let guildId = message.guild.id; + this.getBGSReportEmbed(guildId) + .then(embed => { + message.channel.send({ embed }) + .catch(err => { + console.log(err); + }); + }) + .catch(err => { + console.log(err); + }); + } else if (argsArray.length > 1) { + message.channel.send(Responses.getResponse(Responses.TOOMANYPARAMS)); + } else { + message.channel.send(Responses.getResponse(Responses.NOPARAMS)); + } + }) + .catch(err => { + console.log(err); + }); + } + + settime(message: discord.Message, argsArray: string[]): void { + Access.has(message.member, [Access.ADMIN, Access.BGS, Access.FORBIDDEN]) + .then(() => { + if (argsArray.length === 2) { + let guildId = message.guild.id; + let time = argsArray[1].split(':').map(element => { + return parseInt(element); + }); + if (time.length === 3 + && time[0] >= 0 && time[0] < 24 + && time[1] >= 0 && time[1] < 59 + && time[2] >= 0 && time[2] < 59) { + this.db.model.guild.findOneAndUpdate( + { guild_id: guildId }, + { + updated_at: new Date(), + bgs_time: time.map(element => { + let elementString = element.toString(); + if (elementString.length === 1) { + elementString = `0${elementString}`; + } + return elementString; + }).join(":") + }, + { new: true }) + .then(guild => { + if (guild) { + message.channel.send(Responses.getResponse(Responses.SUCCESS)); + AutoReport.createJob(guild, message.client); + } else { + message.channel.send(Responses.getResponse(Responses.FAIL)) + .then(() => { + message.channel.send("Your guild is not set yet"); + }) + .catch(err => { + console.log(err); + }); + } + }) + .catch(err => { + message.channel.send(Responses.getResponse(Responses.FAIL)); + console.log(err); + }) + } else { + message.channel.send(Responses.getResponse(Responses.FAIL)) + .then(() => { + message.channel.send("Time must be of the form HH:mm:ss"); + }) + .catch(err => { + console.log(err); + }); + } + } else if (argsArray.length > 2) { + message.channel.send(Responses.getResponse(Responses.TOOMANYPARAMS)); + } else { + message.channel.send(Responses.getResponse(Responses.NOPARAMS)); + } + }) + .catch(() => { + message.channel.send(Responses.getResponse(Responses.INSUFFICIENTPERMS)); + }); + } + + showtime(message: discord.Message, argsArray: string[]): void { + Access.has(message.member, [Access.ADMIN, Access.BGS, Access.FORBIDDEN]) + .then(() => { + if (argsArray.length === 1) { + let guildId = message.guild.id; + this.db.model.guild.findOne({ guild_id: guildId }) .then(guild => { if (guild) { - let primaryFactions: string[] = []; - let secondaryFactions: string[] = []; - guild.monitor_factions.forEach(faction => { - if (faction.primary) { - primaryFactions.push(faction.faction_name); - } else { - secondaryFactions.push(faction.faction_name); - } - }); - let primarySystems: string[] = []; - let secondarySystems: string[] = [] - guild.monitor_systems.forEach(system => { - if (system.primary) { - primarySystems.push(system.system_name); - } else { - secondarySystems.push(system.system_name); - } - }); + if (guild.bgs_time && guild.bgs_time.length !== 0) { + let embed = new discord.RichEmbed(); + embed.setTitle("BGS Reporting Time"); + embed.setColor([255, 0, 255]); + embed.addField("Ids and Names", `${guild.bgs_time} UTC`); + embed.setTimestamp(new Date()); + message.channel.send({ embed }) + .catch(err => { + console.log(err); + }); + } else { + message.channel.send(Responses.getResponse(Responses.FAIL)) + .then(() => { + message.channel.send("You don't have a bgs reporting time set up"); + }) + .catch(err => { + console.log(err); + }); + } + } else { + message.channel.send(Responses.getResponse(Responses.FAIL)) + .then(() => { + message.channel.send("Your guild is not set yet"); + }) + .catch(err => { + console.log(err); + }); + } + }) + .catch(err => { + message.channel.send(Responses.getResponse(Responses.FAIL)); + console.log(err); + }) + } else { + message.channel.send(Responses.getResponse(Responses.TOOMANYPARAMS)); + } + }) + .catch(() => { + message.channel.send(Responses.getResponse(Responses.INSUFFICIENTPERMS)); + }); + } + unsettime(message: discord.Message, argsArray: string[]): void { + Access.has(message.member, [Access.ADMIN, Access.BGS, Access.FORBIDDEN]) + .then(() => { + if (argsArray.length === 1) { + let guildId = message.guild.id; - let embed = new discord.RichEmbed(); - embed.setTitle("BGS REPORT"); - embed.setColor([255, 100, 255]); + this.db.model.guild.findOneAndUpdate( + { guild_id: guildId }, + { + updated_at: new Date(), + $unset: { bgs_time: 1 } + }) + .then(guild => { + if (guild) { + message.channel.send(Responses.getResponse(Responses.SUCCESS)); + AutoReport.deleteJob(guild, message.client); + } else { + message.channel.send(Responses.getResponse(Responses.FAIL)) + .then(() => { + message.channel.send("Your guild is not set yet"); + }) + .catch(err => { + console.log(err); + }); + } + }) + .catch(err => { + message.channel.send(Responses.getResponse(Responses.FAIL)); + console.log(err); + }) + } else { + message.channel.send(Responses.getResponse(Responses.TOOMANYPARAMS)); + } + }) + .catch(() => { + message.channel.send(Responses.getResponse(Responses.INSUFFICIENTPERMS)); + }); + } + + public getBGSReportEmbed(guildId: string): Promise { + return new Promise((resolve, reject) => { + this.db.model.guild.findOne({ guild_id: guildId }) + .then(guild => { + if (guild) { + let primaryFactions: string[] = []; + let secondaryFactions: string[] = []; + guild.monitor_factions.forEach(faction => { + if (faction.primary) { + primaryFactions.push(faction.faction_name); + } else { + secondaryFactions.push(faction.faction_name); + } + }); + let primarySystems: string[] = []; + let secondarySystems: string[] = [] + guild.monitor_systems.forEach(system => { + if (system.primary) { + primarySystems.push(system.system_name); + } else { + secondarySystems.push(system.system_name); + } + }); - let systemPromises: Promise<[string, string]>[] = []; - primarySystems.forEach(system => { - systemPromises.push(new Promise((resolve, reject) => { - let requestOptions: OptionsWithUrl = { - url: "http://elitebgs.kodeblox.com/api/ebgs/v3/systems", - method: "GET", - qs: { name: system.toLowerCase() }, - json: true - } - request(requestOptions, (error, response, body: EBGSSystemsV3WOHistory) => { - if (!error && response.statusCode == 200) { - if (body.total === 0) { - resolve([system, `${this.acronym(system)} System not found\n`]); - } else { - let systemResponse = body.docs[0]; - let primaryFactionPromises: Promise[] = []; - let secondaryFactionPromises: Promise[] = []; - systemResponse.factions.forEach(faction => { - if (primaryFactions.indexOf(faction.name) !== -1) { - primaryFactionPromises.push(new Promise((resolve, reject) => { - let requestOptions: OptionsWithUrl = { - url: "http://elitebgs.kodeblox.com/api/ebgs/v3/factions", - method: "GET", - qs: { name: faction.name_lower }, - json: true - } - request(requestOptions, (error, response, body: EBGSFactionsV3WOHistory) => { - if (!error && response.statusCode == 200) { - if (body.total === 0) { - resolve(`${this.acronym(faction.name)} Faction not found\n`); - } else { - let factionResponse = body.docs[0]; - let systemIndex = factionResponse.faction_presence.findIndex(element => { - return element.system_name === system; - }); - if (systemIndex !== -1) { - let factionName = factionResponse.name; - let state = ""; - let influence = 0; - let pendingStatesArray = []; - factionResponse.faction_presence.forEach(systemElement => { - if (systemElement.system_name_lower === system.toLowerCase()) { - state = systemElement.state; - influence = systemElement.influence; - pendingStatesArray = systemElement.pending_states; - } - }); - let updatedAt = moment(factionResponse.updated_at); - let factionDetail = ""; - factionDetail += `Last Updated : ${updatedAt.fromNow()} \n`; - factionDetail += `Current ${this.acronym(factionName)} Influence : ${(influence * 100).toFixed(1)}%\n`; - factionDetail += `Current ${this.acronym(factionName)} State : ${state}\n`; + let embed = new discord.RichEmbed(); + embed.setTitle("BGS REPORT"); + embed.setColor([255, 100, 255]); - let pendingStates: string = ""; - if (pendingStatesArray.length === 0) { - pendingStates = "None"; - } else { - pendingStatesArray.forEach((pendingState, index, factionPendingStates) => { - let trend = this.getTrendIcon(pendingState.trend); - pendingStates = `${pendingStates}${pendingState.state}${trend}`; - if (index !== factionPendingStates.length - 1) { - pendingStates = `${pendingStates}, ` - } - }); - } + let systemPromises: Promise<[string, string]>[] = []; - factionDetail += `Pending ${this.acronym(factionName)} State : ${pendingStates}\n`; - resolve(factionDetail); - } else { - resolve(`${this.acronym(faction.name)} Faction not found\n`); + primarySystems.forEach(system => { + systemPromises.push(new Promise((resolve, reject) => { + let requestOptions: OptionsWithUrl = { + url: "http://elitebgs.kodeblox.com/api/ebgs/v3/systems", + method: "GET", + qs: { name: system.toLowerCase() }, + json: true + } + request(requestOptions, (error, response, body: EBGSSystemsV3WOHistory) => { + if (!error && response.statusCode == 200) { + if (body.total === 0) { + resolve([system, `${this.acronym(system)} System not found\n`]); + } else { + let systemResponse = body.docs[0]; + let primaryFactionPromises: Promise[] = []; + let secondaryFactionPromises: Promise[] = []; + systemResponse.factions.forEach(faction => { + if (primaryFactions.indexOf(faction.name) !== -1) { + primaryFactionPromises.push(new Promise((resolve, reject) => { + let requestOptions: OptionsWithUrl = { + url: "http://elitebgs.kodeblox.com/api/ebgs/v3/factions", + method: "GET", + qs: { name: faction.name_lower }, + json: true + } + request(requestOptions, (error, response, body: EBGSFactionsV3WOHistory) => { + if (!error && response.statusCode == 200) { + if (body.total === 0) { + resolve(`${this.acronym(faction.name)} Faction not found\n`); + } else { + let factionResponse = body.docs[0]; + let systemIndex = factionResponse.faction_presence.findIndex(element => { + return element.system_name === system; + }); + if (systemIndex !== -1) { + let factionName = factionResponse.name; + let state = ""; + let influence = 0; + let pendingStatesArray = []; + factionResponse.faction_presence.forEach(systemElement => { + if (systemElement.system_name_lower === system.toLowerCase()) { + state = systemElement.state; + influence = systemElement.influence; + pendingStatesArray = systemElement.pending_states; } - } - } else { - if (error) { - reject(error); + }); + let updatedAt = moment(factionResponse.updated_at); + let factionDetail = ""; + factionDetail += `Last Updated : ${updatedAt.fromNow()} \n`; + factionDetail += `Current ${this.acronym(factionName)} Influence : ${(influence * 100).toFixed(1)}%\n`; + factionDetail += `Current ${this.acronym(factionName)} State : ${state}\n`; + + let pendingStates: string = ""; + if (pendingStatesArray.length === 0) { + pendingStates = "None"; } else { - reject(response.statusMessage); + pendingStatesArray.forEach((pendingState, index, factionPendingStates) => { + let trend = this.getTrendIcon(pendingState.trend); + pendingStates = `${pendingStates}${pendingState.state}${trend}`; + if (index !== factionPendingStates.length - 1) { + pendingStates = `${pendingStates}, ` + } + }); } + + factionDetail += `Pending ${this.acronym(factionName)} State : ${pendingStates}\n`; + resolve(factionDetail); + } else { + resolve(`${this.acronym(faction.name)} Faction not found\n`); } - }); - })); - } else if (secondaryFactions.indexOf(faction.name) !== -1) { - secondaryFactionPromises.push(new Promise((resolve, reject) => { - let requestOptions: OptionsWithUrl = { - url: "http://elitebgs.kodeblox.com/api/ebgs/v3/factions", - method: "GET", - qs: { name: faction.name_lower }, - json: true } - request(requestOptions, (error, response, body: EBGSFactionsV3WOHistory) => { - if (!error && response.statusCode == 200) { - if (body.total === 0) { - resolve(`${this.acronym(faction)} Faction not found\n`); + } else { + if (error) { + reject(error); + } else { + reject(response.statusMessage); + } + } + }); + })); + } else if (secondaryFactions.indexOf(faction.name) !== -1) { + secondaryFactionPromises.push(new Promise((resolve, reject) => { + let requestOptions: OptionsWithUrl = { + url: "http://elitebgs.kodeblox.com/api/ebgs/v3/factions", + method: "GET", + qs: { name: faction.name_lower }, + json: true + } + request(requestOptions, (error, response, body: EBGSFactionsV3WOHistory) => { + if (!error && response.statusCode == 200) { + if (body.total === 0) { + resolve(`${this.acronym(faction)} Faction not found\n`); + } else { + let factionResponse = body.docs[0]; + let systemIndex = factionResponse.faction_presence.findIndex(element => { + return element.system_name === system; + }); + if (systemIndex !== -1) { + let factionName = factionResponse.name; + let state = ""; + let influence = 0; + let pendingStatesArray = []; + factionResponse.faction_presence.forEach(systemElement => { + if (systemElement.system_name_lower === system.toLowerCase()) { + state = systemElement.state; + influence = systemElement.influence; + pendingStatesArray = systemElement.pending_states; + } + }); + let pendingStates: string = ""; + if (pendingStatesArray.length === 0) { + pendingStates = "None"; } else { - let factionResponse = body.docs[0]; - let systemIndex = factionResponse.faction_presence.findIndex(element => { - return element.system_name === system; - }); - if (systemIndex !== -1) { - let factionName = factionResponse.name; - let state = ""; - let influence = 0; - let pendingStatesArray = []; - factionResponse.faction_presence.forEach(systemElement => { - if (systemElement.system_name_lower === system.toLowerCase()) { - state = systemElement.state; - influence = systemElement.influence; - pendingStatesArray = systemElement.pending_states; - } - }); - let pendingStates: string = ""; - if (pendingStatesArray.length === 0) { - pendingStates = "None"; - } else { - pendingStatesArray.forEach((pendingState, index, factionPendingStates) => { - let trend = this.getTrendIcon(pendingState.trend); - pendingStates = `${pendingStates}${pendingState.state}${trend}`; - if (index !== factionPendingStates.length - 1) { - pendingStates = `${pendingStates}, ` - } - }); + pendingStatesArray.forEach((pendingState, index, factionPendingStates) => { + let trend = this.getTrendIcon(pendingState.trend); + pendingStates = `${pendingStates}${pendingState.state}${trend}`; + if (index !== factionPendingStates.length - 1) { + pendingStates = `${pendingStates}, ` } - - let factionDetail = `Current ${this.acronym(factionName)} Influence : ${(influence * 100).toFixed(1)}% (Currently in ${state}. Pending ${pendingStates})\n`; - resolve(factionDetail); - } else { - resolve(`${this.acronym(faction.name)} Faction not found\n`); - } + }); } + + let factionDetail = `Current ${this.acronym(factionName)} Influence : ${(influence * 100).toFixed(1)}% (Currently in ${state}. Pending ${pendingStates})\n`; + resolve(factionDetail); } else { - if (error) { - reject(error); - } else { - reject(response.statusMessage); - } + resolve(`${this.acronym(faction.name)} Faction not found\n`); } - }); - })); - } - }); - Promise.all(primaryFactionPromises.concat(secondaryFactionPromises)) - .then(details => { - resolve([system, details.join("")]); - }) - .catch(err => { - reject(err); + } + } else { + if (error) { + reject(error); + } else { + reject(response.statusMessage); + } + } }); + })); } - } else { - if (error) { - reject(error); - } else { - reject(response.statusMessage); - } - } - }); - })); - }); - Promise.all(systemPromises) - .then(systems => { - systems.forEach(system => { - embed.addField(system[0], system[1]); - }); - embed.setTimestamp(new Date()); - message.channel.send({ embed }) - .catch(err => { - console.log(err); }); - }) - .catch(err => { - console.log(err); - }); - } - }) - .catch(err => { - console.log(err); + Promise.all(primaryFactionPromises.concat(secondaryFactionPromises)) + .then(details => { + resolve([system, details.join("")]); + }) + .catch(err => { + reject(err); + }); + } + } else { + if (error) { + reject(error); + } else { + reject(response.statusMessage); + } + } + }); + })); }); - } - }) - .catch(err => { - console.log(err); - }); + Promise.all(systemPromises) + .then(systems => { + systems.forEach(system => { + embed.addField(system[0], system[1]); + }); + embed.setTimestamp(new Date()); + resolve(embed); + }) + .catch(err => { + reject(err); + }); + } + }) + .catch(err => { + reject(err); + }); + }); } private getTrendIcon(trend: number): string { diff --git a/src/server.ts b/src/server.ts index 23169fc..059da8c 100644 --- a/src/server.ts +++ b/src/server.ts @@ -24,6 +24,7 @@ import * as cookieParser from 'cookie-parser'; import IndexRouter from './routes/index'; import { DiscordClient } from './modules/discord/client'; import { DB } from './db'; +import { AutoReport } from './modules/cron/index'; class App { public express: express.Application; @@ -36,6 +37,7 @@ class App { this.routes(); this.discordClient = new DiscordClient(); this.db = new DB(); + this.cron(); } private middleware(): void { @@ -48,6 +50,16 @@ class App { private routes(): void { this.express.use('/', IndexRouter); } + + private cron(): void { + this.db.model.guild.find() + .then(guilds => { + AutoReport.initiateJob(guilds, this.discordClient.client) + }) + .catch(err => { + console.log(err); + }); + } } let app = new App();