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