From 3166c6e647085a8f3aa6ca6eea27fee46a0dd6cb Mon Sep 17 00:00:00 2001 From: GoldenBIOS Date: Sat, 2 May 2026 22:01:21 +0200 Subject: [PATCH] implement Broadcast and SessionManager services --- Models/BroadcastModels.cs | 28 ++++++++-- Models/SessionManagerModels.cs | 9 ++- Models/SessionModels.cs | 8 ++- Services/AuthMethods.cs | 11 +++- Services/BroadcastMethods.cs | 32 +++++++++++ Services/SessionManagerMethods.cs | 91 +++++++++++++++++++++++++++++++ 6 files changed, 168 insertions(+), 11 deletions(-) create mode 100644 Services/BroadcastMethods.cs create mode 100644 Services/SessionManagerMethods.cs diff --git a/Models/BroadcastModels.cs b/Models/BroadcastModels.cs index 2bfa894..9f9d1c7 100644 --- a/Models/BroadcastModels.cs +++ b/Models/BroadcastModels.cs @@ -1,9 +1,29 @@ -namespace Chtn.CSharp.SDK.Models.Call +using Newtonsoft.Json; +using System.Collections.Generic; + +namespace Chtn.CSharp.SDK.Models.Call { public class StreamRegistry { - public string StreamKey { get; set; } - public string Status { get; set; } - public string StreamUrl { get; set; } + [JsonProperty("streamKey")] public string SreamKey { get; set; } + [JsonProperty("status")] public List Status { get; set; } + [JsonProperty("streamUrl")] public List StreamUrl { get; set; } + } + + public class CreateServerReq + { + [JsonProperty("channelId")] public List ChannelId { get; set; } + [JsonProperty("name")] public List Name { get; set; } + } + + public class GetRtmpDataReq + { + [JsonProperty("channelId")] public List ChannelId { get; set; } + } + + public class BroadcastJoinWsRoomReq + { + [JsonProperty("connId")] public List ConnId { get; set; } + [JsonProperty("channelId")] public List ChannelId { get; set; } } } \ No newline at end of file diff --git a/Models/SessionManagerModels.cs b/Models/SessionManagerModels.cs index b40d812..e7ac776 100644 --- a/Models/SessionManagerModels.cs +++ b/Models/SessionManagerModels.cs @@ -1,4 +1,9 @@ -namespace Chtn.CSharp.SDK.Models.Session +using Newtonsoft.Json; + +namespace Chtn.CSharp.SDK.Models.Session { - public class ValidateSessionReq { public string Token { get; set; } } + public class ValidateSessionReq + { + [JsonProperty("token")] public string Token { get; set; } + } } \ No newline at end of file diff --git a/Models/SessionModels.cs b/Models/SessionModels.cs index 1d0fc20..9c8288c 100644 --- a/Models/SessionModels.cs +++ b/Models/SessionModels.cs @@ -1,4 +1,5 @@ -using Chtn.CSharp.SDK.Models.User; +using System.Collections.Generic; +using Chtn.CSharp.SDK.Models.User; using Newtonsoft.Json; namespace Chtn.CSharp.SDK.Models.Session @@ -8,5 +9,8 @@ namespace Chtn.CSharp.SDK.Models.Session [JsonProperty("userData")] public PersonalUserData UserData { get; set; } [JsonProperty("token")] public string Token { get; set; } } - public class ValidateSessionResp { public bool ValidationOk { get; set; } } + public class ValidateSessionResp + { + [JsonProperty("validationOk")] public bool ValidationOk { get; set; } + } } \ No newline at end of file diff --git a/Services/AuthMethods.cs b/Services/AuthMethods.cs index 2b7069d..91ddcd6 100644 --- a/Services/AuthMethods.cs +++ b/Services/AuthMethods.cs @@ -1,7 +1,8 @@ -using System; -using System.Threading.Tasks; +using Chtn.CSharp.SDK.Core; using Chtn.CSharp.SDK.Models.Auth; -using Chtn.CSharp.SDK.Core; +using Chtn.CSharp.SDK.Models.Session; +using System; +using System.Threading.Tasks; namespace Chtn.CSharp.SDK.Services { @@ -21,6 +22,7 @@ namespace Chtn.CSharp.SDK.Services Task Register(RegisterReq req); Task ResetPassword(ResetPasswordReq req); Task VerifyResetCode(VerifyPasswordResetReq req); + Task ValidateSession(ValidateSessionReq req); } public class AuthServiceProvider : IAuthService @@ -73,5 +75,8 @@ namespace Chtn.CSharp.SDK.Services public async Task VerifyResetCode(VerifyPasswordResetReq req) => await _apiClient.PostAsync("user/verifyResetCode", req); + + public async Task ValidateSession(ValidateSessionReq req) => + await _apiClient.PostAsync("v2/user/validateSession", req); } } \ No newline at end of file diff --git a/Services/BroadcastMethods.cs b/Services/BroadcastMethods.cs new file mode 100644 index 0000000..e2f3ed5 --- /dev/null +++ b/Services/BroadcastMethods.cs @@ -0,0 +1,32 @@ +using System; +using System.Threading.Tasks; +using Chtn.CSharp.SDK.Core; +using Chtn.CSharp.SDK.Models.Call; + +namespace Chtn.CSharp.SDK.Services +{ + public interface IBroadcastService + { + Task GetData(GetRtmpDataReq req); + Task CreateService(CreateServerReq req); + Task JoinWebSocketRoom(BroadcastJoinWsRoomReq req); + } + + public class BroadcastServiceProvider : IBroadcastService + { + private readonly ApiClient _apiClient; + + public BroadcastServiceProvider(ApiClient apiClient) + { + _apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient)); + } + + public async Task GetData(GetRtmpDataReq req) => + await _apiClient.PostAsync("network/channel/rtmpData", req); + public async Task CreateService(CreateServerReq req) => + await _apiClient.PostAsync("network/channel/createServer", req); + + public async Task JoinWebSocketRoom(BroadcastJoinWsRoomReq req) => + await _apiClient.PostAsync("v2/network/channel/joinWebSocketRoom", req); + } +} diff --git a/Services/SessionManagerMethods.cs b/Services/SessionManagerMethods.cs new file mode 100644 index 0000000..48a6a22 --- /dev/null +++ b/Services/SessionManagerMethods.cs @@ -0,0 +1,91 @@ +using Chtn.CSharp.SDK.Core; +using Chtn.CSharp.SDK.Models.Session; +using Chtn.CSharpSDK.Interfaces; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Chtn.CSharp.SDK.Services +{ + public interface ISessionManager + { + void AddSession(Session session); + List LoadSessions(); + Task ValidateSessions(IAuthService authService); + Session GetPreferredUser(); + void SetPreferredUser(string userId); + } + + public class SessionManagerProvider : ISessionManager + { + private readonly IDatabaseAPI _database; + private readonly IKeyringAPI _keyring; + private const string SESSION_KEY = "active_sessions"; + private const string PREFERRED_USER_KEY = "preferred_user_id"; + + public SessionManagerProvider(IDatabaseAPI database, IKeyringAPI keyring) + { + _database = database ?? throw new ArgumentNullException(nameof(database)); + _keyring = keyring ?? throw new ArgumentNullException(nameof(keyring)); + } + + public void AddSession(Session session) + { + var sessions = LoadSessions(); + if (!sessions.Any(s => s.UserData.UserId == session.UserData.UserId)) + { + sessions.Add(session); + SaveSessions(sessions); + } + } + + public List LoadSessions() + { + var data = _database.Get("system", SESSION_KEY); + if (string.IsNullOrEmpty(data)) return new List(); + + try + { + return JsonConvert.DeserializeObject>(data); + } + catch + { + return new List(); + } + } + + public async Task ValidateSessions(IAuthService authService) + { + var current = GetPreferredUser(); + if (current == null || string.IsNullOrEmpty(current.Token)) return false; + + var req = new ValidateSessionReq { Token = current.Token }; + + var resp = await authService.ValidateSession(req); + + return resp != null && resp.ValidationOk; + } + + public Session GetPreferredUser() + { + var userId = _keyring.Get(PREFERRED_USER_KEY); + if (string.IsNullOrEmpty(userId)) return null; + + return LoadSessions().FirstOrDefault(s => s.UserData.UserId == userId); + } + + public void SetPreferredUser(string userId) + { + _keyring.Set(PREFERRED_USER_KEY, userId); + } + + private void SaveSessions(List sessions) + { + var json = JsonConvert.SerializeObject(sessions); + _database.Set("system", SESSION_KEY, json); + _database.Flush(); + } + } +} \ No newline at end of file