添加PackMsg事件,补充注释信息

This commit is contained in:
梅浩东
2024-03-29 11:20:17 +08:00
parent 0d514811bd
commit 76bc47283c
+79 -44
View File
@@ -25,20 +25,15 @@ namespace BarrageGrab
/// </summary> /// </summary>
public class WsBarrageService public class WsBarrageService
{ {
WebSocketServer socketServer; WebSocketServer socketServer; //Ws服务器对象
Dictionary<string, UserState> socketList = new Dictionary<string, UserState>(); Dictionary<string, UserState> socketList = new Dictionary<string, UserState>(); //客户端列表
//礼物计数缓存 ConcurrentDictionary<string, Tuple<int, DateTime>> giftCountCache = new ConcurrentDictionary<string, Tuple<int, DateTime>>();//礼物计数缓存
ConcurrentDictionary<string, Tuple<int, DateTime>> giftCountCache = new ConcurrentDictionary<string, Tuple<int, DateTime>>(); Timer dieout = new Timer(10000);//离线客户端清理计时器
Timer dieout = new Timer(10000); Timer giftCountTimer = new Timer(10000);//礼物缓存清理计时器
Timer giftCountTimer = new Timer(10000); WssBarrageGrab grab = new WssBarrageGrab();//弹幕解析器核心
WssBarrageGrab grab = new WssBarrageGrab(); Appsetting Appsetting = Appsetting.Current;//全局配置文件实例
Appsetting Appsetting = Appsetting.Current; static int printCount = 0; //控制台输出计数,用于判断清理控制台
bool debug = false;
/// <summary>
/// 服务关闭后触发
/// </summary>
public event EventHandler OnClose;
/// <summary> /// <summary>
/// WS服务器启动地址 /// WS服务器启动地址
@@ -55,11 +50,18 @@ namespace BarrageGrab
/// </summary> /// </summary>
public event EventHandler<PrintEventArgs> OnPrint; public event EventHandler<PrintEventArgs> OnPrint;
/// <summary>
/// 服务关闭后触发
/// </summary>
public event EventHandler OnClose;
/// <summary>
/// 消息包装完成后触发
/// </summary>
public event EventHandler<PackMsgEventArgs> OnPackMessage;
public WsBarrageService() public WsBarrageService()
{ {
#if DEBUG
debug = true;
#endif
var socket = new WebSocketServer($"ws://0.0.0.0:{Appsetting.WsProt}"); var socket = new WebSocketServer($"ws://0.0.0.0:{Appsetting.WsProt}");
socket.RestartAfterListenError = true;//异常重启 socket.RestartAfterListenError = true;//异常重启
@@ -81,6 +83,7 @@ namespace BarrageGrab
giftCountTimer.Start(); giftCountTimer.Start();
} }
//礼物缓存清理计时器回调
private void GiftCountTimer_Elapsed(object sender, ElapsedEventArgs e) private void GiftCountTimer_Elapsed(object sender, ElapsedEventArgs e)
{ {
var now = DateTime.Now; var now = DateTime.Now;
@@ -91,12 +94,21 @@ namespace BarrageGrab
{ {
timeOutKeys.ForEach(key => timeOutKeys.ForEach(key =>
{ {
Tuple<int, DateTime> _;
giftCountCache.TryRemove(key, out _); giftCountCache.TryRemove(key, out _);
}); });
} }
} }
//心跳淘汰计时器回调
private void Dieout_Elapsed(object sender, ElapsedEventArgs e)
{
var now = DateTime.Now;
var dieoutKvs = socketList.Where(w => w.Value.LastPing.AddSeconds(dieout.Interval * 3) < now).ToList();
dieoutKvs.ForEach(f => f.Value.Socket.Close());
}
//判断Rommid是否符合拦截规则
private bool CheckRoomId(long roomid) private bool CheckRoomId(long roomid)
{ {
if (!Appsetting.Current.WebRoomIds.Any()) return true; if (!Appsetting.Current.WebRoomIds.Any()) return true;
@@ -141,7 +153,7 @@ namespace BarrageGrab
return user; return user;
} }
static int count = 0; //打印消息
private void PrintMsg(Msg msg, PackMsgType barType) private void PrintMsg(Msg msg, PackMsgType barType)
{ {
var rinfo = AppRuntime.RoomCaches.GetCachedWebRoomInfo(msg.RoomId.ToString()); var rinfo = AppRuntime.RoomCaches.GetCachedWebRoomInfo(msg.RoomId.ToString());
@@ -179,15 +191,28 @@ namespace BarrageGrab
MsgType = barType MsgType = barType
}); });
if (++count > 10000) if (++printCount > 10000)
{ {
Console.Clear(); Console.Clear();
Logger.PrintColor("控制台已清理"); Logger.PrintColor("控制台已清理");
count = 0; printCount = 0;
} }
Logger.PrintColor(text + "\n", color); Logger.PrintColor(text + "\n", color);
} }
//发送消息包装事件
private void FirePack(Msg msg, PackMsgType barType)
{
if (OnPackMessage == null) return;
var arg = new PackMsgEventArgs()
{
MsgType = barType,
Message = msg
};
//异步执行
Task.Run(() => OnPackMessage(this, arg));
}
//粉丝团 //粉丝团
private void Grab_OnFansclubMessage(object sender, WssBarrageGrab.RoomMessageEventArgs<FansclubMessage> e) private void Grab_OnFansclubMessage(object sender, WssBarrageGrab.RoomMessageEventArgs<FansclubMessage> e)
{ {
@@ -205,6 +230,7 @@ namespace BarrageGrab
enty.Level = enty.User.FansClub.Level; enty.Level = enty.User.FansClub.Level;
var msgType = PackMsgType.粉丝团消息; var msgType = PackMsgType.粉丝团消息;
FirePack(enty, msgType);
PrintMsg(enty, msgType); PrintMsg(enty, msgType);
Broadcast(new BarrageMsgPack(enty.ToJson(), msgType, e.Process)); Broadcast(new BarrageMsgPack(enty.ToJson(), msgType, e.Process));
} }
@@ -228,6 +254,7 @@ namespace BarrageGrab
}; };
var msgType = PackMsgType.直播间统计; var msgType = PackMsgType.直播间统计;
FirePack(enty, msgType);
PrintMsg(enty, msgType); PrintMsg(enty, msgType);
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process); var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process);
Broadcast(pack); Broadcast(pack);
@@ -252,6 +279,7 @@ namespace BarrageGrab
//清除缓存中的key //清除缓存中的key
if (msg.groupId > 0 && giftCountCache.ContainsKey(key)) if (msg.groupId > 0 && giftCountCache.ContainsKey(key))
{ {
Tuple<int, DateTime> _;
giftCountCache.TryRemove(key, out _); giftCountCache.TryRemove(key, out _);
} }
return; return;
@@ -297,7 +325,7 @@ namespace BarrageGrab
GiftId = msg.giftId, GiftId = msg.giftId,
GiftName = msg.Gift.Name, GiftName = msg.Gift.Name,
Combo = msg.Gift.Combo, Combo = msg.Gift.Combo,
ImgUrl = msg.Gift.Image?.urlLists?.FirstOrDefault()??"", ImgUrl = msg.Gift.Image?.urlLists?.FirstOrDefault() ?? "",
User = GetUser(msg.User), User = GetUser(msg.User),
ToUser = GetUser(msg.toUser) ToUser = GetUser(msg.toUser)
}; };
@@ -308,6 +336,7 @@ namespace BarrageGrab
} }
var msgType = PackMsgType.礼物消息; var msgType = PackMsgType.礼物消息;
FirePack(enty, msgType);
PrintMsg(enty, msgType); PrintMsg(enty, msgType);
var pack = new BarrageMsgPack(enty.ToJson(), PackMsgType.礼物消息, e.Process); var pack = new BarrageMsgPack(enty.ToJson(), PackMsgType.礼物消息, e.Process);
Broadcast(pack); Broadcast(pack);
@@ -329,6 +358,7 @@ namespace BarrageGrab
}; };
var msgType = PackMsgType.关注消息; var msgType = PackMsgType.关注消息;
FirePack(enty, msgType);
PrintMsg(enty, msgType); PrintMsg(enty, msgType);
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process); var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process);
var json = JsonConvert.SerializeObject(pack); var json = JsonConvert.SerializeObject(pack);
@@ -358,6 +388,7 @@ namespace BarrageGrab
}; };
var msgType = PackMsgType.直播间分享; var msgType = PackMsgType.直播间分享;
FirePack(enty, msgType);
PrintMsg(enty, msgType); PrintMsg(enty, msgType);
//shareTarget: (112:好友),(1微信)(2朋友圈)(3微博)(5:qq)(4:qq空间),shareType: 1 //shareTarget: (112:好友),(1微信)(2朋友圈)(3微博)(5:qq)(4:qq空间),shareType: 1
@@ -383,6 +414,7 @@ namespace BarrageGrab
}; };
var msgType = PackMsgType.进直播间; var msgType = PackMsgType.进直播间;
FirePack(enty, msgType);
PrintMsg(enty, msgType); PrintMsg(enty, msgType);
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process); var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process);
var json = JsonConvert.SerializeObject(pack); var json = JsonConvert.SerializeObject(pack);
@@ -407,6 +439,7 @@ namespace BarrageGrab
}; };
var msgType = PackMsgType.点赞消息; var msgType = PackMsgType.点赞消息;
FirePack(enty, msgType);
PrintMsg(enty, msgType); PrintMsg(enty, msgType);
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process); var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process);
Broadcast(pack); Broadcast(pack);
@@ -428,6 +461,7 @@ namespace BarrageGrab
}; };
var msgType = PackMsgType.弹幕消息; var msgType = PackMsgType.弹幕消息;
FirePack(enty, msgType);
PrintMsg(enty, msgType); PrintMsg(enty, msgType);
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process); var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process);
@@ -453,6 +487,7 @@ namespace BarrageGrab
}; };
var msgType = PackMsgType.下播; var msgType = PackMsgType.下播;
FirePack(enty, msgType);
PrintMsg(enty, msgType); PrintMsg(enty, msgType);
pack = new BarrageMsgPack(enty.ToJson(), PackMsgType.下播, e.Process); pack = new BarrageMsgPack(enty.ToJson(), PackMsgType.下播, e.Process);
} }
@@ -463,29 +498,7 @@ namespace BarrageGrab
} }
} }
//static int count = 0; //监听用户连接
//private void Print(string msg, ConsoleColor color, PackMsgType bartype)
//{
// if (!Appsetting.PrintFilter.Any(a => a == bartype.GetHashCode())) return;
// if (Appsetting.PrintBarrage)
// {
// if (++count > 1000)
// {
// Console.Clear();
// Logger.PrintColor("控制台已清理");
// }
// Logger.PrintColor($"{DateTime.Now.ToString("HH:mm:ss")} [{bartype.ToString()}] " + msg + "\n", color);
// count = 0;
// }
//}
private void Dieout_Elapsed(object sender, ElapsedEventArgs e)
{
var now = DateTime.Now;
var dieoutKvs = socketList.Where(w => w.Value.LastPing.AddSeconds(dieout.Interval * 3) < now).ToList();
dieoutKvs.ForEach(f => f.Value.Socket.Close());
}
private void Listen(IWebSocketConnection socket) private void Listen(IWebSocketConnection socket)
{ {
//客户端url //客户端url
@@ -594,6 +607,9 @@ namespace BarrageGrab
this.OnClose?.Invoke(this, EventArgs.Empty); this.OnClose?.Invoke(this, EventArgs.Empty);
} }
/// <summary>
/// 客户端套接字上下文
/// </summary>
class UserState class UserState
{ {
/// <summary> /// <summary>
@@ -616,6 +632,9 @@ namespace BarrageGrab
} }
} }
/// <summary>
/// Print事件参数
/// </summary>
public class PrintEventArgs : EventArgs public class PrintEventArgs : EventArgs
{ {
public string Message { get; set; } public string Message { get; set; }
@@ -624,5 +643,21 @@ namespace BarrageGrab
public PackMsgType MsgType { get; set; } public PackMsgType MsgType { get; set; }
} }
/// <summary>
/// 消息包事件参数
/// </summary>
public class PackMsgEventArgs
{
/// <summary>
/// 消息类型
/// </summary>
public PackMsgType MsgType { get; set; }
/// <summary>
/// 消息内容
/// </summary>
public Msg Message { get; set; }
}
} }
} }