1 Star 0 Fork 0

Ling_Boogie/mahjong-helper

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
message_receiver.go 1.63 KB
一键复制 编辑 原始数据 按行查看 历史
18520664652 提交于 2021-12-30 20:41 +08:00 . qwq
package tenhou
import (
"time"
"encoding/json"
"regexp"
)
type MessageReceiver struct {
originMessageQueue chan []byte
orderedMessageQueue chan []byte
}
func NewMessageReceiver() *MessageReceiver {
const maxQueueSize = 100
mr := &MessageReceiver{
originMessageQueue: make(chan []byte, maxQueueSize),
orderedMessageQueue: make(chan []byte, maxQueueSize),
}
go mr.run()
return mr
}
var isSelfDraw = regexp.MustCompile("^T[0-9]{1,3}$").MatchString
// TODO: 后续使用 parser 中提供的方法
func (mr *MessageReceiver) isSelfDraw(data []byte) bool {
d := struct {
Tag string `json:"tag"`
}{}
if err := json.Unmarshal(data, &d); err != nil {
return false
}
return isSelfDraw(d.Tag)
}
func (mr *MessageReceiver) run() {
for data := range mr.originMessageQueue {
if !mr.isSelfDraw(data) {
mr.orderedMessageQueue <- data
continue
}
// 收到了自家摸牌的消息,则等待一段很短的时间
time.Sleep(75 * time.Millisecond) // 实际间隔在 3~9ms
// 未收到新数据
if len(mr.originMessageQueue) == 0 {
mr.orderedMessageQueue <- data
continue
}
// 在短时间内收到了新数据
// 因为摸牌后肯定要等待玩家操作,正常情况是不会马上有新数据的,所以这说明前端乱序发来了数据
// 把 data 重新塞回去,这样才是正确的顺序
mr.originMessageQueue <- data
}
}
func (mr *MessageReceiver) Put(data []byte) {
mr.originMessageQueue <- data
}
func (mr *MessageReceiver) Get() []byte {
return <-mr.orderedMessageQueue
}
func (mr *MessageReceiver) IsEmpty() bool {
return len(mr.originMessageQueue) == 0 && len(mr.orderedMessageQueue) == 0
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/ling_boogie/mahjong-helper.git
git@gitee.com:ling_boogie/mahjong-helper.git
ling_boogie
mahjong-helper
mahjong-helper
v0.1.0

搜索帮助