2026-08-04 00:10:33 +08:00
|
|
|
using System;
|
2025-04-14 15:16:55 +08:00
|
|
|
using System.Collections.Concurrent;
|
2022-10-06 17:44:08 +08:00
|
|
|
using System.Collections.Generic;
|
2025-04-14 15:16:55 +08:00
|
|
|
using System.Drawing;
|
|
|
|
|
using System.Dynamic;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.IO.Compression;
|
2022-10-06 17:44:08 +08:00
|
|
|
using System.Linq;
|
2023-08-17 20:37:22 +08:00
|
|
|
using System.Net;
|
2025-04-14 15:16:55 +08:00
|
|
|
using System.Net.Http;
|
2022-10-06 17:44:08 +08:00
|
|
|
using System.Net.WebSockets;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using System.Timers;
|
2023-08-17 20:37:22 +08:00
|
|
|
using BarrageGrab.Modles;
|
|
|
|
|
using BarrageGrab.Modles.JsonEntity;
|
|
|
|
|
using BarrageGrab.Modles.ProtoEntity;
|
2026-04-09 22:47:04 +08:00
|
|
|
using BarrageGrab.Proxy.ProxyEventArgs;
|
2025-04-14 15:16:55 +08:00
|
|
|
using Fleck;
|
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
using Newtonsoft.Json.Linq;
|
2025-01-12 13:54:21 +08:00
|
|
|
using static BarrageGrab.Modles.ProtoEntity.Image;
|
|
|
|
|
using static BarrageGrab.Modles.WebCastGift;
|
2022-10-06 17:44:08 +08:00
|
|
|
|
|
|
|
|
namespace BarrageGrab
|
|
|
|
|
{
|
2024-03-29 17:34:14 +08:00
|
|
|
/// <summary>
|
|
|
|
|
/// WsBarrageServer 包装消息事件委托
|
|
|
|
|
/// </summary>
|
|
|
|
|
public delegate void PackMessageEventHandler(WsBarrageServer sender, WsBarrageServer.PackMsgEventArgs e);
|
|
|
|
|
|
2022-10-06 17:44:08 +08:00
|
|
|
/// <summary>
|
|
|
|
|
/// 弹幕服务
|
|
|
|
|
/// </summary>
|
2024-04-26 00:44:44 +08:00
|
|
|
public class WsBarrageServer : IDisposable
|
2023-12-17 23:56:10 +08:00
|
|
|
{
|
2024-03-29 11:20:17 +08:00
|
|
|
WebSocketServer socketServer; //Ws服务器对象
|
|
|
|
|
Dictionary<string, UserState> socketList = new Dictionary<string, UserState>(); //客户端列表
|
|
|
|
|
ConcurrentDictionary<string, Tuple<int, DateTime>> giftCountCache = new ConcurrentDictionary<string, Tuple<int, DateTime>>();//礼物计数缓存
|
|
|
|
|
Timer dieout = new Timer(10000);//离线客户端清理计时器
|
|
|
|
|
Timer giftCountTimer = new Timer(10000);//礼物缓存清理计时器
|
2026-08-04 00:10:33 +08:00
|
|
|
WssBarrageGrab grab = new WssBarrageGrab();//抖音弹幕解析器核心
|
|
|
|
|
KsBarrageGrab ksGrab = new KsBarrageGrab();//快手弹幕解析器核心
|
|
|
|
|
BiliBarrageGrab biliGrab = new BiliBarrageGrab();//B站弹幕解析器核心
|
2024-12-27 20:05:50 +08:00
|
|
|
AppSetting Appsetting = AppSetting.Current;//全局配置文件实例
|
2024-03-29 11:20:17 +08:00
|
|
|
static int printCount = 0; //控制台输出计数,用于判断清理控制台
|
2023-08-17 20:37:22 +08:00
|
|
|
|
2023-11-16 09:26:40 +08:00
|
|
|
/// <summary>
|
|
|
|
|
/// WS服务器启动地址
|
|
|
|
|
/// </summary>
|
2024-03-29 17:34:14 +08:00
|
|
|
public string ServerLocation => socketServer.Location;
|
2023-11-16 09:26:40 +08:00
|
|
|
|
2023-11-23 16:43:21 +08:00
|
|
|
/// <summary>
|
|
|
|
|
/// 数据内核
|
|
|
|
|
/// </summary>
|
2024-04-26 00:44:44 +08:00
|
|
|
public WssBarrageGrab Grab => grab;
|
2023-11-23 16:43:21 +08:00
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 控制台打印事件
|
|
|
|
|
/// </summary>
|
|
|
|
|
public event EventHandler<PrintEventArgs> OnPrint;
|
|
|
|
|
|
2024-03-29 17:34:14 +08:00
|
|
|
/// <summary>
|
|
|
|
|
/// 是否已经释放资源
|
|
|
|
|
/// </summary>
|
|
|
|
|
public bool IsDisposed { get; private set; } = false;
|
|
|
|
|
|
2024-03-29 11:20:17 +08:00
|
|
|
/// <summary>
|
|
|
|
|
/// 服务关闭后触发
|
|
|
|
|
/// </summary>
|
|
|
|
|
public event EventHandler OnClose;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 消息包装完成后触发
|
|
|
|
|
/// </summary>
|
2024-03-29 17:34:14 +08:00
|
|
|
public event PackMessageEventHandler OnPackMessage;
|
2024-03-29 11:20:17 +08:00
|
|
|
|
2024-03-29 11:30:39 +08:00
|
|
|
public WsBarrageServer()
|
2022-10-06 17:44:08 +08:00
|
|
|
{
|
2023-08-17 20:37:22 +08:00
|
|
|
var socket = new WebSocketServer($"ws://0.0.0.0:{Appsetting.WsProt}");
|
2022-10-06 17:44:08 +08:00
|
|
|
socket.RestartAfterListenError = true;//异常重启
|
|
|
|
|
|
|
|
|
|
dieout.Elapsed += Dieout_Elapsed;
|
2023-04-09 22:03:42 +08:00
|
|
|
giftCountTimer.Elapsed += GiftCountTimer_Elapsed;
|
2022-10-06 17:44:08 +08:00
|
|
|
|
|
|
|
|
this.grab.OnChatMessage += Grab_OnChatMessage;
|
|
|
|
|
this.grab.OnLikeMessage += Grab_OnLikeMessage;
|
|
|
|
|
this.grab.OnMemberMessage += Grab_OnMemberMessage;
|
|
|
|
|
this.grab.OnSocialMessage += Grab_OnSocialMessage;
|
2023-04-09 22:03:42 +08:00
|
|
|
this.grab.OnSocialMessage += Grab_OnShardMessage;
|
2022-10-06 17:44:08 +08:00
|
|
|
this.grab.OnGiftMessage += Grab_OnGiftMessage;
|
2022-11-05 16:38:08 +08:00
|
|
|
this.grab.OnRoomUserSeqMessage += Grab_OnRoomUserSeqMessage;
|
|
|
|
|
this.grab.OnFansclubMessage += Grab_OnFansclubMessage; ;
|
2023-04-09 22:03:42 +08:00
|
|
|
this.grab.OnControlMessage += Grab_OnControlMessage;
|
2026-04-09 22:47:04 +08:00
|
|
|
this.grab.Proxy.OnLiveCompanAction += Proxy_OnLiveCompanAction;
|
2022-10-06 17:44:08 +08:00
|
|
|
|
2026-08-04 00:10:33 +08:00
|
|
|
//快手事件订阅
|
|
|
|
|
this.ksGrab.OnChatMessage += KsGrab_OnChatMessage;
|
|
|
|
|
this.ksGrab.OnLikeMessage += KsGrab_OnLikeMessage;
|
|
|
|
|
this.ksGrab.OnGiftMessage += KsGrab_OnGiftMessage;
|
|
|
|
|
this.ksGrab.OnShareMessage += KsGrab_OnShareMessage;
|
|
|
|
|
this.ksGrab.OnRoomStatsMessage += KsGrab_OnRoomStatsMessage;
|
|
|
|
|
|
|
|
|
|
//B站事件订阅
|
|
|
|
|
this.biliGrab.OnChatMessage += BiliGrab_OnChatMessage;
|
|
|
|
|
this.biliGrab.OnLikeMessage += BiliGrab_OnLikeMessage;
|
|
|
|
|
this.biliGrab.OnGiftMessage += BiliGrab_OnGiftMessage;
|
|
|
|
|
this.biliGrab.OnInteractMessage += BiliGrab_OnInteractMessage;
|
|
|
|
|
this.biliGrab.OnShareMessage += BiliGrab_OnShareMessage;
|
|
|
|
|
this.biliGrab.OnRoomStatsMessage += BiliGrab_OnRoomStatsMessage;
|
|
|
|
|
|
|
|
|
|
//多平台WS数据路由 - 将代理收到的WS数据按平台分发到对应解析器
|
|
|
|
|
this.grab.Proxy.OnWebSocketData += (s, e) =>
|
|
|
|
|
{
|
|
|
|
|
if (e.Platform == LivePlatform.Kuaishou)
|
|
|
|
|
{
|
|
|
|
|
this.ksGrab.HandleWebSocketData(e);
|
|
|
|
|
}
|
|
|
|
|
else if (e.Platform == LivePlatform.Bilibili)
|
|
|
|
|
{
|
|
|
|
|
this.biliGrab.HandleWebSocketData(e);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//B站发送数据路由 - 解析AUTH认证包提取roomid
|
|
|
|
|
this.grab.Proxy.OnWebSocketSentData += (s, e) =>
|
|
|
|
|
{
|
|
|
|
|
if (e.Platform == LivePlatform.Bilibili)
|
|
|
|
|
{
|
|
|
|
|
this.biliGrab.HandleSentData(e);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2022-10-06 17:44:08 +08:00
|
|
|
this.socketServer = socket;
|
|
|
|
|
//dieout.Start();
|
2023-04-09 22:03:42 +08:00
|
|
|
giftCountTimer.Start();
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-09 22:47:04 +08:00
|
|
|
|
|
|
|
|
|
2024-03-29 11:20:17 +08:00
|
|
|
//礼物缓存清理计时器回调
|
2023-04-09 22:03:42 +08:00
|
|
|
private void GiftCountTimer_Elapsed(object sender, ElapsedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
var now = DateTime.Now;
|
2023-04-10 20:39:49 +08:00
|
|
|
var timeOutKeys = giftCountCache.Where(w => w.Value.Item2 < now.AddSeconds(-10) || w.Value == null).Select(s => s.Key).ToList();
|
2023-04-09 22:03:42 +08:00
|
|
|
|
|
|
|
|
//淘汰过期的礼物计数缓存
|
|
|
|
|
lock (giftCountCache)
|
|
|
|
|
{
|
|
|
|
|
timeOutKeys.ForEach(key =>
|
|
|
|
|
{
|
2024-03-29 11:20:17 +08:00
|
|
|
Tuple<int, DateTime> _;
|
2024-03-10 03:44:13 +08:00
|
|
|
giftCountCache.TryRemove(key, out _);
|
2023-04-09 22:03:42 +08:00
|
|
|
});
|
|
|
|
|
}
|
2022-10-06 17:44:08 +08:00
|
|
|
}
|
|
|
|
|
|
2024-03-29 11:20:17 +08:00
|
|
|
//心跳淘汰计时器回调
|
|
|
|
|
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是否符合拦截规则
|
2023-03-09 00:33:03 +08:00
|
|
|
private bool CheckRoomId(long roomid)
|
|
|
|
|
{
|
2024-03-29 17:46:24 +08:00
|
|
|
if (!AppSetting.Current.WebRoomIds.Any()) return true;
|
2024-03-10 03:44:13 +08:00
|
|
|
|
|
|
|
|
var webrid = AppRuntime.RoomCaches.GetCachedWebRoomid(roomid.ToString());
|
2024-04-26 00:44:44 +08:00
|
|
|
if (webrid.IsNullOrWhiteSpace()) return true;
|
|
|
|
|
if (webrid == "未知") return true;
|
2024-03-29 11:20:17 +08:00
|
|
|
|
2024-03-29 17:46:24 +08:00
|
|
|
return AppSetting.Current.WebRoomIds.Contains(webrid);
|
2023-03-09 00:33:03 +08:00
|
|
|
}
|
2023-11-14 20:29:18 +08:00
|
|
|
|
2023-03-09 00:33:03 +08:00
|
|
|
//解析用户
|
2023-08-17 20:37:22 +08:00
|
|
|
private MsgUser GetUser(User data)
|
2022-10-06 17:44:08 +08:00
|
|
|
{
|
2023-12-17 23:56:10 +08:00
|
|
|
if (data == null) return null;
|
2022-10-06 17:44:08 +08:00
|
|
|
MsgUser user = new MsgUser()
|
|
|
|
|
{
|
2023-03-09 00:33:03 +08:00
|
|
|
DisplayId = data.displayId,
|
2023-04-24 21:39:22 +08:00
|
|
|
ShortId = data.shortId,
|
2023-03-09 00:33:03 +08:00
|
|
|
Gender = data.Gender,
|
|
|
|
|
Id = data.Id,
|
|
|
|
|
Level = data.Level,
|
2023-12-17 23:56:10 +08:00
|
|
|
PayLevel = (int)(data.payGrade?.Level ?? -1),
|
|
|
|
|
Nickname = data.Nickname ?? "用户" + data.displayId,
|
|
|
|
|
HeadImgUrl = data.avatarThumb?.urlLists?.FirstOrDefault() ?? "",
|
2023-04-24 21:39:22 +08:00
|
|
|
SecUid = data.sec_uid,
|
2023-12-17 23:56:10 +08:00
|
|
|
FollowerCount = data.followInfo?.followerCount ?? -1,
|
|
|
|
|
FollowingCount = data.followInfo?.followingCount ?? -1,
|
|
|
|
|
FollowStatus = data.followInfo?.followStatus ?? -1,
|
2022-10-06 17:44:08 +08:00
|
|
|
};
|
2023-04-01 00:07:17 +08:00
|
|
|
user.FansClub = new FansClubInfo()
|
2023-03-28 23:06:09 +08:00
|
|
|
{
|
2023-04-01 00:07:17 +08:00
|
|
|
ClubName = "",
|
|
|
|
|
Level = 0
|
|
|
|
|
};
|
|
|
|
|
|
2023-04-10 20:39:49 +08:00
|
|
|
if (data.fansClub != null && data.fansClub.Data != null)
|
2023-04-01 00:07:17 +08:00
|
|
|
{
|
|
|
|
|
user.FansClub.ClubName = data.fansClub.Data.clubName;
|
2023-04-24 21:39:22 +08:00
|
|
|
user.FansClub.Level = data.fansClub.Data.Level;
|
2023-03-28 23:06:09 +08:00
|
|
|
}
|
|
|
|
|
|
2022-10-06 17:44:08 +08:00
|
|
|
return user;
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-12 13:54:21 +08:00
|
|
|
//检查属性定义
|
|
|
|
|
private bool HasProperty(dynamic obj, string propertyName)
|
|
|
|
|
{
|
|
|
|
|
if (obj is ExpandoObject)
|
|
|
|
|
{
|
|
|
|
|
return ((IDictionary<string, object>)obj).ContainsKey(propertyName);
|
|
|
|
|
}
|
|
|
|
|
return obj.GetType().GetProperty(propertyName) != null;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-14 16:18:49 +08:00
|
|
|
//创建消息对象
|
2025-01-12 13:54:21 +08:00
|
|
|
private T CreateMsg<T>(dynamic msg) where T : Msg, new()
|
|
|
|
|
{
|
|
|
|
|
var roomid = msg.Common.roomId.ToString();
|
|
|
|
|
RoomInfo roomInfo = AppRuntime.RoomCaches.GetCachedWebRoomInfo(roomid);
|
|
|
|
|
|
|
|
|
|
//判断 Common 属性是否存在
|
|
|
|
|
var hasUser = HasProperty(msg, nameof(msg.User));
|
|
|
|
|
|
|
|
|
|
var enty = new T()
|
|
|
|
|
{
|
|
|
|
|
MsgId = msg.Common?.msgId,
|
|
|
|
|
RoomId = roomid,
|
2025-04-30 21:48:45 +08:00
|
|
|
WebRoomId = roomInfo?.WebRoomId ?? "",
|
|
|
|
|
RoomTitle = roomInfo?.Title ?? "",
|
|
|
|
|
IsAnonymous = roomInfo?.IsAnonymous ?? false,
|
2025-01-12 13:54:21 +08:00
|
|
|
Appid = msg.Common.appId.ToString(),
|
|
|
|
|
User = hasUser ? GetUser(msg.User) : null,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//判断是否是直播间管理员
|
|
|
|
|
if (enty.User != null && roomInfo != null && roomInfo.AdminUserIds.Any())
|
|
|
|
|
{
|
|
|
|
|
enty.User.IsAdmin = roomInfo.AdminUserIds.Contains(enty.User.Id.ToString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//判断是否是主播
|
|
|
|
|
if (enty.User != null && roomInfo != null && roomInfo.Owner != null)
|
|
|
|
|
{
|
|
|
|
|
enty.User.IsAnchor = enty.User.Id.ToString() == roomInfo.Owner.UserId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return enty;
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-29 11:20:17 +08:00
|
|
|
//打印消息
|
2023-09-24 12:47:55 +08:00
|
|
|
private void PrintMsg(Msg msg, PackMsgType barType)
|
2023-12-17 23:56:10 +08:00
|
|
|
{
|
2023-09-24 12:47:55 +08:00
|
|
|
var rinfo = AppRuntime.RoomCaches.GetCachedWebRoomInfo(msg.RoomId.ToString());
|
2024-09-28 15:39:00 +08:00
|
|
|
var roomName = (rinfo?.Owner?.Nickname ?? ((msg.WebRoomId.IsNullOrWhiteSpace() ? msg.RoomId.ToString() : msg.WebRoomId)));
|
2025-01-12 13:54:21 +08:00
|
|
|
var isAdmin = msg.User != null && msg.User.IsAdmin;
|
|
|
|
|
var isAnchor = msg.User != null && msg.User.IsAnchor;
|
|
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
var text = $"{DateTime.Now.ToString("HH:mm:ss")} [{roomName}] [{barType}]";
|
|
|
|
|
|
2025-01-12 13:54:21 +08:00
|
|
|
if (isAdmin)
|
|
|
|
|
{
|
2025-04-14 15:16:55 +08:00
|
|
|
text += " [管理员]";
|
2025-01-12 13:54:21 +08:00
|
|
|
}
|
|
|
|
|
|
2025-04-14 15:16:55 +08:00
|
|
|
if (isAnchor)
|
2025-01-12 13:54:21 +08:00
|
|
|
{
|
|
|
|
|
text += " [主播]";
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
if (msg.User != null)
|
|
|
|
|
{
|
|
|
|
|
text += $" [{msg.User?.GenderToString()}] ";
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-29 17:46:24 +08:00
|
|
|
ConsoleColor color = AppSetting.Current.ColorMap[barType].Item1;
|
2023-09-24 12:47:55 +08:00
|
|
|
var append = msg.Content;
|
|
|
|
|
switch (barType)
|
|
|
|
|
{
|
2023-12-17 23:56:10 +08:00
|
|
|
case PackMsgType.弹幕消息: append = $"{msg?.User?.Nickname}: {msg.Content}"; break;
|
|
|
|
|
case PackMsgType.下播: append = $"直播已结束"; break;
|
2023-09-24 12:47:55 +08:00
|
|
|
default: break;
|
|
|
|
|
}
|
2023-12-17 23:56:10 +08:00
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
text += append;
|
|
|
|
|
|
2024-03-29 17:46:24 +08:00
|
|
|
if (AppSetting.Current.BarrageLog)
|
2023-11-23 16:43:21 +08:00
|
|
|
{
|
|
|
|
|
Logger.LogBarrage(barType, msg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!Appsetting.PrintBarrage) return;
|
2024-03-29 17:46:24 +08:00
|
|
|
if (AppSetting.Current.PrintFilter.Any() && !AppSetting.Current.PrintFilter.Contains(barType.GetHashCode())) return;
|
2023-11-23 16:43:21 +08:00
|
|
|
|
|
|
|
|
OnPrint?.Invoke(this, new PrintEventArgs()
|
|
|
|
|
{
|
|
|
|
|
Color = color,
|
|
|
|
|
Message = text,
|
|
|
|
|
MsgType = barType
|
|
|
|
|
});
|
|
|
|
|
|
2024-03-29 11:20:17 +08:00
|
|
|
if (++printCount > 10000)
|
2023-09-24 12:47:55 +08:00
|
|
|
{
|
|
|
|
|
Console.Clear();
|
2024-03-10 03:44:13 +08:00
|
|
|
Logger.PrintColor("控制台已清理");
|
2024-03-29 11:20:17 +08:00
|
|
|
printCount = 0;
|
2023-09-24 12:47:55 +08:00
|
|
|
}
|
2024-03-10 03:44:13 +08:00
|
|
|
Logger.PrintColor(text + "\n", color);
|
2023-09-24 12:47:55 +08:00
|
|
|
}
|
|
|
|
|
|
2024-03-29 11:20:17 +08:00
|
|
|
//发送消息包装事件
|
2024-03-29 17:34:14 +08:00
|
|
|
private async void FirePack(Msg msg, PackMsgType barType)
|
2024-03-29 11:20:17 +08:00
|
|
|
{
|
|
|
|
|
if (OnPackMessage == null) return;
|
|
|
|
|
var arg = new PackMsgEventArgs()
|
|
|
|
|
{
|
|
|
|
|
MsgType = barType,
|
|
|
|
|
Message = msg
|
|
|
|
|
};
|
|
|
|
|
//异步执行
|
2024-03-29 17:34:14 +08:00
|
|
|
OnPackMessage(this, arg);
|
2024-03-29 11:20:17 +08:00
|
|
|
}
|
|
|
|
|
|
2024-04-26 00:55:47 +08:00
|
|
|
//附加房间信息
|
|
|
|
|
private void AttachRoomInfo(Msg msg)
|
|
|
|
|
{
|
2025-01-12 13:54:21 +08:00
|
|
|
if (msg == null) return;
|
2024-04-26 00:55:47 +08:00
|
|
|
var roomInfo = AppRuntime.RoomCaches.GetCachedWebRoomInfo(msg.RoomId.ToString());
|
2025-04-30 21:48:45 +08:00
|
|
|
if (roomInfo == null) return;
|
|
|
|
|
|
2025-04-30 22:52:47 +08:00
|
|
|
if (roomInfo.Owner != null)
|
2024-04-26 00:55:47 +08:00
|
|
|
{
|
2025-04-30 22:52:47 +08:00
|
|
|
msg.Owner = new RoomAnchorInfo()
|
|
|
|
|
{
|
|
|
|
|
Nickname = roomInfo.Owner.Nickname,
|
|
|
|
|
HeadUrl = roomInfo.Owner.HeadUrl,
|
|
|
|
|
FollowStatus = roomInfo.Owner.FollowStatus,
|
|
|
|
|
SecUid = roomInfo.Owner.SecUid,
|
|
|
|
|
UserId = roomInfo.Owner.UserId
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-30 21:48:45 +08:00
|
|
|
|
2025-04-30 21:49:20 +08:00
|
|
|
if (msg.WebRoomId.IsNullOrWhiteSpace())
|
|
|
|
|
{
|
|
|
|
|
msg.WebRoomId = roomInfo.WebRoomId;
|
|
|
|
|
msg.RoomTitle = roomInfo.Title;
|
|
|
|
|
msg.IsAnonymous = roomInfo.IsAnonymous;
|
|
|
|
|
}
|
2024-04-26 00:55:47 +08:00
|
|
|
}
|
|
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
//粉丝团
|
|
|
|
|
private void Grab_OnFansclubMessage(object sender, WssBarrageGrab.RoomMessageEventArgs<FansclubMessage> e)
|
|
|
|
|
{
|
|
|
|
|
var msg = e.Message;
|
|
|
|
|
if (!CheckRoomId(msg.Common.roomId)) return;
|
2025-01-12 13:54:21 +08:00
|
|
|
var enty = CreateMsg<FansclubMsg>(msg);
|
|
|
|
|
|
|
|
|
|
enty.Content = msg.Content;
|
|
|
|
|
enty.Type = msg.Type;
|
2023-04-24 21:39:22 +08:00
|
|
|
enty.Level = enty.User.FansClub.Level;
|
2023-11-14 20:29:18 +08:00
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
var msgType = PackMsgType.粉丝团消息;
|
2024-04-26 00:55:47 +08:00
|
|
|
AttachRoomInfo(enty);
|
2024-03-29 11:20:17 +08:00
|
|
|
FirePack(enty, msgType);
|
2023-09-24 12:47:55 +08:00
|
|
|
PrintMsg(enty, msgType);
|
2023-11-14 20:29:18 +08:00
|
|
|
Broadcast(new BarrageMsgPack(enty.ToJson(), msgType, e.Process));
|
2022-11-05 16:38:08 +08:00
|
|
|
}
|
|
|
|
|
|
2023-03-09 00:33:03 +08:00
|
|
|
//统计消息
|
2023-09-24 12:47:55 +08:00
|
|
|
private void Grab_OnRoomUserSeqMessage(object sender, WssBarrageGrab.RoomMessageEventArgs<RoomUserSeqMessage> e)
|
2022-11-05 16:38:08 +08:00
|
|
|
{
|
2023-09-24 12:47:55 +08:00
|
|
|
var msg = e.Message;
|
|
|
|
|
if (!CheckRoomId(msg.Common.roomId)) return;
|
2025-01-12 13:54:21 +08:00
|
|
|
|
|
|
|
|
var enty = CreateMsg<UserSeqMsg>(msg);
|
|
|
|
|
enty.OnlineUserCount = msg.Total;
|
|
|
|
|
enty.TotalUserCount = msg.totalUser;
|
|
|
|
|
enty.TotalUserCountStr = msg.totalPvForAnchor;
|
|
|
|
|
enty.OnlineUserCountStr = msg.onlineUserForAnchor;
|
|
|
|
|
enty.Content = $"当前直播间人数 {msg.onlineUserForAnchor},累计直播间人数 {msg.totalPvForAnchor}";
|
2023-11-14 20:29:18 +08:00
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
var msgType = PackMsgType.直播间统计;
|
2024-04-26 00:55:47 +08:00
|
|
|
AttachRoomInfo(enty);
|
2024-03-29 11:20:17 +08:00
|
|
|
FirePack(enty, msgType);
|
2023-09-24 12:47:55 +08:00
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process);
|
|
|
|
|
Broadcast(pack);
|
2022-11-05 16:38:08 +08:00
|
|
|
}
|
2023-04-10 20:39:49 +08:00
|
|
|
|
2023-03-09 00:33:03 +08:00
|
|
|
//礼物
|
2023-09-24 12:47:55 +08:00
|
|
|
private void Grab_OnGiftMessage(object sender, WssBarrageGrab.RoomMessageEventArgs<GiftMessage> e)
|
2022-10-06 17:44:08 +08:00
|
|
|
{
|
2023-09-24 12:47:55 +08:00
|
|
|
var msg = e.Message;
|
|
|
|
|
if (!CheckRoomId(msg.Common.roomId)) return;
|
2023-04-10 20:39:49 +08:00
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
var key = msg.Common.roomId + "-" + msg.giftId + "-" + msg.groupId.ToString();
|
2023-04-10 20:39:49 +08:00
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
int currCount = (int)msg.repeatCount;
|
2024-03-10 03:44:13 +08:00
|
|
|
int lastCount = 0;
|
2024-04-26 00:44:44 +08:00
|
|
|
|
|
|
|
|
//纠正赋值礼物数据,比如是否连击,弹幕回送会不准确
|
2024-12-27 20:05:50 +08:00
|
|
|
//var findForData = giftData?.gifts?.FirstOrDefault(f => f.id == msg.giftId);
|
|
|
|
|
//if (findForData != null)
|
|
|
|
|
//{
|
|
|
|
|
// var ogift = msg.Gift;
|
|
|
|
|
// ogift.Name = findForData.name;
|
|
|
|
|
// ogift.Combo = findForData.combo;
|
|
|
|
|
// ogift.diamondCount = findForData.diamond_count;
|
|
|
|
|
// ogift.Name = findForData.name;
|
|
|
|
|
//}
|
2024-04-26 00:44:44 +08:00
|
|
|
|
2024-08-17 13:36:41 +08:00
|
|
|
//判断礼物重复
|
|
|
|
|
if (msg.repeatEnd == 1 && giftCountCache.ContainsKey(key))
|
2022-10-06 17:44:08 +08:00
|
|
|
{
|
2024-08-17 13:36:41 +08:00
|
|
|
//清除缓存中的key
|
2025-01-12 13:54:21 +08:00
|
|
|
if (msg.groupId > 0)
|
2023-04-09 22:03:42 +08:00
|
|
|
{
|
2024-08-17 13:36:41 +08:00
|
|
|
Tuple<int, DateTime> _;
|
|
|
|
|
giftCountCache.TryRemove(key, out _);
|
2024-03-10 03:44:13 +08:00
|
|
|
}
|
2024-08-17 13:36:41 +08:00
|
|
|
return;
|
2023-04-09 22:03:42 +08:00
|
|
|
}
|
2024-08-17 13:36:41 +08:00
|
|
|
var backward = currCount <= lastCount;
|
|
|
|
|
if (currCount <= 0) currCount = 1;
|
|
|
|
|
|
|
|
|
|
if (giftCountCache.ContainsKey(key))
|
|
|
|
|
{
|
|
|
|
|
lastCount = giftCountCache[key].Item1;
|
|
|
|
|
backward = currCount <= lastCount;
|
|
|
|
|
if (!backward)
|
|
|
|
|
{
|
|
|
|
|
lock (giftCountCache)
|
|
|
|
|
{
|
|
|
|
|
giftCountCache[key] = Tuple.Create(currCount, DateTime.Now);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (msg.groupId > 0 && !backward)
|
|
|
|
|
{
|
|
|
|
|
giftCountCache.TryAdd(key, Tuple.Create(currCount, DateTime.Now));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//比上次小,则说明先后顺序出了问题,直接丢掉,应为比它大的消息已经处理过了
|
|
|
|
|
if (backward) return;
|
2023-03-09 00:33:03 +08:00
|
|
|
|
2023-04-10 20:39:49 +08:00
|
|
|
var count = currCount - lastCount;
|
|
|
|
|
|
2025-01-12 13:54:21 +08:00
|
|
|
var enty = CreateMsg<GiftMsg>(msg);
|
|
|
|
|
enty.Content = $"{msg.User.Nickname} 送出 {msg.Gift.Name}{(msg.Gift.Combo ? "(可连击)" : "")} x {msg.repeatCount}个,增量{count}个";
|
|
|
|
|
enty.DiamondCount = msg.Gift.diamondCount;
|
|
|
|
|
enty.RepeatCount = msg.repeatCount;
|
|
|
|
|
enty.GiftCount = count;
|
|
|
|
|
enty.GroupId = msg.groupId;
|
|
|
|
|
enty.GiftId = msg.giftId;
|
|
|
|
|
enty.GiftName = msg.Gift.Name;
|
|
|
|
|
enty.Combo = msg.Gift.Combo;
|
|
|
|
|
enty.ImgUrl = msg.Gift.Image?.urlLists?.FirstOrDefault() ?? "";
|
|
|
|
|
enty.ToUser = GetUser(msg.toUser);
|
2023-11-14 20:29:18 +08:00
|
|
|
|
2023-12-17 23:56:10 +08:00
|
|
|
if (enty.ToUser != null)
|
|
|
|
|
{
|
|
|
|
|
enty.Content += ",给" + enty.ToUser.Nickname;
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
var msgType = PackMsgType.礼物消息;
|
2024-04-26 00:55:47 +08:00
|
|
|
AttachRoomInfo(enty);
|
2024-03-29 11:20:17 +08:00
|
|
|
FirePack(enty, msgType);
|
2023-09-24 12:47:55 +08:00
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), PackMsgType.礼物消息, e.Process);
|
|
|
|
|
Broadcast(pack);
|
2022-10-06 17:44:08 +08:00
|
|
|
}
|
|
|
|
|
|
2023-03-09 00:33:03 +08:00
|
|
|
//关注
|
2023-09-24 12:47:55 +08:00
|
|
|
private void Grab_OnSocialMessage(object sender, WssBarrageGrab.RoomMessageEventArgs<SocialMessage> e)
|
2022-10-06 17:44:08 +08:00
|
|
|
{
|
2023-09-24 12:47:55 +08:00
|
|
|
var msg = e.Message;
|
|
|
|
|
if (!CheckRoomId(msg.Common.roomId)) return;
|
|
|
|
|
if (msg.Action != 1) return;
|
2025-01-12 13:54:21 +08:00
|
|
|
var enty = CreateMsg<Msg>(msg);
|
|
|
|
|
enty.Content = $"{msg.User.Nickname} 关注了主播";
|
2023-11-14 20:29:18 +08:00
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
var msgType = PackMsgType.关注消息;
|
2024-04-26 00:55:47 +08:00
|
|
|
AttachRoomInfo(enty);
|
2024-03-29 11:20:17 +08:00
|
|
|
FirePack(enty, msgType);
|
2023-09-24 12:47:55 +08:00
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process);
|
2022-10-06 17:44:08 +08:00
|
|
|
var json = JsonConvert.SerializeObject(pack);
|
2023-09-24 12:47:55 +08:00
|
|
|
Broadcast(pack);
|
2022-10-06 17:44:08 +08:00
|
|
|
}
|
|
|
|
|
|
2023-04-09 22:03:42 +08:00
|
|
|
//直播间分享
|
2023-09-24 12:47:55 +08:00
|
|
|
private void Grab_OnShardMessage(object sender, WssBarrageGrab.RoomMessageEventArgs<SocialMessage> e)
|
2023-04-09 22:03:42 +08:00
|
|
|
{
|
2023-09-24 12:47:55 +08:00
|
|
|
var msg = e.Message;
|
|
|
|
|
if (!CheckRoomId(msg.Common.roomId)) return;
|
|
|
|
|
if (msg.Action != 3) return;
|
2023-04-09 22:03:42 +08:00
|
|
|
ShareType type = ShareType.未知;
|
2023-09-24 12:47:55 +08:00
|
|
|
if (Enum.IsDefined(type.GetType(), int.Parse(msg.shareTarget)))
|
2023-04-09 22:03:42 +08:00
|
|
|
{
|
2023-09-24 12:47:55 +08:00
|
|
|
type = (ShareType)int.Parse(msg.shareTarget);
|
2023-04-09 22:03:42 +08:00
|
|
|
}
|
|
|
|
|
|
2025-01-12 13:54:21 +08:00
|
|
|
var enty = CreateMsg<ShareMessage>(msg);
|
|
|
|
|
enty.Content = $"{msg.User.Nickname} 分享了直播间到{type}";
|
|
|
|
|
enty.ShareType = type;
|
2023-11-14 20:29:18 +08:00
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
var msgType = PackMsgType.直播间分享;
|
2024-04-26 00:55:47 +08:00
|
|
|
AttachRoomInfo(enty);
|
2024-03-29 11:20:17 +08:00
|
|
|
FirePack(enty, msgType);
|
2023-09-24 12:47:55 +08:00
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
|
|
|
|
|
//shareTarget: (112:好友),(1微信)(2朋友圈)(3微博)(5:qq)(4:qq空间),shareType: 1
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process);
|
2023-04-09 22:03:42 +08:00
|
|
|
var json = JsonConvert.SerializeObject(pack);
|
2023-09-24 12:47:55 +08:00
|
|
|
Broadcast(pack);
|
2023-04-09 22:03:42 +08:00
|
|
|
}
|
|
|
|
|
|
2023-03-09 00:33:03 +08:00
|
|
|
//来了
|
2023-09-24 12:47:55 +08:00
|
|
|
private void Grab_OnMemberMessage(object sender, WssBarrageGrab.RoomMessageEventArgs<Modles.ProtoEntity.MemberMessage> e)
|
2022-10-06 17:44:08 +08:00
|
|
|
{
|
2023-09-24 12:47:55 +08:00
|
|
|
var msg = e.Message;
|
|
|
|
|
if (!CheckRoomId(msg.Common.roomId)) return;
|
2023-04-10 20:39:49 +08:00
|
|
|
|
2025-01-12 13:54:21 +08:00
|
|
|
var enterType = e.Message.userEnterTipType;
|
|
|
|
|
var enty = CreateMsg<Modles.JsonEntity.MemberMessage>(msg);
|
|
|
|
|
enty.Content = $"{msg.User.Nickname} ${(enterType == 6 ? " 通过分享" : "")}来了 直播间人数:{msg.memberCount}";
|
|
|
|
|
enty.CurrentCount = msg.memberCount;
|
|
|
|
|
enty.EnterTipType = enterType;
|
2023-11-14 20:29:18 +08:00
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
var msgType = PackMsgType.进直播间;
|
2024-04-26 00:55:47 +08:00
|
|
|
AttachRoomInfo(enty);
|
2024-03-29 11:20:17 +08:00
|
|
|
FirePack(enty, msgType);
|
2023-09-24 12:47:55 +08:00
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process);
|
2022-10-06 17:44:08 +08:00
|
|
|
var json = JsonConvert.SerializeObject(pack);
|
2023-09-24 12:47:55 +08:00
|
|
|
Broadcast(pack);
|
2022-10-06 17:44:08 +08:00
|
|
|
}
|
|
|
|
|
|
2023-03-09 00:33:03 +08:00
|
|
|
//点赞
|
2023-09-24 12:47:55 +08:00
|
|
|
private void Grab_OnLikeMessage(object sender, WssBarrageGrab.RoomMessageEventArgs<LikeMessage> e)
|
2022-10-06 17:44:08 +08:00
|
|
|
{
|
2023-09-24 12:47:55 +08:00
|
|
|
var msg = e.Message;
|
|
|
|
|
if (!CheckRoomId(msg.Common.roomId)) return;
|
2023-04-10 20:39:49 +08:00
|
|
|
|
2025-01-12 13:54:21 +08:00
|
|
|
var enty = CreateMsg<LikeMsg>(msg);
|
|
|
|
|
enty.Total = msg.Total;
|
|
|
|
|
enty.Count = msg.Count;
|
|
|
|
|
enty.Content = $"{msg.User.Nickname} 为主播点了{msg.Count}个赞,总点赞{msg.Total}";
|
2023-11-14 20:29:18 +08:00
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
var msgType = PackMsgType.点赞消息;
|
2024-04-26 00:55:47 +08:00
|
|
|
AttachRoomInfo(enty);
|
2024-03-29 11:20:17 +08:00
|
|
|
FirePack(enty, msgType);
|
2023-09-24 12:47:55 +08:00
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process);
|
|
|
|
|
Broadcast(pack);
|
2022-10-06 17:44:08 +08:00
|
|
|
}
|
|
|
|
|
|
2023-03-09 00:33:03 +08:00
|
|
|
//弹幕
|
2023-09-24 12:47:55 +08:00
|
|
|
private void Grab_OnChatMessage(object sender, WssBarrageGrab.RoomMessageEventArgs<ChatMessage> e)
|
2022-10-06 17:44:08 +08:00
|
|
|
{
|
2023-09-24 12:47:55 +08:00
|
|
|
var msg = e.Message;
|
|
|
|
|
if (!CheckRoomId(msg.Common.roomId)) return;
|
2023-04-10 20:39:49 +08:00
|
|
|
|
2025-01-12 13:54:21 +08:00
|
|
|
var enty = CreateMsg<Msg>(msg);
|
|
|
|
|
enty.Content = msg.Content;
|
2023-11-14 20:29:18 +08:00
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
var msgType = PackMsgType.弹幕消息;
|
2024-04-26 00:55:47 +08:00
|
|
|
AttachRoomInfo(enty);
|
2024-03-29 11:20:17 +08:00
|
|
|
FirePack(enty, msgType);
|
2023-09-24 12:47:55 +08:00
|
|
|
PrintMsg(enty, msgType);
|
2023-04-24 21:39:22 +08:00
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process);
|
|
|
|
|
Broadcast(pack);
|
2022-10-06 17:44:08 +08:00
|
|
|
}
|
|
|
|
|
|
2023-04-09 22:03:42 +08:00
|
|
|
//直播间状态变更
|
2023-09-24 12:47:55 +08:00
|
|
|
private void Grab_OnControlMessage(object sender, WssBarrageGrab.RoomMessageEventArgs<ControlMessage> e)
|
2023-04-09 22:03:42 +08:00
|
|
|
{
|
2023-09-24 12:47:55 +08:00
|
|
|
var msg = e.Message;
|
|
|
|
|
if (!CheckRoomId(msg.Common.roomId)) return;
|
2023-04-09 22:03:42 +08:00
|
|
|
BarrageMsgPack pack = null;
|
|
|
|
|
//下播
|
2023-09-24 12:47:55 +08:00
|
|
|
if (msg.Status == 3)
|
2023-04-09 22:03:42 +08:00
|
|
|
{
|
|
|
|
|
var enty = new Msg()
|
|
|
|
|
{
|
2023-09-24 12:47:55 +08:00
|
|
|
MsgId = msg.Common.msgId,
|
2023-04-09 22:03:42 +08:00
|
|
|
Content = "直播已结束",
|
2024-04-26 10:19:14 +08:00
|
|
|
RoomId = msg.Common.roomId.ToString(),
|
2023-09-24 12:47:55 +08:00
|
|
|
WebRoomId = AppRuntime.RoomCaches.GetCachedWebRoomid(msg.Common.roomId.ToString()),
|
2024-12-27 20:05:50 +08:00
|
|
|
User = null,
|
2025-01-12 13:54:21 +08:00
|
|
|
Appid = e.Message.Common.appId.ToString()
|
2023-04-09 22:03:42 +08:00
|
|
|
};
|
2023-11-14 20:29:18 +08:00
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
var msgType = PackMsgType.下播;
|
2024-04-26 00:55:47 +08:00
|
|
|
AttachRoomInfo(enty);
|
2024-03-29 11:20:17 +08:00
|
|
|
FirePack(enty, msgType);
|
2023-09-24 12:47:55 +08:00
|
|
|
PrintMsg(enty, msgType);
|
2026-04-09 22:47:04 +08:00
|
|
|
pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process);
|
2023-04-09 22:03:42 +08:00
|
|
|
}
|
2023-04-10 20:39:49 +08:00
|
|
|
|
|
|
|
|
if (pack != null)
|
2023-04-09 22:03:42 +08:00
|
|
|
{
|
2023-09-24 12:47:55 +08:00
|
|
|
Broadcast(pack);
|
2023-04-10 20:39:49 +08:00
|
|
|
}
|
2023-04-09 22:03:42 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-09 22:47:04 +08:00
|
|
|
//直播伴侣上下播
|
|
|
|
|
private void Proxy_OnLiveCompanAction(object sender, LiveCompanEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
var msgid = DateTime.Now.Ticks;
|
|
|
|
|
BarrageMsgPack pack = null;
|
|
|
|
|
|
|
|
|
|
if (e.Action == 1)
|
|
|
|
|
{
|
|
|
|
|
RoomInfo roomInfo = e.Data as RoomInfo;
|
|
|
|
|
if(roomInfo == null) return;
|
|
|
|
|
|
|
|
|
|
var enty = new LiveCompanActionMsg()
|
|
|
|
|
{
|
|
|
|
|
MsgId = msgid,
|
|
|
|
|
Content = $" [{roomInfo.Owner.Nickname}] 开播了",
|
|
|
|
|
RoomId = roomInfo.RoomId,
|
|
|
|
|
WebRoomId = AppRuntime.RoomCaches.GetCachedWebRoomid(roomInfo.RoomId),
|
|
|
|
|
User = null,
|
|
|
|
|
Appid = "0",
|
|
|
|
|
Data = roomInfo,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var msgType = PackMsgType.直播伴侣开播;
|
|
|
|
|
AttachRoomInfo(enty);
|
|
|
|
|
FirePack(enty, msgType);
|
|
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
pack = new BarrageMsgPack(enty.ToJson(), msgType, e.ProcessName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (e.Action == 2)
|
|
|
|
|
{
|
|
|
|
|
var info = e.Data as AnchorFinishInfo;
|
|
|
|
|
if (info.RoomId.IsNullOrWhiteSpace()) return;
|
|
|
|
|
|
|
|
|
|
var enty = new LiveCompanActionMsg()
|
|
|
|
|
{
|
|
|
|
|
MsgId = msgid,
|
|
|
|
|
Content = $" [{info.Nickname}]下播,房间号:{info.RoomId}",
|
|
|
|
|
RoomId = info.RoomId,
|
|
|
|
|
WebRoomId = AppRuntime.RoomCaches.GetCachedWebRoomid(info.RoomId),
|
|
|
|
|
Appid = "0",
|
|
|
|
|
Data = info
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var msgType = PackMsgType.直播伴侣下播;
|
|
|
|
|
AttachRoomInfo(enty);
|
|
|
|
|
FirePack(enty, msgType);
|
|
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
pack = new BarrageMsgPack(enty.ToJson(), msgType, e.ProcessName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (pack != null)
|
|
|
|
|
{
|
|
|
|
|
Broadcast(pack);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-04 00:10:33 +08:00
|
|
|
#region 快手消息处理
|
|
|
|
|
|
|
|
|
|
private MsgUser KsUserToMsgUser(Modles.KsProtoEntity.KsSimpleUserInfo user)
|
|
|
|
|
{
|
|
|
|
|
if (user == null) return null;
|
|
|
|
|
return new MsgUser()
|
|
|
|
|
{
|
|
|
|
|
Id = long.TryParse(user.PrincipalId, out var pid) ? pid : 0,
|
|
|
|
|
DisplayId = user.PrincipalId ?? "",
|
|
|
|
|
Nickname = user.UserName ?? "用户" + user.PrincipalId,
|
|
|
|
|
HeadImgUrl = user.HeadUrl ?? "",
|
|
|
|
|
Gender = 0,
|
|
|
|
|
Level = 0,
|
|
|
|
|
PayLevel = 0,
|
|
|
|
|
ShortId = 0,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private string KsRoomId;
|
|
|
|
|
|
|
|
|
|
private void KsGrab_OnChatMessage(object sender, KsRoomMessageEventArgs<Modles.KsProtoEntity.KsWebCommentFeed> e)
|
|
|
|
|
{
|
|
|
|
|
var feed = e.Message;
|
|
|
|
|
var enty = new Msg()
|
|
|
|
|
{
|
|
|
|
|
MsgId = long.TryParse(feed.Id, out var id) ? id : DateTime.Now.Ticks,
|
|
|
|
|
User = KsUserToMsgUser(feed.User),
|
|
|
|
|
Content = feed.Content ?? "",
|
|
|
|
|
RoomId = KsRoomId ?? "",
|
|
|
|
|
WebRoomId = KsRoomId ?? "",
|
|
|
|
|
Appid = "0"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var msgType = PackMsgType.弹幕消息;
|
|
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process, LivePlatform.Kuaishou);
|
|
|
|
|
Broadcast(pack);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void KsGrab_OnLikeMessage(object sender, KsRoomMessageEventArgs<Modles.KsProtoEntity.KsWebLikeFeed> e)
|
|
|
|
|
{
|
|
|
|
|
var feed = e.Message;
|
|
|
|
|
var enty = new LikeMsg()
|
|
|
|
|
{
|
|
|
|
|
MsgId = long.TryParse(feed.Id, out var id) ? id : DateTime.Now.Ticks,
|
|
|
|
|
User = KsUserToMsgUser(feed.User),
|
|
|
|
|
Content = $"{feed.User?.UserName ?? "用户"} 为主播点了赞",
|
|
|
|
|
Count = 1,
|
|
|
|
|
Total = 0,
|
|
|
|
|
RoomId = KsRoomId ?? "",
|
|
|
|
|
WebRoomId = KsRoomId ?? "",
|
|
|
|
|
Appid = "0"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var msgType = PackMsgType.点赞消息;
|
|
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process, LivePlatform.Kuaishou);
|
|
|
|
|
Broadcast(pack);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void KsGrab_OnGiftMessage(object sender, KsRoomMessageEventArgs<Modles.KsProtoEntity.KsWebGiftFeed> e)
|
|
|
|
|
{
|
|
|
|
|
var feed = e.Message;
|
|
|
|
|
var enty = new GiftMsg()
|
|
|
|
|
{
|
|
|
|
|
MsgId = long.TryParse(feed.Id, out var id) ? id : DateTime.Now.Ticks,
|
|
|
|
|
User = KsUserToMsgUser(feed.User),
|
|
|
|
|
GiftId = feed.GiftId,
|
|
|
|
|
GiftName = KsGiftHelper.GetGiftName(feed.GiftId) ?? $"礼物#{feed.GiftId}",
|
|
|
|
|
GroupId = 0,
|
|
|
|
|
GiftCount = feed.ComboCount > 0 ? feed.ComboCount : 1,
|
|
|
|
|
RepeatCount = feed.ComboCount > 0 ? feed.ComboCount : 1,
|
|
|
|
|
DiamondCount = 0,
|
|
|
|
|
Combo = feed.ComboCount > 1,
|
|
|
|
|
Content = $"{feed.User?.UserName ?? "用户"} 送出 {KsGiftHelper.GetGiftName(feed.GiftId) ?? $"礼物#{feed.GiftId}"} x {feed.ComboCount}",
|
|
|
|
|
RoomId = KsRoomId ?? "",
|
|
|
|
|
WebRoomId = KsRoomId ?? "",
|
|
|
|
|
Appid = "0"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var msgType = PackMsgType.礼物消息;
|
|
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process, LivePlatform.Kuaishou);
|
|
|
|
|
Broadcast(pack);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void KsGrab_OnShareMessage(object sender, KsRoomMessageEventArgs<Modles.KsProtoEntity.KsWebShareFeed> e)
|
|
|
|
|
{
|
|
|
|
|
var feed = e.Message;
|
|
|
|
|
var enty = new ShareMessage()
|
|
|
|
|
{
|
|
|
|
|
MsgId = long.TryParse(feed.Id, out var id) ? id : DateTime.Now.Ticks,
|
|
|
|
|
User = KsUserToMsgUser(feed.User),
|
|
|
|
|
Content = $"{feed.User?.UserName ?? "用户"} 分享了直播间",
|
|
|
|
|
ShareType = ShareType.未知,
|
|
|
|
|
RoomId = KsRoomId ?? "",
|
|
|
|
|
WebRoomId = KsRoomId ?? "",
|
|
|
|
|
Appid = "0"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var msgType = PackMsgType.直播间分享;
|
|
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process, LivePlatform.Kuaishou);
|
|
|
|
|
Broadcast(pack);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void KsGrab_OnRoomStatsMessage(object sender, KsRoomMessageEventArgs<Modles.KsProtoEntity.KsSCWebFeedPush> e)
|
|
|
|
|
{
|
|
|
|
|
var feed = e.Message;
|
|
|
|
|
var enty = new UserSeqMsg()
|
|
|
|
|
{
|
|
|
|
|
MsgId = DateTime.Now.Ticks,
|
|
|
|
|
Content = $"当前直播间人数 {feed.DisplayWatchingCount},点赞 {feed.DisplayLikeCount}",
|
|
|
|
|
OnlineUserCount = long.TryParse(feed.DisplayWatchingCount, out var watching) ? watching : 0,
|
|
|
|
|
TotalUserCount = 0,
|
|
|
|
|
OnlineUserCountStr = feed.DisplayWatchingCount ?? "0",
|
|
|
|
|
TotalUserCountStr = "0",
|
|
|
|
|
RoomId = KsRoomId ?? "",
|
|
|
|
|
WebRoomId = KsRoomId ?? "",
|
|
|
|
|
Appid = "0"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var msgType = PackMsgType.直播间统计;
|
|
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process, LivePlatform.Kuaishou);
|
|
|
|
|
Broadcast(pack);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region B站消息处理
|
|
|
|
|
|
|
|
|
|
private MsgUser BiliUserToMsgUser(Modles.BiliProtoEntity.BiliDanmuMsg user)
|
|
|
|
|
{
|
|
|
|
|
if (user == null) return null;
|
|
|
|
|
return new MsgUser()
|
|
|
|
|
{
|
|
|
|
|
Id = user.Uid,
|
|
|
|
|
DisplayId = user.Uid.ToString(),
|
|
|
|
|
Nickname = user.Uname ?? "用户" + user.Uid,
|
|
|
|
|
IsAdmin = user.IsAdmin,
|
|
|
|
|
IsAnchor = user.IsAnchor,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MsgUser BiliUserToMsgUser(long uid, string uname)
|
|
|
|
|
{
|
|
|
|
|
return new MsgUser()
|
|
|
|
|
{
|
|
|
|
|
Id = uid,
|
|
|
|
|
DisplayId = uid.ToString(),
|
|
|
|
|
Nickname = string.IsNullOrWhiteSpace(uname) ? "用户" + uid : uname,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//B站弹幕
|
|
|
|
|
private void BiliGrab_OnChatMessage(object sender, BiliRoomMessageEventArgs<Modles.BiliProtoEntity.BiliDanmuMsg> e)
|
|
|
|
|
{
|
|
|
|
|
var msg = e.Message;
|
|
|
|
|
var enty = new Msg()
|
|
|
|
|
{
|
|
|
|
|
MsgId = DateTime.Now.Ticks,
|
|
|
|
|
User = BiliUserToMsgUser(msg),
|
|
|
|
|
Content = msg.Content ?? "",
|
|
|
|
|
RoomId = biliGrab.CurrentRoomId,
|
|
|
|
|
WebRoomId = biliGrab.CurrentRoomId,
|
|
|
|
|
Appid = "0"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var msgType = PackMsgType.弹幕消息;
|
|
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process, LivePlatform.Bilibili);
|
|
|
|
|
Broadcast(pack);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//B站点赞
|
|
|
|
|
private void BiliGrab_OnLikeMessage(object sender, BiliRoomMessageEventArgs<Modles.BiliProtoEntity.BiliLikeData> e)
|
|
|
|
|
{
|
|
|
|
|
var msg = e.Message;
|
|
|
|
|
var enty = new LikeMsg()
|
|
|
|
|
{
|
|
|
|
|
MsgId = DateTime.Now.Ticks,
|
|
|
|
|
User = BiliUserToMsgUser(msg.Uid, msg.Uname),
|
|
|
|
|
Content = $"{msg.Uname ?? "用户"} 为主播点了赞",
|
|
|
|
|
Count = 1,
|
|
|
|
|
Total = 0,
|
|
|
|
|
RoomId = biliGrab.CurrentRoomId,
|
|
|
|
|
WebRoomId = biliGrab.CurrentRoomId,
|
|
|
|
|
Appid = "0"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var msgType = PackMsgType.点赞消息;
|
|
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process, LivePlatform.Bilibili);
|
|
|
|
|
Broadcast(pack);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//B站礼物
|
|
|
|
|
private void BiliGrab_OnGiftMessage(object sender, BiliRoomMessageEventArgs<Modles.BiliProtoEntity.BiliGiftData> e)
|
|
|
|
|
{
|
|
|
|
|
var msg = e.Message;
|
|
|
|
|
var count = msg.Num > 0 ? msg.Num : 1;
|
|
|
|
|
var enty = new GiftMsg()
|
|
|
|
|
{
|
|
|
|
|
MsgId = DateTime.Now.Ticks,
|
|
|
|
|
User = BiliUserToMsgUser(msg.Uid, msg.Uname),
|
|
|
|
|
GiftId = msg.GiftId,
|
|
|
|
|
GiftName = msg.GiftName ?? $"礼物#{msg.GiftId}",
|
|
|
|
|
GroupId = 0,
|
|
|
|
|
GiftCount = count,
|
|
|
|
|
RepeatCount = msg.SuperBatchNum > 0 ? msg.SuperBatchNum : count,
|
|
|
|
|
DiamondCount = (int)(msg.Price * 1000),
|
|
|
|
|
Combo = msg.ComboNum > 1,
|
|
|
|
|
ImgUrl = msg.GifUrl ?? "",
|
|
|
|
|
Content = $"{msg.Uname ?? "用户"} 送出 {msg.GiftName ?? $"礼物#{msg.GiftId}"} x {count}",
|
|
|
|
|
RoomId = biliGrab.CurrentRoomId,
|
|
|
|
|
WebRoomId = biliGrab.CurrentRoomId,
|
|
|
|
|
Appid = "0"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var msgType = PackMsgType.礼物消息;
|
|
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process, LivePlatform.Bilibili);
|
|
|
|
|
Broadcast(pack);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//B站进房/关注
|
|
|
|
|
private void BiliGrab_OnInteractMessage(object sender, BiliRoomMessageEventArgs<Modles.BiliProtoEntity.BiliInteractData> e)
|
|
|
|
|
{
|
|
|
|
|
var msg = e.Message;
|
|
|
|
|
// msg_type: 1=进入 2=关注
|
|
|
|
|
if (msg.MsgType == 2)
|
|
|
|
|
{
|
|
|
|
|
var enty = new Msg()
|
|
|
|
|
{
|
|
|
|
|
MsgId = DateTime.Now.Ticks,
|
|
|
|
|
User = BiliUserToMsgUser(msg.Uid, msg.Uname),
|
|
|
|
|
Content = $"{msg.Uname ?? "用户"} 关注了主播",
|
|
|
|
|
RoomId = biliGrab.CurrentRoomId,
|
|
|
|
|
WebRoomId = biliGrab.CurrentRoomId,
|
|
|
|
|
Appid = "0"
|
|
|
|
|
};
|
|
|
|
|
var msgType = PackMsgType.关注消息;
|
|
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process, LivePlatform.Bilibili);
|
|
|
|
|
Broadcast(pack);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var enty = new Modles.JsonEntity.MemberMessage()
|
|
|
|
|
{
|
|
|
|
|
MsgId = DateTime.Now.Ticks,
|
|
|
|
|
User = BiliUserToMsgUser(msg.Uid, msg.Uname),
|
|
|
|
|
Content = $"{msg.Uname ?? "用户"} 来了直播间",
|
|
|
|
|
CurrentCount = 0,
|
|
|
|
|
EnterTipType = 0,
|
|
|
|
|
RoomId = biliGrab.CurrentRoomId,
|
|
|
|
|
WebRoomId = biliGrab.CurrentRoomId,
|
|
|
|
|
Appid = "0"
|
|
|
|
|
};
|
|
|
|
|
var msgType = PackMsgType.进直播间;
|
|
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process, LivePlatform.Bilibili);
|
|
|
|
|
Broadcast(pack);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//B站分享
|
|
|
|
|
private void BiliGrab_OnShareMessage(object sender, BiliRoomMessageEventArgs<Modles.BiliProtoEntity.BiliInteractData> e)
|
|
|
|
|
{
|
|
|
|
|
var msg = e.Message;
|
|
|
|
|
var enty = new ShareMessage()
|
|
|
|
|
{
|
|
|
|
|
MsgId = DateTime.Now.Ticks,
|
|
|
|
|
User = BiliUserToMsgUser(msg.Uid, msg.Uname),
|
|
|
|
|
Content = $"{msg.Uname ?? "用户"} 分享了直播间",
|
|
|
|
|
ShareType = ShareType.未知,
|
|
|
|
|
RoomId = biliGrab.CurrentRoomId,
|
|
|
|
|
WebRoomId = biliGrab.CurrentRoomId,
|
|
|
|
|
Appid = "0"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var msgType = PackMsgType.直播间分享;
|
|
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process, LivePlatform.Bilibili);
|
|
|
|
|
Broadcast(pack);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//B站房间统计
|
|
|
|
|
private void BiliGrab_OnRoomStatsMessage(object sender, BiliRoomMessageEventArgs<Modles.BiliProtoEntity.BiliRoomStats> e)
|
|
|
|
|
{
|
|
|
|
|
var msg = e.Message;
|
|
|
|
|
var enty = new UserSeqMsg()
|
|
|
|
|
{
|
|
|
|
|
MsgId = DateTime.Now.Ticks,
|
|
|
|
|
Content = $"当前直播间人数 {msg.Online},看过 {msg.Watched}",
|
|
|
|
|
OnlineUserCount = msg.Online,
|
|
|
|
|
TotalUserCount = msg.Watched,
|
|
|
|
|
OnlineUserCountStr = msg.Online.ToString(),
|
|
|
|
|
TotalUserCountStr = msg.Watched.ToString(),
|
|
|
|
|
RoomId = biliGrab.CurrentRoomId,
|
|
|
|
|
WebRoomId = biliGrab.CurrentRoomId,
|
|
|
|
|
Appid = "0"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var msgType = PackMsgType.直播间统计;
|
|
|
|
|
PrintMsg(enty, msgType);
|
|
|
|
|
var pack = new BarrageMsgPack(enty.ToJson(), msgType, e.Process, LivePlatform.Bilibili);
|
|
|
|
|
Broadcast(pack);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
2024-03-29 11:20:17 +08:00
|
|
|
//监听用户连接
|
2022-10-06 17:44:08 +08:00
|
|
|
private void Listen(IWebSocketConnection socket)
|
|
|
|
|
{
|
|
|
|
|
//客户端url
|
|
|
|
|
string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;
|
|
|
|
|
if (!socketList.ContainsKey(clientUrl))
|
|
|
|
|
{
|
|
|
|
|
socketList.Add(clientUrl, new UserState(socket));
|
2024-03-10 03:44:13 +08:00
|
|
|
Logger.PrintColor($"{DateTime.Now.ToLongTimeString()} 已经建立与[{clientUrl}]的连接", ConsoleColor.Green);
|
2022-10-06 17:44:08 +08:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
socketList[clientUrl].Socket = socket;
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-19 21:44:21 +08:00
|
|
|
//接收指令
|
|
|
|
|
socket.OnMessage = (message) =>
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var cmdPack = JsonConvert.DeserializeObject<Command>(message);
|
2025-04-30 21:48:45 +08:00
|
|
|
if (cmdPack == null) return;
|
2023-06-19 21:44:21 +08:00
|
|
|
}
|
2023-08-17 20:37:22 +08:00
|
|
|
catch (Exception) { }
|
2023-06-19 21:44:21 +08:00
|
|
|
};
|
|
|
|
|
|
2022-10-06 17:44:08 +08:00
|
|
|
socket.OnClose = () =>
|
|
|
|
|
{
|
|
|
|
|
socketList.Remove(clientUrl);
|
2024-03-10 03:44:13 +08:00
|
|
|
Logger.PrintColor($"{DateTime.Now.ToLongTimeString()} 已经关闭与[{clientUrl}]的连接", ConsoleColor.Red);
|
2022-10-06 17:44:08 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
socket.OnPing = (data) =>
|
|
|
|
|
{
|
|
|
|
|
socketList[clientUrl].LastPing = DateTime.Now;
|
|
|
|
|
socket.SendPong(Encoding.UTF8.GetBytes("pong"));
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 广播消息
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="msg"></param>
|
2023-09-24 12:47:55 +08:00
|
|
|
public void Broadcast(BarrageMsgPack pack)
|
2022-10-06 17:44:08 +08:00
|
|
|
{
|
2023-09-24 12:47:55 +08:00
|
|
|
if (pack == null) return;
|
2024-03-29 17:46:24 +08:00
|
|
|
if (AppSetting.Current.PushFilter.Any() && !AppSetting.Current.PushFilter.Contains(pack.Type.GetHashCode())) return;
|
2023-11-23 16:43:21 +08:00
|
|
|
|
2023-09-24 12:47:55 +08:00
|
|
|
var offLines = new List<string>();
|
|
|
|
|
foreach (var item in socketList)
|
2022-10-06 17:44:08 +08:00
|
|
|
{
|
2023-09-24 12:47:55 +08:00
|
|
|
var state = item.Value;
|
|
|
|
|
if (item.Value.Socket.IsAvailable)
|
2023-11-14 20:29:18 +08:00
|
|
|
{
|
2023-09-24 12:47:55 +08:00
|
|
|
state.Socket.Send(pack.ToJson());
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
offLines.Add(item.Key);
|
|
|
|
|
}
|
2022-10-06 17:44:08 +08:00
|
|
|
}
|
2023-09-24 12:47:55 +08:00
|
|
|
//删除掉线的套接字
|
|
|
|
|
offLines.ForEach(key => socketList.Remove(key));
|
2022-10-06 17:44:08 +08:00
|
|
|
}
|
|
|
|
|
|
2023-03-09 00:33:03 +08:00
|
|
|
/// <summary>
|
|
|
|
|
/// 开始监听
|
|
|
|
|
/// </summary>
|
2022-10-06 17:44:08 +08:00
|
|
|
public void StartListen()
|
|
|
|
|
{
|
2024-03-29 17:34:14 +08:00
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
this.grab.Start(); //启动代理
|
|
|
|
|
this.socketServer.Start(Listen);//启动监听
|
|
|
|
|
}
|
|
|
|
|
catch (Exception)
|
|
|
|
|
{
|
|
|
|
|
this.Dispose();
|
|
|
|
|
throw;
|
2024-04-26 00:44:44 +08:00
|
|
|
}
|
2022-10-06 17:44:08 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2023-06-19 21:44:21 +08:00
|
|
|
/// 关闭服务器连接,并关闭系统代理
|
2022-10-06 17:44:08 +08:00
|
|
|
/// </summary>
|
2024-03-29 17:34:14 +08:00
|
|
|
public void Dispose()
|
2022-10-06 17:44:08 +08:00
|
|
|
{
|
|
|
|
|
socketList.Values.ToList().ForEach(f => f.Socket.Close());
|
|
|
|
|
socketList.Clear();
|
|
|
|
|
socketServer.Dispose();
|
|
|
|
|
grab.Dispose();
|
2024-03-29 17:34:14 +08:00
|
|
|
this.IsDisposed = true;
|
2023-08-17 20:37:22 +08:00
|
|
|
this.OnClose?.Invoke(this, EventArgs.Empty);
|
2022-10-06 17:44:08 +08:00
|
|
|
}
|
|
|
|
|
|
2024-03-29 11:20:17 +08:00
|
|
|
/// <summary>
|
|
|
|
|
/// 客户端套接字上下文
|
|
|
|
|
/// </summary>
|
2022-10-06 17:44:08 +08:00
|
|
|
class UserState
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 套接字
|
|
|
|
|
/// </summary>
|
|
|
|
|
public IWebSocketConnection Socket { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 上次发起心跳包时间
|
|
|
|
|
/// </summary>
|
|
|
|
|
public DateTime LastPing { get; set; } = DateTime.Now;
|
|
|
|
|
|
|
|
|
|
public UserState()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
public UserState(IWebSocketConnection socket)
|
|
|
|
|
{
|
|
|
|
|
Socket = socket;
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-11-23 16:43:21 +08:00
|
|
|
|
2024-03-29 11:20:17 +08:00
|
|
|
/// <summary>
|
|
|
|
|
/// Print事件参数
|
|
|
|
|
/// </summary>
|
2023-11-23 16:43:21 +08:00
|
|
|
public class PrintEventArgs : EventArgs
|
|
|
|
|
{
|
|
|
|
|
public string Message { get; set; }
|
|
|
|
|
|
2023-12-17 23:56:10 +08:00
|
|
|
public ConsoleColor Color { get; set; }
|
2023-11-23 16:43:21 +08:00
|
|
|
|
|
|
|
|
public PackMsgType MsgType { get; set; }
|
|
|
|
|
}
|
2024-03-29 11:20:17 +08:00
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 消息包事件参数
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class PackMsgEventArgs
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 消息类型
|
|
|
|
|
/// </summary>
|
|
|
|
|
public PackMsgType MsgType { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 消息内容
|
|
|
|
|
/// </summary>
|
|
|
|
|
public Msg Message { get; set; }
|
2024-04-26 00:44:44 +08:00
|
|
|
}
|
2022-10-06 17:44:08 +08:00
|
|
|
}
|
|
|
|
|
}
|