public R Play(InvokerData invoker, PlayResource play, MetaData meta) { if (!meta.FromPlaylist) { meta.ResourceOwnerDbId = invoker.DatabaseId; } // add optional beforestart here. maybe for blocking/interrupting etc. BeforeResourceStarted?.Invoke(this, new EventArgs()); // pass the song to the AF to start it var result = AudioFramework.StartResource(play, meta); if (!result) { return(result); } // add it to our freelist for comfort if (!meta.FromPlaylist) { int index = PlaylistManager.InsertToFreelist(new PlaylistItem(play.BaseData, meta)); PlaylistManager.Index = index; } // Log our resource in the history ulong?owner = meta.ResourceOwnerDbId ?? invoker.DatabaseId; HistoryManager.LogAudioResource(new HistorySaveData(play.BaseData, owner)); CurrentPlayData = new PlayInfoEventArgs(invoker, play, meta); // TODO meta as readonly AfterResourceStarted?.Invoke(this, CurrentPlayData); return(R.OkR); }
public E <LocalStr> Previous(InvokerData invoker) { PlaylistItem pli = null; for (int i = 0; i < 10; i++) { if ((pli = PlaylistManager.Previous()) == null) { break; } var result = Play(invoker, pli); if (result.Ok) { return(result); } Log.Warn("Skipping: {0} because {1}", pli.DisplayString, result.Error.Str); } if (pli == null) { return(new LocalStr(strings.info_playmgr_no_previous_song)); } else { return(new LocalStr(string.Format(strings.error_playmgr_many_songs_failed, "!previous"))); } }
private R EnqueueInternal(InvokerData invoker, PlaylistItem pli) { pli.Meta.ResourceOwnerDbId = invoker.DatabaseId; PlaylistManager.AddToFreelist(pli); return(R.OkR); }
public E <LocalStr> Next(InvokerData invoker, bool manually = true) { PlaylistItem pli = null; for (int i = 0; i < 10; i++) { if ((pli = PlaylistManager.Next(manually)) is null) { break; } var result = Play(invoker, pli); if (result.Ok) { return(result); } Log.Warn("Skipping: {0} because {1}", pli.DisplayString, result.Error.Str); } if (pli is null) { return(new LocalStr(strings.info_playmgr_no_next_song)); } else { return(new LocalStr(string.Format(strings.error_playmgr_many_songs_failed, "!next"))); } }
public R Previous(InvokerData invoker) { PlaylistItem pli = null; for (int i = 0; i < 10; i++) { if ((pli = PlaylistManager.Previous()) == null) { break; } if (Play(invoker, pli)) { return(R.OkR); } // optional message here that playlist entry has been skipped } if (pli == null) { return("No previous song could be played"); } else { return("A few songs failed to start, use !previous to continue"); } }
public PlayInfoEventArgs(InvokerData invoker, PlayResource playResource, MetaData meta, string sourceLink) { Invoker = invoker; PlayResource = playResource; MetaData = meta; SourceLink = sourceLink; }
public R Next(InvokerData invoker) { PlaylistItem pli = null; for (int i = 0; i < 10; i++) { if ((pli = PlaylistManager.Next()) == null) { break; } var result = Play(invoker, pli); if (result.Ok) { return(result); } Log.Warn("Skipping: {0} because {1}", pli.DisplayString, result.Error); } if (pli == null) { return("No next song could be played"); } else { return("A few songs failed to start, use !next to continue"); } }
/// <summary>Plays the passed <see cref="PlayResource"/></summary> /// <param name="invoker">The invoker of this resource. Used for responses and association.</param> /// <param name="play">The associated resource type string to a factory.</param> /// <param name="meta">Allows overriding certain settings for the resource.</param> /// <returns>Ok if successful, or an error message otherwise.</returns> public E <LocalStr> Play(InvokerData invoker, PlayResource play, MetaData meta) { if (!meta.FromPlaylist) { meta.ResourceOwnerUid = invoker.ClientUid; } var playInfo = new PlayInfoEventArgs(invoker, play, meta); BeforeResourceStarted?.Invoke(this, playInfo); // pass the song to the AF to start it var result = StartResource(play, meta); if (!result) { return(result); } // add it to our freelist for comfort if (!meta.FromPlaylist) { int index = PlaylistManager.InsertToFreelist(new PlaylistItem(play.BaseData, meta)); PlaylistManager.Index = index; } CurrentPlayData = playInfo; // TODO meta as readonly AfterResourceStarted?.Invoke(this, CurrentPlayData); return(R.Ok); }
public E <LocalStr> Enqueue(InvokerData invoker, IEnumerable <PlaylistItem> pli) { foreach (var item in pli) { EnqueueInternal(invoker, item); } return(PostEnqueue(invoker)); }
private E <LocalStr> PostEnqueue(InvokerData invoker) { if (IsPlaying) { return(R.Ok); } return(Next(invoker)); }
private ExecutionInformation CreateExecInfo(InvokerData invoker = null, UserSession session = null) { var info = new ExecutionInformation(Injector.CloneRealm <DependencyRealm>()); info.AddDynamicObject(invoker ?? InvokerData.Anonymous); info.AddDynamicObject(session ?? new AnonymousSession()); return(info); }
public E <LocalStr> Play(InvokerData invoker, PlaylistItem item) { if (item is null) { throw new ArgumentNullException(nameof(item)); } return(Play(invoker, item.Resource, item.Meta)); }
public E <LocalStr> Enqueue(InvokerData invoker, string message, string audioType = null) { var result = ResourceFactoryManager.Load(message, audioType); if (!result) { return(result.Error); } return(Enqueue(invoker, new PlaylistItem(result.Value.BaseData))); }
/// <summary>Playes the passed <see cref="AudioResource"/></summary> /// <param name="invoker">The invoker of this resource. Used for responses and association.</param> /// <param name="ar">The resource to load and play.</param> /// <param name="meta">Allows overriding certain settings for the resource. Can be null.</param> /// <returns>Ok if successful, or an error message otherwise.</returns> public R Play(InvokerData invoker, AudioResource ar, MetaData meta = null) { var result = ResourceFactoryManager.Load(ar); if (!result) { return(result.Message); } return(Play(invoker, result.Value, meta ?? new MetaData())); }
// TODO xml doc doesnt match here /// <summary>Playes the passed <see cref="PlayData.PlayResource"/></summary> /// <param name="invoker">The invoker of this resource. Used for responses and association.</param> /// <param name="audioType">The associated <see cref="AudioType"/> to a factory.</param> /// <param name="link">The link to resolve, load and play.</param> /// <param name="meta">Allows overriding certain settings for the resource. Can be null.</param> /// <returns>Ok if successful, or an error message otherwise.</returns> public R Play(InvokerData invoker, string link, AudioType?type = null, MetaData meta = null) { var result = ResourceFactoryManager.Load(link, type); if (!result) { return(result.Message); } return(Play(invoker, result.Value, meta ?? new MetaData())); }
/// <summary>Tries to play the passed link.</summary> /// <param name="invoker">The invoker of this resource. Used for responses and association.</param> /// <param name="link">The link to resolve, load and play.</param> /// <param name="audioType">The associated resource type string to a factory.</param> /// <param name="meta">Allows overriding certain settings for the resource. Can be null.</param> /// <returns>Ok if successful, or an error message otherwise.</returns> public E <LocalStr> Play(InvokerData invoker, string link, string audioType = null, MetaData meta = null) { var result = ResourceFactoryManager.Load(link, audioType); if (!result) { return(result.Error); } return(Play(invoker, result.Value, meta ?? new MetaData())); }
public R Enqueue(InvokerData invoker, string message, AudioType?type = null) { var result = ResourceFactoryManager.Load(message, type); if (!result) { return(result.Message); } return(EnqueueInternal(invoker, new PlaylistItem(result.Value.BaseData))); }
private void CallScript(string script, InvokerData invoker) { try { var info = new ExecutionInformation(parent, invoker, null) { SkipRightsChecks = true }; CommandManager.CommandSystem.Execute(info, script); } catch (CommandException) { } }
private ExecutionInformation CreateExecInfo(InvokerData invoker = null, UserSession session = null) { var info = new ExecutionInformation(Injector.CloneRealm <DependencyRealm>()); if (invoker != null) { info.AddDynamicObject(invoker); } if (session != null) { info.AddDynamicObject(session); } return(info); }
/// <summary>Tries to play the passed <see cref="AudioResource"/></summary> /// <param name="invoker">The invoker of this resource. Used for responses and association.</param> /// <param name="ar">The resource to load and play.</param> /// <param name="meta">Allows overriding certain settings for the resource. Can be null.</param> /// <returns>Ok if successful, or an error message otherwise.</returns> public E <LocalStr> Play(InvokerData invoker, AudioResource ar, MetaData meta = null) { if (ar is null) { throw new ArgumentNullException(nameof(ar)); } var result = ResourceFactoryManager.Load(ar); if (!result) { return(result.Error); } return(Play(invoker, result.Value, meta ?? new MetaData())); }
public R Play(InvokerData invoker, uint historyId, MetaData meta = null) { var getresult = HistoryManager.GetEntryById(historyId); if (!getresult) { return(getresult.Message); } var loadresult = ResourceFactoryManager.Load(getresult.Value.AudioResource); if (!loadresult) { return(loadresult.Message); } return(Play(invoker, loadresult.Value, meta ?? new MetaData())); }
public E <LocalStr> Previous(InvokerData invoker, bool manually = true) { bool skipPrev = CurrentPlayData?.MetaData.From != PlaySource.FromPlaylist; PlaylistItem pli = null; for (int i = 0; i < 10; i++) { if (skipPrev) { pli = PlaylistManager.Current; skipPrev = false; } else { pli = PlaylistManager.Previous(manually); } if (pli is null) { break; } var result = Play(invoker, pli); if (result.Ok) { return(result); } Log.Warn("Skipping: {0} because {1}", pli.DisplayString, result.Error.Str); } if (pli is null) { return(new LocalStr(strings.info_playmgr_no_previous_song)); } else { return(new LocalStr(string.Format(strings.error_playmgr_many_songs_failed, "!previous"))); } }
public R Play(InvokerData invoker, PlaylistItem item) { if (item == null) { throw new ArgumentNullException(nameof(item)); } R lastResult = R.OkR; InvokerData realInvoker = CurrentPlayData?.Invoker ?? invoker; if (item.HistoryId.HasValue) { lastResult = Play(realInvoker, item.HistoryId.Value, item.Meta); if (lastResult) { return(R.OkR); } } if (!string.IsNullOrWhiteSpace(item.Link)) { lastResult = Play(realInvoker, item.Link, item.AudioType, item.Meta); if (lastResult) { return(R.OkR); } } if (item.Resource != null) { lastResult = Play(realInvoker, item.Resource, item.Meta); if (lastResult) { return(R.OkR); } } return($"Playlist item could not be played ({lastResult.Message})"); }
/// <summary>Plays the passed <see cref="PlayResource"/></summary> /// <param name="invoker">The invoker of this resource. Used for responses and association.</param> /// <param name="play">The associated resource type string to a factory.</param> /// <param name="meta">Allows overriding certain settings for the resource.</param> /// <returns>Ok if successful, or an error message otherwise.</returns> public E <LocalStr> Play(InvokerData invoker, PlayResource play, MetaData meta) { if (meta.From != PlaySource.FromPlaylist) { meta.ResourceOwnerUid = invoker.ClientUid; } var sourceLink = ResourceFactoryManager.RestoreLink(play.BaseData); var playInfo = new PlayInfoEventArgs(invoker, play, meta, sourceLink); BeforeResourceStarted?.Invoke(this, playInfo); var result = StartResource(play, meta); if (!result) { return(result); } CurrentPlayData = playInfo; // TODO meta as readonly AfterResourceStarted?.Invoke(this, playInfo); return(R.Ok); }
private E <LocalStr> EnqueueInternal(InvokerData invoker, PlaylistItem pli) { pli.Meta.ResourceOwnerUid = invoker.ClientUid; PlaylistManager.AddToFreelist(pli); return(R.Ok); }
public PlayInfoEventArgs(InvokerData invoker, PlayResource playResource, MetaData meta) { Invoker = invoker; PlayResource = playResource; MetaData = meta; }
private void EnqueueInternal(InvokerData invoker, PlaylistItem item) { item.Meta.ResourceOwnerUid = invoker.ClientUid; item.Meta.From = PlaySource.FromQueue; PlaylistManager.QueueItem(item); }
public E <LocalStr> Enqueue(InvokerData invoker, PlaylistItem item) { EnqueueInternal(invoker, item); return(PostEnqueue(invoker)); }
public E <LocalStr> Enqueue(InvokerData invoker, AudioResource ar) => Enqueue(invoker, new PlaylistItem(ar));
private void TextCallback(object sender, TextMessage textMessage) { Log.Debug("Got message from {0}: {1}", textMessage.InvokerName, textMessage.Message); textMessage.Message = textMessage.Message.TrimStart(' '); if (!textMessage.Message.StartsWith("!", StringComparison.Ordinal)) { return; } var refreshResult = QueryConnection.RefreshClientBuffer(true); if (!refreshResult.Ok) { Log.Warn("Bot is not correctly set up. Some commands might not work or are slower. ({0})", refreshResult.Error); } var clientResult = QueryConnection.GetClientById(textMessage.InvokerId); // get the current session UserSession session = null; var result = SessionManager.GetSession(textMessage.InvokerId); if (result.Ok) { session = result.Value; } else { if (clientResult.Ok) { session = SessionManager.CreateSession(clientResult.Value); } else { Log.Warn("Could not create session with user, some commands might not work ({0})", clientResult.Error); } } var invoker = new InvokerData(textMessage.InvokerUid) { ClientId = textMessage.InvokerId, Visibiliy = textMessage.Target, NickName = textMessage.InvokerName, }; if (clientResult.Ok) { invoker.ChannelId = clientResult.Value.ChannelId; invoker.DatabaseId = clientResult.Value.DatabaseId; } var info = CreateExecInfo(invoker, session); UserSession.SessionToken sessionLock = null; try { if (session != null) { sessionLock = session.GetLock(); // check if the user has an open request if (session.ResponseProcessor != null) { var msg = session.ResponseProcessor(textMessage.Message); session.ClearResponse(); if (!string.IsNullOrEmpty(msg)) { info.Write(msg).UnwrapThrow(); } return; } } CallScript(info, textMessage.Message, true, false); } finally { sessionLock?.Dispose(); } }