You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ViewModel.cs 46 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178
  1. 
  2. using starter.viewmodel.common;
  3. using System;
  4. using System.Windows;
  5. using System.Windows.Forms;
  6. using Downloader;
  7. using MessageBox = System.Windows.MessageBox;
  8. using System.Configuration;
  9. using System.Drawing.Design;
  10. using Application = System.Windows.Application;
  11. using System.ComponentModel;
  12. using Installer;
  13. using static System.Windows.Forms.VisualStyles.VisualStyleElement;
  14. using System.IO;
  15. using System.Windows.Automation.Provider;
  16. using System.Diagnostics;
  17. namespace starter.viewmodel.settings
  18. {
  19. public class SettingsViewModel : NotificationObject
  20. {
  21. //定义BackgroundWorker
  22. BackgroundWorker? asyncDownloader;
  23. BackgroundWorker? asyncUpdater;
  24. BackgroundWorker asyncInitializer;
  25. /// <summary>
  26. /// Model object
  27. /// </summary>
  28. private SettingsModel obj = new SettingsModel();
  29. /// <summary>
  30. /// initializer
  31. /// </summary>
  32. public SettingsViewModel()
  33. {
  34. //Program.Tencent_cos_download.UpdateHash();
  35. Status = SettingsModel.Status.working;
  36. string currentDirectory = System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule?.FileName)
  37. ?? throw new Exception("Fail to get current directory");
  38. //MessageBox.Show("更新器工作正常");
  39. if (!Program.Tencent_cos_download.SelfUpdateDismissed())
  40. {
  41. switch (Program.Tencent_cos_download.CheckSelfVersion())
  42. {
  43. case 1:
  44. Process.Start(System.IO.Path.Combine(currentDirectory, "InstallerUpdater.exe"));
  45. Environment.Exit(0);
  46. break;
  47. case -1:
  48. MessageBox.Show("下载器更新检查出错,将继续启动现有下载器");
  49. break;
  50. }
  51. }
  52. UpdateInfoVis = Visibility.Collapsed;
  53. asyncInitializer = new BackgroundWorker();
  54. asyncInitializer.WorkerReportsProgress = true;
  55. asyncInitializer.DoWork += AsyncInitializer_DoWork;
  56. asyncInitializer.RunWorkerCompleted += AsyncInitializer_RunWorkerCompleted;
  57. asyncInitializer.RunWorkerAsync();
  58. Status = SettingsModel.Status.initializing;
  59. }
  60. private void AsyncInitializer_RunWorkerCompleted(object? sender, RunWorkerCompletedEventArgs e)
  61. {
  62. if (e.Result == null)
  63. {
  64. Status = SettingsModel.Status.error;
  65. }
  66. else if ((int)e.Result == 1)
  67. {
  68. Status = SettingsModel.Status.login;
  69. this.RaisePropertyChanged("LaunchVis");
  70. this.RaisePropertyChanged("RememberMe");
  71. this.RaisePropertyChanged("SwitchOSBtnCont");
  72. this.RaisePropertyChanged("UpdateBtnCont");
  73. this.RaisePropertyChanged("LaunchBtnCont");
  74. this.RaisePropertyChanged("Updateinfo");
  75. this.RaisePropertyChanged("UpdatePlanned");
  76. }
  77. else
  78. {
  79. Route = Environment.GetEnvironmentVariable("USERPROFILE") + "\\THUAI6";
  80. Status = SettingsModel.Status.newUser;
  81. }
  82. }
  83. private void AsyncInitializer_DoWork(object? sender, DoWorkEventArgs e)
  84. {
  85. if (asyncInitializer.CancellationPending)
  86. {
  87. Status = SettingsModel.Status.error;
  88. e.Cancel = true;
  89. return;
  90. }
  91. else
  92. {
  93. //实例化BackgroundWorker
  94. asyncDownloader = new BackgroundWorker();
  95. asyncUpdater = new BackgroundWorker();
  96. //指示BackgroundWorker是否可以报告进度更新
  97. //当该属性值为True是,将可以成功调用ReportProgress方法,否则将引发InvalidOperationException异常。
  98. asyncDownloader.WorkerReportsProgress = true;
  99. asyncUpdater.WorkerReportsProgress = true;
  100. //挂载方法:
  101. asyncDownloader.DoWork += AsyncDownloader_DoWork;
  102. asyncUpdater.DoWork += AsyncUpdater_DoWork;
  103. //完成通知器:
  104. asyncDownloader.RunWorkerCompleted += AsyncDownloader_RunWorkerCompleted;
  105. asyncUpdater.RunWorkerCompleted += AsyncUpdater_RunWorkerCompleted;
  106. if (Downloader.Program.Tencent_cos_download.CheckAlreadyDownload())
  107. {
  108. obj.checkUpdate();
  109. if (obj.RecallUser())
  110. RememberMe = true;
  111. else
  112. RememberMe = false;
  113. //在启动时立刻检查更新,确保选手启动最新版选手包
  114. //若有更新,将启动键改为更新键;
  115. //相应地,使用login界面启动;
  116. //结构:上方为登录框架,下方有“修改选手包”按钮
  117. //下面几行是用来运行测试的代码
  118. //Program.RunProgram.StartServerForDebug("0.0.0.0",8888,4,1,600,"video");
  119. //Program.RunProgram.RunCpp("127.0.0.1",8888,4,1,false,true,false);
  120. //Program.RunProgram.RunGUIClient("127.0.0.1", 8888, 0, true);
  121. e.Result = 1;
  122. }
  123. else
  124. {
  125. e.Result = 2;
  126. }
  127. }
  128. }
  129. private void AsyncDownloader_RunWorkerCompleted(object? sender, RunWorkerCompletedEventArgs e)
  130. {
  131. if (e.Result == null)
  132. {
  133. Status = SettingsModel.Status.error;
  134. }
  135. else if ((bool)e.Result)
  136. {
  137. Status = SettingsModel.Status.successful;
  138. }
  139. else
  140. {
  141. Status = SettingsModel.Status.newUser;
  142. }
  143. }
  144. private void AsyncUpdater_RunWorkerCompleted(object? sender, RunWorkerCompletedEventArgs e)
  145. {
  146. if (e.Result == null)
  147. {
  148. Status = SettingsModel.Status.error;
  149. }
  150. else
  151. {
  152. this.RaisePropertyChanged("LaunchVis");
  153. if ((int)e.Result == 1)
  154. {
  155. Status = SettingsModel.Status.successful;
  156. this.RaisePropertyChanged("UpdateBtnCont");
  157. this.RaisePropertyChanged("UpdateInfo");
  158. this.RaisePropertyChanged("LaunchBtnCont");
  159. }
  160. else if ((int)e.Result == 2)
  161. {
  162. Status = SettingsModel.Status.login;
  163. this.RaisePropertyChanged("UpdateBtnCont");
  164. this.RaisePropertyChanged("LaunchBtnCont");
  165. this.RaisePropertyChanged("UpdateInfo");
  166. }
  167. else
  168. {
  169. string updateFailList = "";
  170. foreach (var Filename in Program.UpdateFailed)
  171. {
  172. updateFailList += Filename + "\n";
  173. }
  174. MessageBox.Show($"以下文件因被占用而未能成功更新:\n{updateFailList}请关闭它们,并再试一次");
  175. Program.ResetUpdateFailedInfo();
  176. obj.checkUpdate();
  177. Status = SettingsModel.Status.successful;
  178. this.RaisePropertyChanged("UpdateBtnCont");
  179. this.RaisePropertyChanged("UpdateInfo");
  180. this.RaisePropertyChanged("LaunchBtnCont");
  181. }
  182. this.RaisePropertyChanged("UpdatePlanned");
  183. }
  184. }
  185. private void AsyncUpdater_DoWork(object? sender, DoWorkEventArgs e)
  186. {
  187. if (asyncUpdater is null)
  188. {
  189. throw new InvalidOperationException("asyncUpdater is null");
  190. }
  191. if (asyncUpdater.CancellationPending)
  192. {
  193. e.Cancel = true;
  194. MessageBox.Show("下载取消");
  195. if (e.Argument?.ToString()?.Equals("Manual") ?? false)
  196. {
  197. Status = SettingsModel.Status.menu;
  198. }
  199. else
  200. Status = SettingsModel.Status.login;
  201. return;
  202. }
  203. else
  204. {
  205. if (obj.Update())
  206. if (e.Argument?.ToString()?.Equals("Manual") ?? false)
  207. {
  208. e.Result = 1;
  209. }
  210. else
  211. e.Result = 2;
  212. else
  213. e.Result = -1;
  214. }
  215. }
  216. private void AsyncDownloader_DoWork(object? sender, DoWorkEventArgs e)
  217. {
  218. if (asyncDownloader is null)
  219. {
  220. throw new InvalidOperationException("asyncDownloader is null");
  221. }
  222. if (asyncDownloader.CancellationPending)
  223. {
  224. e.Cancel = true;
  225. return;
  226. }
  227. else
  228. {
  229. if (obj.install())
  230. e.Result = true;
  231. else
  232. e.Result = false;
  233. }
  234. }
  235. //TODO:参赛界面:包括上传参赛代码、申请对战
  236. //TODO:界面中应包含上次对战完成提示及下载回放按钮
  237. public int ExtraColumn
  238. {
  239. get
  240. {
  241. if (Status == SettingsModel.Status.newUser || Status == SettingsModel.Status.move)
  242. return 75;
  243. else
  244. return 0;
  245. }
  246. }
  247. public int WindowWidth
  248. {
  249. get
  250. {
  251. switch (Status)
  252. {
  253. case SettingsModel.Status.newUser:
  254. return 505;
  255. case SettingsModel.Status.move:
  256. return 505;
  257. case SettingsModel.Status.working:
  258. return 435;
  259. case SettingsModel.Status.successful:
  260. return 435;
  261. default:
  262. return 355;
  263. }
  264. }
  265. }
  266. public SettingsModel.Status Status
  267. {
  268. get
  269. {
  270. return obj.status;
  271. }
  272. set
  273. {
  274. obj.status = value;
  275. this.RaisePropertyChanged("ExtraColumn");
  276. this.RaisePropertyChanged("Intro");
  277. this.RaisePropertyChanged("RouteBoxIntro");
  278. this.RaisePropertyChanged("LoginVis");
  279. this.RaisePropertyChanged("MenuVis");
  280. this.RaisePropertyChanged("RouteBoxVis");
  281. this.RaisePropertyChanged("ProgressVis");
  282. //TODO: Thread will be taken by process working and window will not refresh.
  283. this.RaisePropertyChanged("CompleteVis");
  284. this.RaisePropertyChanged("WindowWidth");
  285. this.RaisePropertyChanged("WebVis");
  286. this.RaisePropertyChanged("CoverVis");
  287. this.RaisePropertyChanged("LaunchVis");
  288. this.RaisePropertyChanged("NewUserVis");
  289. this.RaisePropertyChanged("ConfirmBtnCont");
  290. this.RaisePropertyChanged("ProcessingIntro");
  291. }
  292. }
  293. public string Intro
  294. {
  295. get
  296. {
  297. switch (Status)
  298. {
  299. case SettingsModel.Status.newUser:
  300. return "欢迎使用选手包,请选择你想要安装选手包的位置:";
  301. case SettingsModel.Status.menu:
  302. return "你已经安装了选手包,请选择想要进行的操作:";
  303. case SettingsModel.Status.login:
  304. return "使用EESAST账号登录";
  305. case SettingsModel.Status.web:
  306. return "THUAI6 赛场:";
  307. case SettingsModel.Status.disconnected:
  308. return "你可能没有连接到网络,无法下载/更新选手包";
  309. case SettingsModel.Status.error:
  310. return "我们遇到了一些问题,请向[]反馈";
  311. default:
  312. return "";
  313. }
  314. }
  315. }
  316. public string RouteBoxIntro
  317. {
  318. get
  319. {
  320. switch (Status)
  321. {
  322. case SettingsModel.Status.newUser:
  323. return "将选手包安装在(将创建THUAI6文件夹):";
  324. case SettingsModel.Status.move:
  325. return "将选手包移动到(THUAI6文件夹将会被整体移动):";
  326. default:
  327. return "";
  328. }
  329. }
  330. }
  331. public string ProcessingIntro
  332. {
  333. get
  334. {
  335. switch (Status)
  336. {
  337. case SettingsModel.Status.working:
  338. return "正在下载";
  339. case SettingsModel.Status.initializing:
  340. return "正在检查更新";
  341. default:
  342. return "";
  343. }
  344. }
  345. }
  346. public string AbortOrSelLanguage
  347. {
  348. get
  349. {
  350. string ans = "";
  351. if (obj.UploadReady)
  352. ans = "放弃上传";
  353. else if (obj.launchLanguage == SettingsModel.LaunchLanguage.cpp)
  354. ans = "语言:c++";
  355. else if (obj.launchLanguage == SettingsModel.LaunchLanguage.python)
  356. ans = "语言:python";
  357. return ans;
  358. }
  359. }
  360. public string SwitchOSBtnCont
  361. {
  362. get
  363. {
  364. switch (obj.usingOS)
  365. {
  366. case SettingsModel.UsingOS.Win:
  367. return "当前系统:Windows";
  368. case SettingsModel.UsingOS.Linux:
  369. return "当前系统:Linux";
  370. case SettingsModel.UsingOS.OSX:
  371. return "当前系统:macOS";
  372. default:
  373. return "当前系统:无效的名称";
  374. }
  375. }
  376. }
  377. public int PlayerNum
  378. {
  379. get
  380. {
  381. int ans;
  382. if (obj.PlayerNum.Equals("player_1"))
  383. ans = 1;
  384. else if (obj.PlayerNum.Equals("player_2"))
  385. ans = 2;
  386. else if (obj.PlayerNum.Equals("player_3"))
  387. ans = 3;
  388. else if (obj.PlayerNum.Equals("player_4"))
  389. ans = 4;
  390. else
  391. ans = 0;
  392. return ans;
  393. }
  394. set
  395. {
  396. switch (value)
  397. {
  398. case 1:
  399. obj.PlayerNum = "player_1";
  400. break;
  401. case 2:
  402. obj.PlayerNum = "player_2";
  403. break;
  404. case 3:
  405. obj.PlayerNum = "player_3";
  406. break;
  407. case 4:
  408. obj.PlayerNum = "player_4";
  409. break;
  410. default:
  411. obj.PlayerNum = "nSelect";
  412. break;
  413. }
  414. this.RaisePropertyChanged("PlayerNum");
  415. }
  416. }
  417. public string Route
  418. {
  419. get
  420. {
  421. return obj.Route;
  422. }
  423. set
  424. {
  425. obj.Route = value;
  426. this.RaisePropertyChanged("Route");
  427. }
  428. }
  429. public string Username
  430. {
  431. get => obj.Username;
  432. set
  433. {
  434. obj.Username = value;
  435. this.RaisePropertyChanged("Username");
  436. }
  437. }
  438. public string Password
  439. {
  440. get => obj.Password;
  441. set
  442. {
  443. obj.Password = value;
  444. this.RaisePropertyChanged("Password");
  445. }
  446. }
  447. public string CodeName
  448. {
  449. get
  450. {
  451. return obj.CodeRoute.Substring(obj.CodeRoute.LastIndexOf('/') == -1 ? obj.CodeRoute.LastIndexOf('\\') + 1 : obj.CodeRoute.LastIndexOf('/') + 1);
  452. }
  453. }
  454. public bool RememberMe
  455. {
  456. get
  457. {
  458. return obj.RememberMe;
  459. }
  460. set
  461. {
  462. obj.RememberMe = value;
  463. this.RaisePropertyChanged("RememberMe");
  464. }
  465. }
  466. public Visibility NewUserVis
  467. {
  468. get
  469. {
  470. return Status == SettingsModel.Status.newUser ? Visibility.Visible : Visibility.Collapsed;
  471. }
  472. }
  473. public Visibility MenuVis
  474. {
  475. get
  476. {
  477. return Status == SettingsModel.Status.menu ? Visibility.Visible : Visibility.Collapsed;
  478. }
  479. }
  480. public Visibility RouteBoxVis
  481. {
  482. get
  483. {
  484. return (Status == SettingsModel.Status.newUser || Status == SettingsModel.Status.move) ? Visibility.Visible : Visibility.Collapsed;
  485. }
  486. }
  487. public Visibility LoginVis
  488. {
  489. get
  490. {
  491. return Status == SettingsModel.Status.login ? Visibility.Visible : Visibility.Collapsed;
  492. }
  493. }
  494. public Visibility ProgressVis
  495. {
  496. get
  497. {
  498. return (Status == SettingsModel.Status.working || Status == SettingsModel.Status.initializing) ? Visibility.Visible : Visibility.Collapsed;
  499. }
  500. }
  501. public Visibility CompleteVis
  502. {
  503. get
  504. {
  505. return Status == SettingsModel.Status.successful ? Visibility.Visible : Visibility.Collapsed;
  506. }
  507. }
  508. public Visibility WebVis
  509. {
  510. get
  511. {
  512. return Status == SettingsModel.Status.web ? Visibility.Visible : Visibility.Collapsed;
  513. }
  514. }
  515. public Visibility CoverVis
  516. {
  517. get
  518. {
  519. return Status == SettingsModel.Status.web && !obj.UploadReady ? Visibility.Visible : Visibility.Collapsed;
  520. }
  521. }
  522. public Visibility LoginFailVis
  523. {
  524. get
  525. {
  526. return obj.LoginFailed ? Visibility.Visible : Visibility.Collapsed;
  527. }
  528. }
  529. public Visibility MatchFinishedVis
  530. {
  531. get
  532. {
  533. return obj.CombatCompleted ? Visibility.Visible : Visibility.Collapsed;
  534. }
  535. }
  536. public Visibility UploadReadyVis
  537. {
  538. get { return obj.UploadReady ? Visibility.Visible : Visibility.Collapsed; }
  539. }
  540. public Visibility UpdateInfoVis
  541. {
  542. get; set;
  543. }
  544. public Visibility LaunchVis
  545. {
  546. get
  547. {
  548. return obj.status == SettingsModel.Status.login && (!obj.UpdatePlanned) ? Visibility.Visible : Visibility.Collapsed;
  549. }
  550. }
  551. public Visibility CfgVis
  552. {
  553. get
  554. {
  555. return obj.status == SettingsModel.Status.launch ? Visibility.Visible : Visibility.Collapsed;
  556. }
  557. }
  558. public string UpdateBtnCont
  559. {
  560. get
  561. {
  562. return obj.UpdatePlanned ? "更新" : "检查更新";
  563. }
  564. }
  565. public string UpdateInfo
  566. {
  567. get
  568. {
  569. if (obj.UpdatePlanned)
  570. return obj.Updates;
  571. else
  572. return "已是最新版本";
  573. }
  574. }
  575. public string LaunchBtnCont
  576. {
  577. get
  578. {
  579. string ans;
  580. if (obj.UpdatePlanned)
  581. ans = "更新";
  582. else if (obj.launchLanguage == SettingsModel.LaunchLanguage.cpp)
  583. ans = "启动选手包";
  584. else
  585. ans = "启动选手包";
  586. return ans;
  587. }
  588. }
  589. public string UploadBtnCont
  590. {
  591. get
  592. {
  593. return obj.UploadReady ? "上传代码" : "选择代码上传";
  594. }
  595. }
  596. public string ShiftLanguageBtnCont
  597. {
  598. get
  599. {
  600. return obj.launchLanguage == SettingsModel.LaunchLanguage.cpp ? "改为python" : "改为c++";
  601. }
  602. }
  603. public string ConfirmBtnCont
  604. {
  605. get
  606. {
  607. switch (Status)
  608. {
  609. case SettingsModel.Status.newUser:
  610. return "确认并安装";
  611. case SettingsModel.Status.move:
  612. return "确认并移动";
  613. default:
  614. return "";
  615. }
  616. }
  617. }
  618. public bool UpdatePlanned
  619. {
  620. get { return obj.UpdatePlanned; }
  621. }
  622. public string RouteSelectWindow(string type)
  623. {
  624. if (type == "Folder")
  625. {
  626. using (FolderBrowserDialog dialog = new FolderBrowserDialog())
  627. {
  628. _ = dialog.ShowDialog();
  629. if (dialog.SelectedPath != String.Empty)
  630. return dialog.SelectedPath;
  631. }
  632. }
  633. else if (type == "File")
  634. {
  635. var openFileDialog = new Microsoft.Win32.OpenFileDialog();
  636. if (obj.launchLanguage == SettingsModel.LaunchLanguage.cpp)
  637. {
  638. openFileDialog.InitialDirectory = (Route + "/THUAI6/win/CAPI/cpp/API/src/").Replace("/", "\\");
  639. openFileDialog.Filter = "c++ Source Files (.cpp)|*.cpp|c++ Header File (.h)|*.h|python Source File (.py)|*.py";
  640. }
  641. else if (obj.launchLanguage == SettingsModel.LaunchLanguage.python)
  642. {
  643. openFileDialog.InitialDirectory = (Route + "/THUAI6/win/CAPI/python/PyAPI/").Replace("/", "\\");
  644. openFileDialog.Filter = "python Source File (.py)|*.py|c++ Source Files (.cpp)|*.cpp|c++ Header File (.h)|*.h";
  645. }
  646. var result = openFileDialog.ShowDialog();
  647. if (result == true)
  648. {
  649. return openFileDialog.FileName;
  650. }
  651. }
  652. return "";
  653. }
  654. private BaseCommand? clickBrowseCommand;
  655. public BaseCommand ClickBrowseCommand
  656. {
  657. get
  658. {
  659. if (clickBrowseCommand == null)
  660. {
  661. clickBrowseCommand = new BaseCommand(new Action<object?>(o =>
  662. {
  663. Route = RouteSelectWindow("Folder");
  664. }));
  665. }
  666. return clickBrowseCommand;
  667. }
  668. }
  669. private BaseCommand? clickConfirmCommand;
  670. public BaseCommand ClickConfirmCommand
  671. {
  672. get
  673. {
  674. if (clickConfirmCommand == null)
  675. {
  676. clickConfirmCommand = new BaseCommand(new Action<object?>(o =>
  677. {
  678. if (Status == SettingsModel.Status.newUser)
  679. {
  680. if (Directory.Exists(Route))
  681. {
  682. Status = SettingsModel.Status.working;
  683. this.RaisePropertyChanged("ProgressVis");
  684. /*if (obj.install())
  685. {
  686. Status = SettingsModel.Status.successful;
  687. }*/
  688. if (asyncDownloader?.IsBusy ?? true)
  689. return;
  690. else
  691. {
  692. asyncDownloader.RunWorkerAsync();
  693. }
  694. }
  695. else
  696. {
  697. MessageBox.Show("所选的路径不存在,请重新选择", "路径不存在", MessageBoxButton.OK, MessageBoxImage.Warning);
  698. }
  699. }
  700. else if (Status == SettingsModel.Status.move)
  701. {
  702. //Status = SettingsModel.Status.working;
  703. //this.RaisePropertyChanged("ProgressVis");
  704. if (Directory.Exists(Route))
  705. {
  706. switch (obj.move())
  707. {
  708. case -1:
  709. MessageBox.Show("文件已打开或者目标路径下有同名文件!", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  710. break;
  711. case -2:
  712. Status = SettingsModel.Status.error;
  713. break;
  714. }
  715. Status = SettingsModel.Status.successful;
  716. }
  717. else
  718. {
  719. MessageBox.Show("所选的路径不存在,请重新选择", "路径不存在", MessageBoxButton.OK, MessageBoxImage.Warning);
  720. }
  721. }
  722. }));
  723. }
  724. return clickConfirmCommand;
  725. }
  726. }
  727. private BaseCommand? clickUpdateCommand;
  728. public BaseCommand ClickUpdateCommand
  729. {
  730. get
  731. {
  732. if (clickUpdateCommand == null)
  733. {
  734. clickUpdateCommand = new BaseCommand(new Action<object?>(o =>
  735. {
  736. this.RaisePropertyChanged("UpdateInfoVis");
  737. if (obj.UpdatePlanned)
  738. {
  739. UpdateInfoVis = Visibility.Collapsed;
  740. this.RaisePropertyChanged("UpdateInfoVis");
  741. Status = SettingsModel.Status.working;
  742. this.RaisePropertyChanged("ProgressVis");
  743. /*if (obj.Update())
  744. {
  745. Status = SettingsModel.Status.successful;
  746. this.RaisePropertyChanged("UpdateBtnCont");
  747. this.RaisePropertyChanged("UpdateInfo");
  748. }
  749. else
  750. Status = SettingsModel.Status.error;*/
  751. if (asyncUpdater?.IsBusy ?? true)
  752. return;
  753. else
  754. asyncUpdater.RunWorkerAsync("Manual");
  755. }
  756. else
  757. {
  758. UpdateInfoVis = Visibility.Visible;
  759. this.RaisePropertyChanged("UpdateInfoVis");
  760. //Status = SettingsModel.Status.working;
  761. //this.RaisePropertyChanged("ProgressVis");
  762. Status = obj.checkUpdate();
  763. this.RaisePropertyChanged("UpdateBtnCont");
  764. this.RaisePropertyChanged("UpdateInfo");
  765. this.RaisePropertyChanged("LaunchVis");
  766. this.RaisePropertyChanged("UpdatePlanned");
  767. }
  768. }));
  769. }
  770. return clickUpdateCommand;
  771. }
  772. }
  773. private BaseCommand? clickMoveCommand;
  774. public BaseCommand ClickMoveCommand
  775. {
  776. get
  777. {
  778. if (clickMoveCommand == null)
  779. {
  780. clickMoveCommand = new BaseCommand(new Action<object?>(o =>
  781. {
  782. Status = SettingsModel.Status.move;
  783. }));
  784. }
  785. return clickMoveCommand;
  786. }
  787. }
  788. private BaseCommand? clickUninstCommand;
  789. public BaseCommand ClickUninstCommand
  790. {
  791. get
  792. {
  793. if (clickUninstCommand == null)
  794. {
  795. clickUninstCommand = new BaseCommand(new Action<object?>(o =>
  796. {
  797. UpdateInfoVis = Visibility.Collapsed;
  798. this.RaisePropertyChanged("UpdateInfoVis");
  799. switch (obj.Uninst())
  800. {
  801. case -1:
  802. Status = SettingsModel.Status.menu;
  803. MessageBox.Show("文件已经打开,请关闭后再删除", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  804. break;
  805. case 0:
  806. Status = SettingsModel.Status.newUser;
  807. MessageBox.Show($"删除成功!player文件夹中的文件已经放在{Downloader.Program.Data.FilePath}/{Downloader.Program.ProgramName}的根目录下", "", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK);
  808. break;
  809. default:
  810. Status = SettingsModel.Status.error;
  811. break;
  812. }
  813. }));
  814. }
  815. return clickUninstCommand;
  816. }
  817. }
  818. private BaseCommand? clickLoginCommand;
  819. public BaseCommand ClickLoginCommand
  820. {
  821. get
  822. {
  823. if (clickLoginCommand == null)
  824. {
  825. clickLoginCommand = new BaseCommand(new Action<object?>(async o =>
  826. {
  827. switch (await obj.Login())
  828. {
  829. case -1:
  830. obj.LoginFailed = true;
  831. break;
  832. case 0:
  833. obj.LoginFailed = false;
  834. Status = SettingsModel.Status.web;
  835. if (obj.RememberMe)
  836. {
  837. obj.RememberUser();
  838. RememberMe = true;
  839. this.RaisePropertyChanged("RememberMe");
  840. }
  841. else
  842. {
  843. obj.ForgetUser();
  844. RememberMe = false;
  845. this.RaisePropertyChanged("RememberMe");
  846. Username = "";
  847. Password = "";
  848. this.RaisePropertyChanged("Username");
  849. this.RaisePropertyChanged("Password");
  850. }
  851. this.RaisePropertyChanged("CoverVis");
  852. break;
  853. case -2:
  854. MessageBox.Show("无法连接服务器,请检查网络情况", "网络错误", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  855. break;
  856. }
  857. this.RaisePropertyChanged("LoginFailVis");
  858. }));
  859. }
  860. return clickLoginCommand;
  861. }
  862. }
  863. private BaseCommand? clickLaunchCommand;
  864. public BaseCommand ClickLaunchCommand
  865. {
  866. get
  867. {
  868. if (clickLaunchCommand == null)
  869. {
  870. clickLaunchCommand = new BaseCommand(new Action<object?>(o =>
  871. {
  872. if (obj.UpdatePlanned)
  873. {
  874. Status = SettingsModel.Status.working;
  875. this.RaisePropertyChanged("ProgressVis");
  876. if (asyncUpdater?.IsBusy ?? true)
  877. return;
  878. else
  879. asyncUpdater.RunWorkerAsync("Auto");
  880. }
  881. else if (!obj.Launch())
  882. {
  883. Status = SettingsModel.Status.menu;
  884. }
  885. }));
  886. }
  887. return clickLaunchCommand;
  888. }
  889. }
  890. private BaseCommand? clickEditCommand;
  891. public BaseCommand ClickEditCommand
  892. {
  893. get
  894. {
  895. if (clickEditCommand == null)
  896. {
  897. clickEditCommand = new BaseCommand(new Action<object?>(o =>
  898. {
  899. Status = SettingsModel.Status.menu;
  900. if (obj.UpdatePlanned)
  901. UpdateInfoVis = Visibility.Visible;
  902. this.RaisePropertyChanged("UpdateInfoVis");
  903. }));
  904. }
  905. return clickEditCommand;
  906. }
  907. }
  908. private BaseCommand? clickBackCommand;
  909. public BaseCommand ClickBackCommand
  910. {
  911. get
  912. {
  913. if (clickBackCommand == null)
  914. {
  915. clickBackCommand = new BaseCommand(new Action<object?>(o =>
  916. {
  917. UpdateInfoVis = Visibility.Collapsed;
  918. this.RaisePropertyChanged("UpdateInfoVis");
  919. if (Downloader.Program.Tencent_cos_download.CheckAlreadyDownload())
  920. Status = SettingsModel.Status.login;
  921. else
  922. Status = SettingsModel.Status.newUser;
  923. }));
  924. }
  925. return clickBackCommand;
  926. }
  927. }
  928. private BaseCommand? clickUploadCommand;
  929. public BaseCommand ClickUploadCommand
  930. {
  931. get
  932. {
  933. if (clickUploadCommand == null)
  934. {
  935. clickUploadCommand = new BaseCommand(new Action<object?>(async o =>
  936. {
  937. if (obj.UploadReady)
  938. {
  939. if (obj.PlayerNum.Equals("nSelect"))
  940. {
  941. MessageBox.Show("您还没有选择要上传的玩家身份", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  942. }
  943. else
  944. {
  945. switch (await obj.Upload())
  946. {
  947. case -1:
  948. MessageBox.Show("Token失效!", "", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
  949. break;
  950. case -2:
  951. MessageBox.Show("目标路径不存在!", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  952. break;
  953. case -3:
  954. MessageBox.Show("服务器错误", "", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
  955. break;
  956. case -4:
  957. MessageBox.Show("您未登录或登录失效", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  958. Status = SettingsModel.Status.login;
  959. break;
  960. case -5:
  961. MessageBox.Show("您未报名THUAI!", "", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
  962. break;
  963. case -6:
  964. MessageBox.Show("读取文件失败,请确认文件是否被占用", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  965. break;
  966. case -7:
  967. MessageBox.Show("网络错误,请检查你的网络", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  968. break;
  969. case -8:
  970. MessageBox.Show("不是c++或python源文件", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  971. break;
  972. }
  973. obj.CodeRoute = "";
  974. obj.UploadReady = false;
  975. this.RaisePropertyChanged("UploadBtnCont");
  976. this.RaisePropertyChanged("UploadReadyVis");
  977. this.RaisePropertyChanged("CoverVis");
  978. this.RaisePropertyChanged("AbortOrSelLanguage");
  979. }
  980. }
  981. else
  982. {
  983. obj.CodeRoute = RouteSelectWindow("File");
  984. if (obj.CodeRoute != "")
  985. {
  986. obj.UploadReady = true;
  987. this.RaisePropertyChanged("UploadBtnCont");
  988. this.RaisePropertyChanged("UploadReadyVis");
  989. this.RaisePropertyChanged("CodeName");
  990. this.RaisePropertyChanged("CoverVis");
  991. this.RaisePropertyChanged("AbortOrSelLanguage");
  992. }
  993. else
  994. {
  995. MessageBox.Show("未选择代码,请重新选择!", "", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
  996. }
  997. }
  998. }));
  999. }
  1000. return clickUploadCommand;
  1001. }
  1002. }
  1003. private BaseCommand? clickAboutUploadCommand;
  1004. public BaseCommand ClickAboutUploadCommand
  1005. {
  1006. get
  1007. {
  1008. if (clickAboutUploadCommand == null)
  1009. {
  1010. clickAboutUploadCommand = new BaseCommand(new Action<object?>(o =>
  1011. {
  1012. if (obj.UploadReady)
  1013. {
  1014. obj.CodeRoute = "";
  1015. obj.UploadReady = false;
  1016. this.RaisePropertyChanged("UploadBtnCont");
  1017. this.RaisePropertyChanged("UploadReadyVis");
  1018. this.RaisePropertyChanged("CodeName");
  1019. this.RaisePropertyChanged("CoverVis");
  1020. this.RaisePropertyChanged("AbortOrSelLanguage");
  1021. }
  1022. else
  1023. {
  1024. if (obj.launchLanguage == SettingsModel.LaunchLanguage.cpp)
  1025. obj.launchLanguage = SettingsModel.LaunchLanguage.python;
  1026. else
  1027. obj.launchLanguage = SettingsModel.LaunchLanguage.cpp;
  1028. this.RaisePropertyChanged("AbortOrSelLanguage");
  1029. this.RaisePropertyChanged("ShiftLanguageBtnCont");
  1030. this.RaisePropertyChanged("LaunchBtnCont");
  1031. }
  1032. }));
  1033. }
  1034. return clickAboutUploadCommand;
  1035. }
  1036. }
  1037. private BaseCommand? clickExitCommand;
  1038. public BaseCommand ClickExitCommand
  1039. {
  1040. get
  1041. {
  1042. if (clickExitCommand == null)
  1043. {
  1044. clickExitCommand = new BaseCommand(new Action<object?>(o =>
  1045. {
  1046. Application.Current.Shutdown();
  1047. }));
  1048. }
  1049. return clickExitCommand;
  1050. }
  1051. }
  1052. private BaseCommand? clickShiftLanguageCommand;
  1053. public BaseCommand ClickShiftLanguageCommand
  1054. {
  1055. get
  1056. {
  1057. if (clickShiftLanguageCommand == null)
  1058. {
  1059. clickShiftLanguageCommand = new BaseCommand(new Action<object?>(o =>
  1060. {
  1061. if (obj.launchLanguage == SettingsModel.LaunchLanguage.cpp)
  1062. obj.launchLanguage = SettingsModel.LaunchLanguage.python;
  1063. else
  1064. obj.launchLanguage = SettingsModel.LaunchLanguage.cpp;
  1065. this.RaisePropertyChanged("ShiftLanguageBtnCont");
  1066. this.RaisePropertyChanged("LaunchBtnCont");
  1067. this.RaisePropertyChanged("AbortOrSelLanguage");
  1068. }));
  1069. }
  1070. return clickShiftLanguageCommand;
  1071. }
  1072. }
  1073. private BaseCommand? clickReadCommand;
  1074. public BaseCommand ClickReadCommand
  1075. {
  1076. get
  1077. {
  1078. if (clickReadCommand == null)
  1079. {
  1080. clickReadCommand = new BaseCommand(new Action<object?>(o =>
  1081. {
  1082. if (!Directory.Exists(Route + "/THUAI6/win"))
  1083. {
  1084. if (Directory.Exists(Route.Substring(0, Route.Length - 7) + "/THUAI6/win"))
  1085. Route = Route.Substring(0, Route.Length - 7);
  1086. else
  1087. {
  1088. MessageBox.Show("请选择名为THUAI6的完整选手包文件夹,这可能意味着你需要对选手包文件夹进行重命名");
  1089. return;
  1090. }
  1091. }
  1092. Program.Data.ResetFilepath(Route);
  1093. if (Program.Tencent_cos_download.CheckAlreadyDownload())
  1094. Status = SettingsModel.Status.login;
  1095. }));
  1096. }
  1097. return clickReadCommand;
  1098. }
  1099. }
  1100. private BaseCommand? clickSwitchOSCommand;
  1101. public BaseCommand ClickSwitchOSCommand
  1102. {
  1103. get
  1104. {
  1105. if (clickSwitchOSCommand == null)
  1106. {
  1107. clickSwitchOSCommand = new BaseCommand(new Action<object?>(o =>
  1108. {
  1109. switch (obj.usingOS)
  1110. {
  1111. case SettingsModel.UsingOS.Win:
  1112. obj.usingOS = SettingsModel.UsingOS.Linux;
  1113. break;
  1114. case SettingsModel.UsingOS.Linux:
  1115. obj.usingOS = SettingsModel.UsingOS.OSX;
  1116. break;
  1117. case SettingsModel.UsingOS.OSX:
  1118. obj.usingOS = SettingsModel.UsingOS.Win;
  1119. break;
  1120. }
  1121. this.RaisePropertyChanged("SwitchOSBtnCont");
  1122. obj.WriteUsingOS();
  1123. obj.checkUpdate();
  1124. UpdateInfoVis = Visibility.Visible;
  1125. this.RaisePropertyChanged("UpdateBtnCont");
  1126. this.RaisePropertyChanged("UpdateInfo");
  1127. this.RaisePropertyChanged("UpdateInfoVis");
  1128. }));
  1129. }
  1130. return clickSwitchOSCommand;
  1131. }
  1132. }
  1133. }
  1134. }