diff --git a/CommandHandler.cs b/CommandHandler.cs index 3caadfe..c43015c 100644 --- a/CommandHandler.cs +++ b/CommandHandler.cs @@ -13,9 +13,6 @@ namespace DualScreenDemo private readonly int _maxHistoryLength = 6; // 最多保留 6 筆 public static readonly Queue _indataHistory = new Queue(); /* 顯示按鈕設定 */ - private int _wrongInputCountfor62 = 0; // 錯誤輸入計數器 - private int _wrongInputCountfor61 = 0; // 錯誤輸入計數器 - private const int MaxWrongLimit = 3; // 錯誤輸入限制次數 private readonly SQLManager songListManager; public CommandHandler(SQLManager songListManager) @@ -33,15 +30,13 @@ namespace DualScreenDemo switch (indata) { case "A261A4": // 輸入 - HandleInputA(); + HandleInput("a"); break; case "A262A4": // 插播 - HandleInputB(); + HandleInput("b"); break; case "A263A4": ClearDisplay(); - _wrongInputCountfor62 = 0; // 重置計數器 - _wrongInputCountfor61 = 0; // 重置計數器 _indataHistory.Clear(); // 清空歷史紀錄 break; case "A268A4": @@ -199,7 +194,7 @@ namespace DualScreenDemo } } - void InvokeAction(Action action) + static void InvokeAction(Action action) { if (OverlayForm.MainForm.InvokeRequired) { @@ -213,39 +208,21 @@ namespace DualScreenDemo - private static void SkipToNextSong() + private void SkipToNextSong() { - if (PrimaryForm.Instance.InvokeRequired) - PrimaryForm.Instance.Invoke(new System.Action(() => PrimaryForm.Instance.videoPlayerForm.PlayNextSong())); - else - PrimaryForm.Instance.videoPlayerForm.PlayNextSong(); - - OverlayForm.MainForm.Invoke(new System.Action(() => { OverlayForm.MainForm.ShowTopRightEchoLabel("標準迴音"); } ) ); + InvokeAction(() => PrimaryForm.Instance.videoPlayerForm.PlayNextSong()); + InvokeAction(() => OverlayForm.MainForm.ShowTopRightEchoLabel("標準迴音")); } - private static void ReplayCurrentSong() + private void ReplayCurrentSong() { - if (PrimaryForm.Instance.InvokeRequired) - { - PrimaryForm.Instance.Invoke(new System.Action(() => PrimaryForm.Instance.videoPlayerForm.ReplayCurrentSong())); - } - else - { - PrimaryForm.Instance.videoPlayerForm.ReplayCurrentSong(); - } + InvokeAction(() => PrimaryForm.Instance.videoPlayerForm.ReplayCurrentSong()); } private static void PauseOrResumeSong() { - if (PrimaryForm.Instance.InvokeRequired) - { - PrimaryForm.Instance.Invoke(new System.Action(() => PrimaryForm.Instance.videoPlayerForm.PauseOrResumeSong())); - } - else - { - PrimaryForm.Instance.videoPlayerForm.PauseOrResumeSong(); - } + InvokeAction(() => PrimaryForm.Instance.videoPlayerForm.PauseOrResumeSong()); } public static void ToggleMute() @@ -277,205 +254,63 @@ namespace DualScreenDemo } - private void HandleInputA() + private void HandleInput(string input) { - - - OverlayForm.displayTimer.Stop(); - string input = "a"; - - // 輸入歌曲 - string songNumber = OverlayForm.ReadSongNumber(); - //Console.WriteLine("輸入A " + songNumber + " readyForSongListInput : " + readyForSongListInput); - var song = songListManager.SearchSongByNumber(songNumber); - - - if (readyForSongListInput) { - - if (OverlayForm.MainForm.InvokeRequired) + InvokeAction(() => { - OverlayForm.MainForm.Invoke(new System.Action(() => - { - Console.WriteLine("F sign for input :" + input); - OverlayForm.MainForm.OnUserInput(input); - })); - } - else - { - Console.WriteLine("A sign for input :" + input); + Console.WriteLine("F sign for input :" + input); OverlayForm.MainForm.OnUserInput(input); - } + }); } else { - if (OverlayForm.MainForm.InvokeRequired) - { - OverlayForm.MainForm.Invoke(new System.Action(() => + InvokeAction(() => + { + OverlayForm.displayTimer.Stop(); + string songNumber = OverlayForm.ReadSongNumber(); + var song = songListManager.SearchSongByNumber(songNumber); + ClearDisplay(); + if (song != null) { - if (song != null) + if (Program.room.IsOpen()) { - ClearDisplay(); - OverlayForm.MainForm.displayLabel.Text = String.Format("已點歌曲:{0}", song); - SongList.Add(song); - OverlayForm.MainForm.topLeftLabel.Visible = false; - OverlayForm.displayTimer.Start(); + if (input.Equals("a")) + { + OverlayForm.MainForm.displayLabel.Text = String.Format("已點歌曲:{0}", song); + SongList.Add(song); + } + else + { + OverlayForm.MainForm.displayLabel.Text = String.Format("插播歌曲:{0}", song); + SongList.Insert(song); + } } else { - ClearDisplay(); - _wrongInputCountfor61++; - if(_wrongInputCountfor61 <= MaxWrongLimit) - { - string old =""; - OverlayForm.MainForm.displayLabel.Text = check_control(old); - } - else - { - OverlayForm.MainForm.displayLabel.Text = "輸入錯誤!!!"; - _indataHistory.Clear(); // 清空歷史紀錄 - _wrongInputCountfor61 = 0; // 重置計數器 - } - OverlayForm.MainForm.topLeftLabel.Visible = false; - OverlayForm.displayTimer.Start(); + OverlayForm.MainForm.displayLabel.Text = "包廂己關閉"; } - })); - } - else - { - if (song != null) - { - ClearDisplay(); - OverlayForm.MainForm.displayLabel.Text = String.Format("{0}", song); - SongList.Add(song); - OverlayForm.MainForm.topLeftLabel.Visible = false; - OverlayForm.displayTimer.Start(); + + _indataHistory.Clear(); // 清空歷史紀錄 } else - { - ClearDisplay(); - _wrongInputCountfor61++; - if(_wrongInputCountfor61 <= MaxWrongLimit) - { - string old =""; - OverlayForm.MainForm.displayLabel.Text = check_control(old); - } - else - { - OverlayForm.MainForm.displayLabel.Text = "輸入錯誤!!!"; - _indataHistory.Clear(); // 清空歷史紀錄 - _wrongInputCountfor61 = 0; // 重置計數器 - } - OverlayForm.MainForm.topLeftLabel.Visible = false; - OverlayForm.displayTimer.Start(); - } - } + OverlayForm.MainForm.displayLabel.Text = check_control(); + OverlayForm.MainForm.topLeftLabel.Visible = false; + OverlayForm.displayTimer.Start(); + }); } } - private string check_control(string old){ - foreach(string item in _indataHistory) + private string check_control(){ + string str = ""; + foreach (string item in _indataHistory) { - if(item == "A261A4") - old += "#"; - else if(item == "A262A4") - old += "*"; - } - return old; - } - - - private void HandleInputB() - { - - OverlayForm.displayTimer.Stop(); - string input = "b"; - - - string songNumber = OverlayForm.ReadSongNumber(); - var song = songListManager.SearchSongByNumber(songNumber); - - - - if (readyForSongListInput) - { - - if (OverlayForm.MainForm.InvokeRequired) - { - OverlayForm.MainForm.Invoke(new System.Action(() => - { - Console.WriteLine("B sign for input :" + input); - OverlayForm.MainForm.OnUserInput(input); - })); - } - else - { - Console.WriteLine("C sign for input :" + input); - OverlayForm.MainForm.OnUserInput(input); - } - } - else - { - if (OverlayForm.MainForm.InvokeRequired) - { - OverlayForm.MainForm.Invoke(new System.Action(() => - { - if (song != null) - { - ClearDisplay(); - OverlayForm.MainForm.displayLabel.Text = String.Format("插播歌曲{0}", song); - SongList.Insert(song); - OverlayForm.MainForm.topLeftLabel.Visible = false; - OverlayForm.displayTimer.Start(); - } - else - { - ClearDisplay(); - _wrongInputCountfor62++; - if(_wrongInputCountfor62 <= MaxWrongLimit) - { - string old =""; - OverlayForm.MainForm.displayLabel.Text = check_control(old); - } - else - { - OverlayForm.MainForm.displayLabel.Text = "輸入錯誤!!!"; - _indataHistory.Clear(); // 清空歷史紀錄 - _wrongInputCountfor62 = 0; // 重置計數器 - } - OverlayForm.MainForm.topLeftLabel.Visible = false; - OverlayForm.displayTimer.Start(); - } - })); - } - else - { - if (song != null) - { - ClearDisplay(); - OverlayForm.MainForm.displayLabel.Text = String.Format("已點歌曲:{0}", song); - OverlayForm.MainForm.topLeftLabel.Visible = false; - } - else - { - ClearDisplay(); - _wrongInputCountfor62++; - if(_wrongInputCountfor62 <= MaxWrongLimit) - { - string old =""; - OverlayForm.MainForm.displayLabel.Text = check_control(old); - } - else - { - OverlayForm.MainForm.displayLabel.Text = "輸入錯誤!!!"; - _indataHistory.Clear(); // 清空歷史紀錄 - _wrongInputCountfor62 = 0; // 重置計數器 - } - OverlayForm.MainForm.topLeftLabel.Visible = false; - OverlayForm.displayTimer.Start(); - } - } + if (item == "A261A4") + str += "#"; + else if (item == "A262A4") + str += "*"; } + return str; } /// @@ -487,14 +322,7 @@ namespace DualScreenDemo OverlayForm.displayTimer.Stop(); // 判斷是否需要透過 Invoke 回 UI 執行緒執行 - if (OverlayForm.MainForm.InvokeRequired) - { - OverlayForm.MainForm.Invoke(new Action(ClearControlsAndReset)); - } - else - { - ClearControlsAndReset(); - } + InvokeAction(() => ClearControlsAndReset()); } /// @@ -562,28 +390,19 @@ namespace DualScreenDemo for (int i = startIndex; i < endIndex; i++) { historySongs.Add(history[i]); } - + // 錨點 遙控器 // 安全更新 UI:若非 UI 執行緒則使用 Invoke 切換 - if (OverlayForm.MainForm.InvokeRequired) + InvokeAction(() => { - OverlayForm.MainForm.Invoke(new System.Action(() => - { - // 更新主畫面的歷史播放顯示區 - OverlayForm.MainForm.UpdateHistoryLabel(historySongs, OverlayForm.MainForm.currentPage, totalPages); - - // 隱藏下一首提示 - OverlayForm.MainForm.topLeftLabel.Visible = false; - })); - } - else - { - // 若已在 UI 執行緒,直接操作 + // 更新主畫面的歷史播放顯示區 OverlayForm.MainForm.UpdateHistoryLabel(historySongs, OverlayForm.MainForm.currentPage, totalPages); - OverlayForm.MainForm.topLeftLabel.Visible = false; - } + // 隱藏下一首提示 + OverlayForm.MainForm.topLeftLabel.Visible = false; + }); + // 切換 UI 狀態為播放歷史模式(可做為內部狀態管理用途) OverlayForm.SetUIState(OverlayForm.UIState.PlayHistory); } @@ -595,55 +414,18 @@ namespace DualScreenDemo { if (OverlayForm.CurrentUIState == OverlayForm.UIState.SelectingSong) { - - if (OverlayForm.MainForm.InvokeRequired) - { - OverlayForm.MainForm.Invoke(new System.Action(() => - { - - OverlayForm.MainForm.PreviousPage(); - })); - } - else - { - - OverlayForm.MainForm.PreviousPage(); - } + InvokeAction(() =>OverlayForm.MainForm.PreviousPage()); } else if (OverlayForm.CurrentUIState == OverlayForm.UIState.SelectingArtist) { - - if (OverlayForm.MainForm.InvokeRequired) - { - OverlayForm.MainForm.Invoke(new System.Action(() => - { - - OverlayForm.MainForm.PreviousPage(); - })); - } - else - { - - OverlayForm.MainForm.PreviousPage(); - } + InvokeAction(() =>OverlayForm.MainForm.PreviousPage()); } else if (OverlayForm.CurrentUIState == OverlayForm.UIState.PlayHistory) { if (OverlayForm.MainForm.currentPage > 1) { OverlayForm.MainForm.currentPage--; - - if (OverlayForm.MainForm.InvokeRequired) - { - OverlayForm.MainForm.Invoke(new System.Action(() => - { - DisplaySongHistory(); - })); - } - else - { - DisplaySongHistory(); - } + InvokeAction(() => DisplaySongHistory()); } } else @@ -656,37 +438,11 @@ namespace DualScreenDemo { if (OverlayForm.CurrentUIState == OverlayForm.UIState.SelectingSong) { - - if (OverlayForm.MainForm.InvokeRequired) - { - OverlayForm.MainForm.Invoke(new System.Action(() => - { - - OverlayForm.MainForm.NextPage(); - })); - } - else - { - - OverlayForm.MainForm.NextPage(); - } + InvokeAction(() => OverlayForm.MainForm.NextPage()); } else if (OverlayForm.CurrentUIState == OverlayForm.UIState.SelectingArtist) { - - if (OverlayForm.MainForm.InvokeRequired) - { - OverlayForm.MainForm.Invoke(new System.Action(() => - { - - OverlayForm.MainForm.NextPage(); - })); - } - else - { - - OverlayForm.MainForm.NextPage(); - } + InvokeAction(() => OverlayForm.MainForm.NextPage() ); } else if (OverlayForm.CurrentUIState == OverlayForm.UIState.PlayHistory) { @@ -695,17 +451,7 @@ namespace DualScreenDemo OverlayForm.MainForm.currentPage++; if (OverlayForm.CurrentUIState == OverlayForm.UIState.PlayHistory) { - if (OverlayForm.MainForm.InvokeRequired) - { - OverlayForm.MainForm.Invoke(new System.Action(() => - { - DisplaySongHistory(); - })); - } - else - { - DisplaySongHistory(); - } + InvokeAction(() => DisplaySongHistory() ); } } } @@ -803,30 +549,8 @@ namespace DualScreenDemo private static void UpdateDisplayLabels(string[] messages) { - if (OverlayForm.MainForm.InvokeRequired) + InvokeAction(() => { - OverlayForm.MainForm.Invoke(new System.Action(() => - { - - foreach (var control in OverlayForm.MainForm.Controls.OfType().ToArray()) - { - if (control != OverlayForm.MainForm.displayLabel && - control != OverlayForm.MainForm.pauseLabel && - control != OverlayForm.MainForm.muteLabel && - control != OverlayForm.MainForm.topRightLabel && - control != OverlayForm.MainForm.blackBackgroundPanel && - control != OverlayForm.MainForm.topLeftLabel) - { - OverlayForm.MainForm.Controls.Remove(control); - control.Dispose(); - } - } - OverlayForm.MainForm.UpdateDisplayLabels(messages); - })); - } - else - { - foreach (var control in OverlayForm.MainForm.Controls.OfType().ToArray()) { if (control != OverlayForm.MainForm.displayLabel && @@ -841,7 +565,7 @@ namespace DualScreenDemo } } OverlayForm.MainForm.UpdateDisplayLabels(messages); - } + }); } private static void HandleNumberInput(string trimmedData) @@ -861,38 +585,19 @@ namespace DualScreenDemo if (readyForSongListInput) { - - if (OverlayForm.MainForm.InvokeRequired) + InvokeAction(() => { - OverlayForm.MainForm.Invoke(new System.Action(() => - { - Console.WriteLine("D sign for number :" + number); - OverlayForm.MainForm.OnUserInput(number); - })); - } - else - { - Console.WriteLine("E sign for number :" + number); - OverlayForm.MainForm.OnUserInput(number); - } - + Console.WriteLine("D sign for number :" + number); + OverlayForm.MainForm.OnUserInput(number); + }); } else { - - if (OverlayForm.MainForm.InvokeRequired) - { - OverlayForm.MainForm.Invoke(new System.Action(() => - { - OverlayForm.MainForm.HideTopRightLabels(); - OverlayForm.DisplayNumberAtTopLeft(number); - })); - } - else + InvokeAction(() => { OverlayForm.MainForm.HideTopRightLabels(); OverlayForm.DisplayNumberAtTopLeft(number); - } + }); } } diff --git a/DBObj/SQLManager.cs b/DBObj/SQLManager.cs index e49218a..250dcaa 100644 --- a/DBObj/SQLManager.cs +++ b/DBObj/SQLManager.cs @@ -54,12 +54,12 @@ namespace DBObj */ public List SearchNewSongs() { - string query = $"SELECT * FROM song_library_cache WHERE language_name = '國語' ORDER BY add_date DESC LIMIT {Utils.Env.GetInt("NewSongLimit", 100)};"; + string query = $"SELECT * FROM song_library_cache WHERE language_name = '國語' ORDER BY add_date DESC LIMIT 1000;"; return select_Mysql(query); } public List SearchHotSongs() { - string query = $"SELECT * FROM song_library_cache WHERE language_name = '國語' ORDER BY song_counts DESC LIMIT {Utils.Env.GetInt("HotSongLimit", 100)};"; + string query = $"SELECT * FROM song_library_cache WHERE language_name = '國語' ORDER BY song_counts DESC LIMIT 1000;"; return select_Mysql(query); } public List SearchSongsBySinger(string keyword) diff --git a/DBObj/SongData.cs b/DBObj/SongData.cs index db72a72..a04b424 100644 --- a/DBObj/SongData.cs +++ b/DBObj/SongData.cs @@ -141,10 +141,7 @@ namespace DBObj public int getHumanVoice() { return basic.getHumanVoice(); } public override string ToString() { - - return B!=null - ? String.Format("{0} - {1} - {2} - {3}", state, A.getName(), B.getName(), basic.getName()) - : String.Format("{0} - {1} - {2}", state, A.getName(), basic.getName()); + return String.Format("{0} {1}", basic.getName(),state.GetDescription() ); } } } \ No newline at end of file diff --git a/DBObj/SongList.cs b/DBObj/SongList.cs index 9931b2a..547480b 100644 --- a/DBObj/SongList.cs +++ b/DBObj/SongList.cs @@ -129,12 +129,26 @@ namespace DBObj } } + public static void roomClose() + { + SongData song; + while (not_played.Count > 0) + { + song = not_played[0]; + not_played.RemoveAt(0); + song.SetState(PlayState.Skipped); + played.Add(song); + } + + Add(close); + } public static void clearSong() { - + isWelcome = true; not_played.Clear(); played.Clear(); } + } } diff --git a/OverlayFormObj/OverlayForm.cs b/OverlayFormObj/OverlayForm.cs index cacbe49..fcee082 100644 --- a/OverlayFormObj/OverlayForm.cs +++ b/OverlayFormObj/OverlayForm.cs @@ -1303,11 +1303,11 @@ private void DisplayArtists(List artists, int page)//歌星點進去後 if (category == Category.NewSongs) { - sqlQuery = $"SELECT * FROM song_library_cache WHERE language_name = '{language}' ORDER BY add_date DESC LIMIT {Utils.Env.GetInt("NewSongLimit", 100)};"; + sqlQuery = $"SELECT * FROM song_library_cache WHERE language_name = '{language}' ORDER BY add_date DESC LIMIT 1000;"; } else if (category == Category.HotSongs) { - sqlQuery = $"SELECT * FROM song_library_cache WHERE language_name = '{language}' ORDER BY song_counts DESC LIMIT {Utils.Env.GetInt("HotSongLimit", 100)};"; + sqlQuery = $"SELECT * FROM song_library_cache WHERE language_name = '{language}' ORDER BY song_counts DESC LIMIT 1000;"; } else { diff --git a/PrimaryFormParts/NewSongAlert/PrimaryForm.NewSongAlert.cs b/PrimaryFormParts/NewSongAlert/PrimaryForm.NewSongAlert.cs index e955e1e..f777a46 100644 --- a/PrimaryFormParts/NewSongAlert/PrimaryForm.NewSongAlert.cs +++ b/PrimaryFormParts/NewSongAlert/PrimaryForm.NewSongAlert.cs @@ -83,7 +83,6 @@ namespace DualScreenDemo /* 清空搜尋欄 */ ResetinputBox(); - string query = setQueryforNewSong("國語"); var guoYuSongs2 = SearchSongs_Mysql(query); currentPage = 0; diff --git a/Program.cs b/Program.cs index f852673..6d9f035 100644 --- a/Program.cs +++ b/Program.cs @@ -13,7 +13,7 @@ namespace DualScreenDemo private static PrimaryForm primaryForm; // 儲存實例的參考 public static Room room = new Room(); - public static string verSion = "Server V2.6 202508011600"; + public static string verSion = "Server V2.7 202508041725"; [STAThread] static void Main() diff --git a/PublicSongChecker.cs b/PublicSongChecker.cs index ea8fdd0..c7662da 100644 --- a/PublicSongChecker.cs +++ b/PublicSongChecker.cs @@ -57,7 +57,7 @@ namespace DataCheck if (fileName == "welcome") { DBObj.SongList.welcome=new SongData("0", "歡迎光臨", @"D:\video\welcome.mpg", 1 ,true); } else if (fileName == "CLOSE") { - DBObj.SongList.close =new SongData("0", "結束播放", @"D:\video\CLOSE.MPG", 1 ,true); + DBObj.SongList.close =new SongData("0", "謝謝光臨", @"D:\video\CLOSE.MPG", 1 ,true); } else { //Console.WriteLine($"{fileName} {Path.Combine(localPath, serverFile.Key)}"); publicList.Add(new SongData( diff --git a/Room.cs b/Room.cs index da070b5..2f76870 100644 --- a/Room.cs +++ b/Room.cs @@ -11,12 +11,14 @@ namespace DualScreenDemo public string hostName; private string State = "error"; + private DateTime? startedAt; + private DateTime? endedAt; public Room() { hostName = System.Net.Dns.GetHostName(); - branch_id =getBranchId(); - State =getDB(); - Console.WriteLine($"hostname status: {hostName},{State}"); + branch_id = getBranchId(); + State = getDB(); + Console.WriteLine($"hostname status: {hostName},{State},{startedAt},{endedAt}"); } private int getBranchId() { @@ -40,7 +42,9 @@ namespace DualScreenDemo if (db.open(query, parameters) && db.found()) { State = db.Field("status"); - if (State.Equals("maintai")) { State = "active"; } + startedAt=ParseTime(db.Field("started_at")); + endedAt=ParseTime(db.Field("ended_at")); + if (State.Equals("maintain")) { State = "active"; } return State; } } @@ -61,16 +65,18 @@ namespace DualScreenDemo } public void set(string value) { + State =getDB(); + Console.WriteLine($"hostname status: {hostName},{State},{startedAt},{endedAt}"); string marqueeMessage = "歡迎使用超級巨星歡唱,與你共度美好時光。"; Color c = Color.White; - if (value.Equals("fire")) + if (State.Equals("fire")) { PrimaryForm.Instance.ShowSendOffScreen(); VideoPlayerForm.Instance.Pause(); marqueeMessage = "發生火災,請跟隨引導至逃生出口!!!"; c = Color.Red; } - else if (value.Equals("active")) + else if (State.Equals("active")) { DBObj.SongList.clearSong(); PrimaryForm.Instance.HotPlayButton_Click(null, EventArgs.Empty); @@ -78,7 +84,7 @@ namespace DualScreenDemo } else { - DBObj.SongList.clearSong(); + DBObj.SongList.roomClose(); PrimaryForm.Instance.pictureBoxQRCode.Visible = false; PrimaryForm.Instance.closeQRCodeButton.Visible = false; PrimaryForm.Instance.ShowSendOffScreen(); @@ -86,14 +92,20 @@ namespace DualScreenDemo OverlayForm.MainForm.topLeftLabel.Visible = false; - VideoPlayerForm.Instance.PlayNextSong(); + //VideoPlayerForm.Instance.PlayNextSong(); PrimaryForm.Instance.logout(); } - State =getDB(); + OverlayForm.MainForm.UpdateMarqueeText(marqueeMessage, OverlayForm.MarqueeStartPosition.Middle, c); } + private DateTime? ParseTime(string value) + { + if (DateTime.TryParse(value, out var dt)) + return dt; + return null; + } public bool IsClose() { return State.Equals("closed");