1
0
mirror of https://github.com/toast-ts/Daggerbot-TS.git synced 2024-09-29 16:30:59 -04:00
Daggerbot-TS/src/index.ts

181 lines
10 KiB
TypeScript
Raw Normal View History

import Discord from 'discord.js';
2023-01-27 21:33:55 -05:00
import TClient from './client';
2022-11-11 19:58:11 -05:00
const client = new TClient;
client.init();
import fs from 'node:fs';
import MPDB from './models/MPServer';
import {Punishment, UserLevels, FSData, FSCareerSavegame} from './typings/interfaces';
2022-11-11 19:58:11 -05:00
client.on('ready', async()=>{
2022-11-22 16:47:48 -05:00
client.guilds.cache.forEach(async(e)=>{await e.members.fetch()});
2022-11-11 19:58:11 -05:00
setInterval(async()=>{
client.user.setPresence(client.config.botPresence);
}, 300000);
if (client.config.botSwitches.registerCommands){
client.config.whitelistedServers.forEach((guildId)=>(client.guilds.cache.get(guildId) as Discord.Guild).commands.set(client.registry).catch((e:Error)=>{
console.log(`Couldn't register slash commands for ${guildId} because`, e.stack);
(client.channels.resolve(client.config.mainServer.channels.errors) as Discord.TextChannel).send(`Cannot register slash commands for **${client.guilds.cache.get(guildId).name}** (\`${guildId}\`):\n\`\`\`${e.message}\`\`\``)
}));
};
2022-11-11 19:58:11 -05:00
setInterval(()=>{
2022-11-13 19:18:15 -05:00
const guild = client.guilds.cache.get(client.config.mainServer.id) as Discord.Guild;
guild.invites.fetch().then((invs)=>{
invs.forEach(async(inv)=>{
client.invites.set(inv.code, {uses: inv.uses, creator: inv.inviterId})
2022-11-11 19:58:11 -05:00
})
})
}, 500000);
2022-11-13 19:18:15 -05:00
console.log(`${client.user.tag} has logged into Discord API and now ready for operation`);
console.log(client.config.botSwitches);
console.log(client.config.whitelistedServers);
2022-11-22 16:29:02 -05:00
(client.channels.resolve(client.config.mainServer.channels.bot_status) as Discord.TextChannel).send(`${client.user.username} is active\n\`\`\`json\n${Object.entries(client.config.botSwitches).map((hi)=>`${hi[0]}: ${hi[1]}`).join('\n')}\`\`\``);
2022-11-11 19:58:11 -05:00
// Event handler
fs.readdirSync('src/events').forEach((file)=>{
const eventFile = require(`./events/${file}`);
client.on(file.replace('.ts', ''), async(...args)=>eventFile.default.run(client,...args));
});
2022-11-11 19:58:11 -05:00
})
// Handle errors
2023-01-18 23:41:10 -05:00
function DZ(error:Error){// Yes, I may have shiternet but I don't need to wake up to like a hundred messages or so.
if (['getaddrinfo ENOTFOUND discord.com'].includes(error.message)) return;
2022-11-13 19:18:15 -05:00
console.log(error);
2023-01-11 15:40:25 -05:00
(client.channels.resolve(client.config.mainServer.channels.errors) as Discord.TextChannel).send({embeds: [new client.embed().setColor('#420420').setTitle('Error caught!').setDescription(`**Error:** \`${error.message}\`\n\n**Stack:** \`${`${error.stack}`.slice(0, 2500)}\``)]})
2023-01-11 03:33:38 -05:00
}
process.on('unhandledRejection', async(error: Error)=>{
DZ(error)
2022-11-11 19:58:11 -05:00
});
2022-11-13 08:46:50 -05:00
process.on('uncaughtException', async(error: Error)=>{
2023-01-11 03:33:38 -05:00
DZ(error)
2022-11-11 19:58:11 -05:00
});
2022-11-13 08:46:50 -05:00
process.on('error', async(error: Error)=>{
2023-01-11 03:33:38 -05:00
DZ(error)
2022-11-11 19:58:11 -05:00
});
// Daggerwin MP loop
setInterval(async()=>{
if (!client.config.botSwitches.mpstats) return;
2022-11-22 16:31:55 -05:00
const msg = await (client.channels.resolve('543494084363288637') as Discord.TextChannel).messages.fetch('1023699243183112192')
2022-11-11 19:58:11 -05:00
const embed = new client.embed();
let Players = [];
let error;
2022-11-11 19:58:11 -05:00
// Connect to DB to retrieve the Gameserver info to fetch data.
MPDB.sync();
2023-01-12 00:42:13 -05:00
const ServerURL = MPDB.findOne({where: {serverId: client.config.mainServer.id}})
const DBURL = (await ServerURL).ip
2022-11-19 05:17:04 -05:00
const DBCode = (await ServerURL).code
const verifyURL = DBURL.match(/http/);
2022-11-11 19:58:11 -05:00
const completedURL_DSS = DBURL + '/feed/dedicated-server-stats.json?code=' + DBCode
const completedURL_CSG = DBURL + '/feed/dedicated-server-savegame.html?code=' + DBCode + '&file=careerSavegame'
const FSdss = {
data: {} as FSData,
fetchResult: '' as string
};
const FScsg = {
data: {} as FSCareerSavegame,
fetchResult: '' as string
};
2022-11-19 05:17:04 -05:00
if (!verifyURL) return msg.edit({content: 'Invalid gameserver IP, please update!', embeds: null})
async function serverData(client:TClient, URL: string){
2023-01-15 02:38:40 -05:00
return await client.axios.get(URL, {timeout: 4000, maxContentLength: Infinity, headers: {'User-Agent': `Daggerbot/axios ${client.axios.VERSION}`}}).catch((error:Error)=>error.message)
2022-11-11 19:58:11 -05:00
}
await Promise.all([serverData(client, completedURL_DSS), serverData(client, completedURL_CSG)]).then(function(results){
if (typeof results[0] == 'string'){
FSdss.fetchResult = `dag mp dss fail, ${results[0]}`;
embed.addFields({name: 'DSS Status', value: results[0]})
} else if (results[0].status != 200){
FSdss.fetchResult = `dag mp dss fail with ${results[0].status + ' ' + results[0].statusText}`;
} else {
FSdss.data = results[0].data as FSData
}
if (typeof results[1] == 'string'){
FScsg.fetchResult = `dag mp csg fail, ${results[1]}`;
embed.addFields({name: 'CSG Status', value: results[1]})
} else if (results[1].status != 200){
2023-01-08 00:12:54 -05:00
if (results[1].status == 204){embed.setImage('https://http.cat/204')}
FScsg.fetchResult = `dag mp csg fail with ${results[1].status + ' ' + results[1].statusText}`;
} else {
FScsg.data = client.xjs.xml2js(results[1].data,{compact:true,spaces:2}).careerSavegame as FSCareerSavegame;
}
}).catch((error)=>console.log(error))
if (FSdss.fetchResult.length != 0){
error = true;
console.log(`[${client.moment().format('DD/MM/YY HH:mm:ss')}]`, FSdss.fetchResult);
}
if (FScsg.fetchResult.length != 0){
error = true;
console.log(`[${client.moment().format('DD/MM/YY HH:mm:ss')}]`, FScsg.fetchResult);
}
if (error) { // Blame RedRover and Nawdic
embed.setTitle('Host is not responding').setColor(client.config.embedColorRed);
msg.edit({content: null, embeds: [embed]})
return;
2022-11-11 19:58:11 -05:00
}
const DB = JSON.parse(fs.readFileSync(__dirname + '/database/MPPlayerData.json', {encoding: 'utf8'}));
DB.push(FSdss.data.slots.used)
fs.writeFileSync(__dirname + '/database/MPPlayerData.json', JSON.stringify(DB))
2022-11-11 19:58:11 -05:00
// Number format function
function formatNumber(number: any, digits: any, icon: any){
var n = Number(number)
return n.toLocaleString(undefined, {minimumFractionDigits: digits})+icon
2023-02-04 10:29:53 -05:00
} // Temporary workaround for fresh save.
const slotSystem = Number(FScsg.data.slotSystem?._attributes.slotUsage).toLocaleString('en-US')
const timeScale = formatNumber(Number(FScsg.data.settings?.timeScale._text), 0, 'x')
2022-11-11 19:58:11 -05:00
if (FSdss.data.server.name.length == 0){
2022-11-11 19:58:11 -05:00
embed.setTitle('The server seems to be offline.').setColor(client.config.embedColorRed);
msg.edit({content: 'This embed will resume when server is back online.', embeds: [embed]})
2022-11-11 19:58:11 -05:00
} else {
const embed1 = new client.embed().setColor(client.config.embedColor).setTitle('Server details').addFields(
{name: 'Current Map', value: `${FSdss.data.server.mapName.length == 0 ? '\u200b' : FSdss.data.server.mapName}`, inline: true},
{name: 'Version', value: `${FSdss.data.server.version.length == 0 ? '\u200b' : FSdss.data.server.version}`, inline: true},
{name: 'In-game Time', value: `${('0' + Math.floor((FSdss.data.server.dayTime/3600/1000))).slice(-2)}:${('0' + Math.floor((FSdss.data.server.dayTime/60/1000)%60)).slice(-2)}`, inline: true},
2023-02-04 11:08:28 -05:00
{name: 'Slot Usage', value: `${slotSystem == undefined ? 'slotSystem unavailable' : slotSystem}`, inline: true},
{name: 'Timescale', value: `${timeScale == undefined ? 'timeScale unavailable': timeScale}`, inline: true}
2022-11-11 19:58:11 -05:00
);
FSdss.data.slots.players.filter((x)=>x.isUsed !== false).forEach(player=>{
Players.push(`**${player.name} ${player.isAdmin ? '| admin' : ''}**\nFarming for ${(Math.floor(player.uptime/60))} hr & ${('0' + (player.uptime % 60)).slice(-2)} min`)
2022-11-11 19:58:11 -05:00
})
embed.setDescription(`${FSdss.data.slots.used == 0 ? '*No players online*' : Players.join('\n\n')}`).setTitle(FSdss.data.server.name).setColor(client.config.embedColor)
embed.setAuthor({name: `${FSdss.data.slots.used}/${FSdss.data.slots.capacity}`});
msg.edit({content: 'This embed updates every minute.', embeds: [embed1, embed]})
2022-11-11 19:58:11 -05:00
}
}, 60000)
// YouTube Upload notification
setInterval(async()=>{
2022-11-22 16:47:48 -05:00
client.YTLoop('UCQ8k8yTDLITldfWYKDs3xFg', 'Daggerwin', '528967918772551702'); // 528967918772551702 = #videos-and-streams
client.YTLoop('UCguI73--UraJpso4NizXNzA', 'Machinery Restorer', '767444045520961567') // 767444045520961567 = #machinery-restorer
2022-11-11 19:58:11 -05:00
}, 300000)
// Event loop for punishments and daily msgs
setInterval(async()=>{
const now = Date.now();
2022-11-11 19:58:11 -05:00
const lrsStart = client.config.LRSstart;
2022-11-13 08:46:50 -05:00
client.punishments._content.filter((x:Punishment)=>x.endTime<= now && !x.expired).forEach(async (punishment:Punishment)=>{
2022-11-24 19:28:46 -05:00
console.log(`[${client.moment().format('DD/MM/YY HH:mm:ss')}]` + `${punishment.member}\'s ${punishment.type} should expire now`);
2022-11-13 08:46:50 -05:00
const unpunishResult = await client.punishments.removePunishment(punishment.id, client.user.id, 'Time\'s up!');
2022-11-24 19:28:46 -05:00
console.log(`[${client.moment().format('DD/MM/YY HH:mm:ss')}]` + unpunishResult);
2022-11-11 19:58:11 -05:00
});
2022-11-13 08:46:50 -05:00
2022-11-11 19:58:11 -05:00
const formattedDate = Math.floor((now - lrsStart)/1000/60/60/24);
2023-01-11 03:33:38 -05:00
const dailyMsgs = JSON.parse(fs.readFileSync(__dirname + '/database/dailyMsgs.json', {encoding: 'utf8'}))
if (!dailyMsgs.some((x:Array<number>)=>x[0] === formattedDate)){
2022-11-13 08:46:50 -05:00
let total = Object.values<UserLevels>(client.userLevels._content).reduce((a,b)=>a + b.messages, 0); // sum of all users
const yesterday = dailyMsgs.find((x:Array<number>)=>x[0] === formattedDate - 1);
2022-11-11 19:58:11 -05:00
if (total < yesterday){ // messages went down.
total = yesterday
}
dailyMsgs.push([formattedDate, total]);
fs.writeFileSync(__dirname + '/database/dailyMsgs.json', JSON.stringify(dailyMsgs))
console.log(`[${client.moment().format('DD/MM/YY HH:mm:ss')}]`, `Pushed [${formattedDate}, ${total}] to dailyMsgs`);
client.guilds.cache.get(client.config.mainServer.id).commands.fetch().then((commands)=>(client.channels.resolve(client.config.mainServer.channels.logs) as Discord.TextChannel).send(`:pencil: Pushed \`[${formattedDate}, ${total}]\` to </rank leaderboard:${commands.find(x=>x.name == 'rank').id}>`))
2022-11-11 19:58:11 -05:00
}
2022-11-22 16:29:02 -05:00
}, 5000)