From e433e56fec9209c0e29d0ed8a4ef0b1d45b9143a Mon Sep 17 00:00:00 2001 From: Adam R Grey Date: Mon, 19 Jun 2023 11:03:06 -0400 Subject: [PATCH] Permissions associated with channel --- Behavior/Behaver.cs | 4 +- Behavior/Behavior.cs | 5 +- Behavior/ChatGPTSnark.cs | 2 +- Behavior/DefinitionSnarkCogDiss.cs | 2 +- Behavior/DefinitionSnarkGaslight.cs | 2 +- Behavior/Detiktokify.cs | 8 +- Behavior/FiximageHeic.cs | 4 +- Behavior/GeneralSnarkCloudNative.cs | 4 +- Behavior/GeneralSnarkPlaying.cs | 4 +- Behavior/GeneralSnarkSkynet.cs | 2 +- Behavior/Gratitude.cs | 4 +- Behavior/Joke.cs | 2 +- Behavior/LaughAtOwnJoke.cs | 4 +- Behavior/Peptalk.cs | 2 +- Behavior/PulseCheck.cs | 2 +- Behavior/QRify.cs | 2 +- Behavior/UnitConvert.cs | 2 +- Behavior/WishLuck.cs | 2 +- DiscordInterface/DiscordInterface.cs | 23 +- ...20230619144448_permissionsmove.Designer.cs | 255 ++++++++++++++++++ Migrations/20230619144448_permissionsmove.cs | 70 +++++ Migrations/ChattingContextModelSnapshot.cs | 13 +- Models/Channel.cs | 37 ++- Models/PermissionSettings.cs | 1 + 24 files changed, 414 insertions(+), 42 deletions(-) create mode 100644 Migrations/20230619144448_permissionsmove.Designer.cs create mode 100644 Migrations/20230619144448_permissionsmove.cs diff --git a/Behavior/Behaver.cs b/Behavior/Behaver.cs index 1c865d9..e551380 100644 --- a/Behavior/Behaver.cs +++ b/Behavior/Behaver.cs @@ -39,9 +39,9 @@ public class Behaver foreach (var behavior in behaviors) { - if (behavior.ShouldAct(permissions, message)) + if (behavior.ShouldAct(message)) { - behavior.ActOn(permissions, message); + behavior.ActOn(message); message.ActedOn = true; } } diff --git a/Behavior/Behavior.cs b/Behavior/Behavior.cs index 9e5eff5..41b28c0 100644 --- a/Behavior/Behavior.cs +++ b/Behavior/Behavior.cs @@ -11,10 +11,9 @@ using System.Collections.Generic; //expect a behavior to be created per mesage public abstract class Behavior { - //TODO: message should have a channel, which should provide permissions. shouldn't have to pass it here. - public abstract Task ActOn(PermissionSettings permissions, Message message); + public abstract Task ActOn(Message message); - public virtual bool ShouldAct(PermissionSettings permissions, Message message) + public virtual bool ShouldAct(Message message) { return Regex.IsMatch(message.Content, $"{Trigger}\\b", RegexOptions.IgnoreCase); } diff --git a/Behavior/ChatGPTSnark.cs b/Behavior/ChatGPTSnark.cs index 0f6d0bb..46fb5f2 100644 --- a/Behavior/ChatGPTSnark.cs +++ b/Behavior/ChatGPTSnark.cs @@ -16,7 +16,7 @@ public class ChatGPTSnark : Behavior public override string Description => "snarkiness about the latest culty-fixation in ai"; - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) { await message.Channel.SendMessage("chatGPT is **weak**. also, are we done comparing every little if-then-else to skynet?"); return true; diff --git a/Behavior/DefinitionSnarkCogDiss.cs b/Behavior/DefinitionSnarkCogDiss.cs index b75c427..5338b66 100644 --- a/Behavior/DefinitionSnarkCogDiss.cs +++ b/Behavior/DefinitionSnarkCogDiss.cs @@ -16,7 +16,7 @@ public class DefinitionSnarkCogDiss : Behavior public override string Description => "snarkiness about the rampant misuse of the term cognitive dissonance"; - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) { await message.Reply("that's not what cognitive dissonance means. Did you mean \"hypocrisy\"?"); return true; diff --git a/Behavior/DefinitionSnarkGaslight.cs b/Behavior/DefinitionSnarkGaslight.cs index 1205e98..cbea87c 100644 --- a/Behavior/DefinitionSnarkGaslight.cs +++ b/Behavior/DefinitionSnarkGaslight.cs @@ -16,7 +16,7 @@ public class DefinitionSnarkGaslight : Behavior public override string Description => "snarkiness about the rampant misuse of the term gaslighting"; - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) { await message.Channel.SendMessage("that's not what gaslight means. Did you mean \"say something that (you believe) is wrong\"?"); return true; diff --git a/Behavior/Detiktokify.cs b/Behavior/Detiktokify.cs index d048bd1..c91522c 100644 --- a/Behavior/Detiktokify.cs +++ b/Behavior/Detiktokify.cs @@ -22,9 +22,9 @@ public class Detiktokify : Behavior ytdl.OutputFolder = ""; ytdl.OutputFileTemplate = "tiktokbad.%(ext)s"; } - public override bool ShouldAct(PermissionSettings permissions, Message message) + public override bool ShouldAct(Message message) { - if(permissions.MaxAttachmentBytes == 0) + if(message.Channel.EffectivePermissions.MaxAttachmentBytes == 0) return false; var wordLikes = message.Content.Split(' ', StringSplitOptions.TrimEntries); @@ -41,7 +41,7 @@ public class Detiktokify : Behavior } return tiktokLinks.Any(); } - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) { foreach(var link in tiktokLinks) { @@ -64,7 +64,7 @@ public class Detiktokify : Behavior if (File.Exists(path)) { var bytesize = new System.IO.FileInfo(path).Length; - if (bytesize < permissions.MaxAttachmentBytes - 256) + if (bytesize < message.Channel.EffectivePermissions.MaxAttachmentBytes - 256) { try { diff --git a/Behavior/FiximageHeic.cs b/Behavior/FiximageHeic.cs index b111050..ad154ef 100644 --- a/Behavior/FiximageHeic.cs +++ b/Behavior/FiximageHeic.cs @@ -18,7 +18,7 @@ public class FiximageHeic : Behavior public override string Description => "convert heic images to jpg"; private List heics = new List(); - public override bool ShouldAct(PermissionSettings permissions, Message message) + public override bool ShouldAct(Message message) { if (message.Attachments?.Count() > 0) { @@ -33,7 +33,7 @@ public class FiximageHeic : Behavior return heics.Any(); } - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) { if (!Directory.Exists("tmp")) { diff --git a/Behavior/GeneralSnarkCloudNative.cs b/Behavior/GeneralSnarkCloudNative.cs index 808a399..ce92552 100644 --- a/Behavior/GeneralSnarkCloudNative.cs +++ b/Behavior/GeneralSnarkCloudNative.cs @@ -15,13 +15,13 @@ public class GeneralSnarkCloudNative : Behavior public override string Name => "general snarkiness: cloud native"; public override string Trigger => "certain tech buzzwords that no human uses in normal conversation"; - public override bool ShouldAct(PermissionSettings permissions, Message message) + public override bool ShouldAct(Message message) { return Regex.IsMatch(message.Content, "\\bcloud( |-)?native\\b", RegexOptions.IgnoreCase) || Regex.IsMatch(message.Content, "\\benterprise( |-)?(level|solution)\\b", RegexOptions.IgnoreCase); } - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) { switch (Shared.r.Next(2)) { diff --git a/Behavior/GeneralSnarkPlaying.cs b/Behavior/GeneralSnarkPlaying.cs index 841ce1d..ec358ee 100644 --- a/Behavior/GeneralSnarkPlaying.cs +++ b/Behavior/GeneralSnarkPlaying.cs @@ -17,11 +17,11 @@ public class GeneralSnarkPlaying : Behavior public override string Description => "I didn't think you were playing, but now I do"; - public override bool ShouldAct(PermissionSettings permissions, Message message) + public override bool ShouldAct(Message message) { return Regex.IsMatch(message.Content, "^(s?he|(yo)?u|y'?all|they) thinks? i'?m (playin|jokin|kiddin)g?$", RegexOptions.IgnoreCase); } - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) { await message.Channel.SendMessage("I believed you for a second, but then you assured me you's a \uD83C\uDDE7 \uD83C\uDDEE \uD83C\uDDF9 \uD83C\uDDE8 \uD83C\uDDED"); return true; diff --git a/Behavior/GeneralSnarkSkynet.cs b/Behavior/GeneralSnarkSkynet.cs index a3c5c12..ab9ff66 100644 --- a/Behavior/GeneralSnarkSkynet.cs +++ b/Behavior/GeneralSnarkSkynet.cs @@ -16,7 +16,7 @@ public class GeneralSnarkSkynet : Behavior public override string Description => "snarkiness about the old AI fixation"; - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) { switch (Shared.r.Next(5)) { diff --git a/Behavior/Gratitude.cs b/Behavior/Gratitude.cs index 3e35918..7278624 100644 --- a/Behavior/Gratitude.cs +++ b/Behavior/Gratitude.cs @@ -15,11 +15,11 @@ public class Gratitude : Behavior public override string Trigger => "thank me"; - public override bool ShouldAct(PermissionSettings permissions, Message message) + public override bool ShouldAct(Message message) { return Regex.IsMatch(message.Content, "\\bthank (yo)?u\\b", RegexOptions.IgnoreCase) && message.MentionsMe; } - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) { switch (Shared.r.Next(4)) diff --git a/Behavior/Joke.cs b/Behavior/Joke.cs index 12a8655..7761d48 100644 --- a/Behavior/Joke.cs +++ b/Behavior/Joke.cs @@ -17,7 +17,7 @@ public class Joke : Behavior public override string Description => "tell a joke"; - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) { Console.WriteLine("joking"); var jokes = File.ReadAllLines("assets/jokes.txt"); diff --git a/Behavior/LaughAtOwnJoke.cs b/Behavior/LaughAtOwnJoke.cs index b9be404..c2c3d2c 100644 --- a/Behavior/LaughAtOwnJoke.cs +++ b/Behavior/LaughAtOwnJoke.cs @@ -18,14 +18,14 @@ public class LaughAtOwnJoke : Behavior public override string Description => Name; public static List punchlinesAwaitingReaction = new List(); - public override bool ShouldAct(PermissionSettings permissions, Message message) + public override bool ShouldAct(Message message) { //TODO: i need to keep track of myself from here somehow return false; //return message.Author == me && punchlinesAwaitingReaction.Contains(message.Content); } - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) { punchlinesAwaitingReaction.Remove(message.Content); await message.React("\U0001F60E"); //smiling face with sunglasses diff --git a/Behavior/Peptalk.cs b/Behavior/Peptalk.cs index cfbb7d2..994ac4d 100644 --- a/Behavior/Peptalk.cs +++ b/Behavior/Peptalk.cs @@ -18,7 +18,7 @@ public class PepTalk : Behavior public override string Description => "assembles a pep talk from a few pieces"; - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) {var piece1 = new List{ "Champ, ", "Fact: ", diff --git a/Behavior/PulseCheck.cs b/Behavior/PulseCheck.cs index 02e9fe9..b53d805 100644 --- a/Behavior/PulseCheck.cs +++ b/Behavior/PulseCheck.cs @@ -14,7 +14,7 @@ public class PulseCheck : Behavior public override string Trigger => "!pluse ?check"; - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) { await message.Channel.SendFile("assets/ekgblip.png", null); return true; diff --git a/Behavior/QRify.cs b/Behavior/QRify.cs index c713c05..c51107b 100644 --- a/Behavior/QRify.cs +++ b/Behavior/QRify.cs @@ -18,7 +18,7 @@ public class QRify : Behavior public override string Description => "generate text QR codes"; - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) { var qrContent = message.Content.Substring($"{Trigger} ".Length + message.Content.IndexOf(Trigger)); Console.WriteLine($"qring: {qrContent}"); diff --git a/Behavior/UnitConvert.cs b/Behavior/UnitConvert.cs index 270b851..33262eb 100644 --- a/Behavior/UnitConvert.cs +++ b/Behavior/UnitConvert.cs @@ -10,7 +10,7 @@ public class UnitConvert : Behavior public override string Trigger => "!freedomunits"; public override string Description => "convert between many units."; - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) { var theseMatches = Regex.Matches(message.Content, "\\b([\\d]+\\.?\\d*) ?([^\\d\\s].*) (in|to|as) ([^\\d\\s].*)$", RegexOptions.IgnoreCase); diff --git a/Behavior/WishLuck.cs b/Behavior/WishLuck.cs index 5c04c81..d04131a 100644 --- a/Behavior/WishLuck.cs +++ b/Behavior/WishLuck.cs @@ -16,7 +16,7 @@ public class WishLuck : Behavior public override string Description => "wishes you luck"; - public override async Task ActOn(PermissionSettings permissions, Message message) + public override async Task ActOn(Message message) { if (Shared.r.Next(20) == 0) { diff --git a/DiscordInterface/DiscordInterface.cs b/DiscordInterface/DiscordInterface.cs index 089aa7e..8942968 100644 --- a/DiscordInterface/DiscordInterface.cs +++ b/DiscordInterface/DiscordInterface.cs @@ -18,6 +18,15 @@ public class DiscordInterface internal DiscordSocketClient client; private bool eventsSignedUp = false; private ChattingContext _db; + private static PermissionSettings defaultPermissions = new PermissionSettings() + { + MeannessFilterLevel = 1, + LewdnessFilterLevel = 3, + MaxTextChars = 2000, + MaxAttachmentBytes = 8 * 1024 * 1024, + LinksAllowed = true, + ReactionsPossible = true + }; public DiscordInterface() { _db = Shared.dbContext; @@ -42,7 +51,7 @@ public class DiscordInterface client.MessageReceived += MessageReceived; // _client.MessageUpdated += - client.UserJoined += UserJoined; + // client.UserJoined += UserJoined; client.SlashCommandExecuted += SlashCommandHandler; // _client.ChannelCreated += // _client.ChannelDestroyed += @@ -100,13 +109,13 @@ public class DiscordInterface _db.SaveChanges(); } - private Task UserJoined(SocketGuildUser arg) + private void UserJoined(SocketGuildUser arg) { - var guild = UpsertChannel(arg.Guild); - var defaultChannel = UpsertChannel(arg.Guild.DefaultChannel); - defaultChannel.ParentChannel = guild; - var u = UpsertUser(arg); - return Behaver.Instance.OnJoin(u, defaultChannel); + + var guild = UpsertChannel(arg.Guild); + var defaultChannel = UpsertChannel(arg.Guild.DefaultChannel); + defaultChannel.ParentChannel = guild; + var u = UpsertUser(arg); } private async Task ButtonHandler(SocketMessageComponent component) { diff --git a/Migrations/20230619144448_permissionsmove.Designer.cs b/Migrations/20230619144448_permissionsmove.Designer.cs new file mode 100644 index 0000000..b58468e --- /dev/null +++ b/Migrations/20230619144448_permissionsmove.Designer.cs @@ -0,0 +1,255 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using vassago.Models; + +#nullable disable + +namespace vassago.Migrations +{ + [DbContext(typeof(ChattingContext))] + [Migration("20230619144448_permissionsmove")] + partial class permissionsmove + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("vassago.Models.Attachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Content") + .HasColumnType("bytea"); + + b.Property("ContentType") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("ExternalId") + .HasColumnType("numeric(20,0)"); + + b.Property("Filename") + .HasColumnType("text"); + + b.Property("MessageId") + .HasColumnType("uuid"); + + b.Property("Size") + .HasColumnType("integer"); + + b.Property("Source") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("MessageId"); + + b.ToTable("Attachments"); + }); + + modelBuilder.Entity("vassago.Models.Channel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DisplayName") + .HasColumnType("text"); + + b.Property("ExternalId") + .HasColumnType("numeric(20,0)"); + + b.Property("IsDM") + .HasColumnType("boolean"); + + b.Property("ParentChannelId") + .HasColumnType("uuid"); + + b.Property("PermissionsId") + .HasColumnType("integer"); + + b.Property("Protocol") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ParentChannelId"); + + b.HasIndex("PermissionsId"); + + b.ToTable("Channels"); + }); + + modelBuilder.Entity("vassago.Models.Message", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ActedOn") + .HasColumnType("boolean"); + + b.Property("AuthorId") + .HasColumnType("uuid"); + + b.Property("ChannelId") + .HasColumnType("uuid"); + + b.Property("Content") + .HasColumnType("text"); + + b.Property("ExternalId") + .HasColumnType("numeric(20,0)"); + + b.Property("MentionsMe") + .HasColumnType("boolean"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("AuthorId"); + + b.HasIndex("ChannelId"); + + b.ToTable("Messages"); + }); + + modelBuilder.Entity("vassago.Models.PermissionSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("LewdnessFilterLevel") + .HasColumnType("integer"); + + b.Property("LinksAllowed") + .HasColumnType("boolean"); + + b.Property("MaxAttachmentBytes") + .HasColumnType("bigint"); + + b.Property("MaxTextChars") + .HasColumnType("bigint"); + + b.Property("MeannessFilterLevel") + .HasColumnType("integer"); + + b.Property("ReactionsPossible") + .HasColumnType("boolean"); + + b.HasKey("Id"); + + b.ToTable("PermissionSettings"); + }); + + modelBuilder.Entity("vassago.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ExternalId") + .HasColumnType("numeric(20,0)"); + + b.Property("IsBot") + .HasColumnType("boolean"); + + b.Property("Protocol") + .HasColumnType("text"); + + b.Property("SeenInChannelId") + .HasColumnType("uuid"); + + b.Property("Username") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("SeenInChannelId"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("vassago.Models.Attachment", b => + { + b.HasOne("vassago.Models.Message", "Message") + .WithMany("Attachments") + .HasForeignKey("MessageId"); + + b.Navigation("Message"); + }); + + modelBuilder.Entity("vassago.Models.Channel", b => + { + b.HasOne("vassago.Models.Channel", "ParentChannel") + .WithMany("SubChannels") + .HasForeignKey("ParentChannelId"); + + b.HasOne("vassago.Models.PermissionSettings", "Permissions") + .WithMany() + .HasForeignKey("PermissionsId"); + + b.Navigation("ParentChannel"); + + b.Navigation("Permissions"); + }); + + modelBuilder.Entity("vassago.Models.Message", b => + { + b.HasOne("vassago.Models.User", "Author") + .WithMany() + .HasForeignKey("AuthorId"); + + b.HasOne("vassago.Models.Channel", "Channel") + .WithMany("Messages") + .HasForeignKey("ChannelId"); + + b.Navigation("Author"); + + b.Navigation("Channel"); + }); + + modelBuilder.Entity("vassago.Models.User", b => + { + b.HasOne("vassago.Models.Channel", "SeenInChannel") + .WithMany() + .HasForeignKey("SeenInChannelId"); + + b.Navigation("SeenInChannel"); + }); + + modelBuilder.Entity("vassago.Models.Channel", b => + { + b.Navigation("Messages"); + + b.Navigation("SubChannels"); + }); + + modelBuilder.Entity("vassago.Models.Message", b => + { + b.Navigation("Attachments"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Migrations/20230619144448_permissionsmove.cs b/Migrations/20230619144448_permissionsmove.cs new file mode 100644 index 0000000..ae9fd15 --- /dev/null +++ b/Migrations/20230619144448_permissionsmove.cs @@ -0,0 +1,70 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace vassago.Migrations +{ + /// + public partial class permissionsmove : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Channels_PermissionSettings_PermissionsOverridesId", + table: "Channels"); + + migrationBuilder.RenameColumn( + name: "PermissionsOverridesId", + table: "Channels", + newName: "PermissionsId"); + + migrationBuilder.RenameIndex( + name: "IX_Channels_PermissionsOverridesId", + table: "Channels", + newName: "IX_Channels_PermissionsId"); + + migrationBuilder.AddColumn( + name: "ReactionsPossible", + table: "PermissionSettings", + type: "boolean", + nullable: true); + + migrationBuilder.AddForeignKey( + name: "FK_Channels_PermissionSettings_PermissionsId", + table: "Channels", + column: "PermissionsId", + principalTable: "PermissionSettings", + principalColumn: "Id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Channels_PermissionSettings_PermissionsId", + table: "Channels"); + + migrationBuilder.DropColumn( + name: "ReactionsPossible", + table: "PermissionSettings"); + + migrationBuilder.RenameColumn( + name: "PermissionsId", + table: "Channels", + newName: "PermissionsOverridesId"); + + migrationBuilder.RenameIndex( + name: "IX_Channels_PermissionsId", + table: "Channels", + newName: "IX_Channels_PermissionsOverridesId"); + + migrationBuilder.AddForeignKey( + name: "FK_Channels_PermissionSettings_PermissionsOverridesId", + table: "Channels", + column: "PermissionsOverridesId", + principalTable: "PermissionSettings", + principalColumn: "Id"); + } + } +} diff --git a/Migrations/ChattingContextModelSnapshot.cs b/Migrations/ChattingContextModelSnapshot.cs index 00ec3bc..38f03d6 100644 --- a/Migrations/ChattingContextModelSnapshot.cs +++ b/Migrations/ChattingContextModelSnapshot.cs @@ -77,7 +77,7 @@ namespace vassago.Migrations b.Property("ParentChannelId") .HasColumnType("uuid"); - b.Property("PermissionsOverridesId") + b.Property("PermissionsId") .HasColumnType("integer"); b.Property("Protocol") @@ -87,7 +87,7 @@ namespace vassago.Migrations b.HasIndex("ParentChannelId"); - b.HasIndex("PermissionsOverridesId"); + b.HasIndex("PermissionsId"); b.ToTable("Channels"); }); @@ -151,6 +151,9 @@ namespace vassago.Migrations b.Property("MeannessFilterLevel") .HasColumnType("integer"); + b.Property("ReactionsPossible") + .HasColumnType("boolean"); + b.HasKey("Id"); b.ToTable("PermissionSettings"); @@ -199,13 +202,13 @@ namespace vassago.Migrations .WithMany("SubChannels") .HasForeignKey("ParentChannelId"); - b.HasOne("vassago.Models.PermissionSettings", "PermissionsOverrides") + b.HasOne("vassago.Models.PermissionSettings", "Permissions") .WithMany() - .HasForeignKey("PermissionsOverridesId"); + .HasForeignKey("PermissionsId"); b.Navigation("ParentChannel"); - b.Navigation("PermissionsOverrides"); + b.Navigation("Permissions"); }); modelBuilder.Entity("vassago.Models.Message", b => diff --git a/Models/Channel.cs b/Models/Channel.cs index 6cc4f85..f2c3475 100644 --- a/Models/Channel.cs +++ b/Models/Channel.cs @@ -14,7 +14,7 @@ public class Channel public ulong? ExternalId { get; set; } public string DisplayName { get; set; } public bool IsDM { get; set; } - public PermissionSettings PermissionsOverrides { get; set; } + public PermissionSettings Permissions { get; set; } public List SubChannels { get; set; } public Channel ParentChannel { get; set; } public string Protocol { get; set; } @@ -25,4 +25,39 @@ public class Channel [NonSerialized] public Func SendMessage; + + + public PermissionSettings EffectivePermissions + { + get + { + PermissionSettings toReturn = Permissions ?? new PermissionSettings(); + return GetEffectivePermissions(ref toReturn); + } + } + private PermissionSettings GetEffectivePermissions(ref PermissionSettings settings) + { + if(settings == null) throw new ArgumentNullException(); + settings.LewdnessFilterLevel = settings.LewdnessFilterLevel ?? Permissions?.LewdnessFilterLevel; + settings.MeannessFilterLevel = settings.MeannessFilterLevel ?? Permissions?.MeannessFilterLevel; + settings.LinksAllowed = settings.LinksAllowed ?? Permissions?.LinksAllowed; + settings.MaxAttachmentBytes = settings.MaxAttachmentBytes ?? Permissions?.MaxAttachmentBytes; + settings.MaxTextChars = settings.MaxTextChars ?? Permissions?.MaxTextChars; + settings.ReactionsPossible = settings.ReactionsPossible ?? Permissions?.ReactionsPossible; + + if(this.ParentChannel != null && + (settings.LewdnessFilterLevel == null || + settings.MeannessFilterLevel == null || + settings.LinksAllowed == null || + settings.MaxAttachmentBytes == null || + settings.MaxTextChars == null || + settings.ReactionsPossible == null)) + { + return this.ParentChannel.GetEffectivePermissions(ref settings); + } + else + { + return settings; + } + } } \ No newline at end of file diff --git a/Models/PermissionSettings.cs b/Models/PermissionSettings.cs index a2b1278..3883ca8 100644 --- a/Models/PermissionSettings.cs +++ b/Models/PermissionSettings.cs @@ -10,6 +10,7 @@ public class PermissionSettings public uint? MaxAttachmentBytes { get; set; } public uint? MaxTextChars { get; set; } public bool? LinksAllowed { get; set; } + public bool? ReactionsPossible { get; set; } public int? LewdnessFilterLevel { get; set; } public int? MeannessFilterLevel { get; set; } }