WeChatFerry/clients/gohttp/httpd/wcfrest/receiver.go

108 lines
2.2 KiB
Go
Raw Normal View History

2023-12-29 21:28:18 +08:00
package wcfrest
import (
"errors"
"github.com/opentdp/go-helper/logman"
"github.com/opentdp/go-helper/request"
"golang.org/x/net/websocket"
2023-12-29 21:28:18 +08:00
"github.com/opentdp/wechat-rest/wcferry"
)
var urlReceiverKey = ""
2024-01-12 09:02:19 +08:00
var urlReceiverList = map[string]bool{}
2023-12-29 21:28:18 +08:00
var socketReceiverKey = ""
var socketReceiverList = map[*websocket.Conn]bool{}
2024-01-12 09:02:19 +08:00
func (wc *Controller) enableUrlReceiver(url string) error {
2023-12-29 21:28:18 +08:00
logman.Info("enable receiver", "url", url)
if urlReceiverKey == "" {
key, err := wc.EnrollReceiver(true, func(msg *wcferry.WxMsg) {
2024-01-12 09:02:19 +08:00
ret := wcferry.ParseWxMsg(msg)
for u := range urlReceiverList {
logman.Info("call receiver", "url", u, "Id", ret.Id)
go request.JsonPost(u, ret, request.H{})
2023-12-29 21:28:18 +08:00
}
})
if err != nil {
return err
}
urlReceiverKey = key
2023-12-29 21:28:18 +08:00
}
2024-01-12 09:02:19 +08:00
if _, ok := urlReceiverList[url]; ok {
2023-12-29 21:28:18 +08:00
return errors.New("url already exists")
}
2024-01-12 09:02:19 +08:00
urlReceiverList[url] = true
2023-12-29 21:28:18 +08:00
return nil
}
2024-01-12 09:02:19 +08:00
func (wc *Controller) disableUrlReceiver(url string) error {
2023-12-29 21:28:18 +08:00
logman.Info("disable receiver", "url", url)
2024-01-12 09:02:19 +08:00
if _, ok := urlReceiverList[url]; !ok {
2023-12-29 21:28:18 +08:00
return errors.New("url not exists")
}
2024-01-12 09:02:19 +08:00
delete(urlReceiverList, url)
2023-12-29 21:28:18 +08:00
2024-01-12 09:02:19 +08:00
if len(urlReceiverList) == 0 {
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 {
2023-12-29 21:28:18 +08:00
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)
2023-12-29 21:28:18 +08:00
}
return nil
}