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