Advertisement
Guest User

Untitled

a guest
Nov 27th, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 25.36 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO;
  7. using System.Net;
  8. using System.Text.RegularExpressions;
  9. using System.Globalization;
  10. using System.Threading;
  11. using System.Media;
  12. using System.Runtime.InteropServices;
  13. using System.Windows.Forms;
  14.  
  15. namespace Updater
  16. {
  17. public partial class FormMain : Form
  18. {
  19. public FormMain()
  20. {
  21. InitializeComponent();
  22. }
  23.  
  24. // On définie quelques string
  25. public string url = "ftp://51.255.96.243/addons/";
  26. public string url2 = "ftp://51.255.96.243/";
  27. public string ftpUserName = "Launcher";
  28. public string ftpPassWord = "FybFYRwPo3y#";
  29. public string remoteDir = @"/";
  30.  
  31.  
  32. public long sizeAddons;
  33. public long addonsLongCheck;
  34. public long addonsLongLastCheck;
  35. public long addonsTotal;
  36. public long fileCheck;
  37.  
  38. public long sizeMain;
  39. public long mainLongCheck;
  40. public long mainLongLastCheck;
  41. public long mainTotal;
  42. public long fileCheckMain;
  43.  
  44.  
  45. public bool addonsCheck;
  46. public bool addonsDownload;
  47.  
  48. public bool mainCheck;
  49. public bool mainDownload;
  50.  
  51. List<string[]> strListFileNameFtp = new List<string[]>();
  52. List<string[]> strListFileNameLocal = new List<string[]>();
  53. List<string[]> strListFileNameFtpMain = new List<string[]>();
  54. List<string[]> strListFileNameLocalMain = new List<string[]>();
  55.  
  56. public void flatClose1_Click(object sender, EventArgs e)
  57. {
  58. Application.Exit();
  59. }
  60.  
  61. public void flatMini1_Click(object sender, EventArgs e)
  62. {
  63. FormMain f = new FormMain();
  64. f.WindowState = FormWindowState.Minimized;
  65. }
  66.  
  67. public void FormMain_Load(object sender, EventArgs e)
  68. {
  69. AddonsWorker.RunWorkerAsync();
  70. MainWorker.RunWorkerAsync();
  71. ProgressbarGeneralWorker.RunWorkerAsync();
  72. }
  73.  
  74. private void ProgressbarGeneralWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
  75. {
  76. int valueLocal = (strListFileNameLocal.Count / 2) + (strListFileNameLocalMain.Count / 2);
  77. int valueFTP = (strListFileNameFtp.Count / 2) + (strListFileNameFtpMain.Count / 2);
  78. progressbarGeneral.Value = valueLocal / valueFTP;
  79. }
  80.  
  81. private void AddonsWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
  82. {
  83. // Création de la requête pour récup les fichiers
  84. FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://51.255.96.243/addons/");
  85. request.Credentials = new NetworkCredential("Launcher", "FybFYRwPo3y#");
  86. request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
  87.  
  88. // On lit la liste des fichiers
  89. StreamReader streamReader = new StreamReader(request.GetResponse().GetResponseStream());
  90. string fileName = streamReader.ReadLine();
  91.  
  92. // On créer une liste de tous les fichiers présent sur le FTP
  93. List<string[]> strListFileNameFtp = new List<string[]>();
  94.  
  95. // String pour récup les infos
  96. string pattern =
  97. @"^" + //# Start of line
  98. @"(?<dir>[\-ld])" + //# File size
  99. @"(?<permission>[\-rwx]{9})" + //# Whitespace \n
  100. @"\s+" + //# Whitespace \n
  101. @"(?<filecode>\d+)" +
  102. @"\s+" + //# Whitespace \n
  103. @"(?<owner>\w+)" +
  104. @"\s+" + //# Whitespace \n
  105. @"(?<group>\w+)" +
  106. @"\s+" + //# Whitespace \n
  107. @"(?<size>\d+)" +
  108. @"\s+" + //# Whitespace \n
  109. @"(?<month>\w{3})" + //# Month (3 letters) \n
  110. @"\s+" + //# Whitespace \n
  111. @"(?<day>\d{1,2})" + //# Day (1 or 2 digits) \n
  112. @"\s+" + //# Whitespace \n
  113. @"(?<timeyear>[\d:]{4,5})" + //# Time or year \n
  114. @"\s+" + //# Whitespace \n
  115. @"(?<filename>(.*))" + //# Filename \n
  116. @"$"; //# End of line
  117.  
  118. // On créer une opération Regex pour la mise en forme des données
  119. Regex regex = new Regex(pattern);
  120. IFormatProvider culture = CultureInfo.GetCultureInfo("en-us");
  121. // On créer un fichier pour indiquer au launcher que l'updater check les fichiers
  122. File.Create(System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86) + @"\Pacifique Life\check.a3").Close();
  123. // Tant qu'il y a des fichiers à lire
  124. while (!streamReader.EndOfStream)
  125. {
  126. string line = streamReader.ReadLine();
  127. // On met en forme la récup des données
  128. Match match = regex.Match(line);
  129.  
  130. //DateTime modified = new DateTime(int.Parse(match.Groups["timeyear"].Value), int.Parse(match.Groups["month"].Value), int.Parse(match.Groups["day"].Value));
  131. //DateTime modified = DateTime.Now;
  132. //if (match.Groups["timeyear"].Value.IndexOf(":") < 0)
  133. // modified = DateTime.Parse((match.Groups["day"].Value) + "-" + (match.Groups["month"].Value) + "-" + (match.Groups["timeyear"].Value));
  134.  
  135. // On affecte le size à un long
  136. sizeAddons = long.Parse(match.Groups["size"].Value);
  137. // On affecte le nom du fichier à un string
  138. string name = match.Groups["filename"].Value;
  139.  
  140. // Création du tableau à 2 dimensions
  141. string[] strArrFileInfoFtp = new string[2];
  142. // On classe le filename dans la 1er dimension du tableau
  143. strArrFileInfoFtp[0] = match.Groups["filename"].Value;
  144. // On classe le size dans la 2e dimension du tableau
  145. strArrFileInfoFtp[1] = match.Groups["size"].Value;
  146. strListFileNameFtp.Add(strArrFileInfoFtp);
  147.  
  148. int ftpListNumbers = strListFileNameFtp.Count / 2;
  149. checkFTPAddons.Text = ftpListNumbers.ToString();
  150. }
  151.  
  152. request = null;
  153. streamReader = null;
  154.  
  155. // On créer une liste de tous les fichiers présent en local
  156. List<string[]> strListFileNameLocal = new List<string[]>();
  157.  
  158. // On spécifie le directory pour comparer les fichiers en local des fichiers sur le FTP
  159. DirectoryInfo dir = new DirectoryInfo(File.ReadAllText(System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86) + @"\Pacifique Life\mod_directory.a3") + @"\@PacificLife\addons\");
  160. FileInfo[] fichiers = dir.GetFiles();
  161. addonsCheck = true;
  162. if (addonsCheck == true)
  163. {
  164. statusAddons.Text = "Check des fichiers...";
  165. }
  166. // On fait en foreach des fichiers et on les classe dans des tableau
  167. foreach (FileInfo file in fichiers)
  168. {
  169. // Création du tableau à 2 dimension
  170. string[] strArrFileInfoLocal = new string[2];
  171. // On classe le nom du fichier dans la 1er dimension
  172. strArrFileInfoLocal[0] = file.Name;
  173. // On classe la size du fichier dans la 2e dimensions
  174. strArrFileInfoLocal[1] = file.Length.ToString();
  175. strListFileNameLocal.Add(strArrFileInfoLocal);
  176.  
  177. int localListNumbers = strListFileNameLocal.Count / 2;
  178. checkLocalAddons.Text = localListNumbers.ToString();
  179. }
  180.  
  181. // On fait un foreach pour écrire dans la console les fichiers qui se trouve en local
  182. foreach (string[] arr in strListFileNameLocal)
  183. {
  184. bool blnExist = false;
  185.  
  186. foreach (string[] FTPfiles in strListFileNameFtp)
  187. {
  188. if (arr[0] == FTPfiles[0])
  189. blnExist = true;
  190. fileAddons.Text = string.Format("File: {0}", arr[0]);
  191. }
  192.  
  193. // Si un fichier existe pas sur le ftp on le delete
  194. if (!blnExist)
  195. {
  196. FileInfo fInfo = new FileInfo(dir.FullName + arr[0]);
  197. fInfo.Delete();
  198. specialAddons.Text = string.Format("Suppression de {0}", arr[0]);
  199. }
  200. }
  201.  
  202. addonsDownload = true;
  203. if (addonsDownload == true)
  204. {
  205. checkLocalAddons.Text = "Téléchargement de fichiers...";
  206. }
  207.  
  208. // On fait un foreach pour comparer les fichier en local et sur le FTP et on les télécharge
  209. foreach (string[] files in strListFileNameFtp)
  210. {
  211. fileCheck = 1;
  212. long fileTotal = ++fileCheck;
  213. string strFileTotal = fileTotal.ToString();
  214. fileAddons.Text = string.Format("Fichiers Check: {0}",strFileTotal);
  215. // On cherche les fichiers en local
  216. FileInfo fInfo = new FileInfo(dir.FullName + files[0]);
  217. // Si le fichier en local n'existe pas on le télécharge
  218. if (!fInfo.Exists && files[1] != "0")
  219. {
  220. // On convertis la taille du fichier sur le FTP en string
  221. string strSize = files[1].ToString();
  222. fileAddons.Text = string.Format("Téléchargement de {0}", files[0]);
  223. // On télécharge le fichier
  224. DownloadAddons(files[0]);
  225. // On affiche un message
  226. specialAddons.Text = string.Format("{0} a été téléchargé", files[0]);
  227. progressbarGeneral.Value = strListFileNameLocal.Count / strListFileNameFtp.Count;
  228. }
  229. else if (files[1] != "0")
  230. // Si le fichier existe en local mais est différent niveau taille à celui du FTP alors on le télécharge
  231. if (fInfo.Length != long.Parse(files[1]))
  232. {
  233. // On convertis la taille du fichier sur le FTP en string
  234. string strSize = files[1].ToString();
  235. fileAddons.Text = string.Format("Téléchargement de {0}", files[0]);
  236. // On télécharge le fichier
  237. DownloadAddons(files[0]);
  238. // On affiche un message
  239. specialAddons.Text = string.Format("{0} a été téléchargé", files[0]);
  240. progressbarGeneral.Value = strListFileNameLocal.Count / strListFileNameFtp.Count;
  241. }
  242. fileCheck = 0;
  243. }
  244.  
  245. statusAddons.Text = "Finis !";
  246. fileAddons.Text = "";
  247. specialAddons.Text = "";
  248. }
  249.  
  250. public void DownloadAddons(string file)
  251. {
  252. try
  253. {
  254. // On récup l'adresse du FTP dans les string en haut
  255. string uri = url + file;
  256. Uri serverUri = new Uri(uri);
  257. if (serverUri.Scheme != Uri.UriSchemeFtp)
  258. {
  259. return;
  260. }
  261. // On créer la requête
  262. FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url + file);
  263. request.UseBinary = true;
  264. request.Method = WebRequestMethods.Ftp.DownloadFile;
  265. request.Credentials = new NetworkCredential(ftpUserName, ftpPassWord);
  266. request.KeepAlive = false;
  267. request.UsePassive = true;
  268. FtpWebResponse response = (FtpWebResponse)request.GetResponse();
  269. Stream responseStream = response.GetResponseStream();
  270. FileStream writeStream = new FileStream(localDestnDir + @"\@PacificLife\addons\" + file, FileMode.Create);
  271. int Length = 2048;
  272. Byte[] buffer = new Byte[Length];
  273. int bytesRead = responseStream.Read(buffer, 0, Length);
  274. while (bytesRead > 0)
  275. {
  276. // On écrit le fichier
  277. writeStream.Write(buffer, 0, bytesRead);
  278. bytesRead = responseStream.Read(buffer, 0, Length);
  279.  
  280. // On indique la progression du téléchargement (de façon dégueu mais on l'indique quand même)
  281. // On récup la taille du fichier qu'on télécharge en local
  282. FileInfo taille = new FileInfo(localDestnDir + @"\@PacificLife\addons\" + file);
  283. long tailleLocale = taille.Length;
  284. // On récup la taille du fichier sur le FTP dans le fichier où on l'avait écrit
  285. long tailleFtp = sizeAddons;
  286. // On fait notre opération sur le pourcentage
  287. long percent = tailleLocale * 100 / tailleFtp;
  288. string strPercent = percent.ToString();
  289. progressbarAddons.Value = int.Parse(strPercent);
  290. }
  291. // On ferme l'écriture du fichier
  292. writeStream.Close();
  293. response.Close();
  294. }
  295. // On gère nos exceptions
  296. catch (WebException wEx)
  297. {
  298. MessageBox.Show(wEx.Message, "Download Error");
  299. }
  300. catch (Exception ex)
  301. {
  302. MessageBox.Show(ex.Message, "Download Error");
  303. }
  304. }
  305.  
  306. private void MainWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
  307. {
  308. // Création de la requête pour récup les fichiers
  309. FtpWebRequest request2 = (FtpWebRequest)WebRequest.Create("ftp://51.255.96.243/");
  310. request2.Credentials = new NetworkCredential("Launcher", "FybFYRwPo3y#");
  311. request2.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
  312.  
  313. // On lit la liste des fichiers
  314. StreamReader streamReader2 = new StreamReader(request2.GetResponse().GetResponseStream());
  315. string fileNameMain = streamReader2.ReadLine();
  316.  
  317. // On créer une liste de tous les fichiers présent sur le FTP
  318. List<string[]> strListFileNameFtpMain = new List<string[]>();
  319.  
  320. // String pour récup les infos
  321. string pattern =
  322. @"^" + //# Start of line
  323. @"(?<dir>[\-ld])" + //# File size
  324. @"(?<permission>[\-rwx]{9})" + //# Whitespace \n
  325. @"\s+" + //# Whitespace \n
  326. @"(?<filecode>\d+)" +
  327. @"\s+" + //# Whitespace \n
  328. @"(?<owner>\w+)" +
  329. @"\s+" + //# Whitespace \n
  330. @"(?<group>\w+)" +
  331. @"\s+" + //# Whitespace \n
  332. @"(?<size>\d+)" +
  333. @"\s+" + //# Whitespace \n
  334. @"(?<month>\w{3})" + //# Month (3 letters) \n
  335. @"\s+" + //# Whitespace \n
  336. @"(?<day>\d{1,2})" + //# Day (1 or 2 digits) \n
  337. @"\s+" + //# Whitespace \n
  338. @"(?<timeyear>[\d:]{4,5})" + //# Time or year \n
  339. @"\s+" + //# Whitespace \n
  340. @"(?<filename>(.*))" + //# Filename \n
  341. @"$"; //# End of line
  342.  
  343. // On créer une opération Regex pour la mise en forme des données
  344. Regex regex = new Regex(pattern);
  345. IFormatProvider culture = CultureInfo.GetCultureInfo("en-us");
  346. // On créer un fichier pour indiquer au launcher que l'updater check les fichiers
  347. File.Create(System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86) + @"\Pacifique Life\check.a3").Close();
  348. // Tant qu'il y a des fichiers à lire
  349. while (!streamReader2.EndOfStream)
  350. {
  351. string line = streamReader2.ReadLine();
  352. // On met en forme la récup des données
  353. Match match = regex.Match(line);
  354.  
  355. //DateTime modified = new DateTime(int.Parse(match.Groups["timeyear"].Value), int.Parse(match.Groups["month"].Value), int.Parse(match.Groups["day"].Value));
  356. //DateTime modified = DateTime.Now;
  357. //if (match.Groups["timeyear"].Value.IndexOf(":") < 0)
  358. // modified = DateTime.Parse((match.Groups["day"].Value) + "-" + (match.Groups["month"].Value) + "-" + (match.Groups["timeyear"].Value));
  359.  
  360. // On affecte le size à un long
  361. sizeMain = long.Parse(match.Groups["size"].Value);
  362. // On affecte le nom du fichier à un string
  363. string name = match.Groups["filename"].Value;
  364.  
  365. // Création du tableau à 2 dimensions
  366. string[] strArrFileInfoFtpMain = new string[2];
  367. // On classe le filename dans la 1er dimension du tableau
  368. strArrFileInfoFtpMain[0] = match.Groups["filename"].Value;
  369. // On classe le size dans la 2e dimension du tableau
  370. strArrFileInfoFtpMain[1] = match.Groups["size"].Value;
  371. strListFileNameFtpMain.Add(strArrFileInfoFtpMain);
  372.  
  373. int ftpListNumbersMain = strListFileNameFtpMain.Count / 2;
  374. checkFTPMain.Text = ftpListNumbersMain.ToString();
  375. }
  376.  
  377. request2 = null;
  378. streamReader2 = null;
  379.  
  380. // On créer une liste de tous les fichiers présent en local
  381. List<string[]> strListFileNameLocalMain = new List<string[]>();
  382.  
  383. // On spécifie le directory pour comparer les fichiers en local des fichiers sur le FTP
  384. DirectoryInfo dir = new DirectoryInfo(File.ReadAllText(System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86) + @"\Pacifique Life\mod_directory.a3") + @"\@PacificLife\");
  385. FileInfo[] fichiers = dir.GetFiles();
  386. mainCheck = true;
  387. if (mainCheck == true)
  388. {
  389. statusMain.Text = "Check des fichiers...";
  390. }
  391. // On fait en foreach des fichiers et on les classe dans des tableau
  392. foreach (FileInfo file in fichiers)
  393. {
  394. // Création du tableau à 2 dimension
  395. string[] strArrFileInfoLocalMain = new string[2];
  396. // On classe le nom du fichier dans la 1er dimension
  397. strArrFileInfoLocalMain[0] = file.Name;
  398. // On classe la size du fichier dans la 2e dimensions
  399. strArrFileInfoLocalMain[1] = file.Length.ToString();
  400. strListFileNameLocalMain.Add(strArrFileInfoLocalMain);
  401.  
  402. int localListNumbers = strListFileNameLocalMain.Count / 2;
  403. checkLocalMain.Text = localListNumbers.ToString();
  404. }
  405.  
  406. // On fait un foreach pour écrire dans la console les fichiers qui se trouve en local
  407. foreach (string[] arr in strListFileNameLocalMain)
  408. {
  409. bool blnExist = false;
  410.  
  411. foreach (string[] FTPfiles in strListFileNameFtpMain)
  412. {
  413. if (arr[0] == FTPfiles[0])
  414. blnExist = true;
  415. fileMain.Text = string.Format("File: {0}", arr[0]);
  416. }
  417.  
  418. // Si un fichier existe pas sur le ftp on le delete
  419. if (!blnExist)
  420. {
  421. FileInfo fInfo = new FileInfo(dir.FullName + arr[0]);
  422. fInfo.Delete();
  423. specialMain.Text = string.Format("Suppression de {0}", arr[0]);
  424. }
  425. }
  426.  
  427. mainDownload = true;
  428. if (mainDownload == true)
  429. {
  430. checkLocalMain.Text = "Téléchargement de fichiers...";
  431. }
  432.  
  433. // On fait un foreach pour comparer les fichier en local et sur le FTP et on les télécharge
  434. foreach (string[] files in strListFileNameFtpMain)
  435. {
  436. fileCheck = 1;
  437. long fileTotalMain = ++fileCheckMain;
  438. string strFileTotalMain = fileTotalMain.ToString();
  439. checkMain.Text = string.Format("Fichiers Check: {0}", strFileTotalMain);
  440. // On cherche les fichiers en local
  441. FileInfo fInfo = new FileInfo(dir.FullName + files[0]);
  442. // Si le fichier en local n'existe pas on le télécharge
  443. if (!fInfo.Exists && files[1] != "0")
  444. {
  445. // On convertis la taille du fichier sur le FTP en string
  446. string strSize = files[1].ToString();
  447. fileMain.Text = string.Format("Téléchargement de {0}", files[0]);
  448. // On télécharge le fichier
  449. DownloadMain(files[0]);
  450. // On affiche un message
  451. specialMain.Text = string.Format("{0} a été téléchargé", files[0]);
  452. }
  453. else if (files[1] != "0")
  454. // Si le fichier existe en local mais est différent niveau taille à celui du FTP alors on le télécharge
  455. if (fInfo.Length != long.Parse(files[1]))
  456. {
  457. // On convertis la taille du fichier sur le FTP en string
  458. string strSize = files[1].ToString();
  459. fileMain.Text = string.Format("Téléchargement de {0}", files[0]);
  460. // On télécharge le fichier
  461. DownloadMain(files[0]);
  462. // On affiche un message
  463. specialMain.Text = string.Format("{0} a été téléchargé", files[0]);
  464. }
  465. fileCheckMain = 0;
  466. }
  467.  
  468. statusMain.Text = "Finis !";
  469. fileMain.Text = "";
  470. specialMain.Text = "";
  471. }
  472.  
  473. public void DownloadMain(string file)
  474. {
  475. try
  476. {
  477. // On récup l'adresse du FTP dans les string en haut
  478. string uri2 = url2 + file;
  479. Uri serverUri = new Uri(uri2);
  480. if (serverUri.Scheme != Uri.UriSchemeFtp)
  481. {
  482. return;
  483. }
  484. // On créer la requête
  485. FtpWebRequest request2 = (FtpWebRequest)WebRequest.Create(url + file);
  486. request2.UseBinary = true;
  487. request2.Method = WebRequestMethods.Ftp.DownloadFile;
  488. request2.Credentials = new NetworkCredential(ftpUserName, ftpPassWord);
  489. request2.KeepAlive = false;
  490. request2.UsePassive = true;
  491. FtpWebResponse response2 = (FtpWebResponse)request2.GetResponse();
  492. Stream responseStream2 = response2.GetResponseStream();
  493. FileStream writeStream2 = new FileStream(localDestnDir + @"\@PacificLife\addons\" + file, FileMode.Create);
  494. int Length = 2048;
  495. Byte[] buffer = new Byte[Length];
  496. int bytesRead = responseStream2.Read(buffer, 0, Length);
  497. while (bytesRead > 0)
  498. {
  499. // On écrit le fichier
  500. writeStream2.Write(buffer, 0, bytesRead);
  501. bytesRead = responseStream2.Read(buffer, 0, Length);
  502.  
  503. // On indique la progression du téléchargement (de façon dégueu mais on l'indique quand même)
  504. // On récup la taille du fichier qu'on télécharge en local
  505. FileInfo tailleMain = new FileInfo(localDestnDir + @"\@PacificLife\addons\" + file);
  506. long tailleLocaleMain = tailleMain.Length;
  507. // On récup la taille du fichier sur le FTP dans le fichier où on l'avait écrit
  508. long tailleFtpMain = sizeMain;
  509. // On fait notre opération sur le pourcentage
  510. long percent = tailleLocaleMain * 100 / tailleFtpMain;
  511. string strPercent = percent.ToString();
  512. progressbarMain.Value = int.Parse(strPercent);
  513. }
  514. // On ferme l'écriture du fichier
  515. writeStream2.Close();
  516. response2.Close();
  517. }
  518. // On gère nos exceptions
  519. catch (WebException wEx)
  520. {
  521. MessageBox.Show(wEx.Message, "Download Error");
  522. }
  523. catch (Exception ex)
  524. {
  525. MessageBox.Show(ex.Message, "Download Error");
  526. }
  527. }
  528. }
  529. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement