From d236afb1dee8d76553690d209490f454c0596af3 Mon Sep 17 00:00:00 2001 From: GoldenBIOS Date: Sun, 3 May 2026 11:25:59 +0200 Subject: [PATCH] implement FileTransfer and UserService modules with WebRTC support --- Interfaces/IFileWriterAPI.cs | 13 ++++++ Models/FileTransferModels.cs | 44 +++++++++++++++++++ Models/UserModels.cs | 19 +++++++++ Services/FileTransferMethods.cs | 45 ++++++++++++++++++++ Services/UserMethods.cs | 75 +++++++++++++++++++++++++++++++++ 5 files changed, 196 insertions(+) create mode 100644 Interfaces/IFileWriterAPI.cs create mode 100644 Services/FileTransferMethods.cs create mode 100644 Services/UserMethods.cs diff --git a/Interfaces/IFileWriterAPI.cs b/Interfaces/IFileWriterAPI.cs new file mode 100644 index 0000000..74eaf14 --- /dev/null +++ b/Interfaces/IFileWriterAPI.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; + +namespace Chtn.CSharp.SDK.Interfaces +{ + public interface IFileWriterAPI + { + Task OpenFile(string transferId, string fileName, long totalSize); + + Task WriteChunk(string transferId, byte[] data); + + void CloseFile(string transferId); + } +} diff --git a/Models/FileTransferModels.cs b/Models/FileTransferModels.cs index 4800ded..f288464 100644 --- a/Models/FileTransferModels.cs +++ b/Models/FileTransferModels.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using Newtonsoft.Json; namespace Chtn.CSharp.SDK.Models.Media { @@ -8,10 +9,53 @@ namespace Chtn.CSharp.SDK.Models.Media public string TargetUserId { get; set; } public List Metadata { get; set; } } + + public class AcceptFileTransferReq { public string TransferId { get; set; } } + public class DeclineFileTransferReq { public string TransferId { get; set; } } + + public class FileTransferSendOfferRTCReq + { + public string TransferId { get; set; } + public string Sdp { get; set; } + } + + public class FileTransferSendAnswerRTCReq + { + public string TransferId { get; set; } + public string Sdp { get; set; } + } + + public class FileTransferSendICERTCReq + { + public string TransferId { get; set; } + public string Ice { get; set; } + } + + public class StartNewFileTransferResp { public string TransferId { get; set; } } public class TransferableFileMetadata { public string FileId { get; set; } public string Name { get; set; } public long Size { get; set; } } + + public class DCStartNewFilePayload + { + public string TransferId { get; set; } + public TransferableFileMetadata Metadata { get; set; } + } + + public class DCTransferFilePayload + { + public string TransferId { get; set; } + public byte[] Chunk { get; set; } + } + + public class WSNewFileTransferPayload { public string TransferId { get; set; } } + public class WSNewFileTransferAcceptedPayload { public string TransferId { get; set; } } + public class WSNewFileTransferDeclinedPayload { public string TransferId { get; set; } } + public class WSNewFileTransferRTCOfferPayload { public string Sdp { get; set; } } + public class WSNewFileTransferRTCAnswerPayload { public string Sdp { get; set; } } + public class WSNewFileTransferRTCIcePayload { public string Ice { get; set; } } + } \ No newline at end of file diff --git a/Models/UserModels.cs b/Models/UserModels.cs index e12b672..3cabed4 100644 --- a/Models/UserModels.cs +++ b/Models/UserModels.cs @@ -6,6 +6,25 @@ namespace Chtn.CSharp.SDK.Models.User { [JsonProperty("userid")] public string UserId { get; set; } [JsonProperty("username")] public string Username { get; set; } + [JsonProperty("displayName")] public string DisplayName { get; set; } [JsonProperty("email")] public string Email { get; set; } + [JsonProperty("phoneNumber")] public string PhoneNumber { get; set; } + [JsonProperty("pfpUrl")] public string ProfilePictureUrl { get; set; } } + + public class ChangeUsernameReq { [JsonProperty("newUsername")] public string NewUsername { get; set; } } + public class ChangeDisplayNameReq { [JsonProperty("newDisplayName")] public string NewDisplayName { get; set; } } + public class ChangePasswordReq { [JsonProperty("oldPassword")] public string OldPassword { get; set; } } + public class ChangeEmailReq { [JsonProperty("newEmail")] public string NewEmail { get; set; } } + public class UploadNewPfpReq { [JsonProperty("imageData")] public string ImageDataBase64 { get; set; } } + public class VerifyMailChangeReq { [JsonProperty("code")] public string Code { get; set; } } + public class DeleteReq { [JsonProperty("password")] public string Password { get; set; } } + public class RegisterFCMTokenReq { [JsonProperty("token")] public string Token { get; set; } } + public class GetSessionsReq { } + public class ToggleGifSaveReq { [JsonProperty("enabled")] public string IsEnabled { get; set; } } + public class ChangePhoneReq { [JsonProperty("newPhoneNumber")] public string NewPhoneNumber { get; set; } } + public class VerifyPhoneChangeReq { [JsonProperty("code")] public string Code { get; set; } } + public class VerifyFCMTokenReq { [JsonProperty("token")] public string Token { get; set; } } + public class UpdateUserDataReq { [JsonProperty("userData")] public PersonalUserData Data { get; set; } } + public class GIF { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("url")] public string Url { get; set; } } } \ No newline at end of file diff --git a/Services/FileTransferMethods.cs b/Services/FileTransferMethods.cs new file mode 100644 index 0000000..79336df --- /dev/null +++ b/Services/FileTransferMethods.cs @@ -0,0 +1,45 @@ +using System; +using System.Threading.Tasks; +using Chtn.CSharp.SDK.Core; +using Chtn.CSharp.SDK.Models.Media; + +namespace Chtn.CSharp.SDK.Services +{ + public interface IFileTransferService + { + Task StartNew(StartNewFileTransferReq req); + Task Accept(AcceptFileTransferReq req); + Task Decline(DeclineFileTransferReq req); + Task SendRtcOffer(FileTransferSendOfferRTCReq req); + Task SendRtcAnswer(FileTransferSendAnswerRTCReq req); + Task SendRtcIce(FileTransferSendICERTCReq req); + } + + public class FileTransferServiceProvider : IFileTransferService + { + private readonly ApiClient _apiClient; + + public FileTransferServiceProvider(ApiClient apiClient) + { + _apiClient = apiClient ?? throw new ArgumentNullException(nameof(ApiClient)); + } + + public async Task StartNew(StartNewFileTransferReq req) => + await _apiClient.PostAsync("v2/chat/dm/startNewFileTransfer", req); + + public async Task Accept(AcceptFileTransferReq req) => + await _apiClient.PostAsync("v2/chat/dm/acceptFileTransfer", req); + + public async Task Decline(DeclineFileTransferReq req) => + await _apiClient.PostAsync("v2/chat/dm/declineFileTransfer", req); + + public async Task SendRtcOffer(FileTransferSendOfferRTCReq req) => + await _apiClient.PostAsync("v2/chat/dm/sendRtcOfferFileTransfer", req); + + public async Task SendRtcAnswer(FileTransferSendAnswerRTCReq req) => + await _apiClient.PostAsync("v2/chat/dm/sendRtcAnswerFileTransfer", req); + + public async Task SendRtcIce(FileTransferSendICERTCReq req) => + await _apiClient.PostAsync("v2/chat/dm/sendRtcICEFileTransfer", req); + } +} diff --git a/Services/UserMethods.cs b/Services/UserMethods.cs new file mode 100644 index 0000000..10fa3c3 --- /dev/null +++ b/Services/UserMethods.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Chtn.CSharp.SDK.Core; +using Chtn.CSharp.SDK.Models.User; +using Chtn.CSharp.SDK.Models.Session; + +namespace Chtn.CSharp.SDK.Services +{ + public interface IUserService + { + Task ChangeUsername(ChangeUsernameReq req); + Task ChangeDisplayName(ChangeDisplayNameReq req); + Task ChangePassword(ChangePasswordReq req); + Task ChangeEmail(ChangeEmailReq req); + Task UploadNewPfp(UploadNewPfpReq req); + Task VerifyEmailChange(VerifyMailChangeReq req); + Task Delete(DeleteReq req); + Task RegisterFirebaseToken(RegisterFCMTokenReq req); + Task> GetSessions(GetSessionsReq req); + Task ToggleGIFSave(ToggleGifSaveReq req); + Task ChangePhoneNumber(ChangePhoneReq req); + Task VerifyPhoneNumberChange(VerifyPhoneChangeReq req); + Task VerifyFirebaseToken(VerifyFCMTokenReq req); + } + + public class UserServiceProvider : IUserService + { + private readonly ApiClient _apiClient; + + public UserServiceProvider(ApiClient apiClient) + { + _apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient)); + } + + public async Task ChangeUsername(ChangeUsernameReq req) => + await _apiClient.PostAsync("user/changeUsername", req); + + public async Task ChangeDisplayName(ChangeDisplayNameReq req) => + await _apiClient.PostAsync("user/changeDisplayName", req); + + public async Task ChangePassword(ChangePasswordReq req) => + await _apiClient.PostAsync("user/changePassword", req); + + public async Task ChangeEmail(ChangeEmailReq req) => + await _apiClient.PostAsync("user/changeEmail", req); + + public async Task UploadNewPfp(UploadNewPfpReq req) => + await _apiClient.PostAsync("user/uploadNewPfp", req); + + public async Task VerifyEmailChange(VerifyMailChangeReq req) => + await _apiClient.PostAsync("user/verifyMailChange", req); + + public async Task Delete(DeleteReq req) => + await _apiClient.PostAsync("user/deleteAccount", req); + + public async Task RegisterFirebaseToken(RegisterFCMTokenReq req) => + await _apiClient.PostAsync("user/registerFcmToken", req); + + public async Task> GetSessions(GetSessionsReq req) => + await _apiClient.PostAsync>("user/getSessions", req); + + public async Task ToggleGIFSave(ToggleGifSaveReq req) => + await _apiClient.PostAsync("user/toggleGifSave", req); + + public async Task ChangePhoneNumber(ChangePhoneReq req) => + await _apiClient.PostAsync("user/changePhone", req); + + public async Task VerifyPhoneNumberChange(VerifyPhoneChangeReq req) => + await _apiClient.PostAsync("user/verifyPhoneChange", req); + + public async Task VerifyFirebaseToken(VerifyFCMTokenReq req) => + await _apiClient.PostAsync("v2/user/verifyFCMToken", req); + } +} \ No newline at end of file