summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/chat.go30
-rw-r--r--server/player.go7
-rw-r--r--server/server.go24
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