107 lines
2.3 KiB
Go
107 lines
2.3 KiB
Go
package play
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"game-driver/config"
|
|
"game-driver/internal/middleware"
|
|
"game-driver/internal/routes/play/card_device"
|
|
"game-driver/internal/schema"
|
|
"game-driver/leaf"
|
|
"game-driver/pkg/utils"
|
|
"github.com/eclipse/paho.golang/paho"
|
|
"go.uber.org/zap"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
type ResponseBody struct {
|
|
Empty int `json:"empty"`
|
|
Error int `json:"error"`
|
|
OutOk int `json:"out_ok"`
|
|
num int
|
|
}
|
|
|
|
func PushCard(ctx context.Context) leaf.HandlerFunc {
|
|
devices := make([]*card_device.Device, 0)
|
|
for _, group := range config.C.Game.CardGroups {
|
|
gv, _ := json.Marshal(group)
|
|
zap.S().Info("发卡指针初始化:", string(gv))
|
|
|
|
device, err := card_device.New(group)
|
|
if err != nil {
|
|
zap.S().Panicln("初始化发卡器失败: ", err)
|
|
}
|
|
devices = append(devices, device)
|
|
}
|
|
go func() {
|
|
<-ctx.Done()
|
|
for _, device := range devices {
|
|
device.Close()
|
|
}
|
|
}()
|
|
|
|
return func(c *leaf.Context) {
|
|
payload := leaf.Value[*schema.PlayModal](c, middleware.PayloadJSONKey)
|
|
|
|
var action time.Duration
|
|
if a, ok := payload.Game["action"]; ok {
|
|
if v, ok := a.(float64); ok {
|
|
action = time.Duration(v)
|
|
}
|
|
}
|
|
|
|
// 等待组
|
|
var wait sync.WaitGroup
|
|
defer wait.Wait()
|
|
|
|
// 结束信号通道
|
|
a := make(chan struct{})
|
|
// 发送结束信号
|
|
defer close(a)
|
|
|
|
wait.Add(1)
|
|
go func() {
|
|
defer wait.Done()
|
|
select {
|
|
case <-a:
|
|
case <-time.After(action * time.Second):
|
|
body := &ResponseBody{}
|
|
for _, device := range devices {
|
|
body.Empty += device.GetEmpty()
|
|
body.Error += device.GetError()
|
|
}
|
|
for i, device := range devices {
|
|
if device.GetEmpty() == 0 && device.GetError() == 0 && device.GetOutOk() == 0 {
|
|
body.num = i + 1
|
|
device.PushCard()
|
|
break
|
|
}
|
|
}
|
|
// 延迟1秒获取结果并发送消息
|
|
time.AfterFunc(time.Second, func() {
|
|
if body.num != 0 {
|
|
body.OutOk += devices[body.num-1].GetOutOk()
|
|
}
|
|
publishBody(ctx, c.Properties.ResponseTopic, body)
|
|
})
|
|
}
|
|
}()
|
|
|
|
// 执行等待信号
|
|
Default(c)
|
|
}
|
|
}
|
|
|
|
// 发布消息
|
|
func publishBody(ctx context.Context, topic string, body *ResponseBody) {
|
|
if topic != "" {
|
|
bytes, _ := json.Marshal(body)
|
|
utils.GlobalMqttClient.Publish(ctx, &paho.Publish{
|
|
Topic: topic,
|
|
Payload: bytes,
|
|
QoS: 1,
|
|
})
|
|
}
|
|
}
|