public static uiTables.ShipEquipDataTable GetTable(Character curCharacter, LogDispatcher.LogDispatcher log) { var eqList = new uiTables.ShipEquipDataTable(); var shipHP = Universe.Gis.Ships.FindByHash(curCharacter.ShipArch); if (shipHP != null) { foreach (var hp in shipHP.GetHardpointsRows()) { eqList.AddShipEquipRow(hp.Name, hp.EquipType, "", hp.HPType); } } foreach (var equip in curCharacter.EquipmentList) { var eq = Universe.Gis.Equipment.FindByHash(equip.Item1); string eqNick; var eqType = ""; if (eq == null) { eqNick = equip.Item1.ToString(CultureInfo.InvariantCulture); if (!Universe.IsAttached) { log.NewMessage(LogType.Warning, "Equip {0} not found while reading character {1}!", equip.Item1, curCharacter.Name); } } else { eqNick = eq.Nickname; eqType = eq.Type; } //ID,HP,health //internal HP if (equip.Item2 == "") { eqList.AddShipEquipRow("", eqType, eqNick, ""); continue; } var firstOrDefault = eqList.FirstOrDefault(w => w.HPName == equip.Item2); if (firstOrDefault != null) { firstOrDefault[2] = eqNick; } else { eqList.AddShipEquipRow(equip.Item2, eqType, eqNick, ""); } } return(eqList); }
/// <summary> /// Cleans DB queue, closes the connection and attempts to initiate new database @ specified location. /// </summary> /// <param name="path1"></param> /// <param name="path2"></param> /// <param name="log"></param> public static void ReloadDB(string path1, string path2, LogDispatcher.LogDispatcher log) { //var path = _accDB.AccPath; if (IsDBAvailable()) { AccDB.CloseDB(); } InitiateDB(0, path1, path2, log); }
public static uiTables.ShipEquipDataTable GetTable(Character curCharacter,LogDispatcher.LogDispatcher log) { var eqList = new uiTables.ShipEquipDataTable(); var shipHP = Universe.Gis.Ships.FindByHash(curCharacter.ShipArch); if (shipHP != null) foreach (var hp in shipHP.GetHardpointsRows()) { eqList.AddShipEquipRow(hp.Name, hp.EquipType, "",hp.HPType); } foreach (var equip in curCharacter.EquipmentList) { var eq = Universe.Gis.Equipment.FindByHash(equip.Item1); string eqNick; var eqType = ""; if (eq == null) { eqNick = equip.Item1.ToString(CultureInfo.InvariantCulture); if (!Universe.IsAttached) log.NewMessage(LogType.Warning, "Equip {0} not found while reading character {1}!", equip.Item1, curCharacter.Name); } else { eqNick = eq.Nickname; eqType = eq.Type; } //ID,HP,health //internal HP if (equip.Item2 == "") { eqList.AddShipEquipRow("", eqType, eqNick, ""); continue; } var firstOrDefault = eqList.FirstOrDefault(w => w.HPName == equip.Item2); if (firstOrDefault != null) firstOrDefault[2] = eqNick; else { eqList.AddShipEquipRow(equip.Item2, eqType, eqNick, ""); } } return eqList; }
//TODO: select between FOS and NoSQL public static void InitiateDB(decimal dbType, string path1, string path2, LogDispatcher.LogDispatcher log) { _log = log; if (path1 == "" || path2 == "") { return; } if (AccDB != null) { AccDB.Scan.ProgressChanged -= _accDB_ProgressChanged; AccDB.StateChanged -= _accDB_StateChanged; AccDB.CloseDB(); } AccDB = new NoSQLDB(path1, path2, log); AccDB.Scan.ProgressChanged += _accDB_ProgressChanged; AccDB.StateChanged += _accDB_StateChanged; AccDB.Retriever.GetFinish += AccDB_OnGetFinish; AccDB.Queue.Committed += Queue_Committed; AccDB.Queue.SetThreshold((int)Properties.Settings.Default.TuneQThreshold); AccDB.Queue.SetTimeout((int)Properties.Settings.Default.TuneQTimer); AccDB.Scan.AccountScanned += Scan_AccountScanned; _path1 = path1; if (!IsDBAvailable()) { //Database not found/set up var set = new Settings(log); set.ShowDialog(); return; } if (DBCountRows("Accounts") != 0) { return; } if (MessageBox.Show( @"DB is not initialized. Initialize and scan now?", @"Database is empty", MessageBoxButtons.YesNo) != DialogResult.Yes) { return; } //Database is empty RescanDB(Properties.Settings.Default.DBAggressiveScan); }
//TODO: select between FOS and NoSQL public static void InitiateDB(decimal dbType, string path1, string path2,LogDispatcher.LogDispatcher log) { _log = log; if (path1 == "" || path2 == "") return; if (AccDB != null) { AccDB.Scan.ProgressChanged -= _accDB_ProgressChanged; AccDB.StateChanged -= _accDB_StateChanged; AccDB.CloseDB(); } AccDB = new NoSQLDB(path1, path2,log); AccDB.Scan.ProgressChanged += _accDB_ProgressChanged; AccDB.StateChanged += _accDB_StateChanged; AccDB.Retriever.GetFinish += AccDB_OnGetFinish; AccDB.Queue.Committed += Queue_Committed; AccDB.Queue.SetThreshold((int)Properties.Settings.Default.TuneQThreshold); AccDB.Queue.SetTimeout((int)Properties.Settings.Default.TuneQTimer); AccDB.Scan.AccountScanned += Scan_AccountScanned; _path1 = path1; if (!IsDBAvailable()) { //Database not found/set up var set = new Settings(log); set.ShowDialog(); return; } if (DBCountRows("Accounts") != 0) return; if (MessageBox.Show( @"DB is not initialized. Initialize and scan now?", @"Database is empty", MessageBoxButtons.YesNo) != DialogResult.Yes) return; //Database is empty RescanDB(Properties.Settings.Default.DBAggressiveScan); }
/// <summary> /// Initiates the Universe DB. FLPath is the path to the Freelancer directory, not DATA\EXE etc. /// </summary> /// <param name="flPath"></param> /// <param name="log"></param> /// <param name="forceScan"></param> public static bool Parse(string flPath, LogDispatcher.LogDispatcher log, bool forceScan = false) { IsAttached = false; _log = log; Gis.Clear(); if (flPath == "") { _log.NewMessage(LogType.Error, "Universe: Got empty FLPath!"); if (DoneLoading != null) DoneLoading(null, null); return false; } if (StartedLoading != null) StartedLoading(null, null); _log.NewMessage(LogType.Debug, "Universe: Parsing file {0} ...", flPath + @"\DataMaps.ini"); if (!File.Exists(flPath + @"\DataMaps.ini")) { log.NewMessage(LogType.Error, "Universe: Can't find DataMaps.ini!"); if (DoneLoading != null) DoneLoading(null, null); return false; } var dMapIni = new DataFile(flPath + @"\DataMaps.ini"); HpMap.Clear(); foreach (var set in dMapIni.GetSettings("HPMap", "map")) { EquipTypes eqType; if (!Enum.TryParse(set[1], out eqType)) { log.NewMessage(LogType.Error, "Can't parse equipment type in DataMaps.ini: {0} {1}", set[0], set[1]); continue; } HpMap.Add(set[0], eqType); } log.NewMessage(LogType.Debug, "Parsing file {0} ...", flPath + @"\EXE\Freelancer.ini"); if (!File.Exists(flPath + @"\EXE\Freelancer.ini")) { log.NewMessage(LogType.Error, "Universe: Can't find Freelancer.ini!"); if (DoneLoading != null) DoneLoading(null, null); return false; } var flIni = new DataFile(flPath + @"\EXE\Freelancer.ini"); _flDataPath = Path.GetFullPath(Path.Combine(flPath + @"\EXE", flIni.GetSetting("Freelancer", "data path")[0])); // Load the infocard map var ini = new DataFile(_flDataPath + @"\interface\infocardmap.ini"); foreach (var set in ini.Sections.SelectMany(section => section.Settings)) { uint map0, map1; if (!uint.TryParse(set[0], out map0) || !uint.TryParse(set[1], out map1)) { log.NewMessage(LogType.Error, "Can't parse infocard map: {0}", set.String()); continue; } //throw new Exception("Can't parse infocard map: " + set.String()); InfocardMap[map0] = map1; } if (Properties.Settings.Default.FLDataUseCache & !forceScan) { if (File.Exists(flPath + @"/FLSAM_Data.xml")) { _log.NewMessage(LogType.Info, "Universe: Loading game cache..."); Gis.ReadXml(flPath + @"/FLSAM_Data.xml"); IsAttached = true; if (DoneLoading != null) DoneLoading(null, null); _log.NewMessage(LogType.Info, "Universe: Game cache loaded."); return true; } } var bgw = new BackgroundWorker(); bgw.DoWork += _bgw_DoWork; bgw.RunWorkerCompleted += _bgw_RunWorkerCompleted; bgw.RunWorkerAsync(new object[] { flIni,flPath}); return true; }
public static void ReloadDB(LogDispatcher.LogDispatcher log) { ReloadDB(Properties.Settings.Default.DBPath,Properties.Settings.Default.FLDBPath,log); }
/// <summary> /// Cleans DB queue, closes the connection and attempts to initiate new database @ specified location. /// </summary> /// <param name="path1"></param> /// <param name="path2"></param> /// <param name="log"></param> public static void ReloadDB(string path1,string path2,LogDispatcher.LogDispatcher log) { //var path = _accDB.AccPath; if (IsDBAvailable()) AccDB.CloseDB(); InitiateDB(0,path1,path2,log); }
/// <summary> /// Connects Hook's transport. /// </summary> /// <param name="addr"></param> /// <param name="port"></param> /// <param name="password"></param> /// <param name="log"></param> public static void InitiateHook(string addr, int port, string password,LogDispatcher.LogDispatcher log) { HookTransport = new Transport(log); HookTransport.OpenSocket(addr, port, password); }
/// <summary> /// Initiates the Universe DB. FLPath is the path to the Freelancer directory, not DATA\EXE etc. /// </summary> /// <param name="flPath"></param> /// <param name="log"></param> /// <param name="forceScan"></param> public static bool Parse(string flPath, LogDispatcher.LogDispatcher log, bool forceScan = false) { IsAttached = false; _log = log; Gis.Clear(); if (flPath == "") { _log.NewMessage(LogType.Error, "Universe: Got empty FLPath!"); if (DoneLoading != null) { DoneLoading(null, null); } return(false); } if (StartedLoading != null) { StartedLoading(null, null); } _log.NewMessage(LogType.Debug, "Universe: Parsing file {0} ...", flPath + @"\DataMaps.ini"); if (!File.Exists(flPath + @"\DataMaps.ini")) { log.NewMessage(LogType.Error, "Universe: Can't find DataMaps.ini!"); if (DoneLoading != null) { DoneLoading(null, null); } return(false); } var dMapIni = new DataFile(flPath + @"\DataMaps.ini"); HpMap.Clear(); foreach (var set in dMapIni.GetSettings("HPMap", "map")) { EquipTypes eqType; if (!Enum.TryParse(set[1], out eqType)) { log.NewMessage(LogType.Error, "Can't parse equipment type in DataMaps.ini: {0} {1}", set[0], set[1]); continue; } HpMap.Add(set[0], eqType); } log.NewMessage(LogType.Debug, "Parsing file {0} ...", flPath + @"\EXE\Freelancer.ini"); if (!File.Exists(flPath + @"\EXE\Freelancer.ini")) { log.NewMessage(LogType.Error, "Universe: Can't find Freelancer.ini!"); if (DoneLoading != null) { DoneLoading(null, null); } return(false); } var flIni = new DataFile(flPath + @"\EXE\Freelancer.ini"); _flDataPath = Path.GetFullPath(Path.Combine(flPath + @"\EXE", flIni.GetSetting("Freelancer", "data path")[0])); // Load the infocard map var ini = new DataFile(_flDataPath + @"\interface\infocardmap.ini"); foreach (var set in ini.Sections.SelectMany(section => section.Settings)) { uint map0, map1; if (!uint.TryParse(set[0], out map0) || !uint.TryParse(set[1], out map1)) { log.NewMessage(LogType.Error, "Can't parse infocard map: {0}", set.String()); continue; } //throw new Exception("Can't parse infocard map: " + set.String()); InfocardMap[map0] = map1; } if (Properties.Settings.Default.FLDataUseCache & !forceScan) { if (File.Exists(flPath + @"/FLSAM_Data.xml")) { _log.NewMessage(LogType.Info, "Universe: Loading game cache..."); Gis.ReadXml(flPath + @"/FLSAM_Data.xml"); IsAttached = true; if (DoneLoading != null) { DoneLoading(null, null); } _log.NewMessage(LogType.Info, "Universe: Game cache loaded."); return(true); } } var bgw = new BackgroundWorker(); bgw.DoWork += _bgw_DoWork; bgw.RunWorkerCompleted += _bgw_RunWorkerCompleted; bgw.RunWorkerAsync(new object[] { flIni, flPath }); return(true); }
public Transport(LogDispatcher.LogDispatcher log) { _log = log; }
/// <summary> /// Connects Hook's transport. /// </summary> /// <param name="addr"></param> /// <param name="port"></param> /// <param name="password"></param> /// <param name="log"></param> public static void InitiateHook(string addr, int port, string password, LogDispatcher.LogDispatcher log) { HookTransport = new Transport(log); HookTransport.OpenSocket(addr, port, password); }
public static void ReloadDB(LogDispatcher.LogDispatcher log) { ReloadDB(Properties.Settings.Default.DBPath, Properties.Settings.Default.FLDBPath, log); }
/// <summary> /// Initiate the legacy NoSQL Freelancer storage. /// </summary> /// <param name="dbPath">Path to the SQLite database file. DB will be created if file is nonexistent.</param> /// <param name="accPath">Path to accounts' directory.</param> /// <param name="log"></param> public NoSQLDB(string dbPath, string accPath, LogDispatcher.LogDispatcher log) { //One-shot event assignment; NoSQLDB-Retriever Logger.LogDisp = log; //Retriever = new MetaRetriever(this); AccPath = accPath; if (!File.Exists(dbPath)) { SQLiteConnection.CreateFile(dbPath); _conn = new SQLiteConnection(); var conString = new SQLiteConnectionStringBuilder { DataSource = dbPath }; _conn.ConnectionString = conString.ToString(); try { _conn.Open(); } catch (Exception e) { Logger.LogDisp.NewMessage(LogType.Fatal, "NoSQLDB: Can't connect to new player DB. Reason: " + e.Message); throw; } // Create data base structure var createDataBase = _conn.CreateCommand(); // Useful method createDataBase.CommandText = CreateDBString.Replace("@Table", "Accounts"); createDataBase.ExecuteNonQuery(); createDataBase.CommandText = CreateDBString.Replace("@Table", "DelAccounts"); createDataBase.ExecuteNonQuery(); createDataBase.CommandText = @"CREATE TABLE LoginIP( AccID TEXT NOT NULL, IP TEXT NOT NULL, LogTime DATETIME NOT NULL, PRIMARY KEY (AccID, IP) ON CONFLICT REPLACE );"; createDataBase.ExecuteNonQuery(); createDataBase.CommandText = @"CREATE TABLE LoginID( AccID TEXT NOT NULL, ID1 TEXT NOT NULL, ID2 TEXT NOT NULL );"; createDataBase.ExecuteNonQuery(); createDataBase.CommandText = @"CREATE TABLE Bans( AccID TEXT NOT NULL PRIMARY KEY ON CONFLICT REPLACE, Reason TEXT NOT NULL, DateStarting DATETIME NOT NULL, DateFinishing DATETIME NOT NULL );"; createDataBase.ExecuteNonQuery(); createDataBase.CommandText = "CREATE INDEX AccLookup ON LoginIP(AccID ASC);"; createDataBase.ExecuteNonQuery(); createDataBase.CommandText = "CREATE INDEX CharLookup ON Accounts(CharName ASC);"; createDataBase.ExecuteNonQuery(); _conn.Close(); Logger.LogDisp.NewMessage(LogType.Warning, "Created new player DB."); } // Base created fo sho _conn = new SQLiteConnection(); var cs = new SQLiteConnectionStringBuilder {DataSource = dbPath}; _conn.ConnectionString = cs.ToString(); _conn.Open(); Logger.LogDisp.NewMessage(LogType.Info, "NoSQLDB: Connected."); Queue = new DBQueue(_conn, "NoSQLDB.Main"); LoginDB = new LoginDatabase( _conn, Queue); Bans = new BanDB(this); //TODO: might need to use non-hardcoded paths BansID = new IniBan(accPath + @"\loginidbans.ini"); BansIP = new IniBan(accPath + @"\ipbans.ini"); Scan = new Scanner(_conn,this); Retriever = new DBCrawler(_conn); Scan.StateChanged += Scan_StateChanged; if (StateChanged != null) StateChanged(DBStates.Ready); }
/// <summary> /// Returns a Player object associated with the charfile. /// </summary> /// <param name="path"></param> /// <param name="log"></param> /// <returns></returns> public static Character GetAccount(string path,LogDispatcher.LogDispatcher log) { if (!File.Exists(path)) return null; var flFile = new DataFile(path); var player = new Character { Created = System.IO.File.GetCreationTime(path) }; foreach (var set in flFile.GetFirstOf("Player").Settings) { switch (set.Name) { case "money": player.Money = uint.Parse(set[0]); break; case "name": var name = ""; while (set[0].Length > 0) { name += (char)Convert.ToUInt16(set[0].Substring(0, 4), 16); set[0] = set[0].Remove(0, 4); } player.Name = name; break; case "rank": player.Rank = byte.Parse(set[0]); break; case "house": player.Reputation.Add( new ReputationItem(set[1], float.Parse(set[0], Nfi)) ); break; case "description": break; case "tstamp": long high = uint.Parse(set[0]); long low = uint.Parse(set[1]); player.LastOnline = DateTime.FromFileTimeUtc(high << 32 | low); break; case "rep_group": player.ReputationIFF = set[0]; break; case "system": player.System = set[0]; break; case "base": player.Base = set[0]; break; case "ship_archetype": uint res; if (uint.TryParse(set[0], out res)) { player.ShipArch = res; break; } if (Logger.LogDisp != null) Logger.LogDisp.NewMessage(LogType.Warning, "Garbage shiparch: " + set[0] + " for " + flFile.Path); return null; case "base_hull_status": player.Health = float.Parse(set[0], Nfi); break; case "equip": player.EquipmentList.Add( new Tuple<uint, string, float>( uint.Parse(set[0]), set[1], float.Parse(set[2], Nfi) ) ); break; case "cargo": if (set[1].StartsWith("-")) log.NewMessage(LogType.Error,"Player {0} bad setting: {1}",player.Name,set.String()); else player.Cargo.Add(new WTuple<uint, uint>(uint.Parse(set[0]), uint.Parse(set[1]))); break; case "last_base": player.LastBase = set[0]; break; //TODO: voice, com_body etc case "pos": player.Position = new[] { float.Parse(set[0],Nfi), float.Parse(set[1],Nfi), float.Parse(set[2],Nfi) }; break; case "rotate": player.Rotation = new[] { float.Parse(set[0],Nfi), float.Parse(set[1],Nfi), float.Parse(set[2],Nfi) }; break; case "visit": player.Visits.Add(uint.Parse(set[0]),byte.Parse(set[1])); break; } } foreach (var set in flFile.GetFirstOf("mPlayer").Settings) { switch (set.Name) { case "sys_visited": player.VisitedSystems.Add(uint.Parse(set[0])); break; case "base_visited": player.VisitedBases.Add(uint.Parse(set[0])); break; case "total_time_played": player.OnlineTime = Convert.ToUInt32(float.Parse(set[0], Nfi)); break; } } player.AccountID = path.Substring(path.Length - 26, 11); player.CharID = path.Substring(path.Length - 14, 11); player.CharPath = path.Substring(path.Length - 26, 23); return player; }