Files
archived-discord-bot/CompatBot/Utils/AutosplitResponseHelper.cs
13xforever 7fd7d09973 RPCS3 Compatibility Bot reimplemented in C# for .NET Core
RPCS3 Compatibility Bot reimplemented in C# for .NET Core

Current status of this PR:
* tested and targeted for .NET Core 2.1
* all functionality is either on par or improved compared to the python version
* compatibility with current bot.db should be preserved in all upgrade scenarios
* some bot management commands were changed (now under !sudo bot)
* standard help generator for the new discord client is ... different;
  compatibility with old format could be restored through custom formatter if needed
* everything has been split in more loosely tied components for easier extensibility and maintenance
* log parsing has been rewritten and should work ~2x as fast
2018-07-20 09:22:28 +02:00

60 lines
2.5 KiB
C#

using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CompatApiClient;
using DSharpPlus.CommandsNext;
using DSharpPlus.Entities;
namespace CompatBot.Utils
{
public static class AutosplitResponseHelper
{
public static Task SendAutosplitMessageAsync(this CommandContext ctx, StringBuilder message, int blockSize = 2000, string blockEnd = "```", string blockStart = "```")
{
return ctx.Channel.SendAutosplitMessageAsync(message, blockSize, blockEnd, blockStart);
}
public static Task SendAutosplitMessageAsync(this CommandContext ctx, string message, int blockSize = 2000, string blockEnd = "```", string blockStart = "```")
{
return ctx.Channel.SendAutosplitMessageAsync(message, blockSize, blockEnd, blockStart);
}
public static async Task SendAutosplitMessageAsync(this DiscordChannel channel, StringBuilder message, int blockSize = 2000, string blockEnd = "```", string blockStart = "```")
{
if (message == null)
throw new ArgumentNullException(nameof(message));
await SendAutosplitMessageAsync(channel, message.ToString(), blockSize, blockEnd, blockStart).ConfigureAwait(false);
}
public static async Task SendAutosplitMessageAsync(this DiscordChannel channel, string message, int blockSize = 2000, string blockEnd = "```", string blockStart = "```")
{
if (channel == null)
throw new ArgumentNullException(nameof(channel));
if (string.IsNullOrEmpty(message))
return;
blockEnd = blockEnd ?? "";
blockStart = blockStart ?? "";
var maxContentSize = blockSize - blockEnd.Length - blockStart.Length;
await channel.TriggerTypingAsync().ConfigureAwait(false);
var buffer = new StringBuilder();
foreach (var line in message.Split(Environment.NewLine).Select(l => l.Trim(maxContentSize)))
{
if (buffer.Length + line.Length + blockEnd.Length > blockSize)
{
await channel.SendMessageAsync(buffer.Append(blockEnd).ToString()).ConfigureAwait(false);
await channel.TriggerTypingAsync().ConfigureAwait(false);
buffer.Clear().Append(blockStart);
}
else
buffer.AppendLine();
buffer.Append(line);
}
await channel.SendMessageAsync(buffer.ToString()).ConfigureAwait(false);
}
}
}