Browse Source

living consultation

arthur.wu 2 years ago
parent
commit
ff47bd0061

+ 1 - 230
LiveConsultation.cs

@@ -20,234 +20,5 @@ namespace WingLiveConsultationService
     public interface IDistributedRoom
     {
 
-    }
-
-    public enum VideoProtocol
-    {
-        Rtmp,
-        Rtc
-    }
-
-    public enum LiveConsultationRoomStatus
-    {
-        Initiating,
-        ConnectionTimeout,
-        Connected
-    }
-
-    public class LiveConsultationRoomStatusArgs : EventArgs
-    {   
-        /// <summary>
-        /// The old diagnosis room status
-        /// </summary>
-        /// <value></value>
-        public LiveConsultationRoomStatus OldStatus { get; }
-
-        /// <summary>
-        /// The new diagnosis room status
-        /// </summary>
-        /// <value></value>
-        public LiveConsultationRoomStatus NewStatus { get; }    
-        public LiveConsultationRoomStatusArgs(LiveConsultationRoomStatus oldStatus, LiveConsultationRoomStatus newStatus)
-        {
-            OldStatus = oldStatus;
-            NewStatus = newStatus;
-        }        
-    }
-
-    public class RemoteNotifyTarget
-    {
-        public string ServerUrl {get;}
-        public IList<string> ClientIds {get;}
-
-        public RemoteNotifyTarget(string serverUrl)
-        {
-            ServerUrl = serverUrl;
-            ClientIds = new List<string>();
-        }        
-    }
-
-    public class LiveConsultationRoom : ILiveConsultationRoom, IDistributedRoom
-    {        
-        private LiveConsultationRoomStatus _status;
-
-        /// <summary>
-        /// The event diagnosis room closed    
-        /// </summary>
-        public event EventHandler<LiveConsultationRoomStatusArgs> StatusChanged;
-
-        public LiveConsultationMemeber Initiator { get; }
-        public IList<LiveConsultationMemeber> Members { get; }
-        public IList<LiveConsultationMemeber> Devices { get; }
-
-        /// <summary>
-        /// The diagnosis room status
-        /// </summary>
-        /// <value></value>
-        public LiveConsultationRoomStatus Status
-        { 
-            get => _status; 
-            private set 
-            {
-                if (_status != value)
-                {
-                    var old = _status;
-                    _status = value; 
-                    OnStatusChanged(old, _status);
-                }                
-            }
-        }
-
-        /// <summary>
-        /// The diagnosis room No
-        /// </summary>
-        /// <value></value>
-        public int RoomNo { get; }
-
-        public LiveConsultationRoom(int roomNo, LiveConsultationMemeber initiator, IList<LiveConsultationMemeber> members, IList<LiveConsultationMemeber> devices)
-        {
-            RoomNo = roomNo;
-            Initiator = initiator;
-            Members = members;
-            Devices = devices;
-        }
-
-        void OnStatusChanged(LiveConsultationRoomStatus oldStatus, LiveConsultationRoomStatus newStatus)
-        {
-            StatusChanged?.Invoke(this, new LiveConsultationRoomStatusArgs(oldStatus, newStatus));
-        }
-
-        /// <summary>
-        /// Check 
-        /// </summary>
-        /// <param name="timeout">timeout (Unit is ms)</param>
-        public void StartCheckConnectionTimeout(int timeout)
-        {
-            Task.Run(async () =>
-            {
-                lock (Initiator)
-                {
-                    Status = LiveConsultationRoomStatus.Initiating;
-                }
-                await Task.Delay(timeout);
-                lock (Initiator)
-                {
-                    if (Status != LiveConsultationRoomStatus.Connected)
-                    {
-                        Status = LiveConsultationRoomStatus.ConnectionTimeout;
-                    }
-                }
-            });
-        }
-
-        /// <summary>
-        /// Accept the diagnosis connection
-        /// </summary>
-        /// <param name="userId">The accepter id</param>
-        public void Accept(string userId)
-        {
-            var accepter = Members.FirstOrDefault(x=>x.Id == userId);
-            if (accepter != null)
-            {
-                accepter.Status = LiveConsultationMemeberStatus.Accepted;
-                Logger.WriteLineInfo($"User {accepter} accept to join room {RoomNo}");
-                Status = LiveConsultationRoomStatus.Connected;
-
-                var others = Members.Where(x=>x.Id != accepter.Id).ToList();
-                
-                NotifyMessage(others, NotificationTypeEnum.Message); //TODO define a new NotificationType Enum value
-            }
-            else
-            {
-                Logger.WriteLineWarn($"Not find accepter with id:{userId} when accept diagnosis");
-            }
-        }
-
-        void NotifyMessage(IList<LiveConsultationMemeber> clients, NotificationTypeEnum notificationType)
-        {
-            //TODO
-            var isDistributed = ConfigurationManager.IsDistributed;            
-            if (isDistributed)
-            {
-                var localUrl = ConfigurationManager.Host;
-                var localIds = new List<string>();
-                var remoteIds = new List<RemoteNotifyTarget>();
-                foreach(var client in clients)
-                {
-                    var serverUrl =client.LoginServerUrl ;
-                    var clientId = client.Id;
-                    if(serverUrl== localUrl)
-                    {
-                        localIds.Add(clientId);
-                    }
-                    else
-                    {          
-                        var exist = remoteIds.FirstOrDefault(x=>x.ServerUrl == serverUrl);              
-                        if(exist != null)
-                        {
-                            exist.ClientIds.Add(clientId);
-                        }
-                        else
-                        {   var newItem = new RemoteNotifyTarget(serverUrl);
-                            newItem.ClientIds.Add(clientId); 
-                            remoteIds.Add(newItem);
-                        }
-                    }
-                }
-
-                if(localIds.Any())
-                {
-                    LiveConsultationService.PushMessage(localIds, notificationType);
-                }
-                
-                if (remoteIds.Any())
-                {
-                    if(ConfigurationManager.IsDistributed)
-                    {
-                        LiveConsultationService.DispatchMessage(remoteIds, notificationType);
-                    }
-                    else
-                    {
-                        Logger.WriteLineWarn("Should not happen in non-distributed system");
-                    }                    
-                }                
-            }
-            else
-            {
-                var ids = clients.Select(x=>x.Id).ToArray();
-                LiveConsultationService.PushMessage(ids, notificationType);
-            }
-        }
-        
-
-        public void Reject(string userId)
-        {
-
-        }
-        
-        public void Join(string userId)
-        {
-
-        }
-
-        public void Leave(string userId)
-        {
-
-        }
-
-        public void Mute(string userId)
-        {
-
-        }
-
-        public void AddDevice(string userId, string deviceId)
-        {
-
-        }
-
-        public void RemoveDevice(string userId, string deviceId)
-        {
-
-        }
-    }
+    }     
 }

+ 198 - 0
LiveConsultationRoom.cs

@@ -0,0 +1,198 @@
+using WingInterfaceLibrary.LiveConsultation;
+using WingInterfaceLibrary.Enum.NotificationEnum;
+using WingServerCommon.Log;
+using WingServerCommon.Config;
+
+namespace WingLiveConsultationService
+{
+    public class LiveConsultationRoom : ILiveConsultationRoom, IDistributedRoom
+    {        
+        private LiveConsultationRoomStatus _status;
+
+        /// <summary>
+        /// The event diagnosis room closed    
+        /// </summary>
+        public event EventHandler<LiveConsultationRoomStatusArgs> StatusChanged;
+
+        public LiveConsultationMemeber Initiator { get; }
+        public IList<LiveConsultationMemeber> Members { get; }
+        public IList<LiveConsultationMemeber> Devices { get; }
+
+        /// <summary>
+        /// The diagnosis room status
+        /// </summary>
+        /// <value></value>
+        public LiveConsultationRoomStatus Status
+        { 
+            get => _status; 
+            private set 
+            {
+                if (_status != value)
+                {
+                    var old = _status;
+                    _status = value; 
+                    OnStatusChanged(old, _status);
+                }                
+            }
+        }
+
+        /// <summary>
+        /// The consultation unique id
+        /// </summary>
+        /// <value></value>
+        public string RoomId {get;}
+
+        /// <summary>
+        /// The diagnosis room No
+        /// </summary>
+        /// <value></value>
+        public int RoomNo { get; }
+
+        public LiveConsultationRoom(string roomId, int roomNo, LiveConsultationMemeber initiator, IList<LiveConsultationMemeber> members, IList<LiveConsultationMemeber> devices)
+        {
+            RoomId = roomId;
+            RoomNo = roomNo;
+            Initiator = initiator;
+            Members = members;
+            Devices = devices;
+        }
+
+        void OnStatusChanged(LiveConsultationRoomStatus oldStatus, LiveConsultationRoomStatus newStatus)
+        {
+            StatusChanged?.Invoke(this, new LiveConsultationRoomStatusArgs(oldStatus, newStatus));
+        }
+
+        /// <summary>
+        /// Check 
+        /// </summary>
+        /// <param name="timeout">timeout (Unit is ms)</param>
+        public void StartCheckConnectionTimeout(int timeout)
+        {
+            Task.Run(async () =>
+            {
+                lock (Initiator)
+                {
+                    Status = LiveConsultationRoomStatus.Initiating;
+                }
+                await Task.Delay(timeout);
+                lock (Initiator)
+                {
+                    if (Status != LiveConsultationRoomStatus.Connected)
+                    {
+                        Status = LiveConsultationRoomStatus.ConnectionTimeout;
+                    }
+                }
+            });
+        }
+
+        /// <summary>
+        /// Accept the diagnosis connection
+        /// </summary>
+        /// <param name="userId">The accepter id</param>
+        public void Accept(string userId)
+        {
+            var accepter = Members.FirstOrDefault(x=>x.Id == userId);
+            if (accepter != null)
+            {
+                accepter.Status = LiveConsultationMemeberStatus.Accepted;
+                Logger.WriteLineInfo($"User {accepter} accept to join room {RoomNo}");
+                Status = LiveConsultationRoomStatus.Connected;
+
+                var others = Members.Where(x=>x.Id != accepter.Id).ToList();
+                
+                NotifyMessage(others, NotificationTypeEnum.Message); //TODO define a new NotificationType Enum value
+            }
+            else
+            {
+                Logger.WriteLineWarn($"Not find accepter with id:{userId} when accept diagnosis");
+            }
+        }
+
+        void NotifyMessage(IList<LiveConsultationMemeber> clients, NotificationTypeEnum notificationType)
+        {
+            //TODO
+            var isDistributed = ConfigurationManager.IsDistributed;            
+            if (isDistributed)
+            {
+                var localUrl = ConfigurationManager.Host;
+                var localIds = new List<string>();
+                var remoteIds = new List<RemoteNotifyTarget>();
+                foreach(var client in clients)
+                {
+                    var serverUrl =client.LoginServerUrl ;
+                    var clientId = client.Id;
+                    if(serverUrl== localUrl)
+                    {
+                        localIds.Add(clientId);
+                    }
+                    else
+                    {          
+                        var exist = remoteIds.FirstOrDefault(x=>x.ServerUrl == serverUrl);              
+                        if(exist != null)
+                        {
+                            exist.ClientIds.Add(clientId);
+                        }
+                        else
+                        {   var newItem = new RemoteNotifyTarget(serverUrl);
+                            newItem.ClientIds.Add(clientId); 
+                            remoteIds.Add(newItem);
+                        }
+                    }
+                }
+
+                if(localIds.Any())
+                {
+                    LiveConsultationService.PushMessage(localIds, notificationType);
+                }
+                
+                if (remoteIds.Any())
+                {
+                    if(ConfigurationManager.IsDistributed)
+                    {
+                        LiveConsultationService.DispatchMessage(remoteIds, notificationType);
+                    }
+                    else
+                    {
+                        Logger.WriteLineWarn("Should not happen in non-distributed system");
+                    }                    
+                }                
+            }
+            else
+            {
+                var ids = clients.Select(x=>x.Id).ToArray();
+                LiveConsultationService.PushMessage(ids, notificationType);
+            }
+        }
+        
+
+        public void Reject(string userId)
+        {
+
+        }
+        
+        public void Join(string userId)
+        {
+
+        }
+
+        public void Leave(string userId)
+        {
+
+        }
+
+        public void Mute(string userId)
+        {
+
+        }
+
+        public void AddDevice(string userId, string deviceId)
+        {
+
+        }
+
+        public void RemoveDevice(string userId, string deviceId)
+        {
+
+        }
+    }
+}

+ 24 - 8
LiveConsultationRoomManager.cs

@@ -5,14 +5,22 @@ namespace WingLiveConsultationService
     public interface ILiveConsultationRoomManager
     {
 
-        LiveConsultationRoom CreateRoom(LiveConsultationMemeber initiator, IList<LiveConsultationMemeber> others, IList<LiveConsultationMemeber> devices);
+        /// <summary>
+        /// Create a live consultation rooom
+        /// </summary>
+        /// <param name="roomId">The unique room id (consultation code)</param>
+        /// <param name="initiator">The memeber info who initiated the live consultation</param>
+        /// <param name="others">Other members' info</param>
+        /// <param name="devices">The devices info</param>
+        /// <returns></returns>
+        LiveConsultationRoom CreateRoom(string roomId, LiveConsultationMemeber initiator, IList<LiveConsultationMemeber> others, IList<LiveConsultationMemeber> devices);
 
         /// <summary>
         /// Get a diagnosis room  with specified room no
         /// </summary>
         /// <param name="roomNo"></param>
         /// <returns></returns>
-        LiveConsultationRoom GetRoom(int roomNo);
+        LiveConsultationRoom GetRoom(string roomId);
         //void AcceptLiveConsultation(string daignosisiRoomId, string accpeterId);
         //void RejectLiveConsultation(string daignosisiRoomId, string accpeterId);
         //void JoinLiveConsultation(string daignosisiRoomId, string joinerId);
@@ -27,10 +35,18 @@ namespace WingLiveConsultationService
             VideoProtocol = protocol;
         }
 
-        public LiveConsultationRoom CreateRoom(LiveConsultationMemeber initiator, IList<LiveConsultationMemeber> others, IList<LiveConsultationMemeber> devices)
+        /// <summary>
+        /// Create a live consultation rooom
+        /// </summary>
+        /// <param name="roomId">The unique room id (consultation code)</param>
+        /// <param name="initiator">The memeber info who initiated the live consultation</param>
+        /// <param name="others">Other members' info</param>
+        /// <param name="devices">The devices info</param>
+        /// <returns></returns>
+        public LiveConsultationRoom CreateRoom(string roomId, LiveConsultationMemeber initiator, IList<LiveConsultationMemeber> others, IList<LiveConsultationMemeber> devices)
         {
-            var roomId = 1; //TODO
-            var room  = new LiveConsultationRoom(roomId, initiator, others, devices);
+            var roomNo = 1; //TODO get integer room No
+            var room  = new LiveConsultationRoom(roomId, roomNo, initiator, others, devices);
             return room;
         }
 
@@ -39,7 +55,7 @@ namespace WingLiveConsultationService
         /// </summary>
         /// <param name="roomNo"></param>
         /// <returns></returns>
-        public LiveConsultationRoom GetRoom(int roomNo)
+        public LiveConsultationRoom GetRoom(string roomId)
         {
              throw new NotImplementedException();
 
@@ -52,7 +68,7 @@ namespace WingLiveConsultationService
         {
         }
 
-        public LiveConsultationRoom CreateRoom(LiveConsultationMemeber initiator, IList<LiveConsultationMemeber> others, IList<LiveConsultationMemeber> devices)
+        public LiveConsultationRoom CreateRoom(string roomId, LiveConsultationMemeber initiator, IList<LiveConsultationMemeber> others, IList<LiveConsultationMemeber> devices)
         {
             throw new NotImplementedException();
 
@@ -63,7 +79,7 @@ namespace WingLiveConsultationService
         /// </summary>
         /// <param name="roomNo"></param>
         /// <returns></returns>
-        public LiveConsultationRoom GetRoom(int roomNo)
+        public LiveConsultationRoom GetRoom(string roomId)
         {
              throw new NotImplementedException();
 

+ 24 - 0
LiveConsultationRoomStatusArgs.cs

@@ -0,0 +1,24 @@
+using WingInterfaceLibrary.LiveConsultation;
+
+namespace WingLiveConsultationService
+{
+    public class LiveConsultationRoomStatusArgs : EventArgs
+    {   
+        /// <summary>
+        /// The old diagnosis room status
+        /// </summary>
+        /// <value></value>
+        public LiveConsultationRoomStatus OldStatus { get; }
+
+        /// <summary>
+        /// The new diagnosis room status
+        /// </summary>
+        /// <value></value>
+        public LiveConsultationRoomStatus NewStatus { get; }    
+        public LiveConsultationRoomStatusArgs(LiveConsultationRoomStatus oldStatus, LiveConsultationRoomStatus newStatus)
+        {
+            OldStatus = oldStatus;
+            NewStatus = newStatus;
+        }        
+    }
+}

+ 3 - 2
LiveConsultationService.cs

@@ -63,6 +63,7 @@ namespace WingLiveConsultationService
         public async Task<InitiateLiveConsultationResult> InitiateLiveConsultationAsync(InitiateLiveConsultationRequest request)
         {
             var token = request.Token;
+            var roomId = string.Empty;//TODO request.ConsultationCode;
             var otherIds = request.OtherIds;
             var tokenRequest = new TokenRequest() { Token = token };
             var tokensRequest = new GetTokenWithClientIdsRequest()
@@ -122,7 +123,7 @@ namespace WingLiveConsultationService
                 }
             }
 
-            var room = _realtimeDiagosisRoomManager.CreateRoom(initiator, others, devices);
+            var room = _realtimeDiagosisRoomManager.CreateRoom(roomId, initiator, others, devices);
 
             BroadcastNotificationRequest notificationRequest = new BroadcastNotificationRequest();
             var ids = others.Select(x => x.Id).ToList();
@@ -151,7 +152,7 @@ namespace WingLiveConsultationService
         {
             var token = request.Token;
             //todo roomCode change to roomId ??
-            var roomId = Convert.ToInt32(request.RoomCode);
+            var roomId = request.RoomCode;
             var tokenRequest = new TokenRequest() { Token = token };
             var accepterToken = await _authenticationService.GetTokenAsync(tokenRequest);
 

+ 14 - 0
RemoteNotifyTarget.cs

@@ -0,0 +1,14 @@
+namespace WingLiveConsultationService
+{
+    public class RemoteNotifyTarget
+    {
+        public string ServerUrl {get;}
+        public IList<string> ClientIds {get;}
+
+        public RemoteNotifyTarget(string serverUrl)
+        {
+            ServerUrl = serverUrl;
+            ClientIds = new List<string>();
+        }        
+    }
+}