OnlineUsers.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using CB.TVUCenter.Config;
  5. using CB.TVUCenter.Entity;
  6. namespace CB.TVUCenter.Data
  7. {
  8. public class OnlineUsers
  9. {
  10. /// <summary>
  11. /// 在线用户列表
  12. /// </summary>
  13. public static IList<OnlineUserInfo> onlineUserList = new List<OnlineUserInfo>();
  14. /// <summary>
  15. /// 锁定用户列表
  16. /// </summary>
  17. public static IList<OnlineUserInfo> lockUserList = new List<OnlineUserInfo>();
  18. #region 测试
  19. static OnlineUsers()
  20. {
  21. //onlineUserList.Add(new OnlineUserInfo()
  22. //{
  23. // UserName = "00-00-00-00-00-00-00-E0",
  24. // Sign = "00000000000000E0",
  25. // RequestTime = DateTime.Now
  26. //});
  27. //onlineUserList.Add(new OnlineUserInfo()
  28. //{
  29. // UserName = "FF-00-00-00-00-00-00-E0",
  30. // Sign = "FF000000000000E0",
  31. // RequestTime = DateTime.Now
  32. //});
  33. //lockUserList.Add(new OnlineUserInfo() { UserName = "FF-00-00-00-00-00-00-E0" });
  34. }
  35. #endregion
  36. private static object lockObject = new object();
  37. /// <summary>
  38. /// 检查用户是否锁定
  39. /// </summary>
  40. /// <param name="user"></param>
  41. /// <returns></returns>
  42. public static bool CheckUserLock(OnlineUserInfo user)
  43. {
  44. ClearLockOnlineUser();
  45. if (IsLockUser(user.UserName))
  46. return true;
  47. lock (lockObject)
  48. {
  49. if (TVConfigs.GetConfig().ApiCallTimes < UserApiCycle(user))
  50. {
  51. lock (lockObject)
  52. {
  53. lockUserList.Add(new OnlineUserInfo()
  54. {
  55. UserName = user.UserName,
  56. Sign = user.Sign,
  57. RequestTime = user.RequestTime
  58. });
  59. }
  60. CB.Common.FileUtil.WriteLog("用户被锁定");
  61. return true;
  62. }
  63. }
  64. return false;
  65. }
  66. /// <summary>
  67. /// 判断用户是否是锁定用户
  68. /// </summary>
  69. /// <param name="userName"></param>
  70. /// <returns></returns>
  71. private static bool IsLockUser(string userName)
  72. {
  73. foreach (var item in lockUserList)
  74. {
  75. if (item.UserName == userName)
  76. return true;
  77. }
  78. return false;
  79. }
  80. /// <summary>
  81. /// 清楚过期锁定用户
  82. /// </summary>
  83. private static void ClearLockOnlineUser()
  84. {
  85. lock (lockObject)
  86. {
  87. var now = DateTime.Now;
  88. IList<OnlineUserInfo> _user = new List<OnlineUserInfo>();
  89. foreach (var item in lockUserList)
  90. {
  91. if (item.RequestTime.AddMinutes(TVConfigs.GetConfig().UnLockTime) >= now)
  92. _user.Add(item);
  93. }
  94. lockUserList = _user;
  95. }
  96. }
  97. /// <summary>
  98. /// 用户访问API频率
  99. /// </summary>
  100. /// <param name="user"></param>
  101. /// <returns>0:首次访问用户;用户访问频率</returns>
  102. private static int UserApiCycle(OnlineUserInfo user)
  103. {
  104. ClearOnlineUser();
  105. return UpdateOnlineUser(user);
  106. }
  107. /// <summary>
  108. /// 更新在线用户信息,并返回用户访问API频率
  109. /// </summary>
  110. /// <param name="user"></param>
  111. /// <returns>用户每分钟访问API接口频率</returns>
  112. public static int UpdateOnlineUser(OnlineUserInfo user)
  113. {
  114. lock (lockObject)
  115. {
  116. onlineUserList.Add(new OnlineUserInfo()
  117. {
  118. UserName = user.UserName,
  119. Sign = user.Sign,
  120. RequestTime = user.RequestTime
  121. });
  122. int userCount = 0;
  123. var now = DateTime.Now;
  124. foreach (var item in onlineUserList)
  125. {
  126. if (user.UserName == item.UserName && user.RequestTime.AddMinutes(TVConfigs.GetConfig().ApiCallCycle) >= now)
  127. userCount++;
  128. }
  129. return userCount / TVConfigs.GetConfig().ApiCallCycle;
  130. }
  131. }
  132. /// <summary>
  133. /// 清楚过期用户
  134. /// </summary>
  135. /// <param name="user"></param>
  136. private static void ClearOnlineUser()
  137. {
  138. lock (lockObject)
  139. {
  140. var now = DateTime.Now;
  141. IList<OnlineUserInfo> _user = new List<OnlineUserInfo>();
  142. foreach (var item in onlineUserList)
  143. {
  144. if (item.RequestTime.AddMinutes(TVConfigs.GetConfig().ClearOnlineUserTime) >= now)
  145. _user.Add(item);
  146. }
  147. onlineUserList = _user;
  148. }
  149. }
  150. /// <summary>
  151. /// 手动锁定用户
  152. /// </summary>
  153. /// <param name="User">要锁定的用户</param>
  154. public static bool AdminLockOnlineUser(OnlineUserInfo User)
  155. {
  156. lock (lockObject)
  157. {
  158. bool isExist = false;
  159. foreach (var Item in lockUserList)
  160. {
  161. if (Item.UserName == User.UserName)
  162. {
  163. isExist = true;
  164. }
  165. }
  166. if (!isExist)
  167. {
  168. lockUserList.Add(User);
  169. return true;
  170. }
  171. return false;
  172. }
  173. }
  174. /// <summary>
  175. /// 手动解锁用户
  176. /// </summary>
  177. /// <param name="User">要解锁的用户</param>
  178. public static bool AdminUnLockOnlineUser(OnlineUserInfo User)
  179. {
  180. lock (lockObject)
  181. {
  182. foreach (var item in lockUserList)
  183. {
  184. if (item.UserName == User.UserName)
  185. {
  186. return lockUserList.Remove(item);
  187. }
  188. }
  189. return false;
  190. }
  191. }
  192. }
  193. }