private async Task Client_ReactionRemoved(Cacheable <IUserMessage, ulong> arg1, ISocketMessageChannel arg2, SocketReaction arg3) { var server = (arg2 as SocketGuildChannel).Guild; if (Settings.Servers.Any(s => s.ID == server.Id)) { var target = Settings.Servers.First(s => s.ID == server.Id); var role = server.GetRole(target.UserRole); if (target.Messages.Any(m => m.MessageID == arg3.MessageId) && role.Members.Any(m => m.Id == arg3.UserId) && arg3.Emote.Name != new Emoji("☠️").Name) // Bot側からリアクションを消した場合と干渉するので例外的にログを流さない。 { var message = target.Messages.First(m => m.MessageID == arg3.MessageId); if (target.LogChannel.HasValue) { var ch = server.GetChannel(target.LogChannel.Value) as ISocketMessageChannel; await ch?.SendMessageAsync($"[{DateTime.Now}] {DiscordUtil.GetName(arg3.UserId, server)} さんが " + $"{message.Title} をリアクション {arg3.Emote.Name} を削除しました。"); } // ログから削除 var log = new Log(arg3.UserId, (ulong)DateTimeOffset.Now.ToUnixTimeSeconds(), arg3.Emote.Name); var mes = target.Messages.First(m => m.MessageID == arg3.MessageId); mes.Logs.RemoveAll(e => e.SameReact(log)); } } return; }
private static string GetLAMessage(SocketGuild guild, Dictionary <ulong, int> lastAttacks) { var result = new StringBuilder(); // 降順 var sorted = lastAttacks.OrderBy(m => m.Value).Reverse(); foreach (var item in sorted) { result.AppendLine($"{DiscordUtil.GetName(item.Key, guild)} さん: {item.Value } 回"); } return(result.ToString()); }
internal static string AttackUser(AttackResult result, SocketGuild socketGuild, int target) { var l = result.Users.Where(u => u.Attacked == target).ToList(); var text = ""; foreach (var item in l) { var name = DiscordUtil.GetName(item.UserID, socketGuild); if (item.LastAttack) { text += $"⚠️ "; } text += $"{name} さん"; text += $"\n"; } return(text); }
private async Task Client_ReactionAdded(Cacheable <IUserMessage, ulong> arg1, ISocketMessageChannel arg2, SocketReaction arg3) { var server = (arg2 as SocketGuildChannel).Guild; if (Settings.Servers.Any(s => s.ID == server.Id)) { var target = Settings.Servers.First(s => s.ID == server.Id); var role = server.GetRole(target.UserRole); if (target.Messages.Any(m => m.MessageID == arg3.MessageId) && role.Members.Any(m => m.Id == arg3.UserId)) { var message = target.Messages.First(m => m.MessageID == arg3.MessageId); if (target.LogChannel.HasValue) { var ch = server.GetChannel(target.LogChannel.Value) as ISocketMessageChannel; await ch?.SendMessageAsync($"[{DateTime.Now}] {DiscordUtil.GetName(arg3.UserId, server)} さんが " + $"{message.Title} にリアクション {arg3.Emote.Name} を付与しました。"); } // ログ取り var log = new Log(arg3.UserId, (ulong)DateTimeOffset.Now.ToUnixTimeSeconds(), arg3.Emote.Name); message.Logs.Add(log); // ラストアタックのリアクション付与時の処理 var lastAttackReact = new Emoji("☠️"); if (arg3.Emote.Name == lastAttackReact.Name) { // ラストアタックのリアクションである message.AddLastAttack(arg3.UserId); } // ラストアタックのリアクションを除去する処理。 var reacts = new Emoji[] { new Emoji("1️⃣"), new Emoji("2️⃣"), new Emoji("3️⃣") }; if (reacts.Any(r => r.Name == arg3.Emote.Name)) { // 1,2,3ボタンが押されたとき、ラストアタックの絵文字を削除する。 // リアクション削除 var msg = await arg1.GetOrDownloadAsync(); await msg.RemoveReactionAsync(new Emoji("☠️"), arg3.UserId); } } } return; }
/// <summary> /// UIDから名前を取得する。 /// </summary> /// <returns>ニックネームまたは名前</returns> internal string GetName(SocketGuild socketGuild) { return(DiscordUtil.GetName(User, socketGuild)); }