@@ -14,29 +14,34 @@ public static class SessionManager
1414 private static readonly ConcurrentDictionary < string , Session > SessionMap = new ( ) ;
1515
1616 /// <summary>
17- /// 玩家数量
17+ /// 获取当前在线玩家的数量。
1818 /// </summary>
19- /// <returns></returns>
19+ /// <returns>当前在线玩家的数量。 </returns>
2020 public static int Count ( )
2121 {
2222 return SessionMap . Count ;
2323 }
2424
2525 /// <summary>
26- /// 获取分页玩家列表
26+ /// 获取分页的玩家列表。
2727 /// </summary>
28- /// <param name="pageSize"></param>
29- /// <param name="pageIndex"></param>
28+ /// <param name="pageSize">每页的玩家数量。</param>
29+ /// <param name="pageIndex">当前页的索引,从0开始。</param>
30+ /// <returns>指定页的玩家会话列表。</returns>
3031 public static List < Session > GetPageList ( int pageSize , int pageIndex )
3132 {
32- var result = SessionMap . Values . OrderBy ( m => m . CreateTime ) . Where ( m => ActorManager . HasActor ( m . RoleId ) ) . Skip ( pageIndex * pageSize ) . Take ( pageSize ) . ToList ( ) ;
33+ var result = SessionMap . Values . OrderBy ( m => m . CreateTime )
34+ . Where ( m => ActorManager . HasActor ( m . RoleId ) )
35+ . Skip ( pageIndex * pageSize )
36+ . Take ( pageSize )
37+ . ToList ( ) ;
3338 return result ;
3439 }
3540
3641 /// <summary>
37- /// 踢掉玩家
42+ /// 踢掉指定角色ID的玩家,移除其会话。
3843 /// </summary>
39- /// <param name="roleId">链接ID </param>
44+ /// <param name="roleId">要踢掉的玩家的角色ID。 </param>
4045 public static void KickOffLineByUserId ( long roleId )
4146 {
4247 var roleSession = Get ( m => m . RoleId == roleId ) ;
@@ -50,10 +55,11 @@ public static void KickOffLineByUserId(long roleId)
5055 }
5156
5257 /// <summary>
53- /// 根据角色ID获取会话对象,且会话对象必须已经存在才会返回
58+ /// 根据角色ID获取对应的会话对象。
59+ /// 会话对象必须已经存在才会返回。
5460 /// </summary>
55- /// <param name="roleId">角色ID</param>
56- /// <returns>会话对象 </returns>
61+ /// <param name="roleId">角色ID。 </param>
62+ /// <returns>对应的会话对象,如果不存在则返回null。 </returns>
5763 public static Session GetByRoleId ( long roleId )
5864 {
5965 var roleSession = Get ( m => m . RoleId == roleId ) ;
@@ -66,39 +72,41 @@ public static Session GetByRoleId(long roleId)
6672 }
6773
6874 /// <summary>
69- /// 获取连接会话
75+ /// 根据会话ID获取连接的会话对象。
7076 /// </summary>
71- /// <param name="sessionId">链接ID</param>
77+ /// <param name="sessionId">会话ID。</param>
78+ /// <returns>对应的会话对象,如果不存在则返回null。</returns>
7279 public static Session Get ( string sessionId )
7380 {
7481 SessionMap . TryGetValue ( sessionId , out var value ) ;
7582 return value ;
7683 }
7784
7885 /// <summary>
79- /// 根据查询条件获取会话对象
86+ /// 根据指定的查询条件获取会话对象。
8087 /// </summary>
81- /// <param name="predicate">查询条件 </param>
82- /// <returns>会话对象 </returns>
88+ /// <param name="predicate">查询条件的委托。 </param>
89+ /// <returns>符合条件的会话对象,如果不存在则返回null。 </returns>
8390 public static Session Get ( Func < Session , bool > predicate )
8491 {
8592 return SessionMap . Values . FirstOrDefault ( predicate ) ;
8693 }
8794
8895 /// <summary>
89- /// 根据查询条件获取会话对象列表
96+ /// 根据指定的查询条件获取会话对象列表。
9097 /// </summary>
91- /// <param name="predicate">查询条件 </param>
92- /// <returns>会话对象列表 </returns>
98+ /// <param name="predicate">查询条件的委托。 </param>
99+ /// <returns>符合条件的会话对象列表。 </returns>
93100 public static List < Session > GetList ( Func < Session , bool > predicate )
94101 {
95102 return SessionMap . Values . Where ( predicate ) . ToList ( ) ;
96103 }
97104
98105 /// <summary>
99- /// 移除玩家
106+ /// 移除指定会话ID的玩家。
100107 /// </summary>
101- /// <param name="sessionId">链接ID</param>
108+ /// <param name="sessionId">要移除的会话ID。</param>
109+ /// <returns>被移除的会话对象,如果不存在则返回null。</returns>
102110 public static Session Remove ( string sessionId )
103111 {
104112 if ( SessionMap . TryRemove ( sessionId , out var value ) && ActorManager . HasActor ( value . RoleId ) )
@@ -110,9 +118,9 @@ public static Session Remove(string sessionId)
110118 }
111119
112120 /// <summary>
113- /// 移除全部
121+ /// 移除所有在线玩家的会话。
114122 /// </summary>
115- /// <returns></returns>
123+ /// <returns>一个表示异步操作的任务。 </returns>
116124 public static Task RemoveAll ( )
117125 {
118126 foreach ( var session in SessionMap . Values )
@@ -128,40 +136,55 @@ public static Task RemoveAll()
128136 }
129137
130138 /// <summary>
131- /// 获取链接
139+ /// 获取指定会话ID的网络连接通道。
132140 /// </summary>
133- /// <param name="sessionId"></param>
134- /// <returns></returns>
141+ /// <param name="sessionId">会话ID。 </param>
142+ /// <returns>对应的网络连接通道,如果不存在则返回null。 </returns>
135143 public static INetWorkChannel GetChannel ( string sessionId )
136144 {
137145 SessionMap . TryGetValue ( sessionId , out var session ) ;
138146 return session ? . WorkChannel ;
139147 }
140148
141149 /// <summary>
142- /// 添加新连接
150+ /// 添加新的连接会话。
143151 /// </summary>
144- /// <param name="session"></param>
152+ /// <param name="session">要添加的会话对象。 </param>
145153 public static void Add ( Session session )
146154 {
147- if ( SessionMap . TryGetValue ( session . Id , out var oldSession ) && oldSession . WorkChannel != session . WorkChannel )
155+ session . WorkChannel . SetData ( GlobalConst . SessionIdKey , session . Id ) ;
156+ SessionMap [ session . Id ] = session ;
157+ }
158+
159+ /// <summary>
160+ /// 更新会话,处理角色ID和签名的更新。
161+ /// 如果角色ID已在其他设备上登录,则会通知旧会话并关闭其连接。
162+ /// </summary>
163+ /// <param name="sessionId">会话ID,用于标识当前会话</param>
164+ /// <param name="roleId">角色ID,表示当前会话所关联的角色</param>
165+ /// <param name="sign">签名,用于验证会话的唯一性</param>
166+ public static async void UpdateSession ( string sessionId , long roleId , string sign )
167+ {
168+ // 获取与角色ID关联的旧会话
169+ var oldSession = GetByRoleId ( roleId ) ;
170+ if ( oldSession != null )
148171 {
149- if ( oldSession . Sign != session . Sign )
172+ // 创建提示消息,通知用户其账号已在其他设备上登录
173+ var msg = new RespPrompt
150174 {
151- var msg = new RespPrompt
152- {
153- Type = 5 ,
154- Content = "你的账号已在其他设备上登陆" ,
155- } ;
156- oldSession . WriteAsync ( msg ) ;
157- }
158-
159- // 新连接 or 顶号
175+ Type = 5 ,
176+ Content = "你的账号已在其他设备上登陆" ,
177+ } ;
178+ // 发送消息给旧会话
179+ await oldSession . WriteAsync ( msg ) ;
180+ // 清除旧会话的连接数据并关闭连接
160181 oldSession . WorkChannel . ClearData ( ) ;
161182 oldSession . WorkChannel . Close ( ) ;
162183 }
163184
164- session . WorkChannel . SetData ( GlobalConst . SessionIdKey , session . Id ) ;
165- SessionMap [ session . Id ] = session ;
185+ // 获取当前会话并更新角色ID和签名
186+ var session = Get ( sessionId ) ;
187+ session . SetRoleId ( roleId ) ;
188+ session . SetSign ( sign ) ;
166189 }
167190}
0 commit comments