This commit is contained in:
2026-08-04 00:10:33 +08:00
parent c9343da287
commit 6601f14db6
26 changed files with 4370 additions and 274 deletions
+420 -1
View File
@@ -1,8 +1,9 @@
using System;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
@@ -13,6 +14,7 @@ using BarrageGrab.Forms;
using BarrageGrab.Forms.Models;
using BarrageGrab.Modles.JsonEntity;
using BarrageGrab.Proxy;
using Newtonsoft.Json;
namespace BarrageGrab
{
@@ -24,14 +26,85 @@ namespace BarrageGrab
WssBarrageGrab grab = AppRuntime.WsServer.Grab;
ISystemProxy proxy = AppRuntime.WsServer.Grab.Proxy;
private Panel testPanel;
private ComboBox cmbPlayers;
private ComboBox cmbEventType;
private PictureBox picAvatar;
private TextBox txtPlayerName;
private Label lblPlayerid;
private Button btnGeneratePlayers;
private Panel inputPanel;
private Label lblDynamic1, lblDynamic2;
private TextBox txtDynamic1, txtDynamic2;
private Button btnSendTest;
private Label lblStatus;
public FormView()
{
InitializeComponent();
barServer.OnPrint += WssService_OnPrint;
barServer.Grab.Proxy.OnProxyStatus += Proxy_OnProxyStatus;
AppRuntime.RoomCaches.OnCache += RoomCaches_OnCache;
// 扩大form和panel2高度
this.ClientSize = new Size(687, 650);
this.panel2.Height = 390;
this.panel1.Top = 392;
this.panel1.Height = this.ClientSize.Height - this.panel1.Top - 20;
// 固定panel3高度,不让它随panel2拉伸
this.panel3.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
this.panel3.Height = 159;
BuildTestPanel();
// 游戏配置按钮
var btnConfig = new Button
{
Text = "游戏配置",
Width = 100,
Left = 10,
Top = 90
};
btnConfig.Click += (s, e) => { using (var f = new Forms.ConfigEditorForm()) f.ShowDialog(this); };
this.panel3.Controls.Add(btnConfig);
// Settings button
var btnSettings = new Button
{
Text = "设置",
Width = 60,
Left = 120,
Top = 90
};
btnSettings.Click += (s, e) => { using (var f = new Forms.SettingsForm()) f.ShowDialog(this); };
this.panel3.Controls.Add(btnSettings);
// 打开游戏按钮
var btnLaunchGame = new Button
{
Text = "打开游戏",
Width = 80,
Left = 190,
Top = 90
};
btnLaunchGame.Click += (s, e) => { Program.LaunchGame(); };
this.panel3.Controls.Add(btnLaunchGame);
// 重新打开游戏按钮
var btnRestartGame = new Button
{
Text = "重启游戏",
Width = 80,
Left = 280,
Top = 90
};
btnRestartGame.Click += (s, e) => { Program.RestartGame(); };
this.panel3.Controls.Add(btnRestartGame);
}
private void InitTabPages()
{
var msgTypes = GetMsgTypes();
@@ -235,5 +308,351 @@ namespace BarrageGrab
AppSetting.Current.BarrageLog = checker.Checked;
AppSetting.Current.Save();
}
// ==================== 测试面板 ====================
private readonly string DefaultAvatarUrl = "https://aliyun_id_photo_bucket.oss.aliyuncs.com/default_handsome_intl.jpg";
private readonly List<(long Id, string Name)> _testPlayers = new List<(long Id, string Name)>();
private static readonly string[] SampleNames = {
"小明", "小红", "玩家001", "铁柱", "翠花", "老六", "大佬666",
"战神", "小可爱", "路人甲", "氪金玩家", "欧皇", "非酋", "主播铁粉",
"水友123", "弹幕刷屏王", "白嫖党", "榜一大哥", "守塔小兵", "运营总监"
};
private void BuildTestPanel()
{
// 测试面板标题
int yBase = 195;
var lblTitle = new Label
{
Text = "📡 WebSocket 模拟测试",
Location = new Point(250, yBase),
Size = new Size(200, 18),
Font = new Font("微软雅黑", 10, FontStyle.Bold),
ForeColor = Color.DarkBlue
};
panel2.Controls.Add(lblTitle);
// ── 生成按钮 ──
btnGeneratePlayers = new Button
{
Text = "随机生成玩家",
Location = new Point(250, yBase + 20),
Size = new Size(130, 24),
BackColor = Color.LightSteelBlue,
UseVisualStyleBackColor = true
};
btnGeneratePlayers.Click += BtnGeneratePlayers_Click;
panel2.Controls.Add(btnGeneratePlayers);
// ── 玩家下拉(含头像) ──
cmbPlayers = new ComboBox
{
Location = new Point(250, yBase + 46),
Size = new Size(310, 22),
DropDownStyle = ComboBoxStyle.DropDownList,
DropDownWidth = 400
};
cmbPlayers.SelectedIndexChanged += CmbPlayers_SelectedIndexChanged;
panel2.Controls.Add(cmbPlayers);
lblPlayerid = new Label
{
Text = "ID: --",
Location = new Point(565, yBase + 48),
Size = new Size(110, 18),
ForeColor = Color.Gray
};
panel2.Controls.Add(lblPlayerid);
// ── 事件类型下拉 ──
var lblEvent = new Label { Text = "事件:", Location = new Point(250, yBase + 74), Size = new Size(40, 20) };
panel2.Controls.Add(lblEvent);
cmbEventType = new ComboBox
{
Location = new Point(290, yBase + 72),
Size = new Size(130, 22),
DropDownStyle = ComboBoxStyle.DropDownList
};
cmbEventType.Items.AddRange(new object[] { "弹幕消息", "点赞消息", "礼物消息", "关注消息", "进直播间", "直播间分享", "粉丝团消息" });
cmbEventType.SelectedIndex = 0;
cmbEventType.SelectedIndexChanged += CmbEventType_SelectedIndexChanged;
panel2.Controls.Add(cmbEventType);
// ── 发送按钮 ──
btnSendTest = new Button
{
Text = "发送",
Location = new Point(430, yBase + 70),
Size = new Size(130, 26),
BackColor = Color.Orange,
Font = new Font("微软雅黑", 9, FontStyle.Bold),
UseVisualStyleBackColor = true
};
btnSendTest.Click += BtnSendTest_Click;
panel2.Controls.Add(btnSendTest);
// ── 动态输入面板 ──
inputPanel = new Panel
{
Location = new Point(248, yBase + 100),
Size = new Size(430, 50),
BorderStyle = BorderStyle.FixedSingle
};
panel2.Controls.Add(inputPanel);
lblDynamic1 = new Label { Location = new Point(8, 8), Size = new Size(50, 18), Text = "内容:" };
inputPanel.Controls.Add(lblDynamic1);
txtDynamic1 = new TextBox { Location = new Point(60, 6), Size = new Size(200, 21), Text = "测试弹幕666" };
inputPanel.Controls.Add(txtDynamic1);
lblDynamic2 = new Label { Location = new Point(8, 30), Size = new Size(50, 18), Text = "" };
inputPanel.Controls.Add(lblDynamic2);
txtDynamic2 = new TextBox { Location = new Point(60, 28), Size = new Size(80, 21), Text = "", Visible = false };
inputPanel.Controls.Add(txtDynamic2);
// ── 状态 ──
lblStatus = new Label
{
Location = new Point(250, yBase + 155),
Size = new Size(425, 18),
ForeColor = Color.DimGray
};
panel2.Controls.Add(lblStatus);
// 初始刷新
RefreshInputPanel();
}
private void BtnGeneratePlayers_Click(object sender, EventArgs e)
{
_testPlayers.Clear();
cmbPlayers.Items.Clear();
var rnd = new Random();
// 生成28个完全随机玩家
for (int i = 0; i < 28; i++)
{
long id = 10000 + rnd.Next(1, 99999);
string name = SampleNames[rnd.Next(SampleNames.Length)];
if (rnd.Next(2) == 0) name += rnd.Next(10, 999).ToString();
_testPlayers.Add((id, name));
cmbPlayers.Items.Add($"{name} (ID:{id})");
}
cmbPlayers.SelectedIndex = 0;
lblStatus.Text = $"已生成 {_testPlayers.Count} 个测试玩家";
}
private void CmbPlayers_SelectedIndexChanged(object sender, EventArgs e)
{
if (cmbPlayers.SelectedIndex >= 0 && cmbPlayers.SelectedIndex < _testPlayers.Count)
{
var (id, name) = _testPlayers[cmbPlayers.SelectedIndex];
lblPlayerid.Text = $"ID: {id}";
}
}
private void CmbEventType_SelectedIndexChanged(object sender, EventArgs e)
{
RefreshInputPanel();
}
private void RefreshInputPanel()
{
string evt = cmbEventType.SelectedItem?.ToString() ?? "";
switch (evt)
{
case "弹幕消息":
lblDynamic1.Text = "内容:";
txtDynamic1.Visible = true;
txtDynamic1.Text = "测试弹幕666";
lblDynamic2.Text = "";
txtDynamic2.Visible = false;
break;
case "点赞消息":
lblDynamic1.Text = "点赞数:";
txtDynamic1.Visible = true;
txtDynamic1.Text = "10";
lblDynamic2.Text = "";
txtDynamic2.Visible = false;
break;
case "礼物消息":
lblDynamic1.Text = "礼物名:";
txtDynamic1.Visible = true;
txtDynamic1.Text = "小心心";
lblDynamic2.Text = "数量:";
txtDynamic2.Visible = true;
txtDynamic2.Text = "1";
break;
case "直播间分享":
lblDynamic1.Text = "次数:";
txtDynamic1.Visible = true;
txtDynamic1.Text = "1";
lblDynamic2.Text = "";
txtDynamic2.Visible = false;
break;
default: // 关注/进房/粉丝团
lblDynamic1.Text = "无额外参数";
txtDynamic1.Visible = false;
lblDynamic2.Text = "";
txtDynamic2.Visible = false;
break;
}
}
private void BtnSendTest_Click(object sender, EventArgs e)
{
try
{
if (cmbPlayers.SelectedIndex < 0 || cmbPlayers.SelectedIndex >= _testPlayers.Count)
{
lblStatus.Text = "❌ 请先选择玩家";
return;
}
var (pid, pname) = _testPlayers[cmbPlayers.SelectedIndex];
string evt = cmbEventType.SelectedItem?.ToString() ?? "弹幕消息";
MsgUser user = new MsgUser
{
Id = pid,
Nickname = pname,
HeadImgUrl = DefaultAvatarUrl,
DisplayId = pid.ToString(),
Level = 10,
Gender = 1
};
BarrageMsgPack pack = null;
string desc = "";
switch (evt)
{
case "弹幕消息":
{
var msg = new Msg
{
MsgId = DateTime.Now.Ticks,
User = user,
Content = txtDynamic1.Text,
RoomId = "123456"
};
pack = new BarrageMsgPack(JsonConvert.SerializeObject(msg), PackMsgType.弹幕消息, "test");
desc = $"弹幕: {txtDynamic1.Text}";
}
break;
case "点赞消息":
{
long cnt = long.TryParse(txtDynamic1.Text, out var c) ? c : 1;
var msg = new LikeMsg
{
MsgId = DateTime.Now.Ticks,
User = user,
Count = cnt,
Total = cnt + 100,
RoomId = "123456"
};
pack = new BarrageMsgPack(JsonConvert.SerializeObject(msg), PackMsgType.点赞消息, "test");
desc = $"点赞 x{cnt}";
}
break;
case "礼物消息":
{
long cnt = long.TryParse(txtDynamic2.Text, out var gc) ? gc : 1;
var msg = new GiftMsg
{
MsgId = DateTime.Now.Ticks,
User = user,
GiftName = txtDynamic1.Text,
GiftCount = cnt,
GiftId = 100,
DiamondCount = 1,
RoomId = "123456"
};
pack = new BarrageMsgPack(JsonConvert.SerializeObject(msg), PackMsgType.礼物消息, "test");
desc = $"礼物: {txtDynamic1.Text} x{cnt}";
}
break;
case "关注消息":
{
var msg = new Msg
{
MsgId = DateTime.Now.Ticks,
User = user,
Content = "关注了主播",
RoomId = "123456"
};
pack = new BarrageMsgPack(JsonConvert.SerializeObject(msg), PackMsgType.关注消息, "test");
desc = "关注主播";
}
break;
case "进直播间":
{
var msg = new MemberMessage
{
MsgId = DateTime.Now.Ticks,
User = user,
CurrentCount = 999,
RoomId = "123456"
};
pack = new BarrageMsgPack(JsonConvert.SerializeObject(msg), PackMsgType.进直播间, "test");
desc = "进入直播间";
}
break;
case "直播间分享":
{
long cnt = long.TryParse(txtDynamic1.Text, out var sc) ? sc : 1;
var msg = new ShareMessage
{
MsgId = DateTime.Now.Ticks,
User = user,
ShareType = BarrageGrab.Modles.JsonEntity.ShareType.微信,
RoomId = "123456"
};
desc = $"分享 x{cnt}";
// 分享用次数送多次
for (int i = 0; i < cnt; i++)
{
pack = new BarrageMsgPack(JsonConvert.SerializeObject(msg), PackMsgType.直播间分享, "test");
barServer.Broadcast(pack);
}
lblStatus.Text = $"✅ 已发送: {pname}(ID:{pid}) → {desc}";
return;
}
case "粉丝团消息":
{
var msg = new FansclubMsg
{
MsgId = DateTime.Now.Ticks,
User = user,
Type = 2, // 加入
Level = 1,
RoomId = "123456"
};
pack = new BarrageMsgPack(JsonConvert.SerializeObject(msg), PackMsgType.粉丝团消息, "test");
desc = "加入粉丝团";
}
break;
}
if (pack != null)
{
barServer.Broadcast(pack);
lblStatus.Text = $"✅ 已发送: {pname}(ID:{pid}) → {desc}";
}
}
catch (Exception ex)
{
lblStatus.Text = $"❌ 发送失败: {ex.Message}";
}
}
}
}