owncast/core/chat/chat.go
gingervitis 8a74af202d
Update chat message visibility for moderation (#524)
* update message viz in db

* create admin endpoint to update message visibility

* convert UpdateMessageVisibility api to take in an array of IDs to change visibility on instead

* Support requesting filtered or unfiltered chat messages

* Handle UPDATE chat events on front and backend for toggling messages

* Return entire message with UPDATE events

* Remove the UPDATE message type

* Revert "Remove the UPDATE message type"

This reverts commit 3a83df3d492f7ecf2bab65e845aa2b0365d3a7f6.

* update -> visibility update

* completely remove messages when they turn hidden on VISIBILITY-UPDATEs, and insert them if they turn visible

* Explicitly set visibility

* Fix multi-id sql updates

* increate scroll buffer a bit so chat scrolls when new large messages come in

* Add automated test around chat moderation

* Add new chat admin APIs to api spec

* Commit updated API documentation

Co-authored-by: Gabe Kangas <gabek@real-ity.com>
Co-authored-by: Owncast <owncast@owncast.online>
2020-12-29 13:35:33 -08:00

79 lines
1.4 KiB
Go

package chat
import (
"errors"
"time"
"github.com/owncast/owncast/models"
)
// Setup sets up the chat server.
func Setup(listener models.ChatListener) {
setupPersistence()
clients := make(map[string]*Client)
addCh := make(chan *Client)
delCh := make(chan *Client)
sendAllCh := make(chan models.ChatEvent)
pingCh := make(chan models.PingMessage)
doneCh := make(chan bool)
errCh := make(chan error)
_server = &server{
clients,
"/entry", //hardcoded due to the UI requiring this and it is not configurable
listener,
addCh,
delCh,
sendAllCh,
pingCh,
doneCh,
errCh,
}
}
// Start starts the chat server.
func Start() error {
if _server == nil {
return errors.New("chat server is nil")
}
ticker := time.NewTicker(30 * time.Second)
go func() {
for range ticker.C {
_server.ping()
}
}()
_server.Listen()
return errors.New("chat server failed to start")
}
// SendMessage sends a message to all.
func SendMessage(message models.ChatEvent) {
if _server == nil {
return
}
_server.SendToAll(message)
}
// GetMessages gets all of the messages.
func GetMessages(filtered bool) []models.ChatEvent {
if _server == nil {
return []models.ChatEvent{}
}
return getChatHistory(filtered)
}
func GetClient(clientID string) *Client {
for _, client := range _server.Clients {
if client.ClientID == clientID {
return client
}
}
return nil
}