276 lines
9.4 KiB
Go
276 lines
9.4 KiB
Go
package fetchself
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os/exec"
|
|
"strings"
|
|
|
|
"git.lxtend.com/qqbot/constants"
|
|
"git.lxtend.com/qqbot/handler"
|
|
"git.lxtend.com/qqbot/model"
|
|
)
|
|
|
|
func init() {
|
|
handler.RegisterHelpInform("!fetch", "获取系统信息", "!fetch")
|
|
handler.RegisterHandler("!fetch", fetchSelf, constants.LEVEL_USER)
|
|
}
|
|
|
|
var fetchCmd = []string{"fastfetch", "neofetch"}
|
|
|
|
type SystemInfo struct {
|
|
OS string
|
|
Host string
|
|
Kernel string
|
|
Uptime string
|
|
CPU string
|
|
Memory string
|
|
Disk string
|
|
GPU string
|
|
Resolution string
|
|
Packages string
|
|
Shell string
|
|
DE string
|
|
Network string
|
|
Bluetooth string
|
|
BIOS string
|
|
}
|
|
|
|
func (i *SystemInfo) String() string {
|
|
var builder strings.Builder
|
|
if i.OS != "" {
|
|
builder.WriteString(fmt.Sprintf("OS: %s\n", i.OS))
|
|
}
|
|
if i.Host != "" {
|
|
builder.WriteString(fmt.Sprintf("Host: %s\n", i.Host))
|
|
}
|
|
if i.Kernel != "" {
|
|
builder.WriteString(fmt.Sprintf("Kernel: %s\n", i.Kernel))
|
|
}
|
|
if i.Uptime != "" {
|
|
builder.WriteString(fmt.Sprintf("Uptime: %s\n", i.Uptime))
|
|
}
|
|
if i.Packages != "" {
|
|
builder.WriteString(fmt.Sprintf("Packages: %s\n", i.Packages))
|
|
}
|
|
if i.Shell != "" {
|
|
builder.WriteString(fmt.Sprintf("Shell: %s\n", i.Shell))
|
|
}
|
|
if i.Resolution != "" {
|
|
builder.WriteString(fmt.Sprintf("Resolution: %s\n", i.Resolution))
|
|
}
|
|
if i.CPU != "" {
|
|
builder.WriteString(fmt.Sprintf("CPU: %s\n", i.CPU))
|
|
}
|
|
if i.GPU != "" {
|
|
builder.WriteString(fmt.Sprintf("GPU: %s\n", i.GPU))
|
|
}
|
|
if i.Memory != "" {
|
|
builder.WriteString(fmt.Sprintf("Memory: %s\n", i.Memory))
|
|
}
|
|
if i.Disk != "" {
|
|
builder.WriteString(fmt.Sprintf("Disk: %s\n", i.Disk))
|
|
}
|
|
if i.Network != "" {
|
|
builder.WriteString(fmt.Sprintf("Network: %s\n", i.Network))
|
|
}
|
|
if i.Bluetooth != "" {
|
|
builder.WriteString(fmt.Sprintf("Bluetooth: %s\n", i.Bluetooth))
|
|
}
|
|
if i.BIOS != "" {
|
|
builder.WriteString(fmt.Sprintf("BIOS: %s\n", i.BIOS))
|
|
}
|
|
if i.DE != "" {
|
|
builder.WriteString(fmt.Sprintf("DE: %s\n", i.DE))
|
|
}
|
|
return builder.String()
|
|
}
|
|
|
|
func fetchSelf(msg model.Message) (reply model.Reply) {
|
|
//检测是否存在fetchCmd中的命令
|
|
for _, cmd := range fetchCmd {
|
|
if _, err := exec.LookPath(cmd); err == nil {
|
|
info, err := parseSystemInfo(cmd)
|
|
if err != nil {
|
|
log.Println("parseSystemInfo failed", err)
|
|
return
|
|
}
|
|
reply.FromMsg = msg
|
|
reply.ReplyMsg = info.String()
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func parseSystemInfo(cmd string) (SystemInfo, error) {
|
|
switch cmd {
|
|
case "fastfetch":
|
|
fetcher := &fastdfetchParser{}
|
|
return fetcher.Parse(cmd)
|
|
case "neofetch":
|
|
fetcher := &neofetchParser{}
|
|
return fetcher.Parse(cmd)
|
|
}
|
|
return SystemInfo{}, fmt.Errorf("unsupported command: %s", cmd)
|
|
}
|
|
|
|
type Parser interface {
|
|
Parse(cmd string) (SystemInfo, error)
|
|
}
|
|
|
|
// root@localhost ~/qq_bot (main)# fastfetch
|
|
// ,...,
|
|
// .,:lloooooc;.
|
|
// ,ool' oo,;oo: root@localhost
|
|
// .lo' oo. oo: --------------
|
|
// .oo. oo. oo: OS: openSUSE Tumbleweed x86_64
|
|
// :ol oo. 'oo Host: FARQ01018Z
|
|
// :oo .oo. .oo. Kernel: Linux 6.13.7-1-default
|
|
// .oooooooooooooo. .oo. Uptime: 18 hours, 50 mins
|
|
// ;oo. .oo. Packages: 2454 (rpm)
|
|
// 'oo, .oo. Shell: fish 3.7.1
|
|
// "ooc,',,,,,,,,,,:ooc,,,,,,,,,,, Display (LGD041C): 1920x1080 @ 60 Hz in 13" [Built-in]
|
|
// ':cooooooooooooooooooooooooool;. Theme: Adwaita [GTK2/3]
|
|
// .oo. .oo; Icons: Adwaita [GTK2/3]
|
|
// .oo. .oo. Cursor: Adwaita
|
|
// .oo. 'oooooooooo:ooo. Terminal: node
|
|
// .oo. 'oo. col CPU: Intel(R) Core(TM) i5-4300U (4) @ 2.90 GHz
|
|
// .oo' 'oo col GPU: Intel Haswell-ULT Integrated Graphics Controller @ 1.10 GHz [Integrated]
|
|
// coo 'oo oo' Memory: 1.85 GiB / 3.71 GiB (50%)
|
|
// coc 'oo .lo, Swap: 38.00 MiB / 5.68 GiB (1%)
|
|
// `oo, 'oo .:oo Disk (/): 28.53 GiB / 112.56 GiB (25%) - btrfs
|
|
// 'ooooc,, ,:lol Local IP (wlp3s0): 192.168.1.135/24
|
|
// `''"clc"' Battery (CP642113-03): 100% [AC Connected]
|
|
// Locale: zh_CN.UTF-8
|
|
|
|
type fastdfetchParser struct{}
|
|
|
|
func (p *fastdfetchParser) Parse(cmd string) (SystemInfo, error) {
|
|
fullCmd := fmt.Sprintf("%s --color_blocks off", cmd)
|
|
output, err := exec.Command(fullCmd).Output()
|
|
if err != nil {
|
|
return SystemInfo{}, err
|
|
}
|
|
lines := strings.Split(string(output), "\n")
|
|
info := SystemInfo{}
|
|
for _, line := range lines {
|
|
if strings.Contains(line, "OS:") {
|
|
info.OS = strings.TrimSpace(strings.Split(line, "OS:")[1])
|
|
}
|
|
if strings.Contains(line, "Host:") {
|
|
info.Host = strings.TrimSpace(strings.Split(line, "Host:")[1])
|
|
}
|
|
if strings.Contains(line, "Kernel:") {
|
|
info.Kernel = strings.TrimSpace(strings.Split(line, "Kernel:")[1])
|
|
}
|
|
if strings.Contains(line, "Uptime:") {
|
|
info.Uptime = strings.TrimSpace(strings.Split(line, "Uptime:")[1])
|
|
}
|
|
if strings.Contains(line, "Packages:") {
|
|
info.Packages = strings.TrimSpace(strings.Split(line, "Packages:")[1])
|
|
}
|
|
if strings.Contains(line, "Shell:") {
|
|
info.Shell = strings.TrimSpace(strings.Split(line, "Shell:")[1])
|
|
}
|
|
if strings.Contains(line, "Display (LGD041C):") {
|
|
info.Resolution = strings.TrimSpace(strings.Split(line, "Display (LGD041C):")[1])
|
|
}
|
|
if strings.Contains(line, "CPU:") {
|
|
info.CPU = strings.TrimSpace(strings.Split(line, "CPU:")[1])
|
|
}
|
|
if strings.Contains(line, "GPU:") {
|
|
info.GPU = strings.TrimSpace(strings.Split(line, "GPU:")[1])
|
|
}
|
|
if strings.Contains(line, "Memory:") {
|
|
info.Memory = strings.TrimSpace(strings.Split(line, "Memory:")[1])
|
|
}
|
|
if strings.Contains(line, "Disk (/):") {
|
|
info.Disk = strings.TrimSpace(strings.Split(line, "Disk (/):")[1])
|
|
}
|
|
if strings.Contains(line, "Local IP") {
|
|
info.Network = strings.TrimSpace(strings.Split(line, "Local IP")[1])
|
|
}
|
|
}
|
|
return info, nil
|
|
}
|
|
|
|
//neofetch
|
|
// root@localhost ~/qq_bot (main)# neofetch
|
|
// JJJJJJJJ
|
|
// JJJJJJJJJJJJJJ
|
|
// JJJJJJ =JJJJJJJ
|
|
// JJJJ =JJJ JJJJ root@localhost
|
|
// JJJ =JJJ JJJ --------------
|
|
// JJJJ =JJJ JJJ OS: openSUSE Tumbleweed x86_64
|
|
// JJJJJJJJJJJJJJJ JJJJ Host: FARQ01018Z
|
|
// JJJJJJJJJJJJJJ JJJJ Kernel: 6.13.7-1-default
|
|
// JJJJ JJJJ Uptime: 18 hours, 44 mins
|
|
// JJJJJ= JJJJ Packages: 56 (pip), 2449 (rpm)
|
|
// JJJJJJJJJJJJJJJJJJJJJJJJJJJJJ= Shell: fish 3.7.1
|
|
// =JJJJJJJJJJJJJJJJJJJJJJJJJJJJJ Resolution: 1920x1080
|
|
// JJJJ =JJJJJJ Terminal: node
|
|
// JJJJ =JJJJ CPU: Intel i5-4300U (4) @ 2.9GHz
|
|
// JJJJ JJJJJJJJJJJJJJ GPU: Intel Haswell-ULT
|
|
// JJJJ JJJJJJJJJJJJJJJ Memory: 1.92 GiB / 3.70 GiB (51%)
|
|
// JJJJ JJJJ JJJJ Network: Wifi
|
|
// JJJ JJJJ JJJ Bluetooth: Intel Corp. Bluetooth wireless interface
|
|
// JJJJJ JJJJ JJJJ BIOS: FUJITSU // Phoenix Technologies Ltd. 1.20 (07/03/2014)
|
|
// =JJJJJJJJ JJJJJJ
|
|
// JJJJJJJJJJJJJJ
|
|
// JJJJJJJ=
|
|
|
|
type neofetchParser struct{}
|
|
|
|
func (p *neofetchParser) Parse(cmd string) (SystemInfo, error) {
|
|
fullCmd := fmt.Sprintf("%s --color_blocks off", cmd)
|
|
output, err := exec.Command(fullCmd).Output()
|
|
if err != nil {
|
|
return SystemInfo{}, err
|
|
}
|
|
lines := strings.Split(string(output), "\n")
|
|
info := SystemInfo{}
|
|
for _, line := range lines {
|
|
if strings.Contains(line, "OS:") {
|
|
info.OS = strings.TrimSpace(strings.Split(line, "OS:")[1])
|
|
}
|
|
if strings.Contains(line, "Host:") {
|
|
info.Host = strings.TrimSpace(strings.Split(line, "Host:")[1])
|
|
}
|
|
if strings.Contains(line, "Kernel:") {
|
|
info.Kernel = strings.TrimSpace(strings.Split(line, "Kernel:")[1])
|
|
}
|
|
if strings.Contains(line, "Uptime:") {
|
|
info.Uptime = strings.TrimSpace(strings.Split(line, "Uptime:")[1])
|
|
}
|
|
if strings.Contains(line, "Packages:") {
|
|
info.Packages = strings.TrimSpace(strings.Split(line, "Packages:")[1])
|
|
}
|
|
if strings.Contains(line, "Shell:") {
|
|
info.Shell = strings.TrimSpace(strings.Split(line, "Shell:")[1])
|
|
}
|
|
if strings.Contains(line, "Resolution:") {
|
|
info.Resolution = strings.TrimSpace(strings.Split(line, "Resolution:")[1])
|
|
}
|
|
if strings.Contains(line, "CPU:") {
|
|
info.CPU = strings.TrimSpace(strings.Split(line, "CPU:")[1])
|
|
}
|
|
if strings.Contains(line, "GPU:") {
|
|
info.GPU = strings.TrimSpace(strings.Split(line, "GPU:")[1])
|
|
}
|
|
if strings.Contains(line, "Memory:") {
|
|
info.Memory = strings.TrimSpace(strings.Split(line, "Memory:")[1])
|
|
}
|
|
if strings.Contains(line, "Network:") {
|
|
info.Network = strings.TrimSpace(strings.Split(line, "Network:")[1])
|
|
}
|
|
if strings.Contains(line, "Bluetooth:") {
|
|
info.Bluetooth = strings.TrimSpace(strings.Split(line, "Bluetooth:")[1])
|
|
}
|
|
if strings.Contains(line, "BIOS:") {
|
|
info.BIOS = strings.TrimSpace(strings.Split(line, "BIOS:")[1])
|
|
}
|
|
}
|
|
return info, nil
|
|
}
|