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); } } }
public static (FileStream, string) getNewProblem(string suit = "s") { var dirChar = Path.DirectorySeparatorChar; var outputDirPath = string.Join(dirChar, Assembly.GetExecutingAssembly().Location.Split(dirChar).SkipLast(1).Append(resourcesDirName).Append(outputDirName)); var offset = 0; if (suit == "s") { offset = 18; } else if (suit == "p") { offset = 9; } var rd = new Random(); int[] hand; string handStr = ""; int shanten = 7; bool handAlreadyExist = true; var nbIter = 0; var shantenCalc = new ShantenCalculator(); var availableTiles = new List <int>(); for (int i = 0; i <= 8; i++) { availableTiles.Add(i); availableTiles.Add(i); availableTiles.Add(i); availableTiles.Add(i); } while (shanten != 0 || handAlreadyExist) { hand = new int[34]; for (int i = 1; i <= 13; i++) { var roll = rd.Next(0, availableTiles.Count); var value = availableTiles[roll]; hand[offset + value]++; availableTiles.RemoveAt(roll); } shanten = shantenCalc.Calculate_shanten(hand); nbIter++; var hand136 = TilesConverter.to_136_array(hand.ToList()); handStr = TilesConverter.to_one_line_string(hand136); var outputFileName = $"{hand}.png"; var outputFilePath = string.Join(dirChar, new string[] { outputDirPath, outputFileName }); handAlreadyExist = File.Exists(outputFilePath); } return(GetImageFromTiles(handStr), handStr); }
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); } }