");
+ int main_version, engine_version, sa_version;
+ if (int.TryParse(arr[0], out main_version) && int.TryParse(arr[1], out engine_version))
+ {
+
+ }
+ }
+ // todo open faile update dialog
+ }
+
+ public static void DownLoad(string Url, string FileName)
+ {
+ bool Value = false;
+ WebResponse response = null;
+ Stream stream = null;
+
+ try
+ {
+ HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
+
+ response = request.GetResponse();
+ stream = response.GetResponseStream();
+
+ if (!response.ContentType.ToLower().StartsWith("text/"))
+ {
+ Value = SaveBinaryFile(response, FileName);
+
+ }
+
+ }
+ catch (Exception err)
+ {
+ string aa = err.ToString();
+ }
+
+ }
+
+ private static bool SaveBinaryFile(WebResponse response, string FileName)
+ {
+ bool Value = true;
+ byte[] buffer = new byte[1024];
+
+ try
+ {
+ if (File.Exists(FileName))
+ File.Delete(FileName);
+ Stream outStream = File.Create(FileName);
+ Stream inStream = response.GetResponseStream();
+
+ int l;
+ do
+ {
+ l = inStream.Read(buffer, 0, buffer.Length);
+ if (l > 0)
+ outStream.Write(buffer, 0, l);
+ }
+ while (l > 0);
+
+ outStream.Close();
+ inStream.Close();
+ }
+ catch
+ {
+ Value = false;
+ }
+ return Value;
+ }
+
+ }
+}
diff --git a/Manager/VersionManager.cs b/Manager/VersionManager.cs
new file mode 100644
index 0000000..cfe7e64
--- /dev/null
+++ b/Manager/VersionManager.cs
@@ -0,0 +1,8 @@
+namespace Zerolauncher.Manager
+{
+ class VersionManager
+ {
+ public static int GetMainVer() { return 10001; }
+
+ }
+}
diff --git a/Manager/WebApiManager.cs b/Manager/WebApiManager.cs
new file mode 100644
index 0000000..c4b9703
--- /dev/null
+++ b/Manager/WebApiManager.cs
@@ -0,0 +1,159 @@
+using System.Diagnostics;
+using System.IO;
+using System.Net;
+using System.Text;
+namespace Zerolauncher.Manager
+{
+ internal class WebApiManager
+ {
+ static HttpListener listener = new HttpListener();
+ static CancellationTokenSource cts = new CancellationTokenSource();
+ public static async Task StartListener()
+ {
+ listener.Prefixes.Add("http://127.0.0.1:7233/");
+ listener.Start();
+ Trace.WriteLine("Listening...");
+
+ while (!cts.Token.IsCancellationRequested)
+ {
+ HttpListenerContext context = await listener.GetContextAsync();
+ HttpListenerRequest request = context.Request;
+ HttpListenerResponse response = context.Response;
+ var raw = request.RawUrl;
+ ResponesBody? rb = null;
+ if (raw != null && raw.Contains("?"))
+ {
+ var lines = raw.Split("?");
+ var args = request.QueryString;
+ var nick = args["name"];
+ if (nick != null)
+ {
+ var acc = TeamManager.Nick2Acc(nick);
+ if (acc != null)
+ {
+ switch (lines[0])
+ {
+ case "/CloseGame":
+ {
+ if (EngineManager.ExitGame(acc))
+ {
+ rb = new ResponesBody(1, 0, $"Account [{nick}] successful to close.");
+ }
+ else
+ {
+ rb = new ResponesBody($"Account [{nick}] is unluacher.");
+ break;
+ }
+ }
+ break;
+ case "/ToNormalSize":
+ {
+ switch (EngineManager.TurnGameSizeNormal(acc))
+ {
+ case 2:
+ rb = new ResponesBody(1, 0, $"Account [{nick}] now is normal size.");
+ break;
+ case 1:
+ rb = new ResponesBody(0, 0, $"Account [{nick}] is loading, please wait.");
+ break;
+ case 0:
+ rb = new ResponesBody($"Account [{nick}] is unluacher.");
+ break;
+ }
+ }
+ break;
+ case "/ToMiniSize":
+ {
+ switch (EngineManager.TurnGameSizeMini(acc))
+ {
+ case 2:
+ rb = new ResponesBody(1, 0, $"Account [{nick}] now is mini size.");
+ break;
+ case 1:
+ rb = new ResponesBody(0, 0, $"Account [{nick}] is loading, please wait.");
+ break;
+ case 0:
+ rb = new ResponesBody($"Account [{nick}] is unluacher.");
+ break;
+ }
+ }
+ break;
+ case "/LoginGame":
+ {
+ if (EngineManager.CreateGame(acc))
+ {
+ rb = new ResponesBody(0, 0, $"Account [{nick}] successful to start.");
+ }
+ else
+ {
+ int hwnd = EngineManager.CheckGameState(acc);
+ if (hwnd <= 0)
+ {
+ rb = new ResponesBody(0, 0, $"Account [{nick}] is loading, please wait.");
+ }
+ else
+ {
+ rb = new ResponesBody(1, hwnd, $"Account [{nick}] now is running.");
+ }
+ }
+ }
+ break;
+ default:
+ rb = new ResponesBody($"commad [{lines[0]}] undefind.");
+ break;
+ }
+ }
+ else
+ {
+ rb = new ResponesBody($"Account [{nick}] undefind.");
+ }
+ }
+ else
+ {
+ rb = new ResponesBody("args is missing.");
+ }
+
+ }
+ if (rb == null)
+ {
+ rb = new ResponesBody();
+ }
+ byte[] buffer = Encoding.UTF8.GetBytes(rb.Encode());
+
+ response.ContentLength64 = buffer.Length;
+ Stream output = response.OutputStream;
+ await output.WriteAsync(buffer, 0, buffer.Length);
+ output.Close();
+ }
+ listener.Stop();
+ }
+
+ public static void StopListener() { cts.Cancel(); }
+ }
+
+ class ResponesBody
+ {
+ public int status;
+ public int hwnd;
+ public string message;
+
+ public ResponesBody(string message)
+ {
+ this.status = -1;
+ this.hwnd = 0;
+ this.message = message;
+ }
+
+ public ResponesBody(int status=-1, int hwnd=0, string message= "Hello, World!")
+ {
+ this.status = status;
+ this.hwnd = hwnd;
+ this.message = message;
+ }
+
+ public string Encode()
+ {
+ return $"{{\"state\": {status}, \"hwnd\": {hwnd}, \"message\": \"{message}\"}}";
+ }
+ }
+}
diff --git a/ServicesStaticInfo.cs b/ServicesStaticInfo.cs
new file mode 100644
index 0000000..e02a536
--- /dev/null
+++ b/ServicesStaticInfo.cs
@@ -0,0 +1,9 @@
+namespace Zerolauncher
+{
+ class ServicesStaticInfo
+ {
+ public static string[] ServicesName = ["4399大区", "7k7k大区", "第七大道"];
+ public static string[] ServicesShortName = ["43", "7k", "7d"];
+
+ }
+}
diff --git a/StaticHandleProtol.cs b/StaticHandleProtol.cs
new file mode 100644
index 0000000..bd7f213
--- /dev/null
+++ b/StaticHandleProtol.cs
@@ -0,0 +1,27 @@
+namespace Zerolauncher
+{
+ class StaticHandleS
+ {
+ public const string ShowWindow = "a0";
+ public const string HintText = "b0";
+ public const string MiniSize = "c0";
+ public const string NormalSize = "d0";
+ public const string UseBrowser = "e0";
+ public const string GameSa = "f0";
+ public const string CloseGame = "g0";
+ }
+
+ class StaticHandleC
+ {
+ public const string StartDone = "0a";
+ public const string BrowserDone = "0b";
+ public const string StartGame = "0c";
+ public const string GameDone = "0d";
+ }
+
+ class StaticHandleA
+ {
+ public const string GameMode = "0a";
+ public const string UpdateMode = "0b";
+ }
+}
diff --git a/Zerolauncher.csproj b/Zerolauncher.csproj
new file mode 100644
index 0000000..ef6538f
--- /dev/null
+++ b/Zerolauncher.csproj
@@ -0,0 +1,57 @@
+
+
+
+ WinExe
+ net8.0-windows
+ enable
+ enable
+ true
+ res\title.ico
+ true
+ true
+
+
+
+ full
+
+
+
+ full
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Zerolauncher.sln b/Zerolauncher.sln
new file mode 100644
index 0000000..60ff396
--- /dev/null
+++ b/Zerolauncher.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.8.34408.163
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Zerolauncher", "Zerolauncher.csproj", "{C6930B95-44F3-4B41-90A6-20BA34560BF7}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {C6930B95-44F3-4B41-90A6-20BA34560BF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C6930B95-44F3-4B41-90A6-20BA34560BF7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C6930B95-44F3-4B41-90A6-20BA34560BF7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C6930B95-44F3-4B41-90A6-20BA34560BF7}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {89B100BA-83CE-4B02-8537-22B5A520DFCE}
+ EndGlobalSection
+EndGlobal
diff --git a/controls/AirButton.cs b/controls/AirButton.cs
new file mode 100644
index 0000000..2e5f917
--- /dev/null
+++ b/controls/AirButton.cs
@@ -0,0 +1,68 @@
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using System.Windows.Media;
+
+namespace Zerolauncher.controls
+{
+ ///
+ /// 按照步骤 1a 或 1b 操作,然后执行步骤 2 以在 XAML 文件中使用此自定义控件。
+ ///
+ /// 步骤 1a) 在当前项目中存在的 XAML 文件中使用该自定义控件。
+ /// 将此 XmlNamespace 特性添加到要使用该特性的标记文件的根
+ /// 元素中:
+ ///
+ /// xmlns:MyNamespace="clr-namespace:Zerolauncher.controls"
+ ///
+ ///
+ /// 步骤 1b) 在其他项目中存在的 XAML 文件中使用该自定义控件。
+ /// 将此 XmlNamespace 特性添加到要使用该特性的标记文件的根
+ /// 元素中:
+ ///
+ /// xmlns:MyNamespace="clr-namespace:Zerolauncher.controls;assembly=Zerolauncher.controls"
+ ///
+ /// 您还需要添加一个从 XAML 文件所在的项目到此项目的项目引用,
+ /// 并重新生成以避免编译错误:
+ ///
+ /// 在解决方案资源管理器中右击目标项目,然后依次单击
+ /// “添加引用”->“项目”->[浏览查找并选择此项目]
+ ///
+ ///
+ /// 步骤 2)
+ /// 继续操作并在 XAML 文件中使用控件。
+ ///
+ ///
+ ///
+ ///
+
+ public class AirButton : Button
+ {
+ static AirButton()
+ {
+ //DefaultStyleKeyProperty.OverrideMetadata(typeof(AirButton), new FrameworkPropertyMetadata(typeof(AirButton)));
+ }
+
+ protected override void OnMouseEnter(MouseEventArgs e)
+ {
+ // 不执行任何操作
+ }
+
+ protected override void OnMouseLeave(MouseEventArgs e)
+ {
+ // 不执行任何操作
+ }
+
+ protected override void OnMouseDown(MouseButtonEventArgs e)
+ {
+ base.OnMouseDown(e);
+ this.RenderTransform = new TranslateTransform(3, 3);
+ }
+
+ protected override void OnMouseUp(MouseButtonEventArgs e)
+ {
+ base.OnMouseUp(e);
+ this.RenderTransform = new TranslateTransform(0, 0);
+ }
+ }
+
+}
diff --git a/controls/AirButton.xaml b/controls/AirButton.xaml
new file mode 100644
index 0000000..793541d
--- /dev/null
+++ b/controls/AirButton.xaml
@@ -0,0 +1,20 @@
+
+
+
+
\ No newline at end of file
diff --git a/controls/AirTextBox.xaml b/controls/AirTextBox.xaml
new file mode 100644
index 0000000..42f1cd1
--- /dev/null
+++ b/controls/AirTextBox.xaml
@@ -0,0 +1,3 @@
+
+
\ No newline at end of file
diff --git a/controls/MemberControl.xaml b/controls/MemberControl.xaml
new file mode 100644
index 0000000..31a05be
--- /dev/null
+++ b/controls/MemberControl.xaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/controls/MemberControl.xaml.cs b/controls/MemberControl.xaml.cs
new file mode 100644
index 0000000..53d7141
--- /dev/null
+++ b/controls/MemberControl.xaml.cs
@@ -0,0 +1,114 @@
+using System.Diagnostics;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using System.Windows.Media;
+using Zerolauncher.dialog;
+using Zerolauncher.Manager;
+
+namespace Zerolauncher.controls
+{
+ ///
+ /// MemberControl.xaml 的交互逻辑
+ ///
+ public partial class MemberControl : UserControl
+ {
+ public int memberId { get; set; }
+
+ private bool isMouseDown;
+
+
+ public MemberControl()
+ {
+ InitializeComponent();
+ isMouseDown = false;
+ // 鼠标按下事件
+ MouseDown += (s, e) =>
+ {
+ RenderTransform = new TranslateTransform(3, 3);
+ isMouseDown = true;
+ };
+
+ // 鼠标松开事件
+ MouseUp += (s, e) =>
+ {
+ if (!isMouseDown) return;
+ RenderTransform = new TranslateTransform(0, 0);
+ if (e.ChangedButton == MouseButton.Right) return;
+ if (!EngineManager.CreateGame(memberId)) MessageBox.Show("账号已启动!请勿重复启动", "提示");
+
+ };
+
+ // 鼠标离开事件
+ MouseLeave += (s, e) =>
+ {
+ if (Mouse.LeftButton == MouseButtonState.Pressed)
+ {
+ RenderTransform = new TranslateTransform(0, 0);
+ isMouseDown = false;
+ }
+ };
+
+ // 鼠标捕获丢失事件
+ LostMouseCapture += (s, e) =>
+ {
+ RenderTransform = new TranslateTransform(0, 0);
+ isMouseDown = false;
+ };
+ ContextMenu = CreateContextMenu();
+ }
+
+ private ContextMenu CreateContextMenu()
+ {
+ ContextMenu contextMenu = new ContextMenu();
+
+ MenuItem editItem = new MenuItem { Header = "编辑" };
+ editItem.Click += editItem_Click;
+ contextMenu.Items.Add(editItem);
+
+ MenuItem delItem = new MenuItem { Header = "删除" };
+ delItem.Click += delItem_Click;
+ contextMenu.Items.Add(delItem);
+
+ MenuItem changeTeamItem = new MenuItem { Header = "移动到" };
+ contextMenu.Items.Add(changeTeamItem);
+ changeTeamItem.MouseEnter += (sender, args) =>
+ {
+ // 清空ContextMenu的items
+ changeTeamItem.Items.Clear();
+
+ // 假设你有一个字符串数组
+ string[] items = TeamManager.GetAllTeamName();
+
+ // 遍历字符串数组,为每个元素创建一个MenuItem
+ for (int i = 0; i < items.Length; i++)
+ {
+ MenuItem menuItem = new MenuItem { Header = items[i] };
+ menuItem.Tag = i;
+ menuItem.Click += (sender, args) =>
+ {
+ // 输出被点击的item的index
+ MenuItem menuItem = sender as MenuItem;
+ int i = (int)menuItem.Tag;
+ Trace.WriteLine("Clicked item index: " + i);
+ AccountManager.MoveAccount(memberId, i);
+ };
+ changeTeamItem.Items.Add(menuItem);
+ }
+ };
+
+ return contextMenu;
+ }
+
+ private void delItem_Click(object sender, RoutedEventArgs e)
+ {
+ AccountManager.DeleteAccount(memberId);
+ }
+
+ private void editItem_Click(object sender, RoutedEventArgs e)
+ {
+ Trace.WriteLine("edit member " + memberId.ToString());
+ EditMemberDialog.CreateDailog(MainWindow.Instance, memberId);
+ }
+ }
+}
diff --git a/controls/TextBoxRule.cs b/controls/TextBoxRule.cs
new file mode 100644
index 0000000..bd48f8a
--- /dev/null
+++ b/controls/TextBoxRule.cs
@@ -0,0 +1,167 @@
+using System.Globalization;
+using System.Text.RegularExpressions;
+
+using System.Windows.Controls;
+
+///
+/// 不能为空验证
+///
+public class NotNullValidationRule : ValidationRule
+{
+ public NotNullValidationRule()
+ {
+ ValidatesOnTargetUpdated = true;
+ }
+ public override ValidationResult Validate(object value, CultureInfo cultureInfo)
+ {
+ if (string.IsNullOrEmpty(value as string) || string.IsNullOrWhiteSpace(value as string))
+ {
+ return new ValidationResult(false, "不能为空!");
+ }
+ return ValidationResult.ValidResult;
+ }
+}
+
+///
+/// 自定义正则表达式验证
+///
+/*
+ 一、校验数字的表达式
+ 1. 数字:^[0-9]*$
+ 2. n位的数字:^\d{n}$
+ 3. 至少n位的数字:^\d{n,}$
+ 4. m-n位的数字:^\d{m,n}$
+ 5. 零和非零开头的数字:^(0|[1-9][0-9]*)$
+ 6. 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
+ 7. 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$
+ 8. 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
+ 9. 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
+ 10. 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
+ 11. 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
+ 12. 非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
+ 13. 非负整数:^\d+$ 或 ^[1-9]\d*|0$
+ 14. 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
+ 15. 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
+ 16. 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
+ 17. 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
+ 18. 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
+ 19. 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
+ 二、校验字符的表达式
+ 1. 汉字:^[\u4e00-\u9fa5]{0,}$
+ 2. 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
+ 3. 长度为3-20的所有字符:^.{3,20}$
+ 4. 由26个英文字母组成的字符串:^[A-Za-z]+$
+ 5. 由26个大写英文字母组成的字符串:^[A-Z]+$
+ 6. 由26个小写英文字母组成的字符串:^[a-z]+$
+ 7. 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
+ 8. 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
+ 9. 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
+ 10. 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
+ 11. 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+ 12 禁止输入含有~的字符:[^~\x22]+
+ 三、特殊需求表达式
+ 1. Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
+ 2. 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
+ 3. InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
+ 4. 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
+ 5. 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
+ 6. 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
+ 7. 身份证号(15位、18位数字):^\d{15}|\d{18}$
+ 8. 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
+ 9. 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
+ 10. 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
+ 11. 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
+ 12. 日期格式:^\d{4}-\d{1,2}-\d{1,2}
+ 13. 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
+ 14. 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
+ 15. 钱的输入格式:
+ 16. 1.有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$
+ 17. 2.这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
+ 18. 3.一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
+ 19. 4.这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
+ 20. 5.必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$
+ 21. 6.这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
+ 22. 7.这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
+ 23 8.1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
+ 24. 备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
+ 25. xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
+ 26. 中文字符的正则表达式:[\u4e00-\u9fa5]
+ 27. 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
+ 28. 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
+ 29. HTML标记的正则表达式:<(\S*?)[^>]*>.*?\1>|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
+ 30. 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
+ 31. 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
+ 32. 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
+ 33. IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
+ 34. IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
+*/
+public class CustomRegularValidationRule : ValidationRule
+{
+ public CustomRegularValidationRule()
+ {
+ ValidatesOnTargetUpdated = true;
+ }
+ public string RegularString { get; set; } // 正则表达式规则
+ public override ValidationResult Validate(object value, CultureInfo cultureInfo)
+ {
+ string str = value as string;
+ if (!string.IsNullOrWhiteSpace(str))
+ {
+ // 检查输入的字符串是否符合当前正则规范
+ if (!Regex.IsMatch(str, RegularString))
+ {
+ return new ValidationResult(false, "内容格式不正确");
+ }
+ }
+ return ValidationResult.ValidResult;
+ }
+}
+
+///
+/// 长度限制
+///
+class LengthLimitValidationRule : ValidationRule
+{
+ public LengthLimitValidationRule()
+ {
+ ValidatesOnTargetUpdated = true;
+ }
+ public double Minimum { get; set; }
+ public double Maximum { get; set; }
+ public override ValidationResult Validate(object value, CultureInfo cultureInfo)
+ {
+ if (value == null) return ValidationResult.ValidResult;
+ double number = value.ToString().Length;
+ if (number > Maximum || number < Minimum)
+ {
+ return new ValidationResult(false, string.Format("值长度限制在 {0} 到 {1}", Minimum, Maximum));
+ }
+ return ValidationResult.ValidResult;
+ }
+}
+
+///
+/// ip规则验证
+///
+public class IPAddressRule : ValidationRule
+{
+ public IPAddressRule()
+ {
+ ValidatesOnTargetUpdated = true;
+ }
+ public override ValidationResult Validate(object value, CultureInfo cultureInfo)
+ {
+ string IPAddress = value as string;
+
+ if (!string.IsNullOrWhiteSpace(IPAddress))
+ {
+ string IPAddressFormartRegex = @"^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$";
+
+ // 检查输入的字符串是否符合IP地址格式
+ if (!Regex.IsMatch(IPAddress, IPAddressFormartRegex))
+ {
+ return new ValidationResult(false, "IP地址格式不正确");
+ }
+ }
+ return ValidationResult.ValidResult;
+ }
+}
diff --git a/dialog/BaseDialog.xaml b/dialog/BaseDialog.xaml
new file mode 100644
index 0000000..af618a6
--- /dev/null
+++ b/dialog/BaseDialog.xaml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dialog/BaseDialog.xaml.cs b/dialog/BaseDialog.xaml.cs
new file mode 100644
index 0000000..65e09fc
--- /dev/null
+++ b/dialog/BaseDialog.xaml.cs
@@ -0,0 +1,40 @@
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+
+namespace Zerolauncher.dialog
+{
+ ///
+ /// BaseDialog.xaml 的交互逻辑
+ ///
+ public partial class BaseDialog : Window
+ {
+
+ //Storyboard storyboard;
+
+ public BaseDialog(UserControl control)
+ {
+ InitializeComponent();
+ //storyboard = FindResource("BlinkAnimation") as Storyboard;
+ mControl.Children.Add(control);
+ }
+
+ //protected override void OnDeactivated(EventArgs e)
+ //{
+ // base.OnDeactivated(e);
+ // // 当窗口失去焦点时,开始播放闪烁动画
+ // storyboard.Begin(this);
+ //}
+
+ private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
+ {
+ // 实现窗口的拖动
+ DragMove();
+ }
+
+ private void AirButton_Click(object sender, RoutedEventArgs e)
+ {
+ Close();
+ }
+ }
+}
diff --git a/dialog/DialogHelper.cs b/dialog/DialogHelper.cs
new file mode 100644
index 0000000..1e01054
--- /dev/null
+++ b/dialog/DialogHelper.cs
@@ -0,0 +1,128 @@
+using System.Windows;
+
+namespace Zerolauncher.dialog
+{
+ class EditMemberDialog
+ {
+ static BaseDialog? baseDialog;
+ static EditMember? editControl;
+
+ public static int? member;
+
+ public static void CreateDailog(Window p, int? memberId)
+ {
+ if (editControl != null || baseDialog != null)
+ {
+ return;
+ }
+ member = memberId;
+ editControl = new EditMember();
+ baseDialog = new BaseDialog(editControl);
+ baseDialog.ShowDialog();
+ baseDialog = null;
+ editControl = null;
+ member = null;
+ }
+
+ public static void Close()
+ {
+ if (baseDialog != null)
+ {
+ baseDialog.Close();
+ }
+ }
+
+ }
+
+ class EditTeamDialog
+ {
+ static BaseDialog? baseDialog;
+ static EditTeamControl? editControl;
+
+
+ public static bool CreateDailog(Window p, string? oldTeamName=null)
+ {
+ if (editControl != null || baseDialog != null)
+ {
+ return false;
+ }
+ if (oldTeamName != null)
+ {
+ editControl = new EditTeamControl(true);
+ editControl.edit_name.Text = oldTeamName;
+ }
+ else
+ {
+ editControl = new EditTeamControl(false);
+ editControl.btn_del.Visibility = Visibility.Hidden;
+ }
+ baseDialog = new BaseDialog(editControl);
+ baseDialog.ShowDialog();
+ baseDialog = null;
+ editControl = null;
+ return true;
+ }
+
+ public static void Close()
+ {
+ if (baseDialog != null)
+ {
+ baseDialog.Close();
+ }
+ }
+ }
+
+ class AddMemebersDialog
+ {
+ static BaseDialog? baseDialog;
+ static UseAccDataTextAdd? editControl;
+
+ public static void CreateDailog(Window p)
+ {
+ if (editControl != null || baseDialog != null)
+ {
+ return;
+ }
+ editControl = new UseAccDataTextAdd();
+ baseDialog = new BaseDialog(editControl);
+ baseDialog.ShowDialog();
+ baseDialog = null;
+ editControl = null;
+ }
+
+ public static void Close()
+ {
+ if (baseDialog != null)
+ {
+ baseDialog.Close();
+ }
+ }
+ }
+
+ class UpdateDialog
+ {
+ static BaseDialog? baseDialog;
+ static DownloadControl? editControl;
+
+ public static void CreateDailog(Window p)
+ {
+ if (editControl != null || baseDialog != null)
+ {
+ return;
+ }
+ editControl = new DownloadControl();
+ baseDialog = new BaseDialog(editControl);
+ baseDialog.ShowDialog();
+ baseDialog = null;
+ editControl = null;
+ }
+
+ public static void Close()
+ {
+ if (baseDialog != null)
+ {
+ baseDialog.Close();
+ }
+ }
+ }
+}
diff --git a/dialog/DownloadControl.xaml b/dialog/DownloadControl.xaml
new file mode 100644
index 0000000..22a801a
--- /dev/null
+++ b/dialog/DownloadControl.xaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/dialog/DownloadControl.xaml.cs b/dialog/DownloadControl.xaml.cs
new file mode 100644
index 0000000..86c2a7d
--- /dev/null
+++ b/dialog/DownloadControl.xaml.cs
@@ -0,0 +1,104 @@
+using System.IO;
+using System.Net.Http;
+using System.Windows.Controls;
+
+namespace Zerolauncher.dialog
+{
+ ///
+ /// DownloadControl.xaml 的交互逻辑
+ ///
+ public partial class DownloadControl : UserControl
+ {
+ const string cache_dir = "./.cache/auto.cache";
+
+ public DownloadControl()
+ {
+ InitializeComponent();
+ }
+
+ private void OnError(Exception ex)
+ {
+ // UnityEngine.Debug.Log("捕获异常 >>> " + ex);
+ }
+
+ public async Task Download(string fileUrl)
+ {
+ using (HttpClient client = new HttpClient())
+ {
+ // 获取文件大小
+ HttpResponseMessage responseHead = await client.SendAsync(new HttpRequestMessage(HttpMethod.Head, fileUrl));
+ long? contentLength = responseHead.Content.Headers.ContentLength;
+ Console.WriteLine($"文件大小:{contentLength} 字节");
+
+ // 计算块大小
+ int blockSize = 1024 * 1024; // 1MB
+ int blockCount = (int)Math.Ceiling((double)contentLength / blockSize);
+
+ // 创建SemaphoreSlim以限制同时进行的下载任务的数量
+ SemaphoreSlim semaphore = new SemaphoreSlim(4); // 最多允许4个并发下载任务
+
+ using (FileStream fileStream = new FileStream(cache_dir, FileMode.Create, FileAccess.Write, FileShare.None, blockSize, true))
+ {
+ // 创建任务列表
+ Task[] tasks = new Task[blockCount];
+
+ for (int i = 0; i < blockCount; i++)
+ {
+ int blockNumber = i;
+ tasks[i] = Task.Run(async () =>
+ {
+ await semaphore.WaitAsync(); // 等待获取许可
+
+ try
+ {
+ // 计算当前块的范围
+ var start = blockNumber * blockSize;
+ var end = (blockNumber == blockCount - 1) ? contentLength - 1 : start + blockSize - 1;
+
+ // 设置请求头,请求指定范围的数据
+ var request = new HttpRequestMessage { RequestUri = new Uri(fileUrl), Method = HttpMethod.Get };
+ request.Headers.Range = new System.Net.Http.Headers.RangeHeaderValue(start, end);
+
+ // 下载当前块
+ using (HttpResponseMessage response = await client.SendAsync(request))
+ {
+ response.EnsureSuccessStatusCode();
+ byte[] buffer = await response.Content.ReadAsByteArrayAsync();
+ await fileStream.WriteAsync(buffer, 0, buffer.Length);
+ }
+
+ // 显示下载进度
+ double percent = (double)(blockNumber + 1) / blockCount * 100;
+ Console.WriteLine($"已下载:{percent:F2}%");
+ }
+ finally
+ {
+ semaphore.Release(); // 释放许可
+ }
+ });
+ }
+
+ // 等待所有任务完成
+ await Task.WhenAll(tasks);
+ }
+ }
+
+ Console.WriteLine("下载完成!");
+ }
+
+ private void OnUpdate(long size, long count)
+ {
+
+ }
+
+ private void OnDone(byte[] data)
+ {
+
+ }
+
+ private void OnDestroy()
+ {
+ }
+
+ }
+}
diff --git a/dialog/EditMember.xaml b/dialog/EditMember.xaml
new file mode 100644
index 0000000..fb0086e
--- /dev/null
+++ b/dialog/EditMember.xaml
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dialog/EditMember.xaml.cs b/dialog/EditMember.xaml.cs
new file mode 100644
index 0000000..42a6eeb
--- /dev/null
+++ b/dialog/EditMember.xaml.cs
@@ -0,0 +1,80 @@
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+using Zerolauncher.Manager;
+
+namespace Zerolauncher.dialog
+{
+ ///
+ /// EditMember.xaml 的交互逻辑
+ ///
+ public partial class EditMember : UserControl
+ {
+
+ private Dictionary
_services;
+
+ public EditMember()
+ {
+ _services = new Dictionary();
+ int i = 0;
+ foreach (string serviceName in ServicesStaticInfo.ServicesName)
+ {
+ _services[i++] = serviceName;
+ }
+ InitializeComponent();
+ cb_pid.ItemsSource = _services;
+ if(EditMemberDialog.member != null)
+ {
+ int index = (int)EditMemberDialog.member;
+ var acc = AccountManager.accountsList[index];
+ cb_pid.SelectedIndex = acc.providerId;
+ edit_sid.Text = acc.serverId;
+ edit_acc.Text = acc.userName;
+ edit_pwd.Password = acc.userPWD;
+ edit_nick.Text = acc.nickName;
+ }
+ }
+
+ private void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
+ {
+ PasswordBox passwordBox = sender as PasswordBox;
+ VisualBrush helpBrush = passwordBox.Resources["HelpBrush"] as VisualBrush;
+ if (passwordBox.Password.Length > 0)
+ {
+ passwordBox.Background = new SolidColorBrush(Color.FromRgb(255, 255, 255));
+ }
+ else
+ {
+ passwordBox.Background = helpBrush;
+ }
+ }
+
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+ if (string.IsNullOrEmpty(cb_pid.Text) || string.IsNullOrEmpty(edit_sid.Text) || string.IsNullOrEmpty(edit_acc.Text) || string.IsNullOrEmpty(edit_pwd.Password) || string.IsNullOrEmpty(edit_nick.Text))
+ {
+ MessageBox.Show("所有选项均不能为空!", "提示");
+ return;
+ }
+ if (EditMemberDialog.member == null)
+ {
+ AccountManager.AddAccount(new Account { providerId = cb_pid.SelectedIndex, serverId = edit_sid.Text, userName = edit_acc.Text, userPWD = edit_pwd.Password, nickName = edit_nick.Text });
+
+ EditMemberDialog.Close();
+ return;
+ }
+ int index = (int)EditMemberDialog.member;
+ var acc = AccountManager.accountsList[index];
+ acc.providerId = cb_pid.SelectedIndex;
+ acc.serverId = edit_sid.Text;
+ acc.userName = edit_acc.Text;
+ acc.userPWD = edit_pwd.Password;
+ acc.nickName = edit_nick.Text;
+ AccountManager.saveEdit();
+ EditMemberDialog.Close();
+ return;
+ }
+
+ }
+}
+
diff --git a/dialog/EditTeamControl.xaml b/dialog/EditTeamControl.xaml
new file mode 100644
index 0000000..bbbcd4a
--- /dev/null
+++ b/dialog/EditTeamControl.xaml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dialog/EditTeamControl.xaml.cs b/dialog/EditTeamControl.xaml.cs
new file mode 100644
index 0000000..a3befa8
--- /dev/null
+++ b/dialog/EditTeamControl.xaml.cs
@@ -0,0 +1,45 @@
+using System.Windows;
+using System.Windows.Controls;
+using Zerolauncher.Manager;
+
+namespace Zerolauncher.dialog
+{
+ ///
+ /// EditTeamControl.xaml 的交互逻辑
+ ///
+ public partial class EditTeamControl : UserControl
+ {
+
+ bool isEditModle;
+
+ public EditTeamControl(bool isEditModle)
+ {
+ InitializeComponent();
+ this.isEditModle = isEditModle;
+ }
+
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+ if(string.IsNullOrEmpty(edit_name.Text))
+ {
+ MessageBox.Show("昵称不能为空!", "提示");
+ return;
+ }
+ if (isEditModle) AccountManager.editTeamName(edit_name.Text); else TeamManager.addTeam(edit_name.Text);
+ EditTeamDialog.Close();
+ }
+
+ private void Button_Click_1(object sender, RoutedEventArgs e)
+ {
+ MessageBoxResult result = MessageBox.Show("即将放生此队伍以及队伍里所有的账号\n将会为你带来114点功德\n您确定要执行此操作吗?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel);
+ if (result == MessageBoxResult.OK)
+ {
+ if (!AccountManager.DeleteTeam())
+ {
+ MessageBox.Show("少爷这已经是最后一个队伍了!\n请新建一个队伍后再放生这个吧~", "提示");
+ }
+ }
+
+ }
+ }
+}
diff --git a/dialog/UseAccDataTextAdd.xaml b/dialog/UseAccDataTextAdd.xaml
new file mode 100644
index 0000000..02010b3
--- /dev/null
+++ b/dialog/UseAccDataTextAdd.xaml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dialog/UseAccDataTextAdd.xaml.cs b/dialog/UseAccDataTextAdd.xaml.cs
new file mode 100644
index 0000000..fad86d7
--- /dev/null
+++ b/dialog/UseAccDataTextAdd.xaml.cs
@@ -0,0 +1,70 @@
+using Microsoft.Win32;
+using System.IO;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using Zerolauncher.Manager;
+
+namespace Zerolauncher.dialog
+{
+ ///
+ /// UseAccDataTextAdd.xaml 的交互逻辑
+ ///
+ public partial class UseAccDataTextAdd : UserControl
+ {
+ public UseAccDataTextAdd()
+ {
+ InitializeComponent();
+ }
+
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+ //创建一个打开文件式的对话框
+ OpenFileDialog ofd = new OpenFileDialog();
+ //设置这个对话框的起始打开路径
+ ofd.InitialDirectory = @"C:\";
+ //设置打开的文件的类型,注意过滤器的语法
+ ofd.Filter = "账号文本|*.txt|其他格式|*.";
+ //调用ShowDialog()方法显示该对话框,该方法的返回值代表用户是否点击了确定按钮
+ if (ofd.ShowDialog() == true)
+ {
+ string[] lines = File.ReadAllLines(ofd.FileName, Encoding.UTF8);
+ for (int i = 0; i < lines.Length; i++)
+ {
+ var accTexts = lines[i].Split(input_split.Text);
+ if (accTexts.Length != 5)
+ {
+ MessageBox.Show($"文本在{i}行非法!\n{lines[i]}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
+ return;
+ }
+ var acc = new Account { };
+ if (!int.TryParse(accTexts[0], out acc.providerId))
+ {
+ MessageBox.Show($"输入的服务器代号错误!在{i}行\n错误:[{lines[i]}]无法转换成服务器代号", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
+ return;
+ }
+ if(0 < acc.providerId || acc.providerId > ServicesStaticInfo.ServicesName.Length)
+ {
+ MessageBox.Show($"输入的服务器代号错误!在{i}行\n错误:[{acc.providerId}]不是有效的服务器代号", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
+ return;
+ }
+ acc.serverId = accTexts[1];
+ acc.userName = accTexts[2];
+ acc.userPWD = accTexts[3];
+ acc.nickName = accTexts[4];
+ if (!AccountManager.AddAccounts(acc))
+ {
+ MessageBox.Show($"文本在{i}行出错!\n警告:[{acc.nickName}]昵称冲突,将跳过添加此账号", "Warring", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+ MessageBox.Show("添加完成!", "提示");
+ AccountManager.saveEdit();
+ AddMemebersDialog.Close();
+ }
+ else
+ {
+ MessageBox.Show("没有选择文件");
+ }
+ }
+ }
+}
diff --git a/res/1.png b/res/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..9bf47cd323bad5438477a2e0222d79bc96a6a642
GIT binary patch
literal 735508
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