49 lines
883 B
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)
|
|
}
|
|
}
|
|
}
|