Skip to content

Commit

Permalink
Small player progress bar
Browse files Browse the repository at this point in the history
  • Loading branch information
Depado committed Nov 14, 2020
1 parent 4c2751b commit c6810fd
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 29 deletions.
25 changes: 15 additions & 10 deletions commands/player.go
Original file line number Diff line number Diff line change
Expand Up @@ -204,19 +204,18 @@ func (c *np) Handler(s *discordgo.Session, m *discordgo.Message, args []string)
}
return
}
t := c.Player.Queue.Get()
if t == nil {

short := true
if len(args) > 0 && (args[0] == "full" || args[0] == "f") {
short = false
}

e := c.Player.GenerateNowPlayingEmbed(short)
if e == nil {
if err := message.SendTimedReply(s, m, "", "No track is currently playing", "", 5*time.Second); err != nil {
c.log.Err(err).Msg("unable to send timed reply")
}
}

e := t.Embed()
e.Footer = &discordgo.MessageEmbedFooter{
Text: fmt.Sprintf(
"%d tracks left in queue - %s",
c.Player.Queue.Len(), c.Player.Queue.DurationString(),
),
return
}

if _, err := s.ChannelMessageSendEmbed(m.ChannelID, e); err != nil {
Expand All @@ -241,6 +240,12 @@ func NewNowPlayingCommand(p *player.Player, log *zerolog.Logger) Command {
ShortDesc: "Display the currently playing track",
Description: "This command displays the track that is currently " +
"being played. This command has no effect if the player isn't running.",
Examples: []Example{
{"nowplaying", "Display the current track"},
{"np", "Short notation"},
{"nowplaying full", "Display the current track with all the info"},
{"np f", "Short notation"},
},
},
Player: p,
log: log.With().Str("command", cmd).Logger(),
Expand Down
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ require (
github.com/bwmarrin/discordgo v0.22.0
github.com/fsnotify/fsnotify v1.4.9 // indirect
github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026
github.com/jonas747/dca v0.0.0-20200609191102-fe85ccf0947a
github.com/jonas747/dca v0.0.0-20201113050843-65838623978b
github.com/jonas747/ogg v0.0.0-20161220051205-b4f6f4cf3757 // indirect
github.com/magiconair/properties v1.8.4 // indirect
github.com/mitchellh/mapstructure v1.3.3 // indirect
Expand All @@ -23,7 +23,7 @@ require (
golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9 // indirect
golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b // indirect
golang.org/x/sys v0.0.0-20201112073958-5cba982894dd // indirect
golang.org/x/sys v0.0.0-20201113233024-12cec1faf1ba // indirect
golang.org/x/text v0.3.4 // indirect
golang.org/x/tools v0.0.0-20201105001634-bc3cf281b174 // indirect
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
Expand Down
12 changes: 4 additions & 8 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,8 @@ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NH
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jarcoal/httpmock v1.0.6 h1:e81vOSexXU3mJuJ4l//geOmKIt+Vkxerk1feQBC8D0g=
github.com/jarcoal/httpmock v1.0.6/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik=
github.com/jonas747/dca v0.0.0-20200609191102-fe85ccf0947a h1:BBUmSsuZyaMRk7YMai5wykjNAEg0ZLnWSKX20aSa81U=
github.com/jonas747/dca v0.0.0-20200609191102-fe85ccf0947a/go.mod h1:rxjYX9OJU81unMxQDHChU/lAiOhlY9MV+faPX/NmwLk=
github.com/jonas747/dca v0.0.0-20201113050843-65838623978b h1:RChv7o5foFb4oJzQ61Tk+FZf5hHQLmCYFg5qC/PwPQs=
github.com/jonas747/dca v0.0.0-20201113050843-65838623978b/go.mod h1:rxjYX9OJU81unMxQDHChU/lAiOhlY9MV+faPX/NmwLk=
github.com/jonas747/ogg v0.0.0-20161220051205-b4f6f4cf3757 h1:Kyv+zTfWIGRNaz/4+lS+CxvuKVZSKFz/6G8E3BKKBRs=
github.com/jonas747/ogg v0.0.0-20161220051205-b4f6f4cf3757/go.mod h1:cZnNmdLiLpihzgIVqiaQppi9Ts3D4qF/M45//yW35nI=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
Expand Down Expand Up @@ -240,8 +240,6 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E=
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9 h1:umElSU9WZirRdgu2yFHY0ayQkEnKiOC1TtM3fWXFnoU=
golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
Expand Down Expand Up @@ -312,10 +310,8 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201107080550-4d91cf3a1aaf h1:kt3wY1Lu5MJAnKTfoMR52Cu4gwvna4VTzNOiT8tY73s=
golang.org/x/sys v0.0.0-20201107080550-4d91cf3a1aaf/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201112073958-5cba982894dd h1:5CtCZbICpIOFdgO940moixOPjc0178IU44m4EjOO5IY=
golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201113233024-12cec1faf1ba h1:xmhUJGQGbxlod18iJGqVEp9cHIPLl7QiX2aA3to708s=
golang.org/x/sys v0.0.0-20201113233024-12cec1faf1ba/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
Expand Down
41 changes: 35 additions & 6 deletions player/display.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,33 @@ package player

import (
"fmt"
"time"

"github.com/bwmarrin/discordgo"
)

func (p *Player) GenerateNowPlayingEmbed() *discordgo.MessageEmbed {
func fmtDuration(d time.Duration) string {
d = d.Round(time.Second)
h := d / time.Hour
d -= h * time.Hour
m := d / time.Minute
d -= m * time.Minute
s := d / time.Second
if h > 0 {
return fmt.Sprintf("%02d:%02d:%02d", h, m, s)
}
return fmt.Sprintf("%02d:%02d", m, s)
}

func (p *Player) GeneratePlayerString(dur time.Duration) string {
player := "--------------------"
pb := p.stream.PlaybackPosition()
pos := int(pb*100/dur) * len(player) / 100
play := player[:pos] + "●" + player[pos:]
return fmt.Sprintf("%s %s %s", fmtDuration(pb), play, fmtDuration(dur))
}

func (p *Player) GenerateNowPlayingEmbed(short bool) *discordgo.MessageEmbed {
if !p.State.Playing {
return nil
}
Expand All @@ -16,12 +38,19 @@ func (p *Player) GenerateNowPlayingEmbed() *discordgo.MessageEmbed {
return nil
}

tot := time.Duration(t.Duration()) * time.Millisecond
e := t.Embed()
e.Footer = &discordgo.MessageEmbedFooter{
Text: fmt.Sprintf(
"%d tracks left in queue - %s",
p.Queue.Len(), p.Queue.DurationString(),
),
if short {
e.Fields = nil
e.Description = p.GeneratePlayerString(tot)
} else {
e.Footer = &discordgo.MessageEmbedFooter{
Text: fmt.Sprintf(
"%d tracks left in queue - %s",
p.Queue.Len(), p.Queue.DurationString(),
),
}
e.Description += "\n" + p.GeneratePlayerString(tot)
}

return e
Expand Down
4 changes: 4 additions & 0 deletions player/play.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,10 @@ func (p *Player) Read(url string) error {
}
if errors.Is(err, dca.ErrVoiceConnClosed) {
p.log.Info().Msg("voice connection lost")
if err = p.Disconnect(); err != nil {
p.log.Err(err).Msg("unable to disconnect vocal channel")
return err
}
if err = p.Connect(); err != nil {
p.log.Err(err).Msg("unable to reconnect")
p.voice = nil
Expand Down
5 changes: 2 additions & 3 deletions tracks/soundcloud.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,8 @@ func (t SoundcloudTrack) Embed() *discordgo.MessageEmbed {
Name: t.Track.User.Username,
URL: t.Track.User.PermalinkURL,
},
Thumbnail: &discordgo.MessageEmbedThumbnail{URL: t.Track.ArtworkURL},
Description: "**Now Playing**",
Color: 0xff5500,
Thumbnail: &discordgo.MessageEmbedThumbnail{URL: t.Track.ArtworkURL},
Color: 0xff5500,
Fields: []*discordgo.MessageEmbedField{
{Name: "Plays", Value: strconv.Itoa(t.Track.PlaybackCount), Inline: true},
{Name: "Likes", Value: strconv.Itoa(t.Track.LikesCount), Inline: true},
Expand Down
26 changes: 26 additions & 0 deletions tracks/youtube.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package tracks

import "github.com/bwmarrin/discordgo"

type YoutubeTrack struct {
}

func (yt YoutubeTrack) StreamURL() (string, error) {
panic("not implemented")
}

func (yt YoutubeTrack) Duration() int {
panic("not implemented")
}

func (yt YoutubeTrack) Embed() *discordgo.MessageEmbed {
panic("not implemented")
}

func (yt YoutubeTrack) MarkdownLink() string {
panic("not implemented")
}

func (yt YoutubeTrack) ListenStatus() string {
panic("not implemented")
}

0 comments on commit c6810fd

Please sign in to comment.