Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using System.Net;
- using System.IO;
- using System.IO.Compression;
- using Ionic.Zip;
- using System.Threading;
- using System.Xml;
- namespace Launcher
- {
- public partial class Launcher : Form
- {
- WebClient CLIENT; // Класс для загрузки файлов
- const string SERVER_VERSION_INTERNET_URL = "https://raw.githubusercontent.com/Chevron94/9-GROUP-FULL-VERSION/master/ServerVersion.xml";
- const string USER_VERSION_FILE = @"mods\Group9\Data\Version.txt";
- const string SERVER_VERSION_FILE = @"mods\Group9\Updates\ServerVersion.xml";
- const string EXTRACTING_PATH = @"mods\Group9\Data";
- string USER_VERSION; // Версия пользователя
- string SERVER_VERSION; // Версия сервера
- string UPDATE_FILE_PATH=""; // Куда качается обновление
- int LAST_SIZE = 0; // размер файла при предыдущем замере
- int CUR_SIZE = 0; // размер файла при текущем замере
- bool Cancel = false; // отмена загрузки
- int Unpack_Size = 0;
- DownloadProgressChangedEventHandler Dp;
- public Launcher()
- {
- InitializeComponent();
- CLIENT = new WebClient();
- if (!System.IO.Directory.Exists(@"mods\Group9\Updates"))
- System.IO.Directory.CreateDirectory(@"mods\Group9\Updates");
- if (!System.IO.Directory.Exists(@"mods\Group9\Data"))
- System.IO.Directory.CreateDirectory(@"mods\Group9\Data");
- CheckForIllegalCrossThreadCalls = false;
- Dp = new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
- }
- public void SwitchText(bool value) // Видим - не видим)
- {
- TIMER.Enabled = value;
- L_DOWNLOADED.Visible = value;
- T_DOWNLOADED.Visible = value;
- L_FULL.Visible = value;
- T_FULL.Visible = value;
- L_PROGRESS.Visible = value;
- P_PROGRESS.Visible = value;
- T_SPEED.Visible = value;
- B_CANCEL.Visible = value;
- B_UPDATE.Visible = !value;
- B_START.Visible = !value;
- Application.DoEvents();
- }
- private void Start_Click(object sender, EventArgs e) // Запуск игры
- {
- if (System.IO.File.Exists("swfoc.exe"))
- {
- System.Diagnostics.Process GAME = new System.Diagnostics.Process();
- GAME.StartInfo.FileName = "swfoc.exe";
- GAME.StartInfo.Arguments = "MODPATH=" + @"Mods\Group9";
- GAME.Start();
- }
- else MessageBox.Show("Файл swfoc.exe не найден", "Ошибка",MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- public void get_user_version() // получить версию юзера
- {
- if (!System.IO.File.Exists(USER_VERSION_FILE))
- {
- T_USERVERSION.Text = "0.0.0";
- USER_VERSION = "0.0.0";
- }
- else
- {
- System.IO.StreamReader UserVersionReader = new System.IO.StreamReader(USER_VERSION_FILE);
- USER_VERSION = (UserVersionReader.ReadLine()).Trim();
- T_USERVERSION.Text = USER_VERSION;
- UserVersionReader.Close();
- }
- }
- private void Launcher_Load(object sender, EventArgs e)
- {
- get_user_version();
- }
- private void Extracting_Process(object sender, ExtractProgressEventArgs e) // отображение прогресса распаковки
- {
- if (e.EntriesExtracted > 0)
- {
- P_PROGRESS.Value = e.EntriesExtracted;
- }
- Application.DoEvents();
- }
- private void Extract(string Path_To_Archive, string Extract_Path) // Сама функция извлечения
- {
- ZipFile zf = new ZipFile(UPDATE_FILE_PATH);
- zf.ExtractProgress += Extracting_Process;
- P_PROGRESS.Maximum = zf.Count;
- zf.ExtractAll(EXTRACTING_PATH,ExtractExistingFileAction.OverwriteSilently);
- }
- public void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) // отображение загрузки
- {
- P_PROGRESS.Value = (Int32)e.BytesReceived;
- long i = e.TotalBytesToReceive;
- T_DOWNLOADED.Text = (e.BytesReceived / 1024 / 1024).ToString() + "," + (e.BytesReceived / 1024 % 1024).ToString() + " МБ";
- Application.DoEvents();
- }
- public bool GetDownloadInfo(ref string DownloadUrl, ref int UnpackSize) // получаем инфу из скачанного файла серверной версии
- {
- //TODO Учесть возможность загрузки нескольких файлов!
- var xml = new XmlDocument();
- if (File.Exists(SERVER_VERSION_FILE))
- xml.Load(SERVER_VERSION_FILE);
- SERVER_VERSION = xml.SelectNodes("ServerInfo").Item(0).FirstChild.InnerText;
- T_SERVERVERSION.Text = SERVER_VERSION;
- if (SERVER_VERSION.Equals(USER_VERSION)) // проверка версии
- {
- return false;
- }
- foreach (XmlNode node in xml.SelectNodes("/ServerInfo/Updates/Update"))
- {
- if (node.Attributes["Name"].Value == USER_VERSION || node.Attributes["Name"].Value == "0.0.0")
- {
- DownloadUrl = node.ChildNodes[0].InnerText;
- UnpackSize = Int32.Parse(node.ChildNodes[2].InnerText);
- P_PROGRESS.Maximum = Int32.Parse(node.ChildNodes[1].InnerText);
- break;
- }
- }
- return true;
- }
- private void DownLoadFile(string url, string path) // загрузка файла с интернета
- {
- CLIENT.DownloadFileAsync(new Uri(url), path);
- }
- private void Cancel_Click(object sender, EventArgs e) // отмена
- {
- CLIENT.CancelAsync();
- Cancel = true;
- }
- /*
- private int GetFileSize(string URL) // запрос размера файла
- {
- WebRequest rq = WebRequest.Create(URL);
- rq.Method = "HEAD";
- HttpWebResponse resp = (HttpWebResponse)rq.GetResponse();
- Thread.Sleep(100);
- int Length = Convert.ToInt32(resp.ContentLength);
- resp.Close();
- return Length;
- }
- */
- public void DownLoad()
- {
- string DOWNLOAD_URL = ""; // ссылка для скачивания
- Unpack_Size = 0; // распакованный размер
- CUR_SIZE = 0; // обнулить замеры размера файла
- LAST_SIZE = 0;
- Cancel = false; // загрузка не отменена
- if (!File.Exists(SERVER_VERSION_FILE))
- {
- UPDATE_FILE_PATH = SERVER_VERSION_FILE; // Куда и как сохранить файл
- DownLoadFile(SERVER_VERSION_INTERNET_URL, SERVER_VERSION_FILE); // скачивание файла серверной версии
- }
- while (CLIENT.IsBusy) // Ждем пока скачается)
- {
- Application.DoEvents();
- };
- P_PROGRESS.Value = 0; // сбрасываем прогресс бар
- if (GetDownloadInfo(ref DOWNLOAD_URL, ref Unpack_Size)) // если нужно что-то качать
- {
- SwitchText(true); // отображаем доп. окошки
- int length = P_PROGRESS.Maximum;//GetFileSize(DOWNLOAD_URL); // размер скачиваемого файла
- T_FULL.Text = (length / 1024 / 1024).ToString() + "," + (length / 1024 % 1024).ToString() + " МБ";
- T_DOWNLOADED.Text = "0";
- UPDATE_FILE_PATH = @"mods\Group9\Updates\0.0.1.zip"; // Куда и как сохранить файл
- CLIENT.DownloadProgressChanged += Dp;
- // Меняем событие загрузки для отображения прогресса
- DownLoadFile(DOWNLOAD_URL, UPDATE_FILE_PATH); // скачиваем архив
- while (CLIENT.IsBusy) // см. выше
- {
- Application.DoEvents();
- }
- CLIENT.DownloadProgressChanged -= Dp;
- if (Cancel) // Если отмена
- {
- TIMER.Enabled = false; // выключить таймер
- System.IO.File.Delete(UPDATE_FILE_PATH); // удалить недокачанный файл
- System.IO.File.Delete(SERVER_VERSION_FILE);
- MessageBox.Show("Обновление прервано!", "Обновление", MessageBoxButtons.OK, MessageBoxIcon.Error);
- SwitchText(false); // скрыть окошки
- return;
- }
- TIMER.Enabled = false; // выкл. таймер
- P_PROGRESS.Value = 0; // сброс прогресса
- //TODO Проверка файла на архив
- Extract(UPDATE_FILE_PATH, EXTRACTING_PATH); // распаковка
- get_user_version(); // обновление версии пользователя
- MessageBox.Show("Обновление завершено!", "Обновление", MessageBoxButtons.OK, MessageBoxIcon.Information);
- SwitchText(false); // спрятать окошки
- }
- else MessageBox.Show("Обновление не требуется!", "Обновление", MessageBoxButtons.OK, MessageBoxIcon.Information);
- System.IO.File.Delete(UPDATE_FILE_PATH);
- System.IO.File.Delete(SERVER_VERSION_FILE);
- }
- private void Update_Click(object sender, EventArgs e) // обновление
- {
- Thread main = new Thread(new ThreadStart(DownLoad));
- main.Start();
- }
- private void TIMER_Tick(object sender, EventArgs e) // определение скорости загрузки
- {
- CUR_SIZE = Convert.ToInt32(new System.IO.FileInfo(UPDATE_FILE_PATH).Length);
- T_SPEED.Text = ((CUR_SIZE - LAST_SIZE)/ 1024).ToString() + " КБ/С";
- LAST_SIZE = CUR_SIZE;
- Application.DoEvents();
- }
- private void Launcher_FormClosed(object sender, FormClosedEventArgs e)
- {
- }
- private void Launcher_FormClosing(object sender, FormClosingEventArgs e)
- {
- B_CANCEL.PerformClick();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement