From 33a3da05f700e60ecb0091868d8b5bd118fe1342 Mon Sep 17 00:00:00 2001 From: Sheyiyuan <2125107118@qq.com> Date: Tue, 3 Dec 2024 09:21:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=89=80=E6=9C=89ws=E6=97=A0?= =?UTF-8?q?=E5=93=8D=E5=BA=94api=EF=BC=8C=E4=BC=98=E5=8C=96=E4=BA=86?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + LOG/log.go | 31 +++++ go.mod | 9 +- go.sum | 16 --- protocol/api.go | 275 +++++++++++++++++++++++++++++++++++-- protocol/events_handler.go | 47 ++----- protocol/web_socket.go | 55 ++++++-- typed/typed.go | 1 + utils.go | 63 ++++----- 9 files changed, 379 insertions(+), 119 deletions(-) create mode 100644 LOG/log.go diff --git a/.gitignore b/.gitignore index 9ccddf4..491bbc5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ /scripts /ProjectWIND /data +**/.DS_Store \ No newline at end of file diff --git a/LOG/log.go b/LOG/log.go new file mode 100644 index 0000000..9cbf822 --- /dev/null +++ b/LOG/log.go @@ -0,0 +1,31 @@ +package LOG + +import ( + "fmt" + "log" +) + +func DEBUG(text string, msg ...interface{}) { + msgText := fmt.Sprintf(text, msg...) + log.Println("[DEBUG] ", msgText) +} + +func INFO(text string, msg ...interface{}) { + msgText := fmt.Sprintf(text, msg...) + log.Println("[INFO] ", msgText) +} + +func WARN(text string, msg ...interface{}) { + msgText := fmt.Sprintf(text, msg...) + log.Println("[WARN] ", msgText) +} + +func ERROR(text string, msg ...interface{}) { + msgText := fmt.Sprintf(text, msg...) + log.Println("[ERROR] ", msgText) +} + +func FATAL(text string, msg ...interface{}) { + msgText := fmt.Sprintf(text, msg...) + log.Fatalln("[FATAL] ", msgText) +} diff --git a/go.mod b/go.mod index 5de8153..186d39d 100644 --- a/go.mod +++ b/go.mod @@ -2,11 +2,4 @@ module ProjectWIND go 1.23.2 -require ( - github.com/dlclark/regexp2 v1.11.4 // indirect - github.com/dop251/goja v0.0.0-20241024094426-79f3a7efcdbd // indirect - github.com/go-sourcemap/sourcemap v2.1.4+incompatible // indirect - github.com/google/pprof v0.0.0-20241122213907-cbe949e5a41b // indirect - github.com/gorilla/websocket v1.5.3 // indirect - golang.org/x/text v0.20.0 // indirect -) +require github.com/gorilla/websocket v1.5.3 diff --git a/go.sum b/go.sum index bfcbb11..25a9fc4 100644 --- a/go.sum +++ b/go.sum @@ -1,18 +1,2 @@ -github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo= -github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dop251/goja v0.0.0-20241024094426-79f3a7efcdbd h1:QMSNEh9uQkDjyPwu/J541GgSH+4hw+0skJDIj9HJ3mE= -github.com/dop251/goja v0.0.0-20241024094426-79f3a7efcdbd/go.mod h1:MxLav0peU43GgvwVgNbLAj1s/bSGboKkhuULvq/7hx4= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sourcemap/sourcemap v2.1.4+incompatible h1:a+iTbH5auLKxaNwQFg0B+TCYl6lbukKPc7b5x0n1s6Q= -github.com/go-sourcemap/sourcemap v2.1.4+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/google/pprof v0.0.0-20230207041349-798e818bf904 h1:4/hN5RUoecvl+RmJRE2YxKWtnnQls6rQjjW5oV7qg2U= -github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= -github.com/google/pprof v0.0.0-20241122213907-cbe949e5a41b h1:SXO0REt4iu865upYCk8aKBBJQ4BqoE0ReP23ClMu60s= -github.com/google/pprof v0.0.0-20241122213907-cbe949e5a41b/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= -golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= diff --git a/protocol/api.go b/protocol/api.go index 2d49f86..d6c70e6 100644 --- a/protocol/api.go +++ b/protocol/api.go @@ -6,34 +6,281 @@ import ( "errors" ) -func init() { +/* +关于API的说明: -} +1.所有API请求按照OneBot11标准,使用JSON格式进行数据交换。api命名为由原文档中蛇形命名法改为双驼峰命名法。 -func SendMessage(messageType string, message string, targetId int64, autoEscape bool) (bool, error) { +2.无响应的API请求使用ws协议处理,有响应的API请求使用http协议处理。 + +3.wind会从配置文件中读取API请求的url,请确保正确填写。 +*/ + +//1.无响应API,使用ws协议处理 + +func SendMsg(msg typed.MessageEventInfo, message string, autoEscape bool) error { // 构建发送消息的JSON数据 var messageData typed.APIRequestInfo + + messageType := msg.MessageType + messageData.Action = "send_msg" switch messageType { case "private": - messageData.Params.UserId = targetId - break + { + messageData.Params.UserId = msg.UserId + break + } case "group": - messageData.Params.GroupId = targetId - break + { + messageData.Params.GroupId = msg.GroupId + break + } default: - return false, errors.New("invalid type") + { + return errors.New("invalid type") + } } messageData.Params.Message = message messageData.Params.AutoEscape = autoEscape messageJson, err := json.Marshal(messageData) if err != nil { - return false, err + return err } // 发送消息 - err = wsSendMessage(messageJson) - if err != nil { - return false, err - } - return true, nil + err = wsAPI(messageJson) + return err +} + +func SendPrivateMsg(msg typed.MessageEventInfo, message string, autoEscape bool) error { + // 构建发送消息的JSON数据 + var messageData typed.APIRequestInfo + messageData.Action = "send_private_msg" + messageData.Params.UserId = msg.UserId + messageData.Params.Message = message + messageData.Params.AutoEscape = autoEscape + messageJson, err := json.Marshal(messageData) + if err != nil { + return err + } + // 发送消息 + err = wsAPI(messageJson) + return err +} + +func SendGroupMsg(msg typed.MessageEventInfo, message string, autoEscape bool) error { + // 构建发送消息的JSON数据 + var messageData typed.APIRequestInfo + messageData.Action = "send_group_msg" + messageData.Params.GroupId = msg.GroupId + messageData.Params.Message = message + messageData.Params.AutoEscape = autoEscape + messageJson, err := json.Marshal(messageData) + if err != nil { + return err + } + // 发送消息 + err = wsAPI(messageJson) + return err +} + +func DeleteMsg(msg typed.MessageEventInfo, msgId int64) error { + // 构建删除消息的JSON数据 + var messageData typed.APIRequestInfo + messageData.Action = "delete_msg" + messageData.Params.MessageId = msg.MessageId + messageJson, err := json.Marshal(messageData) + if err != nil { + return err + } + err = wsAPI(messageJson) + return err +} + +func sendLike(userId int64, times int) error { + // 构建发送赞的JSON数据 + var messageData typed.APIRequestInfo + messageData.Action = "send_like" + messageData.Params.UserId = userId + messageData.Params.Times = times + messageJson, err := json.Marshal(messageData) + if err != nil { + return err + } + err = wsAPI(messageJson) + return nil +} + +func setGroupKick(groupId int64, userId int64, rejectAddRequest bool) error { + var messageData typed.APIRequestInfo + messageData.Action = "set_group_kick" + messageData.Params.GroupId = groupId + messageData.Params.UserId = userId + messageData.Params.RejectAddRequest = rejectAddRequest + messageJson, err := json.Marshal(messageData) + if err != nil { + return err + } + err = wsAPI(messageJson) + return nil +} + +func setGroupBan(groupId int64, userId int64, duration int32) error { + var messageData typed.APIRequestInfo + messageData.Action = "set_group_ban" + messageData.Params.GroupId = groupId + messageData.Params.UserId = userId + messageData.Params.Duration = duration + messageJson, err := json.Marshal(messageData) + if err != nil { + return err + } + err = wsAPI(messageJson) + return nil +} +func setGroupAnonymousBan(groupId int64, flag string, duration int32) error { + var messageData typed.APIRequestInfo + messageData.Action = "set_group_anonymous_ban" + messageData.Params.GroupId = groupId + messageData.Params.Flag = flag + messageData.Params.Duration = duration + messageJson, err := json.Marshal(messageData) + if err != nil { + return err + } + err = wsAPI(messageJson) + return nil +} + +func setGroupWholeBan(groupId int64, enable bool) error { + var messageData typed.APIRequestInfo + messageData.Action = "set_group_whole_ban" + messageData.Params.GroupId = groupId + messageData.Params.Enable = enable + messageJson, err := json.Marshal(messageData) + if err != nil { + return err + } + err = wsAPI(messageJson) + return nil +} + +func setGroupAdmin(groupId int64, userId int64, enable bool) error { + var messageData typed.APIRequestInfo + messageData.Action = "set_group_admin" + messageData.Params.GroupId = groupId + messageData.Params.UserId = userId + messageData.Params.Enable = enable + messageJson, err := json.Marshal(messageData) + if err != nil { + return err + } + err = wsAPI(messageJson) + return nil +} + +func setGroupAnonymous(groupId int64, enable bool) error { + var messageData typed.APIRequestInfo + messageData.Action = "set_group_anonymous" + messageData.Params.GroupId = groupId + messageData.Params.Enable = enable + messageJson, err := json.Marshal(messageData) + if err != nil { + return err + } + err = wsAPI(messageJson) + return nil +} + +func setGroupCard(groupId int64, userId int64, card string) error { + var messageData typed.APIRequestInfo + messageData.Action = "set_group_card" + messageData.Params.GroupId = groupId + messageData.Params.UserId = userId + messageData.Params.Card = card + messageJson, err := json.Marshal(messageData) + if err != nil { + return err + } + err = wsAPI(messageJson) + return nil +} + +func setGroupName(groupId int64, groupName string) error { + var messageData typed.APIRequestInfo + messageData.Action = "set_group_name" + messageData.Params.GroupId = groupId + messageData.Params.GroupName = groupName + messageJson, err := json.Marshal(messageData) + if err != nil { + return err + } + err = wsAPI(messageJson) + return nil +} + +func setGroupLeave(groupId int64, isDismiss bool) error { + var messageData typed.APIRequestInfo + messageData.Action = "set_group_leave" + messageData.Params.GroupId = groupId + messageData.Params.IsDismiss = isDismiss + messageJson, err := json.Marshal(messageData) + if err != nil { + return err + } + err = wsAPI(messageJson) + return nil +} + +func setGroupSpecialTitle(groupId int64, userId int64, specialTitle string, duration int32) error { + var messageData typed.APIRequestInfo + messageData.Action = "set_group_special_title" + messageData.Params.GroupId = groupId + messageData.Params.UserId = userId + messageData.Params.SpecialTitle = specialTitle + messageData.Params.Duration = duration + messageJson, err := json.Marshal(messageData) + if err != nil { + return err + } + err = wsAPI(messageJson) + return nil +} + +func setFriendAddRequest(flag string, approve bool, remark string) error { + var messageData typed.APIRequestInfo + messageData.Action = "set_friend_add_request" + messageData.Params.Flag = flag + messageData.Params.Approve = approve + messageData.Params.Remark = remark + messageJson, err := json.Marshal(messageData) + if err != nil { + return err + } + err = wsAPI(messageJson) + return nil +} + +// 2.有响应API,使用http协议处理 +func GetMsg(messageId int32) (typed.MessageEventInfo, error) { + // 构建获取消息的JSON数据 + var requestData typed.ParamsInfo + var msg typed.MessageEventInfo + action := "get_msg" + requestData.MessageId = messageId + body, err := json.Marshal(requestData) + if err != nil { + return typed.MessageEventInfo{}, err + } + // 发送请求 + _, response, err := httpAPI("POST", action, body) + if err != nil { + return typed.MessageEventInfo{}, err + } + // 解析响应 + err = json.Unmarshal(response, &msg) + if err != nil { + return typed.MessageEventInfo{}, err + } + return msg, nil } diff --git a/protocol/events_handler.go b/protocol/events_handler.go index 5b454e9..f963374 100644 --- a/protocol/events_handler.go +++ b/protocol/events_handler.go @@ -1,71 +1,46 @@ package protocol import ( + "ProjectWIND/LOG" "ProjectWIND/typed" "encoding/json" - "log" ) func HandleMessage(msgJson []byte) { var msg typed.MessageEventInfo err := json.Unmarshal(msgJson, &msg) if err != nil { - log.Println("[ERROR] unmarshalling message: ", err) + LOG.FATAL("Unmarshalling message: %v", err) } // 处理消息 - log.Printf("[INFO] 收到消息:(来自:%v-%v:%v-%v)%v", msg.MessageType, msg.GroupId, msg.UserId, msg.Sender.Nickname, msg.RawMessage) - //一个简单的测试 - if msg.RawMessage == "wind test" { - log.Println("[INFO] 收到wind test") - switch msg.MessageType { - case "group": - { - _, err := SendMessage(msg.MessageType, "wind test success", msg.GroupId, false) - if err != nil { - log.Println("[ERROR] send message: ", err) - } - break - } - case "private": - { - _, err := SendMessage(msg.MessageType, "wind test success", msg.UserId, false) - if err != nil { - log.Println("[ERROR] send message: ", err) - } - break - } - default: - { - log.Println("[ERROR] 不支持的消息类型") - break - } - } - } + LOG.INFO("收到消息:(来自:%v-%v:%v-%v)%v", msg.MessageType, msg.GroupId, msg.UserId, msg.Sender.Nickname, msg.RawMessage) + // TODO: 处理消息内容 + } func HandleNotice(msgJson []byte) { var notice typed.NoticeEventInfo err := json.Unmarshal(msgJson, ¬ice) if err != nil { - log.Println("[ERROR] unmarshalling notice: ", err) + LOG.ERROR("Unmarshalling notice: %v", err) } - // 处理通知 + // TODO: 处理通知 } func HandleRequest(msgJson []byte) { var request typed.NoticeEventInfo err := json.Unmarshal(msgJson, &request) if err != nil { - log.Println("[ERROR] unmarshalling request: ", err) + LOG.ERROR("Unmarshalling request: %v", err) } - // 处理请求 + // TODO: 处理请求 } func HandleMetaEvent(msgJson []byte) { var meta typed.NoticeEventInfo err := json.Unmarshal(msgJson, &meta) if err != nil { - log.Println("[ERROR] unmarshalling meta: ", err) + LOG.ERROR("Unmarshalling meta: %v", err) } - // 处理元事件 + // TODO: 处理元事件 } diff --git a/protocol/web_socket.go b/protocol/web_socket.go index 3b71b3a..a72d3d3 100644 --- a/protocol/web_socket.go +++ b/protocol/web_socket.go @@ -1,9 +1,12 @@ package protocol import ( + "ProjectWIND/LOG" + "bytes" "encoding/json" "fmt" - "log" + "io" + "net/http" "net/url" "github.com/gorilla/websocket" @@ -18,23 +21,23 @@ func WebSocketHandler(protocolAddr string) error { // 解析连接URL u, err := url.Parse(protocolAddr) if err != nil { - log.Println("[ERROR] Parse URL error:", err) + LOG.ERROR("Parse URL error: %v", err) return err } conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil) if err != nil { - log.Println("[ERROR] Dial error:", err) + LOG.ERROR("Dial error: %v", err) return err } defer func(conn *websocket.Conn) { err := conn.Close() if err != nil { - log.Println("[ERROR] Close error:", err) + LOG.ERROR("Close error: %v", err) } }(conn) - log.Println("[INFO] New connection established.") + LOG.INFO("WebSocket connection to %v established.", u.String()) // 定义通道,缓存消息和消息类型,防止消息处理阻塞 messageChan := make(chan []byte, 32) @@ -44,7 +47,7 @@ func WebSocketHandler(protocolAddr string) error { // 接收消息并放入通道 messageType, message, err := conn.ReadMessage() if err != nil { - log.Println("[ERROR] Read error:", err) + LOG.ERROR("ReadMessage error: %v", err) return err } messageChan <- message @@ -65,14 +68,14 @@ func WebSocketHandler(protocolAddr string) error { // processMessage 处理接收到的消息 func processMessage(messageType int, message []byte) { if messageType != websocket.TextMessage { - log.Println("[INFO] Invalid message type:", messageType) + LOG.ERROR("Invalid message type: %v", messageType) return } //message json解析 var messageMap map[string]interface{} err := json.Unmarshal(message, &messageMap) if err != nil { - log.Println("[ERROR] Unmarshal error:", err) + LOG.ERROR("Unmarshal error: %v", err) return } // 处理接收到的消息 @@ -105,13 +108,13 @@ func processMessage(messageType int, message []byte) { default: { // 打印接收到的消息 - log.Printf("[WARN] Received message: %s", message) + LOG.WARN("Received unknown event: %s", message) } } } // wsSendMessage 向WebSocket服务器发送消息并返回发送状态 -func wsSendMessage(message []byte) error { +func wsAPI(body []byte) error { // 解析连接URL u, err := url.Parse(fmt.Sprintf("%v/api", gProtocolAddr)) if err != nil { @@ -126,15 +129,39 @@ func wsSendMessage(message []byte) error { defer func(conn *websocket.Conn) { err := conn.Close() if err != nil { - log.Println("[ERROR] Close error:", err) + LOG.ERROR("Close error: %v", err) } }(conn) - // 发送消息 - err = conn.WriteMessage(websocket.TextMessage, message) + // 发送请求 + err = conn.WriteMessage(websocket.TextMessage, body) if err != nil { - return fmt.Errorf("发送消息失败: %v", err) + return fmt.Errorf("请求发送失败: %v", err) } return nil } + +func httpAPI(method, action string, body []byte) (int, []byte, error) { + urlStr := fmt.Sprintf("%v/api/%v", gProtocolAddr, action) + resp, err := http.Post(urlStr, "application/json", bytes.NewReader(body)) + if err != nil { + return 0, nil, fmt.Errorf("请求失败: %v", err) + } + defer func(resp *http.Response) { + err := resp.Body.Close() + if err != nil { + LOG.ERROR("Close error: %v", err) + } + }(resp) + + if resp.StatusCode != http.StatusOK { + return 0, nil, fmt.Errorf("请求失败: %v", resp.Status) + } + + body, err = io.ReadAll(resp.Body) + if err != nil { + return 0, nil, fmt.Errorf("读取响应失败: %v", err) + } + return resp.StatusCode, body, nil +} diff --git a/typed/typed.go b/typed/typed.go index beb9587..f64c555 100644 --- a/typed/typed.go +++ b/typed/typed.go @@ -137,4 +137,5 @@ type ParamsInfo struct { Reason string `json:"reason,omitempty"` NoCache bool `json:"no_cache,omitempty"` File string `json:"file,omitempty"` + Times int `json:"times,omitempty"` } diff --git a/utils.go b/utils.go index 1c0fb9d..fb01a4c 100644 --- a/utils.go +++ b/utils.go @@ -1,6 +1,7 @@ package main import ( + "ProjectWIND/LOG" "ProjectWIND/protocol" "ProjectWIND/typed" "encoding/json" @@ -17,11 +18,11 @@ func initCore() string { log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) log.SetPrefix("[WIND] ") - log.Println("[INFO] 正在初始化WIND配置文件...") + LOG.INFO("正在初始化WIND配置文件...") err := checkAndUpdateConfig("./data/config.json") if err != nil { - log.Fatal(err) + LOG.FATAL("Failed to initialize config file: %v", err) } // 创建日志文件 logFile := fmt.Sprintf("./data/log/WIND_CORE_%s.log", time.Now().Format("20060102150405")) @@ -29,30 +30,30 @@ func initCore() string { if os.IsNotExist(err) { file, err := os.Create(logFile) if err != nil { - log.Fatalf("[ERROR] Failed to create log file: %v", err) + LOG.FATAL("Failed to create log file: %v", err) } defer func(file *os.File) { err := file.Close() if err != nil { - log.Printf("[ERROR] Failed to close log file: %v", err) + LOG.FATAL("Failed to close log file: %v", err) } }(file) } file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { - log.Fatalf("[ERROR] Failed to create log file: %v", err) + LOG.FATAL("Failed to open log file: %v", err) } defer func(file *os.File) { err := file.Close() if err != nil { - log.Printf("[ERROR] Failed to close log file: %v", err) + LOG.FATAL("Failed to close log file: %v", err) } }(file) // 设置日志输出到文件 log.SetOutput(io.MultiWriter(os.Stdout, file)) - log.Println("[INFO] WIND配置文件初始化完成!") + LOG.INFO("WIND配置文件初始化完成!") return logFile } @@ -62,7 +63,7 @@ func checkAndUpdateConfig(configPath string) error { // 如果不存在,则创建该文件夹 err := os.Mkdir("./data/", 0755) if err != nil { - log.Fatal(err) + LOG.FATAL("Failed to create data folder: %v", err) } } @@ -71,12 +72,12 @@ func checkAndUpdateConfig(configPath string) error { // 如果不存在,则创建该文件 file, err := os.Create("./data/config.json") if err != nil { - log.Fatal(err) + LOG.FATAL("Failed to create config file: %v", err) } defer func(file *os.File) { err := file.Close() if err != nil { - log.Fatal(err) + LOG.FATAL("Failed to close config file: %v", err) } }(file) } @@ -98,7 +99,7 @@ func checkAndUpdateConfig(configPath string) error { defer func(file *os.File) { err := file.Close() if err != nil { - log.Printf("[ERROR] Failed to close config file: %v", err) + LOG.FATAL("Failed to close config file: %v", err) } }(file) @@ -136,19 +137,19 @@ func checkAndUpdateConfig(configPath string) error { // 将格式化后的JSON字符串写入文件 file, err = os.Create("./data/config.json") if err != nil { - log.Println("Error creating file:", err) + LOG.FATAL("Error creating config file:%v", err) return err } defer func(file *os.File) { err := file.Close() if err != nil { - log.Printf("Failed to close config file: %v", err) + LOG.FATAL("Failed to close config file: %v", err) } }(file) _, err = file.Write(formattedJSON) if err != nil { - log.Println("[ERROR] Error writing to file:", err) + LOG.FATAL("Error writing to config file: %v", err) return err } @@ -165,22 +166,22 @@ func checkAndUpdateConfig(configPath string) error { err = checkDataFolderExistence("./data/app/") if err != nil { - log.Printf("[ERROR] Failed to create app folder: %v", err) + LOG.FATAL("Failed to create app folder: %v", err) return err } err = checkDataFolderExistence("./data/images/") if err != nil { - log.Printf("[ERROR] Failed to create images folder: %v", err) + LOG.FATAL("Failed to create images folder: %v", err) return err } err = checkDataFolderExistence("./data/database/") if err != nil { - log.Printf("[ERROR] Failed to create database folder: %v", err) + LOG.FATAL("Failed to create database folder: %v", err) return err } err = checkDataFolderExistence("./data/log/") if err != nil { - log.Printf("[ERROR] Failed to create database log file: %v", err) + LOG.FATAL("Failed to create log folder: %v", err) return err } @@ -197,18 +198,18 @@ func startWebUI() { // 打开日志文件 file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { - log.Fatalf("[ERROR] Failed to create log file: %v", err) + LOG.FATAL("Failed to open log file: %v", err) } defer func(file *os.File) { err := file.Close() if err != nil { - log.Printf("[ERROR] Failed to close log file: %v", err) + LOG.FATAL("Failed to close log file: %v", err) } }(file) // 设置日志输出到文件 log.SetOutput(io.MultiWriter(os.Stdout, file)) - log.Println("[INFO] 正在启动WIND核心服务...") + LOG.INFO("正在启动WIND核心服务...") // 启动 WebSocket 处理程序 //TODO: 这里要添加webUI的启动代码 @@ -224,12 +225,12 @@ func registerService() { // 打开日志文件 file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { - log.Fatalf("[ERROR] Failed to create log file: %v", err) + LOG.FATAL("Failed to create log file: %v", err) } defer func(file *os.File) { err := file.Close() if err != nil { - log.Printf("[ERROR] Failed to close log file: %v", err) + LOG.FATAL("Failed to close log file: %v", err) } }(file) // 设置日志输出到文件 @@ -246,44 +247,44 @@ func startProtocol() { // 打开日志文件 file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { - log.Fatalf("[ERROR] Failed to create log file: %v", err) + LOG.FATAL("Failed to create log file: %v", err) } defer func(file *os.File) { err := file.Close() if err != nil { - log.Printf("[ERROR] Failed to close log file: %v", err) + LOG.FATAL("Failed to close log file: %v", err) } }(file) // 设置日志输出到文件 log.SetOutput(io.MultiWriter(os.Stdout, file)) //从配置文件中读取配置信息 - log.Println("[INFO] 正在启动WIND协议服务...") + LOG.INFO("正在启动WIND协议服务...") var config typed.ConfigInfo file, err = os.Open("./data/config.json") if err != nil { - log.Printf("[ERROR] Failed to open config file when linking to protocol: %v", err) + LOG.FATAL("Failed to open config file: %v", err) } defer func(file *os.File) { err := file.Close() if err != nil { - log.Printf("[ERROR] Failed to close config file: %v", err) + LOG.FATAL("Failed to close config file: %v", err) } }(file) decoder := json.NewDecoder(file) err = decoder.Decode(&config) if err != nil { - log.Printf("[ERROR] Failed to decode config file when linking to protocol: %v", err) + LOG.FATAL("Failed to decode config file when linking to protocol: %v", err) } //获取协议地址 protocolAddr := config.ProtocolAddr //链接协议 // 启动 WebSocket 处理程序 - log.Println("[INFO] 正在启动WebSocket链接程序...") + LOG.INFO("正在启动WebSocket链接程序...") err = protocol.WebSocketHandler(protocolAddr) if err != nil { // 如果发生错误,记录错误并退出程序 - log.Fatal(err) + LOG.FATAL("Failed to start WebSocket link program: %v", err) } return }