| 10 | usage: '.sysinfo', |
| 11 | ownerOnly: true, |
| 12 | async handler(sock, message, args, context) { |
| 13 | const { chatId, channelInfo } = context; |
| 14 | try { |
| 15 | // Memory via os module (works everywhere, no free command needed) |
| 16 | const totalMem = os.totalmem(); |
| 17 | const freeMem = os.freemem(); |
| 18 | const usedMem = totalMem - freeMem; |
| 19 | const toMB = (b) => (b / 1024 / 1024).toFixed(0); |
| 20 | const toGB = (b) => (b / 1024 / 1024 / 1024).toFixed(2); |
| 21 | const memTotal = totalMem > 1073741824 ? `${toGB(totalMem) } GB` : `${toMB(totalMem) } MB`; |
| 22 | const memUsed = usedMem > 1073741824 ? `${toGB(usedMem) } GB` : `${toMB(usedMem) } MB`; |
| 23 | const memFree = freeMem > 1073741824 ? `${toGB(freeMem) } GB` : `${toMB(freeMem) } MB`; |
| 24 | // Disk via df (fallback to N/A if not available) |
| 25 | let diskTotal = 'N/A', diskUsed = 'N/A', diskFree = 'N/A', diskPct = 'N/A'; |
| 26 | try { |
| 27 | const diskOut = (await execAsync('df -h /')).stdout.trim(); |
| 28 | const diskVals = diskOut.split('\n')[1]?.split(/\s+/) || []; |
| 29 | diskTotal = diskVals[1] || 'N/A'; |
| 30 | diskUsed = diskVals[2] || 'N/A'; |
| 31 | diskFree = diskVals[3] || 'N/A'; |
| 32 | diskPct = diskVals[4] || 'N/A'; |
| 33 | } |
| 34 | catch { } |
| 35 | // Bot uptime (process uptime, not system uptime) |
| 36 | const uptimeSec = Math.floor(process.uptime()); |
| 37 | const uptimeDays = Math.floor(uptimeSec / 86400); |
| 38 | const uptimeHrs = Math.floor((uptimeSec % 86400) / 3600); |
| 39 | const uptimeMins = Math.floor((uptimeSec % 3600) / 60); |
| 40 | const uptimeSecs = uptimeSec % 60; |
| 41 | const uptimeOut = uptimeDays > 0 |
| 42 | ? `${uptimeDays}d ${uptimeHrs}h ${uptimeMins}m` |
| 43 | : uptimeHrs > 0 |
| 44 | ? `${uptimeHrs}h ${uptimeMins}m ${uptimeSecs}s` |
| 45 | : `${uptimeMins}m ${uptimeSecs}s`; |
| 46 | // CPU |
| 47 | const cpus = os.cpus(); |
| 48 | const cpuModel = cpus[0]?.model?.trim() || 'Unknown'; |
| 49 | const cpuCores = cpus.length; |
| 50 | const loadAvg = os.loadavg().map(l => l.toFixed(2)).join(', '); |
| 51 | // Platform |
| 52 | const platform = os.platform(); |
| 53 | const arch = os.arch(); |
| 54 | const nodeVer = process.version; |
| 55 | const hostname = os.hostname(); |
| 56 | const text = `╔══════════════════════════════╗ |
| 57 | ║ 🖥️ *SERVER STATS* ║ |
| 58 | ╚══════════════════════════════╝ |
| 59 | |
| 60 | 🏠 *Host:* ${hostname} |
| 61 | 🐧 *OS:* ${platform} (${arch}) |
| 62 | ⏱️ *Uptime:* ${uptimeOut} |
| 63 | 🟢 *Node.js:* ${nodeVer} |
| 64 | |
| 65 | ━━━━━━ 🧠 CPU ━━━━━━ |
| 66 | 🔧 *Model:* ${cpuModel} |
| 67 | ⚙️ *Cores:* ${cpuCores} |
| 68 | 📊 *Load Avg:* ${loadAvg} |
| 69 | |