Esempio n. 1
0
        /// <summary>
        /// Posts a command locally. Commands like /help will result in a help message written in the current channel.
        /// </summary>
        /// <param name="text">the text containing the command identifier and command parameters.</param>
        /// <param name="target">An optional target channel. If null, <see cref="CurrentChannel"/> will be used.</param>
        public void PostCommand(string text, Channel target = null)
        {
            if (target == null)
            {
                target = CurrentChannel.Value;
            }

            if (target == null)
            {
                return;
            }

            var    parameters = text.Split(new[] { ' ' }, 2);
            string command    = parameters[0];
            string content    = parameters.Length == 2 ? parameters[1] : string.Empty;

            switch (command)
            {
            case "np":
                AddInternal(new NowPlayingCommand());
                break;

            case "me":
                if (string.IsNullOrWhiteSpace(content))
                {
                    target.AddNewMessages(new ErrorMessage("Usage: /me [action]"));
                    break;
                }

                PostMessage(content, true);
                break;

            case "join":
                if (string.IsNullOrWhiteSpace(content))
                {
                    target.AddNewMessages(new ErrorMessage("Usage: /join [channel]"));
                    break;
                }

                var channel = availableChannels.FirstOrDefault(c => c.Name == content || c.Name == $"#{content}");

                if (channel == null)
                {
                    target.AddNewMessages(new ErrorMessage($"Channel '{content}' not found."));
                    break;
                }

                JoinChannel(channel);
                CurrentChannel.Value = channel;
                break;

            case "help":
                target.AddNewMessages(new InfoMessage("Supported commands: /help, /me [action], /join [channel], /np"));
                break;

            default:
                target.AddNewMessages(new ErrorMessage($@"""/{command}"" is not supported! For a list of supported commands see /help"));
                break;
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Posts a command locally. Commands like /help will result in a help message written in the current channel.
        /// </summary>
        /// <param name="text">the text containing the command identifier and command parameters.</param>
        /// <param name="target">An optional target channel. If null, <see cref="CurrentChannel"/> will be used.</param>
        public void PostCommand(string text, Channel target = null)
        {
            if (target == null)
            {
                target = CurrentChannel.Value;
            }

            if (target == null)
            {
                return;
            }

            var    parameters = text.Split(new[] { ' ' }, 2);
            string command    = parameters[0];
            string content    = parameters.Length == 2 ? parameters[1] : string.Empty;

            switch (command)
            {
            case "me":
                if (string.IsNullOrWhiteSpace(content))
                {
                    target.AddNewMessages(new ErrorMessage("Usage: /me [action]"));
                    break;
                }

                PostMessage(content, true);
                break;

            case "help":
                target.AddNewMessages(new InfoMessage("Supported commands: /help, /me [action]"));
                break;

            default:
                target.AddNewMessages(new ErrorMessage($@"""/{command}"" is not supported! For a list of supported commands see /help"));
                break;
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Posts a message to the currently opened channel.
        /// </summary>
        /// <param name="text">The message text that is going to be posted</param>
        /// <param name="isAction">Is true if the message is an action, e.g.: user is currently eating </param>
        /// <param name="target">An optional target channel. If null, <see cref="CurrentChannel"/> will be used.</param>
        public void PostMessage(string text, bool isAction = false, Channel target = null)
        {
            if (target == null)
            {
                target = CurrentChannel.Value;
            }

            if (target == null)
            {
                return;
            }

            void dequeueAndRun()
            {
                if (postQueue.Count > 0)
                {
                    postQueue.Dequeue().Invoke();
                }
            }

            postQueue.Enqueue(() =>
            {
                if (!api.IsLoggedIn)
                {
                    target.AddNewMessages(new ErrorMessage("Please sign in to participate in chat!"));
                    return;
                }

                var message = new LocalEchoMessage
                {
                    Sender    = api.LocalUser.Value,
                    Timestamp = DateTimeOffset.Now,
                    ChannelId = target.Id,
                    IsAction  = isAction,
                    Content   = text
                };

                target.AddLocalEcho(message);

                // if this is a PM and the first message, we need to do a special request to create the PM channel
                if (target.Type == ChannelType.PM && !target.Joined)
                {
                    var createNewPrivateMessageRequest = new CreateNewPrivateMessageRequest(target.Users.First(), message);

                    createNewPrivateMessageRequest.Success += createRes =>
                    {
                        target.Id = createRes.ChannelID;
                        target.ReplaceMessage(message, createRes.Message);
                        dequeueAndRun();
                    };

                    createNewPrivateMessageRequest.Failure += exception =>
                    {
                        Logger.Error(exception, "Posting message failed.");
                        target.ReplaceMessage(message, null);
                        dequeueAndRun();
                    };

                    api.Queue(createNewPrivateMessageRequest);
                    return;
                }

                var req = new PostMessageRequest(message);

                req.Success += m =>
                {
                    target.ReplaceMessage(message, m);
                    dequeueAndRun();
                };

                req.Failure += exception =>
                {
                    Logger.Error(exception, "Posting message failed.");
                    target.ReplaceMessage(message, null);
                    dequeueAndRun();
                };

                api.Queue(req);
            });

            // always run if the queue is empty
            if (postQueue.Count == 1)
            {
                dequeueAndRun();
            }
        }
Esempio n. 4
0
        public void PostCommand(string text, Channel target = null)
        {
            target ??= CurrentChannel.Value;

            if (target == null)
            {
                return;
            }

            string[] parameters = text.Split(' ', 2);
            string   command    = parameters[0];
            string   content    = parameters.Length == 2 ? parameters[1] : string.Empty;

            switch (command)
            {
            case "np":
                AddInternal(new NowPlayingCommand(target));
                break;

            case "me":
                if (string.IsNullOrWhiteSpace(content))
                {
                    target.AddNewMessages(new ErrorMessage("Usage: /me [action]"));
                    break;
                }

                PostMessage(content, true, target);
                break;

            case "join":
                if (string.IsNullOrWhiteSpace(content))
                {
                    target.AddNewMessages(new ErrorMessage("Usage: /join [channel]"));
                    break;
                }

                var channel = availableChannels.FirstOrDefault(c => c.Name == content || c.Name == $"#{content}");

                if (channel == null)
                {
                    target.AddNewMessages(new ErrorMessage($"Channel '{content}' not found."));
                    break;
                }

                JoinChannel(channel);
                break;

            case "chat":
            case "msg":
            case "query":
                if (string.IsNullOrWhiteSpace(content))
                {
                    target.AddNewMessages(new ErrorMessage($"Usage: /{command} [user]"));
                    break;
                }

                // Check if the user has joined the requested channel already.
                // This uses the channel name for comparison as the PM user's username is unavailable after a restart.
                var privateChannel = JoinedChannels.FirstOrDefault(
                    c => c.Type == ChannelType.PM && c.Users.Count == 1 && c.Name.Equals(content, StringComparison.OrdinalIgnoreCase));

                if (privateChannel != null)
                {
                    CurrentChannel.Value = privateChannel;
                    break;
                }

                var request = new GetUserRequest(content);
                request.Success += OpenPrivateChannel;
                request.Failure += e => target.AddNewMessages(
                    new ErrorMessage(e.InnerException?.Message == @"NotFound" ? $"User '{content}' was not found." : $"Could not fetch user '{content}'."));

                api.Queue(request);
                break;

            case "help":
                target.AddNewMessages(new InfoMessage("Supported commands: /help, /me [action], /join [channel], /chat [user], /np"));
                break;

            default:
                target.AddNewMessages(new ErrorMessage($@"""/{command}"" is not supported! For a list of supported commands see /help"));
                break;
            }
        }