diff --git a/TShockAPI/BackupManager.cs b/TShockAPI/BackupManager.cs index a6a1cf13..3d776ce2 100644 --- a/TShockAPI/BackupManager.cs +++ b/TShockAPI/BackupManager.cs @@ -74,12 +74,17 @@ namespace TShockAPI while (SaveWorld.ThreadState == ThreadState.Running) Thread.Sleep(50); + Console.WriteLine("World backed up"); + Console.ForegroundColor = ConsoleColor.Gray; + Log.Info(string.Format("World backed up ({0})", Main.worldPathName)); Main.worldPathName = worldname; } catch (Exception ex) { + Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Backup failed"); + Console.ForegroundColor = ConsoleColor.Gray; Log.Error("Backup failed"); Log.Error(ex.ToString()); } diff --git a/TShockAPI/BanManager.cs b/TShockAPI/BanManager.cs deleted file mode 100644 index 649387c7..00000000 --- a/TShockAPI/BanManager.cs +++ /dev/null @@ -1,158 +0,0 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace TShockAPI -{ - public class BanManager - { - private DateTime LastLoad; - private string Path; - - /// - /// IP - Name - Reason - /// - private List Bans = new List(); - - public BanManager(string path) - { - Path = path; - } - - public Ban GetBanByIp(string ip) - { - EnsureChanges(); - foreach (var ban in Bans) - { - if (ban.IP.Equals(ip)) - return ban; - } - return null; - } - - public Ban GetBanByName(string name, bool casesensitive = true) - { - EnsureChanges(); - foreach (var ban in Bans) - { - if (ban.Name.Equals(name, - casesensitive - ? StringComparison.Ordinal - : StringComparison.InvariantCultureIgnoreCase)) - return ban; - } - return null; - } - - public void AddBan(string ip, string name = "", string reason = "") - { - if (GetBanByIp(ip) != null) - return; - Bans.Add(new Ban(ip, name, reason)); - SaveBans(); - } - - public void RemoveBan(Ban ban) - { - Bans.Remove(ban); - SaveBans(); - } - - /// - /// Reloads the file if it was changed - /// - public void EnsureChanges() - { - if (File.Exists(Path)) - { - if (new FileInfo(Path).LastWriteTime > LastLoad) - LoadBans(); - } - else - { - Bans.Clear(); - } - } - - /// - /// Removes | from the string - /// - /// - /// - public string MakeSafe(string str) - { - return str.Replace("|", " "); - } - - public void LoadBans() - { - Bans.Clear(); - - if (!File.Exists(Path)) - return; - - LastLoad = new FileInfo(Path).LastWriteTime; - - foreach (var line in File.ReadAllLines(Path)) - { - var bansp = line.Split('|'); - if (bansp.Length != 3) - continue; - Bans.Add(new Ban(bansp[0], bansp[1], bansp[2])); - } - } - - public void SaveBans() - { - var output = new StringBuilder(); - foreach (var ban in Bans) - { - output.AppendFormat("{0}|{1}|{2}\r\n", MakeSafe(ban.IP), MakeSafe(ban.Name), MakeSafe(ban.Reason)); - } - - File.WriteAllText(Path, output.ToString()); - } - } - - public class Ban - { - public string IP { get; set; } - - public string Name { get; set; } - - public string Reason { get; set; } - - public Ban(string ip, string name, string reason) - { - IP = ip; - Name = name; - Reason = reason; - } - - public Ban() - { - IP = string.Empty; - Name = string.Empty; - Reason = string.Empty; - } - } -} \ No newline at end of file diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 79c57482..fcad710b 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -33,6 +33,7 @@ using System.Net; using System.Threading; using Microsoft.Xna.Framework; using Terraria; +using TShockAPI.DB; namespace TShockAPI { @@ -121,6 +122,7 @@ namespace TShockAPI ChatCommands.Add(new Command("ban", BanIP, "banip")); ChatCommands.Add(new Command("unban", UnBan, "unban")); ChatCommands.Add(new Command("unban", UnBanIP, "unbanip")); + ChatCommands.Add(new Command("maintenance", ClearBans, "clearbans")); ChatCommands.Add(new Command("whitelist", Whitelist, "whitelist")); ChatCommands.Add(new Command("maintenance", Off, "off")); ChatCommands.Add(new Command("maintenance", OffNoSave, "off-nosave")); @@ -309,10 +311,11 @@ namespace TShockAPI } string encrPass = Tools.HashPassword(args.Parameters[1]); - string[] exr = Tools.FetchHashedPasswordAndGroup(args.Parameters[0]); + string[] exr = TShock.Users.FetchHashedPasswordAndGroup(args.Parameters[0]); if (exr[0].ToUpper() == encrPass.ToUpper()) { args.Player.Group = Tools.GetGroup(exr[1]); + args.Player.UserName = args.Parameters[0]; args.Player.SendMessage("Authenticated as " + args.Parameters[0] + " successfully.", Color.LimeGreen); return; } @@ -337,21 +340,28 @@ namespace TShockAPI { if (args.Parameters[0] == "add") { + int returnval = 0; if (args.Parameters[1].Split(':').Length == 2) { - TextWriter tw = new StreamWriter(FileTools.UsersPath, true); - tw.WriteLine("\n" + args.Parameters[1].Split(':')[0] + ":" + Tools.HashPassword(args.Parameters[1].Split(':')[1]) + " " + args.Parameters[2]); - tw.Close(); - args.Player.SendMessage("This player can now login!", Color.Green); + if ((returnval = TShock.Users.AddUser("", args.Parameters[1].Split(':')[0], args.Parameters[1].Split(':')[1], args.Parameters[2])) == 1) + args.Player.SendMessage("This player can now login!", Color.Green); + else if(returnval == 2) + args.Player.SendMessage("Invalid Group", Color.Green); + else + args.Player.SendMessage("Could not add user", Color.Green); return; } else if (args.Parameters[1].Split(':').Length == 1) { - TextWriter tw = new StreamWriter(FileTools.UsersPath, true); - tw.WriteLine("\n" + args.Parameters[1] + " " + args.Parameters[2]); - tw.Close(); - args.Player.SendMessage("IP address admin added. If they're logged in, tell them to rejoin.", Color.Green); - args.Player.SendMessage("WARNING: This is insecure! It would be better to use a user account instead.", Color.Red); + if ((returnval = TShock.Users.AddUser(args.Parameters[1], "", "", args.Parameters[2])) == 1) + { + args.Player.SendMessage("IP address admin added. If they're logged in, tell them to rejoin.", Color.Green); + args.Player.SendMessage("WARNING: This is insecure! It would be better to use a user account instead.", Color.Red); + } + else if (returnval == 2) + args.Player.SendMessage("Invalid Group", Color.Green); + else + args.Player.SendMessage("Could not add user", Color.Green); return; } else @@ -490,8 +500,10 @@ namespace TShockAPI var ban = TShock.Bans.GetBanByName(plStr); if (ban != null) { - TShock.Bans.RemoveBan(ban); - args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); + if (TShock.Bans.RemoveBan(ban.IP)) + args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); + else + args.Player.SendMessage(string.Format("Failed to Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); } else { @@ -499,6 +511,47 @@ namespace TShockAPI } } + static int ClearBansCode = -1; + private static void ClearBans(CommandArgs args) + { + if (args.Parameters.Count < 1 && ClearBansCode == -1) + { + ClearBansCode = new Random().Next(0, short.MaxValue); + args.Player.SendMessage("ClearBans Code: " + ClearBansCode, Color.Red); + return; + } + if (args.Parameters.Count < 1) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /clearbans "); + return; + } + + int num; + if (!int.TryParse(args.Parameters[0], out num)) + { + args.Player.SendMessage("Invalid syntax! Expecting number"); + return; + } + + if (num == ClearBansCode) + { + ClearBansCode = -1; + if (TShock.Bans.ClearBans()) + { + Log.ConsoleInfo("Bans cleared"); + args.Player.SendMessage("Bans cleared"); + } + else + { + args.Player.SendMessage("Failed to clear bans"); + } + } + else + { + args.Player.SendMessage("Incorrect clear code"); + } + } + private static void UnBanIP(CommandArgs args) { if (args.Parameters.Count < 1) @@ -516,8 +569,10 @@ namespace TShockAPI var ban = TShock.Bans.GetBanByIp(plStr); if (ban != null) { - TShock.Bans.RemoveBan(ban); - args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); + if (TShock.Bans.RemoveBan(ban.IP)) + args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); + else + args.Player.SendMessage(string.Format("Failed to Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); } else { @@ -906,10 +961,9 @@ namespace TShockAPI { args.Player.SendMessage("Name reserved, use a different name", Color.Red); } - else if (WarpsManager.AddWarp(args.Player.TileX, args.Player.TileY, warpName, Main.worldName)) + else if (TShock.Warps.AddWarp(args.Player.TileX, args.Player.TileY, warpName, Main.worldID.ToString())) { args.Player.SendMessage("Set warp " + warpName, Color.Yellow); - WarpsManager.WriteSettings(); } else { @@ -925,7 +979,7 @@ namespace TShockAPI if (args.Parameters.Count > 0) { string warpName = String.Join(" ", args.Parameters); - if (WarpsManager.DeleteWarp(warpName)) + if (TShock.Warps.RemoveWarp(warpName)) args.Player.SendMessage("Deleted warp " + warpName, Color.Yellow); else args.Player.SendMessage("Could not find specified warp", Color.Red); @@ -945,16 +999,18 @@ namespace TShockAPI if (args.Parameters.Count > 1) int.TryParse(args.Parameters[1], out page); var sb = new StringBuilder(); - if (WarpsManager.Warps.Count > (15 * (page - 1))) + List Warps = TShock.Warps.ListAllWarps(); + + if (Warps.Count > (15 * (page - 1))) { for (int j = (15 * (page - 1)); j < (15 * page); j++) { - if (WarpsManager.Warps[j].WorldWarpName == Main.worldName) + if (Warps[j].WorldWarpID == Main.worldID.ToString()) { if (sb.Length != 0) sb.Append(", "); - sb.Append("/").Append(WarpsManager.Warps[j].WarpName); - if (j == WarpsManager.Warps.Count - 1) + sb.Append("/").Append(Warps[j].WarpName); + if (j == Warps.Count - 1) { args.Player.SendMessage(sb.ToString(), Color.Yellow); break; @@ -967,7 +1023,7 @@ namespace TShockAPI } } } - if (WarpsManager.Warps.Count > (15 * page)) + if (Warps.Count > (15 * page)) { args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 1)), Color.Yellow); } @@ -975,10 +1031,10 @@ namespace TShockAPI else { string warpName = String.Join(" ", args.Parameters); - var warp = WarpsManager.FindWarp(warpName); - if (warp != Vector2.Zero) + var warp = TShock.Warps.FindWarp(warpName); + if (warp.WarpPos != Vector2.Zero) { - if (args.Player.Teleport((int)warp.X, (int)warp.Y + 3)) + if (args.Player.Teleport((int)warp.WarpPos.X, (int)warp.WarpPos.Y + 3)) args.Player.SendMessage("Warped to " + warpName, Color.Yellow); } else @@ -1235,9 +1291,9 @@ namespace TShockAPI if (!args.Player.TempArea.IsEmpty) { string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)); - if (RegionManager.AddRegion(args.Player.TempArea.X, args.Player.TempArea.Y, + if (TShock.Regions.AddRegion(args.Player.TempArea.X, args.Player.TempArea.Y, args.Player.TempArea.Width, args.Player.TempArea.Height, - regionName, Main.worldName)) + regionName, Main.worldID.ToString())) { args.Player.TempArea = Rectangle.Empty; args.Player.SendMessage("Set region " + regionName, Color.Yellow); @@ -1261,14 +1317,14 @@ namespace TShockAPI string regionName = args.Parameters[1]; if (args.Parameters[2].ToLower() == "true") { - if (RegionManager.SetRegionState(regionName, true)) + if (TShock.Regions.SetRegionState(regionName, true)) args.Player.SendMessage("Protected region " + regionName, Color.Yellow); else args.Player.SendMessage("Could not find specified region", Color.Red); } else if (args.Parameters[2].ToLower() == "false") { - if (RegionManager.SetRegionState(regionName, false)) + if (TShock.Regions.SetRegionState(regionName, false)) args.Player.SendMessage("Unprotected region " + regionName, Color.Yellow); else args.Player.SendMessage("Could not find specified region", Color.Red); @@ -1285,7 +1341,7 @@ namespace TShockAPI if (args.Parameters.Count > 1) { string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)); - if (RegionManager.DeleteRegion(regionName)) + if (TShock.Regions.DeleteRegion(regionName)) args.Player.SendMessage("Deleted region " + regionName, Color.Yellow); else args.Player.SendMessage("Could not find specified region", Color.Red); @@ -1306,7 +1362,7 @@ namespace TShockAPI { string playerName = args.Parameters[1]; string regionName = ""; - string playerIP = null; + string playerID = "0"; for (int i = 2; i < args.Parameters.Count; i++) { @@ -1319,12 +1375,20 @@ namespace TShockAPI regionName = regionName + " " + args.Parameters[i]; } } - if ((playerIP = Tools.GetPlayerIP(playerName)) != null) + if ((playerID = TShock.Users.GetUserID(Tools.FindPlayer(playerName)[0].UserName)) != "0") { - if (RegionManager.AddNewUser(regionName, playerIP)) + if (TShock.Regions.AddNewUser(regionName, playerID)) + { + args.Player.SendMessage("Added user " + playerName + " to " + regionName, Color.Yellow); + } + else + args.Player.SendMessage("Region " + regionName + " not found", Color.Red); + } + else if ((playerID = TShock.Users.GetUserID("",Tools.FindPlayer(playerName)[0].IP)) != "0") + { + if (TShock.Regions.AddNewUser(regionName, playerID)) { args.Player.SendMessage("Added user " + playerName + " to " + regionName, Color.Yellow); - RegionManager.WriteSettings(); } else args.Player.SendMessage("Region " + regionName + " not found", Color.Red); @@ -1338,6 +1402,44 @@ namespace TShockAPI args.Player.SendMessage("Invalid syntax! Proper syntax: /region allow [name] [region]", Color.Red); break; } + case "list": + { + args.Player.SendMessage("Current Regions:", Color.Green); + int page = 1; + if (args.Parameters.Count > 1) + int.TryParse(args.Parameters[1], out page); + var sb = new StringBuilder(); + + List Regions = TShock.Regions.ListAllRegions(); + + if (Regions.Count > (15 * (page - 1))) + { + for (int j = (15 * (page - 1)); j < (15 * page); j++) + { + if (Regions[j].RegionWorldID == Main.worldID.ToString()) + { + if (sb.Length != 0) + sb.Append(", "); + sb.Append(Regions[j].RegionName); + if (j == Regions.Count - 1) + { + args.Player.SendMessage(sb.ToString(), Color.Yellow); + break; + } + if ((j + 1) % 5 == 0) + { + args.Player.SendMessage(sb.ToString(), Color.Yellow); + sb.Clear(); + } + } + } + } + if (Regions.Count > (15 * page)) + { + args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 1)), Color.Yellow); + } + break; + } case "help": default: { @@ -1409,11 +1511,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 345dd704..3125a4df 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -72,6 +72,17 @@ namespace TShockAPI public string ServerName = ""; public string MasterServer = "127.0.0.1"; + /// + /// Valid types are "sqlite" and "mysql" + /// + 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 new file mode 100644 index 00000000..b5f6bc77 --- /dev/null +++ b/TShockAPI/DB/BanManager.cs @@ -0,0 +1,177 @@ +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Text; +using Community.CsharpSqlite.SQLiteClient; +using TShockAPI.DB; + +namespace TShockAPI.DB +{ + public class BanManager + { + private IDbConnection database; + + public BanManager(IDbConnection db) + { + database = db; + + using (var com = database.CreateCommand()) + { + 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(); + } + } + + public Ban GetBanByIp(string ip) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT * FROM Bans WHERE IP=@ip"; + com.AddParameter("@ip", ip); + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); + } + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return null; + } + + public Ban GetBanByName(string name, bool casesensitive = true) + { + try + { + using (var com = database.CreateCommand()) + { + var namecol = casesensitive ? "Name" : "UPPER(Name)"; + if (!casesensitive) + name = name.ToUpper(); + com.CommandText = "SELECT * FROM Bans WHERE " + namecol + "=@name"; + com.AddParameter("@name", name); + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + return new Ban((string)reader["IP"], (string)reader["Name"], (string)reader["Reason"]); + } + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return null; + } + + public bool AddBan(string ip, string name = "", string reason = "") + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "INSERT INTO Bans (IP, Name, Reason) VALUES (@ip, @name, @reason);"; + com.AddParameter("@ip", ip); + com.AddParameter("@name", name); + com.AddParameter("@reason", reason); + com.ExecuteNonQuery(); + } + return true; + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return false; + } + + public bool RemoveBan(string ip) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "DELETE FROM Bans WHERE IP=@ip"; + com.AddParameter("@ip", ip); + com.ExecuteNonQuery(); + return true; + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return false; + } + public bool ClearBans() + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "DELETE FROM Bans"; + com.ExecuteNonQuery(); + return true; + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return false; + } + } + + public class Ban + { + public string IP { get; set; } + + public string Name { get; set; } + + public string Reason { get; set; } + + public Ban(string ip, string name, string reason) + { + IP = ip; + Name = name; + Reason = reason; + } + + public Ban() + { + IP = string.Empty; + Name = string.Empty; + Reason = string.Empty; + } + } +} \ No newline at end of file diff --git a/TShockAPI/DB/DbExt.cs b/TShockAPI/DB/DbExt.cs new file mode 100644 index 00000000..13942cf2 --- /dev/null +++ b/TShockAPI/DB/DbExt.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; + +namespace TShockAPI.DB +{ + public static class DbExt + { + public static IDbDataParameter AddParameter(this IDbCommand command, string name, object data) + { + var parm = command.CreateParameter(); + parm.ParameterName = name; + parm.Value = data; + command.Parameters.Add(parm); + return parm; + } + + static Dictionary> ReadFuncs = new Dictionary>() + { + {typeof(bool), (s, i) => s.GetBoolean(i)}, + {typeof(byte), (s, i) => s.GetByte(i)}, + {typeof(Int16), (s, i) => s.GetInt16(i)}, + {typeof(Int32), (s, i) => s.GetInt32(i)}, + {typeof(Int64), (s, i) => s.GetInt64(i)}, + {typeof(string), (s, i) => s.GetString(i)}, + {typeof(decimal), (s, i) => s.GetDecimal(i)}, + {typeof(float), (s, i) => s.GetFloat(i)}, + {typeof(double), (s, i) => s.GetDouble(i)}, + }; + + public static T Get(this IDataReader reader, string column) + { + return reader.Get(reader.GetOrdinal(column)); + } + + public static T Get(this IDataReader reader, int column) + { + if (ReadFuncs.ContainsKey(typeof(T))) + return (T)ReadFuncs[typeof(T)](reader, column); + + throw new NotImplementedException(); + } + } +} diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs new file mode 100644 index 00000000..11847d2f --- /dev/null +++ b/TShockAPI/DB/GroupManager.cs @@ -0,0 +1,150 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data; +using Community.CsharpSqlite.SQLiteClient; + +namespace TShockAPI.DB +{ + public class GroupManager + { + private IDbConnection database; + + public List groups = new List(); + + public GroupManager(IDbConnection db) + { + database = db; + + using (var com = database.CreateCommand()) + { + 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(); + + 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(); + + 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(); + + 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(); + + 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"); + com.ExecuteNonQuery(); + com.Parameters.Clear(); + + LoadPermisions(); + } + } + + public bool GroupExists(string group) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT * FROM Grouplist WHERE GroupName=@groupname"; + com.AddParameter("@groupname", group); + using (var reader = com.ExecuteReader()) + { + while (reader.Read()) + if (reader.Get("GroupName") == group) + return true; + } + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return false; + } + + public void LoadPermisions() + { + groups = new List(); + groups.Add(new SuperAdminGroup()); + + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT * FROM Grouplist;"; + using (var reader = com.ExecuteReader()) + { + while (reader.Read()) + { + Group group = null; + string groupname = reader.Get("GroupName"); + int order = Int32.Parse(reader.Get("OrderBy")); + group = new Group(groupname); + group.Order = order; + + //Inherit Given commands + foreach (string perm in reader.Get("Commands").Split(',')) + { + group.AddPermission(perm); + } + + groups.Add(group); + } + } + + //Inherit all commands from group below in order, unless Order is 0 (unique groups anyone) + foreach (Group group in groups) + { + if (group.Order != 0 && group.Order < groups.Count) + { + for (int i = group.Order + 1; i < groups.Count; i++) + { + for (int j = 0; j < groups[i].permissions.Count; j++) + { + group.AddPermission(groups[i].permissions[j]); + } + } + } + } + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + } + } +} diff --git a/TShockAPI/DB/ItemManager.cs b/TShockAPI/DB/ItemManager.cs new file mode 100644 index 00000000..e4ec52ee --- /dev/null +++ b/TShockAPI/DB/ItemManager.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data; +using Community.CsharpSqlite.SQLiteClient; +using TShockAPI.DB; + +namespace TShockAPI.DB +{ + public class ItemManager + { + private IDbConnection database; + + public ItemManager(IDbConnection db) + { + database = db; + + using (var com = database.CreateCommand()) + { + 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(); + } + } + + public void AddNewBan(string itemname = "") + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "INSERT INTO ItemBans (ItemName) VALUES (@itemname);"; + com.AddParameter("@itemname", Tools.GetItemByName(itemname)[0].name); + com.ExecuteNonQuery(); + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + } + + public void RemoveBan(string itemname) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "DELETE FROM ItemBans WHERE ItemName=@itemname;"; + com.AddParameter("@itemname", Tools.GetItemByName(itemname)[0].name); + com.ExecuteNonQuery(); + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + } + + public bool ItemIsBanned(string name) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT *FROM ItemBans WHERE ItemName=@name"; + com.AddParameter("@name", name); + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + if (reader.Get("ItemName") == name) + return true; + } + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return false; + } + } +} diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs new file mode 100644 index 00000000..793624ab --- /dev/null +++ b/TShockAPI/DB/RegionManager.cs @@ -0,0 +1,280 @@ +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml; +using System.IO; +using System.Data; +using TShockAPI.DB; +using Community.CsharpSqlite.SQLiteClient; +using Microsoft.Xna.Framework; +using Terraria; + + +namespace TShockAPI.DB +{ + public class RegionManager + { + public static List Regions = new List(); + + private IDbConnection database; + + public RegionManager(IDbConnection db) + { + database = db; + + using (var com = database.CreateCommand()) + { + 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(); + } + } + + public bool AddRegion(int tx, int ty, int width, int height, string regionname, string worldid) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = + "INSERT INTO Regions VALUES (@tx, @ty, @height, @width, @name, @worldid, @userids, @protected);"; + com.AddParameter("@tx", tx); + com.AddParameter("@ty", ty); + com.AddParameter("@height", width + tx); + com.AddParameter("@width", height + ty); + com.AddParameter("@name", regionname.ToLower()); + com.AddParameter("@worldid", worldid); + com.AddParameter("@userids", ""); + com.AddParameter("@protected", 1); + if (com.ExecuteNonQuery() > 0) + return true; + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return false; + } + + public bool DeleteRegion(string name) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "DELETE FROM Regions WHERE RegionName=@name AND WorldID=@worldid"; + com.AddParameter("@name", name.ToLower()); + com.AddParameter("@worldid", Main.worldID.ToString()); + com.ExecuteNonQuery(); + return true; + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return false; + } + + public bool SetRegionState(string name, bool state) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "UPDATE Regions SET Protected=@bool WHERE RegionName=@name WorldID=@worldid"; + com.AddParameter("@name", name); + if (state) + com.AddParameter("@bool", 1); + else + com.AddParameter("@bool", 0); + com.AddParameter("@worldid", Main.worldID.ToString()); + if (com.ExecuteNonQuery() > 0) + return true; + else + return false; + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + return false; + } + } + + public bool InProtectedArea(int X, int Y, string ID) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT * FROM Regions WHERE WorldID=@worldid"; + com.AddParameter("@worldid", Main.worldID.ToString()); + using (var reader = com.ExecuteReader()) + { + while (reader.Read()) + { + int X1 = reader.Get("X1"); + int Y1 = reader.Get("Y1"); + int X2 = reader.Get("X2"); + int Y2 = reader.Get("Y2"); + int Protected = reader.Get("Protected"); + string MergedIDs = DbExt.Get(reader, "UserIds"); + + string[] SplitIDs = MergedIDs.Split(','); + + if (X >= X1 && + X <= X2 && + Y >= Y1 && + Y <= Y2 && + Protected == 1) + { + if (!SplitIDs.Contains(ID)) + return true; + } + } + } + } + return false; + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + return false; + } + } + + public static List ListIDs(string MergedIDs) + { + List SplitIDs = new List(); + var sb = new StringBuilder(); + for (int i = 0; i < MergedIDs.Length; i++) + { + char c = MergedIDs[i]; + + if (c != ',') + { + sb.Append(c); + } + else if (sb.Length > 0) + { + SplitIDs.Add(sb.ToString()); + sb.Clear(); + } + } + return SplitIDs; + } + + public bool AddNewUser(string regionName, string ID) + { + string MergedIDs = string.Empty; + + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT * FROM Regions WHERE RegionName=@name AND WorldID=@worldid"; + com.AddParameter("@name", regionName); + com.AddParameter("@worldid", Main.worldID.ToString()); + + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + { + MergedIDs = reader.Get("UserIds"); + } + } + + if (MergedIDs == string.Empty) + MergedIDs = ID; + else + MergedIDs = MergedIDs + "," + ID; + + com.CommandText = "UPDATE Regions SET UserIds=@ids"; + com.AddParameter("@ids", MergedIDs); + if (com.ExecuteNonQuery() > 0) + return true; + else + return false; + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + return false; + } + } + + public List ListAllRegions() + { + List Regions = new List(); + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT * FROM Regions"; + using (var reader = com.ExecuteReader()) + { + while (reader.Read()) + Regions.Add(new Region(new Rectangle(reader.Get("X1"), reader.Get("Y1"), reader.Get("X2"), reader.Get("Y2")), reader.Get("RegionName"), reader.Get("Protected"), reader.Get("WorldID"))); + } + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return Regions; + } + } + + public class Region + { + public Rectangle RegionArea { get; set; } + public string RegionName { get; set; } + public int DisableBuild { get; set; } + public string RegionWorldID { get; set; } + public string RegionAllowedIDs { get; set; } + + public Region(Rectangle region, string name, int disablebuild, string worldname) + { + RegionArea = region; + RegionName = name; + DisableBuild = disablebuild; + RegionWorldID = worldname; + } + + public Region() + { + RegionArea = Rectangle.Empty; + RegionName = string.Empty; + DisableBuild = 1; + RegionWorldID = string.Empty; + } + } +} diff --git a/TShockAPI/DB/UserManager.cs b/TShockAPI/DB/UserManager.cs new file mode 100644 index 00000000..dfed4be7 --- /dev/null +++ b/TShockAPI/DB/UserManager.cs @@ -0,0 +1,194 @@ + +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using Community.CsharpSqlite.SQLiteClient; + +namespace TShockAPI.DB +{ + public class UserManager + { + private IDbConnection database; + + public UserManager(IDbConnection db) + { + database = db; + + using (var com = database.CreateCommand()) + { + 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(); + + 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"); + com.ExecuteNonQuery(); + } + } + + public int AddUser(string ip = "" , string name = "", string password = "", string group = "default") + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "INSERT INTO Users (Username, Password, UserGroup, IP) VALUES (@name, @password, @group, @ip);"; + com.AddParameter("@name", name.ToLower()); + com.AddParameter("@password", Tools.HashPassword(password)); + + if(TShock.Groups.GroupExists(group)) + com.AddParameter("@group", group); + else + //Return code 2 (Group not exist) + return 2; + + com.AddParameter("@ip", ip); + + using (var reader = com.ExecuteReader()) + { + if (reader.RecordsAffected > 0) + //Return code 1 (User added) + return 1; + else + //Return code 0 (Add failed) + return 0; + } + } + } + catch (SqliteExecutionException ex) + { + //Return code 0 (Add failed) + Log.Error(ex.ToString()); + return 0; + } + } + + /// + /// Fetches the hashed password and group for a given username + /// + /// string username + /// string[] {password, group} + public string[] FetchHashedPasswordAndGroup(string username) + { + string[] returndata = new string[2]; + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT * FROM Users WHERE Username=@name"; + com.AddParameter("@name", username.ToLower()); + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + { + returndata[0] = reader.Get("Password"); + returndata[1] = reader.Get("UserGroup"); + return returndata; + } + } + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return returndata; + } + + /// + /// Returns a Group for a ip from the database + /// + /// string ip + public Group GetGroupForIP(string ip) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT * FROM Users WHERE IP=@ip"; + com.AddParameter("@ip", ip); + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + { + string group = reader.Get("UserGroup"); + return Tools.GetGroup(group); + } + } + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return Tools.GetGroup("default"); + } + + public string GetUserID(string username = "", string IP = "") + { + try + { + using (var com = database.CreateCommand()) + { + if (username != "" && username != null) + { + com.CommandText = "SELECT * FROM Users WHERE Username=@name"; + com.AddParameter("@name", username); + } + else if (IP != "" && IP != null) + { + com.CommandText = "SELECT * FROM Users WHERE IP=@ip"; + com.AddParameter("@ip", IP); + } + else + return "0"; + + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + { + string ID = reader.Get("ID"); + return ID; + } + } + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return "0"; + } + } +} diff --git a/TShockAPI/DB/WarpsManager.cs b/TShockAPI/DB/WarpsManager.cs new file mode 100644 index 00000000..881f9a50 --- /dev/null +++ b/TShockAPI/DB/WarpsManager.cs @@ -0,0 +1,162 @@ +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data; +using System.IO; +using Community.CsharpSqlite.SQLiteClient; +using Microsoft.Xna.Framework; +using System.Xml; +using Terraria; +using TShockAPI.DB; + +namespace TShockAPI.DB +{ + public class WarpManager + { + private IDbConnection database; + + public WarpManager(IDbConnection db) + { + database = db; + + using (var com = database.CreateCommand()) + { + 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(); + } + } + + public bool AddWarp(int x, int y, string name, string worldid) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "INSERT INTO Warps (X, Y, WarpName, WorldID) VALUES (@x, @y, @name, @worldid);"; + com.AddParameter("@x", x); + com.AddParameter("@y", y); + com.AddParameter("@name", name.ToLower()); + com.AddParameter("@worldid", worldid); + com.ExecuteNonQuery(); + return true; + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return false; + } + + public bool RemoveWarp(string name) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "DELETE FROM Warps WHERE WarpName=@name AND WorldID=@worldid"; + com.AddParameter("@name", name.ToLower()); + com.AddParameter("@worldid", Main.worldID.ToString()); + com.ExecuteNonQuery(); + return true; + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return false; + } + + public Warp FindWarp(string name) + { + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT * FROM Warps WHERE WarpName=@name AND WorldID=@worldid"; + com.AddParameter("@name", name.ToLower()); + com.AddParameter("@worldid", Main.worldID.ToString()); + using (var reader = com.ExecuteReader()) + { + if (reader.Read()) + return new Warp(new Vector2(reader.Get("X"), reader.Get("Y")), reader.Get("WarpName"), reader.Get("WorldID")); + } + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return new Warp(); + } + + public List ListAllWarps() + { + List Warps = new List(); + try + { + using (var com = database.CreateCommand()) + { + com.CommandText = "SELECT * FROM Warps"; + using (var reader = com.ExecuteReader()) + { + while (reader.Read()) + Warps.Add(new Warp(new Vector2(reader.Get("X"), reader.Get("Y")), reader.Get("WarpName"), reader.Get("WorldID"))); + } + } + } + catch (SqliteExecutionException ex) + { + Log.Error(ex.ToString()); + } + return Warps; + } + } + + public class Warp + { + public Vector2 WarpPos { get; set; } + public string WarpName { get; set; } + public string WorldWarpID { get; set; } + + public Warp(Vector2 warppos, string name, string worldname) + { + WarpPos = warppos; + WarpName = name; + WorldWarpID = worldname; + } + + public Warp() + { + WarpPos = Vector2.Zero; + WarpName = null; + WorldWarpID = string.Empty; + } + } +} diff --git a/TShockAPI/FileTools.cs b/TShockAPI/FileTools.cs index d3b3c18a..880748f4 100644 --- a/TShockAPI/FileTools.cs +++ b/TShockAPI/FileTools.cs @@ -25,15 +25,9 @@ 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"); } } - public static string RegionsPath { get { return Path.Combine(TShock.SavePath, "regions.xml"); } } - public static string WarpsPath { get { return Path.Combine(TShock.SavePath, "warps.xml"); } } public static void CreateFile(string file) { @@ -60,29 +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); - - //Copies if using old paths (Remove in future releases, after everyone is running this version +) - if (File.Exists("regions.xml") && !File.Exists(RegionsPath)) - { - File.Move("regions.xml", RegionsPath); - } - else - { - CreateIfNot(RegionsPath); - } - if (File.Exists("warps.xml") && !File.Exists(WarpsPath)) - { - File.Move("warps.xml", WarpsPath); - } - else - { - CreateIfNot(WarpsPath); - } try { @@ -95,7 +67,9 @@ namespace TShockAPI } catch (Exception ex) { + Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Error in config file"); + Console.ForegroundColor = ConsoleColor.Gray; Log.Error("Config Exception"); Log.Error(ex.ToString()); } diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 870c2810..1cc4438c 100755 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -275,7 +275,7 @@ namespace TShockAPI return true; } } - if (!args.Player.Group.HasPermission("editspawn") && RegionManager.InProtectedArea(x, y, Tools.GetPlayerIP(args.Player.Name))) + if (!args.Player.Group.HasPermission("editspawn") && TShock.Regions.InProtectedArea(x, y, TShock.Users.GetUserID(args.Player.UserName,args.Player.IP))) { if ((DateTime.UtcNow - args.Player.LastTileChangeNotify).TotalMilliseconds > 1000) { diff --git a/TShockAPI/Group.cs b/TShockAPI/Group.cs index 62c2c39c..87b9b9f9 100644 --- a/TShockAPI/Group.cs +++ b/TShockAPI/Group.cs @@ -22,11 +22,12 @@ namespace TShockAPI { public class Group { - private readonly List permissions = new List(); + public readonly List permissions = new List(); private readonly List negatedpermissions = new List(); public string Name { get; protected set; } public Group Parent { get; protected set; } + public int Order { get; set; } public Group(string groupname, Group parentgroup = null) { diff --git a/TShockAPI/ItemManager.cs b/TShockAPI/ItemManager.cs deleted file mode 100644 index e78adea7..00000000 --- a/TShockAPI/ItemManager.cs +++ /dev/null @@ -1,94 +0,0 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.IO; -using Terraria; - -namespace TShockAPI -{ - class ItemManager - { - public static List BannedItems = new List(); - - public static void LoadBans() - { - try - { - if (!File.Exists(FileTools.ItemBansPath)) - return; - - BannedItems.Clear(); - - foreach (var line in File.ReadAllLines(FileTools.ItemBansPath)) - { - int ID = -1; - if (Int32.TryParse(line, out ID)) - { - if (ID < Main.maxItemTypes && ID > 0) - { - var item = Tools.GetItemById(ID); - BannedItems.Add(new ItemBan(ID, item.name)); - Log.Info("Item: " + item.name + " is banned"); - } - else - { - Log.Warn("Invalid ID " + ID); - } - } - } - } - catch (Exception e) - { - Log.Error(e.ToString()); - } - } - - public static bool ItemIsBanned(string ID) - { - foreach (ItemBan item in BannedItems) - { - if (ID == item.Name) - return true; - } - return false; - } - } - - public class ItemBan - { - public int ID { get; set; } - - public string Name { get; set; } - - public ItemBan(int id, string name) - { - ID = id; - Name = name; - } - - public ItemBan() - { - ID = -1; - Name = string.Empty; - } - } -} diff --git a/TShockAPI/Log.cs b/TShockAPI/Log.cs index 1258c874..6e158927 100644 --- a/TShockAPI/Log.cs +++ b/TShockAPI/Log.cs @@ -86,7 +86,9 @@ namespace TShockAPI /// The message to be written. public static void ConsoleError(String message) { + Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(message); + Console.ForegroundColor = ConsoleColor.Gray; Write(message, LogLevel.Error); } @@ -114,7 +116,9 @@ namespace TShockAPI /// The message to be written. public static void ConsoleInfo(String message) { + Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(message); + Console.ForegroundColor = ConsoleColor.Gray; Write(message, LogLevel.Info); } diff --git a/TShockAPI/RegionManager.cs b/TShockAPI/RegionManager.cs deleted file mode 100644 index 8d29309b..00000000 --- a/TShockAPI/RegionManager.cs +++ /dev/null @@ -1,327 +0,0 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Xml; -using Microsoft.Xna.Framework; -using Terraria; - -namespace TShockAPI -{ - public class RegionManager - { - public static List Regions = new List(); - - public static bool AddRegion(int tx, int ty, int width, int height, string regionname, string worldname) - { - foreach (Region nametest in Regions) - { - if (regionname.ToLower() == nametest.RegionName.ToLower()) - { - return false; - } - } - Regions.Add(new Region(new Rectangle(tx, ty, width, height), regionname, true, worldname)); - WriteSettings(); - return true; - } - - public static bool AddNewUser(string regionName, string IP) - { - foreach (Region nametest in Regions) - { - if (regionName.ToLower() == nametest.RegionName.ToLower()) - { - nametest.RegionAllowedIPs.Add(IP.ToLower()); - return true; - } - } - return false; - } - - public static bool DeleteRegion(string name) - { - foreach (Region nametest in Regions) - { - if (name.ToLower() == nametest.RegionName.ToLower() && nametest.WorldRegionName == Main.worldName) - { - Regions.Remove(nametest); - WriteSettings(); - return true; - } - } - return false; - } - - public static bool SetRegionState(string name, bool state) - { - foreach (Region nametest in Regions) - { - if (name.ToLower() == nametest.RegionName.ToLower()) - { - nametest.DisableBuild = state; - WriteSettings(); - return true; - } - } - return false; - } - - public static bool InProtectedArea(int X, int Y, string IP) - { - foreach(Region region in Regions) - { - if (X >= region.RegionArea.Left && X <= region.RegionArea.Right && - Y >= region.RegionArea.Top && Y <= region.RegionArea.Bottom && - region.DisableBuild && Main.worldName == region.WorldRegionName && - (!AllowedUser(region.RegionName, IP.ToLower()) || region.RegionAllowedIPs.Count == 0)) - { - return true; - } - } - return false; - } - - public static int GetRegionIndex(string regionName) - { - for(int i = 0; i< Regions.Count;i++) - { - if(Regions[i].RegionName == regionName) - return i; - } - return -1; - } - - public static bool AllowedUser(string regionName, string playerIP) - { - int ID = -1; - if ((ID = GetRegionIndex(regionName)) != -1) - { - for (int i = 0; i < Regions[ID].RegionAllowedIPs.Count; i++) - { - if (Regions[ID].RegionAllowedIPs[i].ToLower() == playerIP.ToLower()) - { - return true; - } - } - } - return false; - } - - public static void WriteSettings() - { - try - { - XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); - xmlWriterSettings.Indent = true; - xmlWriterSettings.NewLineChars = Environment.NewLine; - - using (XmlWriter settingsw = XmlWriter.Create(FileTools.RegionsPath, xmlWriterSettings)) - { - settingsw.WriteStartDocument(); - settingsw.WriteStartElement("Regions"); - - foreach (Region region in Regions) - { - settingsw.WriteStartElement("ProtectedRegion"); - settingsw.WriteElementString("RegionName", region.RegionName); - settingsw.WriteElementString("Point1X", region.RegionArea.X.ToString()); - settingsw.WriteElementString("Point1Y", region.RegionArea.Y.ToString()); - settingsw.WriteElementString("Point2X", region.RegionArea.Width.ToString()); - settingsw.WriteElementString("Point2Y", region.RegionArea.Height.ToString()); - settingsw.WriteElementString("Protected", region.DisableBuild.ToString()); - settingsw.WriteElementString("WorldName", region.WorldRegionName); - - settingsw.WriteElementString("AllowedUserCount", region.RegionAllowedIPs.Count.ToString()); - for (int i = 0; i < region.RegionAllowedIPs.Count; i++) - { - settingsw.WriteElementString("IP", region.RegionAllowedIPs[i]); - } - - settingsw.WriteEndElement(); - } - - settingsw.WriteEndElement(); - settingsw.WriteEndDocument(); - } - Log.Info("Wrote Regions"); - } - catch - { - Log.Warn("Could not write Regions"); - } - } - - public static void ReadAllSettings() - { - try - { - XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); - xmlReaderSettings.IgnoreWhitespace = true; - - using (XmlReader settingr = XmlReader.Create(FileTools.RegionsPath, xmlReaderSettings)) - { - while (settingr.Read()) - { - if (settingr.IsStartElement()) - { - switch (settingr.Name) - { - case "Regions": - { - break; - } - case "ProtectedRegion": - { - if (settingr.Read()) - { - string name = null; - int x = 0; - int y = 0; - int width = 0; - int height = 0; - bool state = true; - string worldname = null; - int playercount = 0; - - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - name = settingr.Value; - else - Log.Warn("Region name is empty"); - - - settingr.Read(); - settingr.Read(); - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - Int32.TryParse(settingr.Value, out x); - else - Log.Warn("x for region " + name + " is empty"); - - settingr.Read(); - settingr.Read(); - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - Int32.TryParse(settingr.Value, out y); - else - Log.Warn("y for region " + name + " is empty"); - - settingr.Read(); - settingr.Read(); - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - Int32.TryParse(settingr.Value, out width); - else - Log.Warn("Width for region " + name + " is empty"); - - settingr.Read(); - settingr.Read(); - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - Int32.TryParse(settingr.Value, out height); - else - Log.Warn("Height for region " + name + " is empty"); - - settingr.Read(); - settingr.Read(); - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - bool.TryParse(settingr.Value, out state); - else - Log.Warn("State for region " + name + " is empty"); - - settingr.Read(); - settingr.Read(); - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - worldname = settingr.Value; - else - Log.Warn("Worldname for region " + name + " is empty"); - - settingr.Read(); - settingr.Read(); - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - Int32.TryParse(settingr.Value, out playercount); - else - Log.Warn("Playercount for region " + name + " is empty"); - - AddRegion(x, y, width, height, name, worldname); - - if (playercount > 0) - { - for (int i = 0; i < playercount; i++) - { - settingr.Read(); - settingr.Read(); - settingr.Read(); - if (settingr.Value != "" || settingr.Value != null) - { - int ID = RegionManager.GetRegionIndex(name); - Regions[ID].RegionAllowedIPs.Add(settingr.Value); - } - else - Log.Warn("PlayerIP " + i + " for region " + name + " is empty"); - } - } - } - break; - } - } - } - } - } - Log.Info("Read Regions"); - } - catch - { - Log.Warn("Could not read Regions"); - WriteSettings(); - } - } - } - - public class Region - { - public Rectangle RegionArea { get; set; } - public string RegionName { get; set; } - public bool DisableBuild { get; set; } - public string WorldRegionName { get; set; } - public List RegionAllowedIPs = new List(); - - public Region(Rectangle region, string name, bool disablebuild, string worldname) - { - RegionArea = region; - RegionName = name; - DisableBuild = disablebuild; - WorldRegionName = worldname; - } - - public Region() - { - RegionArea = Rectangle.Empty; - RegionName = string.Empty; - DisableBuild = true; - WorldRegionName = string.Empty; - } - } -} diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index 227d7c9d..0f8cc4a8 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -46,6 +46,7 @@ namespace TShockAPI public TSPlayer LastWhisper; public int LoginAttempts { get; set; } public Vector2 TeleportCoords = new Vector2(-1, -1); + public string UserName { get; set; } Player FakePlayer = null; diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index b65e08b4..3a48c4ec 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -24,6 +24,8 @@ using System.IO; using System.Net; using System.Reflection; using System.Threading; +using MySql.Data.MySqlClient; +using Community.CsharpSqlite.SQLiteClient; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; @@ -31,6 +33,7 @@ using Terraria; using TerrariaAPI; using TerrariaAPI.Hooks; using System.Text; +using TShockAPI.DB; namespace TShockAPI { @@ -44,11 +47,16 @@ namespace TShockAPI public static TSPlayer[] Players = new TSPlayer[Main.maxPlayers]; public static BanManager Bans; + public static WarpManager Warps; + public static RegionManager Regions; public static BackupManager Backups; + public static GroupManager Groups; + public static UserManager Users; + public static ItemManager Itembans; public static ConfigFile Config { get; set; } - public static IDbConnection Sql; + public static IDbConnection DB; public override Version Version { @@ -79,8 +87,7 @@ namespace TShockAPI public override void Initialize() { - HandleCommandLine(Environment.GetCommandLineArgs()); - + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; #if DEBUG Log.Initialize(Path.Combine(SavePath, "log.txt"), LogLevel.All, false); #else @@ -94,8 +101,50 @@ namespace TShockAPI ConfigFile.ConfigRead += OnConfigRead; FileTools.SetupConfig(); - Log.ConsoleInfo(string.Format("TShock Version {0} ({1}) now running.", Version, VersionCodename)); + HandleCommandLine(Environment.GetCommandLineArgs()); + Backups = new BackupManager(Path.Combine(SavePath, "backups")); + + FileTools.SetupConfig(); + + if (Config.StorageType.ToLower() == "sqlite") + { + string sql = Path.Combine(SavePath, "tshock.sqlite"); + DB = new SqliteConnection(string.Format("uri=file://{0},Version=3", sql)); + DB.Open(); + } + else if (Config.StorageType.ToLower() == "mysql") + { + 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 + { + throw new Exception("Invalid storage type"); + } + + Bans = new BanManager(DB); + Warps = new WarpManager(DB); + Regions = new RegionManager(DB); + Groups = new GroupManager(DB); + Users = new UserManager(DB); + Itembans = new ItemManager(DB); + + Log.ConsoleInfo(string.Format("TShock Version {0} ({1}) now running.", Version, VersionCodename)); GameHooks.PostInitialize += OnPostInit; GameHooks.Update += OnUpdate; @@ -107,13 +156,8 @@ namespace TShockAPI NetHooks.GreetPlayer += OnGreetPlayer; NpcHooks.StrikeNpc += NpcHooks_OnStrikeNpc; - - Bans.LoadBans(); GetDataHandlers.InitGetDataHandler(); Commands.InitCommands(); - RegionManager.ReadAllSettings(); - WarpsManager.ReadAllSettings(); - ItemManager.LoadBans(); //RconHandler.StartThread(); Log.ConsoleInfo("AutoSave " + (TShock.Config.AutoSave ? "Enabled" : "Disabled")); @@ -122,7 +166,7 @@ namespace TShockAPI public override void DeInitialize() { - Bans.SaveBans(); + DB.Close(); GameHooks.PostInitialize -= OnPostInit; GameHooks.Update -= OnUpdate; ServerHooks.Join -= OnJoin; @@ -203,8 +247,10 @@ namespace TShockAPI { var r = new Random((int)DateTime.Now.ToBinary()); AuthToken = r.Next(100000, 10000000); + Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("TShock Notice: To become SuperAdmin, join the game and type /auth " + AuthToken); Console.WriteLine("This token will only display ONCE. This only works ONCE. If you don't use it and the server goes down, delete auth.lck."); + Console.ForegroundColor = ConsoleColor.Gray; FileTools.CreateFile(Path.Combine(SavePath, "auth.lck")); } } @@ -247,7 +293,7 @@ namespace TShockAPI var inv = player.TPlayer.inventory; for (int i = 0; i < inv.Length; i++) { - if (inv[i] != null && ItemManager.ItemIsBanned(inv[i].name)) + if (inv[i] != null && TShock.Itembans.ItemIsBanned(inv[i].name)) { player.Disconnect("Using banned item: " + inv[i].name + ", remove it and rejoin"); break; @@ -261,7 +307,7 @@ namespace TShockAPI private void OnJoin(int ply, HandledEventArgs handler) { var player = new TSPlayer(ply); - player.Group = Tools.GetGroupForIP(player.IP); + player.Group = TShock.Users.GetGroupForIP(player.IP); if (Tools.ActivePlayers() + 1 > TShock.Config.MaxSlots && !player.Group.HasPermission("reservedslot")) { @@ -288,8 +334,6 @@ namespace TShockAPI } Players[ply] = player; - - } private void OnLeave(int ply) @@ -382,6 +426,15 @@ namespace TShockAPI if (text.StartsWith("exit")) { Tools.ForceKickAll("Server shutting down!"); + var sb = new StringBuilder(); + for (int i = 0; i < Main.maxItemTypes; i++) + { + string itemName = Main.itemName[i]; + string itemID = (i).ToString(); + sb.Append("ItemList.Add(\"" + itemName + "\");").AppendLine(); + } + + File.WriteAllText("item.txt", sb.ToString()); } else if (text.StartsWith("playing") || text.StartsWith("/playing")) { @@ -412,7 +465,6 @@ namespace TShockAPI if (Commands.HandleCommand(TSPlayer.Server, text)) e.Handled = true; } - } private void GetData(GetDataEventArgs e) diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 30c21882..374e85b0 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -48,9 +48,20 @@ true + + SqlBins\Community.CsharpSqlite.SQLiteClient.dll + + + False + ..\..\..\TShock Testing Environment\MySql.Data.dll + + + False + ..\..\..\TShock Testing Environment\MySql.Web.dll + .\Newtonsoft.Json.dll @@ -73,9 +84,12 @@ - + + + + + - @@ -84,8 +98,8 @@ + - True @@ -97,7 +111,7 @@ - + @@ -137,6 +151,7 @@ + diff --git a/TShockAPI/Tools.cs b/TShockAPI/Tools.cs index 611f016a..4d4cf390 100755 --- a/TShockAPI/Tools.cs +++ b/TShockAPI/Tools.cs @@ -29,8 +29,8 @@ namespace TShockAPI { internal class Tools { - private static Random random = new Random(); - private static List groups = new List(); + public static Random Random = new Random(); + //private static List groups = new List(); /// /// Provides the real IP address from a RemoteEndPoint string that contains a port and an IP @@ -202,8 +202,8 @@ namespace TShockAPI break; } - tileX = startTileX + random.Next(tileXRange * -1, tileXRange); - tileY = startTileY + random.Next(tileYRange * -1, tileYRange); + tileX = startTileX + Random.Next(tileXRange * -1, tileXRange); + tileY = startTileY + Random.Next(tileYRange * -1, tileYRange); j++; } while (TileValid(tileX, tileY) && !TileClear(tileX, tileY)); @@ -250,12 +250,16 @@ namespace TShockAPI var found = new List(); for (int i = 1; i < Main.maxItemTypes; i++) { - Item item = new Item(); - item.SetDefaults(i); - if (item.name.ToLower() == name.ToLower()) - return new List { item }; - if (item.name.ToLower().StartsWith(name.ToLower())) - found.Add(item); + try + { + Item item = new Item(); + item.SetDefaults(i); + if (item.name.ToLower() == name.ToLower()) + return new List { item }; + if (item.name.ToLower().StartsWith(name.ToLower())) + found.Add(item); + } + catch { } } return found; } @@ -453,69 +457,6 @@ namespace TShockAPI tr.Close(); } - public static void LoadGroups() - { - groups = new List(); - groups.Add(new SuperAdminGroup()); - - StreamReader sr = new StreamReader(FileTools.GroupsPath); - string data = sr.ReadToEnd(); - data = data.Replace("\r", ""); - string[] lines = data.Split('\n'); - - for (int i = 0; i < lines.Length; i++) - { - if (lines[i].StartsWith("#")) - { - continue; - } - string[] args = lines[i].Split(' '); - if (args.Length < 2) - { - continue; - } - string name = args[0]; - string parent = args[1]; - Group group = null; - if (parent.Equals("null")) - { - group = new Group(name); - } - else - { - for (int j = 0; j < groups.Count; j++) - { - if (groups[j].Name.Equals(parent)) - { - group = new Group(name, groups[j]); - break; - } - } - } - if (group == null) - { - throw new Exception("Something in the groups.txt is fucked up"); - } - else - { - for (int j = 2; j < args.Length; j++) - { - string permission = args[j]; - if (permission.StartsWith("!")) - { - group.NegatePermission(args[j].Replace("!", "")); - } - else - { - group.AddPermission(args[j]); - } - } - } - groups.Add(group); - } - sr.Close(); - } - /// /// Returns a Group from the name of the group /// @@ -523,111 +464,25 @@ namespace TShockAPI public static Group GetGroup(string groupName) { //first attempt on cached groups - for (int i = 0; i < groups.Count; i++) + for (int i = 0; i < TShock.Groups.groups.Count; i++) { - if (groups[i].Name.Equals(groupName)) + if (TShock.Groups.groups[i].Name.Equals(groupName)) { - return groups[i]; + return TShock.Groups.groups[i]; } } //shit, it didnt work, reload and try again - LoadGroups(); - - for (int i = 0; i < groups.Count; i++) + TShock.Groups.LoadPermisions(); + for (int i = 0; i < TShock.Groups.groups.Count; i++) { - if (groups[i].Name.Equals(groupName)) + if (TShock.Groups.groups[i].Name.Equals(groupName)) { - return groups[i]; + return TShock.Groups.groups[i]; } } - return new Group("null"); } - /// - /// Returns a Group for a ip from users.txt - /// - /// string ip - public static Group GetGroupForIP(string ip) - { - ip = GetRealIP(ip); - - StreamReader sr = new StreamReader(FileTools.UsersPath); - string data = sr.ReadToEnd(); - data = data.Replace("\r", ""); - string[] lines = data.Split('\n'); - - for (int i = 0; i < lines.Length; i++) - { - string[] args = lines[i].Split(' '); - if (args.Length < 2) - { - continue; - } - if (args[0].Contains(":")) - { - continue; - } - if (lines[i].StartsWith("#")) - { - continue; - } - try - { - var hi = GetIPv4Address(args[0]); - if (GetIPv4Address(args[0]).Equals(ip)) - return GetGroup(args[1]); - } - catch (Exception ex) - { Log.Error(ex.ToString()); } - } - sr.Close(); - return GetGroup("default"); - } - /// - /// Fetches the hashed password and group for a given username - /// - /// string username - /// string[] {password, group} - public static string[] FetchHashedPasswordAndGroup(string username) - { - - StreamReader sr = new StreamReader(FileTools.UsersPath); - string data = sr.ReadToEnd(); - data = data.Replace("\r", ""); - string[] lines = data.Split('\n'); - string[] result = {"null", "null"}; - - for (int i = 0; i < lines.Length; i++) - { - string[] args = lines[i].Split(' '); - if (args.Length < 2) - { - continue; - } - if (lines[i].StartsWith("#")) - { - continue; - } - if (!lines[i].Contains(":")) - { - continue; - } - try - { - if (args[0].Split(':')[0].ToLower() == username.ToLower()) - { - result = new string[] {args[0].Split(':')[1], args[1]}; - return result; - } - } - catch (Exception ex) - { Log.Error(ex.ToString()); } - } - sr.Close(); - return result; - } - /// /// Returns an IPv4 address from a DNS query /// diff --git a/TShockAPI/UpdateManager.cs b/TShockAPI/UpdateManager.cs index d0a2d151..88b8fb15 100644 --- a/TShockAPI/UpdateManager.cs +++ b/TShockAPI/UpdateManager.cs @@ -30,7 +30,6 @@ namespace TShockAPI class UpdateManager { static string updateUrl = "http://shankshock.com/tshock-update.txt"; - public static bool updateCmd; public static DateTime lastcheck = DateTime.MinValue; public static string[] globalChanges = {}; /// diff --git a/TShockAPI/WarpsManager.cs b/TShockAPI/WarpsManager.cs index e111872d..5b494611 100644 --- a/TShockAPI/WarpsManager.cs +++ b/TShockAPI/WarpsManager.cs @@ -1,4 +1,4 @@ -/* +/* TShock, a server mod for Terraria Copyright (C) 2011 The TShock Team @@ -34,7 +34,7 @@ namespace TShockAPI { foreach (Warp nametest in Warps) { - if (name.ToLower() == nametest.WarpName.ToLower() && worldname == nametest.WorldWarpName) + if (name.ToLower() == nametest.WarpName.ToLower()) { return false; }