diff --git a/src/commands/mp.ts b/src/commands/mp.ts index b537665..6d5fa31 100644 --- a/src/commands/mp.ts +++ b/src/commands/mp.ts @@ -9,10 +9,14 @@ import {FSData} from 'src/interfaces'; import {requestServerData, mpModuleDisabled, refreshTimerSecs, playtimeStat} from '../modules/MPModule.js'; async function fetchData(client:TClient, interaction:Discord.ChatInputCommandInteraction, serverName:string):Promise { - const db = await client.MPServer.findInCache(); - const data = await requestServerData(client, db.find(x=>x.serverName === serverName)); - if (!data) return interaction.reply('Ran into a '+RanIntoHumor+' while trying to retrieve server data, please try again later.'); - return data.dss as FSData; + try { + const db = await client.MPServer.findInCache(); + const data = await requestServerData(client, db.find(x=>x.serverName === serverName)); + return data.dss as FSData; + } catch { + Logger.console('error', 'MPDB', 'Function failed - fetchData'); + return interaction.reply('Ran into a '+RanIntoHumor()+' while trying to retrieve server data, please try again later.'); + } } const logPrefix = 'MPDB'; @@ -42,27 +46,30 @@ export default class MP { const canvas = await new CanvasBuilder().generateGraph(PDArr.slice(-120), 'players'); const players:string[] = []; let embedColor:Discord.ColorResolvable; - switch (true){ - case DSS?.slots?.used === DSS?.slots.capacity: - embedColor = client.config.embedColorRed; - break; - case DSS?.slots?.used > 8: - embedColor = client.config.embedColorYellow; - break; - default: - embedColor = client.config.embedColorGreen; - } - for (const player of DSS.slots.players.filter(x=>x.isUsed)) players.push(playtimeStat(player)) - let attachmentName:string = 'MPModule.jpg'; - await interaction.reply({embeds:[new client.embed() - .setTitle(DSS.server?.name.length > 0 ? DSS.server.name : 'Offline') - .setColor(embedColor) - .setDescription(DSS?.slots?.used < 1 ? '*Nobody is playing*' : players.join('\n\n')) - .setImage(`attachment://${attachmentName}`) - .setAuthor({name: `${DSS.slots.used}/${DSS.slots.capacity}`}) - .setFooter({text: `Current time: ${('0'+Math.floor((DSS?.server.dayTime/3600/1000))).slice(-2)}:${('0'+Math.floor((DSS?.server.dayTime/60/1000)%60)).slice(-2)}`}) - ], files: [new client.attachment(canvas.toBuffer('image/jpeg'), {name: attachmentName})]}) + try { + switch (true){ + case DSS?.slots?.used === DSS?.slots?.capacity: + embedColor = client.config.embedColorRed; + break; + case DSS?.slots?.used > 8: + embedColor = client.config.embedColorYellow; + break; + default: + embedColor = client.config.embedColorGreen; + } + for (const player of DSS.slots.players.filter(x=>x.isUsed)) players.push(playtimeStat(player)) + let attachmentName:string = 'MPModule.jpg'; + + await interaction.reply({embeds:[new client.embed() + .setTitle(DSS.server?.name.length > 0 ? DSS.server.name : 'Offline') + .setColor(embedColor) + .setDescription(DSS?.slots?.used < 1 ? '*Nobody is playing*' : players.join('\n\n')) + .setImage(`attachment://${attachmentName}`) + .setAuthor({name: `${DSS.slots?.used}/${DSS.slots?.capacity}`}) + .setFooter({text: `Current time: ${('0'+Math.floor((DSS?.server.dayTime/3600/1000))).slice(-2)}:${('0'+Math.floor((DSS?.server.dayTime/60/1000)%60)).slice(-2)}`}) + ], files: [new client.attachment(canvas.toBuffer('image/jpeg'), {name: attachmentName})]}); + } catch {} }, details: async()=>{ const DSS = await fetchData(client, interaction, choiceSelector) as FSData; @@ -71,26 +78,25 @@ export default class MP { const server = db.find(x=>x.serverName === choiceSelector); const dEmbed = new client.embed().setColor(client.config.embedColor).setAuthor({name: 'Crossplay server'}).setDescription(MessageTool.concatMessage( - `**Name:** \`${DSS?.server.name.length > 0 ? DSS.server.name : '\u200b'}\``, + `**Name:** \`${DSS.server?.name.length > 0 ? DSS.server.name : '\u200b'}\``, '**Password:** `mf4700`', - `**Map:** \`${DSS.server.mapName.length > 0 ? DSS.server.mapName : 'No map'}\``, + `**Map:** \`${DSS.server?.mapName.length > 0 ? DSS.server.mapName : 'No map'}\``, `**Mods:** [Click here](http://${server.ip}/mods.html) **|** [Direct link](http://${server.ip}/all_mods_download?onlyActive=true)`, '**Filters:** [Click here](https://discord.com/channels/468835415093411861/468835769092669461/926581585938120724)', `Please see <#${channels.serverInfo}> for more additional information and rules.` )); - if (DSS.server.name.length < 1) dEmbed.setFooter({text: 'Server is currently offline'}); - await interaction.reply({embeds: [dEmbed]}) + if (DSS.server?.name.length < 1) dEmbed.setFooter({text: 'Server is currently offline'}); + DSS.server ? await interaction.reply({embeds: [dEmbed]}) : null; }, status: async()=>{ const DSS = await fetchData(client, interaction, choiceSelector) as FSData; if (!DSS) return console.log('Endpoint failed - status'); - if (DSS.server.name.length > 0) { - await interaction.reply({embeds: [new client.embed().setColor(client.config.embedColor).addFields( - {name: 'Name', value: `\`${DSS?.server.name}\``}, - {name: 'Players', value: `${DSS.slots.used}/${DSS.slots.capacity}`}, - {name: 'Map', value: DSS?.server.mapName} - ).setFooter({text: `Version: ${DSS?.server.version} | Time: ${`${('0'+Math.floor((DSS?.server.dayTime/3600/1000))).slice(-2)}:${('0'+Math.floor((DSS?.server.dayTime/60/1000)%60)).slice(-2)}`}`})]}) - } else return interaction.reply('Server is currently offline.') + + DSS.server ? await interaction.reply({embeds: [new client.embed().setColor(client.config.embedColor).addFields( + {name: 'Name', value: DSS.server?.name?.length < 1 ? '*`Offline`*' : `\`${DSS?.server?.name}\``}, + {name: 'Players', value: `${DSS?.slots.used}/${DSS?.slots.capacity}`}, + {name: 'Map', value: DSS?.server.mapName} + ).setFooter({text: `Version: ${DSS?.server?.version} | Time: ${`${('0'+Math.floor((DSS?.server.dayTime/3600/1000))).slice(-2)}:${('0'+Math.floor((DSS?.server.dayTime/60/1000)%60)).slice(-2)}`}`})]}) : null }, pallets: async()=>{ const DSS = await fetchData(client, interaction, choiceSelector) as FSData;