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

477 lines
19 KiB
C#

using MySql.Data.MySqlClient;
using MySqlX.XDevAPI.Relational;
using Newtonsoft.Json;
using PoEco.Net.DB;
using PoEco.Net.Web;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Diagnostics.Metrics;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace PoEco.Net.JSON
{
internal class Stash
{
public static void GenStashHash(string user)
{
List<string> itemsID = new List<string>();
StringBuilder stashHash = new StringBuilder();
StashRoot stash = JsonConvert.DeserializeObject<StashRoot>(File.ReadAllText($@"data/stash/{user}.json"));
foreach (var i in stash.items)
{
itemsID.Add(i.id);
}
stashHash.Append(string.Join(":", itemsID));
string sb64 = Convert.ToBase64String(Encoding.ASCII.GetBytes(stashHash.ToString()));
DB.User.SetUserStashHash(user, sb64);
}
public static string GetStashHash(string user)
{
List<string> itemsID = new List<string>();
StringBuilder stashHash = new StringBuilder();
StashRoot stash = JsonConvert.DeserializeObject<StashRoot>(File.ReadAllText($@"data/stash/{user}.json"));
foreach (var i in stash.items)
{
itemsID.Add(i.id);
}
stashHash.Append(string.Join(":", itemsID));
string sb64 = Convert.ToBase64String(Encoding.ASCII.GetBytes(stashHash.ToString()));
return sb64;
}
public static int GetUserItemCount(string user, int tid)
{
StashRoot stash = JsonConvert.DeserializeObject<StashRoot>(File.ReadAllText($@"data/stash/{user}.rare.{tid}.json"));
return stash.items.Count;
}
public static int GetUserProfitCount(string user, int tid)
{
StashRoot stash = JsonConvert.DeserializeObject<StashRoot>(File.ReadAllText($@"data/stash/{user}.profit.{tid}.json"));
return stash.items.Count;
}
public static void UpdateUserTabRGB(string user, int tabindex)
{
StashRoot stash = JsonConvert.DeserializeObject<StashRoot>(File.ReadAllText($@"data/stash/{user}.json"));
MySqlConnection con = DB.Stash.MxPoEDB();
string cmdText = $"UPDATE poeco_user SET tabrgb = '{stash.tabs[tabindex].colour.r}:{stash.tabs[tabindex].colour.g}:{stash.tabs[tabindex].colour.b}' WHERE account = '{user}'";
MySqlCommand cmd = new MySqlCommand(cmdText, con);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
public static void UpdateUserTabName(string user, int tabindex)
{
StashRoot stash = JsonConvert.DeserializeObject<StashRoot>(File.ReadAllText($"data/stash/{user}.tab{tabindex}.json"));
MySqlConnection con = DB.Stash.MxPoEDB();
string cmdText = $"UPDATE poeco_user SET tabname = '{stash.tabs[tabindex].n}' WHERE account = '{user}'";
MySqlCommand cmd = new MySqlCommand(cmdText, con);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
public static void CleanDB(string user, int userid)
{
MySqlConnection con = DB.Stash.MxPoEDB();
string cmdText = $"SELECT * FROM poeco_items WHERE uid = '{userid}'";
MySqlCommand cmd = new MySqlCommand(cmdText, con);
con.Open();
MySqlDataReader mdata = cmd.ExecuteReader();
while (mdata.Read())
{
//if (!CheckItemExistsStash(user, mdata.GetString(6)))
//{
// DB.Stash.DeleteSpecificItem(userid, mdata.GetString(6));
//}
}
}
public static bool CheckItemExistsStash(string user, int tid, string uuid)
{
bool exists = false;
List<string> items = new List<string>();
StashRoot stash = JsonConvert.DeserializeObject<StashRoot>(File.ReadAllText($"data/stash/{user}.rare.{tid}.json"));
foreach (var s in stash.items)
{
items.Add(s.id);
}
if (items.Contains(uuid))
{
exists = true;
}
return exists;
}
public static void GenItemTable(string user)
{
List<string> stringItemTxt = new List<string>();
List<string> stringItemMod = new List<string>();
StashRoot stash = JsonConvert.DeserializeObject<StashRoot>(File.ReadAllText($@"data/stash/{user}.json"));
int curitem = 1;
double chaosValue = 0;
int guid = 0;
//DB.Stash.DeleteItems(DB.User.GetUserID(user));
var tmpfiles = Directory.GetFiles("tmp");
StringBuilder sCommand = new StringBuilder("INSERT INTO poeco_items(uid, tabindex, tabname, tabrgb, cid, bid, uiid, imod, var, img, txt, b64, ctype, min, max) VALUES ");
List<string> Rows = new List<string>();
int itemcount = stash.items.Count();
foreach ( var file in tmpfiles ) { File.Delete(file); }
foreach (Item obj in stash.items)
{
if (!DB.Stash.CheckItemExistsDB(obj.id))
{
itemcount--;
}
if (obj.typeLine != "" && obj.frameType == 2 && obj.identified && !DB.Stash.CheckItemExistsDB(obj.id))
{
//Message.drawProgress(curitem, itemcount);
int icid = DB.Stash.GetClassIDByBase(obj.typeLine);
string itemclass = DB.Stash.GetClassByID(icid);
stringItemTxt.Add($"Item Class: {char.ToUpper(itemclass[0]) + itemclass.Substring(1)}");
stringItemTxt.Add("Rarity: Rare");
stringItemTxt.Add(obj.name ?? "");
stringItemTxt.Add(obj.typeLine ?? "");
stringItemTxt.Add("--------");
if (obj.properties != null && obj.properties.Count<Property>() > 0)
{
foreach (Property property in obj.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 (obj.requirements != null)
{
foreach (Requirement requirement in obj.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 (obj.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 obj.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)obj.ilvl));
stringItemTxt.Add("--------");
if (obj.implicitMods != null)
{
foreach (string implicitMod in obj.implicitMods)
{
stringItemTxt.Add(implicitMod ?? "");
stringItemMod.Add(implicitMod + "/n");
}
stringItemTxt.Add("--------");
stringItemMod.Add("--------/n");
}
if (obj.explicitMods != null)
{
foreach (string explicitMod in obj.explicitMods)
{
stringItemTxt.Add(explicitMod ?? "");
stringItemMod.Add(explicitMod + "/n");
}
}
File.WriteAllLines("tmp/" + obj.id + ".txt", (IEnumerable<string>)stringItemTxt);
File.WriteAllLines("tmp/" + obj.id + ".mod.txt", (IEnumerable<string>)stringItemMod);
string ib64 = Convert.ToBase64String(File.ReadAllBytes("tmp/" + obj.id + ".txt"));
Web.PoEPrices.GetItemJson(obj.id, ib64);
int tabindex = DB.User.GetUserTabIndex(user);
Rows.Add(
$"(" +
$"'{DB.User.GetUserID(user)}'," +
$"'{stash.tabs[tabindex].i}'," +
$"'{stash.tabs[tabindex].n}'," +
$"'{stash.tabs[tabindex].colour.r}:{stash.tabs[tabindex].colour.g}:{stash.tabs[tabindex].colour.b}'," +
$"'{icid}'," +
$"'{DB.Stash.GetBaseIDByName(obj.typeLine)}'," +
$"'{obj.id}'," +
$"'{MySql.Data.MySqlClient.MySqlHelper.EscapeString(File.ReadAllText("tmp/" + obj.id + ".mod.txt"))}'," +
$"'{DB.Stash.GetClassByID(icid)}:{MySql.Data.MySqlClient.MySqlHelper.EscapeString(obj.typeLine)}:{MySql.Data.MySqlClient.MySqlHelper.EscapeString(obj.name)}:{obj.ilvl}'," +
$"'{obj.icon}'," +
$"'{MySql.Data.MySqlClient.MySqlHelper.EscapeString(File.ReadAllText("tmp/" + obj.id + ".txt"))}'," +
$"'{ib64}'," +
$"'{Web.PoEPrices.GetCurType(obj.id)}'," +
$"'{Web.PoEPrices.GetMin(obj.id)}'," +
$"'{Web.PoEPrices.GetMax(obj.id)}'" +
$")");
stringItemTxt.Clear();
stringItemMod.Clear();
curitem++;
Utilities.Message.CMW(chaosValue.ToString(),true,1);
}
}
sCommand.Append(string.Join(",", Rows));
//Message.CMW(sCommand.ToString(),true,3);
sCommand.Append(";");
if (sCommand.ToString() != "INSERT INTO poeco_items(uid, tabindex, tabname, tabrgb, cid, bid, uiid, imod, var, img, txt, b64, ctype, min, max) VALUES ;")
{
//DB.Stash.AddItemTable(sCommand.ToString());
}
}
public class Colour
{
public int r { get; set; }
public int g { get; set; }
public int b { get; set; }
}
public class Tab
{
public string n { get; set; }
public int i { get; set; }
public string id { get; set; }
public string type { get; set; }
public bool selected { get; set; }
public Colour colour { get; set; }
public string srcL { get; set; }
public string srcC { get; set; }
public string srcR { get; set; }
}
public class Socket
{
public int group { get; set; }
public string attr { get; set; }
public string sColour { get; set; }
}
public class Property
{
public string name { get; set; }
public List<List<object>> values { get; set; }
public int displayMode { get; set; }
public int? type { get; set; }
}
public class Requirement
{
public string name { get; set; }
public List<List<object>> values { get; set; }
public int displayMode { get; set; }
public string suffix { get; set; }
}
public class AdditionalProperty
{
public string name { get; set; }
public List<List<object>> values { get; set; }
public int displayMode { get; set; }
public double progress { get; set; }
public int type { get; set; }
}
public class NextLevelRequirement
{
public string name { get; set; }
public List<List<object>> values { get; set; }
public int displayMode { get; set; }
}
public class SocketedItem
{
public bool verified { get; set; }
public int w { get; set; }
public int h { get; set; }
public string icon { get; set; }
public bool support { get; set; }
public string id { get; set; }
public string name { get; set; }
public string typeLine { get; set; }
public bool identified { get; set; }
public int ilvl { get; set; }
public List<Property> properties { get; set; }
public List<Requirement> requirements { get; set; }
public List<AdditionalProperty> additionalProperties { get; set; }
public List<NextLevelRequirement> nextLevelRequirements { get; set; }
public string secDescrText { get; set; }
public List<string> explicitMods { get; set; }
public string descrText { get; set; }
public int frameType { get; set; }
public int socket { get; set; }
public string colour { get; set; }
}
public class Item
{
public bool verified { get; set; }
public int w { get; set; }
public int h { get; set; }
public string icon { get; set; }
public int stackSize { get; set; }
public int maxStackSize { get; set; }
public string league { get; set; }
public string id { get; set; }
public List<Socket> sockets { get; set; }
public string name { get; set; }
public string typeLine { get; set; }
public bool identified { get; set; }
public int ilvl { get; set; }
public bool corrupted { get; set; }
public int frameType { get; set; }
public int x { get; set; }
public int y { get; set; }
public string inventoryId { get; set; }
public List<SocketedItem> socketedItems { get; set; }
public List<Property> properties { get; set; }
public List<Requirement> requirements { get; set; }
public List<string> implicitMods { get; set; }
public List<string> explicitMods { get; set; }
public List<string> craftedMods { get; set; }
public bool? support { get; set; }
public List<AdditionalProperty> additionalProperties { get; set; }
public string secDescrText { get; set; }
public string descrText { get; set; }
public List<string> flavourText { get; set; }
public bool? fractured { get; set; }
public List<string> fracturedMods { get; set; }
public List<string> enchantMods { get; set; }
public int? talismanTier { get; set; }
}
public class StashRoot
{
public int numTabs { get; set; }
public List<Tab> tabs { get; set; }
public bool quadLayout { get; set; }
public List<Item> items { get; set; }
}
}
}