commit 9a8ffe093f63ef67711452c861ea2822e3b694b1 Author: Zura Date: Thu Aug 21 21:24:29 2025 +0200 Add files via upload diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f0d7bf5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Mare Synchronos + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/MareSynchronosAPI/Data/CharacterData.cs b/MareSynchronosAPI/Data/CharacterData.cs new file mode 100644 index 0000000..b4b36f5 --- /dev/null +++ b/MareSynchronosAPI/Data/CharacterData.cs @@ -0,0 +1,37 @@ +using MareSynchronos.API.Data.Enum; +using MessagePack; +using System.Security.Cryptography; + +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; + +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/Comparer/GroupDataComparer.cs b/MareSynchronosAPI/Data/Comparer/GroupDataComparer.cs new file mode 100644 index 0000000..56ac851 --- /dev/null +++ b/MareSynchronosAPI/Data/Comparer/GroupDataComparer.cs @@ -0,0 +1,22 @@ +namespace MareSynchronos.API.Data.Comparer; + +public class GroupDataComparer : IEqualityComparer +{ + private static GroupDataComparer _instance = new GroupDataComparer(); + + private GroupDataComparer() + { } + + public static GroupDataComparer Instance => _instance; + + 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(); + } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Comparer/GroupDtoComparer.cs b/MareSynchronosAPI/Data/Comparer/GroupDtoComparer.cs new file mode 100644 index 0000000..c69265a --- /dev/null +++ b/MareSynchronosAPI/Data/Comparer/GroupDtoComparer.cs @@ -0,0 +1,24 @@ +using MareSynchronos.API.Dto.Group; + +namespace MareSynchronos.API.Data.Comparer; + +public class GroupDtoComparer : IEqualityComparer +{ + private static GroupDtoComparer _instance = new GroupDtoComparer(); + + private GroupDtoComparer() + { } + + public static GroupDtoComparer Instance => _instance; + + 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..a985d53 --- /dev/null +++ b/MareSynchronosAPI/Data/Comparer/GroupPairDtoComparer.cs @@ -0,0 +1,24 @@ +using MareSynchronos.API.Dto.Group; + +namespace MareSynchronos.API.Data.Comparer; + +public class GroupPairDtoComparer : IEqualityComparer +{ + private static GroupPairDtoComparer _instance = new(); + + private GroupPairDtoComparer() + { } + + public static GroupPairDtoComparer Instance => _instance; + + 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..21dbd75 --- /dev/null +++ b/MareSynchronosAPI/Data/Comparer/UserDataComparer.cs @@ -0,0 +1,22 @@ +namespace MareSynchronos.API.Data.Comparer; + +public class UserDataComparer : IEqualityComparer +{ + private static UserDataComparer _instance = new(); + + private UserDataComparer() + { } + + public static UserDataComparer Instance => _instance; + + 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(); + } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Comparer/UserDtoComparer.cs b/MareSynchronosAPI/Data/Comparer/UserDtoComparer.cs new file mode 100644 index 0000000..683d3cc --- /dev/null +++ b/MareSynchronosAPI/Data/Comparer/UserDtoComparer.cs @@ -0,0 +1,24 @@ +using MareSynchronos.API.Dto.User; + +namespace MareSynchronos.API.Data.Comparer; + +public class UserDtoComparer : IEqualityComparer +{ + private static UserDtoComparer _instance = new(); + + private UserDtoComparer() + { } + + public static UserDtoComparer Instance => _instance; + + 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/Constants.cs b/MareSynchronosAPI/Data/Constants.cs new file mode 100644 index 0000000..c773e87 --- /dev/null +++ b/MareSynchronosAPI/Data/Constants.cs @@ -0,0 +1,6 @@ +namespace MareSynchronos.API.Data; + +public class Constants +{ + public const string IndividualKeyword = "//MARE//DIRECT"; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Enum/GroupPairUserInfo.cs b/MareSynchronosAPI/Data/Enum/GroupPairUserInfo.cs new file mode 100644 index 0000000..476ac87 --- /dev/null +++ b/MareSynchronosAPI/Data/Enum/GroupPairUserInfo.cs @@ -0,0 +1,9 @@ +namespace MareSynchronos.API.Data.Enum; + +[Flags] +public enum GroupPairUserInfo +{ + None = 0x0, + IsModerator = 0x2, + IsPinned = 0x4 +} \ 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..7ab3abe --- /dev/null +++ b/MareSynchronosAPI/Data/Enum/GroupPermissions.cs @@ -0,0 +1,11 @@ +namespace MareSynchronos.API.Data.Enum; + +[Flags] +public enum GroupPermissions +{ + NoneSet = 0x0, + PreferDisableAnimations = 0x1, + PreferDisableSounds = 0x2, + DisableInvites = 0x4, + PreferDisableVFX = 0x8, +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Enum/GroupUserPreferredPermissions.cs b/MareSynchronosAPI/Data/Enum/GroupUserPreferredPermissions.cs new file mode 100644 index 0000000..4280da4 --- /dev/null +++ b/MareSynchronosAPI/Data/Enum/GroupUserPreferredPermissions.cs @@ -0,0 +1,11 @@ +namespace MareSynchronos.API.Data.Enum; + +[Flags] +public enum GroupUserPreferredPermissions +{ + NoneSet = 0x0, + Paused = 0x1, + DisableAnimations = 0x2, + DisableSounds = 0x4, + DisableVFX = 0x8, +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/Enum/IndividualPairStatus.cs b/MareSynchronosAPI/Data/Enum/IndividualPairStatus.cs new file mode 100644 index 0000000..71c289e --- /dev/null +++ b/MareSynchronosAPI/Data/Enum/IndividualPairStatus.cs @@ -0,0 +1,8 @@ +namespace MareSynchronos.API.Data.Enum; + +public enum IndividualPairStatus +{ + None, + OneSided, + Bidirectional +} \ 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..1686dd6 --- /dev/null +++ b/MareSynchronosAPI/Data/Enum/UserPermissions.cs @@ -0,0 +1,12 @@ +namespace MareSynchronos.API.Data.Enum; + +[Flags] +public enum UserPermissions +{ + NoneSet = 0, + Paused = 1, + DisableAnimations = 2, + DisableSounds = 4, + DisableVFX = 8, + Sticky = 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..f3ac396 --- /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 IsDisableInvites(this GroupPermissions perm) + { + return perm.HasFlag(GroupPermissions.DisableInvites); + } + + public static bool IsPreferDisableAnimations(this GroupPermissions perm) + { + return perm.HasFlag(GroupPermissions.PreferDisableAnimations); + } + + public static bool IsPreferDisableSounds(this GroupPermissions perm) + { + return perm.HasFlag(GroupPermissions.PreferDisableSounds); + } + + public static bool IsPreferDisableVFX(this GroupPermissions perm) + { + return perm.HasFlag(GroupPermissions.PreferDisableVFX); + } + + public static void SetDisableInvites(this ref GroupPermissions perm, bool set) + { + if (set) perm |= GroupPermissions.DisableInvites; + else perm &= ~GroupPermissions.DisableInvites; + } + + public static void SetPreferDisableAnimations(this ref GroupPermissions perm, bool set) + { + if (set) perm |= GroupPermissions.PreferDisableAnimations; + else perm &= ~GroupPermissions.PreferDisableAnimations; + } + + public static void SetPreferDisableSounds(this ref GroupPermissions perm, bool set) + { + if (set) perm |= GroupPermissions.PreferDisableSounds; + else perm &= ~GroupPermissions.PreferDisableSounds; + } + + public static void SetPreferDisableVFX(this ref GroupPermissions perm, bool set) + { + if (set) perm |= GroupPermissions.PreferDisableVFX; + else perm &= ~GroupPermissions.PreferDisableVFX; + } +} \ 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..0bad788 --- /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 GroupPairUserInfo info) + { + return info.HasFlag(GroupPairUserInfo.IsModerator); + } + + public static bool IsPinned(this GroupPairUserInfo info) + { + return info.HasFlag(GroupPairUserInfo.IsPinned); + } + + public static void SetModerator(this ref GroupPairUserInfo info, bool isModerator) + { + if (isModerator) info |= GroupPairUserInfo.IsModerator; + else info &= ~GroupPairUserInfo.IsModerator; + } + + public static void SetPinned(this ref GroupPairUserInfo info, bool isPinned) + { + if (isPinned) info |= GroupPairUserInfo.IsPinned; + else info &= ~GroupPairUserInfo.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..bb2f011 --- /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 GroupUserPreferredPermissions perm) + { + return perm.HasFlag(GroupUserPreferredPermissions.DisableAnimations); + } + + public static bool IsDisableSounds(this GroupUserPreferredPermissions perm) + { + return perm.HasFlag(GroupUserPreferredPermissions.DisableSounds); + } + + public static bool IsDisableVFX(this GroupUserPreferredPermissions perm) + { + return perm.HasFlag(GroupUserPreferredPermissions.DisableVFX); + } + + public static bool IsPaused(this GroupUserPreferredPermissions perm) + { + return perm.HasFlag(GroupUserPreferredPermissions.Paused); + } + + public static void SetDisableAnimations(this ref GroupUserPreferredPermissions perm, bool set) + { + if (set) perm |= GroupUserPreferredPermissions.DisableAnimations; + else perm &= ~GroupUserPreferredPermissions.DisableAnimations; + } + + public static void SetDisableSounds(this ref GroupUserPreferredPermissions perm, bool set) + { + if (set) perm |= GroupUserPreferredPermissions.DisableSounds; + else perm &= ~GroupUserPreferredPermissions.DisableSounds; + } + + public static void SetDisableVFX(this ref GroupUserPreferredPermissions perm, bool set) + { + if (set) perm |= GroupUserPreferredPermissions.DisableVFX; + else perm &= ~GroupUserPreferredPermissions.DisableVFX; + } + + public static void SetPaused(this ref GroupUserPreferredPermissions perm, bool set) + { + if (set) perm |= GroupUserPreferredPermissions.Paused; + else perm &= ~GroupUserPreferredPermissions.Paused; + } +} \ 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..e4d787a --- /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 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 bool IsPaused(this UserPermissions perm) + { + return perm.HasFlag(UserPermissions.Paused); + } + + public static bool IsSticky(this UserPermissions perm) + { + return perm.HasFlag(UserPermissions.Sticky); + } + + 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; + } + + public static void SetPaused(this ref UserPermissions perm, bool paused) + { + if (paused) perm |= UserPermissions.Paused; + else perm &= ~UserPermissions.Paused; + } + + public static void SetSticky(this ref UserPermissions perm, bool sticky) + { + if (sticky) perm |= UserPermissions.Sticky; + else perm &= ~UserPermissions.Sticky; + } +} \ No newline at end of file diff --git a/MareSynchronosAPI/Data/FileReplacementData.cs b/MareSynchronosAPI/Data/FileReplacementData.cs new file mode 100644 index 0000000..0f06325 --- /dev/null +++ b/MareSynchronosAPI/Data/FileReplacementData.cs @@ -0,0 +1,29 @@ +using MessagePack; +using System.Security.Cryptography; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; + +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 FileSwapPath { get; set; } = string.Empty; + public string[] GamePaths { get; set; } = Array.Empty(); + public string Hash { 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..c7c16fe --- /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; +} \ 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/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/ConnectionDto.cs b/MareSynchronosAPI/Dto/ConnectionDto.cs new file mode 100644 index 0000000..71059ff --- /dev/null +++ b/MareSynchronosAPI/Dto/ConnectionDto.cs @@ -0,0 +1,27 @@ +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(); + public DefaultPermissionsDto DefaultPreferredPermissions { 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; } + public int MaxCharaDataVanity { get; set; } +} diff --git a/MareSynchronosAPI/Dto/DefaultPermissionsDto.cs b/MareSynchronosAPI/Dto/DefaultPermissionsDto.cs new file mode 100644 index 0000000..2c889df --- /dev/null +++ b/MareSynchronosAPI/Dto/DefaultPermissionsDto.cs @@ -0,0 +1,15 @@ +using MessagePack; + +namespace MareSynchronos.API.Dto; + +[MessagePackObject(keyAsPropertyName: true)] +public record DefaultPermissionsDto +{ + public bool DisableIndividualAnimations { get; set; } = false; + public bool DisableIndividualSounds { get; set; } = false; + public bool DisableIndividualVFX { get; set; } = false; + public bool DisableGroupAnimations { get; set; } = false; + public bool DisableGroupSounds { get; set; } = false; + public bool DisableGroupVFX { get; set; } = false; + public bool IndividualIsSticky { get; set; } = true; +} \ 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..878a015 --- /dev/null +++ b/MareSynchronosAPI/Dto/Files/DownloadFileDto.cs @@ -0,0 +1,15 @@ +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; + public long RawSize { get; set; } = 0; +} \ 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..d65b2b2 --- /dev/null +++ b/MareSynchronosAPI/Dto/Files/ITransferFileDto.cs @@ -0,0 +1,8 @@ +namespace MareSynchronos.API.Dto.Files; + +public interface ITransferFileDto +{ + string ForbiddenBy { get; set; } + string Hash { get; set; } + bool IsForbidden { 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..e8ddc65 --- /dev/null +++ b/MareSynchronosAPI/Dto/Group/GroupFullInfoDto.cs @@ -0,0 +1,14 @@ +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, + GroupUserPreferredPermissions GroupUserPermissions, GroupPairUserInfo GroupUserInfo, + Dictionary GroupPairUserInfos) : GroupInfoDto(Group, Owner, GroupPermissions) +{ + public GroupUserPreferredPermissions GroupUserPermissions { get; set; } = GroupUserPermissions; + public GroupPairUserInfo 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..447ecd5 --- /dev/null +++ b/MareSynchronosAPI/Dto/Group/GroupInfoDto.cs @@ -0,0 +1,18 @@ +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 record GroupJoinInfoDto(GroupData Group, UserData Owner, GroupPermissions GroupPermissions, bool Success) : GroupInfoDto(Group, Owner, GroupPermissions); \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Group/GroupJoinDto.cs b/MareSynchronosAPI/Dto/Group/GroupJoinDto.cs new file mode 100644 index 0000000..f7aaff6 --- /dev/null +++ b/MareSynchronosAPI/Dto/Group/GroupJoinDto.cs @@ -0,0 +1,11 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; +using MessagePack; + +namespace MareSynchronos.API.Dto.Group; + +[MessagePackObject(keyAsPropertyName: true)] +public record GroupPasswordDto(GroupData Group, string Password) : GroupDto(Group); + +[MessagePackObject(keyAsPropertyName: true)] +public record GroupJoinDto(GroupData Group, string Password, GroupUserPreferredPermissions GroupUserPreferredPermissions) : GroupPasswordDto(Group, Password); \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Group/GroupPairDto.cs b/MareSynchronosAPI/Dto/Group/GroupPairDto.cs new file mode 100644 index 0000000..6bd511c --- /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; +} \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Group/GroupPairFullInfoDto.cs b/MareSynchronosAPI/Dto/Group/GroupPairFullInfoDto.cs new file mode 100644 index 0000000..cdf8b3c --- /dev/null +++ b/MareSynchronosAPI/Dto/Group/GroupPairFullInfoDto.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 GroupPairFullInfoDto(GroupData Group, UserData User, UserPermissions SelfToOtherPermissions, UserPermissions OtherToSelfPermissions) : GroupPairDto(Group, User); \ 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..99a7b22 --- /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, GroupPairUserInfo GroupUserInfo) : GroupPairDto(Group, User); \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Group/GroupPairUserPermissionDto.cs b/MareSynchronosAPI/Dto/Group/GroupPairUserPermissionDto.cs new file mode 100644 index 0000000..0cc6536 --- /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, GroupUserPreferredPermissions GroupPairPermissions) : GroupPairDto(Group, User); \ No newline at end of file diff --git a/MareSynchronosAPI/Dto/Group/GroupPermissionDto.cs b/MareSynchronosAPI/Dto/Group/GroupPermissionDto.cs new file mode 100644 index 0000000..b5e2739 --- /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); \ No newline at end of file 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/BulkPermissionsDto.cs b/MareSynchronosAPI/Dto/User/BulkPermissionsDto.cs new file mode 100644 index 0000000..477c41a --- /dev/null +++ b/MareSynchronosAPI/Dto/User/BulkPermissionsDto.cs @@ -0,0 +1,7 @@ +using MareSynchronos.API.Data.Enum; +using MessagePack; + +namespace MareSynchronos.API.Dto.User; + +[MessagePackObject(keyAsPropertyName: true)] +public record BulkPermissionsDto(Dictionary AffectedUsers, Dictionary AffectedGroups); diff --git a/MareSynchronosAPI/Dto/User/CensusDataDto.cs b/MareSynchronosAPI/Dto/User/CensusDataDto.cs new file mode 100644 index 0000000..27fd5f1 --- /dev/null +++ b/MareSynchronosAPI/Dto/User/CensusDataDto.cs @@ -0,0 +1,6 @@ +using MessagePack; + +namespace MareSynchronos.API.Dto.User; + +[MessagePackObject(keyAsPropertyName: true)] +public record CensusDataDto(ushort WorldId, short RaceId, short TribeId, short Gender); \ 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..f64965b --- /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, CensusDataDto? CensusDataDto); 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/UserIndividualPairStatusDto.cs b/MareSynchronosAPI/Dto/User/UserIndividualPairStatusDto.cs new file mode 100644 index 0000000..d301ef5 --- /dev/null +++ b/MareSynchronosAPI/Dto/User/UserIndividualPairStatusDto.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 UserIndividualPairStatusDto(UserData User, IndividualPairStatus IndividualPairStatus) : UserDto(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..76b4864 --- /dev/null +++ b/MareSynchronosAPI/Dto/User/UserPairDto.cs @@ -0,0 +1,21 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; +using MessagePack; + +namespace MareSynchronos.API.Dto.User; + +[MessagePackObject(keyAsPropertyName: true)] +public record UserFullPairDto(UserData User, IndividualPairStatus IndividualPairStatus, List Groups, UserPermissions OwnPermissions, UserPermissions OtherPermissions) : UserDto(User) +{ + public UserPermissions OwnPermissions { get; set; } = OwnPermissions; + public UserPermissions OtherPermissions { get; set; } = OtherPermissions; + public IndividualPairStatus IndividualPairStatus { get; set; } = IndividualPairStatus; +} + +[MessagePackObject(keyAsPropertyName: true)] +public record UserPairDto(UserData User, IndividualPairStatus IndividualPairStatus, UserPermissions OwnPermissions, UserPermissions OtherPermissions) : UserDto(User) +{ + public UserPermissions OwnPermissions { get; set; } = OwnPermissions; + public UserPermissions OtherPermissions { get; set; } = OtherPermissions; + public IndividualPairStatus IndividualPairStatus { get; set; } = IndividualPairStatus; +} \ 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..d44af51 --- /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); 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/MareSynchronos.API.csproj b/MareSynchronosAPI/MareSynchronos.API.csproj new file mode 100644 index 0000000..8c0e954 --- /dev/null +++ b/MareSynchronosAPI/MareSynchronos.API.csproj @@ -0,0 +1,13 @@ + + + + net8.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..bbcf08a --- /dev/null +++ b/MareSynchronosAPI/Routes/MareAuth.cs @@ -0,0 +1,23 @@ +namespace MareSynchronos.API.Routes; + +public class MareAuth +{ + public const string OAuth = "/oauth"; + public const string Auth = "/auth"; + public const string Auth_CreateIdent = "createWithIdent"; + public const string Auth_RenewToken = "renewToken"; + public const string OAuth_GetUIDsBasedOnSecretKeys = "getUIDsViaSecretKey"; + public const string OAuth_CreateOAuth = "createWithOAuth"; + public const string OAuth_RenewOAuthToken = "renewToken"; + public const string OAuth_GetDiscordOAuthEndpoint = "getDiscordOAuthEndpoint"; + public const string OAuth_GetUIDs = "getUIDs"; + public const string OAuth_GetDiscordOAuthToken = "getDiscordOAuthToken"; + public static Uri AuthFullPath(Uri baseUri) => new Uri(baseUri, Auth + "/" + Auth_CreateIdent); + public static Uri AuthWithOauthFullPath(Uri baseUri) => new Uri(baseUri, OAuth + "/" + OAuth_CreateOAuth); + public static Uri RenewTokenFullPath(Uri baseUri) => new Uri(baseUri, Auth + "/" + Auth_RenewToken); + public static Uri RenewOAuthTokenFullPath(Uri baseUri) => new Uri(baseUri, OAuth + "/" + OAuth_RenewOAuthToken); + public static Uri GetUIDsBasedOnSecretKeyFullPath(Uri baseUri) => new Uri(baseUri, OAuth + "/" + OAuth_GetUIDsBasedOnSecretKeys); + public static Uri GetDiscordOAuthEndpointFullPath(Uri baseUri) => new Uri(baseUri, OAuth + "/" + OAuth_GetDiscordOAuthEndpoint); + public static Uri GetDiscordOAuthTokenFullPath(Uri baseUri, string sessionId) => new Uri(baseUri, OAuth + "/" + OAuth_GetDiscordOAuthToken + "?sessionId=" + sessionId); + public static Uri GetUIDsFullPath(Uri baseUri) => new Uri(baseUri, OAuth + "/" + OAuth_GetUIDs); +} \ No newline at end of file diff --git a/MareSynchronosAPI/Routes/MareFiles.cs b/MareSynchronosAPI/Routes/MareFiles.cs new file mode 100644 index 0000000..df04dd2 --- /dev/null +++ b/MareSynchronosAPI/Routes/MareFiles.cs @@ -0,0 +1,47 @@ +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_UploadMunged = "uploadMunged"; + public const string ServerFiles_DownloadServers = "downloadServers"; + + public const string Distribution = "/dist"; + public const string Distribution_Get = "get"; + + public const string Main = "/main"; + public const string Main_SendReady = "sendReady"; + + public const string Speedtest = "/speedtest"; + public const string Speedtest_Run = "run"; + + 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 ServerFilesUploadMunged(Uri baseUri, string hash) => new(baseUri, ServerFiles + "/" + ServerFiles_UploadMunged + "/" + hash); + public static Uri ServerFilesGetDownloadServersFullPath(Uri baseUri) => new(baseUri, ServerFiles + "/" + ServerFiles_DownloadServers); + public static Uri DistributionGetFullPath(Uri baseUri, string hash) => new(baseUri, Distribution + "/" + Distribution_Get + "?file=" + hash); + public static Uri SpeedtestRunFullPath(Uri baseUri) => new(baseUri, Speedtest + "/" + Speedtest_Run); + 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..a97924b --- /dev/null +++ b/MareSynchronosAPI/SignalR/IMareHub.cs @@ -0,0 +1,91 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; +using MareSynchronos.API.Dto; +using MareSynchronos.API.Dto.CharaData; +using MareSynchronos.API.Dto.Group; +using MareSynchronos.API.Dto.User; + +namespace MareSynchronos.API.SignalR; + +public interface IMareHub +{ + const int ApiVersion = 33; + const string Path = "/mare"; + + Task CheckClientHealth(); + + Task Client_DownloadReady(Guid requestId); + Task Client_GroupChangePermissions(GroupPermissionDto groupPermission); + Task Client_GroupDelete(GroupDto groupDto); + 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_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_UpdateUserIndividualPairStatusDto(UserIndividualPairStatusDto dto); + Task Client_UserUpdateProfile(UserDto dto); + Task Client_UserUpdateSelfPairPermissions(UserPermissionsDto dto); + Task Client_UserUpdateDefaultPermissions(DefaultPermissionsDto dto); + Task Client_GroupChangeUserPairPermissions(GroupPairUserPermissionDto 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 GroupChangeOwnership(GroupPairDto groupPair); + Task GroupChangePassword(GroupPasswordDto groupPassword); + Task GroupClear(GroupDto group); + Task GroupCreate(); + Task> GroupCreateTempInvite(GroupDto group, int amount); + Task GroupDelete(GroupDto group); + Task> GroupGetBannedUsers(GroupDto group); + Task GroupJoin(GroupPasswordDto passwordedGroup); + Task GroupJoinFinalize(GroupJoinDto passwordedGroup); + Task GroupLeave(GroupDto group); + Task GroupRemoveUser(GroupPairDto groupPair); + Task GroupSetUserInfo(GroupPairUserInfoDto groupPair); + Task> GroupsGetAll(); + Task GroupUnbanUser(GroupPairDto groupPair); + Task GroupPrune(GroupDto group, int days, bool execute); + + Task UserAddPair(UserDto user); + Task UserDelete(); + Task> UserGetOnlinePairs(CensusDataDto? censusDataDto); + Task> UserGetPairedClients(); + Task UserGetProfile(UserDto dto); + Task UserPushData(UserCharaDataMessageDto dto); + Task UserRemovePair(UserDto userDto); + Task UserSetProfile(UserProfileDto userDescription); + Task UserUpdateDefaultPermissions(DefaultPermissionsDto defaultPermissionsDto); + Task SetBulkPermissions(BulkPermissionsDto dto); + + 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); +} \ No newline at end of file diff --git a/MareSynchronosAPI/SignalR/IMareHubClient.cs b/MareSynchronosAPI/SignalR/IMareHubClient.cs new file mode 100644 index 0000000..c2de52e --- /dev/null +++ b/MareSynchronosAPI/SignalR/IMareHubClient.cs @@ -0,0 +1,61 @@ +using MareSynchronos.API.Data; +using MareSynchronos.API.Data.Enum; +using MareSynchronos.API.Dto; +using MareSynchronos.API.Dto.CharaData; +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 OnGroupDelete(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 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 OnUserDefaultPermissionUpdate(Action act); + + void OnUpdateUserIndividualPairStatusDto(Action act); + + void OnGroupChangeUserPairPermissions(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