完成所有ws无响应api,优化了日志打印

This commit is contained in:
Sheyiyuan 2024-12-03 09:21:00 +08:00
parent bb3f84bb70
commit 33a3da05f7
9 changed files with 379 additions and 119 deletions

1
.gitignore vendored
View File

@ -2,3 +2,4 @@
/scripts
/ProjectWIND
/data
**/.DS_Store

31
LOG/log.go Normal file
View File

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

9
go.mod
View File

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

16
go.sum
View File

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

View File

@ -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
{
messageData.Params.UserId = msg.UserId
break
}
case "group":
messageData.Params.GroupId = targetId
{
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)
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 false, err
return err
}
return true, nil
// 发送消息
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
}

View File

@ -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, &notice)
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: 处理元事件
}

View File

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

View File

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

View File

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