Beispiel #1
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;
            }
        }
Beispiel #2
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.");
            }
        }
Beispiel #3
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));
                }
            }
        }
Beispiel #4
0
        public async Task TrackFinished(LavaPlayer player, LavaTrack ptrack, TrackEndReason endReason)
        {
            var guild = GetOrAddConfig(player.VoiceChannel.GuildId);

            if (guild.Repeat)
            {
                if (guild.IsPlayed)
                {
                    if (endReason != TrackEndReason.Replaced)
                    {
                        guild.IsPlayed = false;
                        var track = guild.Queue.Dequeue();
                        await player.TextChannel.SendMessageAsync("", false, await EmbedMethods.GetEmbedQueue(track, guild.Queue, ptrack));

                        await player.PlayAsync(track);
                    }
                    else
                    {
                        return;
                    }
                }
                else
                {
                    if (endReason == TrackEndReason.Replaced)
                    {
                        guild.IsPlayed = true;
                        guild.Queue.Enqueue(ptrack);
                    }
                    else
                    {
                        guild.Queue.Enqueue(ptrack);
                        var track = guild.Queue.Dequeue();
                        await player.TextChannel.SendMessageAsync("", false, await EmbedMethods.GetEmbedQueue(track, guild.Queue, ptrack));

                        await player.PlayAsync(track);
                    }
                }
            }
            else
            {
                if (endReason != TrackEndReason.Replaced)
                {
                    if (guild.Queue.Count > 0)
                    {
                        var track = guild.Queue.Dequeue();
                        await player.TextChannel.SendMessageAsync("", false, await EmbedMethods.GetEmbedQueue(track, guild.Queue, ptrack));

                        await player.PlayAsync(track);
                    }
                }
            }
        }
Beispiel #5
0
        private async Task TrackFinished(LavaPlayer player, LavaTrack track, TrackEndReason reason)
        {
            if (!reason.ShouldPlayNext())
            {
                return;
            }

            if (!player.Queue.TryDequeue(out var item) || !(item is LavaTrack nextTrack))
            {
                await player.TextChannel.SendMessageAsync("There are no more tracks in the queue.");

                return;
            }

            await player.PlayAsync(nextTrack);
        }
Beispiel #6
0
        private async Task TrackFinished(LavaPlayer player, LavaTrack track, TrackEndReason reason)
        {
            if (!reason.ShouldPlayNext())
            {
                return;
            }

            if (!player.Queue.TryDequeue(out var item) || !(item is LavaTrack nextTrack))
            {
                await player.TextChannel.SendMessageAsync("⚠️ Ya no hay mas canciones en cola.");

                return;
            }

            await player.PlayAsync(nextTrack);
        }
        internal TrackEndedEventArgs(LavaPlayer player, TrackEndEvent endEvent)
        {
            Player = player;
            Track  = TrackDecoder.Decode(endEvent.Hash);
            Reason = endEvent.Reason;

            if (endEvent.Reason == TrackEndReason.Replaced)
            {
                return;
            }

            player.UpdatePlayer(x =>
            {
                x.PlayerState = PlayerState.Stopped;
                x.Track       = default;
            });
        }
Beispiel #8
0
        private async Task TrackFinished(LavaPlayer player, LavaTrack track, TrackEndReason reason)
        {
            if (!reason.ShouldPlayNext())
            {
                return;
            }

            if (!player.Queue.TryDequeue(out var item) || !(item is LavaTrack nextTrack))
            {
                await player.TextChannel.SendMessageAsync(Config.pre.error + " There are no more tracks in the queue.");

                return;
            }

            await player.PlayAsync(nextTrack);

            Embed embed = await EmbedHandler.CreateMusicEmbed(":musical_note: Now playing " + nextTrack.Title + " :musical_note:", nextTrack.Uri.ToString());

            await player.TextChannel.SendMessageAsync(null, false, embed);
        }
Beispiel #9
0
        private async Task OnTrackFinished(LavaPlayer player, LavaTrack track, TrackEndReason reason)
        {
            if (!reason.ShouldPlayNext())
            {
                return;
            }

            if (!player.Queue.TryDequeue(out var item) || !(item is LavaTrack nextTrack))
            {
                await player.TextChannel?.SendMessageAsync($"There are no more items left in queue.");

                await _lavaLink.DisconnectAsync(player.VoiceChannel);

                return;
            }

            await player.PlayAsync(nextTrack);

            await player.TextChannel?.SendMessageAsync($"Now playing: {nextTrack.Title}");
        }
Beispiel #10
0
        private async Task OnTrackFinished(LavaPlayer player, LavaTrack track, TrackEndReason reason)
        {
            if (!reason.ShouldPlayNext())
            {
                return;
            }

            if (!player.Queue.TryDequeue(out var item) || !(item is AudioTrack nextTrack))
            {
                await player.TextChannel?.SendMessageAsync($"There are no more items left in queue.");

                return;
            }

            await player.PlayAsync(nextTrack);

            await player.TextChannel.SendMessageAsync($"Finished playing: {track.ToString()}\nNow playing: {nextTrack.ToString()}");

            await player.TextChannel.SendMessageAsync(player.ObjectToString());
        }
Beispiel #11
0
        private async Task OnTrackEnded(TrackEndedEventArgs args)
        {
            TrackEndReason reason = args.Reason;
            LavaPlayer     player = args.Player;
            LavaTrack      track  = args.Track;

            if (!reason.ShouldPlayNext())
            {
                return;
            }
            if (_loop)
            {
                await player.PlayAsync(track);

                await player.TextChannel.SendMessageAsync($":arrow_forward: Now playing: `{track.Title}`");

                return;
            }
            if (!player.Queue.TryDequeue(out IQueueable queueObject) || !(queueObject is LavaTrack nextTrack))
            {
                await player.TextChannel.SendMessageAsync(":x: There are no more tracks in the queue.");

                return;
            }
            if (_qloop)
            {
                await player.PlayAsync(nextTrack);

                player.Queue.Enqueue(track);
                await player.TextChannel.SendMessageAsync($":arrow_forward: Now playing: `{nextTrack.Title}`");

                return;
            }

            await player.PlayAsync(nextTrack);

            await player.TextChannel.SendMessageAsync($":arrow_forward: Now playing: `{nextTrack.Title}`");
        }
Beispiel #12
0
        public async Task OnTrackFinished(LavaPlayer player, LavaTrack track, TrackEndReason reason)
        {
            if (!reason.ShouldPlayNext())
            {
                return;
            }

            if (!player.Queue.TryDequeue(out var item) || !(item is LavaTrack nextTrack))
            {
                await player.TextChannel?.SendMessageAsync($"There are no more songs left in queue.");

                return;
            }

            await player.PlayAsync(nextTrack);

            EmbedBuilder embed = new EmbedBuilder();

            embed.WithDescription($"**Finished Playing: `{track.Title}`\nNow Playing: `{nextTrack.Title}`**");
            //embed.WithColor();
            await player.TextChannel.SendMessageAsync("", false, embed.Build());

            await player.TextChannel.SendMessageAsync(player.ToString());
        }
Beispiel #13
0
        private async Task OnTrackFinished(LavaPlayer lavalink, ILavaTrack lavaTrack, TrackEndReason reason)
        {
            if (!reason.ShouldPlayNext())
            {
                return;
            }

            IEnergizePlayer ply = this.Players[lavalink.VoiceChannel.GuildId];

            if (ply.IsLooping)
            {
                lavaTrack.ResetPosition();
                await ply.Lavalink.PlayAsync(lavaTrack);
            }
            else
            {
                if (ply.Queue.TryDequeue(out IQueueObject obj))
                {
                    if (obj is ILavaTrack newTrack)
                    {
                        await ply.Lavalink.PlayAsync(newTrack);

                        await this.SendPlayerAsync(ply, newTrack);
                    }
                }
                else
                {
                    if (ply.Autoplay && ply.Queue.Count == 0)
                    {
                        await this.AddRelatedYtContentAsync(ply.VoiceChannel, ply.TextChannel, lavaTrack);
                    }
                    else
                    {
                        if (ply.TrackPlayer != null)
                        {
                            await ply.TrackPlayer.DeleteMessage();
                        }
                    }
                }
            }
        }
        private async Task WebSocket_OnMessage(IWebSocketClient client, SocketMessageEventArgs e)
        {
            if (!(e is SocketTextMessageEventArgs et))
            {
                this.Discord.Logger.LogCritical(LavalinkEvents.LavalinkConnectionError, "Lavalink sent binary data - unable to process");
                return;
            }

            this.Discord.Logger.LogTrace(LavalinkEvents.LavalinkWsRx, et.Message);

            var json     = et.Message;
            var jsonData = JObject.Parse(json);

            switch (jsonData["op"].ToString())
            {
            case "playerUpdate":
                var gid   = (ulong)jsonData["guildId"];
                var state = jsonData["state"].ToObject <LavalinkState>();
                if (this._connectedGuilds.TryGetValue(gid, out var lvl))
                {
                    await lvl.InternalUpdatePlayerStateAsync(state).ConfigureAwait(false);
                }
                break;

            case "stats":
                var statsRaw = jsonData.ToObject <LavalinkStats>();
                this.Statistics.Update(statsRaw);
                await this._statsReceived.InvokeAsync(this, new StatisticsReceivedEventArgs(this.Statistics)).ConfigureAwait(false);

                break;

            case "event":
                var evtype  = jsonData["type"].ToObject <EventType>();
                var guildId = (ulong)jsonData["guildId"];
                switch (evtype)
                {
                case EventType.TrackStartEvent:
                    if (this._connectedGuilds.TryGetValue(guildId, out var lvl_evtst))
                    {
                        await lvl_evtst.InternalPlaybackStartedAsync(jsonData["track"].ToString()).ConfigureAwait(false);
                    }
                    break;

                case EventType.TrackEndEvent:
                    TrackEndReason reason = TrackEndReason.Cleanup;
                    switch (jsonData["reason"].ToString())
                    {
                    case "FINISHED":
                        reason = TrackEndReason.Finished;
                        break;

                    case "LOAD_FAILED":
                        reason = TrackEndReason.LoadFailed;
                        break;

                    case "STOPPED":
                        reason = TrackEndReason.Stopped;
                        break;

                    case "REPLACED":
                        reason = TrackEndReason.Replaced;
                        break;

                    case "CLEANUP":
                        reason = TrackEndReason.Cleanup;
                        break;
                    }
                    if (this._connectedGuilds.TryGetValue(guildId, out var lvl_evtf))
                    {
                        await lvl_evtf.InternalPlaybackFinishedAsync(new TrackFinishData { Track = jsonData["track"].ToString(), Reason = reason }).ConfigureAwait(false);
                    }
                    break;

                case EventType.TrackStuckEvent:
                    if (this._connectedGuilds.TryGetValue(guildId, out var lvl_evts))
                    {
                        await lvl_evts.InternalTrackStuckAsync(new TrackStuckData { Track = jsonData["track"].ToString(), Threshold = (long)jsonData["thresholdMs"] }).ConfigureAwait(false);
                    }
                    break;

                case EventType.TrackExceptionEvent:
                    if (this._connectedGuilds.TryGetValue(guildId, out var lvl_evte))
                    {
                        await lvl_evte.InternalTrackExceptionAsync(new TrackExceptionData { Track = jsonData["track"].ToString(), Error = jsonData["error"].ToString() }).ConfigureAwait(false);
                    }
                    break;

                case EventType.WebSocketClosedEvent:
                    if (this._connectedGuilds.TryGetValue(guildId, out var lvl_ewsce))
                    {
                        lvl_ewsce.VoiceWsDisconnectTcs.SetResult(true);
                        await lvl_ewsce.InternalWebSocketClosedAsync(new WebSocketCloseEventArgs(jsonData["code"].ToObject <int>(), jsonData["reason"].ToString(), jsonData["byRemote"].ToObject <bool>())).ConfigureAwait(false);
                    }
                    break;
                }
                break;
            }
        }
        private async Task WebSocket_OnMessage(SocketMessageEventArgs e)
        {
            if (!(e is SocketTextMessageEventArgs et))
            {
                this.Discord.DebugLogger.LogMessage(LogLevel.Critical, "Lavalink", "Lavalink spewed out binary gibberish!", DateTime.Now);
                return;
            }

            var json     = et.Message;
            var jsonData = JObject.Parse(json);

            switch (jsonData["op"].ToString())
            {
            case "playerUpdate":
                var gid   = (ulong)jsonData["guildId"];
                var state = jsonData["state"].ToObject <LavalinkState>();
                if (this.ConnectedGuilds.TryGetValue(gid, out var lvl))
                {
                    await lvl.InternalUpdatePlayerStateAsync(state).ConfigureAwait(false);
                }
                break;

            case "stats":
                var statsRaw = jsonData.ToObject <LavalinkStats>();
                this.Statistics.Update(statsRaw);
                await this._statsReceived.InvokeAsync(new StatisticsReceivedEventArgs(this.Statistics)).ConfigureAwait(false);

                break;

            case "event":
                var evtype  = jsonData["type"].ToObject <EventType>();
                var guildId = (ulong)jsonData["guildId"];
                switch (evtype)
                {
                case EventType.TrackStartEvent:
                    if (this.ConnectedGuilds.TryGetValue(guildId, out var lvl_evtst))
                    {
                        await lvl_evtst.InternalPlaybackStartedAsync(jsonData["track"].ToString()).ConfigureAwait(false);
                    }
                    break;

                case EventType.TrackEndEvent:
                    TrackEndReason reason = TrackEndReason.Cleanup;
                    switch (jsonData["reason"].ToString())
                    {
                    case "FINISHED":
                        reason = TrackEndReason.Finished;
                        break;

                    case "LOAD_FAILED":
                        reason = TrackEndReason.LoadFailed;
                        break;

                    case "STOPPED":
                        reason = TrackEndReason.Stopped;
                        break;

                    case "REPLACED":
                        reason = TrackEndReason.Replaced;
                        break;

                    case "CLEANUP":
                        reason = TrackEndReason.Cleanup;
                        break;
                    }
                    if (this.ConnectedGuilds.TryGetValue(guildId, out var lvl_evtf))
                    {
                        await lvl_evtf.InternalPlaybackFinishedAsync(new TrackFinishData { Track = jsonData["track"].ToString(), Reason = reason }).ConfigureAwait(false);
                    }
                    break;

                case EventType.TrackStuckEvent:
                    if (this.ConnectedGuilds.TryGetValue(guildId, out var lvl_evts))
                    {
                        await lvl_evts.InternalTrackStuckAsync(new TrackStuckData { Track = jsonData["track"].ToString(), Threshold = (long)jsonData["thresholdMs"] }).ConfigureAwait(false);
                    }
                    break;

                case EventType.TrackExceptionEvent:
                    if (this.ConnectedGuilds.TryGetValue(guildId, out var lvl_evte))
                    {
                        await lvl_evte.InternalTrackExceptionAsync(new TrackExceptionData { Track = jsonData["track"].ToString(), Error = jsonData["error"].ToString() }).ConfigureAwait(false);
                    }
                    break;

                case EventType.WebSocketClosedEvent:
                    if (this.ConnectedGuilds.TryGetValue(guildId, out var lvl_ewsce))
                    {
                        var code = jsonData["code"].ToObject <int>();

                        if (code == 4006 || code == 4009 || code == 4014)
                        {
                            this.ConnectedGuilds.TryRemove(guildId, out _);
                        }

                        await lvl_ewsce.InternalWebSocketClosedAsync(new WebSocketCloseEventArgs(code, jsonData["reason"].ToString(), jsonData["byRemote"].ToObject <bool>())).ConfigureAwait(false);
                    }
                    break;
                }
                break;
            }
        }
Beispiel #16
0
 internal TrackEndedEventArgs(LavaPlayer player, LavaTrack lavaTrack, string reason)
 {
     Player = player;
     Track  = lavaTrack;
     Reason = (TrackEndReason)(byte)reason[0];
 }
Beispiel #17
0
 /// <summary>
 /// Indicates whether a new track should be started after reciving this TrackEndReason. If this is false, either this event is
 /// already triggered because another track started (REPLACED) or because the player is stopped (STOPPED, CLEANUP).
 /// </summary>
 public static bool MayStartNext(this TrackEndReason reason)
 => reason == TrackEndReason.Finished || reason == TrackEndReason.LoadFailed;
        private async Task WebSocket_OnMessage(SocketMessageEventArgs e)
        {
            //this.Discord.DebugLogger.LogMessage(LogLevel.Debug, "Lavalink", e.Message, DateTime.Now);

            var   json     = e.Message;
            var   jsonData = JObject.Parse(json);
            ulong guildId  = 0;

            switch (jsonData["op"].ToString())
            {
            case "playerUpdate":
                guildId = (ulong)jsonData["guildId"];
                var state = jsonData["state"].ToObject <LavalinkState>();
                if (this.ConnectedGuilds.TryGetValue(guildId, out var lvl))
                {
                    await lvl.InternalUpdatePlayerStateAsync(state).ConfigureAwait(false);
                }
                break;

            case "stats":
                var statsRaw = jsonData.ToObject <LavalinkStats>();
                this.Statistics.Update(statsRaw);
                break;

            case "event":
                var evtype = jsonData["type"].ToObject <EventType>();
                switch (evtype)
                {
                case EventType.TrackEndEvent:
                    guildId = (ulong)jsonData["guildId"];
                    TrackEndReason reason = TrackEndReason.Cleanup;
                    switch (jsonData["reason"].ToString())
                    {
                    case "FINISHED":
                        reason = TrackEndReason.Finished;
                        break;

                    case "LOAD_FAILED":
                        reason = TrackEndReason.LoadFailed;
                        break;

                    case "STOPPED":
                        reason = TrackEndReason.Stopped;
                        break;

                    case "REPLACED":
                        reason = TrackEndReason.Replaced;
                        break;

                    case "CLEANUP":
                        reason = TrackEndReason.Cleanup;
                        break;
                    }
                    if (this.ConnectedGuilds.TryGetValue(guildId, out var lvl_evtf))
                    {
                        await lvl_evtf.InternalPlaybackFinishedAsync(new TrackFinishData { Track = jsonData["track"].ToString(), Reason = reason }).ConfigureAwait(false);
                    }
                    break;

                case EventType.TrackStuckEvent:
                    if (this.ConnectedGuilds.TryGetValue(guildId, out var lvl_evts))
                    {
                        await lvl_evts.InternalTrackStuckAsync(new TrackStuckData { Track = jsonData["track"].ToString(), Threshold = (long)jsonData["thresholdMs"] }).ConfigureAwait(false);
                    }
                    break;

                case EventType.TrackExceptionEvent:
                    if (this.ConnectedGuilds.TryGetValue(guildId, out var lvl_evte))
                    {
                        await lvl_evte.InternalTrackExceptionAsync(new TrackExceptionData { Track = jsonData["track"].ToString(), Error = jsonData["error"].ToString() }).ConfigureAwait(false);
                    }
                    break;
                }
                break;
            }
        }
Beispiel #19
0
        private bool OnMessage(string message)
        {
            this.ShadowLog?.WriteLog(LogSeverity.Debug, message);
            JObject json = JObject.Parse(message);

            ulong      guildId = 0;
            LavaPlayer player;

            if (json.TryGetValue("guildId", out JToken guildToken))
            {
                guildId = ulong.Parse($"{guildToken}");
            }

            string opCode = $"{json.GetValue("op")}";

            switch (opCode)
            {
            case "playerUpdate":
                /*if (!this.Players.TryGetValue(guildId, out player))
                 *  return false;
                 *
                 * PlayerState state = json.GetValue("state").ToObject<PlayerState>();
                 * player.CurrentTrack.Position = state.Position;
                 * player.LastUpdate = state.Time;
                 *
                 * this.OnPlayerUpdated?.Invoke(player, player.CurrentTrack, state.Position);*/
                break;

            case "stats":
                this.ServerStats = json.ToObject <ServerStats>();
                this.OnServerStats?.Invoke(this.ServerStats);
                break;

            case "event":
                EventType evt = json.GetValue("type").ToObject <EventType>();
                if (!this.Players.TryGetValue(guildId, out player))
                {
                    return(false);
                }

                ILavaTrack track = default;
                if (json.TryGetValue("track", out JToken hash))
                {
                    track = TrackHelper.DecodeTrack($"{hash}");
                }

                switch (evt)
                {
                case EventType.TrackEnd:
                    TrackEndReason endReason = json.GetValue("reason").ToObject <TrackEndReason>();
                    if (endReason != TrackEndReason.Finished)
                    {
                        if (endReason != TrackEndReason.Replaced)
                        {
                            player.IsPlaying    = false;
                            player.CurrentTrack = default;
                        }

                        this.OnTrackFinished?.Invoke(player, track, endReason);
                    }

                    break;

                case EventType.TrackException:
                    string error = json.GetValue("error").ToObject <string>();
                    player.CurrentTrack = track;
                    this.OnTrackException?.Invoke(player, track, error);
                    break;

                case EventType.TrackStuck:
                    long timeout = json.GetValue("thresholdMs").ToObject <long>();
                    player.CurrentTrack = track;
                    this.OnTrackStuck?.Invoke(player, track, timeout);
                    break;

                case EventType.WebSocketClosed:
                    string reason   = json.GetValue("reason").ToObject <string>();
                    int    code     = json.GetValue("code").ToObject <int>();
                    bool   byRemote = json.GetValue("byRemote").ToObject <bool>();
                    this.OnSocketClosed?.Invoke(code, reason, byRemote);
                    break;

                default:
                    this.ShadowLog?.WriteLog(LogSeverity.Warning, $"Missing implementation of {evt} event.");
                    break;
                }

                break;

            default:
                this.ShadowLog?.WriteLog(LogSeverity.Warning, $"Missing handling of {opCode} OP code.");
                break;
            }

            return(true);
        }
Beispiel #20
0
 internal TrackEndedEventArgs(LavalinkTrack track, TrackEndReason reason) : base(track)
 {
     Reason = reason;
 }
 /// <summary>
 ///     Initializes a new instance of the <see cref="TrackEndEventArgs"/> class.
 /// </summary>
 /// <param name="player">the affected player</param>
 /// <param name="trackIdentifier">the identifier of the affected track</param>
 /// <param name="reason">the reason why the track ended</param>
 /// <exception cref="ArgumentNullException">
 ///     thrown if the specified <paramref name="player"/> is <see langword="null"/>.
 /// </exception>
 /// <exception cref="ArgumentNullException">
 ///     thrown if the specified <paramref name="trackIdentifier"/> is <see langword="null"/>.
 /// </exception>
 public TrackEndEventArgs(LavalinkPlayer player, string trackIdentifier, TrackEndReason reason)
     : base(player, trackIdentifier)
     => Reason = reason;
 internal TrackEndedEventArgs(LavaPlayer player, TrackEndEvent endEvent)
 {
     Player = player;
     Track  = TrackDecoder.Decode(endEvent.Hash);
     Reason = endEvent.Reason;
 }
Beispiel #23
0
 internal TrackFinishEventArgs(LavalinkGuildConnection lvl, LavalinkTrack track, TrackEndReason reason)
 {
     this.Track  = track;
     this.Reason = reason;
     this.Player = lvl;
 }
Beispiel #24
0
 /// <summary>
 /// Checks if the <see cref="TrackEndReason"/> is Finished or LoadFailed.
 /// </summary>
 /// <param name="reason"><see cref="TrackEndReason"/></param>
 public static bool ShouldPlayNext(this TrackEndReason reason)
 {
     return(reason == TrackEndReason.Finished || reason == TrackEndReason.LoadFailed);
 }
Beispiel #25
0
 /// <summary>
 /// Whether the next track should be played or not.
 /// </summary>
 /// <param name="trackEndReason">Track end reason given by Lavalink.</param>
 public static bool ShouldPlayNext(this TrackEndReason trackEndReason)
 => trackEndReason == TrackEndReason.Finished || trackEndReason == TrackEndReason.LoadFailed;