gommunicator/internal/communicator/communicator.go

49 lines
883 B
Go

package communicator
import (
"fmt"
"log/slog"
"gommunicator/internal/entity"
)
type Client interface {
Send(msg string) error
Username() string
}
type Communicator struct {
log *slog.Logger
clients []Client
}
func New() *Communicator {
return &Communicator{
clients: make([]Client, 0),
}
}
func (c *Communicator) WithDefaultServerClient() *Communicator {
client := entity.NewServerClient()
c.clients = append(c.clients, client)
return c
}
func (c *Communicator) AddClient(client Client) {
c.clients = append(c.clients, client)
}
func (c *Communicator) SendMsg(msg, fromUsername string) {
// format
msg = fmt.Sprintf("%s > %s", fromUsername, msg)
// send
for _, client := range c.clients {
if fromUsername == client.Username() {
continue
}
if err := client.Send(msg); err != nil {
c.log.Error("failed to send message", "err", err)
}
}
}