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;
}