botv12/commands/about.js
2024-11-19 20:10:10 -05:00

286 lines
7.9 KiB
JavaScript

import os from 'node:os'
import { execSync } from 'child_process'
import { getMessage, formatTime } from '../util/lang.js'
import memoryconvert from '../util/memoryconvert.js'
import { readdirSync, readFileSync } from 'node:fs'
import botVersion from '../util/version.js'
import version from '../version.js'
import { bots } from '../index.js'
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({
text: getMessage(c.lang, 'command.about.license'),
color: c.colors.secondary
})
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')
}
}
}
]
})
c.reply({ text: '' })
c.reply({
text: getMessage(c.lang, 'command.about.subcommands'),
color: c.colors.secondary
})
}
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 item of osrelease) {
if (!item.includes('=')) continue
let osrvalue = item.split('=')[1]
if (osrvalue.startsWith('"') && osrvalue.endsWith('"')) { osrvalue = osrvalue.slice(1, osrvalue.length - 1) };
osrelease2[item.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,
clickEvent: {
action: 'copy_to_clipboard',
value: thisItem
},
hoverEvent: {
action: 'show_text',
contents: {
text: getMessage(c.lang, 'copyText'),
color: c.colors.secondary
},
value: { // Added twice for backwards compatibility
text: getMessage(c.lang, 'copyText'),
color: c.colors.secondary
}
}
}
]
})
}
// 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()
})
}
// System memory (total)
displayInfo('command.about.serverInfo.totalMem', () => {
return memoryconvert(os.totalmem())
})
// System memory (free)
displayInfo('command.about.serverInfo.freeMem', () => {
return memoryconvert(os.freemem())
})
// System memory (used)
displayInfo('command.about.serverInfo.usedMem', () => {
return memoryconvert(os.totalmem() - os.freemem())
})
// 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) {
bots.forEach((item, i) => {
if (c.bot.id === i && c.bot.host.options.hideLocally) return
if (item.host.options && item.host.options.hidden && c.verify !== 2 && c.bot.id !== i) return
let message = 'command.about.serverListItem'
if (c.bot.id === i) message = 'command.about.serverListItem.thisServer'
let host = item.host.host
const port = item.host.port
if (item.host.options && item.host.options.displayAsIPv6) {
host = `[${host}]`
}
c.reply({
translate: getMessage(c.lang, message),
color: c.colors.secondary,
with: [
{
text: i.toString(),
color: c.colors.primary
},
{
text: `${host}:${port}`,
color: c.colors.primary,
clickEvent: {
action: 'copy_to_clipboard',
value: `${host}:${port}`
},
hoverEvent: {
action: 'show_text',
contents: {
text: getMessage(c.lang, 'copyText'),
color: c.colors.secondary
},
value: { // Added twice for backwards compatibility
text: getMessage(c.lang, 'copyText'),
color: c.colors.secondary
}
}
}
]
})
})
}
const execute = function (c) {
let subcmd
if (c.args.length >= 1) subcmd = c.args[0].toLowerCase()
if (subcmd === 'servers') subcmd = 'serverlist'
if (c.cmdName.toLowerCase() === 'serverinfo' || c.cmdName.toLowerCase() === 'specs') subcmd = 'server'
if (c.cmdName.toLowerCase() === 'serverlist' || c.cmdName.toLowerCase() === 'servers') subcmd = 'serverlist'
if (subcmd === 'server') {
aboutServer(c)
} else if (subcmd === 'serverlist') {
displayServerList(c)
} else {
aboutBot(c)
}
}
const aliases = ['info', 'serverlist', 'servers', 'serverinfo', 'specs']
export { execute, aliases }