You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ntool-biz/nkatago/engine_analysis.go

120 lines
3.8 KiB
Go

package nkatago
import (
"git.noahlan.cn/noahlan/ntool-biz/nkatago/req"
"git.noahlan.cn/noahlan/ntool-biz/nkatago/resp"
"git.noahlan.cn/noahlan/ntool/ndef"
"git.noahlan.cn/noahlan/ntool/ngo/codec"
"git.noahlan.cn/noahlan/ntool/nrandom"
"git.noahlan.cn/noahlan/ntool/nstr"
"git.noahlan.cn/noahlan/ntool/nsys/cmdn"
"strings"
)
var (
analStartupDecidedFunc cmdn.LineFunc = func(sb *strings.Builder, line string) bool {
return strings.Contains(line, "Started, ready to begin handling requests")
}
analEndLineDecidedFunc cmdn.LineFunc = func(sb *strings.Builder, line string) bool {
return nstr.IsJSON(sb.String())
}
analReadIDFunc cmdn.ReadIDFunc = func(serializer ndef.Serializer, data string) (string, error) {
var s struct {
ID string `json:"id"`
}
err := serializer.Unmarshal([]byte(data), &s)
if err != nil {
return "", err
}
return s.ID, nil
}
)
type AnalysisEngine struct {
*KatagoEngine
}
// NewAnalysisEngine 创建Analysis引擎
func NewAnalysisEngine(name string, args ...string) (*AnalysisEngine, error) {
engine := &AnalysisEngine{KatagoEngine: &KatagoEngine{
Processor: cmdn.NewProcessor(
false,
cmdn.WithSerializer(codec.NewJsonSerializer()),
cmdn.WithStartupDecidedFunc(analStartupDecidedFunc),
cmdn.WithEndLineDecidedFunc(analEndLineDecidedFunc),
cmdn.WithReadIDFunc(analReadIDFunc),
),
Name: name,
Mode: EngineAnalysis,
}}
err := engine.Processor.Run(name, args...)
return engine, err
}
// Query 分析查询
func (eng *AnalysisEngine) Query(req *req.AnalQueryReq, callback func(queryResp *resp.AnalQueryResp)) error {
if len(req.ID) == 0 {
req.ID = nrandom.SnowflakeIdStr()
}
return eng.Processor.Exec(req, func(serializer ndef.Serializer, data string) {
var tmp resp.AnalQueryResp
tmp.Err = serializer.Unmarshal([]byte(data), &tmp)
callback(&tmp)
})
}
// QueryVersion 查询版本号
func (eng *AnalysisEngine) QueryVersion(callback func(versionResp *resp.AnalQueryVersionResp)) error {
return eng.Processor.Exec(&req.AnalQueryActionReq{
ID: nrandom.SnowflakeIdStr(),
Action: req.AnalActionQueryVersion,
}, func(serializer ndef.Serializer, data string) {
var tmp resp.AnalQueryVersionResp
tmp.Err = serializer.Unmarshal([]byte(data), &tmp)
callback(&tmp)
})
}
// ClearCache 清除缓存
func (eng *AnalysisEngine) ClearCache(callback func(cacheResp *resp.AnalClearCacheResp)) error {
return eng.Processor.Exec(&req.AnalQueryActionReq{
ID: nrandom.SnowflakeIdStr(),
Action: req.AnalActionClearCache,
}, func(serializer ndef.Serializer, data string) {
var tmp resp.AnalClearCacheResp
tmp.Err = serializer.Unmarshal([]byte(data), &tmp)
callback(&tmp)
})
}
// Terminate 终止某次分析
// terminateId: 分析轮次ID
// turnNumbers: 需要终止分析的回合数(手数),可空:所有回合
func (eng *AnalysisEngine) Terminate(terminateId string, turnNumbers []int32, callback func(terminateResp *resp.AnalTerminateResp)) error {
return eng.Processor.Exec(&req.AnalQueryActionReq{
ID: nrandom.SnowflakeIdStr(),
Action: req.AnalActionTerminate,
TerminateId: terminateId,
TurnNumbers: turnNumbers,
}, func(serializer ndef.Serializer, data string) {
var tmp resp.AnalTerminateResp
tmp.Err = serializer.Unmarshal([]byte(data), &tmp)
callback(&tmp)
})
}
// TerminateAll 终止所有分析
// turnNumbers: 需要终止所有分析轮次的回合数,可空:所有回合
func (eng *AnalysisEngine) TerminateAll(turnNumbers []int32, callback func(allResp *resp.AnalTerminateAllResp)) error {
return eng.Processor.Exec(&req.AnalQueryActionReq{
ID: nrandom.SnowflakeIdStr(),
Action: req.AnalActionTerminateAll,
TurnNumbers: turnNumbers,
}, func(serializer ndef.Serializer, data string) {
var tmp resp.AnalTerminateAllResp
tmp.Err = serializer.Unmarshal([]byte(data), &tmp)
callback(&tmp)
})
}