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) } } }