using System; using System.Collections; using System.Collections.Generic; using CB.TVUCenter.Config; using CB.TVUCenter.Entity; namespace CB.TVUCenter.Data { public class OnlineUsers { /// /// 在线用户列表 /// public static IList onlineUserList = new List(); /// /// 锁定用户列表 /// public static IList lockUserList = new List(); #region 测试 static OnlineUsers() { //onlineUserList.Add(new OnlineUserInfo() //{ // UserName = "00-00-00-00-00-00-00-E0", // Sign = "00000000000000E0", // RequestTime = DateTime.Now //}); //onlineUserList.Add(new OnlineUserInfo() //{ // UserName = "FF-00-00-00-00-00-00-E0", // Sign = "FF000000000000E0", // RequestTime = DateTime.Now //}); //lockUserList.Add(new OnlineUserInfo() { UserName = "FF-00-00-00-00-00-00-E0" }); } #endregion private static object lockObject = new object(); /// /// 检查用户是否锁定 /// /// /// public static bool CheckUserLock(OnlineUserInfo user) { ClearLockOnlineUser(); if (IsLockUser(user.UserName)) return true; lock (lockObject) { if (TVConfigs.GetConfig().ApiCallTimes < UserApiCycle(user)) { lock (lockObject) { lockUserList.Add(new OnlineUserInfo() { UserName = user.UserName, Sign = user.Sign, RequestTime = user.RequestTime }); } CB.Common.FileUtil.WriteLog("用户被锁定"); return true; } } return false; } /// /// 判断用户是否是锁定用户 /// /// /// private static bool IsLockUser(string userName) { foreach (var item in lockUserList) { if (item.UserName == userName) return true; } return false; } /// /// 清楚过期锁定用户 /// private static void ClearLockOnlineUser() { lock (lockObject) { var now = DateTime.Now; IList _user = new List(); foreach (var item in lockUserList) { if (item.RequestTime.AddMinutes(TVConfigs.GetConfig().UnLockTime) >= now) _user.Add(item); } lockUserList = _user; } } /// /// 用户访问API频率 /// /// /// 0:首次访问用户;用户访问频率 private static int UserApiCycle(OnlineUserInfo user) { ClearOnlineUser(); return UpdateOnlineUser(user); } /// /// 更新在线用户信息,并返回用户访问API频率 /// /// /// 用户每分钟访问API接口频率 public static int UpdateOnlineUser(OnlineUserInfo user) { lock (lockObject) { onlineUserList.Add(new OnlineUserInfo() { UserName = user.UserName, Sign = user.Sign, RequestTime = user.RequestTime }); int userCount = 0; var now = DateTime.Now; foreach (var item in onlineUserList) { if (user.UserName == item.UserName && user.RequestTime.AddMinutes(TVConfigs.GetConfig().ApiCallCycle) >= now) userCount++; } return userCount / TVConfigs.GetConfig().ApiCallCycle; } } /// /// 清楚过期用户 /// /// private static void ClearOnlineUser() { lock (lockObject) { var now = DateTime.Now; IList _user = new List(); foreach (var item in onlineUserList) { if (item.RequestTime.AddMinutes(TVConfigs.GetConfig().ClearOnlineUserTime) >= now) _user.Add(item); } onlineUserList = _user; } } /// /// 手动锁定用户 /// /// 要锁定的用户 public static bool AdminLockOnlineUser(OnlineUserInfo User) { lock (lockObject) { bool isExist = false; foreach (var Item in lockUserList) { if (Item.UserName == User.UserName) { isExist = true; } } if (!isExist) { lockUserList.Add(User); return true; } return false; } } /// /// 手动解锁用户 /// /// 要解锁的用户 public static bool AdminUnLockOnlineUser(OnlineUserInfo User) { lock (lockObject) { foreach (var item in lockUserList) { if (item.UserName == User.UserName) { return lockUserList.Remove(item); } } return false; } } } }