mirror of
https://github.com/GopeedLab/gopeed.git
synced 2026-11-04 23:57:54 +00:00
124 lines
2.6 KiB
Go
124 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/pkg/browser"
|
|
"github.com/shirou/gopsutil/v4/process"
|
|
)
|
|
|
|
const identifier = "gopeed"
|
|
|
|
type Message struct {
|
|
Method string `json:"method"`
|
|
Params json.RawMessage `json:"params"`
|
|
}
|
|
|
|
type Response struct {
|
|
Code int `json:"code"`
|
|
Data any `json:"data,omitempty"`
|
|
Message string `json:"message,omitempty"`
|
|
}
|
|
|
|
var apiMap = map[string]func(params json.RawMessage) (data any, err error){
|
|
"ping": func(params json.RawMessage) (data any, err error) {
|
|
processes, err := process.Processes()
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
for _, p := range processes {
|
|
name, err := p.Name()
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
if strings.Contains(strings.ToLower(name), strings.ToLower(identifier)) {
|
|
return true, nil
|
|
}
|
|
}
|
|
return false, nil
|
|
},
|
|
"create": func(params json.RawMessage) (data any, err error) {
|
|
var strParams string
|
|
if err = json.Unmarshal(params, &strParams); err != nil {
|
|
return
|
|
}
|
|
err = browser.OpenURL(fmt.Sprintf("%s:///create?params=%s", identifier, strParams))
|
|
return
|
|
},
|
|
}
|
|
|
|
func main() {
|
|
for {
|
|
// Read message length (first 4 bytes)
|
|
var length uint32
|
|
if err := binary.Read(os.Stdin, binary.NativeEndian, &length); err != nil {
|
|
if err == io.EOF {
|
|
// Connection closed by Chrome
|
|
return
|
|
}
|
|
sendError("Failed to read message length: " + err.Error())
|
|
return
|
|
}
|
|
|
|
// Read the message
|
|
input := make([]byte, length)
|
|
if _, err := io.ReadFull(os.Stdin, input); err != nil {
|
|
sendError("Failed to read message: " + err.Error())
|
|
return
|
|
}
|
|
|
|
// Parse message
|
|
var message Message
|
|
if err := json.Unmarshal(input, &message); err != nil {
|
|
sendError("Failed to parse message: " + err.Error())
|
|
return
|
|
}
|
|
|
|
// Handle request
|
|
var data any
|
|
var err error
|
|
if handler, ok := apiMap[message.Method]; ok {
|
|
data, err = handler(message.Params)
|
|
} else {
|
|
err = errors.New("Unknown method: " + message.Method)
|
|
}
|
|
if err != nil {
|
|
sendError(err.Error())
|
|
continue
|
|
}
|
|
sendResponse(0, data, "")
|
|
}
|
|
}
|
|
|
|
func sendResponse(code int, data interface{}, message string) {
|
|
response := Response{
|
|
Code: code,
|
|
Data: data,
|
|
Message: message,
|
|
}
|
|
|
|
// Encode response
|
|
responseBytes, err := json.Marshal(response)
|
|
if err != nil {
|
|
sendError("Failed to encode response: " + err.Error())
|
|
return
|
|
}
|
|
|
|
// Write message length
|
|
binary.Write(os.Stdout, binary.NativeEndian, uint32(len(responseBytes)))
|
|
// Write message
|
|
os.Stdout.Write(responseBytes)
|
|
}
|
|
|
|
func sendError(msg string) {
|
|
sendResponse(1, nil, msg)
|
|
}
|