diff --git a/ChaosBot/Discord/Modules/RaffleSystem.cs b/ChaosBot/Discord/Modules/RaffleSystem.cs new file mode 100644 index 0000000..6861553 --- /dev/null +++ b/ChaosBot/Discord/Modules/RaffleSystem.cs @@ -0,0 +1,149 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Discord; +using Discord.Commands; +using Discord.WebSocket; +using Microsoft.Extensions.Configuration; +using NLog; + +namespace ChaosBot.Discord.Modules +{ + + public class RaffleSystem : ModuleBase + { + private static Logger _logger = Program._logger; + + private static Dictionary _currentPot = new Dictionary(); + + [Command("raffle")] + [RequireUserPermission(GuildPermission.ManageGuild)] + public async Task RaffleInfo() { + try + { + var sb = new StringBuilder(); + var embed = new EmbedBuilder(); + string prefix = Program.Cfg.GetValue("Discord:Prefix"); + + embed.WithColor(new Color(255, 255,0)); + embed.Title = $"Raffle system"; + sb.AppendLine($"{Context.User.Mention} has requested raffle information."); + sb.AppendLine(); + sb.AppendLine($"Usage:"); + sb.AppendLine($"{prefix}raffle add "); + sb.AppendLine($"{prefix}raffle pick"); + sb.AppendLine($"{prefix}raffle clear"); + + /* + * 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($"InfoCommands.InfoCommand: Exception [{ex}] thrown, <[{ex.Message}]>."); + } + } + + [Command("raffle")] + [RequireUserPermission(GuildPermission.ManageGuild)] + public async Task RaffleCommand(string action, string user = null, int amount = 0) { + try + { + StringBuilder sb = new StringBuilder(); + var embed = new EmbedBuilder(); + string prefix = Program.Cfg.GetValue("Discord:Prefix"); + + embed.WithColor(new Color(255, 255,0)); + embed.Title = $"Raffle system"; + + switch (action) + { + case "add": + AddRaffle(sb, user, amount); + break; + case "pick": + PickRaffle(sb); + break; + case "clear": + ClearRaffle(sb); + break; + } + + /* + * 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($"InfoCommands.InfoCommand: Exception [{ex}] thrown, <[{ex.Message}]>."); + } + } + + private void AddRaffle(StringBuilder sb, string user, int amount) + { + ulong userId = Convert.ToUInt64(user.Substring(3, user.Length-4)); + int currentAmount; + if (_currentPot.TryGetValue(userId, out currentAmount)) + { + _currentPot.Remove(userId); + _currentPot.Add(userId, currentAmount + amount); + } + else + { + _currentPot.Add(userId, amount); + } + + sb.AppendLine($"{Context.User.Mention} has added {amount} rafflepoints to <@{userId}>."); + sb.AppendLine(); + sb.AppendLine($"<@{userId}> now has {_currentPot.GetValueOrDefault(userId)} rafflepoints!"); + } + + private void PickRaffle(StringBuilder sb) + { + int totalRaffle = _currentPot.Values.Sum(); + + if (totalRaffle == 0) + { + sb.Append("No one has any rafflepoints."); + return; + } + + int winner = new Random().Next(totalRaffle); + foreach (ulong userId in _currentPot.Keys) + { + int userValue = _currentPot.GetValueOrDefault(userId); + if (winner <= userValue) + { + sb.Append($"<@{userId}> has won the raffle!"); + ClearRaffle(sb, true); + return; + } + + winner -= userValue; + } + } + + private void ClearRaffle(StringBuilder sb, bool noOutput = false) + { + _currentPot = new Dictionary(); + + if (noOutput) return; + + sb.AppendLine($"{Context.User.Mention} has cleared all rafflepoints"); + } + } +} \ No newline at end of file