parent
5420a6e4dc
commit
217f715f23
@ -1,109 +0,0 @@
|
|||||||
package ngochess
|
|
||||||
|
|
||||||
//
|
|
||||||
//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(njson.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)
|
|
||||||
// })
|
|
||||||
//}
|
|
@ -1,168 +0,0 @@
|
|||||||
package ngochess
|
|
||||||
|
|
||||||
//
|
|
||||||
//import (
|
|
||||||
// "fmt"
|
|
||||||
// "git.noahlan.cn/noahlan/ntool-biz/nkatago/codec"
|
|
||||||
// "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/nsys/cmdn"
|
|
||||||
// "strings"
|
|
||||||
//)
|
|
||||||
//
|
|
||||||
//var (
|
|
||||||
// gtpStartupDecidedFunc cmdn.LineFunc = func(sb *strings.Builder, line string) bool {
|
|
||||||
// return strings.Contains(line, "GTP ready")
|
|
||||||
// }
|
|
||||||
// gtpEndLineDecidedFunc cmdn.LineFunc = func(sb *strings.Builder, line string) bool {
|
|
||||||
// return len(line) == 0
|
|
||||||
// }
|
|
||||||
// gtpReadIDFunc cmdn.ReadIDFunc = func(serializer ndef.Serializer, data string) (string, error) {
|
|
||||||
// return "", nil
|
|
||||||
// }
|
|
||||||
//)
|
|
||||||
//
|
|
||||||
//type GtpEngine struct {
|
|
||||||
// *KatagoEngine
|
|
||||||
//
|
|
||||||
// lastID string
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// NewGtpEngine 创建GTP引擎
|
|
||||||
//func NewGtpEngine(name string, args ...string) (*GtpEngine, error) {
|
|
||||||
// engine := &GtpEngine{KatagoEngine: &KatagoEngine{
|
|
||||||
// Processor: cmdn.NewProcessor(
|
|
||||||
// true,
|
|
||||||
// cmdn.WithSerializer(codec.NewGtpSerializer()),
|
|
||||||
// cmdn.WithStartupDecidedFunc(gtpStartupDecidedFunc),
|
|
||||||
// cmdn.WithEndLineDecidedFunc(gtpEndLineDecidedFunc),
|
|
||||||
// cmdn.WithReadIDFunc(gtpReadIDFunc),
|
|
||||||
// ),
|
|
||||||
// Name: name,
|
|
||||||
// Mode: EngineGTP,
|
|
||||||
// }}
|
|
||||||
// err := engine.Processor.Run(name, args...)
|
|
||||||
// return engine, err
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//func (eng *GtpEngine) ID(id string) {
|
|
||||||
// eng.lastID = id
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// Exec 同步方式自定义命令
|
|
||||||
//func (eng *GtpEngine) Exec(id, cmd string) (*resp.GtpResponse, error) {
|
|
||||||
// cmds := strings.Fields(cmd)
|
|
||||||
//
|
|
||||||
// ret := resp.NewGtpResponse(cmds[0])
|
|
||||||
// err := eng.Processor.ExecAsync(req.NewGtpReq(id, cmd, cmds[1:]...), func(serializer ndef.Serializer, data string) {
|
|
||||||
// ret.Err = serializer.Unmarshal([]byte(data), ret)
|
|
||||||
// })
|
|
||||||
// return ret, err
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// KnowCommand 判断命令是否支持
|
|
||||||
//func (eng *GtpEngine) KnowCommand(cmd string) bool {
|
|
||||||
// value, err := eng.Exec(eng.lastID, "known_command "+cmd)
|
|
||||||
// if err != nil {
|
|
||||||
// return false
|
|
||||||
// }
|
|
||||||
// if strings.ToLower(strings.TrimSpace(value.Content)) != "true" {
|
|
||||||
// return false
|
|
||||||
// }
|
|
||||||
// return true
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// Komi 设置贴目
|
|
||||||
//func (eng *GtpEngine) Komi(komi float64) (*resp.GtpResponse, error) {
|
|
||||||
// return eng.Exec(eng.lastID, fmt.Sprintf("komi %v", komi))
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// BoardSize 设置棋盘大小
|
|
||||||
//func (eng *GtpEngine) BoardSize(size int) (*resp.GtpResponse, error) {
|
|
||||||
// return eng.Exec(eng.lastID, fmt.Sprintf("boardsize %v", size))
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// GenMove AI落子
|
|
||||||
//func (eng *GtpEngine) GenMove(color string) (*resp.GtpResponse, error) {
|
|
||||||
// color = strings.ToUpper(color)
|
|
||||||
// command := "genmove " + color
|
|
||||||
// return eng.Exec(eng.lastID, command)
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// Play 手工落子
|
|
||||||
//func (eng *GtpEngine) Play(color, coor string) (*resp.GtpResponse, error) {
|
|
||||||
// color = strings.ToUpper(color)
|
|
||||||
// return eng.Exec(eng.lastID, fmt.Sprintf("play %s %s", color, coor))
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// LoadSgf 加载SGF文件
|
|
||||||
//func (eng *GtpEngine) LoadSgf(file string) (*resp.GtpResponse, error) {
|
|
||||||
// command := fmt.Sprintf("loadsgf %s", file)
|
|
||||||
// return eng.Exec(eng.lastID, command)
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// FinalStatusList 获取当前盘面形势判断
|
|
||||||
//func (eng *GtpEngine) FinalStatusList(cmd string) (*resp.GtpResponse, error) {
|
|
||||||
// command := fmt.Sprintf("final_status_list %s", cmd)
|
|
||||||
// return eng.Exec(eng.lastID, command)
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// SetLevel 设置AI级别
|
|
||||||
//func (eng *GtpEngine) SetLevel(seed int) (*resp.GtpResponse, error) {
|
|
||||||
// command := fmt.Sprintf("level %d", seed)
|
|
||||||
// return eng.Exec(eng.lastID, command)
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// SetRandomSeed 设置AI随机数
|
|
||||||
//func (eng *GtpEngine) SetRandomSeed(seed int) (*resp.GtpResponse, error) {
|
|
||||||
// command := fmt.Sprintf("set_random_seed %d", seed)
|
|
||||||
// return eng.Exec(eng.lastID, command)
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// ShowBoard 显示棋盘
|
|
||||||
//func (eng *GtpEngine) ShowBoard() (*resp.GtpResponse, error) {
|
|
||||||
// return eng.Exec(eng.lastID, "showboard")
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// ClearBoard 清空棋盘
|
|
||||||
//func (eng *GtpEngine) ClearBoard() (*resp.GtpResponse, error) {
|
|
||||||
// return eng.Exec(eng.lastID, "clear_board")
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// PrintSgf 打印SGF
|
|
||||||
//func (eng *GtpEngine) PrintSgf() (*resp.GtpResponse, error) {
|
|
||||||
// return eng.Exec(eng.lastID, "printsgf")
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// TimeSetting 设置时间规则
|
|
||||||
//func (eng *GtpEngine) TimeSetting(baseTime, byoTime, byoStones int) (*resp.GtpResponse, error) {
|
|
||||||
// return eng.Exec(eng.lastID, fmt.Sprintf("time_settings %d %d %d", baseTime, byoTime, byoStones))
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// KGSTimeSetting 设置KGS time
|
|
||||||
//func (eng *GtpEngine) KGSTimeSetting(mainTime, readTime, readLimit int) (*resp.GtpResponse, error) {
|
|
||||||
// return eng.Exec(eng.lastID, fmt.Sprintf("kgs-time_settings byoyomi %d %d %d", mainTime, readTime, readLimit))
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// FinalScore 获取结果
|
|
||||||
//func (eng *GtpEngine) FinalScore() (*resp.GtpResponse, error) {
|
|
||||||
// return eng.Exec(eng.lastID, "final_score")
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// Undo 悔棋
|
|
||||||
//func (eng *GtpEngine) Undo() (*resp.GtpResponse, error) {
|
|
||||||
// return eng.Exec(eng.lastID, "undo")
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// TimeLeft 设置时间
|
|
||||||
//func (eng *GtpEngine) TimeLeft(color string, mainTime, stones int) (*resp.GtpResponse, error) {
|
|
||||||
// return eng.Exec(eng.lastID, fmt.Sprintf("time_left %s %d %d", color, mainTime, stones))
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// Quit 退出
|
|
||||||
//func (eng *GtpEngine) Quit() (*resp.GtpResponse, error) {
|
|
||||||
// r, err := eng.Exec(eng.lastID, "quit")
|
|
||||||
// err = eng.Processor.Stop()
|
|
||||||
// return r, err
|
|
||||||
//}
|
|
@ -0,0 +1,51 @@
|
|||||||
|
package katago
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"git.noahlan.cn/noahlan/ntool/njson"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Serializer struct {
|
||||||
|
contentBuf *bytes.Buffer
|
||||||
|
|
||||||
|
lastJson string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewSerializer() *Serializer {
|
||||||
|
ret := &Serializer{
|
||||||
|
contentBuf: bytes.NewBuffer([]byte{}),
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Serializer) reset() {
|
||||||
|
s.contentBuf.Reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Serializer) LastJson() string {
|
||||||
|
return s.lastJson
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Serializer) Marshal(v any) ([]byte, error) {
|
||||||
|
return njson.Marshal(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Serializer) Unmarshal(line string, v any) (bool, error) {
|
||||||
|
s.contentBuf.WriteString(line)
|
||||||
|
|
||||||
|
if json.Valid(s.contentBuf.Bytes()) {
|
||||||
|
defer func() {
|
||||||
|
s.lastJson = s.contentBuf.String()
|
||||||
|
s.reset()
|
||||||
|
}()
|
||||||
|
|
||||||
|
err := njson.Unmarshal(s.contentBuf.Bytes(), v)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
} else {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue