diff options
| author | raven <citrons@mondecitronne.com> | 2026-03-24 18:34:08 -0500 |
|---|---|---|
| committer | raven <citrons@mondecitronne.com> | 2026-03-24 18:34:08 -0500 |
| commit | 3f5fefa2012b5b8c0b9da2886b46e602d3460712 (patch) | |
| tree | 6459d2d5bdb39e68e7810177016d8cde1499baed /server | |
| parent | a29c68960998260cb676d97ea1c0f6514c50ec39 (diff) | |
gameChat actor
Diffstat (limited to 'server')
| -rw-r--r-- | server/chat.go | 30 | ||||
| -rw-r--r-- | server/player.go | 7 | ||||
| -rw-r--r-- | server/server.go | 24 |
3 files changed, 41 insertions, 20 deletions
diff --git a/server/chat.go b/server/chat.go index 4206d66..8275c59 100644 --- a/server/chat.go +++ b/server/chat.go @@ -3,8 +3,38 @@ package server import ( "strings" "git.citrons.xyz/metronode/classic" + "git.citrons.xyz/metronode/phony" ) +type gameChat struct { + phony.Inbox + members map[chatListener]bool +} + +func (c *gameChat) AddMember(from phony.Actor, m chatListener) { + c.Act(from, func() { + c.members[m] = true + }) +} + +func (c *gameChat) RemoveMember(from phony.Actor, m chatListener) { + c.Act(from, func() { + delete(c.members, m) + }) +} + +func (c *gameChat) Send(from phony.Actor, messageSender any, message string) { + c.Act(from, func() { + for m := range c.members { + m.OnChatMessage(c, messageSender, message) + } + }) +} + +type chatListener interface { + OnChatMessage(from *gameChat, messageSender any, message string) +} + func processChatMessage(message string) []classic.Packet { var ( packets []classic.Packet diff --git a/server/player.go b/server/player.go index ab62d4d..c4fac5c 100644 --- a/server/player.go +++ b/server/player.go @@ -150,7 +150,8 @@ func (p *player) handleChat(message string) { return } if !isCmd { - p.server.OnPlayerMessage(p, p.name, text) + message = fmt.Sprintf("&7<&b%s&7>&f %s", p.name, message) + p.server.Chat.Send(p, p, message) } else { p.server.ExecuteCommand(p, p.state.Auth, text) } @@ -235,8 +236,8 @@ func (p *player) SendMessage(from phony.Actor, message string) { }) } -func (p *player) OnPlayerMessage(from *Server, name string, message string) { - p.SendMessage(from, fmt.Sprintf("&7<&b%s&7>&f %s", name, message)) +func (p *player) OnChatMessage(from *gameChat, sender any, message string) { + p.SendMessage(from, message) } func (p *player) OnCommandOutput(from *Server, output string) { diff --git a/server/server.go b/server/server.go index d6e39f2..557abac 100644 --- a/server/server.go +++ b/server/server.go @@ -41,6 +41,7 @@ type Server struct { phony.Inbox worldState info ServerInfo + Chat gameChat clients map[*client]bool players map[string]*player listIds map[listId]string @@ -73,6 +74,7 @@ func NewServer(info ServerInfo) *Server { players: make(map[string]*player), listIds: make(map[listId]string), playerList: make(map[string]listEntry), + Chat: gameChat {members: make(map[chatListener]bool)}, levels: make(map[levelId]*level), stopped: make(chan struct{}), } @@ -219,18 +221,11 @@ func (s *Server) OnDisconnect(cl *client) { func (s *Server) OnLeave(pl *player, username string) { s.Act(pl, func() { - s.Broadcast(nil, fmt.Sprintf("&e%s has left", username)) + s.Chat.Send(s, nil, fmt.Sprintf("&e%s has left", username)) if s.players[username] == pl { delete(s.players, username) s.removeListEntry(username) - } - }) -} - -func (s *Server) OnPlayerMessage(from *player, name string, message string) { - s.Act(from, func() { - for _, player := range s.players { - player.OnPlayerMessage(s, name, message) + s.Chat.RemoveMember(s, pl) } }) } @@ -241,7 +236,7 @@ func (s *Server) OnLoadError(from phony.Actor, err error) { func (s *Server) OnSaveError(from phony.Actor, err error) { log.Printf("error saving world: %s", err) - s.Broadcast(from, fmt.Sprintf("&4Error saving world: %s", err)) + s.Chat.Send(s, nil, fmt.Sprintf("&4Error saving world: %s", err)) } func (s *Server) Tick() { @@ -270,6 +265,7 @@ func (s *Server) newPlayer( for _, entry := range s.playerList { pl.OnAddListEntry(s, entry) } + s.Chat.AddMember(s, pl) return pl } @@ -328,7 +324,7 @@ func (s *Server) NewPlayer( cl.Disconnect(s, banReason) return } - s.Broadcast(nil, fmt.Sprintf("&e%s has joined", name)) + s.Chat.Send(s, nil, fmt.Sprintf("&e%s has joined", name)) log.Printf("%s has joined", name) if s.players[name] != nil { s.players[name].Act(s, func() { @@ -404,12 +400,6 @@ func (s *Server) GetPlayer( }) } -func (s *Server) Broadcast(from phony.Actor, message string) { - for _, player := range s.players { - player.SendMessage(s, message) - } -} - type client struct { phony.Inbox server *Server |
