using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Xml; namespace Server.Accounting { public class Accounts { private static Dictionary m_Accounts = new Dictionary(); public static void Configure() { EventSink.WorldLoad += new WorldLoadEventHandler( Load ); EventSink.WorldSave += new WorldSaveEventHandler( Save ); } static Accounts() { } public static int Count { get { return m_Accounts.Count; } } public static ICollection GetAccounts() { #if !MONO return m_Accounts.Values; #else return new List( m_Accounts.Values ); #endif } public static IAccount GetAccount( string username ) { IAccount a; m_Accounts.TryGetValue( username, out a ); return a; } public static void Add( IAccount a ) { m_Accounts[a.Username] = a; } public static void Remove( string username ) { m_Accounts.Remove( username ); } public static void Load() { m_Accounts = new Dictionary( 32, StringComparer.OrdinalIgnoreCase ); string filePath = Path.Combine( "Saves/Accounts", "accounts.xml" ); if ( !File.Exists( filePath ) ) return; XmlDocument doc = new XmlDocument(); doc.Load( filePath ); XmlElement root = doc["accounts"]; foreach ( XmlElement account in root.GetElementsByTagName( "account" ) ) { try { Account acct = new Account( account ); } catch { Console.WriteLine( "Warning: Account instance load failed" ); } } } public static void Save( WorldSaveEventArgs e ) { if ( !Directory.Exists( "Saves/Accounts" ) ) Directory.CreateDirectory( "Saves/Accounts" ); string filePath = Path.Combine( "Saves/Accounts", "accounts.xml" ); using ( StreamWriter op = new StreamWriter( filePath ) ) { XmlTextWriter xml = new XmlTextWriter( op ); xml.Formatting = Formatting.Indented; xml.IndentChar = '\t'; xml.Indentation = 1; xml.WriteStartDocument( true ); xml.WriteStartElement( "accounts" ); xml.WriteAttributeString( "count", m_Accounts.Count.ToString() ); foreach ( Account a in GetAccounts() ) a.Save( xml ); xml.WriteEndElement(); xml.Close(); } } } }