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); }