From a45d1d64d215f411673cec303c013e69c0cf4823 Mon Sep 17 00:00:00 2001 From: lixiangwuxian Date: Sat, 29 Mar 2025 14:50:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9C=A8=E6=B3=A8=E5=86=8C=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B8=AD=E6=B7=BB=E5=8A=A0=20fetchself=20=E5=A4=84?= =?UTF-8?q?=E7=90=86=E7=A8=8B=E5=BA=8F=EF=BC=8C=E5=B9=B6=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E4=BF=A1=E6=81=AF=E8=8E=B7=E5=8F=96=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handler/fetchself/fetch.go | 273 +++++++++++++++++++++++++++++++++++++ register.go | 1 + 2 files changed, 274 insertions(+) create mode 100644 handler/fetchself/fetch.go diff --git a/handler/fetchself/fetch.go b/handler/fetchself/fetch.go new file mode 100644 index 0000000..2a3ca81 --- /dev/null +++ b/handler/fetchself/fetch.go @@ -0,0 +1,273 @@ +package fetchself + +import ( + "fmt" + "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", "screenfetch", "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 { + 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 +} diff --git a/register.go b/register.go index 72c272d..2901d55 100644 --- a/register.go +++ b/register.go @@ -7,6 +7,7 @@ import ( _ "git.lxtend.com/qqbot/handler/drawback" _ "git.lxtend.com/qqbot/handler/echo" _ "git.lxtend.com/qqbot/handler/exec" + _ "git.lxtend.com/qqbot/handler/fetchself" _ "git.lxtend.com/qqbot/handler/getweb" _ "git.lxtend.com/qqbot/handler/headmaster" _ "git.lxtend.com/qqbot/handler/help"