Ejemplo n.º 1
0
        public Task LogMusicToDB(LavaTrack track, SocketCommandContext context)
        {
            //Get collection from database
            IMongoCollection <BsonDocument> collection = _db.GetCollection("MusicLogs");

            MusicLog newMusicLog = new MusicLog()
            {
                guild    = Convert.ToInt64(context.Guild.Id),
                user     = Convert.ToInt64(context.User.Id),
                username = context.User.Username,
                date     = DateTime.Now,

                songTitle    = track.Title,
                songArtist   = track.Author,
                songUrl      = track.Url,
                songDuration = track.Duration
            };

            BsonDocument musicLogBson = new BsonDocument();

            musicLogBson = newMusicLog.ToBsonDocument();
            collection.InsertOne(musicLogBson);

            return(Task.CompletedTask);
        }
Ejemplo n.º 2
0
        private async Task OnTrackFinished(LavaPlayer player, LavaTrack track, TrackEndReason reason)
        {
            _player = player;
            switch (reason)
            {
            case TrackEndReason.Finished:
                await PlayNextTrack();

                break;

            case TrackEndReason.Replaced:
                break;

            case TrackEndReason.LoadFailed:
                await PlayNextTrack();

                break;

            case TrackEndReason.Cleanup:
                break;

            case TrackEndReason.Stopped:
                break;
            }
        }
Ejemplo n.º 3
0
        private async Task <string> GetNextSong(LavaTrack track)
        {
            var          uri     = new Uri(track.Url);
            const string related = "https://www.youtube.com/watch?v={0}";

            if (uri.Host != "www.youtube.com")
            {
                string search = await _google.GetRelatedVideoByQuery(track.Title).ConfigureAwait(false);

                return(search == null ? null : string.Format(related, search));
            }

            NameValueCollection query = HttpUtility.ParseQueryString(uri.Query);

            string videoId;

            if (query.AllKeys.Contains("v"))
            {
                videoId = query["v"];
            }
            else
            {
                videoId = uri.Segments.Last();
            }

            string relatedId = await _google.GetRelatedVideo(videoId).ConfigureAwait(false);

            return(relatedId == null ? null : string.Format(related, relatedId));
        }
Ejemplo n.º 4
0
        public async Task QueueAsync()
        {
            string content = "";

            LavaTrack[]   tracks = Player.Queue;
            List <string> pages  = new();

            for (int i = 0; i < tracks.Length;)
            {
                LavaTrack track = tracks[i];
                content += $"**{++i}** {await Player.GetTitleAsUrlAsync(track)} **|** ``{track.Duration:m\\:ss}``\n";
                if (i % 10 == 0)
                {
                    pages.Add(content);
                    content = "";
                }
            }

            if (!string.IsNullOrEmpty(content))
            {
                pages.Add(content);
            }

            await Context.Reply.PaginatedMessageAsync(Context, pages);
        }
Ejemplo n.º 5
0
        public async Task OnFinished(LavaPlayer player, LavaTrack track, TrackReason reason)
        {
            if (reason is TrackReason.LoadFailed || reason is TrackReason.Cleanup)
            {
                return;
            }

            if (Loop && !WasSkipped)
            {
                await player.PlayAsync(track);

                await player.TextChannel.SendMessageAsync("", false,
                                                          await EmbedHandler.CreateEmbed("Audio", string.Format("{0} is on repeat.", track.Title)));
            }
            else
            {
                WasSkipped = false;
                player.Queue.TryDequeue(out LavaTrack nextTrack);

                if (nextTrack is null)
                {
                    await player.StopAsync();
                }
                else
                {
                    await player.PlayAsync(nextTrack);

                    await player.TextChannel.SendMessageAsync("", false,
                                                              await EmbedHandler.CreateEmbed("Audio", string.Format("Now playing: {0}", nextTrack.Title)));
                }
            }
        }
Ejemplo n.º 6
0
 public async Task SkipAsync(int amount = 1)
 {
     try
     {
         if (amount <= 1)
         {
             var skipped = await player.SkipAsync();
             await ReplyAsync($"Skipped: {skipped.Title}\nNow Playing: {player.CurrentTrack.Title}");
         }
         else
         {
             LavaTrack track = null;
             for (int i = 0; i < amount; i++)
             {
                 if (player.Queue.TryDequeue(out var trk))
                 {
                     if (trk is LavaTrack lavaTrack)
                     {
                         track = lavaTrack;
                     }
                 }
             }
             if (track != null)
             {
                 await player.PlayAsync(track);
                 await ReplyAsync($"Skipped {amount} tracks\nNow Playing: {player.CurrentTrack.Title}");
             }
         }
     }
     catch
     {
         await ReplyAsync("There are no more items left in queue.");
     }
 }
Ejemplo n.º 7
0
 public PlayPayload(ulong guildId, LavaTrack track, bool noReplace) : base(guildId, "play")
 {
     Hash      = track.Hash;
     StartTime = 0;
     EndTime   = (int)track.Duration.TotalMilliseconds;
     NoReplace = noReplace;
 }
Ejemplo n.º 8
0
        public string GetRequestor(LavaTrack track)
        {
            string hyperlink   = AudioService.Hyperlink(track);
            var    requestorID = AudioService.Tracks[Context.Guild.Id].First(t => t.ID == track.Id).RequestorID;

            return(Context.Guild.GetUser(requestorID).Mention);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Searches OVH for lyrics and returns them as string.
        /// </summary>
        /// <param name="lavaTrack"><see cref="LavaTrack"/></param>
        /// <returns><see cref="string"/></returns>
        /// <exception cref="ArgumentNullException">Throws if LavaTrack is null.</exception>
        public static async ValueTask <string> SearchOVHAsync(LavaTrack lavaTrack)
        {
            if (lavaTrack == null)
            {
                throw new ArgumentNullException(nameof(lavaTrack));
            }

            var(author, title) = lavaTrack.GetAuthorAndTitle();
            var url   = $"https://api.lyrics.ovh/v1/{author.Encode()}/{title.Encode()}";
            var bytes = await GetBytesAsync(url)
                        .ConfigureAwait(false);

            if (bytes.Length == 0)
            {
                throw new Exception($"No lyrics found for {lavaTrack.Title}");
            }

            var rawJson = Encoding.UTF8.GetString(bytes);
            var parse   = JObject.Parse(rawJson);

            if (!parse.TryGetValue("lyrics", out var result))
            {
                return(parse.GetValue("error").ToObject <string>());
            }

            var regex = new Regex(@"[\r\n]{2,}");

            return(regex.Replace($"{result}", "\n"));
        }
Ejemplo n.º 10
0
        public async Task <LavaTrack> GetTrack(string url, bool prioritiseSoundcloud = false)
        {
            try
            {
                LavaTrack track = null;

                if (Uri.TryCreate(url, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps))
                {
                    track = (await LavaRestClient.SearchTracksAsync(url)).Tracks.FirstOrDefault();
                }
                else
                {
                    if (prioritiseSoundcloud)
                    {
                        track = (await LavaRestClient.SearchSoundcloudAsync(url)).Tracks.FirstOrDefault();
                    }
                    else
                    {
                        track = (await LavaRestClient.SearchYouTubeAsync(url)).Tracks.FirstOrDefault();
                    }
                }

                return(track);
            }
            catch
            {
                return(null);
            }
        }
Ejemplo n.º 11
0
        private async Task OnTrackEnded(TrackEndedEventArgs args)
        {
            if (!args.Reason.ShouldPlayNext())
            {
                return;
            }

            var player = args.Player;

            if (_pulledTrack != null)
            {
                await player.PlayAsync(_pulledTrack);

                _pulledTrack = null;
                return;
            }

            if (!player.Queue.TryDequeue(out var queueable))
            {
                return;
            }

            if (!(queueable is LavaTrack track))
            {
                await player.TextChannel.SendMessageAsync("Something wrong with the next track");

                return;
            }

            await player.PlayAsync(track);
        }
Ejemplo n.º 12
0
        public async Task <Embed> SkipCurrentlyPlayingTrack(SocketGuildUser user, IMessageChannel channel)
        {
            LavaPlayer player = lavalink.DefaultNode.GetPlayer(Config.Bot.ServerID);

            player.TextChannel = channel;

            if (player.CurrentTrack != null && player.IsPlaying)
            {
                WasSkipped = true;
                LavaTrack track = player.CurrentTrack;
                await player.StopAsync();

                if (player.Queue.Count > 0)
                {
                    await player.PlayAsync(player.Queue.Items.ElementAt(0));

                    return(await EmbedHandler.CreateEmbed("Audio", string.Format("{0} was skipped.\nNext song: {1}.", track.Title, player.CurrentTrack.Title)));
                }
                else
                {
                    return(await EmbedHandler.CreateEmbed("Audio", string.Format("{0} was skipped.\nThere are no more tracks in the queue.", track.Title)));
                }
            }
            else
            {
                return(await EmbedHandler.CreateErrorEmbed("Audio, Current Track", "There Are No Current Track."));
            }
        }
Ejemplo n.º 13
0
        public static LavaTrack DecodeTrack(string trackString)
        {
            const int trackInfoVersioned = 1;
            var       raw = Convert.FromBase64String(trackString);

            var decoded = new LavaTrack
            {
                Hash = trackString
            };

            using var ms = new MemoryStream(raw);
            using var jb = new JavaBinaryHelper(ms);

            var messageHeader = jb.ReadInt32();
            var messageFlags  = (int)((messageHeader & 0xC0000000L) >> 30);
            var version       = (messageFlags & trackInfoVersioned) != 0 ? jb.ReadSByte() & 0xFF : 1;

            decoded.Title       = jb.ReadJavaUtf8();
            decoded.Author      = jb.ReadJavaUtf8();
            decoded.TrackLength = jb.ReadInt64();
            decoded.Id          = jb.ReadJavaUtf8();
            decoded.IsStream    = jb.ReadBoolean();

            var uri = jb.ReadNullableString();

            decoded.Uri = uri != null && version >= 2 ? new Uri(uri) : null;

            return(decoded);
        }
Ejemplo n.º 14
0
        public async Task TrackFinished(LavaPlayer player, LavaTrack track, TrackEndReason reason)
        {
            if (reason == TrackEndReason.LoadFailed || reason == TrackEndReason.Cleanup || reason == TrackEndReason.Replaced)
            {
                return;
            }

            //To stop un-necessary use, disconnect if there are no users left listening.
            var users = await player.VoiceChannel.GetUsersAsync().FlattenAsync();

            if (!users.Any())
            {
                await Client.DisconnectAsync(player.VoiceChannel);

                await player.TextChannel?.SendMessageAsync("Music playback has been stopped as there are no users listening.");

                return;
            }

            if (player.Queue.TryDequeue(out var nextTrack))
            {
                if (nextTrack is LavaTrack newTrack)
                {
                    await player.PlayAsync(newTrack);

                    await player.TextChannel?.SendMessageAsync($"Now playing: {newTrack.Title}");
                }
            }
            else
            {
                await player.StopAsync();

                await player.TextChannel?.SendMessageAsync("Playlist finished.");
            }
        }
Ejemplo n.º 15
0
        // Fires up when track is finished.. Maybe set timer here for autokick feature
        public async Task OnFinished(LavaPlayer player, LavaTrack track, TrackReason reason)
        {
            if (reason is TrackReason.LoadFailed || reason is TrackReason.Cleanup)
            {
                return;
            }

            player.Queue.TryDequeue(out LavaTrack nextTrack);

            if (nextTrack == null)
            {
                await player.StopAsync();

                await BotService.SetBotStatus(_client, "Paused");

                await player.TextChannel.SendMessageAsync("", false, await EmbedHandler.CreateBasicEmbed("Music", $"Paused, no songs in queue", Color.Gold));
            }

            else
            {
                await player.PlayAsync(nextTrack);

                await player.TextChannel.SendMessageAsync("", false, await EmbedHandler.CreateBasicEmbed("Now Playing", $"{nextTrack.Title}", Color.Gold));
            }
        }
Ejemplo n.º 16
0
        public async Task NowPlayingAsync()
        {
            Language lang = Commands.GetLanguage(Context.Guild.Id);

            if (!_lavaNode.TryGetPlayer(Context.Guild, out LavaPlayer player))
            {
                await ReplyAsync(lang.Not_connected);

                return;
            }

            if (player.PlayerState != PlayerState.Playing)
            {
                await ReplyAsync(lang.Not_playing);

                return;
            }

            LavaTrack track   = player.Track;
            string    artwork = await track.FetchArtworkAsync();

            EmbedBuilder embed = new EmbedBuilder
            {
                Title        = $"{track.Author} - {track.Title}",
                ThumbnailUrl = artwork,
                Url          = track.Url
            }
            .AddField("Id", track.Id, true)
            .AddField("Duration", track.Duration, true)
            .AddField("Position", track.Position, true);

            await ReplyAsync(embed : embed.Build());
        }
Ejemplo n.º 17
0
        public async Task OnFinished(LavaPlayer player, LavaTrack track, TrackEndReason reason)
        {
            if (reason is TrackEndReason.Cleanup || reason is TrackEndReason.Replaced)
            {
                return;
            }
            else if (reason is TrackEndReason.Stopped)
            {
                // TODO(Adam): add auto disconnect
                return;
            }
            else if (reason is TrackEndReason.LoadFailed)
            {
                if (player.TextChannel != null)
                {
                    await player.TextChannel.SendMessageAsync(embed : await EmbedHandler.CreateErrorEmbed("Load Failed", $"Failed to load `{Hyperlink(track)}`."));
                }
                return;
            }

            player.Queue.TryDequeue(out var queueObject);
            var nextTrack = queueObject as LavaTrack;

            if (nextTrack != null)
            {
                await player.PlayAsync(nextTrack);

                if (player.TextChannel != null)
                {
                    await player.TextChannel.SendMessageAsync(embed : await EmbedHandler.CreateBasicEmbed("Now Playing", $"{Hyperlink(nextTrack)}", Color.Blue));
                }
            }
        }
Ejemplo n.º 18
0
        public async Task <string> PlayAsync(string query, ulong guildId)
        {
            Player = lavaSocketClient.GetPlayer(guildId);
            SearchResult results = await lavaRestClient.SearchYouTubeAsync(query);

            if (results.LoadType == LoadType.NoMatches || results.LoadType == LoadType.LoadFailed)
            {
                return("No matches found.");
            }
            LavaTrack track = results.Tracks.FirstOrDefault();

            if (track is null)
            {
                return("The possibility of you seeing this is less than 0% but Jetbrains won't shut up about it.");
            }

            if (Player.IsPlaying)
            {
                Player.Queue.Enqueue(track);
                return($"{track.Title} has been added to the queue.");
            }

            await Player.PlayAsync(track);

            return($"Now player: {track.Title}");
        }
Ejemplo n.º 19
0
        /// <summary>
        ///     Decodes the hash for the specified track.
        /// </summary>
        /// <param name="hash">Track's hash.</param>
        /// <returns>
        ///     <see cref="LavaTrack" />
        /// </returns>
        public static LavaTrack Decode(string hash)
        {
            Span <byte> hashBuffer = stackalloc byte[hash.Length];

            Encoding.ASCII.GetBytes(hash, hashBuffer);
            Base64.DecodeFromUtf8InPlace(hashBuffer, out var bytesWritten);
            var javaReader = new JavaBinaryReader(hashBuffer.Slice(0, bytesWritten));

            // Reading header
            var header     = javaReader.Read <int>();
            var flags      = (int)((header & 0xC0000000L) >> 30);
            var hasVersion = (flags & 1) != 0;
            var version    = hasVersion ? javaReader.Read <sbyte>() : 1;

            var track = new LavaTrack()
                        .WithHash(hash)
                        .WithTitle(javaReader.ReadString())
                        .WithAuthor(javaReader.ReadString())
                        .WithDuration(javaReader.Read <long>())
                        .WithId(javaReader.ReadString())
                        .WithStream(javaReader.Read <bool>())
                        .WithUrl(javaReader.Read <bool>()
                    ? javaReader.ReadString()
                    : string.Empty);

            return(track);
        }
Ejemplo n.º 20
0
        public MusicService(LavaNode lavaNode, IServiceScopeFactory serviceScope)
        {
            _serviceScope = serviceScope;
            _lavaNode     = lavaNode;

            _lavaNode.OnTrackEnded += OnTrackEnded;
            _pulledTrack            = null;
        }
Ejemplo n.º 21
0
        //When player is updated, fires up every 5 seconds
        public async Task OnUpdated(LavaPlayer player, LavaTrack track, TimeSpan timeSpan)
        {
            if (player.IsPlaying || player.IsPaused)
            {
                await BotService.SetBotStatus(_client, $"{track.Title}");
            }

            await LoggingService.LogInformationAsync("OnUpdated", $"We here + Last time updated: {player.LastUpdate}");
        }
Ejemplo n.º 22
0
 public Song(LavaTrack track, SocketCommandContext context, int volume)
 {
     Track          = track;
     Guild          = context.Guild;
     Requester      = (SocketGuildUser)context.User;
     TextChannel    = context.Channel;
     DurationString = track.Length.ToString();
     Volume         = volume;
 }
Ejemplo n.º 23
0
        /// <summary>
        ///     Fetches artwork for Youtube, Twitch, SoundCloud and Vimeo.
        /// </summary>
        /// <param name="track"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        public static async ValueTask <string> FetchAsync(LavaTrack track)
        {
            if (track == null)
            {
                throw new ArgumentNullException(nameof(track));
            }

            var(shouldSearch, requestUrl) = track.Url.ToLower() switch {
                var yt when yt.Contains("youtube")
                => (true, $"https://img.youtube.com/vi/{track.Id}/maxresdefault.jpg"),

                var twitch when twitch.Contains("twitch")
                => (true, $"https://api.twitch.tv/v4/oembed?url={track.Url}"),

                var sc when sc.Contains("soundcloud")
                => (true, $"https://soundcloud.com/oembed?url={track.Url}&format=json"),

                var vim when vim.Contains("vimeo")
                => (false, $"https://i.vimeocdn.com/video/{track.Id}.png"),

                _ => (false, "https://raw.githubusercontent.com/Yucked/Victoria/v5/src/Logo.png")
            };

            if (!shouldSearch)
            {
                return(requestUrl);
            }

            var(httpMethod, httpCompletionOption, fallbackUrl) = track.Url.ToLower().Contains("youtube")
                ? (HttpMethod.Head, HttpCompletionOption.ResponseHeadersRead, $"https://img.youtube.com/vi/{track.Id}/hqdefault.jpg")
                : (HttpMethod.Get, HttpCompletionOption.ResponseContentRead, "https://raw.githubusercontent.com/Yucked/Victoria/v5/src/Logo.png");

            var responseMessage = await VictoriaExtensions.HttpClient.SendAsync(new HttpRequestMessage {
                Method     = httpMethod,
                RequestUri = new Uri(requestUrl)
            }, httpCompletionOption);

            if (!responseMessage.IsSuccessStatusCode)
            {
                return(fallbackUrl);
            }

            if (track.Url.ToLower().Contains("youtube"))
            {
                return(requestUrl);
            }

            using var content      = responseMessage.Content;
            await using var stream = await content.ReadAsStreamAsync();

            var document = await JsonDocument.ParseAsync(stream);

            return(document.RootElement.TryGetProperty("thumbnail_url", out var url)
                ? $"{url}"
                : requestUrl);
        }
Ejemplo n.º 24
0
 private XyloxTrack ConvertTrackToXyloxTrack(LavaTrack track, bool isQueued)
 => new XyloxTrack
 {
     Id       = track.Id,
     Title    = track.Title,
     Author   = track.Author,
     Duration = track.Duration,
     Url      = track.Url,
     IsQueued = isQueued
 };
Ejemplo n.º 25
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="lavaTrack"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        public static ValueTask <string> SearchGeniusAsync(LavaTrack lavaTrack)
        {
            if (lavaTrack == null)
            {
                throw new ArgumentNullException(nameof(lavaTrack));
            }

            var(artist, title) = GetArtistAndTitle(lavaTrack);
            return(SearchGeniusAsync(artist, title));
        }
Ejemplo n.º 26
0
        public string Remove(int index)
        {
            if (_player is null || _player.Queue.Equals(null) || (_player.Queue.Items.Count() == 0 && _player.Track == null))
            {
                return(":x: Queue is empty.");
            }
            LavaTrack track = _player.Queue.Items.ElementAt(index - 1) as LavaTrack;

            _player.Queue.RemoveAt(index - 1);
            return($":hash: Removed track `{track.Title}`");
        }
Ejemplo n.º 27
0
        public async Task <String> SkipAsync(IGuild guild)
        {
            if (SetPlayer(guild) || _player.Queue.Count is 0)
            {
                return("Nothing in queue!");
            }

            LavaTrack oldTrack = _player.Track;
            await _player.SkipAsync();

            return($"**Skipped:** *{oldTrack.Title}*\n**Now playing:** *{_player.Track.Title}*");
        }
Ejemplo n.º 28
0
        private async Task ReplyMusicExtended(LavaTrack track, bool added = true)
        {
            var url = await track.FetchArtworkAsync();

            await ReplyMusicEmbedExtended(
                track.Title,
                track.Author,
                url,
                track.Duration.ToString(@"mm\:ss"),
                track.Url,
                added);
        }
Ejemplo n.º 29
0
        private string Queuelist(List <Victoria.Interfaces.IQueueable> queue)
        {
            string result = "";

            for (int i = 1; i <= queue.Count && i < 10; i++)
            {
                LavaTrack track = (LavaTrack)queue[i - 1];
                result      += $"**{i}.** " + track.Title + " **[" + track.Duration + "]**" + '\n';
                totalLenght += track.Duration;
            }
            return(result);
        }
Ejemplo n.º 30
0
        public new async Task <(CustomLavaTrack Skipped, CustomLavaTrack Current)> SkipAsync(TimeSpan?delay = null)
        {
            LavaTrack skipped = (await base.SkipAsync(delay)).Skipped;

            CustomQueue.TryDequeue(out CustomLavaTrack lavaTrack);

            CustomLavaTrack customSkipped = new CustomLavaTrack(skipped, User);

            User = lavaTrack.User;

            return(customSkipped, lavaTrack);
        }