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()); } }
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); }
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); } } }
void RunHandParserLine(string line) { try { HandParser h = new HandParser(); h.MoveFile = false; h.ProcessLine(line); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
void RunHandParseDirectory(string handHistoryDirectory) { try { HandParser h = new HandParser(handHistoryDirectory); h.ParseResults(); DisplayOutput(h); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
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); }
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()); } }
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); } }
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); } }
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()); }