Advertisement
Guest User

Untitled

a guest
Mar 1st, 2015
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.25 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Net;
  10. using System.IO;
  11. using System.IO.Compression;
  12. using Ionic.Zip;
  13. using System.Threading;
  14. using System.Xml;
  15.  
  16. namespace Launcher
  17. {
  18.     public partial class Launcher : Form
  19.     {
  20.         WebClient CLIENT; // Класс для загрузки файлов
  21.         const string SERVER_VERSION_INTERNET_URL = "https://raw.githubusercontent.com/Chevron94/9-GROUP-FULL-VERSION/master/ServerVersion.xml";
  22.         const string USER_VERSION_FILE = @"mods\Group9\Data\Version.txt";
  23.         const string SERVER_VERSION_FILE = @"mods\Group9\Updates\ServerVersion.xml";
  24.         const string EXTRACTING_PATH = @"mods\Group9\Data";
  25.         string USER_VERSION; // Версия пользователя
  26.         string SERVER_VERSION;  // Версия сервера
  27.         string UPDATE_FILE_PATH=""; // Куда качается обновление
  28.         int LAST_SIZE = 0;  // размер файла при предыдущем замере
  29.         int CUR_SIZE = 0;   // размер файла при текущем замере
  30.         bool Cancel = false;    // отмена загрузки
  31.         int Unpack_Size = 0;
  32.         DownloadProgressChangedEventHandler Dp;
  33.         public Launcher()
  34.         {
  35.             InitializeComponent();
  36.             CLIENT = new WebClient();
  37.             if (!System.IO.Directory.Exists(@"mods\Group9\Updates"))
  38.                 System.IO.Directory.CreateDirectory(@"mods\Group9\Updates");
  39.             if (!System.IO.Directory.Exists(@"mods\Group9\Data"))
  40.                 System.IO.Directory.CreateDirectory(@"mods\Group9\Data");
  41.             CheckForIllegalCrossThreadCalls = false;
  42.             Dp = new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
  43.         }
  44.         public void SwitchText(bool value) // Видим - не видим)
  45.         {
  46.             TIMER.Enabled = value;
  47.             L_DOWNLOADED.Visible = value;
  48.             T_DOWNLOADED.Visible = value;
  49.             L_FULL.Visible = value;
  50.             T_FULL.Visible = value;
  51.             L_PROGRESS.Visible = value;
  52.             P_PROGRESS.Visible = value;
  53.             T_SPEED.Visible = value;
  54.             B_CANCEL.Visible = value;
  55.             B_UPDATE.Visible = !value;
  56.             B_START.Visible = !value;
  57.             Application.DoEvents();
  58.         }
  59.  
  60.         private void Start_Click(object sender, EventArgs e) // Запуск игры
  61.         {
  62.             if (System.IO.File.Exists("swfoc.exe"))
  63.             {
  64.                 System.Diagnostics.Process GAME = new System.Diagnostics.Process();
  65.                 GAME.StartInfo.FileName = "swfoc.exe";
  66.                 GAME.StartInfo.Arguments = "MODPATH=" + @"Mods\Group9";
  67.                 GAME.Start();
  68.             }
  69.             else MessageBox.Show("Файл swfoc.exe не найден", "Ошибка",MessageBoxButtons.OK, MessageBoxIcon.Error);
  70.         }
  71.  
  72.         public void get_user_version()  // получить версию юзера
  73.         {
  74.             if (!System.IO.File.Exists(USER_VERSION_FILE))
  75.             {
  76.                 T_USERVERSION.Text = "0.0.0";
  77.                 USER_VERSION = "0.0.0";
  78.             }
  79.             else
  80.             {
  81.                 System.IO.StreamReader UserVersionReader = new System.IO.StreamReader(USER_VERSION_FILE);
  82.                 USER_VERSION = (UserVersionReader.ReadLine()).Trim();
  83.                 T_USERVERSION.Text = USER_VERSION;
  84.                 UserVersionReader.Close();
  85.             }
  86.         }
  87.  
  88.         private void Launcher_Load(object sender, EventArgs e)
  89.         {
  90.             get_user_version();
  91.         }
  92.  
  93.         private void Extracting_Process(object sender, ExtractProgressEventArgs e) // отображение прогресса распаковки
  94.         {
  95.             if (e.EntriesExtracted > 0)
  96.             {
  97.                 P_PROGRESS.Value = e.EntriesExtracted;
  98.             }
  99.             Application.DoEvents();
  100.         }
  101.  
  102.         private void Extract(string Path_To_Archive, string Extract_Path)   // Сама функция извлечения
  103.         {
  104.             ZipFile zf = new ZipFile(UPDATE_FILE_PATH);
  105.             zf.ExtractProgress += Extracting_Process;
  106.             P_PROGRESS.Maximum = zf.Count;
  107.             zf.ExtractAll(EXTRACTING_PATH,ExtractExistingFileAction.OverwriteSilently);
  108.         }
  109.  
  110.         public void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) // отображение загрузки
  111.         {
  112.             P_PROGRESS.Value = (Int32)e.BytesReceived;
  113.             long i = e.TotalBytesToReceive;
  114.             T_DOWNLOADED.Text = (e.BytesReceived / 1024 / 1024).ToString() + "," + (e.BytesReceived / 1024 % 1024).ToString() + " МБ";
  115.             Application.DoEvents();
  116.         }
  117.  
  118.         public bool GetDownloadInfo(ref string DownloadUrl, ref int UnpackSize) // получаем инфу из скачанного файла серверной версии
  119.         {
  120.             //TODO Учесть возможность загрузки нескольких файлов!
  121.             var xml = new XmlDocument();
  122.             if (File.Exists(SERVER_VERSION_FILE))
  123.                 xml.Load(SERVER_VERSION_FILE);
  124.             SERVER_VERSION = xml.SelectNodes("ServerInfo").Item(0).FirstChild.InnerText;
  125.             T_SERVERVERSION.Text = SERVER_VERSION;
  126.             if (SERVER_VERSION.Equals(USER_VERSION))    // проверка версии
  127.             {
  128.                 return false;
  129.             }
  130.             foreach (XmlNode node in xml.SelectNodes("/ServerInfo/Updates/Update"))
  131.             {
  132.                 if (node.Attributes["Name"].Value == USER_VERSION || node.Attributes["Name"].Value == "0.0.0")
  133.                 {
  134.                     DownloadUrl = node.ChildNodes[0].InnerText;
  135.                     UnpackSize = Int32.Parse(node.ChildNodes[2].InnerText);
  136.                     P_PROGRESS.Maximum = Int32.Parse(node.ChildNodes[1].InnerText);
  137.                     break;
  138.                 }
  139.             }
  140.             return true;
  141.         }
  142.  
  143.         private void DownLoadFile(string url, string path)  // загрузка файла с интернета
  144.         {
  145.             CLIENT.DownloadFileAsync(new Uri(url), path);
  146.         }
  147.  
  148.         private void Cancel_Click(object sender, EventArgs e)   // отмена
  149.         {
  150.             CLIENT.CancelAsync();
  151.             Cancel = true;
  152.         }
  153. /*
  154.         private int GetFileSize(string URL) // запрос размера файла
  155.         {
  156.             WebRequest rq = WebRequest.Create(URL);
  157.             rq.Method = "HEAD";
  158.             HttpWebResponse resp = (HttpWebResponse)rq.GetResponse();
  159.             Thread.Sleep(100);
  160.             int Length = Convert.ToInt32(resp.ContentLength);
  161.             resp.Close();
  162.             return Length;
  163.         }
  164. */
  165.         public void DownLoad()
  166.         {
  167.             string DOWNLOAD_URL = ""; // ссылка для скачивания
  168.             Unpack_Size = 0;    // распакованный размер
  169.             CUR_SIZE = 0;   // обнулить замеры размера файла
  170.             LAST_SIZE = 0;
  171.             Cancel = false; // загрузка не отменена
  172.             if (!File.Exists(SERVER_VERSION_FILE))
  173.             {
  174.                 UPDATE_FILE_PATH = SERVER_VERSION_FILE; // Куда и как сохранить файл
  175.                 DownLoadFile(SERVER_VERSION_INTERNET_URL, SERVER_VERSION_FILE); // скачивание файла серверной версии
  176.             }
  177.             while (CLIENT.IsBusy) // Ждем пока скачается)
  178.             {
  179.                 Application.DoEvents();
  180.             };
  181.  
  182.             P_PROGRESS.Value = 0; // сбрасываем прогресс бар
  183.             if (GetDownloadInfo(ref DOWNLOAD_URL, ref Unpack_Size))  // если нужно что-то качать
  184.             {
  185.                 SwitchText(true);   // отображаем доп. окошки
  186.                 int length = P_PROGRESS.Maximum;//GetFileSize(DOWNLOAD_URL); // размер скачиваемого файла
  187.                 T_FULL.Text = (length / 1024 / 1024).ToString() + "," + (length / 1024 % 1024).ToString() + " МБ";
  188.                 T_DOWNLOADED.Text = "0";
  189.                 UPDATE_FILE_PATH = @"mods\Group9\Updates\0.0.1.zip"; // Куда и как сохранить файл
  190.                 CLIENT.DownloadProgressChanged += Dp;
  191.                         // Меняем событие загрузки для отображения прогресса
  192.                 DownLoadFile(DOWNLOAD_URL, UPDATE_FILE_PATH); // скачиваем архив
  193.  
  194.                 while (CLIENT.IsBusy)   // см. выше
  195.                 {
  196.                     Application.DoEvents();
  197.                 }
  198.                 CLIENT.DownloadProgressChanged -= Dp;
  199.  
  200.                 if (Cancel) // Если отмена
  201.                 {
  202.                     TIMER.Enabled = false; // выключить таймер
  203.                     System.IO.File.Delete(UPDATE_FILE_PATH);    // удалить недокачанный файл
  204.                     System.IO.File.Delete(SERVER_VERSION_FILE);
  205.                     MessageBox.Show("Обновление прервано!", "Обновление", MessageBoxButtons.OK, MessageBoxIcon.Error);
  206.                     SwitchText(false); // скрыть окошки
  207.                     return;
  208.                 }
  209.                 TIMER.Enabled = false;  // выкл. таймер
  210.                 P_PROGRESS.Value = 0; // сброс прогресса
  211.                 //TODO Проверка файла на архив
  212.                 Extract(UPDATE_FILE_PATH, EXTRACTING_PATH); // распаковка
  213.                 get_user_version(); // обновление версии пользователя
  214.                 MessageBox.Show("Обновление завершено!", "Обновление", MessageBoxButtons.OK, MessageBoxIcon.Information);
  215.                 SwitchText(false); // спрятать окошки
  216.             }
  217.             else MessageBox.Show("Обновление не требуется!", "Обновление", MessageBoxButtons.OK, MessageBoxIcon.Information);
  218.             System.IO.File.Delete(UPDATE_FILE_PATH);
  219.             System.IO.File.Delete(SERVER_VERSION_FILE);
  220.         }
  221.         private void Update_Click(object sender, EventArgs e)   // обновление
  222.         {
  223.             Thread main = new Thread(new ThreadStart(DownLoad));
  224.             main.Start();
  225.         }
  226.  
  227.         private void TIMER_Tick(object sender, EventArgs e) // определение скорости загрузки
  228.         {
  229.             CUR_SIZE = Convert.ToInt32(new System.IO.FileInfo(UPDATE_FILE_PATH).Length);
  230.             T_SPEED.Text = ((CUR_SIZE - LAST_SIZE)/ 1024).ToString() + " КБ/С";
  231.             LAST_SIZE = CUR_SIZE;
  232.             Application.DoEvents();
  233.         }
  234.  
  235.         private void Launcher_FormClosed(object sender, FormClosedEventArgs e)
  236.         {
  237.            
  238.         }
  239.  
  240.         private void Launcher_FormClosing(object sender, FormClosingEventArgs e)
  241.         {
  242.             B_CANCEL.PerformClick();
  243.         }
  244.     }
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement