Advertisement
Guest User

Untitled

a guest
Jul 4th, 2017
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.22 KB | None | 0 0
  1. namespace Scripting
  2. {
  3.     public class AccountDatabaseMySQL : IAccountDatabase
  4.     {
  5.         class ActorInstance
  6.         {
  7.             public string Name;
  8.             public string AccountName;
  9.             public bool Banned;
  10.             public bool GM;
  11.             public int ID;
  12.         }
  13.  
  14.         // MySql Settigns, second connection required since MySql does not support multiple DataReaders opened in a single connection.
  15.         private MySqlConnection sql_con = null;
  16.         private MySqlConnection sql_con2 = null;
  17.         private string connString = "server=192.168.78.101;user=mike;database=rcprodb;port=3306;password=mike;";
  18.  
  19.  
  20.         // Use this to speed up searches!
  21.         static LinkedList<ActorInstance> SearchDB = new LinkedList<ActorInstance>();
  22.  
  23.         /// <summary>
  24.         /// Initialize account database.
  25.         /// </summary>
  26.         public void Initialize(AccountAddEventHandler addDelegate)
  27.         {
  28.             using (sql_con = new MySqlConnection(connString))
  29.             {
  30.                 sql_con.Open();
  31.                 MySqlCommand AcctCmd = new MySqlCommand("SELECT * FROM Accounts", sql_con);
  32.  
  33.                 using (sql_con2 = new MySqlConnection(connString))
  34.                 {
  35.                     sql_con2.Open();
  36.  
  37.                     using (MySqlDataReader dr = AcctCmd.ExecuteReader())
  38.                     {
  39.                         while (dr.Read())
  40.                         {
  41.                             string Username = dr.GetValue(0).ToString();
  42.                             string Password = dr.GetValue(1).ToString();
  43.                             string Email = dr.GetValue(2).ToString();
  44.                             bool GM = (bool)dr.GetValue(3);
  45.                             bool Banned = (bool)dr.GetValue(4);
  46.  
  47.                             MySqlCommand CharCmd = new MySqlCommand("SELECT * FROM Characters WHERE Username = @Username ORDER BY ID", sql_con2);
  48.                             CharCmd.Parameters.AddWithValue("@Username", Username);
  49.  
  50.                             using (MySqlDataReader CharDR = CharCmd.ExecuteReader())
  51.                             {
  52.                                 while (CharDR.Read())
  53.                                 {
  54.                                     ActorInstance AI = new ActorInstance();
  55.                                     AI.AccountName = Username;
  56.                                     AI.Banned = Banned;
  57.                                     AI.GM = GM;
  58.                                     object CharacterID = CharDR.GetValue(1);
  59.                                     AI.ID = int.Parse(CharacterID.ToString());
  60.                                     AI.Name = (string)CharDR.GetValue(2);
  61.                                     SearchDB.AddLast(AI);
  62.                                 }
  63.                             }
  64.                             addDelegate.Invoke(new AccountBase(Username, Password, Email, GM, Banned), true);
  65.                         }
  66.                     }
  67.                 }
  68.             }
  69.             sql_con2.Close();
  70.             sql_con.Close();
  71.         }
  72.  
  73.  
  74.         /// <summary>
  75.         /// Add an account to the account database
  76.         /// </summary>
  77.         public void Add(AccountBase account, AccountAddEventHandler completionDelegate)
  78.         {
  79.             // Check
  80.             if (account == null)
  81.             {
  82.                 completionDelegate.Invoke(account, false);
  83.                 return;
  84.             }
  85.  
  86.             using (sql_con = new MySqlConnection(connString))
  87.             {
  88.                 sql_con.Open();
  89.                 MySqlCommand NewAcct = new MySqlCommand("INSERT INTO Accounts (Username, Password, EMail, GM, Banned) VALUES (@Username,@Password,@EMail,@GM,@Banned)", sql_con);
  90.                 NewAcct.Parameters.AddWithValue("@Username", account.Username);
  91.                 NewAcct.Parameters.AddWithValue("@Password", account.Password);
  92.                 NewAcct.Parameters.AddWithValue("@EMail", account.Email);
  93.                 NewAcct.Parameters.AddWithValue("@GM", account.IsGM);
  94.                 NewAcct.Parameters.AddWithValue("@Banned", account.IsBanned);
  95.  
  96.                 int numEffected = NewAcct.ExecuteNonQuery();
  97.             }
  98.             completionDelegate.Invoke(account, true);
  99.             sql_con.Close();
  100.         }
  101.  
  102.         /// <summary>
  103.         /// Load an accounts actors.
  104.         /// </summary>
  105.         public void Load(AccountBase account, AccountLoadEventHandler completionDelegate)
  106.         {
  107.             // Check
  108.             if (account == null)
  109.             {
  110.                 completionDelegate.Invoke(account, null);
  111.                 return;
  112.             }
  113.  
  114.             using (sql_con = new MySqlConnection(connString))
  115.             {
  116.                 sql_con.Open();
  117.                 LoadCompleteEventArgs Args = new LoadCompleteEventArgs(account);
  118.                 MySqlCommand CharCmd = new MySqlCommand("SELECT * FROM Characters WHERE Username = @Username ORDER BY ID", sql_con);
  119.                 CharCmd.Parameters.AddWithValue("@Username", account.Username);
  120.  
  121.                 using (MySqlDataReader CharDR = CharCmd.ExecuteReader())
  122.                 {
  123.                     while (CharDR.Read())
  124.                     {
  125.                         byte[] SerializedAI = (byte[])CharDR.GetValue(3);
  126.                         byte[] SerializedScripts = (byte[])CharDR.GetValue(4);
  127.                         Args.ActorInstances.Add(new ActorInstanceData(SerializedAI, SerializedScripts));
  128.                     }
  129.                     CharDR.Close();
  130.                 }
  131.                 completionDelegate.Invoke(account, Args);
  132.             }
  133.             sql_con.Close();
  134.         }
  135.  
  136.         /// <summary>
  137.         /// Save an accounts actors.
  138.         /// </summary>
  139.         public void Save(AccountBase account, int index, ActorInstanceData data)
  140.         {
  141.             // Check
  142.             if (account == null)
  143.                 return;
  144.  
  145.             // Setup output
  146.             List<ActorInstanceData> ActorInstances = new List<ActorInstanceData>();
  147.  
  148.             byte Length = data.SerializedAI[4];
  149.  
  150.             String Name = ASCIIEncoding.ASCII.GetString(data.SerializedAI, 5, Length);
  151.  
  152.             if (data == null)
  153.             {
  154.                 MySqlCommand CharCmd = new MySqlCommand("DELETE from Characters WHERE Name = @Username AND WHERE Index = @index", sql_con);
  155.                 CharCmd.Parameters.AddWithValue("@Username", account.Username);
  156.                 CharCmd.Parameters.AddWithValue("@index", index);
  157.  
  158.  
  159.                 int numEffected = CharCmd.ExecuteNonQuery();
  160.  
  161.                 LinkedListNode<ActorInstance> AINode = SearchDB.First;
  162.                 while (AINode != null)
  163.                 {
  164.                     ActorInstance AI = AINode.Value;
  165.  
  166.                     if (AI.ID == index && AI.AccountName == account.Username)
  167.                     {
  168.                         SearchDB.Remove(AINode);
  169.                     }
  170.                 }
  171.  
  172.                 return;
  173.             }
  174.  
  175.             using (sql_con = new MySqlConnection(connString))
  176.             {
  177.                 sql_con.Open();
  178.                 bool written = false;
  179.                 MySqlCommand CharCmd = new MySqlCommand("SELECT * FROM Characters WHERE ActorName = @Name", sql_con);
  180.                 CharCmd.Parameters.AddWithValue("@Name", Name);
  181.  
  182.                 using (sql_con2 = new MySqlConnection(connString))
  183.                 {
  184.                     sql_con2.Open();
  185.                     using (MySqlDataReader CharDR = CharCmd.ExecuteReader())
  186.                     {
  187.                         while (CharDR.Read())
  188.                         {
  189.                             CharCmd = new MySqlCommand("UPDATE Characters SET Username = @Username, ID = @Index, ActorName = @Name, SerializedAI = @serializedAI, SerializedScripts = @serializedScripts WHERE ActorName = @Name", sql_con2);
  190.                             CharCmd.Parameters.AddWithValue("@UserName", account.Username);
  191.                             CharCmd.Parameters.AddWithValue("@Index", index);
  192.                             CharCmd.Parameters.AddWithValue("@Name", Name);
  193.                             CharCmd.Parameters.AddWithValue("@serializedAI", data.SerializedAI);
  194.                             CharCmd.Parameters.AddWithValue("@serializedScripts", data.SerializedScripts);
  195.  
  196.                             CharCmd.ExecuteNonQuery();
  197.                             written = true;
  198.                         }
  199.                     }
  200.  
  201.                     if (!written)
  202.                     {
  203.                         CharCmd = new MySqlCommand("Insert INTO Characters (Username, ID, ActorName, SerializedAI, SerializedScripts) VALUES(@UserName,@Index,@Name,@serializedAI,@serializedScripts)", sql_con2);
  204.                         CharCmd.Parameters.AddWithValue("@UserName", account.Username);
  205.                         CharCmd.Parameters.AddWithValue("@Index", index);
  206.                         CharCmd.Parameters.AddWithValue("@Name", Name);
  207.                         CharCmd.Parameters.AddWithValue("@serializedAI", data.SerializedAI);
  208.                         CharCmd.Parameters.AddWithValue("@serializedScripts", data.SerializedScripts);
  209.  
  210.                         int numEffected = CharCmd.ExecuteNonQuery();
  211.                     }
  212.                 }
  213.             }
  214.             sql_con2.Close();
  215.             sql_con.Close();
  216.         }
  217.  
  218.         /// <summary>
  219.         ///
  220.         /// </summary>
  221.         public void Update()
  222.         {
  223.  
  224.         }
  225.  
  226.         /// <summary>
  227.         /// Perform a search for the given actor name to see if it exists.
  228.         /// </summary>
  229.         /// <param name="request">Handle of request object.</param>
  230.         /// <param name="completionDelegate">Callback for completion of search.</param>
  231.         public void OnActorInfoRequest(ActorInfoRequest request, AccountActorInfoRequestHandler completionDelegate)
  232.         {
  233.             foreach (ActorInstance AI in SearchDB)
  234.             {
  235.                 if (AI.Name.Equals(request.ActorName, StringComparison.CurrentCultureIgnoreCase))
  236.                 {
  237.                     completionDelegate.Invoke(request, AI.Name, AI.AccountName, AI.Banned, AI.GM);
  238.                     return;
  239.                 }
  240.             }
  241.  
  242.             // Failed!
  243.             completionDelegate.Invoke(request, null, null, false, false);
  244.         }
  245.  
  246.     }
  247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement