Files
game-driver/internal/middleware/timer.go
2024-11-01 17:40:34 +08:00

81 lines
1.7 KiB
Go

package middleware
import (
"game-driver/internal/schema"
"game-driver/leaf"
"game-driver/pkg/tts"
"sync"
"time"
)
// TimerAction 定时器中间件,用于定时触发屏幕打印和语音播报。 t 是语音播报实例
func TimerAction(t *tts.AliTTS, maxTimeout int) leaf.HandlerFunc {
return func(c *leaf.Context) {
pm := leaf.Value[*schema.PlayModal](c, PayloadJSONKey)
// 构建打印和语音播报的时间映射
printMap := make(map[int]schema.PrintModal, len(pm.Print))
for _, p := range pm.Print {
printMap[p.Time] = p
}
ttsMap := make(map[int]schema.TTSTimer, len(pm.TTS.Timer))
for _, t := range pm.TTS.Timer {
ttsMap[t.Time] = t
}
// 定时器
var timer *time.Timer
if pm.Timeout != 0 {
timer = time.NewTimer(time.Second * time.Duration(pm.Timeout))
} else {
timer = time.NewTimer(time.Second * time.Duration(maxTimeout))
}
defer timer.Stop()
// 等待组
var wait sync.WaitGroup
defer wait.Wait()
// 结束信号通道
a := make(chan struct{})
// 发送结束信号
defer close(a)
cancel := leaf.WithCancel(c)
go func() {
start := time.Now()
// 等待结束
wait.Add(1)
defer wait.Done()
// 定时器
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
// 结束标志
for over := false; !over; {
select {
case <-a:
over = true
case <-timer.C: // 定时器结束
{
cancel()
over = true
leaf.WithValue[leaf.EndType](c, leaf.EndKey, leaf.EndTimer)
}
case m := <-ticker.C:
{
s := int(m.Sub(start).Seconds())
if _, ok := printMap[s]; ok {
//TODO: 屏幕打印
}
if to, ok := ttsMap[s]; ok {
t.Sound(to.Value)
}
}
}
}
}()
c.Next()
}
}