From 3e17e42a37437c7cd54e470e74819f5b9b411eb5 Mon Sep 17 00:00:00 2001 From: Twitchy Date: Tue, 12 Jul 2011 13:31:36 +1200 Subject: [PATCH] Adds MySql Support --- TShockAPI/Commands.cs | 4 +--- TShockAPI/ConfigFile.cs | 6 ++++++ TShockAPI/DB/BanManager.cs | 9 +++++++-- TShockAPI/DB/GroupManager.cs | 29 +++++++++++++++++++++++------ TShockAPI/DB/ItemManager.cs | 8 ++++++-- TShockAPI/DB/RegionManager.cs | 10 ++++++++-- TShockAPI/DB/UserManager.cs | 15 ++++++++++++--- TShockAPI/DB/WarpsManager.cs | 9 +++++++-- TShockAPI/FileTools.cs | 8 -------- TShockAPI/TShock.cs | 18 +++++++++++++++++- TShockAPI/TShockAPI.csproj | 10 +++++++++- 11 files changed, 96 insertions(+), 30 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 36a5d4da..0f89fb2b 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1467,11 +1467,9 @@ namespace TShockAPI int givenCode = Convert.ToInt32(args.Parameters[0]); if (givenCode == TShock.AuthToken) { - TextWriter tw = new StreamWriter(FileTools.UsersPath, true); - tw.Write("\n" + args.Player.IP + " superadmin"); + TShock.Users.AddUser(args.Player.IP,"","","superadmin"); args.Player.SendMessage("SuperAdmin authenticated. Please re-connect using the same IP."); TShock.AuthToken = 0; - tw.Close(); } } diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index 4c83cc91..cb9e564d 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -72,6 +72,12 @@ namespace TShockAPI /// public string StorageType = "sqlite"; + public string MySqlHost = "localhost"; + public string MySqlDbName = ""; + public string MySqlPort = "3306"; + public string MySqlUsername = ""; + public string MySqlPassword = ""; + public static ConfigFile Read(string path) { if (!File.Exists(path)) diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs index 27b3da78..b5f6bc77 100644 --- a/TShockAPI/DB/BanManager.cs +++ b/TShockAPI/DB/BanManager.cs @@ -36,8 +36,13 @@ namespace TShockAPI.DB using (var com = database.CreateCommand()) { - com.CommandText = - "CREATE TABLE IF NOT EXISTS 'Bans' ('IP' TEXT UNIQUE , 'Name' TEXT, 'Reason' TEXT);"; + if (TShock.Config.StorageType.ToLower() == "sqlite") + com.CommandText = + "CREATE TABLE IF NOT EXISTS 'Bans' ('IP' TEXT UNIQUE , 'Name' TEXT, 'Reason' TEXT);"; + else if (TShock.Config.StorageType.ToLower() == "mysql") + com.CommandText = + "CREATE TABLE IF NOT EXISTS Bans (IP VARCHAR(255), Name VARCHAR(255), Reason VARCHAR(255));"; + com.ExecuteNonQuery(); } } diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs index 1aea341e..11847d2f 100644 --- a/TShockAPI/DB/GroupManager.cs +++ b/TShockAPI/DB/GroupManager.cs @@ -19,32 +19,49 @@ namespace TShockAPI.DB using (var com = database.CreateCommand()) { - com.CommandText = - "CREATE TABLE IF NOT EXISTS 'GroupList' ('ID' INTEGER PRIMARY KEY UNIQUE, 'GroupName' TEXT UNIQUE, 'Commands' TEXT, 'OrderBy' TEXT);"; + if (TShock.Config.StorageType.ToLower() == "sqlite") + com.CommandText = + "CREATE TABLE IF NOT EXISTS 'GroupList' ('GroupName' TEXT UNIQUE, 'Commands' TEXT, 'OrderBy' TEXT);"; + else if (TShock.Config.StorageType.ToLower() == "mysql") + com.CommandText = + "CREATE TABLE IF NOT EXISTS GroupList (GroupName VARCHAR(255) UNIQUE, Commands VARCHAR(255), OrderBy VARCHAR(255));"; + com.ExecuteNonQuery(); - com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; + if (TShock.Config.StorageType.ToLower() == "sqlite") + com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; + else if (TShock.Config.StorageType.ToLower() == "mysql") + com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;"; com.AddParameter("@groupname", "trustedadmin"); com.AddParameter("@commands", "maintenance,cfg,butcher,cheat,immunetoban,ignorecheatdetection,ignoregriefdetection,usebanneditem"); com.AddParameter("@order", "1"); com.ExecuteNonQuery(); com.Parameters.Clear(); - com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; + if (TShock.Config.StorageType.ToLower() == "sqlite") + com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; + else if (TShock.Config.StorageType.ToLower() == "mysql") + com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;"; com.AddParameter("@groupname", "admin"); com.AddParameter("@commands", "ban,unban,whitelist,causeevents,spawnboss,spawnmob,managewarp,time,tp,pvpfun,kill,logs,immunetokick,tphere"); com.AddParameter("@order", "2"); com.ExecuteNonQuery(); com.Parameters.Clear(); - com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; + if (TShock.Config.StorageType.ToLower() == "sqlite") + com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; + else if (TShock.Config.StorageType.ToLower() == "mysql") + com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;"; com.AddParameter("@groupname", "newadmin"); com.AddParameter("@commands", "kick,editspawn,reservedslot"); com.AddParameter("@order", "3"); com.ExecuteNonQuery(); com.Parameters.Clear(); - com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; + if (TShock.Config.StorageType.ToLower() == "sqlite") + com.CommandText = "INSERT OR IGNORE INTO GroupList (GroupName, Commands, OrderBy) VALUES (@groupname, @commands, @order);"; + else if (TShock.Config.StorageType.ToLower() == "mysql") + com.CommandText = "INSERT IGNORE INTO GroupList SET GroupName=@groupname, Commands=@commands, OrderBy=@order;"; com.AddParameter("@groupname", "default"); com.AddParameter("@commands", "canwater,canlava,warp,manageusers"); com.AddParameter("@order", "4"); diff --git a/TShockAPI/DB/ItemManager.cs b/TShockAPI/DB/ItemManager.cs index 58739fc0..e4ec52ee 100644 --- a/TShockAPI/DB/ItemManager.cs +++ b/TShockAPI/DB/ItemManager.cs @@ -18,8 +18,12 @@ namespace TShockAPI.DB using (var com = database.CreateCommand()) { - com.CommandText = - "CREATE TABLE IF NOT EXISTS 'ItemBans' ('ItemName' TEXT UNIQUE);"; + if (TShock.Config.StorageType.ToLower() == "sqlite") + com.CommandText = + "CREATE TABLE IF NOT EXISTS 'ItemBans' ('ItemName' TEXT UNIQUE);"; + else if (TShock.Config.StorageType.ToLower() == "mysql") + com.CommandText = + "CREATE TABLE IF NOT EXISTS ItemBans (ItemName VARCHAR(255) UNIQUE);"; com.ExecuteNonQuery(); } } diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs index 93832dd2..793624ab 100644 --- a/TShockAPI/DB/RegionManager.cs +++ b/TShockAPI/DB/RegionManager.cs @@ -28,6 +28,7 @@ using Community.CsharpSqlite.SQLiteClient; using Microsoft.Xna.Framework; using Terraria; + namespace TShockAPI.DB { public class RegionManager @@ -42,8 +43,13 @@ namespace TShockAPI.DB using (var com = database.CreateCommand()) { - com.CommandText = - "CREATE TABLE IF NOT EXISTS 'Regions' ('X1' NUMERIC, 'Y1' NUMERIC, 'X2' NUMERIC, 'Y2' NUMERIC, 'RegionName' TEXT, 'WorldID' TEXT, 'UserIds' TEXT, 'Protected' NUMERIC);"; + if (TShock.Config.StorageType.ToLower() == "sqlite") + com.CommandText = + "CREATE TABLE IF NOT EXISTS 'Regions' ('X1' NUMERIC, 'Y1' NUMERIC, 'X2' NUMERIC, 'Y2' NUMERIC, 'RegionName' TEXT, 'WorldID' TEXT, 'UserIds' TEXT, 'Protected' NUMERIC);"; + else if (TShock.Config.StorageType.ToLower() == "mysql") + com.CommandText = + "CREATE TABLE IF NOT EXISTS Regions (X1 INT(11), Y1 INT(11), X2 INT(11), Y2 INT(11), RegionName VARCHAR(255) UNIQUE, WorldID VARCHAR(255), UserIds VARCHAR(255), Protected INT(1));"; + com.ExecuteNonQuery(); } } diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs index b38808de..dfed4be7 100644 --- a/TShockAPI/DB/UserManager.cs +++ b/TShockAPI/DB/UserManager.cs @@ -36,11 +36,20 @@ namespace TShockAPI.DB using (var com = database.CreateCommand()) { - com.CommandText = - "CREATE TABLE IF NOT EXISTS 'Users' ('ID' INTEGER PRIMARY KEY UNIQUE, 'Username' TEXT UNIQUE, 'Password' TEXT, 'UserGroup' TEXT, 'IP' TEXT);"; + if (TShock.Config.StorageType.ToLower() == "sqlite") + com.CommandText = + "CREATE TABLE IF NOT EXISTS 'Users' ('ID' INTEGER PRIMARY KEY UNIQUE, 'Username' TEXT UNIQUE, 'Password' TEXT, 'UserGroup' TEXT, 'IP' TEXT);"; + else if (TShock.Config.StorageType.ToLower() == "mysql") + com.CommandText = + "CREATE TABLE IF NOT EXISTS Users (ID INTEGER PRIMARY KEY UNIQUE, Username VARCHAR(255) UNIQUE, Password VARCHAR(255), UserGroup VARCHAR(255), IP VARCHAR(255));"; + com.ExecuteNonQuery(); - com.CommandText = "INSERT OR IGNORE INTO Users (ID, UserGroup, IP) VALUES (@id, @group, @ip);"; + if (TShock.Config.StorageType.ToLower() == "sqlite") + com.CommandText = "INSERT OR IGNORE INTO Users (ID, UserGroup, IP) VALUES (@id, @group, @ip);"; + else if (TShock.Config.StorageType.ToLower() == "mysql") + com.CommandText = "INSERT IGNORE INTO Users (ID, UserGroup, IP) VALUES (@id, @group, @ip);"; + com.AddParameter("@id", 1); com.AddParameter("@ip", "127.0.0.1"); com.AddParameter("@group", "superadmin"); diff --git a/TShockAPI/DB/WarpsManager.cs b/TShockAPI/DB/WarpsManager.cs index b0d6930b..881f9a50 100644 --- a/TShockAPI/DB/WarpsManager.cs +++ b/TShockAPI/DB/WarpsManager.cs @@ -40,8 +40,13 @@ namespace TShockAPI.DB using (var com = database.CreateCommand()) { - com.CommandText = - "CREATE TABLE IF NOT EXISTS 'Warps' ('X' NUMERIC, 'Y' NUMERIC, 'WarpName' TEXT UNIQUE, 'WorldID' TEXT);"; + if (TShock.Config.StorageType.ToLower() == "sqlite") + com.CommandText = + "CREATE TABLE IF NOT EXISTS 'Warps' ('X' NUMERIC, 'Y' NUMERIC, 'WarpName' TEXT UNIQUE, 'WorldID' TEXT);"; + else if (TShock.Config.StorageType.ToLower() == "mysql") + com.CommandText = + "CREATE TABLE IF NOT EXISTS Warps (X INT(11), Y INT(11), WarpName VARCHAR(255) UNIQUE, WorldID VARCHAR(255));"; + com.ExecuteNonQuery(); } } diff --git a/TShockAPI/FileTools.cs b/TShockAPI/FileTools.cs index a1349b65..880748f4 100644 --- a/TShockAPI/FileTools.cs +++ b/TShockAPI/FileTools.cs @@ -25,11 +25,7 @@ namespace TShockAPI { public static string RulesPath { get { return Path.Combine(TShock.SavePath, "rules.txt"); } } public static string MotdPath { get { return Path.Combine(TShock.SavePath, "motd.txt"); } } - public static string BansPath { get { return Path.Combine(TShock.SavePath, "bans.txt"); } } public static string WhitelistPath { get { return Path.Combine(TShock.SavePath, "whitelist.txt"); } } - public static string GroupsPath { get { return Path.Combine(TShock.SavePath, "groups.txt"); } } - public static string UsersPath { get { return Path.Combine(TShock.SavePath, "users.txt"); } } - public static string ItemBansPath { get { return Path.Combine(TShock.SavePath, "itembans.txt"); } } public static string RememberedPosPath { get { return Path.Combine(TShock.SavePath, "oldpos.xml"); } } public static string ConfigPath { get { return Path.Combine(TShock.SavePath, "config.json"); } } @@ -58,11 +54,7 @@ namespace TShockAPI CreateIfNot(RulesPath, "Respect the admins!\nDon't use TNT!"); CreateIfNot(MotdPath, "This server is running TShock. Type /help for a list of commands.\n%255,000,000%Current map: %map%\nCurrent players: %players%"); - CreateIfNot(BansPath); CreateIfNot(WhitelistPath); - CreateIfNot(GroupsPath, Resources.groups); - CreateIfNot(UsersPath, Resources.users); - CreateIfNot(ItemBansPath, Resources.itembans); try { diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 7c50a3f8..91f70c9a 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -23,6 +23,7 @@ using System.Diagnostics; using System.IO; using System.Net; using System.Reflection; +using MySql.Data.MySqlClient; using Community.CsharpSqlite.SQLiteClient; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; @@ -107,7 +108,22 @@ namespace TShockAPI } else if (Config.StorageType.ToLower() == "mysql") { - throw new NotSupportedException("Mysql is not yet supported"); + try + { + DB = new MySqlConnection(); + DB.ConnectionString = + "Server='" + Config.MySqlHost + + "';Port='" + Config.MySqlPort + + "';Database='" + Config.MySqlDbName + + "';Uid='" + Config.MySqlUsername + + "';Pwd='" + Config.MySqlPassword + "';"; + DB.Open(); + } + catch(MySqlException ex) + { + Log.Error(ex.ToString()); + throw new Exception("MySql not setup correctly"); + } } else { diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 99a908d3..6a98b980 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -54,6 +54,14 @@ + + False + ..\..\..\TShock Testing Environment\MySql.Data.dll + + + False + ..\..\..\TShock Testing Environment\MySql.Web.dll + .\Newtonsoft.Json.dll @@ -152,7 +160,7 @@ - +