|
- using GCMM.Properties;
- using Newtonsoft.Json.Linq;
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Reflection;
- using System.Runtime.CompilerServices;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
-
- namespace GCMM
- {
- partial class MainForm
- {
-
- public void GetInstalledMods()
- {
- foreach (var modPath in Directory.GetFiles(Settings.Default.GamePath + @"\Plugins", "*.dll"))
- {
- try
- {
- var an = AssemblyName.GetAssemblyName(modPath);
- if (an.Name == "0Harmony") continue;
- AddUpdateModInList(new ModInfo { Name = an.Name, Version = an.Version, LastUpdated = File.GetLastWriteTime(modPath) });
- }
- catch (BadImageFormatException)
- { //Not a .NET assembly
- }
- }
- }
-
- public async void GetAvailableMods()
- {
- /*string reposURL = "/api/v1/repos/search?sort=updated&order=desc";
- using (var client = GetClient())
- {
- var obj = JObject.Parse(await client.DownloadStringTaskAsync(reposURL));
- if (!(bool)obj["ok"]) return;
- foreach (var repo in obj["data"])
- {
- var mod = new ModInfo
- {
- Name = repo["name"].ToString(),
- Author = repo["owner"]["username"].ToString(),
- LastUpdated = (DateTime)repo["updated_at"]
- };
- if (await FetchModInfo(mod)) //If it's actually a mod
- AddUpdateModInList(mod);
- }
- }*/
- foreach (string line in File.ReadLines("modlist.txt"))
- {
- var sp = line.Split('\t');
- var mod = new ModInfo
- {
- Author = sp[0],
- Name = sp[1]
- };
- if (await FetchModInfo(mod)) //If it's actually a mod
- AddUpdateModInList(mod);
- }
- }
-
- public async Task<bool> FetchModInfo(ModInfo mod)
- {
- string repoURL = "/api/v1/repos/" + mod.Author + "/" + mod.Name + "/releases";
- using (var client = GetClient())
- {
- var arr = JArray.Parse(await client.DownloadStringTaskAsync(repoURL));
- var release = arr.FirstOrDefault(rel => !(bool)rel["prerelease"] && !(bool)rel["draft"]);
- if (release == null)
- return false;
- if (release["assets"].Count() == 1)
- mod.DownloadURL = release["assets"].First["browser_download_url"].ToString();
- mod.LastUpdated = (DateTime)release["published_at"];
- var ver = release["tag_name"].ToString().Replace("v", "").Split('.').Select(str => int.Parse(str)).ToArray();
- int getver(byte i) => ver.Length > i ? ver[i] : 0; //By default it sets values not present to -1, but we need them to be 0
- mod.LatestVersion = new Version(getver(0), getver(1), getver(2), getver(3));
- try
- {
- var obj = JObject.Parse(await client.DownloadStringTaskAsync("/api/v1/repos/" + mod.Author + "/" + mod.Name + "/contents/README.md"));
- mod.Description = Encoding.UTF8.GetString(Convert.FromBase64String(obj["content"].ToString()));
- }
- catch(WebException)
- { //It returns a HTTP 500 if it doesn't exist...
- }
- return true;
- }
- }
-
- public void AddUpdateModInList(ModInfo mod)
- {
- if (mods.ContainsKey(mod.Name) ^ modlist.Items.ContainsKey(mod.Name))
- throw new InvalidOperationException("The mod isn't present in one of the two places: " + mod.Name);
- if (modlist.Items.ContainsKey(mod.Name))
- {
- var omod = mods[mod.Name];
- var item = modlist.Items[mod.Name];
- var items = item.SubItems;
- omod.Author = mod.Author ?? omod.Author;
- omod.Version = mod.Version ?? omod.Version;
- omod.LatestVersion = mod.LatestVersion ?? omod.LatestVersion;
- omod.LastUpdated = mod.LastUpdated == default ? omod.LastUpdated : mod.LastUpdated;
- omod.Description = mod.Description ?? omod.Description;
- omod.DownloadURL = mod.DownloadURL ?? omod.DownloadURL;
- items[1].Text = omod.Author ?? "";
- items[2].Text = (omod.Version ?? omod.LatestVersion)?.ToString();
- items[3].Text = omod.LastUpdated.ToString();
- item.Group = omod.Installed ? modlist.Groups["installed"] : modlist.Groups["available"];
- if (mod.Version != mod.LatestVersion)
- items[2].ForeColor = Color.Red;
- }
- else
- {
- mods.Add(mod.Name, mod);
- var item = new ListViewItem(new[] { mod.Name, mod.Author ?? "", (mod.Version ?? mod.LatestVersion)?.ToString() ?? "", mod.LastUpdated.ToString() }, modlist.Groups[mod.Installed ? "installed" : "available"]);
- item.Name = mod.Name;
- modlist.Items.Add(item);
- }
- }
-
- public void RemoveModFromList(ModInfo mod)
- {
- if (mods.Remove(mod.Name))
- modlist.Items.RemoveByKey(mod.Name);
- }
- }
- }
|