music

package
v0.0.0-...-abf6750 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 9, 2023 License: GPL-2.0 Imports: 12 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var LyricsCommand = core.Command{
	Name:        "letra",
	Description: "Mostra a letra da música",
	Options: discord.CommandOptions{&discord.StringOption{
		OptionName:  "nome",
		Description: "nome da música",
	}},
	Handler: func(ctx *core.CommandContext) {
		player, query, replaced := music.GetPlayer(ctx.GuildID), ctx.Argument(0).String(), false
		if query == "" {
			if player != nil && player.Current != nil {
				if strings.Contains(player.Current.Title, "-") {
					query = player.Current.Title
				} else {
					query, replaced = utils.Fmt("%s - %s", player.Current.Author, player.Current.Title), true
				}
			} else {
				ctx.Reply(emojis.Cry, "Não há nada tocando no momento, e você não passou nenhuam música para obter a letra.")
				return
			}
		}

		embed := utils.NewEmbed().Color(0xF0FF00).Description("%s Obtendo resultados...", emojis.AnimatedStaff)
		ctx.Reply(embed)

		result, err := gonius.SearchSong(query)
		if err != nil {
			if err != gonius.ErrNotFound {
				ctx.Stacktrace(err)
				return
			}

			if replaced && player.Current != nil {
				result, err = gonius.SearchSong(player.Current.Title)
			}
		}

		if err != nil {
			if err == gonius.ErrNotFound {
				ctx.Reply(embed.Color(0xF93A2F).Description("%s Não consegui achar a letra dessa música.", emojis.Cry))
			} else {
				ctx.Stacktrace(err)
			}
			return
		}

		entry := result[0]
		ctx.Reply(embed.Description("%s Carregando letra...", emojis.AnimatedStaff))

		lyrics, err := entry.Lyrics()
		if err != nil {
			ctx.Stacktrace(err)
			return
		}

		if len(lyrics) > 4096 {
			ctx.Reply(embed.Color(0xF93A2F).Description("%s A letra dessa música é muito grande.", emojis.Cry))
			return
		}

		ctx.Reply(embed.
			Color(0x0099E1).
			Author(entry.PrimaryArtist.Name, entry.PrimaryArtist.Image).
			URL(entry.URL).
			Title(entry.Title).
			Description(lyrics).
			Thumbnail(entry.Image))
	},
}
View Source
var NowplayingCommand = core.Command{
	Name:        "tocando",
	Description: "Mostra as informações dá música que estiver tocando no momento",
	Handler: func(ctx *core.CommandContext) {
		player := music.GetPlayer(ctx.GuildID)

		if player == nil || player.State == music.StoppedState {
			ctx.Ephemeral().Reply(emojis.Cry, "Não há nada tocando no momento.")
			return
		}

		embed := utils.NewEmbed().
			Description("%s Tocando no momento: **[%s](%s)**", emojis.AnimatedHype, player.Current.Title, player.Current.URL).
			Thumbnail(player.Current.Thumbnail).
			Color(0x00FF59).
			Field("Autor", player.Current.Author, true).
			Field("Duração", utils.Fmt("%v/%v", utils.FormatTime(player.Voicy.PlaybackPosition()), utils.Is(player.Current.IsLive, "--:--", utils.FormatTime(player.Current.Duration))), true).
			Field("Provedor", player.Current.Provider(), true).
			Footer(utils.Fmt("Adicionado por %s#%s", player.Current.Requester.Username, player.Current.Requester.Discriminator), player.Current.Requester.AvatarURL()).
			Timestamp(player.Current.RequestedAt)

		if player.State == music.PausedState {
			embed.Color(0xB4BE10).Description("%s Pausado no momento em: [%s](%s)", emojis.Cry, player.Current.Title, player.Current.URL)
		}

		ctx.Reply(embed)
	},
}
View Source
var PauseCommand = core.Command{
	Name:        "pausar",
	Description: "Pausar ou despausar a música atual",
	Handler:     func(ctx *core.CommandContext) { handleCommand(ctx) },
}
View Source
var PlayCommand = core.Command{
	Name:        "tocar",
	Description: "Sistema de músicas",
	Options: discord.CommandOptions{&discord.StringOption{
		OptionName:   "musica",
		Description:  "Nome, ou URL de uma música ou playlist",
		Required:     true,
		Autocomplete: true,
	}, &discord.BooleanOption{
		OptionName:  "embaralhar",
		Description: "Embaralhar as músicas da fila",
	}},
	Handler: func(ctx *core.CommandContext) {
		query, shuffle := ctx.Argument(0).String(), ctx.Argument(1).Bool()

		state := ctx.VoiceState()
		if state == nil {
			ctx.Ephemeral().Reply(emojis.Cry, "Você não está conectado em nenhum canal de voz.")
			return
		}

		embed := utils.NewEmbed().Color(0xF0FF00).Description("%s Obtendo resultados para sua pesquisa...", emojis.AnimatedStaff)
		ctx.Reply(embed)

		player := music.GetOrCreatePlayer(ctx.GuildID, ctx.ChannelID, state.ChannelID)
		defer checkIdle(player)

		result, err := providers.FindSong(query, true)
		if err != nil {
			ctx.Stacktrace(err)
			return
		}

		if result == nil {
			ctx.Reply(embed.Color(0xF93A2F).Description("%s Não consegui encontrar essa música.", emojis.Cry))
			return
		}

		if result.Playlist != nil {
			player.AddSong(ctx.Sender(), shuffle, result.Songs...)

			ctx.Reply(embed.Color(0x00D166).
				Description("%s Lista de reprodução [%s](%s) adicionada na fila", emojis.Yeah, result.Playlist.Title, result.Playlist.URL).
				Field("Criador", result.Playlist.Author, true).
				Field("Músicas", len(result.Songs), true).
				Field("Duração", utils.FormatTime(result.Playlist.Duration), true))
			return
		}

		song := result.Songs[0]
		embed.Thumbnail(song.Thumbnail).
			Field("Autor", song.Author, true).
			Field("Duração", utils.Is(song.IsLive, "--:--", utils.FormatTime(song.Duration)), true).
			Field("Provedor", song.Provider(), true)

		if !song.IsLoaded() {
			go ctx.Reply(embed.Description("%s Carregando [%s](%s)", emojis.AnimatedStaff, song.Title, song.URL))

			if err := song.Load(); err != nil {
				ctx.Stacktrace(err)
				return
			}
		}

		player.AddSong(ctx.Sender(), shuffle, song)
		ctx.Reply(embed.
			Color(0x00D166).
			Thumbnail(song.Thumbnail).
			Description("%s Música [%s](%s) adicionada na fila", emojis.Yeah, song.Title, song.URL))
	},
	AutoCompleteHandler: func(ctx *core.AutoCompleteContext) api.AutocompleteStringChoices {
		query := strings.ReplaceAll(ctx.Data.Options[0].Value.String(), "\"", "")
		if strings.TrimSpace(query) == "" {
			return api.AutocompleteStringChoices{}
		}

		if providers.FindByInput(query, false) != nil {
			return api.AutocompleteStringChoices{{
				Name:  query,
				Value: query,
			}}
		}

		data, err := utils.FromWebString("http://suggestqueries.google.com/complete/search?client=youtube&ds=yt&client=chrome&q=" + url.QueryEscape(query))
		if err != nil {
			panic(err)
		}

		result := api.AutocompleteStringChoices{}
		for _, entry := range gjson.Get(data, "1").Array() {
			choice := entry.String()

			result = append(result, discord.StringChoice{
				Name:  choice,
				Value: choice,
			})
		}

		return result
	},
}
View Source
var QueueCommand = core.Command{
	Name:        "fila",
	Description: "Mostra as músicas adicionadas na fila",
	Handler: func(ctx *core.CommandContext) {
		player := music.GetPlayer(ctx.GuildID)

		if player == nil || len(player.Queue) == 0 {
			ctx.Ephemeral().Reply(emojis.Cry, "Não há nada na fila no momento.")
			return
		}

		var finalText string
		var count int

		for _, track := range player.Queue {
			if count > 19 {
				break
			}

			count++
			finalText += utils.Fmt("**%d** - [%s](%s)\n", count, track.Title, track.URL)
		}

		ctx.Reply(utils.NewEmbed().
			Color(0xA652BB).
			Description(finalText).
			Footer(utils.Fmt("Mostrando %d de %d músicas", count, len(player.Queue)), ctx.Sender().AvatarURL()).
			Timestamp(time.Now()))
	},
}
View Source
var ResumeCommand = core.Command{
	Name:        "despausar",
	Description: "Pausar ou despausar a música atual",
	Handler:     func(ctx *core.CommandContext) { handleCommand(ctx) },
}
View Source
var SeekCommand = core.Command{
	Name:        "seek",
	Description: "Alterar a posição do batidão",
	Options: discord.CommandOptions{&discord.StringOption{
		OptionName:  "posição",
		Description: "Posição desejada, exemplo de formatos válidos: 05:05 ou 5m5s",
		Required:    true,
	}},
	Handler: func(ctx *core.CommandContext) {
		if ctx.VoiceState() == nil {
			ctx.Ephemeral().Reply(emojis.Cry, "Você não está conectado em nenhum canal de voz.")
			return
		}

		player := music.GetPlayer(ctx.GuildID)
		if player == nil || player.State != music.PlayingState {
			ctx.Ephemeral().Reply(emojis.Cry, "Não há nada tocando no momento ou o batidão está pausado.")
			return
		}

		if player.Current.IsLive {
			ctx.Ephemeral().Reply(emojis.Cry, "Você não pode fazer isso em transmissões ao vivo.")
			return
		}

		duration, err := utils.ParseDuration(ctx.Argument(0).String())
		if err != nil || duration < 0 || duration > player.Current.Duration {
			ctx.Ephemeral().Reply(emojis.Cry, "Duração inválida ou maior que a duração total da música.")
			return
		}

		player.Voicy.Seek(duration)
		ctx.Reply(emojis.OK, "Posição do batidão alterada para os minutos `%s`.", utils.FormatTime(duration))
	},
}
View Source
var ShuffleCommand = core.Command{
	Name:        "embaralhar",
	Description: "Embaralhar as músicas da fila",
	Handler: func(ctx *core.CommandContext) {
		if ctx.VoiceState() == nil {
			ctx.Ephemeral().Reply(emojis.Cry, "Você não está conectado em nenhum canal de voz.")
			return
		}

		player := music.GetPlayer(ctx.GuildID)
		if player == nil || player.State == music.StoppedState {
			ctx.Ephemeral().Reply(emojis.Cry, "Não há nada tocando no momento.")
			return
		}

		if len(player.Queue) < 2 {
			ctx.Ephemeral().Reply(emojis.Cry, "Não há músicas suficientes para embaralhar na fila.")
			return
		}

		player.Shuffle()
		ctx.Reply(emojis.OK, "Músicas embaralhadas com sucesso.")
	},
}
View Source
var SkipCommand = core.Command{
	Name:        "pular",
	Description: "Pular a música atual",
	Handler: func(ctx *core.CommandContext) {
		if ctx.VoiceState() == nil {
			ctx.Ephemeral().Reply(emojis.Cry, "Você não está conectado em nenhum canal de voz.")
			return
		}

		player := music.GetPlayer(ctx.GuildID)
		if player == nil || player.State == music.StoppedState {
			ctx.Ephemeral().Reply(emojis.Cry, "Não há nada para pular no momento.")
			return
		}

		player.Skip()
		ctx.Reply(emojis.OK, "Música pulada com sucesso.")
	},
}
View Source
var StopCommand = core.Command{
	Name:        "parar",
	Description: "Parar a música atual, limpar a fila e desconectar do canal de voz.",
	Handler: func(ctx *core.CommandContext) {
		if ctx.VoiceState() == nil {
			ctx.Ephemeral().Reply(emojis.Cry, "Você não está conectado em nenhum canal de voz.")
			return
		}

		player := music.GetPlayer(ctx.GuildID)
		if player == nil {
			ctx.Ephemeral().Reply(emojis.Cry, "Não há nada tocando no momento.")
			return
		}

		player.Stop(false)
		ctx.Reply(emojis.OK, "Batidão parado com sucesso.")
	},
}

Functions

This section is empty.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL