From 3b175900c10a9a152a168b1bd6fee390aa58e8e0 Mon Sep 17 00:00:00 2001 From: Keda Date: Sun, 28 Sep 2025 22:31:51 +0200 Subject: [PATCH] =?UTF-8?q?Pr=C3=A9paration=20API=20pour=20detection=20Typ?= =?UTF-8?q?ingState?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MareSynchronosAPI/Data/CharacterData.cs | 36 +++++ MareSynchronosAPI/Data/ChatMessage.cs | 11 ++ .../Data/Comparer/GroupDataComparer.cs | 19 +++ .../Data/Comparer/GroupDtoComparer.cs | 23 +++ .../Data/Comparer/GroupPairDtoComparer.cs | 20 +++ .../Data/Comparer/UserDataComparer.cs | 20 +++ .../Data/Comparer/UserDtoComparer.cs | 20 +++ .../Data/Enum/GroupPermissions.cs | 11 ++ MareSynchronosAPI/Data/Enum/GroupUserInfo.cs | 9 ++ .../Data/Enum/GroupUserPermissions.cs | 11 ++ .../Data/Enum/MessageSeverity.cs | 8 + MareSynchronosAPI/Data/Enum/ObjectKind.cs | 9 ++ .../Data/Enum/UserPermissions.cs | 12 ++ .../Extensions/GroupPermissionsExtensions.cs | 50 ++++++ .../Extensions/GroupUserInfoExtensions.cs | 28 ++++ .../GroupUserPermissionsExtensions.cs | 50 ++++++ .../Extensions/UserPermissionsExtensions.cs | 61 +++++++ MareSynchronosAPI/Data/FileReplacementData.cs | 30 ++++ MareSynchronosAPI/Data/GroupData.cs | 10 ++ MareSynchronosAPI/Data/SignedChatMessage.cs | 14 ++ MareSynchronosAPI/Data/UserData.cs | 10 ++ .../Dto/Account/RegisterReplyDto.cs | 12 ++ .../Dto/Account/RegisterReplyV2Dto.cs | 11 ++ MareSynchronosAPI/Dto/AuthReplyDto.cs | 11 ++ .../Dto/CharaData/AccessTypeDto.cs | 9 ++ .../Dto/CharaData/CharaDataDownloadDto.cs | 14 ++ .../Dto/CharaData/CharaDataDto.cs | 9 ++ .../Dto/CharaData/CharaDataFullDto.cs | 88 +++++++++++ .../Dto/CharaData/CharaDataMetaInfoDto.cs | 11 ++ .../Dto/CharaData/CharaDataUpdateDto.cs | 20 +++ .../Dto/CharaData/ShareTypeDto.cs | 7 + MareSynchronosAPI/Dto/Chat/GroupChatMsgDto.cs | 13 ++ MareSynchronosAPI/Dto/Chat/UserChatMsgDto.cs | 11 ++ MareSynchronosAPI/Dto/ConnectionDto.cs | 25 +++ .../Dto/Files/DownloadFileDto.cs | 14 ++ MareSynchronosAPI/Dto/Files/FilesSendDto.cs | 13 ++ .../Dto/Files/ITransferFileDto.cs | 8 + MareSynchronosAPI/Dto/Files/UploadFileDto.cs | 11 ++ .../Dto/Group/BannedGroupUserDto.cs | 19 +++ MareSynchronosAPI/Dto/Group/GroupDto.cs | 13 ++ .../Dto/Group/GroupFullInfoDto.cs | 12 ++ MareSynchronosAPI/Dto/Group/GroupInfoDto.cs | 20 +++ MareSynchronosAPI/Dto/Group/GroupPairDto.cs | 12 ++ .../Dto/Group/GroupPairFullInfoDto.cs | 12 ++ .../Dto/Group/GroupPairUserInfoDto.cs | 8 + .../Dto/Group/GroupPairUserPermissionDto.cs | 8 + .../Dto/Group/GroupPasswordDto.cs | 12 ++ .../Dto/Group/GroupPermissionDto.cs | 8 + MareSynchronosAPI/Dto/SystemInfoDto.cs | 9 ++ .../Dto/User/OnlineUserCharaDataDto.cs | 7 + .../Dto/User/OnlineUserIdentDto.cs | 7 + .../Dto/User/UserCharaDataMessageDto.cs | 7 + MareSynchronosAPI/Dto/User/UserDto.cs | 7 + MareSynchronosAPI/Dto/User/UserPairDto.cs | 12 ++ .../Dto/User/UserPermissionsDto.cs | 8 + MareSynchronosAPI/Dto/User/UserProfileDto.cs | 7 + .../Dto/User/UserProfileReportDto.cs | 7 + MareSynchronosAPI/MareSynchronos.API.csproj | 13 ++ MareSynchronosAPI/MareSynchronosAPI.sln | 25 +++ MareSynchronosAPI/Routes/MareAuth.cs | 14 ++ MareSynchronosAPI/Routes/MareFiles.cs | 45 ++++++ MareSynchronosAPI/SignalR/IMareHub.cs | 149 ++++++++++++++++++ MareSynchronosAPI/SignalR/IMareHubClient.cs | 62 ++++++++ 63 files changed, 1252 insertions(+) create mode 100644 MareSynchronosAPI/Data/CharacterData.cs create mode 100644 MareSynchronosAPI/Data/ChatMessage.cs create mode 100644 MareSynchronosAPI/Data/Comparer/GroupDataComparer.cs create mode 100644 MareSynchronosAPI/Data/Comparer/GroupDtoComparer.cs create mode 100644 MareSynchronosAPI/Data/Comparer/GroupPairDtoComparer.cs create mode 100644 MareSynchronosAPI/Data/Comparer/UserDataComparer.cs create mode 100644 MareSynchronosAPI/Data/Comparer/UserDtoComparer.cs create mode 100644 MareSynchronosAPI/Data/Enum/GroupPermissions.cs create mode 100644 MareSynchronosAPI/Data/Enum/GroupUserInfo.cs create mode 100644 MareSynchronosAPI/Data/Enum/GroupUserPermissions.cs create mode 100644 MareSynchronosAPI/Data/Enum/MessageSeverity.cs create mode 100644 MareSynchronosAPI/Data/Enum/ObjectKind.cs create mode 100644 MareSynchronosAPI/Data/Enum/UserPermissions.cs create mode 100644 MareSynchronosAPI/Data/Extensions/GroupPermissionsExtensions.cs create mode 100644 MareSynchronosAPI/Data/Extensions/GroupUserInfoExtensions.cs create mode 100644 MareSynchronosAPI/Data/Extensions/GroupUserPermissionsExtensions.cs create mode 100644 MareSynchronosAPI/Data/Extensions/UserPermissionsExtensions.cs create mode 100644 MareSynchronosAPI/Data/FileReplacementData.cs create mode 100644 MareSynchronosAPI/Data/GroupData.cs create mode 100644 MareSynchronosAPI/Data/SignedChatMessage.cs create mode 100644 MareSynchronosAPI/Data/UserData.cs create mode 100644 MareSynchronosAPI/Dto/Account/RegisterReplyDto.cs create mode 100644 MareSynchronosAPI/Dto/Account/RegisterReplyV2Dto.cs create mode 100644 MareSynchronosAPI/Dto/AuthReplyDto.cs create mode 100644 MareSynchronosAPI/Dto/CharaData/AccessTypeDto.cs create mode 100644 MareSynchronosAPI/Dto/CharaData/CharaDataDownloadDto.cs create mode 100644 MareSynchronosAPI/Dto/CharaData/CharaDataDto.cs create mode 100644 MareSynchronosAPI/Dto/CharaData/CharaDataFullDto.cs create mode 100644 MareSynchronosAPI/Dto/CharaData/CharaDataMetaInfoDto.cs create mode 100644 MareSynchronosAPI/Dto/CharaData/CharaDataUpdateDto.cs create mode 100644 MareSynchronosAPI/Dto/CharaData/ShareTypeDto.cs create mode 100644 MareSynchronosAPI/Dto/Chat/GroupChatMsgDto.cs create mode 100644 MareSynchronosAPI/Dto/Chat/UserChatMsgDto.cs create mode 100644 MareSynchronosAPI/Dto/ConnectionDto.cs create mode 100644 MareSynchronosAPI/Dto/Files/DownloadFileDto.cs create mode 100644 MareSynchronosAPI/Dto/Files/FilesSendDto.cs create mode 100644 MareSynchronosAPI/Dto/Files/ITransferFileDto.cs create mode 100644 MareSynchronosAPI/Dto/Files/UploadFileDto.cs create mode 100644 MareSynchronosAPI/Dto/Group/BannedGroupUserDto.cs create mode 100644 MareSynchronosAPI/Dto/Group/GroupDto.cs create mode 100644 MareSynchronosAPI/Dto/Group/GroupFullInfoDto.cs create mode 100644 MareSynchronosAPI/Dto/Group/GroupInfoDto.cs create mode 100644 MareSynchronosAPI/Dto/Group/GroupPairDto.cs create mode 100644 MareSynchronosAPI/Dto/Group/GroupPairFullInfoDto.cs create mode 100644 MareSynchronosAPI/Dto/Group/GroupPairUserInfoDto.cs create mode 100644 MareSynchronosAPI/Dto/Group/GroupPairUserPermissionDto.cs create mode 100644 MareSynchronosAPI/Dto/Group/GroupPasswordDto.cs create mode 100644 MareSynchronosAPI/Dto/Group/GroupPermissionDto.cs create mode 100644 MareSynchronosAPI/Dto/SystemInfoDto.cs create mode 100644 MareSynchronosAPI/Dto/User/OnlineUserCharaDataDto.cs create mode 100644 MareSynchronosAPI/Dto/User/OnlineUserIdentDto.cs create mode 100644 MareSynchronosAPI/Dto/User/UserCharaDataMessageDto.cs create mode 100644 MareSynchronosAPI/Dto/User/UserDto.cs create mode 100644 MareSynchronosAPI/Dto/User/UserPairDto.cs create mode 100644 MareSynchronosAPI/Dto/User/UserPermissionsDto.cs create mode 100644 MareSynchronosAPI/Dto/User/UserProfileDto.cs create mode 100644 MareSynchronosAPI/Dto/User/UserProfileReportDto.cs create mode 100644 MareSynchronosAPI/MareSynchronos.API.csproj create mode 100644 MareSynchronosAPI/MareSynchronosAPI.sln create mode 100644 MareSynchronosAPI/Routes/MareAuth.cs create mode 100644 MareSynchronosAPI/Routes/MareFiles.cs create mode 100644 MareSynchronosAPI/SignalR/IMareHub.cs create mode 100644 MareSynchronosAPI/SignalR/IMareHubClient.cs diff --git a/MareSynchronosAPI/Data/CharacterData.cs b/MareSynchronosAPI/Data/CharacterData.cs new file mode 100644 index 0000000..da155a3 --- /dev/null +++ b/MareSynchronosAPI/Data/CharacterData.cs @@ -0,0 +1,36 @@ +using MareSynchronos.API.Data.Enum; +using MessagePack; +using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; +using System.Security.Cryptography; + +namespace MareSynchronos.API.Data; + +[MessagePackObject(keyAsPropertyName: true)] +public class CharacterData +{ + public CharacterData() + { + DataHash = new(() => + { + var json = JsonSerializer.Serialize(this); +#pragma warning disable SYSLIB0021 // Type or member is obsolete + using SHA256CryptoServiceProvider cryptoProvider = new(); +#pragma warning restore SYSLIB0021 // Type or member is obsolete + return BitConverter.ToString(cryptoProvider.ComputeHash(Encoding.UTF8.GetBytes(json))).Replace("-", "", StringComparison.Ordinal); + }); + } + + public Dictionary CustomizePlusData { get; set; } = new(); + [JsonIgnore] + public Lazy DataHash { get; } + + public Dictionary> FileReplacements { get; set; } = new(); + public Dictionary GlamourerData { get; set; } = new(); + public string HeelsData { get; set; } = string.Empty; + public string HonorificData { get; set; } = string.Empty; + public string ManipulationData { get; set; } = string.Empty; + public string MoodlesData { get; set; } = string.Empty; + public string PetNamesData { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/ChatMessage.cs b/MareSynchronosAPI/Data/ChatMessage.cs new file mode 100644 index 0000000..55224a5 --- /dev/null +++ b/MareSynchronosAPI/Data/ChatMessage.cs @@ -0,0 +1,11 @@ +using MessagePack; + +namespace MareSynchronos.API.Data; + +[MessagePackObject(keyAsPropertyName: true)] +public record ChatMessage +{ + public string SenderName { get; set; } = string.Empty; + public uint SenderHomeWorldId { get; set; } = 0; + public byte[] PayloadContent { get; set; } = []; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Comparer/GroupDataComparer.cs b/MareSynchronosAPI/Data/Comparer/GroupDataComparer.cs new file mode 100644 index 0000000..dfd0456 --- /dev/null +++ b/MareSynchronosAPI/Data/Comparer/GroupDataComparer.cs @@ -0,0 +1,19 @@ +namespace MareSynchronos.API.Data.Comparer; + +public class GroupDataComparer : IEqualityComparer +{ + public static GroupDataComparer Instance => _instance; + private static GroupDataComparer _instance = new GroupDataComparer(); + + private GroupDataComparer() { } + public bool Equals(GroupData? x, GroupData? y) + { + if (x == null || y == null) return false; + return x.GID.Equals(y.GID, StringComparison.Ordinal); + } + + public int GetHashCode(GroupData obj) + { + return obj.GID.GetHashCode(); + } +} diff --git a/MareSynchronosAPI/Data/Comparer/GroupDtoComparer.cs b/MareSynchronosAPI/Data/Comparer/GroupDtoComparer.cs new file mode 100644 index 0000000..3814c6f --- /dev/null +++ b/MareSynchronosAPI/Data/Comparer/GroupDtoComparer.cs @@ -0,0 +1,23 @@ +using MareSynchronos.API.Dto.Group; + +namespace MareSynchronos.API.Data.Comparer; + + +public class GroupDtoComparer : IEqualityComparer +{ + public static GroupDtoComparer Instance => _instance; + private static GroupDtoComparer _instance = new GroupDtoComparer(); + + private GroupDtoComparer() { } + + public bool Equals(GroupDto? x, GroupDto? y) + { + if (x == null || y == null) return false; + return x.GID.Equals(y.GID, StringComparison.Ordinal); + } + + public int GetHashCode(GroupDto obj) + { + return obj.Group.GID.GetHashCode(); + } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Comparer/GroupPairDtoComparer.cs b/MareSynchronosAPI/Data/Comparer/GroupPairDtoComparer.cs new file mode 100644 index 0000000..c1dde50 --- /dev/null +++ b/MareSynchronosAPI/Data/Comparer/GroupPairDtoComparer.cs @@ -0,0 +1,20 @@ +using MareSynchronos.API.Dto.Group; + +namespace MareSynchronos.API.Data.Comparer; + +public class GroupPairDtoComparer : IEqualityComparer +{ + public static GroupPairDtoComparer Instance => _instance; + private static GroupPairDtoComparer _instance = new(); + private GroupPairDtoComparer() { } + public bool Equals(GroupPairDto? x, GroupPairDto? y) + { + if (x == null || y == null) return false; + return x.GID.Equals(y.GID, StringComparison.Ordinal) && x.UID.Equals(y.UID, StringComparison.Ordinal); + } + + public int GetHashCode(GroupPairDto obj) + { + return HashCode.Combine(obj.Group.GID.GetHashCode(), obj.User.UID.GetHashCode()); + } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Comparer/UserDataComparer.cs b/MareSynchronosAPI/Data/Comparer/UserDataComparer.cs new file mode 100644 index 0000000..68aa227 --- /dev/null +++ b/MareSynchronosAPI/Data/Comparer/UserDataComparer.cs @@ -0,0 +1,20 @@ +namespace MareSynchronos.API.Data.Comparer; + +public class UserDataComparer : IEqualityComparer +{ + public static UserDataComparer Instance => _instance; + private static UserDataComparer _instance = new(); + + private UserDataComparer() { } + + public bool Equals(UserData? x, UserData? y) + { + if (x == null || y == null) return false; + return x.UID.Equals(y.UID, StringComparison.Ordinal); + } + + public int GetHashCode(UserData obj) + { + return obj.UID.GetHashCode(); + } +} diff --git a/MareSynchronosAPI/Data/Comparer/UserDtoComparer.cs b/MareSynchronosAPI/Data/Comparer/UserDtoComparer.cs new file mode 100644 index 0000000..9c8451c --- /dev/null +++ b/MareSynchronosAPI/Data/Comparer/UserDtoComparer.cs @@ -0,0 +1,20 @@ +using MareSynchronos.API.Dto.User; + +namespace MareSynchronos.API.Data.Comparer; + +public class UserDtoComparer : IEqualityComparer +{ + public static UserDtoComparer Instance => _instance; + private static UserDtoComparer _instance = new(); + private UserDtoComparer() { } + public bool Equals(UserDto? x, UserDto? y) + { + if (x == null || y == null) return false; + return x.User.UID.Equals(y.User.UID, StringComparison.Ordinal); + } + + public int GetHashCode(UserDto obj) + { + return obj.User.UID.GetHashCode(); + } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Enum/GroupPermissions.cs b/MareSynchronosAPI/Data/Enum/GroupPermissions.cs new file mode 100644 index 0000000..cccc712 --- /dev/null +++ b/MareSynchronosAPI/Data/Enum/GroupPermissions.cs @@ -0,0 +1,11 @@ +namespace MareSynchronos.API.Data.Enum; + +[Flags] +public enum GroupPermissions +{ + NoneSet = 0x0, + DisableAnimations = 0x1, + DisableSounds = 0x2, + DisableInvites = 0x4, + DisableVFX = 0x8, +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Enum/GroupUserInfo.cs b/MareSynchronosAPI/Data/Enum/GroupUserInfo.cs new file mode 100644 index 0000000..ed1b3bb --- /dev/null +++ b/MareSynchronosAPI/Data/Enum/GroupUserInfo.cs @@ -0,0 +1,9 @@ +namespace MareSynchronos.API.Data.Enum; + +[Flags] +public enum GroupUserInfo +{ + None = 0x0, + IsModerator = 0x2, + IsPinned = 0x4 +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Enum/GroupUserPermissions.cs b/MareSynchronosAPI/Data/Enum/GroupUserPermissions.cs new file mode 100644 index 0000000..efa3bfd --- /dev/null +++ b/MareSynchronosAPI/Data/Enum/GroupUserPermissions.cs @@ -0,0 +1,11 @@ +namespace MareSynchronos.API.Data.Enum; + +[Flags] +public enum GroupUserPermissions +{ + NoneSet = 0x0, + Paused = 0x1, + DisableAnimations = 0x2, + DisableSounds = 0x4, + DisableVFX = 0x8, +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Enum/MessageSeverity.cs b/MareSynchronosAPI/Data/Enum/MessageSeverity.cs new file mode 100644 index 0000000..b0ace02 --- /dev/null +++ b/MareSynchronosAPI/Data/Enum/MessageSeverity.cs @@ -0,0 +1,8 @@ +namespace MareSynchronos.API.Data.Enum; + +public enum MessageSeverity +{ + Information, + Warning, + Error +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Enum/ObjectKind.cs b/MareSynchronosAPI/Data/Enum/ObjectKind.cs new file mode 100644 index 0000000..47396c4 --- /dev/null +++ b/MareSynchronosAPI/Data/Enum/ObjectKind.cs @@ -0,0 +1,9 @@ +namespace MareSynchronos.API.Data.Enum; + +public enum ObjectKind +{ + Player = 0, + MinionOrMount = 1, + Companion = 2, + Pet = 3, +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Enum/UserPermissions.cs b/MareSynchronosAPI/Data/Enum/UserPermissions.cs new file mode 100644 index 0000000..8cc472b --- /dev/null +++ b/MareSynchronosAPI/Data/Enum/UserPermissions.cs @@ -0,0 +1,12 @@ +namespace MareSynchronos.API.Data.Enum; + +[Flags] +public enum UserPermissions +{ + NoneSet = 0, + Paired = 1, + Paused = 2, + DisableAnimations = 4, + DisableSounds = 8, + DisableVFX = 16, +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Extensions/GroupPermissionsExtensions.cs b/MareSynchronosAPI/Data/Extensions/GroupPermissionsExtensions.cs new file mode 100644 index 0000000..ca2236d --- /dev/null +++ b/MareSynchronosAPI/Data/Extensions/GroupPermissionsExtensions.cs @@ -0,0 +1,50 @@ +using MareSynchronos.API.Data.Enum; + +namespace MareSynchronos.API.Data.Extensions; + +public static class GroupPermissionsExtensions +{ + public static bool IsDisableAnimations(this GroupPermissions perm) + { + return perm.HasFlag(GroupPermissions.DisableAnimations); + } + + public static bool IsDisableSounds(this GroupPermissions perm) + { + return perm.HasFlag(GroupPermissions.DisableSounds); + } + + public static bool IsDisableInvites(this GroupPermissions perm) + { + return perm.HasFlag(GroupPermissions.DisableInvites); + } + + public static bool IsDisableVFX(this GroupPermissions perm) + { + return perm.HasFlag(GroupPermissions.DisableVFX); + } + + public static void SetDisableAnimations(this ref GroupPermissions perm, bool set) + { + if (set) perm |= GroupPermissions.DisableAnimations; + else perm &= ~GroupPermissions.DisableAnimations; + } + + public static void SetDisableSounds(this ref GroupPermissions perm, bool set) + { + if (set) perm |= GroupPermissions.DisableSounds; + else perm &= ~GroupPermissions.DisableSounds; + } + + public static void SetDisableInvites(this ref GroupPermissions perm, bool set) + { + if (set) perm |= GroupPermissions.DisableInvites; + else perm &= ~GroupPermissions.DisableInvites; + } + + public static void SetDisableVFX(this ref GroupPermissions perm, bool set) + { + if (set) perm |= GroupPermissions.DisableVFX; + else perm &= ~GroupPermissions.DisableVFX; + } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Extensions/GroupUserInfoExtensions.cs b/MareSynchronosAPI/Data/Extensions/GroupUserInfoExtensions.cs new file mode 100644 index 0000000..a4608e8 --- /dev/null +++ b/MareSynchronosAPI/Data/Extensions/GroupUserInfoExtensions.cs @@ -0,0 +1,28 @@ +using MareSynchronos.API.Data.Enum; + +namespace MareSynchronos.API.Data.Extensions; + +public static class GroupUserInfoExtensions +{ + public static bool IsModerator(this GroupUserInfo info) + { + return info.HasFlag(GroupUserInfo.IsModerator); + } + + public static bool IsPinned(this GroupUserInfo info) + { + return info.HasFlag(GroupUserInfo.IsPinned); + } + + public static void SetModerator(this ref GroupUserInfo info, bool isModerator) + { + if (isModerator) info |= GroupUserInfo.IsModerator; + else info &= ~GroupUserInfo.IsModerator; + } + + public static void SetPinned(this ref GroupUserInfo info, bool isPinned) + { + if (isPinned) info |= GroupUserInfo.IsPinned; + else info &= ~GroupUserInfo.IsPinned; + } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Extensions/GroupUserPermissionsExtensions.cs b/MareSynchronosAPI/Data/Extensions/GroupUserPermissionsExtensions.cs new file mode 100644 index 0000000..b8b2702 --- /dev/null +++ b/MareSynchronosAPI/Data/Extensions/GroupUserPermissionsExtensions.cs @@ -0,0 +1,50 @@ +using MareSynchronos.API.Data.Enum; + +namespace MareSynchronos.API.Data.Extensions; + +public static class GroupUserPermissionsExtensions +{ + public static bool IsDisableAnimations(this GroupUserPermissions perm) + { + return perm.HasFlag(GroupUserPermissions.DisableAnimations); + } + + public static bool IsDisableSounds(this GroupUserPermissions perm) + { + return perm.HasFlag(GroupUserPermissions.DisableSounds); + } + + public static bool IsPaused(this GroupUserPermissions perm) + { + return perm.HasFlag(GroupUserPermissions.Paused); + } + + public static bool IsDisableVFX(this GroupUserPermissions perm) + { + return perm.HasFlag(GroupUserPermissions.DisableVFX); + } + + public static void SetDisableAnimations(this ref GroupUserPermissions perm, bool set) + { + if (set) perm |= GroupUserPermissions.DisableAnimations; + else perm &= ~GroupUserPermissions.DisableAnimations; + } + + public static void SetDisableSounds(this ref GroupUserPermissions perm, bool set) + { + if (set) perm |= GroupUserPermissions.DisableSounds; + else perm &= ~GroupUserPermissions.DisableSounds; + } + + public static void SetPaused(this ref GroupUserPermissions perm, bool set) + { + if (set) perm |= GroupUserPermissions.Paused; + else perm &= ~GroupUserPermissions.Paused; + } + + public static void SetDisableVFX(this ref GroupUserPermissions perm, bool set) + { + if (set) perm |= GroupUserPermissions.DisableVFX; + else perm &= ~GroupUserPermissions.DisableVFX; + } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Extensions/UserPermissionsExtensions.cs b/MareSynchronosAPI/Data/Extensions/UserPermissionsExtensions.cs new file mode 100644 index 0000000..2b80601 --- /dev/null +++ b/MareSynchronosAPI/Data/Extensions/UserPermissionsExtensions.cs @@ -0,0 +1,61 @@ +using MareSynchronos.API.Data.Enum; + +namespace MareSynchronos.API.Data.Extensions; + +public static class UserPermissionsExtensions +{ + public static bool IsPaired(this UserPermissions perm) + { + return perm.HasFlag(UserPermissions.Paired); + } + + public static bool IsPaused(this UserPermissions perm) + { + return perm.HasFlag(UserPermissions.Paused); + } + + public static bool IsDisableAnimations(this UserPermissions perm) + { + return perm.HasFlag(UserPermissions.DisableAnimations); + } + + public static bool IsDisableSounds(this UserPermissions perm) + { + return perm.HasFlag(UserPermissions.DisableSounds); + } + + public static bool IsDisableVFX(this UserPermissions perm) + { + return perm.HasFlag(UserPermissions.DisableVFX); + } + + public static void SetPaired(this ref UserPermissions perm, bool paired) + { + if (paired) perm |= UserPermissions.Paired; + else perm &= ~UserPermissions.Paired; + } + + public static void SetPaused(this ref UserPermissions perm, bool paused) + { + if (paused) perm |= UserPermissions.Paused; + else perm &= ~UserPermissions.Paused; + } + + public static void SetDisableAnimations(this ref UserPermissions perm, bool set) + { + if (set) perm |= UserPermissions.DisableAnimations; + else perm &= ~UserPermissions.DisableAnimations; + } + + public static void SetDisableSounds(this ref UserPermissions perm, bool set) + { + if (set) perm |= UserPermissions.DisableSounds; + else perm &= ~UserPermissions.DisableSounds; + } + + public static void SetDisableVFX(this ref UserPermissions perm, bool set) + { + if (set) perm |= UserPermissions.DisableVFX; + else perm &= ~UserPermissions.DisableVFX; + } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/FileReplacementData.cs b/MareSynchronosAPI/Data/FileReplacementData.cs new file mode 100644 index 0000000..82161a5 --- /dev/null +++ b/MareSynchronosAPI/Data/FileReplacementData.cs @@ -0,0 +1,30 @@ +using MessagePack; +using System.Text.Json.Serialization; +using System.Text.Json; +using System.Text; +using System.Security.Cryptography; + + +namespace MareSynchronos.API.Data; + +[MessagePackObject(keyAsPropertyName: true)] +public class FileReplacementData +{ + public FileReplacementData() + { + DataHash = new(() => + { + var json = JsonSerializer.Serialize(this); +#pragma warning disable SYSLIB0021 // Type or member is obsolete + using SHA256CryptoServiceProvider cryptoProvider = new(); +#pragma warning restore SYSLIB0021 // Type or member is obsolete + return BitConverter.ToString(cryptoProvider.ComputeHash(Encoding.UTF8.GetBytes(json))).Replace("-", "", StringComparison.Ordinal); + }); + } + + [JsonIgnore] + public Lazy DataHash { get; } + public string[] GamePaths { get; set; } = Array.Empty(); + public string Hash { get; set; } = string.Empty; + public string FileSwapPath { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/GroupData.cs b/MareSynchronosAPI/Data/GroupData.cs new file mode 100644 index 0000000..877bb44 --- /dev/null +++ b/MareSynchronosAPI/Data/GroupData.cs @@ -0,0 +1,10 @@ +using MessagePack; + +namespace MareSynchronos.API.Data; + +[MessagePackObject(keyAsPropertyName: true)] +public record GroupData(string GID, string? Alias = null) +{ + [IgnoreMember] + public string AliasOrGID => string.IsNullOrWhiteSpace(Alias) ? GID : Alias; +} diff --git a/MareSynchronosAPI/Data/SignedChatMessage.cs b/MareSynchronosAPI/Data/SignedChatMessage.cs new file mode 100644 index 0000000..edfd8cc --- /dev/null +++ b/MareSynchronosAPI/Data/SignedChatMessage.cs @@ -0,0 +1,14 @@ +using MessagePack; + +namespace MareSynchronos.API.Data; + +[MessagePackObject(keyAsPropertyName: true)] +public record SignedChatMessage(ChatMessage Message, UserData Sender) : ChatMessage(Message) +{ + // Sender and timestamp are set by the server + public UserData Sender { get; set; } = Sender; + public long Timestamp { get; set; } = 0; + // Signature is generated by the server as SHA256(Sender.UID | Timestamp | Destination | Message) + // Where Destination is either the receiver's UID, or the group GID + public string Signature { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/UserData.cs b/MareSynchronosAPI/Data/UserData.cs new file mode 100644 index 0000000..3bc74cf --- /dev/null +++ b/MareSynchronosAPI/Data/UserData.cs @@ -0,0 +1,10 @@ +using MessagePack; + +namespace MareSynchronos.API.Data; + +[MessagePackObject(keyAsPropertyName: true)] +public record UserData(string UID, string? Alias = null) +{ + [IgnoreMember] + public string AliasOrUID => string.IsNullOrWhiteSpace(Alias) ? UID : Alias; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Account/RegisterReplyDto.cs b/MareSynchronosAPI/Dto/Account/RegisterReplyDto.cs new file mode 100644 index 0000000..ce3f741 --- /dev/null +++ b/MareSynchronosAPI/Dto/Account/RegisterReplyDto.cs @@ -0,0 +1,12 @@ +using MessagePack; + +namespace MareSynchronos.API.Dto.Account; + +[MessagePackObject(keyAsPropertyName: true)] +public record RegisterReplyDto +{ + public bool Success { get; set; } = false; + public string ErrorMessage { get; set; } = string.Empty; + public string UID { get; set; } = string.Empty; + public string SecretKey { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Account/RegisterReplyV2Dto.cs b/MareSynchronosAPI/Dto/Account/RegisterReplyV2Dto.cs new file mode 100644 index 0000000..59f7fe5 --- /dev/null +++ b/MareSynchronosAPI/Dto/Account/RegisterReplyV2Dto.cs @@ -0,0 +1,11 @@ +using MessagePack; + +namespace MareSynchronos.API.Dto.Account; + +[MessagePackObject(keyAsPropertyName: true)] +public record RegisterReplyV2Dto +{ + public bool Success { get; set; } = false; + public string ErrorMessage { get; set; } = string.Empty; + public string UID { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/AuthReplyDto.cs b/MareSynchronosAPI/Dto/AuthReplyDto.cs new file mode 100644 index 0000000..d3033fd --- /dev/null +++ b/MareSynchronosAPI/Dto/AuthReplyDto.cs @@ -0,0 +1,11 @@ +using MareSynchronos.API.Data; +using MessagePack; + +namespace MareSynchronos.API.Dto; + +[MessagePackObject(keyAsPropertyName: true)] +public record AuthReplyDto +{ + public string Token { get; set; } = string.Empty; + public string? WellKnown { get; set; } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/CharaData/AccessTypeDto.cs b/MareSynchronosAPI/Dto/CharaData/AccessTypeDto.cs new file mode 100644 index 0000000..9c53eaa --- /dev/null +++ b/MareSynchronosAPI/Dto/CharaData/AccessTypeDto.cs @@ -0,0 +1,9 @@ +namespace MareSynchronos.API.Dto.CharaData; + +public enum AccessTypeDto +{ + Individuals, + ClosePairs, + AllPairs, + Public +} diff --git a/MareSynchronosAPI/Dto/CharaData/CharaDataDownloadDto.cs b/MareSynchronosAPI/Dto/CharaData/CharaDataDownloadDto.cs new file mode 100644 index 0000000..5d450b8 --- /dev/null +++ b/MareSynchronosAPI/Dto/CharaData/CharaDataDownloadDto.cs @@ -0,0 +1,14 @@ +using MareSynchronos.API.Data; +using MessagePack; + +namespace MareSynchronos.API.Dto.CharaData; + +[MessagePackObject(keyAsPropertyName: true)] +public record CharaDataDownloadDto(string Id, UserData Uploader) : CharaDataDto(Id, Uploader) +{ + public string GlamourerData { get; init; } = string.Empty; + public string CustomizeData { get; init; } = string.Empty; + public string ManipulationData { get; set; } = string.Empty; + public List FileGamePaths { get; init; } = []; + public List FileSwaps { get; init; } = []; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/CharaData/CharaDataDto.cs b/MareSynchronosAPI/Dto/CharaData/CharaDataDto.cs new file mode 100644 index 0000000..dbf4a26 --- /dev/null +++ b/MareSynchronosAPI/Dto/CharaData/CharaDataDto.cs @@ -0,0 +1,9 @@ +using MareSynchronos.API.Data; + +namespace MareSynchronos.API.Dto.CharaData; + +public record CharaDataDto(string Id, UserData Uploader) +{ + public string Description { get; init; } = string.Empty; + public DateTime UpdatedDate { get; init; } +} diff --git a/MareSynchronosAPI/Dto/CharaData/CharaDataFullDto.cs b/MareSynchronosAPI/Dto/CharaData/CharaDataFullDto.cs new file mode 100644 index 0000000..d8b4016 --- /dev/null +++ b/MareSynchronosAPI/Dto/CharaData/CharaDataFullDto.cs @@ -0,0 +1,88 @@ +using MareSynchronos.API.Data; +using MessagePack; + +namespace MareSynchronos.API.Dto.CharaData; + +[MessagePackObject(keyAsPropertyName: true)] +public record CharaDataFullDto(string Id, UserData Uploader) : CharaDataDto(Id, Uploader) +{ + public DateTime CreatedDate { get; init; } + public DateTime ExpiryDate { get; set; } + public string GlamourerData { get; set; } = string.Empty; + public string CustomizeData { get; set; } = string.Empty; + public string ManipulationData { get; set; } = string.Empty; + public int DownloadCount { get; set; } = 0; + public List AllowedUsers { get; set; } = []; + public List AllowedGroups { get; set; } = []; + public List FileGamePaths { get; set; } = []; + public List FileSwaps { get; set; } = []; + public List OriginalFiles { get; set; } = []; + public AccessTypeDto AccessType { get; set; } + public ShareTypeDto ShareType { get; set; } + public List PoseData { get; set; } = []; +} + +[MessagePackObject(keyAsPropertyName: true)] +public record GamePathEntry(string HashOrFileSwap, string GamePath); + +[MessagePackObject(keyAsPropertyName: true)] +public record PoseEntry(long? Id) +{ + public string? Description { get; set; } = string.Empty; + public string? PoseData { get; set; } = string.Empty; + public WorldData? WorldData { get; set; } +} + +[MessagePackObject] +public record struct WorldData +{ + [Key(0)] public LocationInfo LocationInfo { get; set; } + [Key(1)] public float PositionX { get; set; } + [Key(2)] public float PositionY { get; set; } + [Key(3)] public float PositionZ { get; set; } + [Key(4)] public float RotationX { get; set; } + [Key(5)] public float RotationY { get; set; } + [Key(6)] public float RotationZ { get; set; } + [Key(7)] public float RotationW { get; set; } + [Key(8)] public float ScaleX { get; set; } + [Key(9)] public float ScaleY { get; set; } + [Key(10)] public float ScaleZ { get; set; } +} + +[MessagePackObject] +public record struct LocationInfo +{ + [Key(0)] public uint ServerId { get; set; } + [Key(1)] public uint MapId { get; set; } + [Key(2)] public uint TerritoryId { get; set; } + [Key(3)] public uint DivisionId { get; set; } + [Key(4)] public uint WardId { get; set; } + [Key(5)] public uint HouseId { get; set; } + [Key(6)] public uint RoomId { get; set; } +} + +[MessagePackObject] +public record struct PoseData +{ + [Key(0)] public bool IsDelta { get; set; } + [Key(1)] public Dictionary Bones { get; set; } + [Key(2)] public Dictionary MainHand { get; set; } + [Key(3)] public Dictionary OffHand { get; set; } + [Key(4)] public BoneData ModelDifference { get; set; } +} + +[MessagePackObject] +public record struct BoneData +{ + [Key(0)] public bool Exists { get; set; } + [Key(1)] public float PositionX { get; set; } + [Key(2)] public float PositionY { get; set; } + [Key(3)] public float PositionZ { get; set; } + [Key(4)] public float RotationX { get; set; } + [Key(5)] public float RotationY { get; set; } + [Key(6)] public float RotationZ { get; set; } + [Key(7)] public float RotationW { get; set; } + [Key(8)] public float ScaleX { get; set; } + [Key(9)] public float ScaleY { get; set; } + [Key(10)] public float ScaleZ { get; set; } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/CharaData/CharaDataMetaInfoDto.cs b/MareSynchronosAPI/Dto/CharaData/CharaDataMetaInfoDto.cs new file mode 100644 index 0000000..7afb6b2 --- /dev/null +++ b/MareSynchronosAPI/Dto/CharaData/CharaDataMetaInfoDto.cs @@ -0,0 +1,11 @@ +using MareSynchronos.API.Data; +using MessagePack; + +namespace MareSynchronos.API.Dto.CharaData; + +[MessagePackObject(keyAsPropertyName: true)] +public record CharaDataMetaInfoDto(string Id, UserData Uploader) : CharaDataDto(Id, Uploader) +{ + public bool CanBeDownloaded { get; init; } + public List PoseData { get; set; } = []; +} diff --git a/MareSynchronosAPI/Dto/CharaData/CharaDataUpdateDto.cs b/MareSynchronosAPI/Dto/CharaData/CharaDataUpdateDto.cs new file mode 100644 index 0000000..30d1348 --- /dev/null +++ b/MareSynchronosAPI/Dto/CharaData/CharaDataUpdateDto.cs @@ -0,0 +1,20 @@ +using MessagePack; + +namespace MareSynchronos.API.Dto.CharaData; + +[MessagePackObject(keyAsPropertyName: true)] +public record CharaDataUpdateDto(string Id) +{ + public string? Description { get; set; } + public DateTime? ExpiryDate { get; set; } + public string? GlamourerData { get; set; } + public string? CustomizeData { get; set; } + public string? ManipulationData { get; set; } + public List? AllowedUsers { get; set; } + public List? AllowedGroups { get; set; } + public List? FileGamePaths { get; set; } + public List? FileSwaps { get; set; } + public AccessTypeDto? AccessType { get; set; } + public ShareTypeDto? ShareType { get; set; } + public List? Poses { get; set; } +} diff --git a/MareSynchronosAPI/Dto/CharaData/ShareTypeDto.cs b/MareSynchronosAPI/Dto/CharaData/ShareTypeDto.cs new file mode 100644 index 0000000..ed55f94 --- /dev/null +++ b/MareSynchronosAPI/Dto/CharaData/ShareTypeDto.cs @@ -0,0 +1,7 @@ +namespace MareSynchronos.API.Dto.CharaData; + +public enum ShareTypeDto +{ + Private, + Shared +} diff --git a/MareSynchronosAPI/Dto/Chat/GroupChatMsgDto.cs b/MareSynchronosAPI/Dto/Chat/GroupChatMsgDto.cs new file mode 100644 index 0000000..c946c00 --- /dev/null +++ b/MareSynchronosAPI/Dto/Chat/GroupChatMsgDto.cs @@ -0,0 +1,13 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Dto.Group; +using MareSynchronos.API.Dto.User; +using MessagePack; + +namespace MareSynchronos.API.Dto.Chat; + +[MessagePackObject(keyAsPropertyName: true)] +public record GroupChatMsgDto(GroupDto Group, SignedChatMessage Message) +{ + public GroupDto Group = Group; + public SignedChatMessage Message = Message; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Chat/UserChatMsgDto.cs b/MareSynchronosAPI/Dto/Chat/UserChatMsgDto.cs new file mode 100644 index 0000000..d82855b --- /dev/null +++ b/MareSynchronosAPI/Dto/Chat/UserChatMsgDto.cs @@ -0,0 +1,11 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Dto.User; +using MessagePack; + +namespace MareSynchronos.API.Dto.Chat; + +[MessagePackObject(keyAsPropertyName: true)] +public record UserChatMsgDto(SignedChatMessage Message) +{ + public SignedChatMessage Message = Message; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/ConnectionDto.cs b/MareSynchronosAPI/Dto/ConnectionDto.cs new file mode 100644 index 0000000..04c818e --- /dev/null +++ b/MareSynchronosAPI/Dto/ConnectionDto.cs @@ -0,0 +1,25 @@ +using MareSynchronos.API.Data; +using MessagePack; + +namespace MareSynchronos.API.Dto; + +[MessagePackObject(keyAsPropertyName: true)] +public record ConnectionDto(UserData User) +{ + public Version CurrentClientVersion { get; set; } = new(0, 0, 0); + public int ServerVersion { get; set; } + public bool IsAdmin { get; set; } + public bool IsModerator { get; set; } + public ServerInfo ServerInfo { get; set; } = new(); +} + +[MessagePackObject(keyAsPropertyName: true)] +public record ServerInfo +{ + public string ShardName { get; set; } = string.Empty; + public int MaxGroupUserCount { get; set; } + public int MaxGroupsCreatedByUser { get; set; } + public int MaxGroupsJoinedByUser { get; set; } + public Uri FileServerAddress { get; set; } = new Uri("http://nonemptyuri"); + public int MaxCharaData { get; set; } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Files/DownloadFileDto.cs b/MareSynchronosAPI/Dto/Files/DownloadFileDto.cs new file mode 100644 index 0000000..d2ffe05 --- /dev/null +++ b/MareSynchronosAPI/Dto/Files/DownloadFileDto.cs @@ -0,0 +1,14 @@ +using MessagePack; + +namespace MareSynchronos.API.Dto.Files; + +[MessagePackObject(keyAsPropertyName: true)] +public record DownloadFileDto : ITransferFileDto +{ + public bool FileExists { get; set; } = true; + public string Hash { get; set; } = string.Empty; + public string Url { get; set; } = string.Empty; + public long Size { get; set; } = 0; + public bool IsForbidden { get; set; } = false; + public string ForbiddenBy { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Files/FilesSendDto.cs b/MareSynchronosAPI/Dto/Files/FilesSendDto.cs new file mode 100644 index 0000000..b7a6735 --- /dev/null +++ b/MareSynchronosAPI/Dto/Files/FilesSendDto.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MareSynchronos.API.Dto.Files; + +public class FilesSendDto +{ + public List FileHashes { get; set; } = new(); + public List UIDs { get; set; } = new(); +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Files/ITransferFileDto.cs b/MareSynchronosAPI/Dto/Files/ITransferFileDto.cs new file mode 100644 index 0000000..fb20e5a --- /dev/null +++ b/MareSynchronosAPI/Dto/Files/ITransferFileDto.cs @@ -0,0 +1,8 @@ +namespace MareSynchronos.API.Dto.Files; + +public interface ITransferFileDto +{ + string Hash { get; set; } + bool IsForbidden { get; set; } + string ForbiddenBy { get; set; } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Files/UploadFileDto.cs b/MareSynchronosAPI/Dto/Files/UploadFileDto.cs new file mode 100644 index 0000000..f10b27d --- /dev/null +++ b/MareSynchronosAPI/Dto/Files/UploadFileDto.cs @@ -0,0 +1,11 @@ +using MessagePack; + +namespace MareSynchronos.API.Dto.Files; + +[MessagePackObject(keyAsPropertyName: true)] +public record UploadFileDto : ITransferFileDto +{ + public string Hash { get; set; } = string.Empty; + public bool IsForbidden { get; set; } = false; + public string ForbiddenBy { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Group/BannedGroupUserDto.cs b/MareSynchronosAPI/Dto/Group/BannedGroupUserDto.cs new file mode 100644 index 0000000..36ed1f9 --- /dev/null +++ b/MareSynchronosAPI/Dto/Group/BannedGroupUserDto.cs @@ -0,0 +1,19 @@ +using MareSynchronos.API.Data; +using MessagePack; + +namespace MareSynchronos.API.Dto.Group; + +[MessagePackObject(keyAsPropertyName: true)] +public record BannedGroupUserDto : GroupPairDto +{ + public BannedGroupUserDto(GroupData group, UserData user, string reason, DateTime bannedOn, string bannedBy) : base(group, user) + { + Reason = reason; + BannedOn = bannedOn; + BannedBy = bannedBy; + } + + public string Reason { get; set; } + public DateTime BannedOn { get; set; } + public string BannedBy { get; set; } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Group/GroupDto.cs b/MareSynchronosAPI/Dto/Group/GroupDto.cs new file mode 100644 index 0000000..5b5b71a --- /dev/null +++ b/MareSynchronosAPI/Dto/Group/GroupDto.cs @@ -0,0 +1,13 @@ +using MareSynchronos.API.Data; +using MessagePack; + +namespace MareSynchronos.API.Dto.Group; + +[MessagePackObject(keyAsPropertyName: true)] +public record GroupDto(GroupData Group) +{ + public GroupData Group { get; set; } = Group; + public string GID => Group.GID; + public string? GroupAlias => Group.Alias; + public string GroupAliasOrGID => Group.AliasOrGID; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Group/GroupFullInfoDto.cs b/MareSynchronosAPI/Dto/Group/GroupFullInfoDto.cs new file mode 100644 index 0000000..0591293 --- /dev/null +++ b/MareSynchronosAPI/Dto/Group/GroupFullInfoDto.cs @@ -0,0 +1,12 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; +using MessagePack; + +namespace MareSynchronos.API.Dto.Group; + +[MessagePackObject(keyAsPropertyName: true)] +public record GroupFullInfoDto(GroupData Group, UserData Owner, GroupPermissions GroupPermissions, GroupUserPermissions GroupUserPermissions, GroupUserInfo GroupUserInfo) : GroupInfoDto(Group, Owner, GroupPermissions) +{ + public GroupUserPermissions GroupUserPermissions { get; set; } = GroupUserPermissions; + public GroupUserInfo GroupUserInfo { get; set; } = GroupUserInfo; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Group/GroupInfoDto.cs b/MareSynchronosAPI/Dto/Group/GroupInfoDto.cs new file mode 100644 index 0000000..1a5befe --- /dev/null +++ b/MareSynchronosAPI/Dto/Group/GroupInfoDto.cs @@ -0,0 +1,20 @@ +using System; +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; +using MessagePack; + +namespace MareSynchronos.API.Dto.Group; + +[MessagePackObject(keyAsPropertyName: true)] +public record GroupInfoDto(GroupData Group, UserData Owner, GroupPermissions GroupPermissions) : GroupDto(Group) +{ + public GroupPermissions GroupPermissions { get; set; } = GroupPermissions; + public UserData Owner { get; set; } = Owner; + + public string OwnerUID => Owner.UID; + public string? OwnerAlias => Owner.Alias; + public string OwnerAliasOrUID => Owner.AliasOrUID; + + public bool IsTemporary { get; set; } + public DateTime? ExpiresAt { get; set; } +} diff --git a/MareSynchronosAPI/Dto/Group/GroupPairDto.cs b/MareSynchronosAPI/Dto/Group/GroupPairDto.cs new file mode 100644 index 0000000..c2e748d --- /dev/null +++ b/MareSynchronosAPI/Dto/Group/GroupPairDto.cs @@ -0,0 +1,12 @@ +using MareSynchronos.API.Data; +using MessagePack; + +namespace MareSynchronos.API.Dto.Group; + +[MessagePackObject(keyAsPropertyName: true)] +public record GroupPairDto(GroupData Group, UserData User) : GroupDto(Group) +{ + public string UID => User.UID; + public string? UserAlias => User.Alias; + public string UserAliasOrUID => User.AliasOrUID; +} diff --git a/MareSynchronosAPI/Dto/Group/GroupPairFullInfoDto.cs b/MareSynchronosAPI/Dto/Group/GroupPairFullInfoDto.cs new file mode 100644 index 0000000..5a594df --- /dev/null +++ b/MareSynchronosAPI/Dto/Group/GroupPairFullInfoDto.cs @@ -0,0 +1,12 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; +using MessagePack; + +namespace MareSynchronos.API.Dto.Group; + +[MessagePackObject(keyAsPropertyName: true)] +public record GroupPairFullInfoDto(GroupData Group, UserData User, GroupUserInfo GroupPairStatusInfo, GroupUserPermissions GroupUserPermissions) : GroupPairDto(Group, User) +{ + public GroupUserInfo GroupPairStatusInfo { get; set; } = GroupPairStatusInfo; + public GroupUserPermissions GroupUserPermissions { get; set; } = GroupUserPermissions; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Group/GroupPairUserInfoDto.cs b/MareSynchronosAPI/Dto/Group/GroupPairUserInfoDto.cs new file mode 100644 index 0000000..8a37f68 --- /dev/null +++ b/MareSynchronosAPI/Dto/Group/GroupPairUserInfoDto.cs @@ -0,0 +1,8 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; +using MessagePack; + +namespace MareSynchronos.API.Dto.Group; + +[MessagePackObject(keyAsPropertyName: true)] +public record GroupPairUserInfoDto(GroupData Group, UserData User, GroupUserInfo GroupUserInfo) : GroupPairDto(Group, User); diff --git a/MareSynchronosAPI/Dto/Group/GroupPairUserPermissionDto.cs b/MareSynchronosAPI/Dto/Group/GroupPairUserPermissionDto.cs new file mode 100644 index 0000000..d1f152f --- /dev/null +++ b/MareSynchronosAPI/Dto/Group/GroupPairUserPermissionDto.cs @@ -0,0 +1,8 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; +using MessagePack; + +namespace MareSynchronos.API.Dto.Group; + +[MessagePackObject(keyAsPropertyName: true)] +public record GroupPairUserPermissionDto(GroupData Group, UserData User, GroupUserPermissions GroupPairPermissions) : GroupPairDto(Group, User); diff --git a/MareSynchronosAPI/Dto/Group/GroupPasswordDto.cs b/MareSynchronosAPI/Dto/Group/GroupPasswordDto.cs new file mode 100644 index 0000000..6af9598 --- /dev/null +++ b/MareSynchronosAPI/Dto/Group/GroupPasswordDto.cs @@ -0,0 +1,12 @@ +using System; +using MareSynchronos.API.Data; +using MessagePack; + +namespace MareSynchronos.API.Dto.Group; + +[MessagePackObject(keyAsPropertyName: true)] +public record GroupPasswordDto(GroupData Group, string Password) : GroupDto(Group) +{ + public bool IsTemporary { get; set; } + public DateTime? ExpiresAt { get; set; } +} diff --git a/MareSynchronosAPI/Dto/Group/GroupPermissionDto.cs b/MareSynchronosAPI/Dto/Group/GroupPermissionDto.cs new file mode 100644 index 0000000..70dbf80 --- /dev/null +++ b/MareSynchronosAPI/Dto/Group/GroupPermissionDto.cs @@ -0,0 +1,8 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; +using MessagePack; + +namespace MareSynchronos.API.Dto.Group; + +[MessagePackObject(keyAsPropertyName: true)] +public record GroupPermissionDto(GroupData Group, GroupPermissions Permissions) : GroupDto(Group); diff --git a/MareSynchronosAPI/Dto/SystemInfoDto.cs b/MareSynchronosAPI/Dto/SystemInfoDto.cs new file mode 100644 index 0000000..eb84f1a --- /dev/null +++ b/MareSynchronosAPI/Dto/SystemInfoDto.cs @@ -0,0 +1,9 @@ +using MessagePack; + +namespace MareSynchronos.API.Dto; + +[MessagePackObject(keyAsPropertyName: true)] +public record SystemInfoDto +{ + public int OnlineUsers { get; set; } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/User/OnlineUserCharaDataDto.cs b/MareSynchronosAPI/Dto/User/OnlineUserCharaDataDto.cs new file mode 100644 index 0000000..a4233d5 --- /dev/null +++ b/MareSynchronosAPI/Dto/User/OnlineUserCharaDataDto.cs @@ -0,0 +1,7 @@ +using MareSynchronos.API.Data; +using MessagePack; + +namespace MareSynchronos.API.Dto.User; + +[MessagePackObject(keyAsPropertyName: true)] +public record OnlineUserCharaDataDto(UserData User, CharacterData CharaData) : UserDto(User); \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/User/OnlineUserIdentDto.cs b/MareSynchronosAPI/Dto/User/OnlineUserIdentDto.cs new file mode 100644 index 0000000..dbc7129 --- /dev/null +++ b/MareSynchronosAPI/Dto/User/OnlineUserIdentDto.cs @@ -0,0 +1,7 @@ +using MareSynchronos.API.Data; +using MessagePack; + +namespace MareSynchronos.API.Dto.User; + +[MessagePackObject(keyAsPropertyName: true)] +public record OnlineUserIdentDto(UserData User, string Ident) : UserDto(User); \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/User/UserCharaDataMessageDto.cs b/MareSynchronosAPI/Dto/User/UserCharaDataMessageDto.cs new file mode 100644 index 0000000..1b33590 --- /dev/null +++ b/MareSynchronosAPI/Dto/User/UserCharaDataMessageDto.cs @@ -0,0 +1,7 @@ +using MareSynchronos.API.Data; +using MessagePack; + +namespace MareSynchronos.API.Dto.User; + +[MessagePackObject(keyAsPropertyName: true)] +public record UserCharaDataMessageDto(List Recipients, CharacterData CharaData); \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/User/UserDto.cs b/MareSynchronosAPI/Dto/User/UserDto.cs new file mode 100644 index 0000000..ce105bf --- /dev/null +++ b/MareSynchronosAPI/Dto/User/UserDto.cs @@ -0,0 +1,7 @@ +using MareSynchronos.API.Data; +using MessagePack; + +namespace MareSynchronos.API.Dto.User; + +[MessagePackObject(keyAsPropertyName: true)] +public record UserDto(UserData User); \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/User/UserPairDto.cs b/MareSynchronosAPI/Dto/User/UserPairDto.cs new file mode 100644 index 0000000..3d92ad6 --- /dev/null +++ b/MareSynchronosAPI/Dto/User/UserPairDto.cs @@ -0,0 +1,12 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; +using MessagePack; + +namespace MareSynchronos.API.Dto.User; + +[MessagePackObject(keyAsPropertyName: true)] +public record UserPairDto(UserData User, UserPermissions OwnPermissions, UserPermissions OtherPermissions) : UserDto(User) +{ + public UserPermissions OwnPermissions { get; set; } = OwnPermissions; + public UserPermissions OtherPermissions { get; set; } = OtherPermissions; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/User/UserPermissionsDto.cs b/MareSynchronosAPI/Dto/User/UserPermissionsDto.cs new file mode 100644 index 0000000..772040b --- /dev/null +++ b/MareSynchronosAPI/Dto/User/UserPermissionsDto.cs @@ -0,0 +1,8 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; +using MessagePack; + +namespace MareSynchronos.API.Dto.User; + +[MessagePackObject(keyAsPropertyName: true)] +public record UserPermissionsDto(UserData User, UserPermissions Permissions) : UserDto(User); \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/User/UserProfileDto.cs b/MareSynchronosAPI/Dto/User/UserProfileDto.cs new file mode 100644 index 0000000..0b103e5 --- /dev/null +++ b/MareSynchronosAPI/Dto/User/UserProfileDto.cs @@ -0,0 +1,7 @@ +using MareSynchronos.API.Data; +using MessagePack; + +namespace MareSynchronos.API.Dto.User; + +[MessagePackObject(keyAsPropertyName: true)] +public record UserProfileDto(UserData User, bool Disabled, bool? IsNSFW, string? ProfilePictureBase64, string? Description) : UserDto(User); \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/User/UserProfileReportDto.cs b/MareSynchronosAPI/Dto/User/UserProfileReportDto.cs new file mode 100644 index 0000000..02ed9ef --- /dev/null +++ b/MareSynchronosAPI/Dto/User/UserProfileReportDto.cs @@ -0,0 +1,7 @@ +using MareSynchronos.API.Data; +using MessagePack; + +namespace MareSynchronos.API.Dto.User; + +[MessagePackObject(keyAsPropertyName: true)] +public record UserProfileReportDto(UserData User, string ProfileReport) : UserDto(User); \ No newline at end of file diff --git a/MareSynchronosAPI/MareSynchronos.API.csproj b/MareSynchronosAPI/MareSynchronos.API.csproj new file mode 100644 index 0000000..057f531 --- /dev/null +++ b/MareSynchronosAPI/MareSynchronos.API.csproj @@ -0,0 +1,13 @@ + + + + net9.0 + enable + enable + + + + + + + diff --git a/MareSynchronosAPI/MareSynchronosAPI.sln b/MareSynchronosAPI/MareSynchronosAPI.sln new file mode 100644 index 0000000..ffde134 --- /dev/null +++ b/MareSynchronosAPI/MareSynchronosAPI.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32602.215 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MareSynchronos.API", "MareSynchronos.API.csproj", "{CD05EE19-802F-4490-AAD8-CAD4BF1D630D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CD05EE19-802F-4490-AAD8-CAD4BF1D630D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CD05EE19-802F-4490-AAD8-CAD4BF1D630D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CD05EE19-802F-4490-AAD8-CAD4BF1D630D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CD05EE19-802F-4490-AAD8-CAD4BF1D630D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {DFB70C71-AB27-468D-A08B-218CA79BF69D} + EndGlobalSection +EndGlobal diff --git a/MareSynchronosAPI/Routes/MareAuth.cs b/MareSynchronosAPI/Routes/MareAuth.cs new file mode 100644 index 0000000..2bef31e --- /dev/null +++ b/MareSynchronosAPI/Routes/MareAuth.cs @@ -0,0 +1,14 @@ +namespace MareSynchronos.API.Routes; + +public class MareAuth +{ + public const string Auth = "/auth"; + public const string Auth_CreateIdent = "createWithIdent"; + public const string Auth_CreateIdentV2 = "createWithIdentV2"; + public const string Auth_Register = "registerNewKey"; + public const string Auth_RegisterV2 = "registerNewKeyV2"; + public static Uri AuthFullPath(Uri baseUri) => new Uri(baseUri, Auth + "/" + Auth_CreateIdent); + public static Uri AuthV2FullPath(Uri baseUri) => new Uri(baseUri, Auth + "/" + Auth_CreateIdentV2); + public static Uri AuthRegisterFullPath(Uri baseUri) => new Uri(baseUri, Auth + "/" + Auth_Register); + public static Uri AuthRegisterV2FullPath(Uri baseUri) => new Uri(baseUri, Auth + "/" + Auth_RegisterV2); +} \ No newline at end of file diff --git a/MareSynchronosAPI/Routes/MareFiles.cs b/MareSynchronosAPI/Routes/MareFiles.cs new file mode 100644 index 0000000..a4e5f5d --- /dev/null +++ b/MareSynchronosAPI/Routes/MareFiles.cs @@ -0,0 +1,45 @@ +namespace MareSynchronos.API.Routes; + +public class MareFiles +{ + public const string Cache = "/cache"; + public const string Cache_Get = "get"; + + public const string Request = "/request"; + public const string Request_Cancel = "cancel"; + public const string Request_Check = "check"; + public const string Request_Enqueue = "enqueue"; + public const string Request_RequestFile = "file"; + + public const string ServerFiles = "/files"; + public const string ServerFiles_DeleteAll = "deleteAll"; + public const string ServerFiles_FilesSend = "filesSend"; + public const string ServerFiles_GetSizes = "getFileSizes"; + public const string ServerFiles_Upload = "upload"; + public const string ServerFiles_UploadRaw = "uploadRaw"; + public const string ServerFiles_UploadMunged = "uploadMunged"; + + public const string Distribution = "/dist"; + public const string Distribution_Get = "get"; + + public const string Main = "/main"; + public const string Main_SendReady = "sendReady"; + + public static Uri CacheGetFullPath(Uri baseUri, Guid requestId) => new(baseUri, Cache + "/" + Cache_Get + "?requestId=" + requestId.ToString()); + + public static Uri RequestCancelFullPath(Uri baseUri, Guid guid) => new Uri(baseUri, Request + "/" + Request_Cancel + "?requestId=" + guid.ToString()); + public static Uri RequestCheckQueueFullPath(Uri baseUri, Guid guid) => new Uri(baseUri, Request + "/" + Request_Check + "?requestId=" + guid.ToString()); + public static Uri RequestEnqueueFullPath(Uri baseUri) => new(baseUri, Request + "/" + Request_Enqueue); + public static Uri RequestRequestFileFullPath(Uri baseUri, string hash) => new(baseUri, Request + "/" + Request_RequestFile + "?file=" + hash); + + public static Uri ServerFilesDeleteAllFullPath(Uri baseUri) => new(baseUri, ServerFiles + "/" + ServerFiles_DeleteAll); + public static Uri ServerFilesFilesSendFullPath(Uri baseUri) => new(baseUri, ServerFiles + "/" + ServerFiles_FilesSend); + public static Uri ServerFilesGetSizesFullPath(Uri baseUri) => new(baseUri, ServerFiles + "/" + ServerFiles_GetSizes); + public static Uri ServerFilesUploadFullPath(Uri baseUri, string hash) => new(baseUri, ServerFiles + "/" + ServerFiles_Upload + "/" + hash); + public static Uri ServerFilesUploadRawFullPath(Uri baseUri, string hash) => new(baseUri, ServerFiles + "/" + ServerFiles_UploadRaw + "/" + hash); + public static Uri ServerFilesUploadMunged(Uri baseUri, string hash) => new(baseUri, ServerFiles + "/" + ServerFiles_UploadMunged + "/" + hash); + + public static Uri DistributionGetFullPath(Uri baseUri, string hash) => new(baseUri, Distribution + "/" + Distribution_Get + "?file=" + hash); + + public static Uri MainSendReadyFullPath(Uri baseUri, string uid, Guid request) => new(baseUri, Main + "/" + Main_SendReady + "/" + "?uid=" + uid + "&requestId=" + request.ToString()); +} \ No newline at end of file diff --git a/MareSynchronosAPI/SignalR/IMareHub.cs b/MareSynchronosAPI/SignalR/IMareHub.cs new file mode 100644 index 0000000..e0acff8 --- /dev/null +++ b/MareSynchronosAPI/SignalR/IMareHub.cs @@ -0,0 +1,149 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; +using MareSynchronos.API.Dto; +using MareSynchronos.API.Dto.CharaData; +using MareSynchronos.API.Dto.Chat; +using MareSynchronos.API.Dto.Group; +using MareSynchronos.API.Dto.User; + +namespace MareSynchronos.API.SignalR; + +public interface IMareHub +{ + const int ApiVersion = 1029; + const string Path = "/mare"; + + Task CheckClientHealth(); + + Task Client_DownloadReady(Guid requestId); + + Task Client_GroupChangePermissions(GroupPermissionDto groupPermission); + + Task Client_GroupChatMsg(GroupChatMsgDto groupChatMsgDto); + + Task Client_GroupDelete(GroupDto groupDto); + + Task Client_GroupPairChangePermissions(GroupPairUserPermissionDto permissionDto); + + Task Client_GroupPairChangeUserInfo(GroupPairUserInfoDto userInfo); + + Task Client_GroupPairJoined(GroupPairFullInfoDto groupPairInfoDto); + + Task Client_GroupPairLeft(GroupPairDto groupPairDto); + + Task Client_GroupSendFullInfo(GroupFullInfoDto groupInfo); + + Task Client_GroupSendInfo(GroupInfoDto groupInfo); + + Task Client_ReceiveServerMessage(MessageSeverity messageSeverity, string message); + + Task Client_UpdateSystemInfo(SystemInfoDto systemInfo); + + Task Client_UserAddClientPair(UserPairDto dto); + + Task Client_UserChatMsg(UserChatMsgDto chatMsgDto); + + Task Client_UserReceiveCharacterData(OnlineUserCharaDataDto dataDto); + + Task Client_UserReceiveUploadStatus(UserDto dto); + + Task Client_UserRemoveClientPair(UserDto dto); + + Task Client_UserSendOffline(UserDto dto); + + Task Client_UserSendOnline(OnlineUserIdentDto dto); + + Task Client_UserUpdateOtherPairPermissions(UserPermissionsDto dto); + + Task Client_UserUpdateProfile(UserDto dto); + + Task Client_UserUpdateSelfPairPermissions(UserPermissionsDto dto); + + Task Client_UserTypingState(TypingStateDto dto); + + Task Client_GposeLobbyJoin(UserData userData); + Task Client_GposeLobbyLeave(UserData userData); + Task Client_GposeLobbyPushCharacterData(CharaDataDownloadDto charaDownloadDto); + Task Client_GposeLobbyPushPoseData(UserData userData, PoseData poseData); + Task Client_GposeLobbyPushWorldData(UserData userData, WorldData worldData); + + Task GetConnectionDto(); + + Task GroupBanUser(GroupPairDto dto, string reason); + + Task GroupChangeGroupPermissionState(GroupPermissionDto dto); + + Task GroupChangeIndividualPermissionState(GroupPairUserPermissionDto dto); + + Task GroupChangeOwnership(GroupPairDto groupPair); + + Task GroupChangePassword(GroupPasswordDto groupPassword); + + Task GroupChatSendMsg(GroupDto group, ChatMessage message); + + Task GroupClear(GroupDto group); + + Task GroupCreate(string? alias); + + Task GroupCreateTemporary(DateTime expiresAtUtc); + + Task> GroupCreateTempInvite(GroupDto group, int amount); + + Task GroupDelete(GroupDto group); + + Task> GroupGetBannedUsers(GroupDto group); + + Task GroupJoin(GroupPasswordDto passwordedGroup); + + Task GroupLeave(GroupDto group); + + Task GroupRemoveUser(GroupPairDto groupPair); + + Task GroupSetUserInfo(GroupPairUserInfoDto groupPair); + + Task> GroupsGetAll(); + + Task> GroupsGetUsersInGroup(GroupDto group); + + Task GroupUnbanUser(GroupPairDto groupPair); + Task GroupPrune(GroupDto group, int days, bool execute); + + Task UserAddPair(UserDto user); + + Task UserChatSendMsg(UserDto user, ChatMessage message); + + Task UserDelete(); + + Task> UserGetOnlinePairs(); + + Task> UserGetPairedClients(); + + Task UserGetProfile(UserDto dto); + + Task UserPushData(UserCharaDataMessageDto dto); + + Task UserRemovePair(UserDto userDto); + + Task UserReportProfile(UserProfileReportDto userDto); + + Task UserSetPairPermissions(UserPermissionsDto userPermissions); + + Task UserSetProfile(UserProfileDto userDescription); + + Task UserSetTypingState(bool isTyping); + Task CharaDataCreate(); + Task CharaDataUpdate(CharaDataUpdateDto updateDto); + Task CharaDataDelete(string id); + Task CharaDataGetMetainfo(string id); + Task CharaDataDownload(string id); + Task> CharaDataGetOwn(); + Task> CharaDataGetShared(); + Task CharaDataAttemptRestore(string id); + + Task GposeLobbyCreate(); + Task> GposeLobbyJoin(string lobbyId); + Task GposeLobbyLeave(); + Task GposeLobbyPushCharacterData(CharaDataDownloadDto charaDownloadDto); + Task GposeLobbyPushPoseData(PoseData poseData); + Task GposeLobbyPushWorldData(WorldData worldData); +} diff --git a/MareSynchronosAPI/SignalR/IMareHubClient.cs b/MareSynchronosAPI/SignalR/IMareHubClient.cs new file mode 100644 index 0000000..d13cbaa --- /dev/null +++ b/MareSynchronosAPI/SignalR/IMareHubClient.cs @@ -0,0 +1,62 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; +using MareSynchronos.API.Dto; +using MareSynchronos.API.Dto.CharaData; +using MareSynchronos.API.Dto.Chat; +using MareSynchronos.API.Dto.Group; +using MareSynchronos.API.Dto.User; + +namespace MareSynchronos.API.SignalR; + +public interface IMareHubClient : IMareHub +{ + void OnDownloadReady(Action act); + + void OnGroupChangePermissions(Action act); + + void OnGroupChatMsg(Action groupChatMsgDto); + + void OnGroupDelete(Action act); + + void OnGroupPairChangePermissions(Action act); + + void OnGroupPairChangeUserInfo(Action act); + + void OnGroupPairJoined(Action act); + + void OnGroupPairLeft(Action act); + + void OnGroupSendFullInfo(Action act); + + void OnGroupSendInfo(Action act); + + void OnReceiveServerMessage(Action act); + + void OnUpdateSystemInfo(Action act); + + void OnUserAddClientPair(Action act); + + void OnUserChatMsg(Action chatMsgDto); + + void OnUserReceiveCharacterData(Action act); + + void OnUserReceiveUploadStatus(Action act); + + void OnUserRemoveClientPair(Action act); + + void OnUserSendOffline(Action act); + + void OnUserSendOnline(Action act); + + void OnUserUpdateOtherPairPermissions(Action act); + + void OnUserUpdateProfile(Action act); + + void OnUserUpdateSelfPairPermissions(Action act); + + void OnGposeLobbyJoin(Action act); + void OnGposeLobbyLeave(Action act); + void OnGposeLobbyPushCharacterData(Action act); + void OnGposeLobbyPushPoseData(Action act); + void OnGposeLobbyPushWorldData(Action act); +} \ No newline at end of file