const express = require("express"), sqlite3 = require("sqlite3"), bodyParser = require("body-parser"), mc = require("minecraft-server-util"), Discord = require("discord-webhook-node"), geoIP = require("geoip-lite"), fs = require("fs"), config = require("./config.json"), app = express(), db = new sqlite3.Database("./servers.db"), offline = new sqlite3.Database("./offline.db"); const createWebhook = url => new Discord.Webhook(url).setUsername("TaxenHeimer").setAvatar("https://cdn.discordapp.com/attachments/999167321631363126/999495738943868928/nn.png") const countrify = e => require("./countrycode.json")[e] const replaceMOTD = e => e.replace(/'/g, "\\'").replace(/-/g, '\\-') const makeEmbed = (mc, neit) => { var Embed = new Discord.MessageBuilder() .setTitle("TaxenHeimer") .setColor("#00ff00") .addField("**Host**", `\`${mc.Server}\``, true) .addField("**Country**", `\`${countrify(mc.ip.country)}\``) .addField("**Version**", `\`${mc.version.name}\``, true) .addField("**Players**", `\`${mc.players.online}/${mc.players.max}\``, true) .addField("**Ping**", `\`${mc.roundTripLatency}ms\``, true) .addField("**Motd**", "```\n" + mc.motd.clean + "\n```") .addField("**Playerlist Sample**", "```fix\n" + mc.PlayerList + "\n```") .addField("**IP Range**", "```\n" + geoIP.pretty(mc.ip.range[0]) + " - " + geoIP.pretty(mc.ip.range[1]) + "```") .setTimestamp() if (neit) Embed.setText("<@390491795655622657>") return Embed } var webhooks = [ createWebhook(config.main), createWebhook(config.fronce), createWebhook(config.neit) ] app.use(bodyParser.json()).use(bodyParser.urlencoded({ extended: true })) db.exec(`CREATE TABLE IF NOT EXISTS servers ( host text not null, version text not null, players text not null, playerlist text not null, ping text not null, motd text not null, timestamp text not null )`) offline.exec(`CREATE TABLE IF NOT EXISTS servers ( host text not null, timestamp text not null )`) app.post("/server", async (req, res) => { var Server = req.body.server if (!Server) return res.send("specify a server") res.send("allah") if (fs.readFileSync(`${__dirname}/ip.txt`).toString().includes(Server)) return var Minecraft = await mc.status(Server, 25565, { enableSRV: true }).catch(e => { offline.exec(`INSERT INTO servers VALUES ( '${Server}', '${new Date().toLocaleDateString("en-US")}' )`) }) fs.appendFileSync(`${__dirname}/ip.txt`, `${Server}\n`) Minecraft.ip = geoIP.lookup(Server) Minecraft.Server = `${Server}:25565` var cleanMOTD = replaceMOTD(Minecraft.motd.clean) Minecraft.PlayerList = "" Minecraft.players.sample ? Minecraft.players.sample.forEach(e => Minecraft.PlayerList += `${e.name} : ${e.id}\n`) : Minecraft.PlayerList = "No Players" db.exec(`INSERT INTO servers VALUES ( '${Minecraft.Server}', '${Minecraft.version.name}', '${Minecraft.players.online}/${Minecraft.players.max}', '${Minecraft.PlayerList.replace(/\n/g, "\\n")}', '${Minecraft.roundTripLatency}ms', '${cleanMOTD}', '${new Date().toLocaleDateString('en-US')}' )`) switch (Minecraft.ip.country) { default: break; case "FR": webhooks[1].send(makeEmbed(Minecraft)) break } switch(true) { case Minecraft.version.name === "1.17": webhooks[2].send(makeEmbed(Minecraft, "neit")) break; default: webhooks[0].send(makeEmbed(Minecraft)) break } }) app.listen(9000, () => { console.clear() console.log("server ready") }) app.use(express.static(`${__dirname}/css`)) app.get('/', async(req, res) => { db.all(`SELECT host, version FROM servers`, async(err, servers) => { var table = "" for (var srv of servers) { var proto = srv.version.split(" ") proto.length >= 2 ? software = proto[0] : software = "Vanilla" proto.length <= 1 ? version = proto[0] : version = proto[1] table += `${srv.host}${version}${software}` } let content = ` TaxenHeimer
${table}
HostVersionSoftware
` res.send(content) }) }) async function updatedb() { db.all(`SELECT host FROM servers`, async(err, serv) => { for (var servs of serv) { var srv = servs.host mc.status(srv.split(":")[0], parseInt(srv.split(":")[1]), { enableSRV: true }).then(minecraft => { var cleanMOTD = replaceMOTD(minecraft.motd.clean) minecraft.PlayerList = "" minecraft.players.sample ? minecraft.players.sample.forEach(e => minecraft.PlayerList += `${e.name} : ${e.id}\n`) : minecraft.PlayerList = "No Players" db.exec(`UPDATE servers SET version='${minecraft.version.name}', players='${minecraft.players.online}/${minecraft.players.max}', playerlist='${minecraft.PlayerList.replace(/\n/g, "\\n")}', ping='${minecraft.roundTripLatency}ms', motd='${cleanMOTD}', timestamp='Last updated ${new Date().toLocaleDateString('en-US')}' WHERE host='${srv}'`) }).catch(e => { db.exec(`DELETE FROM servers WHERE host='${srv}'`) offline.exec(`INSERT INTO servers VALUES ( '${srv}', '${new Date().toLocaleDateString("en-US")}' )`) }) } }) return "Update finished" } process.on("unhandledRejection", callback => console.log(callback.message)) process.on("uncaughtException", callback => console.log(callback.message))