Exemple #1
0
        public async static Task OnProblemReaction(DiscordClient sender, DiscordMessage msg, DiscordEmoji emoji, DiscordUser user, bool added)
        {
            var kanContext = KandoraContext.Instance;
            var msgId      = msg.Id;
            var problem    = kanContext.OngoingProblems[msgId];

            if (!problem.Options.Contains(emoji.Id))
            {
                return;
            }
            var  tile34   = fromEmojiToTile34(emoji);
            bool isWinner = problem.ChangeUserAnswer(user.Id, tile34, added);

            if (isWinner)
            {
                kanContext.OngoingProblems.Remove(msgId);
                var answer136 = TilesConverter.from_34_indices_to_136_array(new List <List <int> > {
                    problem.Answer.ToList()
                });
                var answerStr   = TilesConverter.to_one_line_string(answer136);
                var answerEmoji = HandParser.GetHandEmojiCodes(answerStr, sender);
                var sb          = new StringBuilder();
                sb.AppendLine($"{user.Mention} got this one first!");
                sb.AppendLine($"The answer was: {string.Join("", answerEmoji)}");
                await msg.RespondAsync(sb.ToString());
            }
        }
Exemple #2
0
        void DisplayOutput(HandParser h)
        {
            txtOutput.AppendText("-------------------------------------" + Environment.NewLine);
            if (chkMessages.Checked && h.Messages.Count > 0)
            {
                txtOutput.AppendText("*** MESSAGES ***" + Environment.NewLine);
                foreach (string message in h.Messages)
                {
                    txtOutput.AppendText(message + Environment.NewLine);
                }
            }

            if (chkErrors.Checked && h.Errors.Count > 0)
            {
                txtOutput.AppendText("*** ERRORS ***" + Environment.NewLine);
                foreach (string errorMessage in h.Errors)
                {
                    txtOutput.AppendText(errorMessage + Environment.NewLine);
                }
            }
            if (chkWarnings.Checked && h.Warnings.Count > 0)
            {
                txtOutput.AppendText("*** WARNINGS ***" + Environment.NewLine);
                foreach (string warningMessage in h.Warnings)
                {
                    txtOutput.AppendText(warningMessage + Environment.NewLine);
                }
            }
            txtOutput.AppendText("*** DONE ***" + Environment.NewLine);
        }
Exemple #3
0
        private async Task computeHand(CommandContext ctx, string hand, string options)
        {
            var basicHand    = HandParser.GetSimpleHand(hand);
            var handEmoji    = HandParser.GetHandEmojiCodes(hand, ctx.Client);
            var optionsEmoji = options == "all"
                ? handEmoji
                : HandParser.GetHandEmojiCodes(options, ctx.Client);

            try
            {
                await ctx.Message.DeleteAsync();
            }
            catch
            {
                // do nothing
            }

            var    hand34      = C.one_line_string_to_34_array(basicHand);
            string suitOrder   = U.getSuitOrder(basicHand);
            var    shantenCalc = new ShantenCalculator();
            int    shanten     = -2;
            var    nbTiles     = hand34.Sum();

            if (nbTiles == 13 || nbTiles == 14)
            {
                shanten = shantenCalc.Calculate_shanten(hand34);
            }
            StringBuilder sb = new();

            sb.AppendLine($"<@!{ctx.User.Id}>: {GetHandMessage(handEmoji)}  {getShanten(shanten)}\n");
            var divider = new HandDivider();
            var results = divider.divide_hand(hand34);

            int i = 1;

            foreach (var result in results)
            {
                var hand136 = C.from_34_indices_to_136_arrays(result);
                var setsStr = hand136.Select(set => C.to_one_line_string(set));
                IEnumerable <string> orderedSetStr = new List <string>();
                foreach (var chr in suitOrder)
                {
                    orderedSetStr = orderedSetStr.Concat(setsStr.Where(x => x.Contains(chr)));
                }
                sb.AppendLine($"{i}:{string.Join(",", orderedSetStr.Select(x => $"{GetHandMessage(HandParser.GetHandEmojiCodes(x, ctx.Client))}"))}\n");
                i++;
            }
            var message = await ctx.Channel.SendMessageAsync(sb.ToString());

            {
                foreach (var emoji in optionsEmoji)
                {
                    await message.CreateReactionAsync(emoji);
                }
            }
        }
Exemple #4
0
 void RunHandParserLine(string line)
 {
     try
     {
         HandParser h = new HandParser();
         h.MoveFile = false;
         h.ProcessLine(line);
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.ToString());
     }
 }
Exemple #5
0
 void RunHandParseDirectory(string handHistoryDirectory)
 {
     try
     {
         HandParser h = new HandParser(handHistoryDirectory);
         h.ParseResults();
         DisplayOutput(h);
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.ToString());
     }
 }
Exemple #6
0
        public async Task AddOngoingProblem(CommandContext ctx, DiscordMessage msg, ISet <int> answer, string options)
        {
            var optionsEmoji = HandParser.GetHandEmojiCodes(options, ctx.Client);
            var problem      = new OngoingProblem(answer);

            foreach (var emoji in optionsEmoji)
            {
                await msg.CreateReactionAsync(emoji);

                problem.Options.Add(emoji.Id);
            }
            OngoingProblems.Add(msg.Id, problem);
        }
Exemple #7
0
 void RunHandParseSingle(string handHistoryDirectory, string fileName, bool moveFile)
 {
     try
     {
         HandParser h = new HandParser(handHistoryDirectory);
         h.MoveFile = moveFile;
         h.ParseFile(fileName);
         DisplayOutput(h);
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.ToString());
     }
 }
Exemple #8
0
        public async Task Hand(
            CommandContext ctx,
            [Description("The hand to display. Circles: [0-9]p, Chars: [0-9]m, Bamboo: [0-9]s, Honnors: [1-7]z, Dragons: [R,W,G]d, Winds: [ESWN]w")] string hand,
            [Description("The options people can vote for, can be empty, \"all\", or be another hand format")] string options = ""
            )
        {
            try
            {
                var basicHand    = HandParser.GetSimpleHand(hand);
                var handEmoji    = HandParser.GetHandEmojiCodes(hand, ctx.Client);
                var optionsEmoji = options == "all"
                    ? handEmoji
                    : HandParser.GetHandEmojiCodes(options, ctx.Client);
                try
                {
                    //await ctx.Message.DeleteAsync();
                }
                catch
                {
                    // do nothing
                }

                var hand34      = TilesConverter.one_line_string_to_34_array(basicHand);
                var shantenCalc = new ShantenCalculator();
                int shanten     = -2;
                var nbTiles     = hand34.Sum();
                if (nbTiles == 13 || nbTiles == 14)
                {
                    shanten = shantenCalc.Calculate_shanten(hand34);
                }
                var message = await ctx.Channel.SendMessageAsync($"<@!{ctx.User.Id}>: {GetHandMessage(handEmoji)}  {getShanten(shanten)}");

                {
                    foreach (var emoji in optionsEmoji)
                    {
                        await message.CreateReactionAsync(emoji);
                    }
                }
            }
            catch (Exception e)
            {
                await ctx.RespondAsync(e.Message);
            }
        }
Exemple #9
0
 public async Task Image(
     CommandContext ctx,
     string hand
     )
 {
     try
     {
         List <string> basicHand = HandParser.SimpleTiles(hand).Where(x => x.Length == 2).ToList();
         if (basicHand.Count == 0)
         {
             throw new Exception("invalid hand");
         }
         var stream = ImageToolbox.GetImageFromTiles(hand);
         var mb     = new DiscordMessageBuilder();
         mb.WithFile(stream);
         await mb.SendAsync(ctx.Channel).ContinueWith(precedent => stream.Close());
     }
     catch (Exception e)
     {
         await ctx.RespondAsync(e.Message);
     }
 }
Exemple #10
0
        private async Task computeHandWithAgari(CommandContext ctx, string hand, string agari)
        {
            var    basicHand  = HandParser.GetSimpleHand(hand);
            var    basicAgari = HandParser.GetSimpleHand(agari);
            var    handEmoji  = HandParser.GetHandEmojiCodes(hand, ctx.Client);
            string suitOrder  = U.getSuitOrder(basicHand);

            var hand136  = C.one_line_string_to_136_array(basicHand);
            var agari136 = C.one_line_string_to_136_array(basicAgari)[0];

            StringBuilder sb = new();

            sb.AppendLine($"<@!{ctx.User.Id}>: {GetHandMessage(handEmoji)}\n");
            var config = new HandConfig();

            // TSUMO

            config.is_tsumo = true;
            var calculator   = new HandCalculator();
            var result       = calculator.estimate_hand_value(hand136.ToList(), agari136, config: config);
            var handShape136 = C.from_34_indices_to_136_arrays(result.hand);
            var setsStr      = handShape136.Select(set => C.to_one_line_string(set));
            IEnumerable <string> orderedSetStr = new List <string>();

            foreach (var chr in suitOrder)
            {
                orderedSetStr = orderedSetStr.Concat(setsStr.Where(x => x.Contains(chr)));
            }
            sb.AppendLine($"Tsumo:{string.Join(",", orderedSetStr.Select(x => $"{GetHandMessage(HandParser.GetHandEmojiCodes(x, ctx.Client))}"))}");

            sb.AppendLine($"{result.han}han {result.fu}fu");
            foreach (var yaku in result.yaku)
            {
                sb.AppendLine($"{yaku}");
            }
            if (result.cost != null)
            {
                foreach (var yaku in result.cost.Keys)
                {
                    sb.AppendLine($"{yaku}: {result.cost[yaku]}");
                }

                foreach (var detail in result.fu_details)
                {
                    sb.AppendLine($"{detail.Item2}: +{detail.Item1}fu");
                }
            }

            //RON

            config.is_tsumo = false;
            calculator      = new HandCalculator();
            result          = calculator.estimate_hand_value(hand136.ToList(), agari136, config: config);
            handShape136    = C.from_34_indices_to_136_arrays(result.hand);
            setsStr         = handShape136.Select(set => C.to_one_line_string(set));
            orderedSetStr   = new List <string>();
            foreach (var chr in suitOrder)
            {
                orderedSetStr = orderedSetStr.Concat(setsStr.Where(x => x.Contains(chr)));
            }
            sb.AppendLine();
            sb.AppendLine($"Ron:{string.Join(",", orderedSetStr.Select(x => $"{GetHandMessage(HandParser.GetHandEmojiCodes(x, ctx.Client))}"))}");

            sb.AppendLine($"{result.han}han {result.fu}fu");
            foreach (var yaku in result.yaku)
            {
                sb.AppendLine($"{yaku}");
            }

            if (result.cost != null)
            {
                foreach (var cost in result.cost.Keys)
                {
                    sb.AppendLine($"{cost}: {result.cost[cost]}");
                }
            }

            foreach (var detail in result.fu_details)
            {
                sb.AppendLine($"{detail.Item2}: +{detail.Item1}fu");
            }
            var message = await ctx.Channel.SendMessageAsync(sb.ToString());
        }