From 464b6a90e4aff44266c7bc8862210d39e41bb4a4 Mon Sep 17 00:00:00 2001 From: Adam R Grey Date: Fri, 5 Apr 2024 23:59:39 -0400 Subject: [PATCH] channel permissions are just part of channel --- Models/Channel.cs | 68 +++++++++++-------- Models/ChannelPermissions.cs | 38 ----------- Models/ChattingContext.cs | 1 - .../DiscordInterface/DiscordInterface.cs | 18 ++--- .../TwitchInterface/TwitchInterface.cs | 15 ++-- README.md | 6 +- 6 files changed, 55 insertions(+), 91 deletions(-) delete mode 100644 Models/ChannelPermissions.cs diff --git a/Models/Channel.cs b/Models/Channel.cs index 52549ae..e01657e 100644 --- a/Models/Channel.cs +++ b/Models/Channel.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Reflection; using System.Threading.Tasks; +using Microsoft.AspNetCore.Components.Web; using static vassago.Models.Enumerations; public class Channel @@ -13,7 +14,6 @@ public class Channel public Guid Id { get; set; } public string ExternalId { get; set; } public string DisplayName { get; set; } - public ChannelPermissions Permissions { get; set; } public List SubChannels { get; set; } public Channel ParentChannel { get; set; } public string Protocol { get; set; } @@ -21,6 +21,14 @@ public class Channel public List Users { get; set; } public ChannelType ChannelType {get; set; } + //Permissions + public ulong? MaxAttachmentBytes { get; set; } + public uint? MaxTextChars { get; set; } + public bool? LinksAllowed { get; set; } + public bool? ReactionsPossible { get; set; } + public Enumerations.LewdnessFilterLevel? LewdnessFilterLevel { get; set; } + public Enumerations.MeannessFilterLevel? MeannessFilterLevel { get; set; } + [NonSerialized] public Func SendFile; @@ -32,33 +40,29 @@ public class Channel { get { - ChannelPermissions toReturn = Permissions ?? new ChannelPermissions(); - return GetEffectivePermissions(ref toReturn).Definite(); - } - } - private ChannelPermissions GetEffectivePermissions(ref ChannelPermissions 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; + var path = new Stack(); //omg i actually get to use a data structure from university + var walker = this; + path.Push(this); + while(walker.ParentChannel != null) + { + walker = walker.ParentChannel; + path.Push(walker); + } + DefinitePermissionSettings toReturn = new DefinitePermissionSettings(); + walker = path.Pop(); + while(walker != null) + { + toReturn.LewdnessFilterLevel = LewdnessFilterLevel ?? toReturn.LewdnessFilterLevel; + toReturn.MeannessFilterLevel = MeannessFilterLevel ?? toReturn.MeannessFilterLevel; + toReturn.LinksAllowed = LinksAllowed ?? toReturn.LinksAllowed; + toReturn.MaxAttachmentBytes = MaxAttachmentBytes ?? toReturn.MaxAttachmentBytes; + toReturn.MaxTextChars = MaxTextChars ?? toReturn.MaxTextChars; + toReturn.ReactionsPossible = ReactionsPossible ?? toReturn.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; + walker = path.Pop(); + } + + return toReturn; } } public string LineageSummary @@ -75,4 +79,14 @@ public class Channel } } } +} + +public class DefinitePermissionSettings +{ + public ulong MaxAttachmentBytes { get; set; } + public uint MaxTextChars { get; set; } + public bool LinksAllowed { get; set; } + public bool ReactionsPossible { get; set; } + public Enumerations.LewdnessFilterLevel LewdnessFilterLevel { get; set; } + public Enumerations.MeannessFilterLevel MeannessFilterLevel { get; set; } } \ No newline at end of file diff --git a/Models/ChannelPermissions.cs b/Models/ChannelPermissions.cs deleted file mode 100644 index 801c850..0000000 --- a/Models/ChannelPermissions.cs +++ /dev/null @@ -1,38 +0,0 @@ -namespace vassago.Models; - -using System; -using System.ComponentModel.DataAnnotations.Schema; - -public class ChannelPermissions -{ - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public int Id { get; set; } - public ulong? MaxAttachmentBytes { get; set; } - public uint? MaxTextChars { get; set; } - public bool? LinksAllowed { get; set; } - public bool? ReactionsPossible { get; set; } - public Enumerations.LewdnessFilterLevel? LewdnessFilterLevel { get; set; } - public Enumerations.MeannessFilterLevel? MeannessFilterLevel { get; set; } - - internal DefinitePermissionSettings Definite() - { - return new DefinitePermissionSettings() - { - MaxAttachmentBytes = this.MaxAttachmentBytes ?? 0, - MaxTextChars = this.MaxTextChars ?? 0, - LinksAllowed = this.LinksAllowed ?? false, - LewdnessFilterLevel = this.LewdnessFilterLevel ?? Enumerations.LewdnessFilterLevel.G, - MeannessFilterLevel = this.MeannessFilterLevel ?? Enumerations.MeannessFilterLevel.Strict, - ReactionsPossible = this.ReactionsPossible ?? false - }; - } -} -public class DefinitePermissionSettings -{ - public ulong MaxAttachmentBytes { get; set; } - public uint MaxTextChars { get; set; } - public bool LinksAllowed { get; set; } - public bool ReactionsPossible { get; set; } - public Enumerations.LewdnessFilterLevel LewdnessFilterLevel { get; set; } - public Enumerations.MeannessFilterLevel MeannessFilterLevel { get; set; } -} \ No newline at end of file diff --git a/Models/ChattingContext.cs b/Models/ChattingContext.cs index 63f6009..f72dafd 100644 --- a/Models/ChattingContext.cs +++ b/Models/ChattingContext.cs @@ -9,7 +9,6 @@ public class ChattingContext : DbContext public DbSet Channels { get; set; } //public DbSet Emoji {get;set;} public DbSet Messages { get; set; } - public DbSet ChannelPermissions{get;set;} public DbSet FeaturePermissions{get;set;} public DbSet Accounts { get; set; } public DbSet Users { get; set; } diff --git a/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs b/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs index 8ed9f20..3100833 100644 --- a/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs +++ b/ProtocolInterfaces/DiscordInterface/DiscordInterface.cs @@ -58,15 +58,12 @@ public class DiscordInterface protocolAsChannel = new Channel() { DisplayName = "discord (itself)", - Permissions = new Models.ChannelPermissions() - { - MeannessFilterLevel = Enumerations.MeannessFilterLevel.Strict, - LewdnessFilterLevel = Enumerations.LewdnessFilterLevel.Moderate, - MaxTextChars = 2000, - MaxAttachmentBytes = 25 * 1024 * 1024, //allegedly it's 25, but I worry it's not actually. - LinksAllowed = true, - ReactionsPossible = true - }, + MeannessFilterLevel = Enumerations.MeannessFilterLevel.Strict, + LewdnessFilterLevel = Enumerations.LewdnessFilterLevel.Moderate, + MaxTextChars = 2000, + MaxAttachmentBytes = 25 * 1024 * 1024, //allegedly it's 25, but I worry it's not actually. + LinksAllowed = true, + ReactionsPossible = true, ExternalId = null, Protocol = PROTOCOL, SubChannels = new List() @@ -298,8 +295,7 @@ public class DiscordInterface c.Protocol = protocolAsChannel.Protocol; c.ParentChannel = protocolAsChannel; c.SubChannels = c.SubChannels ?? new List(); - c.Permissions = c.Permissions ?? new Models.ChannelPermissions(); - c.Permissions.MaxAttachmentBytes = channel.MaxUploadLimit; + c.MaxAttachmentBytes = channel.MaxUploadLimit; c.SendMessage = (t) => { throw new InvalidOperationException($"channel {channel.Name} is guild; cannot accept text"); }; c.SendFile = (f, t) => { throw new InvalidOperationException($"channel {channel.Name} is guild; send file"); }; diff --git a/ProtocolInterfaces/TwitchInterface/TwitchInterface.cs b/ProtocolInterfaces/TwitchInterface/TwitchInterface.cs index 533db08..855a785 100644 --- a/ProtocolInterfaces/TwitchInterface/TwitchInterface.cs +++ b/ProtocolInterfaces/TwitchInterface/TwitchInterface.cs @@ -39,15 +39,12 @@ public class TwitchInterface protocolAsChannel = new Channel() { DisplayName = "twitch (itself)", - Permissions = new ChannelPermissions() - { - MeannessFilterLevel = Enumerations.MeannessFilterLevel.Medium, - LewdnessFilterLevel = Enumerations.LewdnessFilterLevel.G, - MaxTextChars = 500, - MaxAttachmentBytes = 0, - LinksAllowed = false, - ReactionsPossible = false - }, + MeannessFilterLevel = Enumerations.MeannessFilterLevel.Medium, + LewdnessFilterLevel = Enumerations.LewdnessFilterLevel.G, + MaxTextChars = 500, + MaxAttachmentBytes = 0, + LinksAllowed = false, + ReactionsPossible = false, ExternalId = null, Protocol = PROTOCOL, SubChannels = new List() diff --git a/README.md b/README.md index d7a6927..b57cd67 100644 --- a/README.md +++ b/README.md @@ -21,11 +21,7 @@ debating whether to save a copy of every single attachment. Discord allows 25MB ### Channel -a place where communication can happen. any level of these can have any number of children. In matrix, everything is a "room" - even spaces and threads. Seems like a fine idea. So for vassago, a discord "channel" is a channel. a "thread" is a child of that channel. a "category" is a parent of that channel. A "server" (formerly "guild") is a parent of that channel. and fuck it, Discord itself is a "channel". - -### ChannelPermissions - -the permissions Vassago has for a channel. MaxAttachmentBytes, etc. (...shouldn't this be just part of Channel? You're *always* going down the hierarchy until you find an override. permissions should always inherit, right?) +a place where communication can happen. any level of these can have any number of children. In matrix, everything is a "room" - even spaces and threads. Seems like a fine idea. So for vassago, a discord "channel" is a channel. a "thread" is a child of that channel. a "category" is a parent of that channel. A "server" (formerly "guild") is a parent of that channel. and fuck it, Discord itself is a "channel". Includes permissions vassago has for a channel; MaxAttachmentBytes, etc. go down the hierarchy until you find an override. ### FeaturePermission