package state import "path/filepath" type State struct { banned map[string]string // IP -> session ID (that banned it) locked map[string]string // resource name -> session ID (that locked it) fileTransferEnabled bool fileTransferPath string // path where files are located } func New(fileTransferEnabled bool, fileTransferPath string) *State { return &State{ banned: make(map[string]string), locked: make(map[string]string), fileTransferEnabled: fileTransferEnabled, fileTransferPath: fileTransferPath, } } // Ban func (s *State) Ban(ip, id string) { s.banned[ip] = id } func (s *State) Unban(ip string) { delete(s.banned, ip) } func (s *State) IsBanned(ip string) bool { _, ok := s.banned[ip] return ok } func (s *State) GetBanned(ip string) (string, bool) { id, ok := s.banned[ip] return id, ok } func (s *State) AllBanned() map[string]string { return s.banned } // Lock func (s *State) Lock(resource, id string) { s.locked[resource] = id } func (s *State) Unlock(resource string) { delete(s.locked, resource) } func (s *State) IsLocked(resource string) bool { _, ok := s.locked[resource] return ok } func (s *State) GetLocked(resource string) (string, bool) { id, ok := s.locked[resource] return id, ok } func (s *State) AllLocked() map[string]string { return s.locked } // File transfer func (s *State) FileTransferPath(filename string) string { if filename == "" { return s.fileTransferPath } cleanPath := filepath.Clean(filename) return filepath.Join(s.fileTransferPath, cleanPath) } func (s *State) FileTransferEnabled() bool { return s.fileTransferEnabled }