예제 #1
0
파일: Pipe.cs 프로젝트: besh/Coremero
        public async Task <IMessage> PipeCommand(IInvocationContext context, IMessage message)
        {
            List <string> cmds         = string.Join(" ", message.Text.GetCommandArguments()).Split('|').ToList();
            Message       basicMessage = Message.Create(message.Text, message.Attachments?.ToArray());

            basicMessage.Text = string.Join(" ", cmds.First().Split(' ').Skip(1).ToList()).Trim();
            bool appendNext = false;

            foreach (var cmd in cmds)
            {
                List <string> call = cmd.Trim().Split(' ').ToList();
                if (!_commandRegistry.Exists(call.First()))
                {
                    // Special commands.
                    if (call[0] == "cleartext")
                    {
                        basicMessage.Text = string.Empty;
                    }
                    else if (call[0] == "clearattachment")
                    {
                        basicMessage.Attachments?.ForEach(x => x.Contents?.Dispose());
                        basicMessage.Attachments = null;
                    }
                    else if (call[0] == "append")
                    {
                        appendNext = true;
                    }
                    continue;
                }

                if (_commandRegistry.IsCommandComplexOrNull(call.First()))
                {
                    continue;
                }

                IMessage result;
                try
                {
                    result = await _commandRegistry.ExecuteCommandAsync(call.First(), context,
                                                                        call.Count == 1
                                                                        ?basicMessage
                                                                        : Message.Create(string.Join(" ", call.Skip(1)), basicMessage.Attachments?.ToArray()));
                }
                catch (Exception e)
                {
                    // Quickly dispose what we can.
                    basicMessage.Attachments?.ForEach(x => x.Contents?.Dispose());
                    throw (e);
                }

                if (!string.IsNullOrEmpty(result.Text))
                {
                    basicMessage.Text = result.Text;
                }
                if (result.Attachments != null)
                {
                    if (appendNext)
                    {
                        basicMessage.Attachments?.AddRange(result.Attachments);
                        appendNext = false;
                    }
                    else
                    {
                        if (basicMessage.Attachments?.Count > 0)
                        {
                            // Prevent leak since we're going out of scope
                            basicMessage.Attachments.ForEach(x => x.Contents?.Dispose());
                        }
                        basicMessage.Attachments = result.Attachments;
                    }
                }
            }

            return(basicMessage);
        }