From bb17b54478273116e1f48ff53476efb9f01cde7e Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Wed, 27 Jul 2022 20:15:50 +0200 Subject: intermediate commit * use more llog * inform clients about their votes when initiating the connection * show song weights --- main.go | 50 +++++++++++++++++++++++++++++++++++++++++--------- player.go | 1 + web/client.html | 18 ++++++++++++++++-- wrms.go | 33 +++++++++++++++++++++------------ 4 files changed, 79 insertions(+), 23 deletions(-) diff --git a/main.go b/main.go index 545c3b2..4067f63 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,8 @@ import ( "log" "net/http" + "muhq.space/wrms/llog" + "github.com/google/uuid" "nhooyr.io/websocket" @@ -98,7 +100,7 @@ func playPauseHandler(w http.ResponseWriter, r *http.Request) { func wsEndpoint(w http.ResponseWriter, r *http.Request) { c, err := websocket.Accept(w, r, nil) if err != nil { - log.Println("%v", err) + log.Println(err) return } @@ -136,12 +138,42 @@ func wsEndpoint(w http.ResponseWriter, r *http.Request) { initialCmds = append(initialCmds, data) } - data, err := json.Marshal(Event{"add", wrms.Songs}) - if err != nil { - log.Fatal(err) - return + upvoted := []Song{} + downvoted := []Song{} + if len(wrms.Songs) > 0 { + data, err := json.Marshal(Event{"add", wrms.Songs}) + if err != nil { + log.Fatal(err) + return + } + initialCmds = append(initialCmds, data) + + for _, song := range wrms.Songs { + if _, ok := song.Upvotes[id.String()]; ok { + upvoted = append(upvoted, song) + } else if _, ok := song.Downvotes[id.String()]; ok { + downvoted = append(downvoted, song) + } + } + } + + if len(upvoted) > 0 { + data, err := json.Marshal(Event{"upvoted", upvoted}) + if err != nil { + log.Fatal(err) + return + } + initialCmds = append(initialCmds, data) + } + + if len(downvoted) > 0 { + data, err := json.Marshal(Event{"downvoted", downvoted}) + if err != nil { + log.Fatal(err) + return + } + initialCmds = append(initialCmds, data) } - initialCmds = append(initialCmds, data) for _, data := range initialCmds { log.Println("Sending initial cmd", string(data)) @@ -159,7 +191,7 @@ func wsEndpoint(w http.ResponseWriter, r *http.Request) { return } - log.Println(fmt.Sprintf("Sending ev %s to %s", string(data), id)) + llog.Debug(fmt.Sprintf("Sending ev %s to %s", string(data), id)) err = c.Write(ctx, websocket.MessageText, data) if err != nil { log.Println(err) @@ -182,8 +214,8 @@ func setupRoutes() { func main() { setupRoutes() - wrms.AddSong(NewDummySong("Lala", "SNFMT")) - wrms.AddSong(NewDummySong("Hobelbank", "MC Wankwichtel")) + // wrms.AddSong(NewDummySong("Lala", "SNFMT")) + // wrms.AddSong(NewDummySong("Hobelbank", "MC Wankwichtel")) log.Println(wrms) defer wrms.Close() diff --git a/player.go b/player.go index 49b6d11..91e3468 100644 --- a/player.go +++ b/player.go @@ -42,6 +42,7 @@ func (player *Player) Play(song *Song) { return } + log.Println("Start playing", song) player.Backends[song.Source].Play(song, player) } diff --git a/web/client.html b/web/client.html index 3cddb29..2ca1f0d 100644 --- a/web/client.html +++ b/web/client.html @@ -77,9 +77,10 @@ let votes = new Map(); function formatSong(song) { + let s = song.weight + ' ' if (song.artist) - return song.artist + ' - ' + song.title - return song.title + return s + song.artist + ' - ' + song.title + return s + song.title } function renderPlaylist() { @@ -148,6 +149,13 @@ renderPlaylist(); } + function handleVotes(direction, votedSongs) { + for (const song of votedSongs) { + votes.set(song.uri, direction) + } + renderPlaylist(); + } + function handleUpdate(updated) { for (const updated_song of updated) { songs[songs.findIndex(function(s) {return s.uri == updated_song.uri})] = updated_song; @@ -203,6 +211,12 @@ case "play": handlePlay(cmd.songs[0]) break; + case "upvoted": + handleVotes("up", cmd.songs) + break; + case "downvoted": + handleVotes("down", cmd.songs) + break; } }; diff --git a/wrms.go b/wrms.go index 12d7fd7..f8d0049 100644 --- a/wrms.go +++ b/wrms.go @@ -3,7 +3,8 @@ package main import ( "encoding/json" "fmt" - "log" + + "muhq.space/wrms/llog" "github.com/google/uuid" @@ -29,7 +30,7 @@ func NewSongFromJson(data []byte) (Song, error) { var s Song err := json.Unmarshal(data, &s) if err != nil { - log.Println(fmt.Sprintf("Failed to parse song data %s with %s", string(data), err)) + llog.Error(fmt.Sprintf("Failed to parse song data %s with %s", string(data), err)) return s, err } @@ -50,7 +51,7 @@ type Connection struct { } func (c *Connection) Close() { - log.Println("Closing connection %s", c.Id) + llog.Info(fmt.Sprintf("Closing connection %s", c.Id)) close(c.Events) c.C.Close(websocket.StatusNormalClosure, "") } @@ -71,13 +72,14 @@ func NewWrms() Wrms { } func (wrms *Wrms) Close() { - log.Println("Closing WRMS") + llog.Info("Closing WRMS") for _, conn := range wrms.Connections { conn.Close() } } func (wrms *Wrms) Broadcast(cmd Event) { + llog.Info(fmt.Sprintf("Broadcasting %v")) for i := 0; i < len(wrms.Connections); i++ { wrms.Connections[i].Events <- cmd } @@ -87,7 +89,7 @@ func (wrms *Wrms) AddSong(song Song) { wrms.Songs = append(wrms.Songs, song) s := &wrms.Songs[len(wrms.Songs)-1] wrms.Queue.Add(s) - log.Println(fmt.Sprintf("Added song %s (ptr=%p) to Songs", s.Uri, s)) + llog.Info(fmt.Sprintf("Added song %s (ptr=%p) to Songs", s.Uri, s)) } func (wrms *Wrms) Next() { @@ -97,7 +99,7 @@ func (wrms *Wrms) Next() { return } - wrms.CurrentSong = *next + llog.Info(fmt.Sprintf("popped next song and removing it from the song list %v", next)) for i, s := range wrms.Songs { if s.Uri == wrms.CurrentSong.Uri { @@ -106,14 +108,21 @@ func (wrms *Wrms) Next() { break } } + + wrms.CurrentSong = *next + } func (wrms *Wrms) PlayPause() { var ev Event if !wrms.Playing { if wrms.CurrentSong.Uri == "" { - log.Println("No song currently playing play the next") + llog.Info("No song currently playing play the next") wrms.Next() + if wrms.CurrentSong.Uri == "" { + llog.Info("No song left to play") + return + } } ev = Event{"play", []Song{wrms.CurrentSong}} wrms.Player.Play(&wrms.CurrentSong) @@ -134,11 +143,11 @@ func (wrms *Wrms) AdjustSongWeight(connId string, songUri string, vote string) { continue } - log.Println(fmt.Sprintf("Adjusting song %s (ptr=%p)", s.Uri, s)) + llog.Info(fmt.Sprintf("Adjusting song %s (ptr=%p)", s.Uri, s)) switch vote { case "up": if _, ok := s.Upvotes[connId]; ok { - log.Println(fmt.Sprintf("Double upvote of song %s by connections %s", songUri, connId)) + llog.Error(fmt.Sprintf("Double upvote of song %s by connections %s", songUri, connId)) return } @@ -153,7 +162,7 @@ func (wrms *Wrms) AdjustSongWeight(connId string, songUri string, vote string) { case "down": if _, ok := s.Downvotes[connId]; ok { - log.Println(fmt.Sprintf("Double downvote of song %s by connections %s", songUri, connId)) + llog.Error(fmt.Sprintf("Double downvote of song %s by connections %s", songUri, connId)) return } @@ -176,12 +185,12 @@ func (wrms *Wrms) AdjustSongWeight(connId string, songUri string, vote string) { delete(s.Upvotes, connId) s.Weight -= 1 } else { - log.Println(fmt.Sprintf("Double downvote of song %s by connections %s", songUri, connId)) + llog.Error(fmt.Sprintf("Double unvote of song %s by connections %s", songUri, connId)) return } default: - log.Fatal("invalid vote") + llog.Fatal("invalid vote") } wrms.Queue.Adjust(s) -- cgit v1.2.3