botvX_mjs/commands/about.mjs

219 lines
5.6 KiB
JavaScript

import * as os from "os"
import { execSync } from "child_process"
import { getMessage, formatTime } from '../util/lang.mjs'
import { readdirSync, readFileSync } from "fs"
import { default as botVersion } from "../util/version.js"
import { default as version } from "../version.json" with { type: "json" }
import { bots } from "../index.mjs"
const aboutBot = function (c) {
c.reply({
translate: getMessage(c.lang, 'command.about.author'),
color: c.colors.secondary,
with: [
{
text: version.botName,
color: c.colors.primary
},
{
text: version.botAuthor,
color: c.colors.primary
}
]
})
if (version.isPreRelease) {
c.reply({
text: getMessage(c.lang, 'command.about.preRelease'),
color: c.colors.secondary
})
}
c.reply({ text: '' })
c.reply({
translate: getMessage(c.lang, 'command.about.sourceCode'),
color: c.colors.secondary,
with: [
{
text: version.sourceURL,
color: c.colors.primary,
clickEvent: {
action: 'open_url',
value: version.sourceURL
},
hoverEvent: {
action: 'show_text',
contents: {
text: getMessage(c.lang, 'command.about.sourceCode.openInBrowser')
},
value: { // Added twice for backwards compatibility
text: getMessage(c.lang, 'command.about.sourceCode.openInBrowser')
}
}
}
]
})
}
const os2 = function (o2, l) {
switch (o2) {
case 'win32':
return `${os.version()}`
case 'android':{
try {
const version = execSync('getprop ro.build.version.release').toString('UTF-8').split('\n')[0]
return getMessage(l, 'command.about.serverInfo.os.android', [version])
} catch (e) {
return getMessage(l, 'command.about.serverInfo.os.android.noVersion')
}
}
case 'linux':
case 'freebsd':{
if (readdirSync('/etc').includes('os-release')) {
const osrelease = readFileSync('/etc/os-release').toString('UTF-8').split('\n')
const osrelease2 = {}
for (const i in osrelease) {
if (!osrelease[i].includes('=')) continue
let osrvalue = osrelease[i].split('=')[1]
if (osrvalue.startsWith('"') && osrvalue.endsWith('"')) { osrvalue = osrvalue.slice(1, osrvalue.length - 1) };
osrelease2[osrelease[i].split('=')[0]] = osrvalue
}
if (osrelease2.PRETTY_NAME) {
return getMessage(l, '%s', [osrelease2.PRETTY_NAME])
} else {
return getMessage(l, `command.about.serverInfo.os.${o2}`)
}
} else {
return getMessage(l, `command.about.serverInfo.os.${o2}`)
}
}
default:
return o2
}
}
const aboutServer = function (c) {
const displayInfo = function (name, infoFunc) {
let thisItem
try {
thisItem = infoFunc()
} catch (e) {
console.error(e)
thisItem = 'Error! (check console)'
}
c.reply({
translate: '%s: %s',
color: c.colors.primary,
with: [
{
text: getMessage(c.lang, name),
color: c.colors.secondary
},
{
text: thisItem,
color: c.colors.primary
}
]
})
}
// Operating system
displayInfo('command.about.serverInfo.os', () => {
return os2(process.platform, c.lang)
})
// Kernel version: os.release()
displayInfo('command.about.serverInfo.kernelVer', () => {
return os.release()
})
// Processor
if (os.cpus()[0]) {
displayInfo('command.about.serverInfo.processor', () => {
return os.cpus()[0].model
})
}
if (os.cpus()[0]) {
// Processor architecture
displayInfo('command.about.serverInfo.arch', () => {
return os.machine()
})
}
// Username and UID
displayInfo('command.about.serverInfo.osUsername', () => {
return `${os.userInfo().username} (${os.userInfo().uid})`
})
// Hostname
displayInfo('command.about.serverInfo.hostName', () => {
return os.hostname()
})
// Current working directory
displayInfo('command.about.serverInfo.workingDir', () => {
return process.cwd()
})
// Node.js® version
displayInfo('command.about.serverInfo.nodeVersion', () => {
return process.version
})
// Bot uptime
displayInfo('command.about.serverInfo.runTime', () => {
return formatTime(process.uptime() * 1000, c.lang)
})
// System uptime
displayInfo('command.about.serverInfo.upTime', () => {
return formatTime(os.uptime() * 1000, c.lang)
})
if (process.platform === 'android') {
// Device model
displayInfo('command.about.serverInfo.os.android.model', () => {
const brand = execSync('getprop ro.product.brand').toString('UTF-8').split('\n')[0]
const model = execSync('getprop ro.product.model').toString('UTF-8').split('\n')[0]
return `${brand} ${model}`
})
}
// Bot version
displayInfo('command.about.serverInfo.botVer', () => {
return botVersion
})
}
const displayServerList = function (c) {
for (const i in bots) {
if (bots[i].host.options && bots[i].host.options.hidden) continue
c.reply({
translate: getMessage(c.lang, 'command.about.serverListItem'),
color: c.colors.secondary,
with: [
{
text: i.toString(),
color: c.colors.primary
},
{
text: `${bots[i].host.host}:${bots[i].host.port}`,
color: c.colors.primary
}
]
})
}
}
export default {
execute: function (c) {
if (c.args[0] === 'server') {
aboutServer(c)
} else if (c.args[0] === 'serverlist') {
displayServerList(c)
} else {
aboutBot(c)
}
},
aliases: ['info']
}