예제 #1
0
        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);
        }
예제 #2
0
        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")));
            }
        }
예제 #3
0
        private R EnqueueInternal(InvokerData invoker, PlaylistItem pli)
        {
            pli.Meta.ResourceOwnerDbId = invoker.DatabaseId;
            PlaylistManager.AddToFreelist(pli);

            return(R.OkR);
        }
예제 #4
0
        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")));
            }
        }
예제 #5
0
        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");
            }
        }
예제 #6
0
 public PlayInfoEventArgs(InvokerData invoker, PlayResource playResource, MetaData meta, string sourceLink)
 {
     Invoker      = invoker;
     PlayResource = playResource;
     MetaData     = meta;
     SourceLink   = sourceLink;
 }
예제 #7
0
        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");
            }
        }
예제 #8
0
        /// <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);
        }
예제 #9
0
 public E <LocalStr> Enqueue(InvokerData invoker, IEnumerable <PlaylistItem> pli)
 {
     foreach (var item in pli)
     {
         EnqueueInternal(invoker, item);
     }
     return(PostEnqueue(invoker));
 }
예제 #10
0
 private E <LocalStr> PostEnqueue(InvokerData invoker)
 {
     if (IsPlaying)
     {
         return(R.Ok);
     }
     return(Next(invoker));
 }
예제 #11
0
        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);
        }
예제 #12
0
        public E <LocalStr> Play(InvokerData invoker, PlaylistItem item)
        {
            if (item is null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            return(Play(invoker, item.Resource, item.Meta));
        }
예제 #13
0
        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)));
        }
예제 #14
0
        /// <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()));
        }
예제 #15
0
        // 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()));
        }
예제 #16
0
        /// <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()));
        }
예제 #17
0
        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)));
        }
예제 #18
0
 private void CallScript(string script, InvokerData invoker)
 {
     try
     {
         var info = new ExecutionInformation(parent, invoker, null)
         {
             SkipRightsChecks = true
         };
         CommandManager.CommandSystem.Execute(info, script);
     }
     catch (CommandException) { }
 }
예제 #19
0
파일: Bot.cs 프로젝트: HellBz/TS3AudioBot
        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);
        }
예제 #20
0
        /// <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()));
        }
예제 #21
0
        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()));
        }
예제 #22
0
        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")));
            }
        }
예제 #23
0
        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})");
        }
예제 #24
0
        /// <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);
        }
예제 #25
0
 private E <LocalStr> EnqueueInternal(InvokerData invoker, PlaylistItem pli)
 {
     pli.Meta.ResourceOwnerUid = invoker.ClientUid;
     PlaylistManager.AddToFreelist(pli);
     return(R.Ok);
 }
예제 #26
0
 public PlayInfoEventArgs(InvokerData invoker, PlayResource playResource, MetaData meta)
 {
     Invoker      = invoker;
     PlayResource = playResource;
     MetaData     = meta;
 }
예제 #27
0
 private void EnqueueInternal(InvokerData invoker, PlaylistItem item)
 {
     item.Meta.ResourceOwnerUid = invoker.ClientUid;
     item.Meta.From             = PlaySource.FromQueue;
     PlaylistManager.QueueItem(item);
 }
예제 #28
0
 public E <LocalStr> Enqueue(InvokerData invoker, PlaylistItem item)
 {
     EnqueueInternal(invoker, item);
     return(PostEnqueue(invoker));
 }
예제 #29
0
 public E <LocalStr> Enqueue(InvokerData invoker, AudioResource ar) => Enqueue(invoker, new PlaylistItem(ar));
예제 #30
0
파일: Bot.cs 프로젝트: HellBz/TS3AudioBot
        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();
            }
        }