forked from ProjectWIND/ProjectWIND
完成所有ws无响应api,优化了日志打印
This commit is contained in:
parent
bb3f84bb70
commit
33a3da05f7
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,3 +2,4 @@
|
|||||||
/scripts
|
/scripts
|
||||||
/ProjectWIND
|
/ProjectWIND
|
||||||
/data
|
/data
|
||||||
|
**/.DS_Store
|
31
LOG/log.go
Normal file
31
LOG/log.go
Normal 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
9
go.mod
@ -2,11 +2,4 @@ module ProjectWIND
|
|||||||
|
|
||||||
go 1.23.2
|
go 1.23.2
|
||||||
|
|
||||||
require (
|
require github.com/gorilla/websocket v1.5.3
|
||||||
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
|
|
||||||
)
|
|
||||||
|
16
go.sum
16
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 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
|
||||||
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
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=
|
|
||||||
|
271
protocol/api.go
271
protocol/api.go
@ -6,34 +6,281 @@ import (
|
|||||||
"errors"
|
"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数据
|
// 构建发送消息的JSON数据
|
||||||
var messageData typed.APIRequestInfo
|
var messageData typed.APIRequestInfo
|
||||||
|
|
||||||
|
messageType := msg.MessageType
|
||||||
|
|
||||||
messageData.Action = "send_msg"
|
messageData.Action = "send_msg"
|
||||||
switch messageType {
|
switch messageType {
|
||||||
case "private":
|
case "private":
|
||||||
messageData.Params.UserId = targetId
|
{
|
||||||
|
messageData.Params.UserId = msg.UserId
|
||||||
break
|
break
|
||||||
|
}
|
||||||
case "group":
|
case "group":
|
||||||
messageData.Params.GroupId = targetId
|
{
|
||||||
|
messageData.Params.GroupId = msg.GroupId
|
||||||
break
|
break
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return false, errors.New("invalid type")
|
{
|
||||||
|
return errors.New("invalid type")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
messageData.Params.Message = message
|
messageData.Params.Message = message
|
||||||
messageData.Params.AutoEscape = autoEscape
|
messageData.Params.AutoEscape = autoEscape
|
||||||
messageJson, err := json.Marshal(messageData)
|
messageJson, err := json.Marshal(messageData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return err
|
||||||
}
|
}
|
||||||
// 发送消息
|
// 发送消息
|
||||||
err = wsSendMessage(messageJson)
|
err = wsAPI(messageJson)
|
||||||
if err != nil {
|
return err
|
||||||
return false, err
|
}
|
||||||
}
|
|
||||||
return true, nil
|
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
|
||||||
}
|
}
|
||||||
|
@ -1,71 +1,46 @@
|
|||||||
package protocol
|
package protocol
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"ProjectWIND/LOG"
|
||||||
"ProjectWIND/typed"
|
"ProjectWIND/typed"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"log"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func HandleMessage(msgJson []byte) {
|
func HandleMessage(msgJson []byte) {
|
||||||
var msg typed.MessageEventInfo
|
var msg typed.MessageEventInfo
|
||||||
err := json.Unmarshal(msgJson, &msg)
|
err := json.Unmarshal(msgJson, &msg)
|
||||||
if err != nil {
|
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)
|
LOG.INFO("收到消息:(来自:%v-%v:%v-%v)%v", msg.MessageType, msg.GroupId, msg.UserId, msg.Sender.Nickname, msg.RawMessage)
|
||||||
//一个简单的测试
|
// TODO: 处理消息内容
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func HandleNotice(msgJson []byte) {
|
func HandleNotice(msgJson []byte) {
|
||||||
var notice typed.NoticeEventInfo
|
var notice typed.NoticeEventInfo
|
||||||
err := json.Unmarshal(msgJson, ¬ice)
|
err := json.Unmarshal(msgJson, ¬ice)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("[ERROR] unmarshalling notice: ", err)
|
LOG.ERROR("Unmarshalling notice: %v", err)
|
||||||
}
|
}
|
||||||
// 处理通知
|
// TODO: 处理通知
|
||||||
}
|
}
|
||||||
|
|
||||||
func HandleRequest(msgJson []byte) {
|
func HandleRequest(msgJson []byte) {
|
||||||
var request typed.NoticeEventInfo
|
var request typed.NoticeEventInfo
|
||||||
err := json.Unmarshal(msgJson, &request)
|
err := json.Unmarshal(msgJson, &request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("[ERROR] unmarshalling request: ", err)
|
LOG.ERROR("Unmarshalling request: %v", err)
|
||||||
}
|
}
|
||||||
// 处理请求
|
// TODO: 处理请求
|
||||||
}
|
}
|
||||||
|
|
||||||
func HandleMetaEvent(msgJson []byte) {
|
func HandleMetaEvent(msgJson []byte) {
|
||||||
var meta typed.NoticeEventInfo
|
var meta typed.NoticeEventInfo
|
||||||
err := json.Unmarshal(msgJson, &meta)
|
err := json.Unmarshal(msgJson, &meta)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("[ERROR] unmarshalling meta: ", err)
|
LOG.ERROR("Unmarshalling meta: %v", err)
|
||||||
}
|
}
|
||||||
// 处理元事件
|
// TODO: 处理元事件
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
package protocol
|
package protocol
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"ProjectWIND/LOG"
|
||||||
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"io"
|
||||||
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
@ -18,23 +21,23 @@ func WebSocketHandler(protocolAddr string) error {
|
|||||||
// 解析连接URL
|
// 解析连接URL
|
||||||
u, err := url.Parse(protocolAddr)
|
u, err := url.Parse(protocolAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("[ERROR] Parse URL error:", err)
|
LOG.ERROR("Parse URL error: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
|
conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("[ERROR] Dial error:", err)
|
LOG.ERROR("Dial error: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer func(conn *websocket.Conn) {
|
defer func(conn *websocket.Conn) {
|
||||||
err := conn.Close()
|
err := conn.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("[ERROR] Close error:", err)
|
LOG.ERROR("Close error: %v", err)
|
||||||
}
|
}
|
||||||
}(conn)
|
}(conn)
|
||||||
|
|
||||||
log.Println("[INFO] New connection established.")
|
LOG.INFO("WebSocket connection to %v established.", u.String())
|
||||||
|
|
||||||
// 定义通道,缓存消息和消息类型,防止消息处理阻塞
|
// 定义通道,缓存消息和消息类型,防止消息处理阻塞
|
||||||
messageChan := make(chan []byte, 32)
|
messageChan := make(chan []byte, 32)
|
||||||
@ -44,7 +47,7 @@ func WebSocketHandler(protocolAddr string) error {
|
|||||||
// 接收消息并放入通道
|
// 接收消息并放入通道
|
||||||
messageType, message, err := conn.ReadMessage()
|
messageType, message, err := conn.ReadMessage()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("[ERROR] Read error:", err)
|
LOG.ERROR("ReadMessage error: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
messageChan <- message
|
messageChan <- message
|
||||||
@ -65,14 +68,14 @@ func WebSocketHandler(protocolAddr string) error {
|
|||||||
// processMessage 处理接收到的消息
|
// processMessage 处理接收到的消息
|
||||||
func processMessage(messageType int, message []byte) {
|
func processMessage(messageType int, message []byte) {
|
||||||
if messageType != websocket.TextMessage {
|
if messageType != websocket.TextMessage {
|
||||||
log.Println("[INFO] Invalid message type:", messageType)
|
LOG.ERROR("Invalid message type: %v", messageType)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
//message json解析
|
//message json解析
|
||||||
var messageMap map[string]interface{}
|
var messageMap map[string]interface{}
|
||||||
err := json.Unmarshal(message, &messageMap)
|
err := json.Unmarshal(message, &messageMap)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("[ERROR] Unmarshal error:", err)
|
LOG.ERROR("Unmarshal error: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 处理接收到的消息
|
// 处理接收到的消息
|
||||||
@ -105,13 +108,13 @@ func processMessage(messageType int, message []byte) {
|
|||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
// 打印接收到的消息
|
// 打印接收到的消息
|
||||||
log.Printf("[WARN] Received message: %s", message)
|
LOG.WARN("Received unknown event: %s", message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// wsSendMessage 向WebSocket服务器发送消息并返回发送状态
|
// wsSendMessage 向WebSocket服务器发送消息并返回发送状态
|
||||||
func wsSendMessage(message []byte) error {
|
func wsAPI(body []byte) error {
|
||||||
// 解析连接URL
|
// 解析连接URL
|
||||||
u, err := url.Parse(fmt.Sprintf("%v/api", gProtocolAddr))
|
u, err := url.Parse(fmt.Sprintf("%v/api", gProtocolAddr))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -126,15 +129,39 @@ func wsSendMessage(message []byte) error {
|
|||||||
defer func(conn *websocket.Conn) {
|
defer func(conn *websocket.Conn) {
|
||||||
err := conn.Close()
|
err := conn.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("[ERROR] Close error:", err)
|
LOG.ERROR("Close error: %v", err)
|
||||||
}
|
}
|
||||||
}(conn)
|
}(conn)
|
||||||
|
|
||||||
// 发送消息
|
// 发送请求
|
||||||
err = conn.WriteMessage(websocket.TextMessage, message)
|
err = conn.WriteMessage(websocket.TextMessage, body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("发送消息失败: %v", err)
|
return fmt.Errorf("请求发送失败: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
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
|
||||||
|
}
|
||||||
|
@ -137,4 +137,5 @@ type ParamsInfo struct {
|
|||||||
Reason string `json:"reason,omitempty"`
|
Reason string `json:"reason,omitempty"`
|
||||||
NoCache bool `json:"no_cache,omitempty"`
|
NoCache bool `json:"no_cache,omitempty"`
|
||||||
File string `json:"file,omitempty"`
|
File string `json:"file,omitempty"`
|
||||||
|
Times int `json:"times,omitempty"`
|
||||||
}
|
}
|
||||||
|
63
utils.go
63
utils.go
@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"ProjectWIND/LOG"
|
||||||
"ProjectWIND/protocol"
|
"ProjectWIND/protocol"
|
||||||
"ProjectWIND/typed"
|
"ProjectWIND/typed"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
@ -17,11 +18,11 @@ func initCore() string {
|
|||||||
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
|
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
|
||||||
log.SetPrefix("[WIND] ")
|
log.SetPrefix("[WIND] ")
|
||||||
|
|
||||||
log.Println("[INFO] 正在初始化WIND配置文件...")
|
LOG.INFO("正在初始化WIND配置文件...")
|
||||||
|
|
||||||
err := checkAndUpdateConfig("./data/config.json")
|
err := checkAndUpdateConfig("./data/config.json")
|
||||||
if err != nil {
|
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"))
|
logFile := fmt.Sprintf("./data/log/WIND_CORE_%s.log", time.Now().Format("20060102150405"))
|
||||||
@ -29,30 +30,30 @@ func initCore() string {
|
|||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
file, err := os.Create(logFile)
|
file, err := os.Create(logFile)
|
||||||
if err != nil {
|
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) {
|
defer func(file *os.File) {
|
||||||
err := file.Close()
|
err := file.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("[ERROR] Failed to close log file: %v", err)
|
LOG.FATAL("Failed to close log file: %v", err)
|
||||||
}
|
}
|
||||||
}(file)
|
}(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
||||||
if err != nil {
|
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) {
|
defer func(file *os.File) {
|
||||||
err := file.Close()
|
err := file.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("[ERROR] Failed to close log file: %v", err)
|
LOG.FATAL("Failed to close log file: %v", err)
|
||||||
}
|
}
|
||||||
}(file)
|
}(file)
|
||||||
|
|
||||||
// 设置日志输出到文件
|
// 设置日志输出到文件
|
||||||
log.SetOutput(io.MultiWriter(os.Stdout, file))
|
log.SetOutput(io.MultiWriter(os.Stdout, file))
|
||||||
log.Println("[INFO] WIND配置文件初始化完成!")
|
LOG.INFO("WIND配置文件初始化完成!")
|
||||||
return logFile
|
return logFile
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,7 +63,7 @@ func checkAndUpdateConfig(configPath string) error {
|
|||||||
// 如果不存在,则创建该文件夹
|
// 如果不存在,则创建该文件夹
|
||||||
err := os.Mkdir("./data/", 0755)
|
err := os.Mkdir("./data/", 0755)
|
||||||
if err != nil {
|
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")
|
file, err := os.Create("./data/config.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
LOG.FATAL("Failed to create config file: %v", err)
|
||||||
}
|
}
|
||||||
defer func(file *os.File) {
|
defer func(file *os.File) {
|
||||||
err := file.Close()
|
err := file.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
LOG.FATAL("Failed to close config file: %v", err)
|
||||||
}
|
}
|
||||||
}(file)
|
}(file)
|
||||||
}
|
}
|
||||||
@ -98,7 +99,7 @@ func checkAndUpdateConfig(configPath string) error {
|
|||||||
defer func(file *os.File) {
|
defer func(file *os.File) {
|
||||||
err := file.Close()
|
err := file.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("[ERROR] Failed to close config file: %v", err)
|
LOG.FATAL("Failed to close config file: %v", err)
|
||||||
}
|
}
|
||||||
}(file)
|
}(file)
|
||||||
|
|
||||||
@ -136,19 +137,19 @@ func checkAndUpdateConfig(configPath string) error {
|
|||||||
// 将格式化后的JSON字符串写入文件
|
// 将格式化后的JSON字符串写入文件
|
||||||
file, err = os.Create("./data/config.json")
|
file, err = os.Create("./data/config.json")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("Error creating file:", err)
|
LOG.FATAL("Error creating config file:%v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer func(file *os.File) {
|
defer func(file *os.File) {
|
||||||
err := file.Close()
|
err := file.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Failed to close config file: %v", err)
|
LOG.FATAL("Failed to close config file: %v", err)
|
||||||
}
|
}
|
||||||
}(file)
|
}(file)
|
||||||
|
|
||||||
_, err = file.Write(formattedJSON)
|
_, err = file.Write(formattedJSON)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("[ERROR] Error writing to file:", err)
|
LOG.FATAL("Error writing to config file: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,22 +166,22 @@ func checkAndUpdateConfig(configPath string) error {
|
|||||||
|
|
||||||
err = checkDataFolderExistence("./data/app/")
|
err = checkDataFolderExistence("./data/app/")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("[ERROR] Failed to create app folder: %v", err)
|
LOG.FATAL("Failed to create app folder: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = checkDataFolderExistence("./data/images/")
|
err = checkDataFolderExistence("./data/images/")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("[ERROR] Failed to create images folder: %v", err)
|
LOG.FATAL("Failed to create images folder: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = checkDataFolderExistence("./data/database/")
|
err = checkDataFolderExistence("./data/database/")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("[ERROR] Failed to create database folder: %v", err)
|
LOG.FATAL("Failed to create database folder: %v", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = checkDataFolderExistence("./data/log/")
|
err = checkDataFolderExistence("./data/log/")
|
||||||
if err != nil {
|
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
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,18 +198,18 @@ func startWebUI() {
|
|||||||
// 打开日志文件
|
// 打开日志文件
|
||||||
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
||||||
if err != nil {
|
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) {
|
defer func(file *os.File) {
|
||||||
err := file.Close()
|
err := file.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("[ERROR] Failed to close log file: %v", err)
|
LOG.FATAL("Failed to close log file: %v", err)
|
||||||
}
|
}
|
||||||
}(file)
|
}(file)
|
||||||
// 设置日志输出到文件
|
// 设置日志输出到文件
|
||||||
log.SetOutput(io.MultiWriter(os.Stdout, file))
|
log.SetOutput(io.MultiWriter(os.Stdout, file))
|
||||||
|
|
||||||
log.Println("[INFO] 正在启动WIND核心服务...")
|
LOG.INFO("正在启动WIND核心服务...")
|
||||||
// 启动 WebSocket 处理程序
|
// 启动 WebSocket 处理程序
|
||||||
|
|
||||||
//TODO: 这里要添加webUI的启动代码
|
//TODO: 这里要添加webUI的启动代码
|
||||||
@ -224,12 +225,12 @@ func registerService() {
|
|||||||
// 打开日志文件
|
// 打开日志文件
|
||||||
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
||||||
if err != nil {
|
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) {
|
defer func(file *os.File) {
|
||||||
err := file.Close()
|
err := file.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("[ERROR] Failed to close log file: %v", err)
|
LOG.FATAL("Failed to close log file: %v", err)
|
||||||
}
|
}
|
||||||
}(file)
|
}(file)
|
||||||
// 设置日志输出到文件
|
// 设置日志输出到文件
|
||||||
@ -246,44 +247,44 @@ func startProtocol() {
|
|||||||
// 打开日志文件
|
// 打开日志文件
|
||||||
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
||||||
if err != nil {
|
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) {
|
defer func(file *os.File) {
|
||||||
err := file.Close()
|
err := file.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("[ERROR] Failed to close log file: %v", err)
|
LOG.FATAL("Failed to close log file: %v", err)
|
||||||
}
|
}
|
||||||
}(file)
|
}(file)
|
||||||
// 设置日志输出到文件
|
// 设置日志输出到文件
|
||||||
log.SetOutput(io.MultiWriter(os.Stdout, file))
|
log.SetOutput(io.MultiWriter(os.Stdout, file))
|
||||||
//从配置文件中读取配置信息
|
//从配置文件中读取配置信息
|
||||||
log.Println("[INFO] 正在启动WIND协议服务...")
|
LOG.INFO("正在启动WIND协议服务...")
|
||||||
var config typed.ConfigInfo
|
var config typed.ConfigInfo
|
||||||
file, err = os.Open("./data/config.json")
|
file, err = os.Open("./data/config.json")
|
||||||
if err != nil {
|
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) {
|
defer func(file *os.File) {
|
||||||
err := file.Close()
|
err := file.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("[ERROR] Failed to close config file: %v", err)
|
LOG.FATAL("Failed to close config file: %v", err)
|
||||||
}
|
}
|
||||||
}(file)
|
}(file)
|
||||||
|
|
||||||
decoder := json.NewDecoder(file)
|
decoder := json.NewDecoder(file)
|
||||||
err = decoder.Decode(&config)
|
err = decoder.Decode(&config)
|
||||||
if err != nil {
|
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
|
protocolAddr := config.ProtocolAddr
|
||||||
//链接协议
|
//链接协议
|
||||||
// 启动 WebSocket 处理程序
|
// 启动 WebSocket 处理程序
|
||||||
log.Println("[INFO] 正在启动WebSocket链接程序...")
|
LOG.INFO("正在启动WebSocket链接程序...")
|
||||||
err = protocol.WebSocketHandler(protocolAddr)
|
err = protocol.WebSocketHandler(protocolAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// 如果发生错误,记录错误并退出程序
|
// 如果发生错误,记录错误并退出程序
|
||||||
log.Fatal(err)
|
LOG.FATAL("Failed to start WebSocket link program: %v", err)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user