| @@ -60,6 +60,14 @@ | |||||
| /// </summary> | /// </summary> | ||||
| public Optional<ulong?> AfkChannelId { get; set; } | public Optional<ulong?> AfkChannelId { get; set; } | ||||
| /// <summary> | /// <summary> | ||||
| /// The ITextChannel where System messages should be sent. | |||||
| /// </summary> | |||||
| public Optional<ITextChannel> SystemChannel { get; set; } | |||||
| /// <summary> | |||||
| /// The ID of the ITextChannel where System messages should be sent. | |||||
| /// </summary> | |||||
| public Optional<ulong?> SystemChannelId { get; set; } | |||||
| /// <summary> | |||||
| /// The owner of this guild. | /// The owner of this guild. | ||||
| /// </summary> | /// </summary> | ||||
| public Optional<IUser> Owner { get; set; } | public Optional<IUser> Owner { get; set; } | ||||
| @@ -36,6 +36,8 @@ namespace Discord | |||||
| ulong DefaultChannelId { get; } | ulong DefaultChannelId { get; } | ||||
| /// <summary> Gets the id of the embed channel for this guild if set, or null if not. </summary> | /// <summary> Gets the id of the embed channel for this guild if set, or null if not. </summary> | ||||
| ulong? EmbedChannelId { get; } | ulong? EmbedChannelId { get; } | ||||
| /// <summary> Gets the id of the channel where randomized welcome messages are sent, or null if not. </summary> | |||||
| ulong? SystemChannelId { get; } | |||||
| /// <summary> Gets the id of the user that created this guild. </summary> | /// <summary> Gets the id of the user that created this guild. </summary> | ||||
| ulong OwnerId { get; } | ulong OwnerId { get; } | ||||
| /// <summary> Gets the id of the region hosting this guild's voice channels. </summary> | /// <summary> Gets the id of the region hosting this guild's voice channels. </summary> | ||||
| @@ -84,6 +86,7 @@ namespace Discord | |||||
| Task<IReadOnlyCollection<IVoiceChannel>> GetVoiceChannelsAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); | Task<IReadOnlyCollection<IVoiceChannel>> GetVoiceChannelsAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); | ||||
| Task<IVoiceChannel> GetVoiceChannelAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); | Task<IVoiceChannel> GetVoiceChannelAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); | ||||
| Task<IVoiceChannel> GetAFKChannelAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); | Task<IVoiceChannel> GetAFKChannelAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); | ||||
| Task<ITextChannel> GetSystemChannelAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); | |||||
| Task<ITextChannel> GetDefaultChannelAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); | Task<ITextChannel> GetDefaultChannelAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); | ||||
| Task<IGuildChannel> GetEmbedChannelAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); | Task<IGuildChannel> GetEmbedChannelAsync(CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null); | ||||
| /// <summary> Creates a new text channel. </summary> | /// <summary> Creates a new text channel. </summary> | ||||
| @@ -25,6 +25,8 @@ namespace Discord.API | |||||
| public bool EmbedEnabled { get; set; } | public bool EmbedEnabled { get; set; } | ||||
| [JsonProperty("embed_channel_id")] | [JsonProperty("embed_channel_id")] | ||||
| public ulong? EmbedChannelId { get; set; } | public ulong? EmbedChannelId { get; set; } | ||||
| [JsonProperty("system_channel_id")] | |||||
| public ulong? SystemChannelId { get; set; } | |||||
| [JsonProperty("verification_level")] | [JsonProperty("verification_level")] | ||||
| public VerificationLevel VerificationLevel { get; set; } | public VerificationLevel VerificationLevel { get; set; } | ||||
| [JsonProperty("voice_states")] | [JsonProperty("voice_states")] | ||||
| @@ -18,6 +18,8 @@ namespace Discord.API.Rest | |||||
| public Optional<DefaultMessageNotifications> DefaultMessageNotifications { get; set; } | public Optional<DefaultMessageNotifications> DefaultMessageNotifications { get; set; } | ||||
| [JsonProperty("afk_timeout")] | [JsonProperty("afk_timeout")] | ||||
| public Optional<int> AfkTimeout { get; set; } | public Optional<int> AfkTimeout { get; set; } | ||||
| [JsonProperty("system_channel_id")] | |||||
| public Optional<ulong?> SystemChannelId { get; set; } | |||||
| [JsonProperty("icon")] | [JsonProperty("icon")] | ||||
| public Optional<Image?> Icon { get; set; } | public Optional<Image?> Icon { get; set; } | ||||
| [JsonProperty("splash")] | [JsonProperty("splash")] | ||||
| @@ -26,6 +26,7 @@ namespace Discord.Rest | |||||
| { | { | ||||
| AfkChannelId = args.AfkChannelId, | AfkChannelId = args.AfkChannelId, | ||||
| AfkTimeout = args.AfkTimeout, | AfkTimeout = args.AfkTimeout, | ||||
| SystemChannelId = args.SystemChannelId, | |||||
| DefaultMessageNotifications = args.DefaultMessageNotifications, | DefaultMessageNotifications = args.DefaultMessageNotifications, | ||||
| Icon = args.Icon.IsSpecified ? args.Icon.Value?.ToModel() : Optional.Create<ImageModel?>(), | Icon = args.Icon.IsSpecified ? args.Icon.Value?.ToModel() : Optional.Create<ImageModel?>(), | ||||
| Name = args.Name, | Name = args.Name, | ||||
| @@ -39,6 +40,11 @@ namespace Discord.Rest | |||||
| else if (args.AfkChannelId.IsSpecified) | else if (args.AfkChannelId.IsSpecified) | ||||
| apiArgs.AfkChannelId = args.AfkChannelId.Value; | apiArgs.AfkChannelId = args.AfkChannelId.Value; | ||||
| if (args.SystemChannel.IsSpecified) | |||||
| apiArgs.SystemChannelId = args.SystemChannel.Value.Id; | |||||
| else if (args.SystemChannelId.IsSpecified) | |||||
| apiArgs.SystemChannelId = args.SystemChannelId.Value; | |||||
| if (args.Owner.IsSpecified) | if (args.Owner.IsSpecified) | ||||
| apiArgs.OwnerId = args.Owner.Value.Id; | apiArgs.OwnerId = args.Owner.Value.Id; | ||||
| else if (args.OwnerId.IsSpecified) | else if (args.OwnerId.IsSpecified) | ||||
| @@ -26,6 +26,7 @@ namespace Discord.Rest | |||||
| public ulong? AFKChannelId { get; private set; } | public ulong? AFKChannelId { get; private set; } | ||||
| public ulong? EmbedChannelId { get; private set; } | public ulong? EmbedChannelId { get; private set; } | ||||
| public ulong? SystemChannelId { get; private set; } | |||||
| public ulong OwnerId { get; private set; } | public ulong OwnerId { get; private set; } | ||||
| public string VoiceRegionId { get; private set; } | public string VoiceRegionId { get; private set; } | ||||
| public string IconId { get; private set; } | public string IconId { get; private set; } | ||||
| @@ -58,6 +59,7 @@ namespace Discord.Rest | |||||
| { | { | ||||
| AFKChannelId = model.AFKChannelId; | AFKChannelId = model.AFKChannelId; | ||||
| EmbedChannelId = model.EmbedChannelId; | EmbedChannelId = model.EmbedChannelId; | ||||
| SystemChannelId = model.SystemChannelId; | |||||
| AFKTimeout = model.AFKTimeout; | AFKTimeout = model.AFKTimeout; | ||||
| IsEmbeddable = model.EmbedEnabled; | IsEmbeddable = model.EmbedEnabled; | ||||
| IconId = model.Icon; | IconId = model.Icon; | ||||
| @@ -201,6 +203,16 @@ namespace Discord.Rest | |||||
| return await GuildHelper.GetChannelAsync(this, Discord, embedId.Value, options).ConfigureAwait(false); | return await GuildHelper.GetChannelAsync(this, Discord, embedId.Value, options).ConfigureAwait(false); | ||||
| return null; | return null; | ||||
| } | } | ||||
| public async Task<RestTextChannel> 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; | |||||
| } | |||||
| public Task<RestTextChannel> CreateTextChannelAsync(string name, RequestOptions options = null) | public Task<RestTextChannel> CreateTextChannelAsync(string name, RequestOptions options = null) | ||||
| => GuildHelper.CreateTextChannelAsync(this, Discord, name, options); | => GuildHelper.CreateTextChannelAsync(this, Discord, name, options); | ||||
| public Task<RestVoiceChannel> CreateVoiceChannelAsync(string name, RequestOptions options = null) | public Task<RestVoiceChannel> CreateVoiceChannelAsync(string name, RequestOptions options = null) | ||||
| @@ -320,6 +332,13 @@ namespace Discord.Rest | |||||
| else | else | ||||
| return null; | return null; | ||||
| } | } | ||||
| async Task<ITextChannel> IGuild.GetSystemChannelAsync(CacheMode mode, RequestOptions options) | |||||
| { | |||||
| if (mode == CacheMode.AllowDownload) | |||||
| return await GetSystemChannelAsync(options).ConfigureAwait(false); | |||||
| else | |||||
| return null; | |||||
| } | |||||
| async Task<ITextChannel> IGuild.CreateTextChannelAsync(string name, RequestOptions options) | async Task<ITextChannel> IGuild.CreateTextChannelAsync(string name, RequestOptions options) | ||||
| => await CreateTextChannelAsync(name, options).ConfigureAwait(false); | => await CreateTextChannelAsync(name, options).ConfigureAwait(false); | ||||
| async Task<IVoiceChannel> IGuild.CreateVoiceChannelAsync(string name, RequestOptions options) | async Task<IVoiceChannel> IGuild.CreateVoiceChannelAsync(string name, RequestOptions options) | ||||
| @@ -47,6 +47,7 @@ namespace Discord.WebSocket | |||||
| internal ulong? AFKChannelId { get; private set; } | internal ulong? AFKChannelId { get; private set; } | ||||
| internal ulong? EmbedChannelId { get; private set; } | internal ulong? EmbedChannelId { get; private set; } | ||||
| internal ulong? SystemChannelId { get; private set; } | |||||
| public ulong OwnerId { get; private set; } | public ulong OwnerId { get; private set; } | ||||
| public SocketGuildUser Owner => GetUser(OwnerId); | public SocketGuildUser Owner => GetUser(OwnerId); | ||||
| public string VoiceRegionId { get; private set; } | public string VoiceRegionId { get; private set; } | ||||
| @@ -81,6 +82,14 @@ namespace Discord.WebSocket | |||||
| return id.HasValue ? GetChannel(id.Value) : null; | return id.HasValue ? GetChannel(id.Value) : null; | ||||
| } | } | ||||
| } | } | ||||
| public SocketTextChannel SystemChannel | |||||
| { | |||||
| get | |||||
| { | |||||
| var id = SystemChannelId; | |||||
| return id.HasValue ? GetTextChannel(id.Value) : null; | |||||
| } | |||||
| } | |||||
| public IReadOnlyCollection<SocketTextChannel> TextChannels | public IReadOnlyCollection<SocketTextChannel> TextChannels | ||||
| => Channels.Select(x => x as SocketTextChannel).Where(x => x != null).ToImmutableArray(); | => Channels.Select(x => x as SocketTextChannel).Where(x => x != null).ToImmutableArray(); | ||||
| public IReadOnlyCollection<SocketVoiceChannel> VoiceChannels | public IReadOnlyCollection<SocketVoiceChannel> VoiceChannels | ||||
| @@ -191,6 +200,7 @@ namespace Discord.WebSocket | |||||
| { | { | ||||
| AFKChannelId = model.AFKChannelId; | AFKChannelId = model.AFKChannelId; | ||||
| EmbedChannelId = model.EmbedChannelId; | EmbedChannelId = model.EmbedChannelId; | ||||
| SystemChannelId = model.SystemChannelId; | |||||
| AFKTimeout = model.AFKTimeout; | AFKTimeout = model.AFKTimeout; | ||||
| IsEmbeddable = model.EmbedEnabled; | IsEmbeddable = model.EmbedEnabled; | ||||
| IconId = model.Icon; | IconId = model.Icon; | ||||
| @@ -607,6 +617,7 @@ namespace Discord.WebSocket | |||||
| bool IGuild.Available => true; | bool IGuild.Available => true; | ||||
| ulong IGuild.DefaultChannelId => DefaultChannel?.Id ?? 0; | ulong IGuild.DefaultChannelId => DefaultChannel?.Id ?? 0; | ||||
| ulong? IGuild.EmbedChannelId => EmbedChannelId; | ulong? IGuild.EmbedChannelId => EmbedChannelId; | ||||
| ulong? IGuild.SystemChannelId => SystemChannelId; | |||||
| IRole IGuild.EveryoneRole => EveryoneRole; | IRole IGuild.EveryoneRole => EveryoneRole; | ||||
| IReadOnlyCollection<IRole> IGuild.Roles => Roles; | IReadOnlyCollection<IRole> IGuild.Roles => Roles; | ||||
| @@ -631,6 +642,8 @@ namespace Discord.WebSocket | |||||
| => Task.FromResult<ITextChannel>(DefaultChannel); | => Task.FromResult<ITextChannel>(DefaultChannel); | ||||
| Task<IGuildChannel> IGuild.GetEmbedChannelAsync(CacheMode mode, RequestOptions options) | Task<IGuildChannel> IGuild.GetEmbedChannelAsync(CacheMode mode, RequestOptions options) | ||||
| => Task.FromResult<IGuildChannel>(EmbedChannel); | => Task.FromResult<IGuildChannel>(EmbedChannel); | ||||
| Task<ITextChannel> IGuild.GetSystemChannelAsync(CacheMode mode, RequestOptions options) | |||||
| => Task.FromResult<ITextChannel>(SystemChannel); | |||||
| async Task<ITextChannel> IGuild.CreateTextChannelAsync(string name, RequestOptions options) | async Task<ITextChannel> IGuild.CreateTextChannelAsync(string name, RequestOptions options) | ||||
| => await CreateTextChannelAsync(name, options).ConfigureAwait(false); | => await CreateTextChannelAsync(name, options).ConfigureAwait(false); | ||||
| async Task<IVoiceChannel> IGuild.CreateVoiceChannelAsync(string name, RequestOptions options) | async Task<IVoiceChannel> IGuild.CreateVoiceChannelAsync(string name, RequestOptions options) | ||||