Make roll output fancy

This commit is contained in:
Daniel_I_Am 2020-06-03 21:37:34 +02:00
parent 513fe1948e
commit 9cceace905
No known key found for this signature in database
GPG Key ID: 80C428FCC9743E84

View File

@ -1,16 +1,122 @@
using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dice;
using Discord;
using Discord.Commands;
using Microsoft.VisualBasic;
using NLog;
namespace ChaosBot.Discord.Modules
{
public class DiceCommands : ModuleBase
{
private static Logger _logger = Program._logger;
[Command("roll")]
public async Task Roll(params string[] args)
{
await ReplyAsync($"You rolled {Roller.Roll(Strings.Join(args, " ")).Value}");
string diceRecipe = Strings.Join(args, " ");
try
{
var sb = new StringBuilder();
var embed = new EmbedBuilder();
RollResult rollResult = Roller.Roll(diceRecipe);
embed.WithColor(new Color(255, 255,0));
// embed.Title = $"Dice Roll";
sb.AppendLine($"{Context.User.Mention} :game_die:");
sb.AppendLine($"Result: {diceRecipe} ({DiceOutput(rollResult)})");
sb.AppendLine($"Total: {rollResult.Value}");
/*
* Add the string to the Embed
*/
embed.Description = sb.ToString();
/*
* Reply with the Embed created above
*/
await ReplyAsync(null, false, embed.Build());
}
catch (Exception ex)
{
_logger.Error($"diceCommands.RollCommand: Exception [{ex}] thrown, <[{ex.Message}]>.");
}
}
private string DiceOutput(RollResult rollResult)
{
if (rollResult.RollRoot == null) return "";
StringBuilder sb = new StringBuilder();
foreach (DieResult dieResult in rollResult.RollRoot.Values)
{
string result = ParseDiceResult(dieResult);
sb.Append(DieFormatting(dieResult.Flags));
sb.Append(result);
sb.Append(DieFormatting(dieResult.Flags, true));
}
return sb.ToString();
}
private string ParseDiceResult(DieResult dieResult)
{
switch (dieResult.DieType)
{
case DieType.Normal:
case DieType.Literal:
return dieResult.Value.ToString();
case DieType.Special:
switch (dieResult.SpecialDie)
{
case SpecialDie.Add:
return "+";
case SpecialDie.Comma:
return ",";
case SpecialDie.Divide:
return "/";
case SpecialDie.Multiply:
return "*";
case SpecialDie.Negate:
return "~";
case SpecialDie.Subtract:
return "-";
case SpecialDie.Text:
return dieResult.Data;
case SpecialDie.CloseParen:
return ")";
case SpecialDie.OpenParen:
return "(";
}
break;
}
return "";
}
private string DieFormatting(DieFlags flags, bool reverse=false)
{
StringBuilder sb = new StringBuilder();
if ((flags & (DieFlags.Critical ^ DieFlags.Success ^ DieFlags.Failure ^ DieFlags.Fumble)) != 0)
sb.Append("**");
if ((flags & DieFlags.Dropped) != 0)
sb.Append("~~");
if ((flags & DieFlags.Extra) != 0)
sb.Append("*");
if (reverse)
return new string(sb.ToString().Reverse().ToArray());
return sb.ToString();
}
}
}