502 lines
20 KiB
C#
502 lines
20 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace Mitria_Minecraft_Updater
|
|
{
|
|
internal static class Program
|
|
{
|
|
private static int nowPosTop;
|
|
private static int nowPosLeft;
|
|
|
|
private static void Main(string[] args)
|
|
{
|
|
Settings.LoadConfig();
|
|
if (args.Length < 1)
|
|
{
|
|
HelpMessage();
|
|
return;
|
|
}
|
|
|
|
UpdateType? updateType = GetUpdateType(args[0]);
|
|
|
|
if( updateType == null)
|
|
{
|
|
HelpMessage();
|
|
return;
|
|
}
|
|
if(updateType == UpdateType.Launcher)
|
|
{
|
|
LauncherUpdate();
|
|
return;
|
|
}
|
|
if (args.Length < 3)
|
|
{
|
|
HelpMessage();
|
|
return;
|
|
}
|
|
VersionType? versionType = GetVersionType(args[1]);
|
|
if (versionType == null)
|
|
{
|
|
HelpMessage();
|
|
return;
|
|
}
|
|
CommonLibrary.ServerInformation serverInformation = Settings.LoadServerInformation();
|
|
if(CommonLibrary.Extensions.IsDefault(ref serverInformation))
|
|
{
|
|
Console.WriteLine("not found ServerData Location : " + Settings.config.Target + Settings.config.InformationToServer);
|
|
return;
|
|
}
|
|
|
|
bool serverIs = false;
|
|
string serverOriginalName = string.Empty;
|
|
string serverList = string.Empty;
|
|
foreach (var item in serverInformation.Servers)
|
|
{
|
|
serverList += item.ServerName + ", ";
|
|
if( item.ServerName.ToUpper() == args[2].ToUpper())
|
|
{
|
|
serverIs = true;
|
|
serverOriginalName = item.ServerName;
|
|
}
|
|
}
|
|
if(!serverIs)
|
|
{
|
|
HelpMessage();
|
|
if (serverList.Length > 1)
|
|
{
|
|
serverList = serverList.Substring(0, serverList.Length - 2);
|
|
Console.WriteLine(" [ServerList] " + serverList);
|
|
return;
|
|
}
|
|
}
|
|
|
|
switch(updateType)
|
|
{
|
|
case UpdateType.Runtime:
|
|
RuntimeUpdate(serverOriginalName, (VersionType)versionType);
|
|
break;
|
|
case UpdateType.Package:
|
|
PackageUpdate(serverOriginalName, (VersionType)versionType);
|
|
break;
|
|
case UpdateType.Component:
|
|
ComponentUpdate(serverOriginalName, (VersionType)versionType);
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
public static void HelpMessage()
|
|
{
|
|
Console.WriteLine("dotnet mmu.dll [option1] [option2]");
|
|
Console.WriteLine(" [option1] Launcher, Runtime, Package, Component");
|
|
Console.WriteLine(" [option2] Major, Minor, Build, Revision");
|
|
Console.WriteLine(" [option3] ServerName");
|
|
}
|
|
|
|
public static void LauncherUpdate()
|
|
{
|
|
var launcherPatchInformation = Settings.LoadLauncherPatchInformation(); // 런처 패치정보 Load
|
|
Console.WriteLine("Start Launcher Update");
|
|
|
|
var launcherSourceDirectory = CommonLibrary.Extensions.PathCombineL(Settings.config.Source, Settings.config.LauncherSource);
|
|
var launcherTargetDirectory = CommonLibrary.Extensions.PathCombineL(Settings.config.Target, Settings.config.LauncherUrl);
|
|
var launcherSourceFile = CommonLibrary.Extensions.PathCombineL(launcherSourceDirectory, Settings.config.LauncherFileName);
|
|
var launcherTargetFile = CommonLibrary.Extensions.PathCombineL(launcherTargetDirectory, Settings.config.LauncherFileName);
|
|
Extensions.DirectoryCheckCrate(launcherSourceDirectory);
|
|
Extensions.DirectoryCheckCrate(launcherTargetDirectory);
|
|
|
|
if (!System.IO.File.Exists(launcherSourceFile))
|
|
{
|
|
Console.WriteLine("The source file could not be found. Location : " + launcherSourceFile);
|
|
return;
|
|
}
|
|
|
|
System.Diagnostics.FileVersionInfo fileVersionInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(launcherSourceFile);
|
|
|
|
var sourceVersion = new Version(fileVersionInfo.ProductVersion);
|
|
|
|
Version oldVersoin;
|
|
|
|
if (!System.IO.File.Exists(launcherTargetFile))
|
|
{
|
|
oldVersoin = Version.Parse("0.0.0.0");
|
|
}
|
|
else
|
|
{
|
|
oldVersoin = Version.Parse(launcherPatchInformation.Version);
|
|
}
|
|
|
|
var result = sourceVersion.CompareTo(oldVersoin);
|
|
|
|
if (result == 0)
|
|
{
|
|
Console.WriteLine("Version Same");
|
|
return;
|
|
}
|
|
else if (result == -1)
|
|
{
|
|
Console.WriteLine("The existing version is higher.");
|
|
return;
|
|
}
|
|
|
|
if (System.IO.File.Exists(launcherTargetFile))
|
|
{
|
|
System.IO.File.Delete(launcherTargetFile);
|
|
}
|
|
|
|
System.IO.File.Copy(launcherSourceFile, launcherTargetFile);
|
|
Console.WriteLine("update Version : " + launcherPatchInformation.Version + " → " + sourceVersion);
|
|
launcherPatchInformation.Version = sourceVersion.ToString();
|
|
Settings.SaveLauncherPatchInformation(launcherPatchInformation);
|
|
Console.WriteLine("Update Complete");
|
|
}
|
|
|
|
public static void RuntimeUpdate(string serverName, VersionType versionType)
|
|
{
|
|
var dataPatchInformation = Settings.LoadDataPatchInformation(serverName);
|
|
Console.WriteLine("Start Runtime Update - version " + versionType.ToString());
|
|
|
|
var runtimeSourceDirectory = CommonLibrary.Extensions.PathCombineL(Settings.config.Source,"Servers" , serverName, Settings.config.RuntimeSource);
|
|
var runtimeTargetDirectory = CommonLibrary.Extensions.PathCombineL(Settings.config.Target,"Servers", serverName, Settings.config.RuntimeUrl);
|
|
|
|
Extensions.DirectoryCheckCrate(runtimeSourceDirectory);
|
|
Extensions.DirectoryCheckCrate(runtimeTargetDirectory);
|
|
|
|
// 파일이 하나도 없을경우 조회실패
|
|
if (System.IO.Directory.GetFiles(runtimeSourceDirectory, "*.*", System.IO.SearchOption.AllDirectories).Length == 0)
|
|
{
|
|
Console.WriteLine("The source file could not be found. Location : " + runtimeSourceDirectory );
|
|
return;
|
|
}
|
|
|
|
// Packing 임시 파일명
|
|
var tempFile = "runtime.temp";
|
|
|
|
// Pakcing 작업 시작
|
|
Packing(runtimeSourceDirectory, tempFile);
|
|
|
|
// 최종 저장 경로 할당
|
|
var finalTarget = CommonLibrary.Extensions.PathCombineL(runtimeTargetDirectory, Settings.config.RuntimeFilename);
|
|
|
|
// 최종 저장 경로에 이미 파일이 있다면 삭제
|
|
if (System.IO.File.Exists(finalTarget))
|
|
{
|
|
System.IO.File.Delete(finalTarget);
|
|
}
|
|
|
|
System.IO.File.Move(tempFile, finalTarget);
|
|
|
|
var newVersion = VersionChange(dataPatchInformation.RuntimeVersion, versionType);
|
|
Console.WriteLine("update Version : " + dataPatchInformation.RuntimeVersion + " → " + newVersion);
|
|
dataPatchInformation.RuntimeVersion = newVersion;
|
|
Settings.SaveDataPatchInformation(serverName,dataPatchInformation);
|
|
Console.WriteLine("Update Complete");
|
|
}
|
|
|
|
public static void PackageUpdate(string serverName, VersionType versionType)
|
|
{
|
|
var dataPatchInformation = Settings.LoadDataPatchInformation(serverName);
|
|
|
|
Console.WriteLine("Start Package Update - version " + versionType.ToString());
|
|
|
|
var packageSourceDirectory = CommonLibrary.Extensions.PathCombineL(Settings.config.Source, "Servers", serverName, Settings.config.PackageSource);
|
|
var packageTargetDirectory = CommonLibrary.Extensions.PathCombineL(Settings.config.Target, "Servers", serverName, Settings.config.PackageUrl);
|
|
|
|
Extensions.DirectoryCheckCrate(packageSourceDirectory);
|
|
Extensions.DirectoryCheckCrate(packageTargetDirectory);
|
|
|
|
// 파일이 하나도 없을경우 조회실패
|
|
if (System.IO.Directory.GetFiles(packageSourceDirectory, "*.*", System.IO.SearchOption.AllDirectories).Length == 0)
|
|
{
|
|
Console.WriteLine("The source file could not be found. Location : " + packageSourceDirectory );
|
|
return;
|
|
}
|
|
|
|
// Packing 임시 파일명
|
|
var tempFile = "package.temp";
|
|
|
|
// Pakcing 작업 시작
|
|
Packing(packageSourceDirectory, tempFile);
|
|
|
|
// 최종 저장 경로 할당
|
|
var finalTarget = CommonLibrary.Extensions.PathCombineL(packageTargetDirectory, Settings.config.PackageFilename);
|
|
|
|
// 최종 저장 경로에 이미 파일이 있다면 삭제
|
|
if (System.IO.File.Exists(finalTarget))
|
|
{
|
|
System.IO.File.Delete(finalTarget);
|
|
}
|
|
|
|
System.IO.File.Move(tempFile, finalTarget);
|
|
var directories = System.IO.Directory.GetDirectories(packageSourceDirectory);
|
|
|
|
for (int i = 0; i < directories.Length; i++)
|
|
{
|
|
directories[i] = System.IO.Path.GetRelativePath(Settings.config.Source, directories[i]);
|
|
}
|
|
|
|
dataPatchInformation.PackageDirectorys = directories.ToList();
|
|
var newVersion = VersionChange(dataPatchInformation.PackageVersion, versionType);
|
|
Console.WriteLine("Update Version : " + dataPatchInformation.PackageVersion + " → " + newVersion);
|
|
dataPatchInformation.PackageVersion = newVersion;
|
|
Settings.SaveDataPatchInformation(serverName,dataPatchInformation);
|
|
Console.WriteLine("Update Complete");
|
|
}
|
|
|
|
public static void ComponentUpdate(string serverName, VersionType versionType)
|
|
{
|
|
CommonLibrary.DataPatchInformation dataPatchInformation = Settings.LoadDataPatchInformation(serverName);
|
|
|
|
Console.WriteLine("Start Component Update - version " + versionType.ToString());
|
|
|
|
var componentSourceDirectory = CommonLibrary.Extensions.PathCombineL(Settings.config.Source, "Servers", serverName, Settings.config.ComponentSource);
|
|
var componentTargetDirectory = CommonLibrary.Extensions.PathCombineL(Settings.config.Target, "Servers", serverName, Settings.config.ComponentUrl);
|
|
|
|
Extensions.DirectoryCheckCrate(componentSourceDirectory);
|
|
Extensions.DirectoryCheckCrate(componentTargetDirectory);
|
|
|
|
if (System.IO.Directory.GetFiles(componentSourceDirectory, "*.*", System.IO.SearchOption.AllDirectories).Length == 0)
|
|
{
|
|
Console.WriteLine("The source file could not be found. Location : " + componentSourceDirectory);
|
|
return;
|
|
}
|
|
|
|
Extensions.DeleteEmptyDirectory(componentSourceDirectory);
|
|
var sourceDirectorys = Extensions.GetDirectoriesRelativePath(componentSourceDirectory, "*", System.IO.SearchOption.AllDirectories);
|
|
var sourceFiles = Extensions.GetFilesRelativePath(componentSourceDirectory, "*", System.IO.SearchOption.AllDirectories);
|
|
|
|
var oldDirectorys = Extensions.GetDirectoriesRelativePath(componentTargetDirectory, "*", System.IO.SearchOption.AllDirectories);
|
|
var oldFiles = Extensions.GetFilesRelativePath(componentTargetDirectory, "*", System.IO.SearchOption.AllDirectories);
|
|
|
|
// 없어진 파일 삭제
|
|
foreach (string oFile in oldFiles)
|
|
{
|
|
if (!sourceFiles.Contains(oFile))
|
|
{
|
|
var fullPath = CommonLibrary.Extensions.PathCombineL(componentTargetDirectory, oFile);
|
|
System.IO.File.Delete(fullPath);
|
|
Console.WriteLine("DeleteFile : " + oFile);
|
|
}
|
|
}
|
|
|
|
foreach (string oDirectory in oldDirectorys)
|
|
{
|
|
if (!sourceDirectorys.Contains(oDirectory))
|
|
{
|
|
var fullPath = CommonLibrary.Extensions.PathCombineL(componentTargetDirectory, oDirectory);
|
|
System.IO.Directory.Delete(fullPath);
|
|
Console.WriteLine("DeleteDirectory : " + oDirectory);
|
|
}
|
|
}
|
|
|
|
// 새로운 파일 추가
|
|
foreach (string sDirectory in sourceDirectorys)
|
|
{
|
|
if (!oldDirectorys.Contains(sDirectory))
|
|
{
|
|
var fullPath = CommonLibrary.Extensions.PathCombineL(componentTargetDirectory, sDirectory);
|
|
System.IO.Directory.CreateDirectory(fullPath);
|
|
Console.WriteLine("CreateDirectory : " + sDirectory);
|
|
}
|
|
}
|
|
|
|
foreach (string sFile in sourceFiles)
|
|
{
|
|
if (!oldFiles.Contains(sFile))
|
|
{
|
|
var sourceFileFullPath = CommonLibrary.Extensions.PathCombineL(componentSourceDirectory, sFile);
|
|
var targetFileFullPath = CommonLibrary.Extensions.PathCombineL(componentTargetDirectory, sFile);
|
|
System.IO.File.Copy(sourceFileFullPath, targetFileFullPath);
|
|
Console.WriteLine("Copy NewFile : " + sFile);
|
|
}
|
|
}
|
|
|
|
// 무결성 검사 후 업데이트
|
|
oldFiles = Extensions.GetFilesRelativePath(componentTargetDirectory, "*", System.IO.SearchOption.AllDirectories);
|
|
|
|
foreach (string oFile in oldFiles)
|
|
{
|
|
var sourceFileFullPath = CommonLibrary.Extensions.PathCombineL(componentSourceDirectory, oFile);
|
|
var targetFileFullPath = CommonLibrary.Extensions.PathCombineL(componentTargetDirectory, oFile);
|
|
|
|
var sourceHash = Extensions.GetFileHash(sourceFileFullPath);
|
|
var targetHash = Extensions.GetFileHash(targetFileFullPath);
|
|
|
|
if (targetHash != sourceHash)
|
|
{
|
|
System.IO.File.Delete(targetFileFullPath);
|
|
System.IO.File.Copy(sourceFileFullPath, targetFileFullPath);
|
|
Console.WriteLine("Update File : " + oFile);
|
|
}
|
|
}
|
|
|
|
List<CommonLibrary.FileDetail> fileDetails = new List<CommonLibrary.FileDetail>();
|
|
for (int i = 0; i < sourceFiles.Length; i++)
|
|
{
|
|
CommonLibrary.FileDetail fileDetail = new CommonLibrary.FileDetail();
|
|
string fullPath = CommonLibrary.Extensions.PathCombineL(componentTargetDirectory, sourceFiles[i]);
|
|
fileDetail.Directory = System.IO.Path.GetDirectoryName(sourceFiles[i]);
|
|
fileDetail.FileName = System.IO.Path.GetFileName(sourceFiles[i]);
|
|
System.IO.FileInfo fi = new System.IO.FileInfo(fullPath);
|
|
fileDetail.FileSize = fi.Length;
|
|
fileDetail.HashCode = Extensions.GetFileHash(fullPath);
|
|
fileDetails.Add(fileDetail);
|
|
}
|
|
// 시작
|
|
dataPatchInformation.ComponentList = fileDetails;
|
|
dataPatchInformation.ComponentDirectorys = sourceDirectorys.ToList();
|
|
// 파일 디테일
|
|
|
|
var newVersion = VersionChange(dataPatchInformation.ComponentVersion, versionType);
|
|
Console.WriteLine("Update Version : " + dataPatchInformation.ComponentVersion + " → " + newVersion);
|
|
dataPatchInformation.ComponentVersion = newVersion;
|
|
Settings.SaveDataPatchInformation(serverName,dataPatchInformation);
|
|
Console.WriteLine("Update Complete");
|
|
// 무결성 검사후 업데이트
|
|
}
|
|
|
|
private static void Packing(string source, string target)
|
|
{
|
|
if (System.IO.File.Exists(target))
|
|
{
|
|
System.IO.File.Delete(target);
|
|
}
|
|
|
|
var progressPacker = new CommonLibrary.ProgressPacker();
|
|
Console.WriteLine("Packing Start");
|
|
Console.WriteLine("----------------------------------------");
|
|
Console.WriteLine("");
|
|
|
|
nowPosLeft = Console.CursorLeft;
|
|
nowPosTop = Console.CursorTop;
|
|
|
|
Console.CursorVisible = false;
|
|
progressPacker.Pack(source, target, new CommonLibrary.BasicProgress<double>(ProgressChange));
|
|
Console.CursorVisible = true;
|
|
|
|
Console.WriteLine();
|
|
Console.WriteLine("");
|
|
Console.WriteLine("----------------------------------------");
|
|
Console.WriteLine("Packing Complite");
|
|
}
|
|
|
|
private static string VersionChange(string version, VersionType versionType)
|
|
{
|
|
var v = Version.Parse(version);
|
|
|
|
switch (versionType)
|
|
{
|
|
case VersionType.Major:
|
|
v = new Version(v.Major + 1, 0, 0, 0);
|
|
break;
|
|
|
|
case VersionType.Minor:
|
|
v = new Version(v.Major, v.Minor + 1, 0, 0);
|
|
break;
|
|
|
|
case VersionType.Build:
|
|
v = new Version(v.Major, v.Minor, v.Build + 1, 0);
|
|
break;
|
|
|
|
case VersionType.Revision:
|
|
v = new Version(v.Major, v.Minor, v.Build, v.Revision + 1);
|
|
break;
|
|
}
|
|
|
|
return v.ToString();
|
|
}
|
|
|
|
private static void ProgressChange(double obj)
|
|
{
|
|
Console.SetCursorPosition(nowPosLeft, nowPosTop);
|
|
var Progress = (int)(obj * 10);
|
|
|
|
for (int i = 0; i < Progress; i++)
|
|
Console.Write("■");
|
|
|
|
for (int i = 0; i < 10 - Progress; i++)
|
|
Console.Write("□");
|
|
|
|
Console.Write(" " + $"{obj:P2}");
|
|
}
|
|
|
|
private static UpdateType? GetUpdateType(string data)
|
|
{
|
|
UpdateType? updateType;
|
|
switch (data.ToUpper())
|
|
{
|
|
case "LAUNCHER":
|
|
updateType = UpdateType.Launcher;
|
|
break;
|
|
|
|
case "RUNTIME":
|
|
updateType = UpdateType.Runtime;
|
|
break;
|
|
|
|
case "PACKAGE":
|
|
updateType = UpdateType.Package;
|
|
break;
|
|
|
|
case "COMPONENT":
|
|
updateType = UpdateType.Component;
|
|
break;
|
|
|
|
default:
|
|
updateType = null;
|
|
break;
|
|
}
|
|
return updateType;
|
|
|
|
}
|
|
private static VersionType? GetVersionType(string data)
|
|
{
|
|
|
|
VersionType? versionType;
|
|
switch (data.ToUpper())
|
|
{
|
|
case "MAJOR":
|
|
versionType = VersionType.Major;
|
|
break;
|
|
|
|
case "MINOR":
|
|
versionType = VersionType.Minor;
|
|
break;
|
|
|
|
case "BUILD":
|
|
versionType = VersionType.Build;
|
|
break;
|
|
|
|
case "REVISION":
|
|
versionType = VersionType.Revision;
|
|
break;
|
|
|
|
default:
|
|
versionType = null;
|
|
break;
|
|
}
|
|
return versionType;
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
internal enum UpdateType
|
|
{
|
|
Launcher,
|
|
Runtime,
|
|
Package,
|
|
Component
|
|
}
|
|
|
|
internal enum VersionType
|
|
{
|
|
Major,
|
|
Minor,
|
|
Build,
|
|
Revision
|
|
}
|
|
} |