package messages import ( "time" "github.com/diamondburned/cchat" ) // ServerMessage combines Server and ServerMessage from cchat. type ServerMessage interface { cchat.Server cchat.Messenger } type state struct { session cchat.Session server cchat.Server actioner cchat.Actioner backlogger cchat.Backlogger current func() // stop callback author string lastBacklogged time.Time } func (s *state) Reset() { // If we still have the last server to leave, then leave it. if s.current != nil { s.current() } // Lazy way to reset the state. *s = state{} } func (s *state) hasActions() bool { return s.actioner != nil } // SessionID returns the session ID, or an empty string if there's no session. func (s *state) SessionID() string { if s.session != nil { return s.session.ID() } return "" } // ServerID returns the server ID, or an empty string if there's no server. func (s *state) ServerID() string { if s.server != nil { return s.server.ID() } return "" } const backloggingFreq = time.Second * 3 // Backlogger returns the backlogger instance if it's allowed to fetch more // backlogs. func (s *state) Backlogger() cchat.Backlogger { if s.backlogger == nil || s.current == nil { return nil } var now = time.Now() if s.lastBacklogged.Add(backloggingFreq).After(now) { return nil } s.lastBacklogged = now return s.backlogger } func (s *state) bind(session cchat.Session, server cchat.Server, msgr cchat.Messenger) { s.session = session s.server = server s.actioner = msgr.AsActioner() s.backlogger = msgr.AsBacklogger() } func (s *state) setcurrent(fn func()) { s.current = fn }