feat: 在注册文件中添加 fetchself 处理程序,并实现系统信息获取功能

This commit is contained in:
lixiangwuxian 2025-03-29 14:50:54 +08:00
parent b4e0ae21cb
commit a45d1d64d2
2 changed files with 274 additions and 0 deletions

273
handler/fetchself/fetch.go Normal file
View File

@ -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
}

View File

@ -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"