public UserInfoEmbedBuilderHelper WithMemberInformation(IGuildUser user) { _content.AppendLine("\n**\u276F Member Information**"); if (!string.IsNullOrEmpty(user.Nickname)) { _content.AppendLine("Nickname: " + user.Nickname); } _content.AppendLine($"Created: {FormatUtilities.FormatTimeAgo(_nowUtc, user.CreatedAt)}"); if (user.JoinedAt is { } joinedAt) { _content.AppendLine($"Joined: {FormatUtilities.FormatTimeAgo(_nowUtc, joinedAt)}"); } if (user.RoleIds?.Count > 0) { var roles = user.RoleIds.Select(x => user.Guild.Roles.Single(y => y.Id == x)) .Where(x => x.Id != x.Guild.Id) .OrderByDescending(role => role) .ToArray(); if (roles.Any()) { _content.Append($"{"Role".ToQuantity(roles.Length, ShowQuantityAs.None)}: "); _content.AppendLine(roles.Select(r => r.Mention).Humanize()); } } return(this); }
private void AddMemberInformationToEmbed(EphemeralUser member, StringBuilder builder) { builder.AppendLine(); builder.AppendLine("**\u276F Member Information**"); if (!string.IsNullOrEmpty(member.Nickname)) { builder.AppendLine("Nickname: " + Format.Sanitize(member.Nickname)); } builder.AppendLine($"Created: {FormatUtilities.FormatTimeAgo(_utcNow, member.CreatedAt)}"); if (member.JoinedAt is DateTimeOffset joinedAt) { builder.AppendLine($"Joined: {FormatUtilities.FormatTimeAgo(_utcNow, joinedAt)}"); } if (member.RoleIds?.Count > 0) { var roles = member.RoleIds.Select(x => member.Guild.Roles.Single(y => y.Id == x)) .Where(x => x.Id != x.Guild.Id) // @everyone role always has same ID than guild .ToArray(); if (roles.Length > 0) { Array.Sort(roles); // Sort by position: lowest positioned role is first Array.Reverse(roles); // Reverse the sort: highest positioned role is first builder.Append($"{"Role".ToQuantity(roles.Length, ShowQuantityAs.None)}: "); builder.AppendLine(roles.Select(r => r.Mention).Humanize()); } } }
public UserInfoEmbedBuilderHelper WithFirstAndLastSeen(DateTimeOffset firstSeen, DateTimeOffset lastSeen) { _content.AppendLine($"First Seen: {FormatUtilities.FormatTimeAgo(_nowUtc, firstSeen)}"); _content.AppendLine($"Last Seen: {FormatUtilities.FormatTimeAgo(_nowUtc, lastSeen)}"); return(this); }
public void AppendGuildInformation(StringBuilder stringBuilder, IGuild guild) { stringBuilder .AppendLine(Format.Bold("\u276F Guild Information")) .AppendLine($"ID: {guild.Id}") .AppendLine($"Owner: {MentionUtils.MentionUser(guild.OwnerId)}") .AppendLine($"Created: {FormatUtilities.FormatTimeAgo(_utcNow, guild.CreatedAt)}") .AppendLine(); }
private async Task AddMemberInformationToEmbedAsync(EphemeralUser member, StringBuilder builder, EmbedBuilder embedBuilder) { builder.AppendLine(); builder.AppendLine("**\u276F Member Information**"); if (!string.IsNullOrEmpty(member.Nickname)) { builder.AppendLine("Nickname: " + member.Nickname); } builder.AppendLine($"Created: {FormatUtilities.FormatTimeAgo(_utcNow, member.CreatedAt)}"); if (member.JoinedAt is DateTimeOffset joinedAt) { builder.AppendLine($"Joined: {FormatUtilities.FormatTimeAgo(_utcNow, joinedAt)}"); } if (member.RoleIds?.Count > 0) { var roles = member.RoleIds.Select(x => member.Guild.Roles.Single(y => y.Id == x)) .Where(x => x.Id != x.Guild.Id) // @everyone role always has same ID than guild .ToArray(); if (roles.Length > 0) { Array.Sort(roles); // Sort by position: lowest positioned role is first Array.Reverse(roles); // Reverse the sort: highest positioned role is first builder.Append("Role".ToQuantity(roles.Length, ShowQuantityAs.None)); builder.Append(": "); builder.AppendLine(roles.Select(r => r.Mention).Humanize()); } } if ((member.GetAvatarUrl(size: 16) ?? member.GetDefaultAvatarUrl()) is string avatarUrl) { using (var httpStream = await HttpClientFactory.CreateClient().GetStreamAsync(avatarUrl)) { using (var avatarStream = new MemoryStream()) { await httpStream.CopyToAsync(avatarStream); var avatar = new Image(avatarStream); embedBuilder.WithColor(FormatUtilities.GetDominantColor(avatar)); } } } }
public async Task GetUserInfoAsync( [Summary("The user to retrieve information about, if any.")] [Remainder] DiscordUserOrMessageAuthorEntity user = null) { var userId = user?.UserId ?? Context.User.Id; var timer = Stopwatch.StartNew(); var userInfo = await _userService.GetUserInformationAsync(Context.Guild.Id, userId); if (userInfo == null) { var embed = new EmbedBuilder() .WithTitle("Retrieval Error") .WithColor(Color.Red) .WithDescription("Sorry, we don't have any data for that user - and we couldn't find any, either.") .AddField("User Id", userId); await _autoRemoveMessageService.RegisterRemovableMessageAsync( Context.User, embed, async (embedBuilder) => await ReplyAsync(embed: embedBuilder.Build())); return; } var builder = new StringBuilder(); builder.AppendLine("**\u276F User Information**"); builder.AppendLine("ID: " + userId); builder.AppendLine("Profile: " + MentionUtils.MentionUser(userId)); var embedBuilder = new EmbedBuilder() .WithUserAsAuthor(userInfo) .WithTimestamp(_utcNow); var avatar = userInfo.GetDefiniteAvatarUrl(); embedBuilder.ThumbnailUrl = avatar; embedBuilder.Author.IconUrl = avatar; ValueTask <Color> colorTask = default; if ((userInfo.GetAvatarUrl(size: 16) ?? userInfo.GetDefaultAvatarUrl()) is { } avatarUrl) { colorTask = _imageService.GetDominantColorAsync(new Uri(avatarUrl)); } var moderationRead = await _authorizationService.HasClaimsAsync(Context.User as IGuildUser, AuthorizationClaim.ModerationRead); var promotions = await _promotionsService.GetPromotionsForUserAsync(Context.Guild.Id, userId); if (userInfo.IsBanned) { builder.AppendLine("Status: **Banned** \\🔨"); if (moderationRead) { builder.AppendLine($"Ban Reason: {userInfo.BanReason}"); } } if (userInfo.FirstSeen is DateTimeOffset firstSeen) { builder.AppendLine($"First Seen: {FormatUtilities.FormatTimeAgo(_utcNow, firstSeen)}"); } if (userInfo.LastSeen is DateTimeOffset lastSeen) { builder.AppendLine($"Last Seen: {FormatUtilities.FormatTimeAgo(_utcNow, lastSeen)}"); } try { var userRank = await _messageRepository.GetGuildUserParticipationStatistics(Context.Guild.Id, userId); var messagesByDate = await _messageRepository.GetGuildUserMessageCountByDate(Context.Guild.Id, userId, TimeSpan.FromDays(30)); var messageCountsByChannel = await _messageRepository.GetGuildUserMessageCountByChannel(Context.Guild.Id, userId, TimeSpan.FromDays(30)); var emojiCounts = await _emojiRepository.GetEmojiStatsAsync(Context.Guild.Id, SortDirection.Ascending, 1, userId : userId); await AddParticipationToEmbedAsync(userId, builder, userRank, messagesByDate, messageCountsByChannel, emojiCounts); } catch (Exception ex) { _log.LogError(ex, "An error occured while retrieving a user's message count."); } AddMemberInformationToEmbed(userInfo, builder); AddPromotionsToEmbed(builder, promotions); if (moderationRead) { await AddInfractionsToEmbedAsync(userId, builder); } embedBuilder.Description = builder.ToString(); embedBuilder.WithColor(await colorTask); timer.Stop(); embedBuilder.WithFooter(footer => footer.Text = $"Completed after {timer.ElapsedMilliseconds} ms"); await _autoRemoveMessageService.RegisterRemovableMessageAsync( userInfo.Id == Context.User.Id?new[] { userInfo } : new[] { userInfo, Context.User }, embedBuilder, async (embedBuilder) => await ReplyAsync(embed: embedBuilder.Build())); }
private void AddPromotionsToEmbed(StringBuilder builder, IReadOnlyCollection <PromotionCampaignSummary> promotions) { if (promotions.Count == 0) { return; } builder.AppendLine(); builder.AppendLine(Format.Bold("\u276F Promotion History")); foreach (var promotion in promotions.OrderByDescending(x => x.CloseAction.Id).Take(5)) { builder.AppendLine($"• {MentionUtils.MentionRole(promotion.TargetRole.Id)} {FormatUtilities.FormatTimeAgo(_utcNow, promotion.CloseAction.Created)}"); } }
public async Task GetUserInfoAsync( [Summary("The user to retrieve information about, if any.")] [Remainder] DiscordUserEntity user = null) { user = user ?? new DiscordUserEntity(Context.User.Id); var timer = Stopwatch.StartNew(); var userInfo = await UserService.GetUserInformationAsync(Context.Guild.Id, user.Id); if (userInfo == null) { await ReplyAsync("", embed : new EmbedBuilder() .WithTitle("Retrieval Error") .WithColor(Color.Red) .WithDescription("Sorry, we don't have any data for that user - and we couldn't find any, either.") .AddField("User Id", user.Id) .Build()); return; } var builder = new StringBuilder(); builder.AppendLine("**\u276F User Information**"); builder.AppendLine("ID: " + userInfo.Id); builder.AppendLine("Profile: " + MentionUtils.MentionUser(userInfo.Id)); if (userInfo.IsBanned) { builder.AppendLine("Status: **Banned** \\🔨"); if (await AuthorizationService.HasClaimsAsync(Context.User as IGuildUser, AuthorizationClaim.ModerationRead)) { builder.AppendLine($"Ban Reason: {userInfo.BanReason}"); } } else { builder.AppendLine($"Status: {userInfo.Status.Humanize()}"); } if (userInfo.FirstSeen is DateTimeOffset firstSeen) { builder.AppendLine($"First Seen: {FormatUtilities.FormatTimeAgo(_utcNow, firstSeen)}"); } if (userInfo.LastSeen is DateTimeOffset lastSeen) { builder.AppendLine($"Last Seen: {FormatUtilities.FormatTimeAgo(_utcNow, lastSeen)}"); } try { await AddParticipationToEmbedAsync(user.Id, builder); } catch (Exception ex) { Log.LogError(ex, "An error occured while retrieving a user's message count."); } var embedBuilder = new EmbedBuilder() .WithUserAsAuthor(userInfo) .WithTimestamp(_utcNow); var avatar = userInfo.GetDefiniteAvatarUrl(); embedBuilder.ThumbnailUrl = avatar; embedBuilder.Author.IconUrl = avatar; await AddMemberInformationToEmbedAsync(userInfo, builder, embedBuilder); await AddPromotionsToEmbedAsync(user.Id, builder); if (await AuthorizationService.HasClaimsAsync(Context.User as IGuildUser, AuthorizationClaim.ModerationRead)) { await AddInfractionsToEmbedAsync(user.Id, builder); } embedBuilder.Description = builder.ToString(); timer.Stop(); embedBuilder.WithFooter(footer => footer.Text = $"Completed after {timer.ElapsedMilliseconds} ms"); await ReplyAsync(string.Empty, embed : embedBuilder.Build()); }
private async Task AddPromotionsToEmbedAsync(ulong userId, StringBuilder builder) { var promotions = await PromotionsService.GetPromotionsForUserAsync(Context.Guild.Id, userId); if (promotions.Count == 0) { return; } builder.AppendLine(); builder.AppendLine(Format.Bold("\u276F Promotion History")); foreach (var promotion in promotions.OrderByDescending(x => x.CloseAction.Id).Take(5)) { builder.AppendLine($"• {MentionUtils.MentionRole(promotion.TargetRole.Id)} {FormatUtilities.FormatTimeAgo(_utcNow, promotion.CloseAction.Created)}"); } }