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()); } } }
/// <inheritdoc /> public async Task <EphemeralUser> GetUserInformationAsync(ulong guildId, ulong userId) { if (userId == 0) { return(null); } var guild = await DiscordClient.GetGuildAsync(guildId); var guildUser = await guild.GetUserAsync(userId); if (!(guildUser is null)) { await TrackUserAsync(guildUser); } var user = await DiscordClient.GetUserAsync(userId); var restUser = await DiscordRestClient.GetUserAsync(userId); var guildUserSummary = await GetGuildUserSummaryAsync(guildId, userId); var ban = (await guild.GetBansAsync()).FirstOrDefault(x => x.User.Id == userId); var buildUser = new EphemeralUser() .WithGuildUserSummaryData(guildUserSummary) .WithIUserData(restUser) .WithIUserData(user) .WithIGuildUserData(guildUser) .WithGuildContext(guild) .WithBanData(ban); return(buildUser.Id == 0 ? null : buildUser); }
public async Task <IGuildUser?> TryGetGuildUserAsync(IGuild guild, ulong userId, CancellationToken cancellationToken) { var user = await guild.GetUserAsync(userId); if (user is not null) { await TrackUserAsync(user, cancellationToken); return(user); } var restUser = await DiscordRestClient.GetUserAsync(userId); // Even if they aren't in the guild, we still want to track them. if (restUser is not null) { var ephemeralUser = new EphemeralUser() .WithIUserData(restUser) .WithGuildContext(guild); await TrackUserAsync(ephemeralUser, cancellationToken); return(null); } throw new InvalidOperationException($"Discord user {userId} does not exist"); }
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)); } } } }