owncast/webserver/handlers/moderation/moderation.go

76 lines
1.8 KiB
Go

package moderation
import (
"encoding/json"
"net/http"
"strings"
"time"
"github.com/owncast/owncast/core/chat"
"github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/userrepository"
"github.com/owncast/owncast/webserver/utils"
log "github.com/sirupsen/logrus"
)
// GetUserDetails returns the details of a chat user for moderators.
func GetUserDetails(w http.ResponseWriter, r *http.Request) {
type connectedClient struct {
ConnectedAt time.Time `json:"connectedAt"`
UserAgent string `json:"userAgent"`
Geo string `json:"geo,omitempty"`
Id uint `json:"id"`
MessageCount int `json:"messageCount"`
}
type response struct {
User *models.User `json:"user"`
ConnectedClients []connectedClient `json:"connectedClients"`
Messages []events.UserMessageEvent `json:"messages"`
}
pathComponents := strings.Split(r.URL.Path, "/")
uid := pathComponents[len(pathComponents)-1]
userRepository := userrepository.Get()
u := userRepository.GetUserByID(uid)
if u == nil {
w.WriteHeader(http.StatusNotFound)
return
}
c, _ := chat.GetClientsForUser(uid)
clients := make([]connectedClient, len(c))
for i, c := range c {
client := connectedClient{
Id: c.Id,
MessageCount: c.MessageCount,
UserAgent: c.UserAgent,
ConnectedAt: c.ConnectedAt,
}
if c.Geo != nil {
client.Geo = c.Geo.CountryCode
}
clients[i] = client
}
messages, err := chat.GetMessagesFromUser(uid)
if err != nil {
log.Errorln(err)
}
res := response{
User: u,
ConnectedClients: clients,
Messages: messages,
}
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(res); err != nil {
utils.InternalErrorHandler(w, err)
}
}