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;
}
}
}
}