Impl websocket and change all http-get to http-post

This commit is contained in:
若海
2024-01-19 12:04:34 +08:00
parent c3c22543b9
commit d8e17e0b37
22 changed files with 2449 additions and 1449 deletions
File diff suppressed because it is too large Load Diff
+61 -12
View File
@@ -5,41 +5,48 @@ import (
"github.com/opentdp/go-helper/logman"
"github.com/opentdp/go-helper/request"
"golang.org/x/net/websocket"
"github.com/opentdp/wechat-rest/wcferry"
)
var urlReceiverStat = false
var urlReceiverKey = ""
var urlReceiverList = map[string]bool{}
var socketReceiverKey = ""
var socketReceiverList = map[*websocket.Conn]bool{}
func (wc *Controller) enableUrlReceiver(url string) error {
if !urlReceiverStat {
err := wc.EnrollReceiver(true, func(msg *wcferry.WxMsg) {
logman.Info("enable receiver", "url", url)
if urlReceiverKey == "" {
key, err := wc.EnrollReceiver(true, func(msg *wcferry.WxMsg) {
ret := wcferry.ParseWxMsg(msg)
for url := range urlReceiverList {
logman.Info("forward msg", "url", url, "Id", ret.Id)
go request.JsonPost(url, ret, request.H{})
for u := range urlReceiverList {
logman.Info("call receiver", "url", u, "Id", ret.Id)
go request.JsonPost(u, ret, request.H{})
}
})
if err != nil {
return err
}
urlReceiverKey = key
}
if _, ok := urlReceiverList[url]; ok {
return errors.New("url already exists")
}
urlReceiverStat = true
urlReceiverList[url] = true
return nil
}
func (wc *Controller) disableUrlReceiver(url string) error {
logman.Info("disable receiver", "url", url)
if _, ok := urlReceiverList[url]; !ok {
return errors.New("url not exists")
}
@@ -47,10 +54,52 @@ func (wc *Controller) disableUrlReceiver(url string) error {
delete(urlReceiverList, url)
if len(urlReceiverList) == 0 {
if err := wc.DisableReceiver(false); err != nil {
return err
}
urlReceiverStat = false
return wc.DisableReceiver(urlReceiverKey)
}
return nil
}
func (wc *Controller) enableSocketReceiver(ws *websocket.Conn) error {
logman.Info("enable receiver", "socket", ws.RemoteAddr().String())
if len(socketReceiverList) == 0 {
key, err := wc.EnrollReceiver(true, func(msg *wcferry.WxMsg) {
ret := wcferry.ParseWxMsg(msg)
for w := range socketReceiverList {
logman.Info("call receiver", "socket", ws.RemoteAddr().String(), "Id", ret.Id)
go websocket.JSON.Send(w, ret)
}
})
if err != nil {
return err
}
socketReceiverKey = key
}
if _, ok := socketReceiverList[ws]; ok {
return errors.New("socket already exists")
}
socketReceiverList[ws] = true
return nil
}
func (wc *Controller) disableSocketReceiver(ws *websocket.Conn) error {
logman.Info("disable receiver", "socket", ws.RemoteAddr().String())
if _, ok := socketReceiverList[ws]; !ok {
return errors.New("socket not exists")
}
delete(socketReceiverList, ws)
if len(socketReceiverList) == 0 {
return wc.DisableReceiver(socketReceiverKey)
}
return nil
+21 -18
View File
@@ -2,50 +2,53 @@ package wcfrest
import (
"github.com/gin-gonic/gin"
"github.com/opentdp/wechat-rest/wclient"
)
func Route(rg *gin.RouterGroup) {
ctrl := Controller{wclient.Register()}
ctrl := &Controller{wclient.Register()}
rg.GET("is_login", ctrl.isLogin)
rg.GET("self_wxid", ctrl.getSelfWxid)
rg.GET("user_info", ctrl.getUserInfo)
rg.GET("contacts", ctrl.getContacts)
rg.GET("friends", ctrl.getFriends)
rg.GET("user_info/:wxid", ctrl.getUserInfoByWxid)
rg.POST("is_login", ctrl.isLogin)
rg.POST("self_wxid", ctrl.getSelfWxid)
rg.POST("self_info", ctrl.getSelfInfo)
rg.POST("msg_types", ctrl.getMsgTypes)
rg.GET("db_names", ctrl.getDbNames)
rg.GET("db_tables/:db", ctrl.getDbTables)
rg.POST("db_names", ctrl.getDbNames)
rg.POST("db_tables", ctrl.getDbTables)
rg.POST("db_query_sql", ctrl.dbSqlQuery)
rg.GET("msg_types", ctrl.getMsgTypes)
rg.GET("refresh_pyq/:id", ctrl.refreshPyq)
rg.GET("chatrooms", ctrl.getChatRooms)
rg.GET("chatroom_members/:roomid", ctrl.getChatRoomMembers)
rg.GET("alias_in_chatroom/:wxid/:roomid", ctrl.getAliasInChatRoom)
rg.POST("chatrooms", ctrl.getChatRooms)
rg.POST("chatroom_members", ctrl.getChatRoomMembers)
rg.POST("alias_in_chatroom", ctrl.getAliasInChatRoom)
rg.POST("invite_chatroom_members", ctrl.inviteChatroomMembers)
rg.POST("add_chatroom_members", ctrl.addChatRoomMembers)
rg.POST("del_chatroom_members", ctrl.delChatRoomMembers)
rg.GET("revoke_msg/:msgid", ctrl.revokeMsg)
rg.POST("revoke_msg", ctrl.revokeMsg)
rg.POST("forward_msg", ctrl.forwardMsg)
rg.POST("send_txt", ctrl.sendTxt)
rg.POST("send_img", ctrl.sendImg)
rg.POST("send_file", ctrl.sendFile)
rg.POST("send_rich_text", ctrl.sendRichText)
rg.POST("send_pat_msg", ctrl.sendPatMsg)
rg.POST("get_audio_msg", ctrl.getAudioMsg)
rg.POST("get_ocr_result", ctrl.getOcrResult)
rg.POST("audio_msg", ctrl.getAudioMsg)
rg.POST("ocr_result", ctrl.getOcrResult)
rg.POST("download_image", ctrl.downloadImage)
rg.POST("download_attach", ctrl.downloadAttach)
rg.POST("avatars", ctrl.getAvatars)
rg.POST("contacts", ctrl.getContacts)
rg.POST("friends", ctrl.getFriends)
rg.POST("user_info", ctrl.getInfoByWxid)
rg.POST("refresh_pyq", ctrl.refreshPyq)
rg.POST("accept_new_friend", ctrl.acceptNewFriend)
rg.POST("receive_transfer", ctrl.receiveTransfer)
rg.POST("enable_receiver", ctrl.enabledReceiver)
rg.POST("disable_receiver", ctrl.disableReceiver)
rg.GET("socket_receiver", ctrl.socketReceiver)
}
-47
View File
@@ -1,47 +0,0 @@
package wcfrest
// 执行结果
type RespPayload struct {
Success bool `json:"success,omitempty"`
Result string `json:"result,omitempty"`
Error error `json:"error,omitempty"`
}
// 数据库查询参数
type DbSqlQueryRequest struct {
Db string `json:"db"`
Sql string `json:"sql"`
}
// 消息转发参数
type ReceiverRequest struct {
Url string `json:"url"`
}
// 获取音频消息参数
type GetAudioMsgRequest struct {
Msgid uint64 `json:"msgid"`
Dir string `json:"path"`
Timeout int `json:"timeout"`
}
// 获取OCR识别参数
type GetOcrRequest struct {
Extra string `json:"extra"`
Timeout int `json:"timeout"`
}
// 下载图片参数
type DownloadImageRequest struct {
Msgid uint64 `json:"msgid"`
Extra string `json:"extra"`
Dir string `json:"dir"`
Timeout int `json:"timeout"`
}
// 下载附件参数
type DownloadAttachRequest struct {
Msgid uint64 `json:"msgid"`
Thumb string `json:"thumb"`
Extra string `json:"extra"`
}