package lib import ( "bytes" "fmt" "sync" "github.com/sirupsen/logrus" ) type myAI struct { robots []*Robot scenes []*scene callers []ICaller tickets Tickets //票池 robotCount uint32 //机器人数量 lock sync.Mutex // } func NewAI(aip AIParam) (*myAI, error) { logrus.Debug("创建AI") if err := aip.Check(); err != nil { return nil, err } ai := &myAI{ scenes: make([]*scene, 0), robotCount: aip.RobotCount, } if err := ai.init(); err != nil { return nil, err } return ai, nil } func (m *myAI) init() error { var buf bytes.Buffer buf.WriteString("初始化AI") tickets, err := NewTickets(m.robotCount) if err != nil { return err } m.tickets = tickets buf.WriteString(fmt.Sprintf("完成 机器人数量:%d", m.robotCount)) logrus.Debug(buf.String()) return nil } //启动时载入所有Caller func (m *myAI) LoadCallers() []ICaller { return m.callers } // 初始化caller func (m *myAI) InitCaller(callers ...ICaller) { m.callers = append(m.callers, callers...) } // 加入机器人 func (m *myAI) AddRobot(scene *scene) { // robot := NewRobot() robot.SelScene(scene) m.robots = append(m.robots, robot) } // 获取场景下的机器人 func (m *myAI) GetRobots(sceneName string) (robots []*Robot) { for _, robot := range m.robots { scene := robot.GetCurrentScene() if scene != nil && scene.Name == sceneName { robots = append(robots, robot) } } return } func (m *myAI) CurrentScene() *scene { for _, v := range m.scenes { if v.status == STATUS_ENABLE { return v } } return nil } func (m *myAI) appendRobot(robot *Robot) { defer m.lock.Unlock() m.lock.Lock() m.robots = append(m.robots, robot) } func (m *myAI) Start() bool { if len(m.scenes) == 0 { logrus.Warn("还未设置场景") return false } // 只有一个场景是启用状态,所有启动的机器人使用一个场景 scene := m.CurrentScene() if scene == nil { logrus.Warn("至少要启用一个场景") return false } // i := uint32(0); i < m.robotCount; i++ go func() { for { m.tickets.Take() go func() { // m.AddRobot(scene) robot := NewRobot() robot.SelScene(scene) m.appendRobot(robot) robot.Start() }() } }() return true } func (m *myAI) Stop() { } func (m *myAI) ShowResult() { }