From 438fb65c04fdcb3e5401714d283286ef9fc635e5 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Wed, 14 Sep 2016 14:23:09 +0200 Subject: [PATCH] Added coin flipping and betflipping --- .../Gambling/Commands/FlipCoinCommand.cs | 172 ++++++++++-------- src/NadekoBot/Modules/Gambling/Gambling.cs | 30 +-- src/NadekoBot/Services/CurrencyHandler.cs | 13 +- src/NadekoBot/_Extensions/Extensions.cs | 8 + 4 files changed, 125 insertions(+), 98 deletions(-) diff --git a/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs b/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs index 7e5eaa71..c1888913 100644 --- a/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs +++ b/src/NadekoBot/Modules/Gambling/Commands/FlipCoinCommand.cs @@ -1,93 +1,107 @@ using Discord; using Discord.Commands; +using ImageProcessorCore; +using NadekoBot.Attributes; +using NadekoBot.Extensions; +using NadekoBot.Services; +using System.IO; +using System.Threading.Tasks; -//todo drawing namespace NadekoBot.Modules.Gambling -{ - [Group] - public class FlipCoinCommands +{ + public partial class Gambling { - - public FlipCoinCommands() { } - - - ////todo drawing - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task Flip(IUserMessage imsg, int count = 0) - //{ - // var channel = (ITextChannel)imsg.Channel; - // if (count == 0) - // { - // if (rng.Next(0, 2) == 1) - // await channel.SendFileAsync("heads.png", ).ConfigureAwait(false); - // else - // await channel.SendFileAsync("tails.png", ).ConfigureAwait(false); - // return; - // } - // if (result > 10) - // result = 10; - // var imgs = new Image[result]; - // for (var i = 0; i < result; i++) - // { - // imgs[i] = rng.Next(0, 2) == 0 ? - // Properties.Resources.tails : - // Properties.Resources.heads; - // } - // await channel.SendFile($"{result} coins.png", imgs.Merge().ToStream(System.Drawing.Imaging.ImageFormat.Png)).ConfigureAwait(false); - // return; - // await channel.SendMessageAsync("Invalid number").ConfigureAwait(false); - //} - - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task Betflip(IUserMessage umsg, int amount, string guess) - //{ - // var channel = (ITextChannel)umsg.Channel; - // var guildUser = (IGuildUser)umsg.Author; - // var guessStr = guess.Trim().ToUpperInvariant(); - // if (guessStr != "H" && guessStr != "T" && guessStr != "HEADS" && guessStr != "TAILS") - // return; + [Group] + public class FlipCoinCommands + { + NadekoRandom rng { get; } = new NadekoRandom(); + private const string headsPath = "data/images/coins/heads.png"; + private const string tailsPath = "data/images/coins/tails.png"; + public FlipCoinCommands() { } - // if (amount < 1) - // return; + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + public async Task Flip(IUserMessage imsg, int count = 1) + { + var channel = (ITextChannel)imsg.Channel; + if (count == 1) + { + if (rng.Next(0, 2) == 1) + await channel.SendFileAsync(headsPath, $"{imsg.Author.Mention} rolled " + Format.Code("Heads") + ".").ConfigureAwait(false); + else + await channel.SendFileAsync(tailsPath, $"{imsg.Author.Mention} rolled " + Format.Code("Tails") + ".").ConfigureAwait(false); + return; + } + if (count > 10 || count < 1) + { + await channel.SendMessageAsync("`Invalid number specified. You can flip 1 to 10 coins.`"); + return; + } + var imgs = new Image[count]; + for (var i = 0; i < count; i++) + { + imgs[i] = rng.Next(0, 10) < 5 ? + new Image(File.OpenRead(headsPath)) : + new Image(File.OpenRead(tailsPath)); + } + await channel.SendFileAsync(imgs.Merge().ToStream(), $"{count} coins.png").ConfigureAwait(false); + } - // var userFlowers = Gambling.GetUserFlowers(umsg.Author.Id); + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + public async Task Betflip(IUserMessage umsg, int amount, string guess) + { + var channel = (ITextChannel)umsg.Channel; + var guildUser = (IGuildUser)umsg.Author; + var guessStr = guess.Trim().ToUpperInvariant(); + if (guessStr != "H" && guessStr != "T" && guessStr != "HEADS" && guessStr != "TAILS") + return; - // if (userFlowers < amount) - // { - // await channel.SendMessageAsync($"{umsg.Author.Mention} You don't have enough {Gambling.CurrencyName}s. You only have {userFlowers}{Gambling.CurrencySign}.").ConfigureAwait(false); - // return; - // } + if (amount < 1) + return; - // await CurrencyHandler.RemoveCurrencyAsync(guildUser, "Betflip Gamble", amount, false).ConfigureAwait(false); - // //heads = true - // //tails = false + long userFlowers; + using (var uow = DbHandler.UnitOfWork()) + { + userFlowers = uow.Currency.GetOrCreate(umsg.Author.Id).Amount; + } - // var isHeads = guessStr == "HEADS" || guessStr == "H"; - // bool result = false; - // var rng = new NadekoRandom(); - // if (rng.Next(0, 2) == 1) - // { - // await channel.SendFileAsync("heads.png", Properties.Resources.heads.ToStream(System.Drawing.Imaging.ImageFormat.Png)).ConfigureAwait(false); - // result = true; - // } - // else - // { - // await channel.SendFileAsync("tails.png", Properties.Resources.tails.ToStream(System.Drawing.Imaging.ImageFormat.Png)).ConfigureAwait(false); - // } + if (userFlowers < amount) + { + await channel.SendMessageAsync($"{umsg.Author.Mention} You don't have enough {Gambling.CurrencyPluralName}. You only have {userFlowers}{Gambling.CurrencySign}.").ConfigureAwait(false); + return; + } - // string str; - // if (isHeads == result) - // { - // str = $"{umsg.Author.Mention}`You guessed it!` You won {amount * 2}{Gambling.CurrencySign}"; - // await CurrencyHandler.AddCurrencyAsync((IGuildUser)umsg.Author, "Betflip Gamble", amount * 2, false).ConfigureAwait(false); + await CurrencyHandler.RemoveCurrencyAsync(guildUser, "Betflip Gamble", amount, false).ConfigureAwait(false); + //heads = true + //tails = false - // } - // else - // str = $"{umsg.Author.Mention}`More luck next time.`"; + var isHeads = guessStr == "HEADS" || guessStr == "H"; + bool result = false; + string imgPathToSend; + if (rng.Next(0, 2) == 1) + { + imgPathToSend = headsPath; + result = true; + } + else + { + imgPathToSend = tailsPath; + } - // await channel.SendMessageAsync(str).ConfigureAwait(false); - //} + string str; + if (isHeads == result) + { + str = $"{umsg.Author.Mention}`You guessed it!` You won {amount * 2}{Gambling.CurrencySign}"; + await CurrencyHandler.AddCurrencyAsync((IGuildUser)umsg.Author, "Betflip Gamble", amount * 2, false).ConfigureAwait(false); + } + else + { + str = $"{umsg.Author.Mention}`Better luck next time.`"; + } + + await channel.SendFileAsync(imgPathToSend, str).ConfigureAwait(false); + } + } } -} +} \ No newline at end of file diff --git a/src/NadekoBot/Modules/Gambling/Gambling.cs b/src/NadekoBot/Modules/Gambling/Gambling.cs index 4585a820..589441ac 100644 --- a/src/NadekoBot/Modules/Gambling/Gambling.cs +++ b/src/NadekoBot/Modules/Gambling/Gambling.cs @@ -82,25 +82,25 @@ namespace NadekoBot.Modules.Gambling await channel.SendMessageAsync($"{umsg.Author.Mention} successfully sent {amount} {Gambling.CurrencyPluralName}s to {receiver.Mention}!").ConfigureAwait(false); } - ////todo owner only - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public Task Award(IUserMessage umsg, long amount, [Remainder] IGuildUser usr) => - // Award(umsg, amount, usr.Id); + //todo owner only + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + public Task Award(IUserMessage umsg, long amount, [Remainder] IGuildUser usr) => + Award(umsg, amount, usr.Id); - //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] - //[RequireContext(ContextType.Guild)] - //public async Task Award(IUserMessage umsg, long amount, [Remainder] ulong usrId) - //{ - // var channel = (ITextChannel)umsg.Channel; + [LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] + [RequireContext(ContextType.Guild)] + public async Task Award(IUserMessage umsg, long amount, [Remainder] ulong usrId) + { + var channel = (ITextChannel)umsg.Channel; - // if (amount <= 0) - // return; + if (amount <= 0) + return; - // await CurrencyHandler.AddFlowersAsync(usrId, $"Awarded by bot owner. ({umsg.Author.Username}/{umsg.Author.Id})", (int)amount).ConfigureAwait(false); + await CurrencyHandler.AddCurrencyAsync(usrId, $"Awarded by bot owner. ({umsg.Author.Username}/{umsg.Author.Id})", (int)amount).ConfigureAwait(false); - // await channel.SendMessageAsync($"{umsg.Author.Mention} successfully awarded {amount} {Gambling.CurrencyName}s to <@{usrId}>!").ConfigureAwait(false); - //} + await channel.SendMessageAsync($"{umsg.Author.Mention} successfully awarded {amount} {Gambling.CurrencyName}s to <@{usrId}>!").ConfigureAwait(false); + } ////todo owner only //[LocalizedCommand, LocalizedDescription, LocalizedSummary, LocalizedAlias] diff --git a/src/NadekoBot/Services/CurrencyHandler.cs b/src/NadekoBot/Services/CurrencyHandler.cs index aa7fc918..f2834589 100644 --- a/src/NadekoBot/Services/CurrencyHandler.cs +++ b/src/NadekoBot/Services/CurrencyHandler.cs @@ -33,6 +33,14 @@ namespace NadekoBot.Services } public static async Task AddCurrencyAsync(IGuildUser author, string reason, long amount, bool sendMessage) + { + await AddCurrencyAsync(author.Id, reason, amount); + + if (sendMessage) + await author.SendMessageAsync($"`You received:` {amount} {Gambling.CurrencySign}\n`Reason:` {reason}").ConfigureAwait(false); + } + + public static async Task AddCurrencyAsync(ulong receiverId, string reason, long amount) { if (amount < 0) throw new ArgumentNullException(nameof(amount)); @@ -40,12 +48,9 @@ namespace NadekoBot.Services using (var uow = DbHandler.UnitOfWork()) { - uow.Currency.TryUpdateState(author.Id, amount); + uow.Currency.TryUpdateState(receiverId, amount); await uow.CompleteAsync(); } - - if (sendMessage) - await author.SendMessageAsync($"`You received:` {amount} {Gambling.CurrencySign}\n`Reason:` {reason}").ConfigureAwait(false); } } } diff --git a/src/NadekoBot/_Extensions/Extensions.cs b/src/NadekoBot/_Extensions/Extensions.cs index 008fe97b..98a1be46 100644 --- a/src/NadekoBot/_Extensions/Extensions.cs +++ b/src/NadekoBot/_Extensions/Extensions.cs @@ -290,5 +290,13 @@ namespace NadekoBot.Extensions return canvas; } + + public static Stream ToStream(this Image img) + { + var imageStream = new MemoryStream(); + img.SaveAsPng(imageStream); + imageStream.Position = 0; + return imageStream; + } } } \ No newline at end of file