115 lines
2.5 KiB
Go
115 lines
2.5 KiB
Go
package chat
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
"sort"
|
|
|
|
"github.com/owncast/owncast/core/chat/events"
|
|
"github.com/owncast/owncast/models"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
var getStatus func() models.Status
|
|
|
|
func Start(getStatusFunc func() models.Status) error {
|
|
setupPersistence()
|
|
|
|
getStatus = getStatusFunc
|
|
_server = NewChat()
|
|
|
|
go _server.Run()
|
|
|
|
log.Traceln("Chat server started with max connection count of", _server.maxSocketConnectionLimit)
|
|
|
|
return nil
|
|
}
|
|
|
|
// GetClientsForUser will return chat connections that are owned by a specific user.
|
|
func GetClientsForUser(userID string) ([]*ChatClient, error) {
|
|
clients := map[string][]*ChatClient{}
|
|
|
|
for _, client := range _server.clients {
|
|
clients[client.User.Id] = append(clients[client.User.Id], client)
|
|
}
|
|
|
|
if _, exists := clients[userID]; !exists {
|
|
return nil, errors.New("no connections for user found")
|
|
}
|
|
|
|
return clients[userID], nil
|
|
}
|
|
|
|
func GetClients() []*ChatClient {
|
|
clients := []*ChatClient{}
|
|
|
|
// Convert the keyed map to a slice.
|
|
for _, client := range _server.clients {
|
|
clients = append(clients, client)
|
|
}
|
|
|
|
sort.Slice(clients, func(i, j int) bool {
|
|
return clients[i].ConnectedAt.Before(clients[j].ConnectedAt)
|
|
})
|
|
|
|
return clients
|
|
}
|
|
|
|
func SendSystemMessage(text string, ephemeral bool) error {
|
|
message := events.SystemMessageEvent{
|
|
MessageEvent: events.MessageEvent{
|
|
Body: text,
|
|
},
|
|
}
|
|
message.SetDefaults()
|
|
message.RenderBody()
|
|
|
|
if err := Broadcast(&message); err != nil {
|
|
log.Errorln("error sending system message", err)
|
|
}
|
|
|
|
if !ephemeral {
|
|
saveEvent(message.Id, "system", message.Body, message.GetMessageType(), nil, message.Timestamp)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func SendSystemAction(text string, ephemeral bool) error {
|
|
message := events.ActionEvent{
|
|
MessageEvent: events.MessageEvent{
|
|
Body: text,
|
|
},
|
|
}
|
|
|
|
message.SetDefaults()
|
|
message.RenderBody()
|
|
|
|
if err := Broadcast(&message); err != nil {
|
|
log.Errorln("error sending system chat action")
|
|
}
|
|
|
|
if !ephemeral {
|
|
saveEvent(message.Id, "action", message.Body, message.GetMessageType(), nil, message.Timestamp)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func SendAllWelcomeMessage() {
|
|
_server.sendAllWelcomeMessage()
|
|
}
|
|
|
|
func Broadcast(event events.OutboundEvent) error {
|
|
return _server.Broadcast(event.GetBroadcastPayload())
|
|
}
|
|
|
|
func HandleClientConnection(w http.ResponseWriter, r *http.Request) {
|
|
_server.HandleClientConnection(w, r)
|
|
}
|
|
|
|
// DisconnectUser will forcefully disconnect all clients belonging to a user by ID.
|
|
func DisconnectUser(userID string) {
|
|
_server.DisconnectUser(userID)
|
|
}
|