From eb11191c8f1a0f9e7c563c3f36922bed6898441a Mon Sep 17 00:00:00 2001 From: ChronosX88 Date: Wed, 3 Feb 2021 22:09:37 +0300 Subject: [PATCH] Refactor ChatSubsystem, start to prototyping interfaces for chat internal managers classes --- src/Zirconium/Core/Models/EntityID.cs | 43 +++++++++++++++++ src/Zirconium/Core/Plugins/IPC/IPCRouter.cs | 4 +- .../ChatSubsystem.csproj} | 1 + .../{BasicChat => ChatSubsystem}/Plugin.cs | 6 +-- .../Storage/Interfaces/IChatStorageManager.cs | 13 ++++++ .../Interfaces/IEventStorageManager.cs | 14 ++++++ .../ChatSubsystem/Storage/Models/Chat.cs | 25 ++++++++++ .../ChatSubsystem/Storage/Models/Event.cs | 19 ++++++++ .../Storage/Models/EventContent.cs | 15 ++++++ .../ChatSubsystem/Storage/Models/Media.cs | 11 +++++ .../Storage/Models/MediaAttrs.cs | 46 +++++++++++++++++++ .../ChatSubsystem/Storage/Models/Reaction.cs | 7 +++ .../MessageStorage/Message.cs | 32 ------------- .../MessageStorage/MessageStorage.csproj | 14 ------ src/ZirconiumPlugins/MessageStorage/Plugin.cs | 18 -------- 15 files changed, 199 insertions(+), 69 deletions(-) create mode 100644 src/Zirconium/Core/Models/EntityID.cs rename src/ZirconiumPlugins/{BasicChat/BasicChat.csproj => ChatSubsystem/ChatSubsystem.csproj} (86%) rename src/ZirconiumPlugins/{BasicChat => ChatSubsystem}/Plugin.cs (93%) create mode 100644 src/ZirconiumPlugins/ChatSubsystem/Storage/Interfaces/IChatStorageManager.cs create mode 100644 src/ZirconiumPlugins/ChatSubsystem/Storage/Interfaces/IEventStorageManager.cs create mode 100644 src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Chat.cs create mode 100644 src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Event.cs create mode 100644 src/ZirconiumPlugins/ChatSubsystem/Storage/Models/EventContent.cs create mode 100644 src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Media.cs create mode 100644 src/ZirconiumPlugins/ChatSubsystem/Storage/Models/MediaAttrs.cs create mode 100644 src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Reaction.cs delete mode 100644 src/ZirconiumPlugins/MessageStorage/Message.cs delete mode 100644 src/ZirconiumPlugins/MessageStorage/MessageStorage.csproj delete mode 100644 src/ZirconiumPlugins/MessageStorage/Plugin.cs diff --git a/src/Zirconium/Core/Models/EntityID.cs b/src/Zirconium/Core/Models/EntityID.cs new file mode 100644 index 0000000..adc45d1 --- /dev/null +++ b/src/Zirconium/Core/Models/EntityID.cs @@ -0,0 +1,43 @@ +namespace Zirconium.Core.Models +{ + public class EntityID + { + public string LocalPart { get; } + public string ServerPart { get; } + public bool OnlyServerPart { get; } + public char Type { get; } + + public EntityID(string entityID) + { + Type = entityID[0]; + entityID = entityID.Remove(0, 1); // prevent confusion with username entityID type when splitting + var entityIdSplitted = entityID.Split("@"); + + // if it is only server part + if (entityIdSplitted.Length == 1 && entityIdSplitted[0] == entityID) + { + ServerPart = entityIdSplitted[0]; + OnlyServerPart = true; + } + + LocalPart = entityIdSplitted[0]; + ServerPart = entityIdSplitted[1]; + } + + public EntityID(char type, string localPart, string serverPart) + { + Type = type; + LocalPart = localPart; + ServerPart = serverPart; + } + + public override string ToString() + { + if (OnlyServerPart) + { + return ServerPart; + } + return $"{Type}{LocalPart}@{ServerPart}"; + } + } +} \ No newline at end of file diff --git a/src/Zirconium/Core/Plugins/IPC/IPCRouter.cs b/src/Zirconium/Core/Plugins/IPC/IPCRouter.cs index b665af0..6937720 100644 --- a/src/Zirconium/Core/Plugins/IPC/IPCRouter.cs +++ b/src/Zirconium/Core/Plugins/IPC/IPCRouter.cs @@ -36,11 +36,11 @@ namespace Zirconium.Core.Plugins.IPC { return Task.Factory.StartNew(() => { - var method = methodTable[pluginName].Where(x => x.MethodName == methodName).FirstOrDefault(); + var method = methodTable[pluginName].FirstOrDefault(x => x.MethodName == methodName); object returnValue = null; try { - returnValue = method.Method.Invoke(method.Service, new object[] { paramsObject }); + returnValue = method?.Method.Invoke(method.Service, new object[] { paramsObject }); } catch (TargetInvocationException e) { diff --git a/src/ZirconiumPlugins/BasicChat/BasicChat.csproj b/src/ZirconiumPlugins/ChatSubsystem/ChatSubsystem.csproj similarity index 86% rename from src/ZirconiumPlugins/BasicChat/BasicChat.csproj rename to src/ZirconiumPlugins/ChatSubsystem/ChatSubsystem.csproj index 02491df..cc2f039 100644 --- a/src/ZirconiumPlugins/BasicChat/BasicChat.csproj +++ b/src/ZirconiumPlugins/ChatSubsystem/ChatSubsystem.csproj @@ -3,6 +3,7 @@ netcoreapp3.1 false + ChatSubsystem diff --git a/src/ZirconiumPlugins/BasicChat/Plugin.cs b/src/ZirconiumPlugins/ChatSubsystem/Plugin.cs similarity index 93% rename from src/ZirconiumPlugins/BasicChat/Plugin.cs rename to src/ZirconiumPlugins/ChatSubsystem/Plugin.cs index 244b902..bf38c03 100644 --- a/src/ZirconiumPlugins/BasicChat/Plugin.cs +++ b/src/ZirconiumPlugins/ChatSubsystem/Plugin.cs @@ -6,11 +6,11 @@ using Zirconium.Core.Plugins.Interfaces; using Zirconium.Utils; using Log4Sharp; -namespace BasicChat +namespace ChatSubsystem { - internal class BasicChat : IPluginAPI + internal class ChatSubsystemPlugin : IPluginAPI { - public string GetPluginUniqueName() => "BasicChat"; + public string GetPluginUniqueName() => "ChatSubsystem"; public void Initialize(IPluginHostAPI pluginHost) { diff --git a/src/ZirconiumPlugins/ChatSubsystem/Storage/Interfaces/IChatStorageManager.cs b/src/ZirconiumPlugins/ChatSubsystem/Storage/Interfaces/IChatStorageManager.cs new file mode 100644 index 0000000..bcd6237 --- /dev/null +++ b/src/ZirconiumPlugins/ChatSubsystem/Storage/Interfaces/IChatStorageManager.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; +using ChatSubsystem.Storage.Models; +using Zirconium.Core.Models; + +namespace ChatSubsystem.Storage.Interfaces +{ + public interface IChatStorageManager + { + Task GetPrivateChat(EntityID u1, EntityID u2); + Task GetById(EntityID chatId); + Task GetEventById(EntityID id); + } +} \ No newline at end of file diff --git a/src/ZirconiumPlugins/ChatSubsystem/Storage/Interfaces/IEventStorageManager.cs b/src/ZirconiumPlugins/ChatSubsystem/Storage/Interfaces/IEventStorageManager.cs new file mode 100644 index 0000000..d586af4 --- /dev/null +++ b/src/ZirconiumPlugins/ChatSubsystem/Storage/Interfaces/IEventStorageManager.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using ChatSubsystem.Storage.Models; +using Zirconium.Core.Models; + +namespace ChatSubsystem.Storage.Interfaces +{ + public interface IEventStorageManager + { + IList GetEventsForUser(EntityID user, EntityID token, int limit); + + Task GetEventById(EntityID id); + } +} \ No newline at end of file diff --git a/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Chat.cs b/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Chat.cs new file mode 100644 index 0000000..d9b951b --- /dev/null +++ b/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Chat.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace ChatSubsystem.Storage.Models +{ + public class Chat + { + [BsonId] + public ObjectId Id { get; set; } + + public string ChatID { get; set; } + public string AvatarID { get; set; } + public string Description { get; set; } + public string[] Members { get; set; } + public bool IsPrivateChat { get; set; } + + public IList Banned { get; set; } + public IList PinnedMessages { get; set; } // id of pinned messages + public IDictionary RoleNames { get; set; } + public IDictionary Permissions { get; set; } + public IList LocalAliases { get; set; } + public IList RemoveAliases { get; set; } + } +} \ No newline at end of file diff --git a/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Event.cs b/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Event.cs new file mode 100644 index 0000000..fc92fe6 --- /dev/null +++ b/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Event.cs @@ -0,0 +1,19 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using Zirconium.Core.Models; + +namespace ChatSubsystem.Storage.Models +{ + public class Event + { + [BsonId] + public ObjectId Id { get; set; } + + public EntityID From { get; set; } + public EntityID ChatId { get; set; } + public string Type { get; set; } + public long Timestamp { get; set; } + public EntityID OriginServer { get; set; } + public EventContent Content { get; set; } + } +} \ No newline at end of file diff --git a/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/EventContent.cs b/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/EventContent.cs new file mode 100644 index 0000000..b83fa41 --- /dev/null +++ b/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/EventContent.cs @@ -0,0 +1,15 @@ +using MongoDB.Bson.Serialization.Attributes; + +namespace ChatSubsystem.Storage.Models +{ + [BsonDiscriminator(RootClass = true)] + [BsonKnownTypes(typeof(GeneralMessageEventContent))] + public abstract class EventContent {} + + public class GeneralMessageEventContent : EventContent + { + public string Text { get; set; } + public Media[] Media { get; set; } + public Reaction[] Reactions { get; set; } + } +} \ No newline at end of file diff --git a/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Media.cs b/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Media.cs new file mode 100644 index 0000000..ba18ea1 --- /dev/null +++ b/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Media.cs @@ -0,0 +1,11 @@ +namespace ChatSubsystem.Storage.Models +{ + public class Media + { + public string ID { get; set; } + public string Type { get; set; } + public int Size { get; set; } + public string FileName { get; set; } + public MediaAttrs Attrs { get; set; } + } +} \ No newline at end of file diff --git a/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/MediaAttrs.cs b/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/MediaAttrs.cs new file mode 100644 index 0000000..df6fc7a --- /dev/null +++ b/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/MediaAttrs.cs @@ -0,0 +1,46 @@ +using MongoDB.Bson.Serialization.Attributes; + +namespace ChatSubsystem.Storage.Models +{ + [BsonDiscriminator(RootClass = true)] + [BsonKnownTypes(typeof(AudioAttrs),typeof(StickerAttrs), typeof(VideoAttrs), typeof(PhotoAttrs), typeof(GeolocationAttrs))] + public abstract class MediaAttrs + { + } + + public class AudioAttrs : MediaAttrs + { + public bool Voice { get; set; } // whether it is voice message + public decimal Duration { get; set; } // duration of audio + public string? Title { get; set; } // audio title + public string? Artist { get; set; } // audio artist + public byte[] VoiceWaveForm { get; set; } // voice wave form + } + + public class StickerAttrs : MediaAttrs + { + public string AssociatedEmoji { get; set; } // the associated emoji with this + public string StickerSetID { get; set; } // id of sticker set which is associated with this sticker + public bool Animated { get; set; } // is client need to animate this sticker + } + + public class VideoAttrs : MediaAttrs + { + public bool IsVideoMessage { get; set; } // is this a rounded video message + public decimal Duration { get; set; } // duration of video + public decimal Width { get; set; } // width of video + public decimal Height { get; set; } // height of video + } + + public class PhotoAttrs : MediaAttrs + { + public decimal Width { get; set; } // width of photo + public decimal Height { get; set; } // height of photo + } + + public class GeolocationAttrs : MediaAttrs + { + public double Latitude { get; set; } + public double Longitude { get; set; } + } +} \ No newline at end of file diff --git a/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Reaction.cs b/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Reaction.cs new file mode 100644 index 0000000..45c3020 --- /dev/null +++ b/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Reaction.cs @@ -0,0 +1,7 @@ +namespace ChatSubsystem.Storage.Models +{ + public class Reaction + { + public string ID { get; set; } + } +} \ No newline at end of file diff --git a/src/ZirconiumPlugins/MessageStorage/Message.cs b/src/ZirconiumPlugins/MessageStorage/Message.cs deleted file mode 100644 index 9b2b7cb..0000000 --- a/src/ZirconiumPlugins/MessageStorage/Message.cs +++ /dev/null @@ -1,32 +0,0 @@ -using MongoDB.Bson; -using MongoDB.Bson.Serialization.Attributes; - -namespace MessageStorage -{ - public class Message - { - public ObjectId Id { get; set; } - public string From { get; set; } - public string To { get; set; } - public string RoomId { get; set; } - public string Type { get; set; } - public long Timestamp { get; set; } - public string Content { get; set; } - public Media[] Media { get; set; } - public Reaction[] Reactions { get; set; } - - [BsonExtraElements] - public BsonDocument OtherMetadata { get; set; } - } - - public class Media - { - public string MimeType; - public string Url; - } - - public class Reaction - { - public string ID { get; set; } - } -} \ No newline at end of file diff --git a/src/ZirconiumPlugins/MessageStorage/MessageStorage.csproj b/src/ZirconiumPlugins/MessageStorage/MessageStorage.csproj deleted file mode 100644 index 2cf1f24..0000000 --- a/src/ZirconiumPlugins/MessageStorage/MessageStorage.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - netcoreapp3.1 - - - - - runtime - - - - - diff --git a/src/ZirconiumPlugins/MessageStorage/Plugin.cs b/src/ZirconiumPlugins/MessageStorage/Plugin.cs deleted file mode 100644 index 924157b..0000000 --- a/src/ZirconiumPlugins/MessageStorage/Plugin.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using Zirconium.Core.Plugins.Interfaces; - -namespace MessageStorage -{ - public class Plugin : IPluginAPI - { - public void Initialize(IPluginHostAPI pluginHost) - { - throw new NotImplementedException(); - } - - public string GetPluginUniqueName() - { - return "MessageStoragePlugin"; - } - } -}