package mail import ( "f1-game/internal/event" nameActor "f1-game/internal/name/actor" nameEvent "f1-game/internal/name/event" nameRemote "f1-game/internal/name/remote" "f1-game/internal/sessions" cstring "github.com/cherry-game/cherry/extend/string" cfacade "github.com/cherry-game/cherry/facade" clog "github.com/cherry-game/cherry/logger" cactor "github.com/cherry-game/cherry/net/actor" ) type actor struct { cactor.Base workerSize int } func NewActor(workerSize int) *actor { if workerSize < 1 { workerSize = 1 } return &actor{ workerSize: workerSize, } } func (p *actor) AliasID() string { return nameActor.Mail } func (p *actor) OnInit() { // 预先创建子actor for i := range p.workerSize { childID := cstring.ToString(i) childActor := &actorMail{} p.Child().Create(childID, childActor) } p.Event().Register(nameEvent.Player_Login, p.onLoginEvent) } func (p *actor) OnLocalReceived(m *cfacade.Message) (next bool, invoke bool) { playerID := m.Session.GetInt(sessions.PlayerID) childID := cstring.ToString(playerID % p.workerSize) if childActor, found := p.Child().Get(childID); found { childActor.PostLocal(m) } return false, false } func (p *actor) OnFindChild(m *cfacade.Message) (cfacade.IActor, bool) { playerID, ok := cstring.ToInt(m.TargetPath().ChildID, 0) if playerID < 1 || !ok { clog.Warnf("Target child ID error path = %s", m.TargetPath()) return nil, false } childID := cstring.ToString(playerID % p.workerSize) return p.Child().Get(childID) } // onLoginEvent 每次登录检查是否有新的邮件模板 func (p *actor) onLoginEvent(e cfacade.IEventData) { evt, ok := e.(*event.PlayerLogin) if !ok { return } // 每次登录时,检查邮件模板 targetPath := p.NewChildPath(nameActor.Mail, evt.UniqueID()) p.Call(targetPath, nameRemote.Mail_OnLogin, evt) }