first commit

This commit is contained in:
mikx 2025-09-22 18:44:37 -04:00
commit 6ba1e5f094
15 changed files with 1503 additions and 0 deletions

261
.gitignore vendored Normal file
View File

@ -0,0 +1,261 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
project.fragment.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
#*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush
.cr/
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

25
MxWManager.sln Normal file
View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.14.36414.22 d17.14
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MxWManager", "MxWManager\MxWManager.csproj", "{377DC521-9578-44BC-A856-23CE08E7168E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{377DC521-9578-44BC-A856-23CE08E7168E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{377DC521-9578-44BC-A856-23CE08E7168E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{377DC521-9578-44BC-A856-23CE08E7168E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{377DC521-9578-44BC-A856-23CE08E7168E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {299AE0D6-4F1F-4417-B38C-CA5A963CD6B8}
EndGlobalSection
EndGlobal

6
MxWManager/App.config Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>

163
MxWManager/MainForm.Designer.cs generated Normal file
View File

@ -0,0 +1,163 @@
namespace MxWManager
{
partial class MainForm
{
/// <summary>
/// Variable nécessaire au concepteur.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Nettoyage des ressources utilisées.
/// </summary>
/// <param name="disposing">true si les ressources managées doivent être supprimées ; sinon, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Code généré par le Concepteur Windows Form
/// <summary>
/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
/// le contenu de cette méthode avec l'éditeur de code.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.dataGridView_MainForm_EnvList = new System.Windows.Forms.DataGridView();
this.timer_MainForm_ProcessWatchDog = new System.Windows.Forms.Timer(this.components);
this.contextMenuStrip_MainForm_ConfList = new System.Windows.Forms.ContextMenuStrip(this.components);
this.contextMenuStrip_MainForm_Manage = new System.Windows.Forms.ContextMenuStrip(this.components);
this.textBox_MainForm_Console = new System.Windows.Forms.TextBox();
this.button_MainForm_NewEnv = new System.Windows.Forms.Button();
this.button_MainForm_Settings = new System.Windows.Forms.Button();
this.button_MainForm_Backup = new System.Windows.Forms.Button();
this.label_MainForm_Info = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.dataGridView_MainForm_EnvList)).BeginInit();
this.SuspendLayout();
//
// dataGridView_MainForm_EnvList
//
this.dataGridView_MainForm_EnvList.AllowUserToAddRows = false;
this.dataGridView_MainForm_EnvList.AllowUserToDeleteRows = false;
this.dataGridView_MainForm_EnvList.AllowUserToResizeColumns = false;
this.dataGridView_MainForm_EnvList.AllowUserToResizeRows = false;
this.dataGridView_MainForm_EnvList.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView_MainForm_EnvList.ColumnHeadersVisible = false;
this.dataGridView_MainForm_EnvList.Location = new System.Drawing.Point(12, 12);
this.dataGridView_MainForm_EnvList.Name = "dataGridView_MainForm_EnvList";
this.dataGridView_MainForm_EnvList.RowHeadersVisible = false;
this.dataGridView_MainForm_EnvList.Size = new System.Drawing.Size(622, 303);
this.dataGridView_MainForm_EnvList.TabIndex = 0;
this.dataGridView_MainForm_EnvList.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView_MainForm_EnvList_CellClick);
//
// timer_MainForm_ProcessWatchDog
//
this.timer_MainForm_ProcessWatchDog.Enabled = true;
this.timer_MainForm_ProcessWatchDog.Interval = 2000;
this.timer_MainForm_ProcessWatchDog.Tick += new System.EventHandler(this.timer_MainForm_ProcessWatchDog_Tick);
//
// contextMenuStrip_MainForm_ConfList
//
this.contextMenuStrip_MainForm_ConfList.Name = "contextMenuStrip_MainForm_ConfList";
this.contextMenuStrip_MainForm_ConfList.Size = new System.Drawing.Size(61, 4);
this.contextMenuStrip_MainForm_ConfList.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.contextMenuStrip_MainForm_ConfList_ItemClicked);
//
// contextMenuStrip_MainForm_Manage
//
this.contextMenuStrip_MainForm_Manage.Name = "contextMenuStrip1";
this.contextMenuStrip_MainForm_Manage.Size = new System.Drawing.Size(61, 4);
this.contextMenuStrip_MainForm_Manage.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.contextMenuStrip_MainForm_Manage_ItemClicked);
//
// textBox_MainForm_Console
//
this.textBox_MainForm_Console.BackColor = System.Drawing.Color.Black;
this.textBox_MainForm_Console.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBox_MainForm_Console.ForeColor = System.Drawing.Color.White;
this.textBox_MainForm_Console.Location = new System.Drawing.Point(12, 350);
this.textBox_MainForm_Console.Multiline = true;
this.textBox_MainForm_Console.Name = "textBox_MainForm_Console";
this.textBox_MainForm_Console.Size = new System.Drawing.Size(622, 264);
this.textBox_MainForm_Console.TabIndex = 2;
//
// button_MainForm_NewEnv
//
this.button_MainForm_NewEnv.Location = new System.Drawing.Point(12, 321);
this.button_MainForm_NewEnv.Name = "button_MainForm_NewEnv";
this.button_MainForm_NewEnv.Size = new System.Drawing.Size(75, 23);
this.button_MainForm_NewEnv.TabIndex = 3;
this.button_MainForm_NewEnv.Text = "New Env";
this.button_MainForm_NewEnv.UseVisualStyleBackColor = true;
//
// button_MainForm_Settings
//
this.button_MainForm_Settings.Location = new System.Drawing.Point(559, 321);
this.button_MainForm_Settings.Name = "button_MainForm_Settings";
this.button_MainForm_Settings.Size = new System.Drawing.Size(75, 23);
this.button_MainForm_Settings.TabIndex = 5;
this.button_MainForm_Settings.Text = "Settings";
this.button_MainForm_Settings.UseVisualStyleBackColor = true;
//
// button_MainForm_Backup
//
this.button_MainForm_Backup.Location = new System.Drawing.Point(478, 321);
this.button_MainForm_Backup.Name = "button_MainForm_Backup";
this.button_MainForm_Backup.Size = new System.Drawing.Size(75, 23);
this.button_MainForm_Backup.TabIndex = 6;
this.button_MainForm_Backup.Text = "Backup";
this.button_MainForm_Backup.UseVisualStyleBackColor = true;
//
// label_MainForm_Info
//
this.label_MainForm_Info.AutoSize = true;
this.label_MainForm_Info.Font = new System.Drawing.Font("Verdana", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label_MainForm_Info.Location = new System.Drawing.Point(93, 325);
this.label_MainForm_Info.Name = "label_MainForm_Info";
this.label_MainForm_Info.Size = new System.Drawing.Size(137, 14);
this.label_MainForm_Info.TabIndex = 7;
this.label_MainForm_Info.Text = "Developped by mikx.";
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Orange;
this.ClientSize = new System.Drawing.Size(647, 626);
this.Controls.Add(this.label_MainForm_Info);
this.Controls.Add(this.button_MainForm_Backup);
this.Controls.Add(this.button_MainForm_Settings);
this.Controls.Add(this.button_MainForm_NewEnv);
this.Controls.Add(this.textBox_MainForm_Console);
this.Controls.Add(this.dataGridView_MainForm_EnvList);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.Name = "MainForm";
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.Text = "MxWManager";
this.Load += new System.EventHandler(this.MainForm_Load);
((System.ComponentModel.ISupportInitialize)(this.dataGridView_MainForm_EnvList)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.DataGridView dataGridView_MainForm_EnvList;
private System.Windows.Forms.Timer timer_MainForm_ProcessWatchDog;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip_MainForm_ConfList;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip_MainForm_Manage;
private System.Windows.Forms.TextBox textBox_MainForm_Console;
private System.Windows.Forms.Button button_MainForm_NewEnv;
private System.Windows.Forms.Button button_MainForm_Settings;
private System.Windows.Forms.Button button_MainForm_Backup;
private System.Windows.Forms.Label label_MainForm_Info;
}
}

465
MxWManager/MainForm.cs Normal file
View File

@ -0,0 +1,465 @@
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net.NetworkInformation;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MxWManager
{
public partial class MainForm : Form
{
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool GenerateConsoleCtrlEvent(int dwCtrlEvent, int dwProcessGroupId);
// P/Invoke declarations for Windows API functions
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
// Constant to restore a minimized window
private const int SW_RESTORE = 9;
public static string version = "1.0.0";
public Stopwatch stopwatch = new Stopwatch();
public TimeSpan ts;
public string elapsedTime = "";
private static string contextMenuEnv = "";
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
label_MainForm_Info.Text = $"Developped by mikx. Version: {version}";
dataGridView_MainForm_EnvList.BackgroundColor = Color.FromArgb(22,23,23);
textBox_MainForm_Console.BackColor = Color.FromArgb(22, 23, 23);
int envc = 0;
var env = Directory.GetDirectories(Directory.GetCurrentDirectory());
foreach (var dir in env)
{
bool envcheck = File.Exists($@"{dir}\env.json");
if (envcheck)
{
envc++;
}
}
MainConsole("System",$"MxWManager Launched with {envc} managed env.");
UpdateEnvList();
dataGridView_MainForm_EnvList.ClearSelection();
dataGridView_MainForm_EnvList.CurrentCell = null;
}
private void dataGridView_MainForm_EnvList_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView_MainForm_EnvList.Rows[e.RowIndex].Cells[e.ColumnIndex].Value != null)
{
string clickedButtonText = dataGridView_MainForm_EnvList.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
string envName = dataGridView_MainForm_EnvList.Rows[e.RowIndex].Cells[2].Value.ToString();
Process p = new Process();
switch (clickedButtonText)
{
case "Browse":
Process.Start(new ProcessStartInfo($@"{envName}"));
MainConsole($"{envName}", $"Browsing {envName}.");
break;
case "IDE":
MainConsole($"{envName}", $"Starting IDE for {envName}.");
p.StartInfo.FileName = "devenv.exe";
p.StartInfo.Arguments = $@"{envName}/build/AzerothCore.sln";
p.Start();
UpdateEnvList();
break;
case "Manage":
contextMenuStrip_MainForm_Manage.Items.Clear();
contextMenuEnv = envName;
contextMenuStrip_MainForm_Manage.Items.Add($@"CC|{envName}| Copy built Core");
var env = Directory.GetDirectories(Directory.GetCurrentDirectory());
foreach (var dir in env)
{
bool envcheck = File.Exists($@"{dir}\env.json");
if (envcheck && Path.GetFileName(dir) != envName && !envName.Contains("DEV"))
{
contextMenuStrip_MainForm_Manage.Items.Add($@"GS|{Path.GetFileName(dir)}| Get Sources From");
}
}
contextMenuStrip_MainForm_Manage.Show(Cursor.Position.X, Cursor.Position.Y);
break;
case "Config":
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
{
MainConsole($"{envName}", $"Opening {envName} env config...");
p.StartInfo.FileName = @"code";
p.StartInfo.Arguments = $@"{envName}\env.json";
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.Start();
dataGridView_MainForm_EnvList.ClearSelection();
dataGridView_MainForm_EnvList.CurrentCell = null;
break;
}
else
{
stopwatch.Start();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = $"/C cd {envName}/build && cmake ..\\sources -G \"Visual Studio 17 2022\" -A x64 -DWITH_WARNINGS=0 -DTOOLS_BUILD=none -DSCRIPTS=static -DMODULES=static -DMYSQL_LIBRARY=\"..\\..\\_DEPS\\mysql\\lib\\libmysql.lib\" -DMYSQL_INCLUDE_DIR=\"..\\..\\_DEPS\\mysql\\include\"";
p.Start();
MainConsole($"{envName}", $"Configuring {envName}...");
p.WaitForExit();
stopwatch.Stop();
ts = stopwatch.Elapsed;
elapsedTime = String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);
MainConsole($"{envName}", $"Configured {envName} in {elapsedTime}.");
UpdateEnvList();
break;
}
case "Clean":
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = $"/C cd {envName}/build && cmake --build . --target clean --config RelWithDebInfo";
MainConsole($"{envName}", $"Cleaned {envName}.");
p.Start();
break;
case "Build":
stopwatch.Start();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = $"/C cd {envName}/build && cmake --build . --config RelWithDebInfo";
p.Start();
MainConsole($"{envName}", $"Building {envName}...");
p.WaitForExit();
stopwatch.Stop();
ts = stopwatch.Elapsed;
elapsedTime = String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);
MainConsole($"{envName}", $"Built {envName} in {elapsedTime}.");
stopwatch.Reset();
UpdateEnvList();
break;
case "Auth":
int apid = GetEnvProcessID(envName, "auth");
if (apid == 0 || !ProcessExists(apid))
{
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = $@"/C cd {Directory.GetCurrentDirectory()}\{envName}\core && authserver.exe";
p.Start();
SetEnvProcessID(envName, "auth", p.Id);
MainConsole($"{envName}", $"Started Auth with pid {p.Id}.");
UpdateEnvList();
} else
{
MainConsole($"{envName}", $"Auth is running with pid {apid}, focusing.");
SetActiveWindowByProcessId(apid);
}
break;
case "World":
int wpid = GetEnvProcessID(envName, "world");
if (wpid == 0 || !ProcessExists(wpid))
{
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = $@"/C cd {Directory.GetCurrentDirectory()}\{envName}\core && worldserver.exe";
p.Start();
SetEnvProcessID(envName, "world", p.Id);
MainConsole($"{envName}", $"Started World with pid {p.Id}.");
UpdateEnvList();
} else
{
MainConsole($"{envName}", $"World is running with pid {wpid}, focusing.");
SetActiveWindowByProcessId(wpid);
}
break;
case "Configs":
contextMenuStrip_MainForm_ConfList.Items.Clear();
contextMenuEnv = envName;
var configs = Directory.GetFiles($@"{envName}\core\configs", "*.conf");
foreach (var c in configs)
{
contextMenuStrip_MainForm_ConfList.Items.Add(Path.GetFileName(c));
}
contextMenuStrip_MainForm_ConfList.Show(Cursor.Position.X, Cursor.Position.Y);
break;
}
}
}
public void UpdateEnvList()
{
dataGridView_MainForm_EnvList.Rows.Clear();
dataGridView_MainForm_EnvList.Columns.Clear();
DataGridViewImageColumn imgColumn = new DataGridViewImageColumn();
dataGridView_MainForm_EnvList.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
dataGridView_MainForm_EnvList.RowTemplate.Height = 31;
dataGridView_MainForm_EnvList.ReadOnly = true;
//dataGridView_MainForm_EnvList.Columns.Add(new DataGridViewImageColumn());
dataGridView_MainForm_EnvList.Columns.Add(new DataGridViewImageColumn());
dataGridView_MainForm_EnvList.Columns.Add(new DataGridViewTextBoxColumn());
dataGridView_MainForm_EnvList.Columns.Add(new DataGridViewTextBoxColumn());
dataGridView_MainForm_EnvList.Columns.Add(new DataGridViewButtonColumn());
dataGridView_MainForm_EnvList.Columns.Add(new DataGridViewButtonColumn());
dataGridView_MainForm_EnvList.Columns.Add(new DataGridViewButtonColumn());
dataGridView_MainForm_EnvList.Columns.Add(new DataGridViewButtonColumn());
dataGridView_MainForm_EnvList.Columns.Add(new DataGridViewButtonColumn());
dataGridView_MainForm_EnvList.Columns.Add(new DataGridViewButtonColumn());
dataGridView_MainForm_EnvList.Columns.Add(new DataGridViewImageColumn());
dataGridView_MainForm_EnvList.Columns.Add(new DataGridViewButtonColumn());
dataGridView_MainForm_EnvList.Columns.Add(new DataGridViewImageColumn());
dataGridView_MainForm_EnvList.Columns.Add(new DataGridViewButtonColumn());
dataGridView_MainForm_EnvList.Columns.Add(new DataGridViewButtonColumn());
var env = Directory.GetDirectories(Directory.GetCurrentDirectory());
foreach (var dir in env)
{
bool envcheck = File.Exists($@"{dir}\env.json");
if (envcheck)
{
Image imgSource = Image.FromFile(@"_DATA\img\Source_Off.png");
if (Directory.GetFileSystemEntries($@"{dir}\sources").Length == 0)
{
imgSource = Image.FromFile(@"_DATA\img\Source_Off.png");
}
else
{
imgSource = Image.FromFile(@"_DATA\img\Source_On.png");
}
Image imgBuild = Image.FromFile(@"_DATA\img\Build_Off.png");
if (Directory.GetFileSystemEntries($@"{dir}\build\bin").Length == 0)
{
imgBuild = Image.FromFile(@"_DATA\img\Build_Off.png");
}
else
{
imgBuild = Image.FromFile(@"_DATA\img\Build_On.png");
}
Image imgAuth = Image.FromFile(@"_DATA\img\Auth_Off.png");
int authpid = GetEnvProcessID(Path.GetFileName(dir), "auth");
if (authpid != 0 && ProcessExists(authpid))
{
imgAuth = Image.FromFile(@"_DATA\img\Auth_On.png");
} else
{
imgAuth = Image.FromFile(@"_DATA\img\Auth_Off.png");
}
Image imgWorld = Image.FromFile(@"_DATA\img\World_Off.png");
int worldpid = GetEnvProcessID(Path.GetFileName(dir), "world");
if (worldpid != 0 && ProcessExists(worldpid))
{
imgWorld = Image.FromFile(@"_DATA\img\World_On.png");
}
else
{
imgWorld = Image.FromFile(@"_DATA\img\World_Off.png");
}
// Add env to datagridview
DataGridViewRow rowEnv = new DataGridViewRow();
//rowEnv.Cells.Add(new DataGridViewImageCell { Value = imgSource });
rowEnv.Cells.Add(new DataGridViewImageCell { Value = imgBuild });
rowEnv.Cells.Add(new DataGridViewTextBoxCell { Value = $"{GetEnvTag(Path.GetFileName(dir))[0]}:{GetEnvTag(Path.GetFileName(dir))[1]}" });
rowEnv.Cells.Add(new DataGridViewTextBoxCell { Value = Path.GetFileName(dir) });
rowEnv.Cells.Add(new DataGridViewButtonCell { Value = "Browse" });
rowEnv.Cells.Add(new DataGridViewButtonCell { Value = "IDE" });
rowEnv.Cells.Add(new DataGridViewButtonCell { Value = "Manage" });
rowEnv.Cells.Add(new DataGridViewButtonCell { Value = "Config" });
rowEnv.Cells.Add(new DataGridViewButtonCell { Value = "Clean" });
rowEnv.Cells.Add(new DataGridViewButtonCell { Value = "Build" });
rowEnv.Cells.Add(new DataGridViewImageCell { Value = imgAuth });
rowEnv.Cells.Add(new DataGridViewButtonCell { Value = "Auth" });
rowEnv.Cells.Add(new DataGridViewImageCell { Value = imgWorld });
rowEnv.Cells.Add(new DataGridViewButtonCell { Value = "World" });
rowEnv.Cells.Add(new DataGridViewButtonCell { Value = "Configs" });
dataGridView_MainForm_EnvList.Rows.Add(rowEnv);
}
}
}
public static bool ProcessExists(int pid)
{
try
{
Process.GetProcessById(pid);
return true;
}
catch (ArgumentException)
{
return false;
}
}
public static int GetEnvProcessID(string env, string type)
{
string jsonFilePath = $@"{env}/env.json";
string jsonContent = File.ReadAllText(jsonFilePath);
JObject jsonObject = JObject.Parse(jsonContent);
if (type == "auth") { return jsonObject["authpid"].Value<int>(); }
if (type == "world") { return jsonObject["worldpid"].Value<int>(); }
return 0;
}
public static string[] GetEnvTag(string env)
{
string jsonFilePath = $@"{env}/env.json";
string jsonContent = File.ReadAllText(jsonFilePath);
JObject jsonObject = JObject.Parse(jsonContent);
string[] tags = { jsonObject["tag"].ToString().Split('|')[0], jsonObject["tag"].ToString().Split('|')[1] };
return tags;
}
public static void SetEnvProcessID(string env, string type, int pid)
{
string jsonFilePath = $@"{env}/env.json";
string jsonContent = File.ReadAllText(jsonFilePath);
JObject jsonObject = JObject.Parse(jsonContent);
if (type == "auth") { jsonObject["authpid"] = pid; }
if (type == "world") { jsonObject["worldpid"] = pid; }
string updatedJson = jsonObject.ToString(Newtonsoft.Json.Formatting.Indented);
File.WriteAllText(jsonFilePath, updatedJson);
}
public static void SetActiveWindowByProcessId(int processId)
{
try
{
Process process = Process.GetProcessById(processId);
// Check if the process has a main window
if (process.MainWindowHandle == IntPtr.Zero)
{
Console.WriteLine($"Process with ID {processId} has no main window.");
return;
}
IntPtr handle = process.MainWindowHandle;
// Restore the window if it's minimized
ShowWindowAsync(handle, SW_RESTORE);
// Bring the window to the foreground and activate it
SetForegroundWindow(handle);
Console.WriteLine($"Window for process with ID {processId} has been activated.");
}
catch (ArgumentException)
{
Console.WriteLine($"Error: A process with ID {processId} does not exist.");
}
}
private void timer_MainForm_ProcessWatchDog_Tick(object sender, EventArgs e)
{
var env = Directory.GetDirectories(Directory.GetCurrentDirectory());
foreach (var dir in env)
{
bool envcheck = File.Exists($@"{dir}\env.json");
if (envcheck)
{
string envName = Path.GetFileName(dir);
int apid = GetEnvProcessID(Path.GetFileName(dir), "auth");
if (apid == 0 || !ProcessExists(apid))
{
SetEnvProcessID(envName, "auth", 0);
}
int wpid = GetEnvProcessID(Path.GetFileName(dir), "world");
if (wpid == 0 || !ProcessExists(wpid))
{
SetEnvProcessID(envName, "world", 0);
}
}
}
}
private void contextMenuStrip_MainForm_ConfList_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
ToolStripItem item = e.ClickedItem;
MainConsole($"{contextMenuEnv}", $"Opening {item.Text}...");
Process p = new Process();
p.StartInfo.FileName = @"code";
p.StartInfo.Arguments = $@"{contextMenuEnv}\core\configs\{item.Text}";
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.Start();
}
private void contextMenuStrip_MainForm_Manage_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
ToolStripItem item = e.ClickedItem;
string clickedType = item.Text.Split('|')[0];
string clickedEnv = item.Text.Split('|')[1];
switch (clickedType)
{
case "CC":
File.Copy($@"{clickedEnv}\build\bin\RelWithDebInfo\worldserver.exe", $@"{clickedEnv}\core\worldserver.exe", true);
break;
case "GS":
// Get sources from another env
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = $@"/C xcopy {Directory.GetCurrentDirectory()}\{clickedEnv}\sources\src {Directory.GetCurrentDirectory()}\{contextMenuEnv}\sources\src /S /E /H /Y && xcopy {Directory.GetCurrentDirectory()}\{clickedEnv}\sources\modules {Directory.GetCurrentDirectory()}\{contextMenuEnv}\sources\modules /S /E /H /Y";
p.Start();
p.WaitForExit();
break;
}
}
public void MainConsole(string env, string msg)
{
string seconds = "";
string minutes = "";
string hours = "";
if (DateTime.Now.Second < 10)
{
seconds = String.Format("0{0}", DateTime.Now.Second);
}
else
{
seconds = DateTime.Now.Second.ToString();
}
if (DateTime.Now.Minute < 10)
{
minutes = String.Format("0{0}", DateTime.Now.Minute);
}
else
{
minutes = DateTime.Now.Minute.ToString();
}
if (DateTime.Now.Hour < 10)
{
hours = String.Format("0{0}", DateTime.Now.Hour);
}
else
{
hours = DateTime.Now.Hour.ToString();
}
if (textBox_MainForm_Console.Text == "")
{
textBox_MainForm_Console.Text = $"[{hours}:{minutes}:{seconds}][{env}] {msg}";
}
else
{
textBox_MainForm_Console.AppendText("\r\n" + $"[{hours}:{minutes}:{seconds}][{env}] {msg}");
}
}
}
}

206
MxWManager/MainForm.resx Normal file
View File

@ -0,0 +1,206 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="timer_MainForm_ProcessWatchDog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="contextMenuStrip_MainForm_ConfList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>260, 17</value>
</metadata>
<metadata name="contextMenuStrip_MainForm_Manage.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>517, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
L/8Csc3/AKnd/wBpw/8OM1f/NCUa/z0tI/83Jx7/Hygu/x5YhP8dVID/Dic8qAAAABsAAAAFCRkkcCpq
lvEjcKn/J0Ra/1U+Lv9mSzn/ODUu/xigvv8SsOf/AV3R/xo+c/9jTDv/cVlG/08+L/8ObIn/DjNi/z4s
IP9KNin/LCgj/wSOsP8ApNz/AF/A/wo2bf8xIxr/QC8k/y8jG/8dPlf/H1uK/xpJb/EHEhxwAAAABQIG
CQAAAAAzJFV0yS6Atv8jZ5j/Pjo3/2BFM/8uP0H/FajU/xuY4P8CScf/MT5e/4NoUv+IbVj/b1ZE/yBI
Vv8aKzz/SDQm/005LP82KB//CG2Q/wGb2v8DWL7/BTOF/ykgHf88KyD/Iigt/x5Wgf8eV4T/EjNOygAA
ADMCBQcAAAAAAAAAAAkOIi2NNH6n+yiAvf8pWXr/Py8k/yBUZ/8jve7/XtP5/y972P88Q2D/mn5m/6CD
bP+Nc13/NTAr/y4mIf9ROy3/UDst/zYpIP8IaZP/Hrnu/0my6P8iYrv/GSE8/yYfGv8eSWn/H12M/xlI
bfwHEx2PAAAACQAAAAAAAAAAAQUJAAAAAFcbSWvxNpPH/yeCv/8iR2D/F0NP/yuFlv9JlJ//UoaX/1RV
Wv+tkXn/upuC/5B1YP9RPC7/Ujwu/1dBMf9UPi//Nioi/xRQYv8ceIv/M36L/z1xhP8bLD//GTpT/yBg
j/8dWIT/DTFJ8QAAAFkBBAUAAAAAAAAAAAAAAwoAAAEIQwIhW+Ysc6P/NpvT/yeJxP8pV2j/aVlM/6yR
fP+7oIn/waaP/9e4nv+xlHz/bFJB/2BHNv9fRjb/XEU0/1pDM/9QOy3/RDEk/0EuIv85Jxz/JB0Y/xs9
Vf8gYpP/H12L/xVOc/8GP1rmAAQFRgAEBgAAAAAAAAAAAAEFDQAAAAdBH1KX5Dt5of81j7L/Nqvd/yus
0/87i5X/f39y/8+zmv/z0rf/8tK2/7eZgf99YU3/d1xJ/3BWRP9kSzr/X0c2/15FNf9XQDD/RzMm/y4w
Mf8iUHD/Imib/yBik/8rXn3/P4Wf/xlxmeQAAgVFAQcKAAAAAAAAAAAABAcKAAECBD5BdZDYM4yy8gxP
bfMrgZv6OcHe/zPQ5P9CtsL/YY2N/5CLfv+1non/xaeP/8Cgh/+3mH//rIx0/31hTf9UPS3/RzYr/zU2
Nv8nSWH/I2eX/yNvpv8gYpP/H0to+0NrdfRwtMPzP3yQ2wABA0MCBwkAAAAAAAAAAAABAQEAAQEBFwsU
FlQDFh5bAA0UXgUQE38mbnrCQsPU81Xe8P9p3/D/dMzZ/3Cssv9nkJD/YX55/1x0bv9XbWr/Ql5k/yxV
a/8oZIv/JXWq/yV7tv8kdKv/Hl+O8xAyS8MGCw6EEBgZZBYiJGEPFxhaAAEBGwEBAQAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwABASwZP0R+P5Kfy2TL2/N85Pb+fOn6/2Pg8f9D0uP/LsPY/yux
0/8qodP/KZPT/yiJyv8lfrr+IGqd8xdIa8sJHSt+AAAALAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoCBQU0Gzc7cz1zfKtTn6vRUrbE5kK+
zfA1t830LaPH9CaKuvAhc6fmG1yH0RM+XKsJHClzAQIDNQAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAHAED
Az4KGBlfDywvdxAyOYQNLTeECR8rdwQPFl8AAgI+AAAAHAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA/8AD//8AAP/8AAA/gAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAA8AA
AAPAAAADwAAAA8AAAAP8AAA//wAA///AA/8=
</value>
</data>
</root>

View File

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{377DC521-9578-44BC-A856-23CE08E7168E}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>MxWManager</RootNamespace>
<AssemblyName>MxWManager</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>\\192.168.1.160\MxWCore\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>WoW_icon.svg.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.4\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<Content Include="WoW_icon.svg.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

22
MxWManager/Program.cs Normal file
View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MxWManager
{
internal static class Program
{
/// <summary>
/// Point d'entrée principal de l'application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}

View File

@ -0,0 +1,33 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Les informations générales relatives à un assembly dépendent de
// l'ensemble d'attributs suivant. Changez les valeurs de ces attributs pour modifier les informations
// associées à un assembly.
[assembly: AssemblyTitle("MxWManager")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MxWManager")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// L'affectation de la valeur false à ComVisible rend les types invisibles dans cet assembly
// aux composants COM. Si vous devez accéder à un type dans cet assembly à partir de
// COM, affectez la valeur true à l'attribut ComVisible sur ce type.
[assembly: ComVisible(false)]
// Le GUID suivant est pour l'ID de la typelib si ce projet est exposé à COM
[assembly: Guid("377dc521-9578-44bc-a856-23ce08e7168e")]
// Les informations de version pour un assembly se composent des quatre valeurs suivantes :
//
// Version principale
// Version secondaire
// Numéro de build
// Révision
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Ce code a été généré par un outil.
// Version du runtime :4.0.30319.42000
//
// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si
// le code est régénéré.
// </auto-generated>
//------------------------------------------------------------------------------
namespace MxWManager.Properties
{
/// <summary>
/// Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées.
/// </summary>
// Cette classe a été générée automatiquement par la classe StronglyTypedResourceBuilder
// à l'aide d'un outil, tel que ResGen ou Visual Studio.
// Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen
// avec l'option /str ou régénérez votre projet VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Retourne l'instance ResourceManager mise en cache utilisée par cette classe.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MxWManager.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Remplace la propriété CurrentUICulture du thread actuel pour toutes
/// les recherches de ressources à l'aide de cette classe de ressource fortement typée.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View File

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace MxWManager.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

View File

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

BIN
MxWManager/WoW_icon.svg.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="13.0.4" targetFramework="net472" />
</packages>