2025-06-28 15:38:37 -04:00

422 lines
30 KiB
C#

using MySql.Data.MySqlClient;
using MySqlX.XDevAPI.Relational;
using Newtonsoft.Json;
using PoEco.Net.DB;
using PoEco.Net.Utilities;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using static PoEco.Net.JSON.Stash;
using static PoEco.Net.Web.PoEPrices;
namespace PoEco.Net
{
internal class Program
{
public static string version = "1.0.0";
static void Main(string[] args)
{
if (!args.Contains("--gui")) { Utilities.Message.Splash("PoEco.Net", "mikx"); }
int a = args.Length;
if (a < 1)
{
Utilities.Message.CMW("Usage: poeco.exe <args>", true, 1);
Utilities.Message.CMW("--debug Skip parts of the logics for debuging.", true, 1);
Utilities.Message.CMW("--lua Generate up to date classes and bases.", true, 1);
Utilities.Message.CMW("--gen Generate up to date currencies value.", true, 1);
Utilities.Message.CMW("--usergen-rare <userid> Generate up to date user rare tab.", true, 1);
Utilities.Message.CMW("--usergen-tab <userid> Generate up to date user tabs.", true, 1);
} else
{
if (args.Contains("--lua"))
{
Message.CMW("Generating the latest Classes and Bases from PoB Lua...", true, 1);
Web.PoBLua.GetLatestLUA();
DB.ClassGen.GenClass();
Message.CMW("Generation done.", true, 2);
}
if (args.Contains("--gen"))
{
Message.CMW("Getting the latest PoE.Ninja Currency Data...", true, 1);
if (File.Exists("data/ninja/currency.json")) { File.Delete("data/ninja/currency.json"); }
Web.PoENinja.SaveData("https://poe.ninja/api/data/" + "currencyoverview?league=" + JSON.Settings.GetLeague() + "&type=Currency&language=en", "data/ninja/currency.json");
Web.PoENinja.GenCurrency();
Message.CMW("Getting the latest PoE.Ninja Divination Data...", true, 1);
if (File.Exists("data/ninja/divination.json")) { File.Delete("data/ninja/divination.json"); }
Web.PoENinja.SaveData("https://poe.ninja/api/data/" + "itemoverview?league=" + JSON.Settings.GetLeague() + "&type=DivinationCard&language=en", "data/ninja/divination.json");
Web.PoENinja.GenDivination();
Message.CMW("Getting the latest PoE.Ninja Essence Data...", true, 1);
if (File.Exists("data/ninja/essence.json")) { File.Delete("data/ninja/essence.json"); }
Web.PoENinja.SaveData("https://poe.ninja/api/data/" + "itemoverview?league=" + JSON.Settings.GetLeague() + "&type=Essence&language=en", "data/ninja/essence.json");
Web.PoENinja.GenEssence();
Message.CMW("Getting the latest PoE.Ninja Scarab Data...", true, 1);
if (File.Exists("data/ninja/scarab.json")) { File.Delete("data/ninja/scarab.json"); }
Web.PoENinja.SaveData("https://poe.ninja/api/data/" + "itemoverview?league=" + JSON.Settings.GetLeague() + "&type=Scarab&language=en", "data/ninja/scarab.json");
Web.PoENinja.GenFragment();
Message.CMW("Getting the latest PoE.Ninja Fossil Data...", true, 1);
if (File.Exists("data/ninja/fossil.json")) { File.Delete("data/ninja/fossil.json"); }
Web.PoENinja.SaveData("https://poe.ninja/api/data/" + "itemoverview?league=" + JSON.Settings.GetLeague() + "&type=Fossil&language=en", "data/ninja/fossil.json");
Web.PoENinja.GenFossil();
return;
}
if (args.Contains("--usergen-rare"))
{
if (args.Length > 1)
{
int uid = Convert.ToInt16(args[1]);
string user = DB.User.GetUserNameByID(uid)[0];
string discriminator = DB.User.GetUserNameByID(uid)[1];
Message.CMW($"User \"{user}\" processing...", true, 1);
Message.CMW($"Checking the database for user \"{user}\"...", true, 1);
if (DB.User.CheckUserExists(user, discriminator))
{
Message.CMW($"User \"{user}\" exists with ID \"{uid}\".", true, 2);
foreach (var png in Directory.GetFiles("data/tabmap")) { File.Delete(png); }
File.Copy(@"data/StashTab_Quad.png", $@"data/tabmap/{user}#{discriminator}.png");
if (args.Contains("--clean")) { DB.Item.DeleteAllItemsByUID(uid); }
int uct = DB.User.CountTabByUID(uid);
foreach (int ti in DB.Stash.EnumerateTabByUID(uid, "rare"))
{
Message.CMW($"Processing tab \"{ti}\" from user \"{user}\".", true, 2);
string token = DB.User.GetUserTokenByID(uid);
if (!args.Contains("--debug"))
{
Web.Stash.DownloadStash(token, $"https://www.pathofexile.com/character-window/get-stash-items?league={JSON.Settings.GetLeague()}&tabs=1&tabIndex={ti}&accountName={user}%23{discriminator}", $"data/stash/{user}.rare.{ti}.json");
}
StashRoot stash = JsonConvert.DeserializeObject<StashRoot>(File.ReadAllText($@"data/stash/{user}.rare.{ti}.json"));
int stashitemcount = JSON.Stash.GetUserItemCount(user, ti);
int stashitemleft = stashitemcount;
List<string> stringItemTxt = new List<string>();
List<string> stringItemMod = new List<string>();
List<string> Rows = new List<string>();
StringBuilder sCommand = new StringBuilder("INSERT INTO poeco_items(uid, tabindex, tabname, tabrgb, cid, bid, uiid, imod, var, img, txt, b64, ctype, min, max) VALUES ");
double chaosValue = 0;
while (stashitemleft > 0)
{
int idel = 0;
foreach (string i in DB.Item.EnumerateItemByUID(uid, ti))
{
if (!JSON.Stash.CheckItemExistsStash(user, ti, i))
{
DB.Item.DeleteItemByUIID(uid, ti, i);
idel++;
}
}
if (idel > 0) { Message.CMW($"Cleaned Item(s) Database. Deleted {idel} Item(s).", true, 2); }
idel = 0;
foreach (var i in stash.items)
{
if (!DB.Item.CheckItemExistsByUIID(i.id))
{
if (i.frameType == 2)
{
Message.CMW($"[{stashitemleft}][{i.id.Substring(0,5)}] Processing {i.name} {i.typeLine}.", true, 2);
int icid = DB.Stash.GetClassIDByBase(i.typeLine);
string itemclass = DB.Stash.GetClassByID(icid);
stringItemTxt.Add($"Item Class: {char.ToUpper(itemclass[0]) + itemclass.Substring(1)}");
stringItemTxt.Add("Rarity: Rare");
stringItemTxt.Add(i.name ?? "");
stringItemTxt.Add(i.typeLine ?? "");
stringItemTxt.Add("--------");
if (i.properties != null && i.properties.Count<Property>() > 0)
{
foreach (Property property in i.properties)
{
if (property.name == "Quality")
stringItemTxt.Add(string.Format("Quality: {0}", property.values[0][0]));
if (property.name == "Armour")
stringItemTxt.Add(string.Format("Armour: {0}", property.values[0][0]));
if (property.name == "Energy Shield")
stringItemTxt.Add(string.Format("Energy Shield: {0}", property.values[0][0]));
if (property.name == "Evasion Rating")
stringItemTxt.Add(string.Format("Evasion Rating: {0}", property.values[0][0]));
if (property.values.Count<List<object>>() == 0)
stringItemTxt.Add(property.name ?? "");
if (property.name == "Physical Damage")
stringItemTxt.Add(string.Format("Physical Damage: {0}", property.values[0][0]));
if (property.name == "Elemental Damage")
stringItemTxt.Add(string.Format("Elemental Damage: {0}", property.values[0][0]));
if (property.name == "Critical Strike Chance")
stringItemTxt.Add(string.Format("Critical Strike Chance: {0}", property.values[0][0]));
if (property.name == "Attacks per Second")
stringItemTxt.Add(string.Format("Attacks per Second: {0}", property.values[0][0]));
if (property.name == "Weapon Range")
stringItemTxt.Add(string.Format("Weapon Range: {0}", property.values[0][0]));
}
stringItemTxt.Add("--------");
}
stringItemTxt.Add("Requirements:");
if (i.requirements != null)
{
foreach (Requirement requirement in i.requirements)
{
if (requirement.name == "Level")
stringItemTxt.Add(string.Format("Level: {0}", requirement.values[0][0]));
if (requirement.name == "Str")
stringItemTxt.Add(string.Format("Str: {0}", requirement.values[0][0]));
if (requirement.name == "Dex")
stringItemTxt.Add(string.Format("Dex: {0}", requirement.values[0][0]));
if (requirement.name == "Int")
stringItemTxt.Add(string.Format("Int: {0}", requirement.values[0][0]));
}
}
stringItemTxt.Add("--------");
if (i.sockets != null)
{
List<string> stringList2 = new List<string>();
List<string> stringList3 = new List<string>();
List<string> stringList4 = new List<string>();
List<string> stringList5 = new List<string>();
List<string> stringList6 = new List<string>();
List<string> stringList7 = new List<string>();
foreach (Socket socket in i.sockets)
{
if (socket.group == 0)
stringList2.Add(socket.sColour.ToString());
if (socket.group == 1)
stringList3.Add(socket.sColour.ToString());
if (socket.group == 2)
stringList4.Add(socket.sColour.ToString());
if (socket.group == 3)
stringList5.Add(socket.sColour.ToString());
if (socket.group == 4)
stringList6.Add(socket.sColour.ToString());
if (socket.group == 5)
stringList7.Add(socket.sColour.ToString());
}
string str1 = string.Join("-", (IEnumerable<string>)stringList2);
string str2 = string.Join("-", (IEnumerable<string>)stringList3);
string str3 = string.Join("-", (IEnumerable<string>)stringList4);
string str4 = string.Join("-", (IEnumerable<string>)stringList5);
string str5 = string.Join("-", (IEnumerable<string>)stringList6);
string str6 = string.Join("-", (IEnumerable<string>)stringList7);
stringItemTxt.Add("Sockets: " + str1 + " " + str2 + " " + str3 + " " + str4 + " " + str5 + " " + str6);
}
stringItemTxt.Add("--------");
stringItemTxt.Add(string.Format("Item Level: {0}", (object)i.ilvl));
stringItemTxt.Add("--------");
if (i.implicitMods != null)
{
foreach (string implicitMod in i.implicitMods)
{
stringItemTxt.Add(implicitMod ?? "");
stringItemMod.Add(implicitMod + "/n");
}
stringItemTxt.Add("--------");
stringItemMod.Add("--------/n");
}
if (i.explicitMods != null)
{
foreach (string explicitMod in i.explicitMods)
{
stringItemTxt.Add(explicitMod ?? "");
stringItemMod.Add(explicitMod + "/n");
}
}
File.WriteAllLines("tmp/" + i.id + ".txt", (IEnumerable<string>)stringItemTxt);
File.WriteAllLines("tmp/" + i.id + ".mod.txt", (IEnumerable<string>)stringItemMod);
string ib64 = Convert.ToBase64String(File.ReadAllBytes("tmp/" + i.id + ".txt"));
if (!args.Contains("--debug")) { Web.PoEPrices.GetItemJson(i.id, ib64); }
if (File.Exists($"tmp/" + i.id + ".json"))
{
string type = "";
int tabindex = DB.User.GetUserTabIndex(user);
double min = Web.PoEPrices.GetMin(i.id);
double max = Web.PoEPrices.GetMax(i.id);
type = "c";
if (JsonConvert.DeserializeObject<PoEPricesRoot>(File.ReadAllText("tmp/" + i.id + ".json")).currency == "divine")
{
//min = min * JSON.Currency.GetCurrencyValueByName(MySqlHelper.EscapeString("Divine Orb"), "poeco_currency");
//max = max * JSON.Currency.GetCurrencyValueByName(MySqlHelper.EscapeString("Divine Orb"), "poeco_currency");
type = "d";
}
Draw.GenQuad(i.w, i.h, i.x, i.y, i.icon, Math.Round(min, 1), Math.Round(max, 1), type, user, discriminator);
DB.Stash.AddItemTable(uid, ti, i.id, i.ilvl, icid, DB.Stash.GetBaseIDByName(i.typeLine), i.name, MySqlHelper.EscapeString(File.ReadAllText("tmp/" + i.id + ".mod.txt")), i.icon, MySqlHelper.EscapeString(File.ReadAllText("tmp/" + i.id + ".txt")), ib64, min, max);
chaosValue = chaosValue + max;
stringItemTxt.Clear();
stringItemMod.Clear();
stashitemleft--;
}
}
else
{
Message.CMW($"[{i.id}] Skipping {i.name} {i.typeLine}.", true, 3);
stashitemleft--;
}
stringItemTxt.Clear();
stringItemMod.Clear();
}
else
{
stashitemleft--;
}
}
int uic = DB.Item.CountItemByUID(uid, ti);
DB.User.SetUserItemCount(uid, uic, ti);
chaosValue = chaosValue + DB.User.GetTabValueByTID(uid, ti);
DB.User.SetUserTabValue(uid, ti, chaosValue);
DB.Stash.SetTabNameByTID(uid,ti, stash.tabs[ti].n);
DB.Stash.SetTabRGBByTID(uid, ti, $"{stash.tabs[ti].colour.r}:{stash.tabs[ti].colour.g}:{stash.tabs[ti].colour.b}");
}
Message.CMW($"Processed all item(s) in the rare tab.", true, 2);
}
}
}
}
if (args.Contains("--usergen-pro"))
{
int uid = Convert.ToInt16(args[1]);
string user = DB.User.GetUserNameByID(uid)[0];
string discriminator = DB.User.GetUserNameByID(uid)[1];
int proindex = DB.User.GetUserProfitTabIndex(uid);
string token = DB.User.GetUserToken(user);
DB.User.DeleteProfits(uid);
if (!args.Contains("--debug"))
{
Web.Stash.DownloadStash(token, $"https://www.pathofexile.com/character-window/get-stash-items?league={JSON.Settings.GetLeague()}&tabs=1&tabIndex={proindex}&accountName={user}%23{discriminator}", $"data/stash/{user}.profit.{proindex}.json");
}
StashRoot stash = JsonConvert.DeserializeObject<StashRoot>(File.ReadAllText($"data/stash/{user}.profit.{proindex}.json"));
int currencyIndex = 0;
int divIndex = 0;
int essenceIndex = 0;
int fragIndex = 0;
int fossilIndex = 0;
foreach (var t in stash.tabs)
{
switch (t.type)
{
case "CurrencyStash":
if (t.n.Length == 1)
{
currencyIndex = t.i;
}
break;
case "DivinationCardStash":
divIndex = t.i;
break;
case "EssenceStash":
essenceIndex = t.i;
break;
case "FragmentStash":
fragIndex = t.i;
break;
case "DelveStash":
fossilIndex = t.i;
break;
}
}
double pvalue = 0;
int pcount = JSON.Stash.GetUserProfitCount(user, proindex);
DB.Stash.SetTabRGBByTID(uid, proindex, $"{stash.tabs[proindex].colour.r}:{stash.tabs[proindex].colour.g}:{stash.tabs[proindex].colour.b}");
DB.Stash.SetTabNameByTID(uid, proindex, stash.tabs[proindex].n);
Message.CMW($"Processing {pcount} items in Profit tab...", true, 2);
foreach (var i in stash.items)
{
if (i.frameType == 5) // Currency
{
pvalue = pvalue + (JSON.Currency.GetCurrencyValueByName(MySqlHelper.EscapeString(i.typeLine), "poeco_currency")*i.stackSize);
DB.Stash.AddProfitTable(uid, i.id, "currency", MySqlHelper.EscapeString(i.typeLine), i.stackSize, (JSON.Currency.GetCurrencyValueByName(MySqlHelper.EscapeString(i.typeLine), "poeco_currency") * i.stackSize));
}
if (i.frameType == 0) // Fragment
{
pvalue = pvalue + (JSON.Currency.GetCurrencyValueByName(MySqlHelper.EscapeString(i.typeLine), "poeco_fragment") * i.stackSize);
DB.Stash.AddProfitTable(uid, i.id, "fragment", MySqlHelper.EscapeString(i.typeLine), i.stackSize, (JSON.Currency.GetCurrencyValueByName(MySqlHelper.EscapeString(i.typeLine), "poeco_fragment") * i.stackSize));
}
if (i.frameType == 6) // Div
{
pvalue = pvalue + (JSON.Currency.GetCurrencyValueByName(MySqlHelper.EscapeString(i.typeLine), "poeco_divination") * i.stackSize);
DB.Stash.AddProfitTable(uid, i.id, "divination", MySqlHelper.EscapeString(i.typeLine), i.stackSize, (JSON.Currency.GetCurrencyValueByName(MySqlHelper.EscapeString(i.typeLine), "poeco_divination") * i.stackSize));
}
}
DB.User.SetUserItemCount(uid, pcount, proindex);
DB.User.SetUserTabValue(uid, proindex, pvalue);
}
if (args.Contains("--usergen-tab"))
{
int uid = Convert.ToInt16(args[1]);
string user = DB.User.GetUserNameByID(uid)[0];
string discriminator = DB.User.GetUserNameByID(uid)[1];
int rareindex = DB.User.GetUserTabIndex(user);
string token = DB.User.GetUserToken(user);
if (!args.Contains("--debug"))
{
Web.Stash.DownloadStash(token, $"https://www.pathofexile.com/character-window/get-stash-items?league={JSON.Settings.GetLeague()}&tabs=1&tabIndex={rareindex}&accountName={user}%23{discriminator}", $"data/stash/{user}.json");
}
StashRoot stash = JsonConvert.DeserializeObject<StashRoot>(File.ReadAllText($@"data/stash/{user}.json"));
int currencyIndex = 0;
int divIndex = 0;
int essenceIndex = 0;
int fragIndex = 0;
int fossilIndex = 0;
foreach (var t in stash.tabs)
{
switch (t.type)
{
case "CurrencyStash":
if (t.n.Length == 1)
{
currencyIndex = t.i;
}
break;
case "DivinationCardStash":
divIndex = t.i;
break;
case "EssenceStash":
essenceIndex = t.i;
break;
case "FragmentStash":
fragIndex = t.i;
break;
case "DelveStash":
fossilIndex = t.i;
break;
}
}
if (DB.User.GetUserCurrencyIndex(user, "curindex") != -1)
{
Message.CMW($"Processing Currency tab...", true, 2);
Web.Stash.DownloadStash(token, $"https://www.pathofexile.com/character-window/get-stash-items?league={JSON.Settings.GetLeague()}&tabs=1&tabIndex={currencyIndex}&accountName={user}%23{discriminator}", $"data/stash/{user}.tab.{currencyIndex}.json");
JSON.Currency.GenCurrencyTab(user, currencyIndex, "curvalue", "poeco_currency");
}
if (DB.User.GetUserCurrencyIndex(user, "divindex") != -1)
{
Message.CMW($"Processing Divination tab...", true, 2);
Web.Stash.DownloadStash(token, $"https://www.pathofexile.com/character-window/get-stash-items?league={JSON.Settings.GetLeague()}&tabs=1&tabIndex={divIndex}&accountName={user}%23{discriminator}", $"data/stash/{user}.tab.{divIndex}.json");
JSON.Currency.GenCurrencyTab(user, divIndex, "divvalue", "poeco_divination");
}
if (DB.User.GetUserCurrencyIndex(user, "essindex") != -1)
{
Message.CMW($"Processing Essence tab...", true, 2);
Web.Stash.DownloadStash(token, $"https://www.pathofexile.com/character-window/get-stash-items?league={JSON.Settings.GetLeague()}&tabs=1&tabIndex={essenceIndex}&accountName={user}%23{discriminator}", $"data/stash/{user}.tab.{essenceIndex}.json");
JSON.Currency.GenCurrencyTab(user, essenceIndex, "essvalue", "poeco_essence");
}
if (DB.User.GetUserCurrencyIndex(user, "fraindex") != -1)
{
Message.CMW($"Processing Fragment tab...", true, 2);
Web.Stash.DownloadStash(token, $"https://www.pathofexile.com/character-window/get-stash-items?league={JSON.Settings.GetLeague()}&tabs=1&tabIndex={fragIndex}&accountName={user}%23{discriminator}", $"data/stash/{user}.tab.{fragIndex}.json");
JSON.Currency.GenCurrencyTab(user, fragIndex, "fravalue", "poeco_fragment");
}
if (DB.User.GetUserCurrencyIndex(user, "fosindex") != -1)
{
Message.CMW($"Processing Fossil tab...", true, 2);
Web.Stash.DownloadStash(token, $"https://www.pathofexile.com/character-window/get-stash-items?league={JSON.Settings.GetLeague()}&tabs=1&tabIndex={fossilIndex}&accountName={user}%23{discriminator}", $"data/stash/{user}.tab.{fossilIndex}.json");
JSON.Currency.GenCurrencyTab(user, fossilIndex, "fosvalue", "poeco_fossil");
}
}
}
}
}
}