RyLiveTools/Source/Tools/Direct/FrmDirectView.xaml.cs
如果当时 0ec1400de9 ### 2024-04-12更新
------
####  V1.0.2404.1201
- 新增支持手动运行规则。
- 规则播放时间间隔不再针对全局声效,而只针对当前规则声效。
- 修复规则中播放文件夹可能导致无法执行的BUG。
- 修复规则不勾选礼物和点赞,则无法执行的BUG。
2024-04-13 10:13:30 +08:00

362 lines
14 KiB
C#

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Messaging;
using LiveTools.Data;
using Newtonsoft.Json.Linq;
using ryCommon;
using ryCommonDb;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Linq;
using System.Reflection.Metadata;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace LiveTools
{
/// <summary>
/// FrmRuleView.xaml 的交互逻辑
/// </summary>
public partial class FrmDirectView : UserControl
{
public FrmDirectView()
{
InitializeComponent();
Config.CreateDb();
LvLogs.ItemsSource = list_logs;
LvGiftLogs.ItemsSource = list_gift_logs;
LoadDb();
WeakReferenceMessenger.Default.Register<MsgToken>(this, OnReceive);
}
public ObservableCollection<LogInfo> list_logs { get; set; } = new ObservableCollection<LogInfo>();
public ObservableCollection<GiftLogInfo> list_gift_logs { get; set; } = new ObservableCollection<GiftLogInfo>();
public ObservableCollection<DirectInfo> list { get; set; } = new ObservableCollection<DirectInfo>();
public void LoadDb()
{
IDbInterface db = new SQLiteDataProvider();
db.ConnDb(LiveTools.Config.DbFullPath);
var ds = db.ReadData("select * from Direct");
//this.DataContext = DataList;
list.Clear();
if (ds.HaveData())
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
var row = ds.GetRow(i);
list.Add(new DirectInfo() {Id=row["id"].ToInt(), Name = row["Name"].ToString()??"", Platform = row["Platform"].ToString() ?? "", DirectId = row["DirectId"].ToString() ?? "", EditTime = row["EditTime"].ToInt64().ToDateTime().ToString()});
}
}
ds?.Dispose();
LvDirect.ItemsSource = list;
db.Free();
}
private void BtnAdd_Click(object sender, RoutedEventArgs e)
{
FrmAddDirect frm = new FrmAddDirect
{
SelectedId = -1,
Owner = Application.Current.MainWindow,
};
if (frm.ShowDialog()==true)
{
LoadDb();
}
}
private void EditDirect()
{
var row = LvDirect.SelectedItem as DirectInfo;
if (row == null) { return; }
FrmAddDirect frm = new FrmAddDirect
{
SelectedId = row.Id,
Title = "修改直播",
Owner = Application.Current.MainWindow,
};
frm.GetInfo();
if (frm.ShowDialog() == true)
{
LoadDb();
}
}
private void BtnEdit_Click(object sender, RoutedEventArgs e)
{
EditDirect();
}
private void LvRules_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
var row = LvDirect.SelectedItem as DirectInfo;
if (row == null) { return; }
EditDirect();
}
private void BtnDel_Click(object sender, RoutedEventArgs e)
{
var row = LvDirect.SelectedItem as DirectInfo;
if (row == null) { return; }
if(HandyControl.Controls.MessageBox.Show("一旦删除,将无法恢复。确定要删除吗?","警告",MessageBoxButton.OKCancel)!= MessageBoxResult.OK)
{
return;
}
IDbInterface db = new SQLiteDataProvider();
db.ConnDb(LiveTools.Config.DbFullPath);
db.DelById("Direct", row.Id.ToString());
list.Remove(row);
db.Free();
}
private void LvRules_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var point = e.GetPosition(null);
var hitTestResult = VisualTreeHelper.HitTest(LvDirect, point);
if (hitTestResult == null)
{
LvDirect.SelectedItem = null;
}
else if(hitTestResult.VisualHit is ScrollViewer)
{
LvDirect.SelectedItem = null;
}
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
}
private void OnReceive(object recipient, MsgToken message)
{
if (message.Value is EffectInfo info)
{
if (message.Msg == "Close")
{
for (int i = 0; i < list.Count; i++)
{
if (list[i].Id == info.ID)
{
list[i].State = "";
var row = LvDirect.SelectedItem as DirectInfo;
if (row != null && row.Id== info.ID)
{
BtnStart.Content = "开启监控";
BtnTestGifts.IsEnabled = false;
}
break;
}
}
}
}
}
private void BtnStart_Click(object sender, RoutedEventArgs e)
{
if(Config.MustUpdate)
{
HandyControl.Controls.MessageBox.Show("当前版本已经过老,请更新到新版再使用。", "提示");
RyFiles.OpenUrl(Config.NewVerUrl);
return;
}
var row = LvDirect.SelectedItem as DirectInfo;
if (row == null) { return; }
///如果已经过期
if (Config.UserInfo.UserId.Length == 0 || Config.UserInfo.OutTime < DateTime.Now.ToInt64() || Config.UserInfo.isOut == 1)
{
HandyControl.Controls.MessageBox.Show("当前账号VIP有效期已经过期,请及时续费,否则功能将失效。", "提示");
}
if (row.State.Length == 0)
{
row.State = "运行中";
BtnTestGifts.IsEnabled = true;
BtnStart.Content = "停止监控";
FrmWeb frmWeb = new FrmWeb();
frmWeb.DirectInfo = row;
frmWeb.Show();
FrmEffects frmEffects = new FrmEffects();
frmEffects.Title = row.Name + "-" + row.Platform + "特效";
frmEffects.DirectInfo = row;
frmEffects.Show();
}
else
{
EffectInfo effectInfo = new EffectInfo();
effectInfo.ID = row.Id;
effectInfo.EffectMode = -1;
WeakReferenceMessenger.Default.Send<MsgToken>(new MsgToken(effectInfo) { ID = MsgTokenId.Effects, From = "Web", Msg = "Close" });
WeakReferenceMessenger.Default.Send<MsgToken>(new MsgToken(effectInfo) { ID = MsgTokenId.Effects, From = "Effects", Msg = "Close" });
}
}
private void LvDirect_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
list_logs.Clear();
list_gift_logs.Clear();
if (e.AddedItems.Count==1)
{
var row = e.AddedItems[0] as DirectInfo;
if (row == null) { return; }
if(row.State == "运行中")
{
BtnStart.Content = "停止监控";
BtnTestGifts.IsEnabled = true;
}
else
{
BtnStart.Content = "开启监控";
BtnTestGifts.IsEnabled = false;
}
if (System.IO.File.Exists(Config.UserDbFolder + "\\DirectLogs\\" + row.Id + ".log.data"))
{
var time = DateTime.Now.Date;
IDbInterface db_logs = new SQLiteDataProvider();
db_logs.ConnDb(Config.UserDbFolder + "\\DirectLogs\\" + row.Id + ".log.data");
var ds = db_logs.ReadData("select * from Logs where AddTime>="+time.ToInt64()+ " and AddTime<"+ time.AddDays(1).ToInt64()+" order by AddTime desc");
if (ds.HaveData())
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
var item = ds.GetRow(i);
list_logs.Add(new LogInfo() {
Id = item["id"].ToInt(),
Content= item["NickName"].ToString()+":"+ item["Content"].ToString(),
AddTime= item["AddTime"].ToInt64().ToDateTime()
});
}
}
ds?.Dispose();
var ds_gifts = db_logs.ReadData("select distinct giftFileName from GiftLogs where AddTime>=" + time.ToInt64() + " and AddTime<" + time.AddDays(1).ToInt64());
if (ds_gifts.HaveData())
{
for (int i = 0; i < ds_gifts.Tables[0].Rows.Count; i++)
{
var item = ds_gifts.GetRow(i);
if ((item[0].ToString()??"").Length == 0) { continue; }
var ds_gift_count=db_logs.ReadData("select sum(GiftCount) from GiftLogs where AddTime>=" + time.ToInt64() + " and AddTime<" + time.AddDays(1).ToInt64()+ " and giftFileName='"+ item[0].ToString() + "'");
list_gift_logs.Add(new GiftLogInfo() { ImgPath= Config.AllUserDbFolder + "\\GiftImages\\Auto\\" + item[0].ToString(), Content=ds_gift_count.GetFirstRowCellValue()+"个" });
ds_gift_count?.Dispose();
}
}
ds_gifts?.Dispose();
db_logs.Free();
}
}
else
{
BtnTestGifts.IsEnabled = false;
}
}
private void BtnTestGifts_Click(object sender, RoutedEventArgs e)
{
var row = LvDirect.SelectedItem as DirectInfo;
if (row == null) { return; }
if (row.State.Length == 0) { return; }
EffectInfo effectInfo = new EffectInfo();
effectInfo.ID = row.Id;
effectInfo.LoopCount = 1;
var picPath = "";
var gifts = System.IO.Directory.GetFiles(Config.SysDbFolder+ "\\Gifts","*.png");
if(gifts!=null && gifts.Length>0)
{
Random rd = new Random();
picPath = gifts[rd.Next(0, gifts.Length)];
}
if (picPath.Length > 0)
{
JObject jo = new JObject()
{
{ "Name","Rule_ShowPic"},
{ "Mode","ShowPic"},
{ "PlaySound", Config.PlaySound},
{ "PicPath",API.GetRelativePath(picPath) },
{ "PicSize",Config.PicSize },
{ "PicCount", Config.PicCount },
{ "MultiPlaySound", Config.MultiPlaySound },
};
JArray jarr = new JArray();
jarr.Add(jo);
effectInfo.ActionList = jarr;
}
//HandyControl.Controls.MessageBox.Show(row["RuleName"].ToString());
WeakReferenceMessenger.Default.Send<MsgToken>(new MsgToken(effectInfo) { ID = MsgTokenId.Effects, From = "Web", Msg = "222" });
}
}
public class LogInfo : ObservableObject
{
/// <summary>
/// id
/// </summary>
public int Id { get; set; } = 0;
/// <summary>
/// AddTime
/// </summary>
public DateTime AddTime { get; set; } = DateTime.Now;
/// <summary>
/// AddTimeStr
/// </summary>
public string AddTimeStr {
get
{
return AddTime.ToString("HH:mm:ss");
}
}
/// <summary>
/// Content
/// </summary>
public string Content { get; set; } = "";
}
public class GiftLogInfo : ObservableObject
{
/// <summary>
/// id
/// </summary>
public int Id { get; set; } = 0;
/// <summary>
/// Content
/// </summary>
public string ImgPath { get; set; } = "";
/// <summary>
/// Content
/// </summary>
public string Content { get; set; } = "";
}
public class DirectInfo : ObservableObject
{
/// <summary>
/// id
/// </summary>
public int Id { get; set; } = 0;
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; } = "";
/// <summary>
/// 直播平台
/// </summary>
public string Platform { get; set; } = "";
/// <summary>
/// 直播ID
/// </summary>
public string DirectId { get; set; } = "";
/// <summary>
/// 编辑时间
/// </summary>
public string EditTime { get; set; } = "";
private string _state="";
/// <summary>
/// 状态
/// </summary>
public string State {
get => _state;
set => SetProperty(ref _state, value);
}
}
}