Noah Petherbridge
4f93c27651
* Reworked full screen CSS layout for the chat.html, still using Bulma components with some custom CSS Grid. * Duplicate username handling: server can push a new username to change the client's selection. * Who List sync between clients. * Local video casting works so far - plays back your camera in the local feed. Your video broadcasting boolean is synced to backend, which lights up the video button in the Who List.
78 lines
1.6 KiB
Go
78 lines
1.6 KiB
Go
package barertc
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"git.kirsle.net/apps/barertc/pkg/log"
|
|
)
|
|
|
|
// OnLogin handles "login" actions from the client.
|
|
func (s *Server) OnLogin(sub *Subscriber, msg Message) {
|
|
// Ensure the username is unique, or rename it.
|
|
var duplicate bool
|
|
for other := range s.IterSubscribers() {
|
|
if other.ID != sub.ID && other.Username == msg.Username {
|
|
duplicate = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if duplicate {
|
|
// Give them one that is unique.
|
|
msg.Username = fmt.Sprintf("%s %d",
|
|
msg.Username,
|
|
time.Now().Nanosecond(),
|
|
)
|
|
}
|
|
|
|
// Use their username.
|
|
sub.Username = msg.Username
|
|
log.Debug("OnLogin: %s joins the room", sub.Username)
|
|
|
|
// Tell everyone they joined.
|
|
s.Broadcast(Message{
|
|
Action: ActionPresence,
|
|
Username: msg.Username,
|
|
Message: "has joined the room!",
|
|
})
|
|
|
|
// Send the user back their settings.
|
|
sub.SendMe()
|
|
|
|
// Send the WhoList to everybody.
|
|
s.SendWhoList()
|
|
}
|
|
|
|
// OnMessage handles a chat message posted by the user.
|
|
func (s *Server) OnMessage(sub *Subscriber, msg Message) {
|
|
log.Info("[%s] %s", sub.Username, msg.Message)
|
|
if sub.Username == "" {
|
|
sub.SendJSON(Message{
|
|
Action: ActionMessage,
|
|
Username: "ChatServer",
|
|
Message: "You must log in first.",
|
|
})
|
|
return
|
|
}
|
|
|
|
// Broadcast a chat message to the room.
|
|
s.Broadcast(Message{
|
|
Action: ActionMessage,
|
|
Username: sub.Username,
|
|
Message: msg.Message,
|
|
})
|
|
}
|
|
|
|
// OnMe handles current user state updates.
|
|
func (s *Server) OnMe(sub *Subscriber, msg Message) {
|
|
if msg.VideoActive {
|
|
log.Debug("User %s turns on their video feed", sub.Username)
|
|
}
|
|
|
|
sub.VideoActive = msg.VideoActive
|
|
|
|
// Sync the WhoList to everybody.
|
|
s.SendWhoList()
|
|
}
|