using Discord.Audio; using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Threading.Tasks; using EmbedModel = Discord.API.GuildEmbed; using Model = Discord.API.Guild; namespace Discord.Rest { /// /// Represents a REST-based guild/server. /// [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestGuild : RestEntity, IGuild, IUpdateable { private ImmutableDictionary _roles; private ImmutableArray _emotes; private ImmutableArray _features; /// public string Name { get; private set; } /// public int AFKTimeout { get; private set; } /// public bool IsEmbeddable { get; private set; } /// public VerificationLevel VerificationLevel { get; private set; } /// public MfaLevel MfaLevel { get; private set; } /// public DefaultMessageNotifications DefaultMessageNotifications { get; private set; } /// public ExplicitContentFilterLevel ExplicitContentFilter { get; private set; } /// public ulong? AFKChannelId { get; private set; } /// public ulong? EmbedChannelId { get; private set; } /// public ulong? SystemChannelId { get; private set; } /// public ulong OwnerId { get; private set; } /// public string VoiceRegionId { get; private set; } /// public string IconId { get; private set; } /// public string SplashId { get; private set; } internal bool Available { get; private set; } /// public ulong? ApplicationId { get; private set; } /// public PremiumTier PremiumTier { get; private set; } /// public string BannerId { get; private set; } /// public string VanityURLCode { get; private set; } /// public SystemChannelMessageDeny SystemChannelFlags { get; private set; } /// public string Description { get; private set; } /// public int PremiumSubscriptionCount { get; private set; } /// public string PreferredLocale { get; private set; } /// public CultureInfo PreferredCulture { get; private set; } /// public DateTimeOffset CreatedAt => SnowflakeUtils.FromSnowflake(Id); [Obsolete("DefaultChannelId is deprecated, use GetDefaultChannelAsync")] public ulong DefaultChannelId => Id; /// public string IconUrl => CDN.GetGuildIconUrl(Id, IconId); /// public string SplashUrl => CDN.GetGuildSplashUrl(Id, SplashId); /// public string BannerUrl => CDN.GetGuildBannerUrl(Id, BannerId); /// /// Gets the built-in role containing all users in this guild. /// public RestRole EveryoneRole => GetRole(Id); /// /// Gets a collection of all roles in this guild. /// public IReadOnlyCollection Roles => _roles.ToReadOnlyCollection(); /// public IReadOnlyCollection Emotes => _emotes; /// public IReadOnlyCollection Features => _features; internal RestGuild(BaseDiscordClient client, ulong id) : base(client, id) { } internal static RestGuild Create(BaseDiscordClient discord, Model model) { var entity = new RestGuild(discord, model.Id); entity.Update(model); return entity; } internal void Update(Model model) { AFKChannelId = model.AFKChannelId; EmbedChannelId = model.EmbedChannelId; SystemChannelId = model.SystemChannelId; AFKTimeout = model.AFKTimeout; IsEmbeddable = model.EmbedEnabled; IconId = model.Icon; Name = model.Name; OwnerId = model.OwnerId; VoiceRegionId = model.Region; SplashId = model.Splash; VerificationLevel = model.VerificationLevel; MfaLevel = model.MfaLevel; DefaultMessageNotifications = model.DefaultMessageNotifications; ExplicitContentFilter = model.ExplicitContentFilter; ApplicationId = model.ApplicationId; PremiumTier = model.PremiumTier; VanityURLCode = model.VanityURLCode; BannerId = model.Banner; SystemChannelFlags = model.SystemChannelFlags; Description = model.Description; PremiumSubscriptionCount = model.PremiumSubscriptionCount.GetValueOrDefault(); PreferredLocale = model.PreferredLocale; PreferredCulture = new CultureInfo(PreferredLocale); if (model.Emojis != null) { var emotes = ImmutableArray.CreateBuilder(model.Emojis.Length); for (int i = 0; i < model.Emojis.Length; i++) emotes.Add(model.Emojis[i].ToEntity()); _emotes = emotes.ToImmutableArray(); } else _emotes = ImmutableArray.Create(); if (model.Features != null) _features = model.Features.ToImmutableArray(); else _features = ImmutableArray.Create(); var roles = ImmutableDictionary.CreateBuilder(); if (model.Roles != null) { for (int i = 0; i < model.Roles.Length; i++) roles[model.Roles[i].Id] = RestRole.Create(Discord, this, model.Roles[i]); } _roles = roles.ToImmutable(); Available = true; } internal void Update(EmbedModel model) { EmbedChannelId = model.ChannelId; IsEmbeddable = model.Enabled; } //General /// public async Task UpdateAsync(RequestOptions options = null) => Update(await Discord.ApiClient.GetGuildAsync(Id, options).ConfigureAwait(false)); /// public Task DeleteAsync(RequestOptions options = null) => GuildHelper.DeleteAsync(this, Discord, options); /// /// is null. public async Task ModifyAsync(Action func, RequestOptions options = null) { var model = await GuildHelper.ModifyAsync(this, Discord, func, options).ConfigureAwait(false); Update(model); } /// /// is null. public async Task ModifyEmbedAsync(Action func, RequestOptions options = null) { var model = await GuildHelper.ModifyEmbedAsync(this, Discord, func, options).ConfigureAwait(false); Update(model); } /// /// is null. public async Task ReorderChannelsAsync(IEnumerable args, RequestOptions options = null) { var arr = args.ToArray(); await GuildHelper.ReorderChannelsAsync(this, Discord, arr, options).ConfigureAwait(false); } /// public async Task ReorderRolesAsync(IEnumerable args, RequestOptions options = null) { var models = await GuildHelper.ReorderRolesAsync(this, Discord, args, options).ConfigureAwait(false); foreach (var model in models) { var role = GetRole(model.Id); role?.Update(model); } } /// public Task LeaveAsync(RequestOptions options = null) => GuildHelper.LeaveAsync(this, Discord, options); //Bans //Bans /// /// Gets a collection of all users banned in this guild. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains a read-only collection of /// ban objects that this guild currently possesses, with each object containing the user banned and reason /// behind the ban. /// public Task> GetBansAsync(RequestOptions options = null) => GuildHelper.GetBansAsync(this, Discord, options); /// /// Gets a ban object for a banned user. /// /// The banned user. /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains a ban object, which /// contains the user information and the reason for the ban; null if the ban entry cannot be found. /// public Task GetBanAsync(IUser user, RequestOptions options = null) => GuildHelper.GetBanAsync(this, Discord, user.Id, options); /// /// Gets a ban object for a banned user. /// /// The snowflake identifier for the banned user. /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains a ban object, which /// contains the user information and the reason for the ban; null if the ban entry cannot be found. /// public Task GetBanAsync(ulong userId, RequestOptions options = null) => GuildHelper.GetBanAsync(this, Discord, userId, options); /// public Task AddBanAsync(IUser user, int pruneDays = 0, string reason = null, RequestOptions options = null) => GuildHelper.AddBanAsync(this, Discord, user.Id, pruneDays, reason, options); /// public Task AddBanAsync(ulong userId, int pruneDays = 0, string reason = null, RequestOptions options = null) => GuildHelper.AddBanAsync(this, Discord, userId, pruneDays, reason, options); /// public Task RemoveBanAsync(IUser user, RequestOptions options = null) => GuildHelper.RemoveBanAsync(this, Discord, user.Id, options); /// public Task RemoveBanAsync(ulong userId, RequestOptions options = null) => GuildHelper.RemoveBanAsync(this, Discord, userId, options); //Channels /// /// Gets a collection of all channels in this guild. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains a read-only collection of /// generic channels found within this guild. /// public Task> GetChannelsAsync(RequestOptions options = null) => GuildHelper.GetChannelsAsync(this, Discord, options); /// /// Gets a channel in this guild. /// /// The snowflake identifier for the channel. /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains the generic channel /// associated with the specified ; null if none is found. /// public Task GetChannelAsync(ulong id, RequestOptions options = null) => GuildHelper.GetChannelAsync(this, Discord, id, options); /// /// Gets a text channel in this guild. /// /// The snowflake identifier for the text channel. /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains the text channel /// associated with the specified ; null if none is found. /// public async Task GetTextChannelAsync(ulong id, RequestOptions options = null) { var channel = await GuildHelper.GetChannelAsync(this, Discord, id, options).ConfigureAwait(false); return channel as RestTextChannel; } /// /// Gets a collection of all text channels in this guild. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains a read-only collection of /// message channels found within this guild. /// public async Task> GetTextChannelsAsync(RequestOptions options = null) { var channels = await GuildHelper.GetChannelsAsync(this, Discord, options).ConfigureAwait(false); return channels.OfType().ToImmutableArray(); } /// /// Gets a voice channel in this guild. /// /// The snowflake identifier for the voice channel. /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains the voice channel associated /// with the specified ; null if none is found. /// public async Task GetVoiceChannelAsync(ulong id, RequestOptions options = null) { var channel = await GuildHelper.GetChannelAsync(this, Discord, id, options).ConfigureAwait(false); return channel as RestVoiceChannel; } /// /// Gets a collection of all voice channels in this guild. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains a read-only collection of /// voice channels found within this guild. /// public async Task> GetVoiceChannelsAsync(RequestOptions options = null) { var channels = await GuildHelper.GetChannelsAsync(this, Discord, options).ConfigureAwait(false); return channels.OfType().ToImmutableArray(); } /// /// Gets a collection of all category channels in this guild. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains a read-only collection of /// category channels found within this guild. /// public async Task> GetCategoryChannelsAsync(RequestOptions options = null) { var channels = await GuildHelper.GetChannelsAsync(this, Discord, options).ConfigureAwait(false); return channels.OfType().ToImmutableArray(); } /// /// Gets the AFK voice channel in this guild. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains the voice channel that the /// AFK users will be moved to after they have idled for too long; null if none is set. /// public async Task GetAFKChannelAsync(RequestOptions options = null) { var afkId = AFKChannelId; if (afkId.HasValue) { var channel = await GuildHelper.GetChannelAsync(this, Discord, afkId.Value, options).ConfigureAwait(false); return channel as RestVoiceChannel; } return null; } /// /// Gets the first viewable text channel in this guild. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains the first viewable text /// channel in this guild; null if none is found. /// public async Task GetDefaultChannelAsync(RequestOptions options = null) { var channels = await GetTextChannelsAsync(options).ConfigureAwait(false); var user = await GetCurrentUserAsync(options).ConfigureAwait(false); return channels .Where(c => user.GetPermissions(c).ViewChannel) .OrderBy(c => c.Position) .FirstOrDefault(); } /// /// Gets the embed channel (i.e. the channel set in the guild's widget settings) in this guild. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains the embed channel set /// within the server's widget settings; null if none is set. /// public async Task GetEmbedChannelAsync(RequestOptions options = null) { var embedId = EmbedChannelId; if (embedId.HasValue) return await GuildHelper.GetChannelAsync(this, Discord, embedId.Value, options).ConfigureAwait(false); return null; } /// /// Gets the first viewable text channel in this guild. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains the first viewable text /// channel in this guild; null if none is found. /// public async Task GetSystemChannelAsync(RequestOptions options = null) { var systemId = SystemChannelId; if (systemId.HasValue) { var channel = await GuildHelper.GetChannelAsync(this, Discord, systemId.Value, options).ConfigureAwait(false); return channel as RestTextChannel; } return null; } /// /// Creates a new text channel in this guild. /// /// /// The following example creates a new text channel under an existing category named Wumpus with a set topic. /// /// var categories = await guild.GetCategoriesAsync(); /// var targetCategory = categories.FirstOrDefault(x => x.Name == "wumpus"); /// if (targetCategory == null) return; /// await Context.Guild.CreateTextChannelAsync(name, x => /// { /// x.CategoryId = targetCategory.Id; /// x.Topic = $"This channel was created at {DateTimeOffset.UtcNow} by {user}."; /// }); /// /// /// The new name for the text channel. /// The delegate containing the properties to be applied to the channel upon its creation. /// The options to be used when sending the request. /// /// A task that represents the asynchronous creation operation. The task result contains the newly created /// text channel. /// public Task CreateTextChannelAsync(string name, Action func = null, RequestOptions options = null) => GuildHelper.CreateTextChannelAsync(this, Discord, name, options, func); /// /// Creates a voice channel with the provided name. /// /// The name of the new channel. /// The delegate containing the properties to be applied to the channel upon its creation. /// The options to be used when sending the request. /// is null. /// /// The created voice channel. /// public Task CreateVoiceChannelAsync(string name, Action func = null, RequestOptions options = null) => GuildHelper.CreateVoiceChannelAsync(this, Discord, name, options, func); /// /// Creates a category channel with the provided name. /// /// The name of the new channel. /// The delegate containing the properties to be applied to the channel upon its creation. /// The options to be used when sending the request. /// is null. /// /// The created category channel. /// public Task CreateCategoryChannelAsync(string name, Action func = null, RequestOptions options = null) => GuildHelper.CreateCategoryChannelAsync(this, Discord, name, options, func); /// /// Gets a collection of all the voice regions this guild can access. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains a read-only collection of /// voice regions the guild can access. /// public Task> GetVoiceRegionsAsync(RequestOptions options = null) => GuildHelper.GetVoiceRegionsAsync(this, Discord, options); //Integrations public Task> GetIntegrationsAsync(RequestOptions options = null) => GuildHelper.GetIntegrationsAsync(this, Discord, options); public Task CreateIntegrationAsync(ulong id, string type, RequestOptions options = null) => GuildHelper.CreateIntegrationAsync(this, Discord, id, type, options); //Invites /// /// Gets a collection of all invites in this guild. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains a read-only collection of /// invite metadata, each representing information for an invite found within this guild. /// public Task> GetInvitesAsync(RequestOptions options = null) => GuildHelper.GetInvitesAsync(this, Discord, options); /// /// Gets the vanity invite URL of this guild. /// /// The options to be used when sending the request. /// /// A partial metadata of the vanity invite found within this guild. /// public Task GetVanityInviteAsync(RequestOptions options = null) => GuildHelper.GetVanityInviteAsync(this, Discord, options); //Roles /// /// Gets a role in this guild. /// /// The snowflake identifier for the role. /// /// A role that is associated with the specified ; null if none is found. /// public RestRole GetRole(ulong id) { if (_roles.TryGetValue(id, out RestRole value)) return value; return null; } /// public Task CreateRoleAsync(string name, GuildPermissions? permissions = default(GuildPermissions?), Color? color = default(Color?), bool isHoisted = false, RequestOptions options = null) => CreateRoleAsync(name, permissions, color, isHoisted, false, options); /// /// Creates a new role with the provided name. /// /// The new name for the role. /// The guild permission that the role should possess. /// The color of the role. /// Whether the role is separated from others on the sidebar. /// The options to be used when sending the request. /// Whether the role can be mentioned. /// /// A task that represents the asynchronous creation operation. The task result contains the newly created /// role. /// public async Task CreateRoleAsync(string name, GuildPermissions? permissions = default(GuildPermissions?), Color? color = default(Color?), bool isHoisted = false, bool isMentionable = false, RequestOptions options = null) { var role = await GuildHelper.CreateRoleAsync(this, Discord, name, permissions, color, isHoisted, isMentionable, options).ConfigureAwait(false); _roles = _roles.Add(role.Id, role); return role; } //Users /// /// Gets a collection of all users in this guild. /// /// /// This method retrieves all users found within this guild. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains a collection of guild /// users found within this guild. /// public IAsyncEnumerable> GetUsersAsync(RequestOptions options = null) => GuildHelper.GetUsersAsync(this, Discord, null, null, options); /// public Task AddGuildUserAsync(ulong id, string accessToken, Action func = null, RequestOptions options = null) => GuildHelper.AddGuildUserAsync(this, Discord, id, accessToken, func, options); /// /// Gets a user from this guild. /// /// /// This method retrieves a user found within this guild. /// /// The snowflake identifier of the user. /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains the guild user /// associated with the specified ; null if none is found. /// public Task GetUserAsync(ulong id, RequestOptions options = null) => GuildHelper.GetUserAsync(this, Discord, id, options); /// /// Gets the current user for this guild. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains the currently logged-in /// user within this guild. /// public Task GetCurrentUserAsync(RequestOptions options = null) => GuildHelper.GetUserAsync(this, Discord, Discord.CurrentUser.Id, options); /// /// Gets the owner of this guild. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains the owner of this guild. /// public Task GetOwnerAsync(RequestOptions options = null) => GuildHelper.GetUserAsync(this, Discord, OwnerId, options); /// /// /// Prunes inactive users. /// /// /// /// This method removes all users that have not logged on in the provided number of . /// /// /// If is true, this method will only return the number of users that /// would be removed without kicking the users. /// /// /// The number of days required for the users to be kicked. /// Whether this prune action is a simulation. /// The options to be used when sending the request. /// /// A task that represents the asynchronous prune operation. The task result contains the number of users to /// be or has been removed from this guild. /// public Task PruneUsersAsync(int days = 30, bool simulate = false, RequestOptions options = null) => GuildHelper.PruneUsersAsync(this, Discord, days, simulate, options); //Audit logs /// /// Gets the specified number of audit log entries for this guild. /// /// The number of audit log entries to fetch. /// The options to be used when sending the request. /// The audit log entry ID to get entries before. /// The type of actions to filter. /// The user ID to filter entries for. /// /// A task that represents the asynchronous get operation. The task result contains a read-only collection /// of the requested audit log entries. /// public IAsyncEnumerable> GetAuditLogsAsync(int limit, RequestOptions options = null, ulong? beforeId = null, ulong? userId = null, ActionType? actionType = null) => GuildHelper.GetAuditLogsAsync(this, Discord, beforeId, limit, options, userId: userId, actionType: actionType); //Webhooks /// /// Gets a webhook found within this guild. /// /// The identifier for the webhook. /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains the webhook with the /// specified ; null if none is found. /// public Task GetWebhookAsync(ulong id, RequestOptions options = null) => GuildHelper.GetWebhookAsync(this, Discord, id, options); /// /// Gets a collection of all webhook from this guild. /// /// The options to be used when sending the request. /// /// A task that represents the asynchronous get operation. The task result contains a read-only collection /// of webhooks found within the guild. /// public Task> GetWebhooksAsync(RequestOptions options = null) => GuildHelper.GetWebhooksAsync(this, Discord, options); /// /// Returns the name of the guild. /// /// /// The name of the guild. /// public override string ToString() => Name; private string DebuggerDisplay => $"{Name} ({Id})"; //Emotes /// public Task GetEmoteAsync(ulong id, RequestOptions options = null) => GuildHelper.GetEmoteAsync(this, Discord, id, options); /// public Task CreateEmoteAsync(string name, Image image, Optional> roles = default(Optional>), RequestOptions options = null) => GuildHelper.CreateEmoteAsync(this, Discord, name, image, roles, options); /// /// is null. public Task ModifyEmoteAsync(GuildEmote emote, Action func, RequestOptions options = null) => GuildHelper.ModifyEmoteAsync(this, Discord, emote.Id, func, options); /// public Task DeleteEmoteAsync(GuildEmote emote, RequestOptions options = null) => GuildHelper.DeleteEmoteAsync(this, Discord, emote.Id, options); //IGuild /// bool IGuild.Available => Available; /// IAudioClient IGuild.AudioClient => null; /// IRole IGuild.EveryoneRole => EveryoneRole; /// IReadOnlyCollection IGuild.Roles => Roles; /// async Task> IGuild.GetBansAsync(RequestOptions options) => await GetBansAsync(options).ConfigureAwait(false); /// async Task IGuild.GetBanAsync(IUser user, RequestOptions options) => await GetBanAsync(user, options).ConfigureAwait(false); /// async Task IGuild.GetBanAsync(ulong userId, RequestOptions options) => await GetBanAsync(userId, options).ConfigureAwait(false); /// async Task> IGuild.GetChannelsAsync(CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) return await GetChannelsAsync(options).ConfigureAwait(false); else return ImmutableArray.Create(); } /// async Task IGuild.GetChannelAsync(ulong id, CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) return await GetChannelAsync(id, options).ConfigureAwait(false); else return null; } /// async Task> IGuild.GetTextChannelsAsync(CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) return await GetTextChannelsAsync(options).ConfigureAwait(false); else return ImmutableArray.Create(); } /// async Task IGuild.GetTextChannelAsync(ulong id, CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) return await GetTextChannelAsync(id, options).ConfigureAwait(false); else return null; } /// async Task> IGuild.GetVoiceChannelsAsync(CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) return await GetVoiceChannelsAsync(options).ConfigureAwait(false); else return ImmutableArray.Create(); } /// async Task> IGuild.GetCategoriesAsync(CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) return await GetCategoryChannelsAsync(options).ConfigureAwait(false); else return null; } /// async Task IGuild.GetVoiceChannelAsync(ulong id, CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) return await GetVoiceChannelAsync(id, options).ConfigureAwait(false); else return null; } /// async Task IGuild.GetAFKChannelAsync(CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) return await GetAFKChannelAsync(options).ConfigureAwait(false); else return null; } /// async Task IGuild.GetDefaultChannelAsync(CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) return await GetDefaultChannelAsync(options).ConfigureAwait(false); else return null; } /// async Task IGuild.GetEmbedChannelAsync(CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) return await GetEmbedChannelAsync(options).ConfigureAwait(false); else return null; } /// async Task IGuild.GetSystemChannelAsync(CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) return await GetSystemChannelAsync(options).ConfigureAwait(false); else return null; } /// async Task IGuild.CreateTextChannelAsync(string name, Action func, RequestOptions options) => await CreateTextChannelAsync(name, func, options).ConfigureAwait(false); /// async Task IGuild.CreateVoiceChannelAsync(string name, Action func, RequestOptions options) => await CreateVoiceChannelAsync(name, func, options).ConfigureAwait(false); /// async Task IGuild.CreateCategoryAsync(string name, Action func, RequestOptions options) => await CreateCategoryChannelAsync(name, func, options).ConfigureAwait(false); /// async Task> IGuild.GetVoiceRegionsAsync(RequestOptions options) => await GetVoiceRegionsAsync(options).ConfigureAwait(false); /// async Task> IGuild.GetIntegrationsAsync(RequestOptions options) => await GetIntegrationsAsync(options).ConfigureAwait(false); /// async Task IGuild.CreateIntegrationAsync(ulong id, string type, RequestOptions options) => await CreateIntegrationAsync(id, type, options).ConfigureAwait(false); /// async Task> IGuild.GetInvitesAsync(RequestOptions options) => await GetInvitesAsync(options).ConfigureAwait(false); /// async Task IGuild.GetVanityInviteAsync(RequestOptions options) => await GetVanityInviteAsync(options).ConfigureAwait(false); /// IRole IGuild.GetRole(ulong id) => GetRole(id); /// async Task IGuild.CreateRoleAsync(string name, GuildPermissions? permissions, Color? color, bool isHoisted, RequestOptions options) => await CreateRoleAsync(name, permissions, color, isHoisted, false, options).ConfigureAwait(false); /// async Task IGuild.CreateRoleAsync(string name, GuildPermissions? permissions, Color? color, bool isHoisted, bool isMentionable, RequestOptions options) => await CreateRoleAsync(name, permissions, color, isHoisted, isMentionable, options).ConfigureAwait(false); /// async Task IGuild.AddGuildUserAsync(ulong userId, string accessToken, Action func, RequestOptions options) => await AddGuildUserAsync(userId, accessToken, func, options); /// async Task IGuild.GetUserAsync(ulong id, CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) return await GetUserAsync(id, options).ConfigureAwait(false); else return null; } /// async Task IGuild.GetCurrentUserAsync(CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) return await GetCurrentUserAsync(options).ConfigureAwait(false); else return null; } /// async Task IGuild.GetOwnerAsync(CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) return await GetOwnerAsync(options).ConfigureAwait(false); else return null; } /// async Task> IGuild.GetUsersAsync(CacheMode mode, RequestOptions options) { if (mode == CacheMode.AllowDownload) return (await GetUsersAsync(options).FlattenAsync().ConfigureAwait(false)).ToImmutableArray(); else return ImmutableArray.Create(); } /// /// Downloading users is not supported for a REST-based guild. Task IGuild.DownloadUsersAsync() => throw new NotSupportedException(); async Task> IGuild.GetAuditLogsAsync(int limit, CacheMode cacheMode, RequestOptions options, ulong? beforeId, ulong? userId, ActionType? actionType) { if (cacheMode == CacheMode.AllowDownload) return (await GetAuditLogsAsync(limit, options, beforeId: beforeId, userId: userId, actionType: actionType).FlattenAsync().ConfigureAwait(false)).ToImmutableArray(); else return ImmutableArray.Create(); } /// async Task IGuild.GetWebhookAsync(ulong id, RequestOptions options) => await GetWebhookAsync(id, options).ConfigureAwait(false); /// async Task> IGuild.GetWebhooksAsync(RequestOptions options) => await GetWebhooksAsync(options).ConfigureAwait(false); } }