diff --git a/DiscordBot/DiscordBot.csproj b/DiscordBot/DiscordBot.csproj index c789792..d25e02f 100644 --- a/DiscordBot/DiscordBot.csproj +++ b/DiscordBot/DiscordBot.csproj @@ -15,7 +15,7 @@ https://github.com/DevSubmarine/DiscordBot git bot; discord; devsub; devsubmarine - 1.4.0 + 1.4.1 @@ -73,7 +73,7 @@ - + diff --git a/DiscordBot/Features/BlogsManagement/BlogChannelPermissionsOptions.cs b/DiscordBot/Features/BlogsManagement/BlogChannelPermissionsOptions.cs new file mode 100644 index 0000000..295063f --- /dev/null +++ b/DiscordBot/Features/BlogsManagement/BlogChannelPermissionsOptions.cs @@ -0,0 +1,36 @@ +using Discord; + +namespace DevSubmarine.DiscordBot.BlogsManagement +{ + public class BlogChannelPermissionsOptions + { + public ulong TargetID { get; set; } + public PermissionTarget TargetType { get; set; } = PermissionTarget.User; + public PermissionValues Permissions { get; set; } = new PermissionValues(); + + public class PermissionValues + { + public bool? ViewChannel { get; set; } + public bool? ManageChannel { get; set; } + public bool? ManagePermissions { get; set; } + public bool? ManageWebhooks { get; set; } + public bool? CreateInvite { get; set; } + public bool? SendMessages { get; set; } + public bool? SendMessagesInThreads { get; set; } + public bool? CreatePublicThreads { get; set; } + public bool? CreatePrivateThreads { get; set; } + public bool? EmbedLinks { get; set; } + public bool? AttachFiles { get; set; } + public bool? AddReactions { get; set; } + public bool? UseExternalEmojis { get; set; } + public bool? UseExternalStickers { get; set; } + public bool? MentionEveryone { get; set; } + public bool? ManageMessages { get; set; } + public bool? ManageThreads { get; set; } + public bool? ReadMessageHistory { get; set; } + public bool? SendTTSMessages { get; set; } + public bool? UseApplicationCommands { get; set; } + public bool? UseActivities { get; set; } + } + } +} diff --git a/DiscordBot/Features/BlogsManagement/BlogsManagementOptions.cs b/DiscordBot/Features/BlogsManagement/BlogsManagementOptions.cs index e529290..31b3a48 100644 --- a/DiscordBot/Features/BlogsManagement/BlogsManagementOptions.cs +++ b/DiscordBot/Features/BlogsManagement/BlogsManagementOptions.cs @@ -20,5 +20,9 @@ public class BlogsManagementOptions /// Words that cannot be contained in blog channel name. /// This can be used to forbid certain words, such as swears or whatever. public IEnumerable ForbiddenChannelNameWords { get; set; } + + public BlogChannelPermissionsOptions.PermissionValues EveryonePermissions { get; set; } + public BlogChannelPermissionsOptions.PermissionValues OwnerPermissions { get; set; } + public IEnumerable AdditionalPermissions { get; set; } } } diff --git a/DiscordBot/Features/BlogsManagement/Services/BlogChannelManager.cs b/DiscordBot/Features/BlogsManagement/Services/BlogChannelManager.cs index e5e37cd..022873b 100644 --- a/DiscordBot/Features/BlogsManagement/Services/BlogChannelManager.cs +++ b/DiscordBot/Features/BlogsManagement/Services/BlogChannelManager.cs @@ -83,23 +83,20 @@ public async Task CreateBlogChannel(string name, IEnumerable perms = new List(category.PermissionOverwrites); props.PermissionOverwrites = perms; - perms.Add(new Overwrite(guild.EveryoneRole.Id, PermissionTarget.Role, - categoryPerms.Modify(sendMessages: PermValue.Deny))); + perms.Add(new Overwrite(guild.EveryoneRole.Id, PermissionTarget.Role, ModifyWith(categoryPerms, this._options.EveryonePermissions))); + foreach (ulong uid in userIDs) - { - perms.Add(new Overwrite(uid, PermissionTarget.User, categoryPerms.Modify( - sendMessages: PermValue.Allow, - manageMessages: PermValue.Allow, - manageWebhooks: PermValue.Allow - ))); - } + perms.Add(new Overwrite(uid, PermissionTarget.User, ModifyWith(categoryPerms, this._options.OwnerPermissions))); + + foreach (BlogChannelPermissionsOptions additionalPerms in this._options.AdditionalPermissions ?? Enumerable.Empty()) + perms.Add(new Overwrite(additionalPerms.TargetID, additionalPerms.TargetType, ModifyWith(categoryPerms, additionalPerms.Permissions))); props.IsNsfw = properties.NSFW; }, cancellationToken.ToRequestOptions()); this._log.LogTrace("Sorting channels"); - await Task.Delay(TimeSpan.FromSeconds(1)); + await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false); await this._sorter.SortChannelsAsync(category, cancellationToken).ConfigureAwait(false); this._log.LogDebug("Channel {ChannelName} ({ChannelID}) created", result.Name, result.Id); @@ -118,5 +115,44 @@ public Task EditBlogChannel(IGuildChannel channel, BlogChannelProperties propert }, cancellationToken.ToRequestOptions()); } + + private static OverwritePermissions ModifyWith(OverwritePermissions permissions, BlogChannelPermissionsOptions.PermissionValues options) + { + if (options == null) + return permissions; + + return permissions.Modify( + viewChannel: AsPermValue(options.ViewChannel), + manageChannel: AsPermValue(options.ManageChannel), + manageRoles: AsPermValue(options.ManagePermissions), + manageWebhooks: AsPermValue(options.ManageWebhooks), + createInstantInvite: AsPermValue(options.CreateInvite), + sendMessages: AsPermValue(options.SendMessages), + sendMessagesInThreads: AsPermValue(options.SendMessagesInThreads), + createPublicThreads: AsPermValue(options.CreatePublicThreads), + createPrivateThreads: AsPermValue(options.CreatePrivateThreads), + embedLinks: AsPermValue(options.EmbedLinks), + attachFiles: AsPermValue(options.AttachFiles), + addReactions: AsPermValue(options.AddReactions), + useExternalEmojis: AsPermValue(options.UseExternalEmojis), + useExternalStickers: AsPermValue(options.UseExternalStickers), + mentionEveryone: AsPermValue(options.MentionEveryone), + manageMessages: AsPermValue(options.ManageMessages), + manageThreads: AsPermValue(options.ManageThreads), + readMessageHistory: AsPermValue(options.ReadMessageHistory), + sendTTSMessages: AsPermValue(options.SendTTSMessages), + useApplicationCommands: AsPermValue(options.UseApplicationCommands), + startEmbeddedActivities: AsPermValue(options.UseActivities)); + + PermValue? AsPermValue(bool? value) + { + return value switch + { + true => PermValue.Allow, + false => PermValue.Deny, + _ => null + }; + } + } } } diff --git a/DiscordBot/appsettings.Development.json b/DiscordBot/appsettings.Development.json index df9fbde..9c8bbfd 100644 --- a/DiscordBot/appsettings.Development.json +++ b/DiscordBot/appsettings.Development.json @@ -20,7 +20,29 @@ 986279566563770408 ], "ActivityScanningRate": "0.00:05:30", - "MaxBlogInactivityTime": "0.00:01:00" + "MaxBlogInactivityTime": "0.00:01:00", + "AdditionalPermissions": [ + { + "TargetID": 447139136604733440, + "TargetType": "User", + "Permissions": { + "SendMessages": true, + "ViewChannel": true, + "ManageMessages": true, + "EmbedLinks": true, + "AddReactions": true, + "UseExternalEmojis": false + } + }, + { + "TargetID": 983722959359315988, + "TargetType": "Role", + "Permissions": { + "SendMessages": true, + "UseExternalEmojis": false + } + } + ] }, "Birthdays": { "AutoPostChannelID": 997905078121943130 diff --git a/DiscordBot/appsettings.Production.json b/DiscordBot/appsettings.Production.json index ada81fe..28ddbc7 100644 --- a/DiscordBot/appsettings.Production.json +++ b/DiscordBot/appsettings.Production.json @@ -24,6 +24,20 @@ "InactiveBlogsCategoryID": 788353984762347551, "IgnoredChannelsIDs": [ 526756609528168448 + ], + "AdditionalPermissions": [ + { + "TargetID": 437618149505105920, + "TargetType": "User", + "Permissions": { + "SendMessages": true, + "ViewChannel": true, + "ManageMessages": true, + "EmbedLinks": true, + "AddReactions": true, + "UseExternalEmojis": true + } + } ] }, "Birthdays": { diff --git a/DiscordBot/appsettings.json b/DiscordBot/appsettings.json index cc051e8..d949cd5 100644 --- a/DiscordBot/appsettings.json +++ b/DiscordBot/appsettings.json @@ -30,7 +30,16 @@ "whore", "bitch", "shit" - ] + ], + "EveryonePermissions": { + "SendMessages": false + }, + "OwnerPermissions": { + "SendMessages": true, + "ManageMessages": true, + "ManageWebhooks": true, + "UseApplicationCommands": true + } }, "Birthdays": { "AutoPostDaysAhead": 1