private static string GetCalcMessage(Message f, SocketRole role, AttackResult result) { return($"合計凸数: {ClanBattleUtil.CalcPercent(result.Users.Sum(u => u.Attacked), role.Members.Count() * 3)}\n" + $"残凸数: {ClanBattleUtil.CalcPercent(result.Users.Sum(u => u.Remain), role.Members.Count() * 3)}\n" + $"完凸済者: {ClanBattleUtil.CalcPercent(result.Users.Count(u => u.IsCompleted), role.Members.Count())}\n" + $"未完凸済者: {ClanBattleUtil.CalcPercent(result.Users.Count(u => !u.IsCompleted), role.Members.Count())}"); }
private static string GetSendMessage(SocketGuild server, Message f, AttackResult result) { return($"完凸した方:\n{ClanBattleUtil.AttackUser(result, server, 3)}\n" + $"残凸のある方: (⚠️:持ち越しあり)\n" + $"・2 凸済の方\n{ClanBattleUtil.AttackUser(result, server, 2)}\n" + $"・1 凸済の方\n{ClanBattleUtil.AttackUser(result, server, 1)}\n" + $"・未凸の方\n{ClanBattleUtil.AttackUser(result, server, 0)}"); }
private async Task Client_MessageReceived(SocketMessage arg) { var text = arg.Content.Trim(); if (text.StartsWith(Prefix)) { var line = text.Substring(Prefix.Length).Trim(); // コマンドチェック if (line.Length <= 0) { // なし Util.Error(arg, "コマンドが指定されていません。"); return; } // パラメーターで分割 var cmd = line.Split(' ').First(); var param = line.Split(' ').Skip(1).ToArray(); var server = (arg.Channel as SocketGuildChannel).Guild; // Typing... 演出 _ = arg.Channel.TriggerTypingAsync(); if (cmd == "init" && DiscordUtil.IsAdmin(arg)) { if (param.Length >= 2) { try { // 既に初期化済みの場合、登録済みの情報を消去 Settings.Servers.RemoveAll((sr) => sr.ID == server.Id); // 追加 var s = new Server() { ID = server.Id, AdminRole = ulong.Parse(param[0]), UserRole = ulong.Parse(param[1]) }; Settings.Servers.Add(s); await arg.Channel.SendMessageAsync($"サーバー {server.Name} の初期設定が完了しました。\n" + $"管理者役職: {server.GetRole(ulong.Parse(param[0])).Name}\n" + $"集計対象役職: {server.GetRole(ulong.Parse(param[1])).Name}"); return; } catch (Exception) { Util.Error(arg, "パラメータの値が不正です。"); return; } } else { Util.Error(arg, "パラメーターが不足しています。"); return; } } // 以下、初期化済みの場合のみ実行可能なコマンド。 if (!Settings.Servers.Any(s => s.ID == server.Id)) { Util.Error(arg, "サーバーで1度も初期設定を行っていません。"); return; } var srv = Settings.Servers.First(s => s.ID == server.Id); // 役職で操作を制限する if (!DiscordUtil.CanHandle(arg, srv)) { Util.Error(arg, "bot を操作する権限がありません。"); return; } if (cmd == "begin") { // 集計の開始。 if (param.Length >= 1) { var title = string.Join(" ", param); if (srv.Messages.Any(mt => mt.Title == title)) { // 重複チェック Util.Error(arg, "タイトルが重複しています。別のタイトルを指定してください。"); return; } if (ClanBattleUtil.Keywords.Any(str => str == title)) { // キーワード重複確認 Util.Error(arg, $"タイトル {title} は YukiChang 内で使用されるキーワードのため使用できません。別のタイトルを指定してください。"); return; } var m = await arg.Channel.SendMessageAsync($"凸集計: {title}\n" + $"本戦に挑戦し、凸が完了したら 1️⃣ 2️⃣ 3️⃣ のリアクションを押して進捗を記録します。\n" + $"持越しが発生した場合、☠️ ボタンを押して、持越しの使用後に数字のボタンを押してください。\n"); await m.AddReactionAsync(new Emoji("1️⃣")); await m.AddReactionAsync(new Emoji("2️⃣")); await m.AddReactionAsync(new Emoji("3️⃣")); await m.AddReactionAsync(new Emoji("☠️")); srv.Messages.Add(new Message() { MessageID = m.Id, ChannelID = m.Channel.Id, Title = title }); } else { Util.Error(arg, "パラメーターが不足しています。"); } } else if (cmd == "list") { await arg.Channel.SendMessageAsync($"{server.Name} の凸管理一覧\n" + $"{string.Join("\n", srv.Messages.Select(m => m.Title).ToArray())}"); } else if (cmd == "calc") { // 集計 if (param.Length >= 1) { var title = string.Join(" ", param); try { var f = ClanBattleUtil.GetProperMessage(srv.Messages.ToArray(), title); if (f == null) { Util.Error(arg, "そのメッセージは集計対象ではありません。"); return; } var m = await server.GetTextChannel(f.ChannelID).GetMessageAsync(f.MessageID); var role = server.GetRole(srv.UserRole); // 集計 var result = await ClanBattleUtil.CalcAttack(m, server.GetRole(srv.UserRole)); await arg.Channel.SendMessageAsync(GetHeader(f) + GetCalcMessage(f, role, result)); } catch (Exception) { Util.Error(arg, "パラメータの値が不正です。"); } } else { Util.Error(arg, "パラメーターが不足しています。"); } } else if (cmd == "send") { // 勧告 if (param.Length >= 1) { var title = string.Join(" ", param); try { var f = ClanBattleUtil.GetProperMessage(srv.Messages.ToArray(), title); if (f == null) { Util.Error(arg, "そのメッセージは集計対象ではありません。"); return; } var m = await server.GetTextChannel(f.ChannelID).GetMessageAsync(f.MessageID); var role = server.GetRole(srv.UserRole); // 集計 var result = await ClanBattleUtil.CalcAttack(m, server.GetRole(srv.UserRole)); await arg.Channel.SendMessageAsync(GetHeader(f) + GetSendMessage(server, f, result)); } catch (Exception) { Util.Error(arg, "パラメータの値が不正です。"); } } else { Util.Error(arg, "パラメーターが不足しています。"); } } else if (cmd == "all") { // 集計&勧告 if (param.Length >= 1) { var title = string.Join(" ", param); try { var f = ClanBattleUtil.GetProperMessage(srv.Messages.ToArray(), title); if (f == null) { Util.Error(arg, "そのメッセージは集計対象ではありません。"); return; } var m = await server.GetTextChannel(f.ChannelID).GetMessageAsync(f.MessageID); var role = server.GetRole(srv.UserRole); // 集計 var result = await ClanBattleUtil.CalcAttack(m, server.GetRole(srv.UserRole)); await arg.Channel.SendMessageAsync($"{GetHeader(f)}{GetCalcMessage(f, role, result)}\n\n{GetSendMessage(server, f, result)}"); } catch (Exception) { Util.Error(arg, "パラメータの値が不正です。"); } } else { Util.Error(arg, "パラメーターが不足しています。"); } } else if (cmd == "la") { // ラストアタックの集計 if (param.Length >= 1) { var title = string.Join(" ", param); try { var f = ClanBattleUtil.GetProperMessage(srv.Messages.ToArray(), title); if (f == null) { Util.Error(arg, "そのメッセージは集計対象ではありません。"); return; } var m = await server.GetTextChannel(f.ChannelID).GetMessageAsync(f.MessageID); var role = server.GetRole(srv.UserRole); await arg.Channel.SendMessageAsync($"{GetHeader(f)}" + $"{GetLAMessage(server, f.LastAttacks)}"); } catch (Exception) { Util.Error(arg, "パラメータの値が不正です。"); } } else { Util.Error(arg, "パラメーターが不足しています。"); } } else if (cmd == "laall") { // 全てのラストアタックの集計 var m = srv.Messages; var all = m.Select(message => message.LastAttacks).SelectMany(d => d) .ToLookup(k => k.Key, v => v.Value) .ToDictionary(group => group.Key, group => group.Sum()); var role = server.GetRole(srv.UserRole); await arg.Channel.SendMessageAsync($"{GetHeader(null)}" + $"{GetLAMessage(server, all)}"); } else if (cmd == "log") { // ログ設定 if (param.Length >= 1) { // 設定 try { var ch = server.GetTextChannel(ulong.Parse(param[0])); srv.LogChannel = ch.Id; await arg.Channel.SendMessageAsync($"リアクションログを流すチャンネルを {ch.Name} にしました。"); } catch (Exception) { Util.Error(arg, "正しくリアクションを流すチャンネルを設定することができませんでした。"); } } else { // 解除 srv.LogChannel = null; await arg.Channel.SendMessageAsync($"リアクションログを流すチャンネルを 未設定 にしました。"); } } else if (cmd == "csv") { // CSV出力 if (param.Length >= 1) { var title = string.Join(" ", param); try { if (!srv.Messages.Any(mt => mt.Title == title)) { Util.Error(arg, "そのメッセージは集計対象ではありません。"); } // CSV生成 var f = srv.Messages.First(mt => mt.Title == title); var csv = ClanBattleUtil.ToCSV(f.Logs, server, f.Title); var name = $"{server.Id}-{f.ChannelID}-{f.MessageID}.csv"; File.WriteAllText(name, csv, Encoding.UTF8); await arg.Channel.SendFileAsync(name, text : $"{f.Title} のログファイル:"); File.Delete(name); } catch (Exception) { Util.Error(arg, "パラメータの値が不正です。"); } } else { Util.Error(arg, "パラメーターが不足しています。"); } } else if (cmd == "dispose") { if (DiscordUtil.IsAdmin(arg)) { srv.Messages.Clear(); await arg.Channel.SendMessageAsync($"全てのメッセージを管理対象から除外しました。\n" + $"リアクションログの記録を消去しました。"); } else { await arg.Channel.SendMessageAsync($"権限がありません。"); } } else { // なし Util.Error(arg, "コマンドが存在しません。"); } // 保存 await Util.Save(Settings); } return; }