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; } }
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."); } }
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)); } } }
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); } } } }
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); }
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; }); }
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); }
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}"); }
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()); }
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}`"); }
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()); }
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; } }
internal TrackEndedEventArgs(LavaPlayer player, LavaTrack lavaTrack, string reason) { Player = player; Track = lavaTrack; Reason = (TrackEndReason)(byte)reason[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; } }
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); }
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; }
internal TrackFinishEventArgs(LavalinkGuildConnection lvl, LavalinkTrack track, TrackEndReason reason) { this.Track = track; this.Reason = reason; this.Player = lvl; }
/// <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); }
/// <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;