Merge branch 'general-devel' of github.com:TShock/TShock into general-devel

This commit is contained in:
Lucas Nicodemus 2011-07-11 23:07:28 -06:00
commit d57300099e
23 changed files with 1370 additions and 836 deletions

View file

@ -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());
}

View file

@ -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 <http://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace TShockAPI
{
public class BanManager
{
private DateTime LastLoad;
private string Path;
/// <summary>
/// IP - Name - Reason
/// </summary>
private List<Ban> Bans = new List<Ban>();
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();
}
/// <summary>
/// Reloads the file if it was changed
/// </summary>
public void EnsureChanges()
{
if (File.Exists(Path))
{
if (new FileInfo(Path).LastWriteTime > LastLoad)
LoadBans();
}
else
{
Bans.Clear();
}
}
/// <summary>
/// Removes | from the string
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
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;
}
}
}

View file

@ -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 <code>");
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<Warp> 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<Region> 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();
}
}

View file

@ -72,6 +72,17 @@ namespace TShockAPI
public string ServerName = "";
public string MasterServer = "127.0.0.1";
/// <summary>
/// Valid types are "sqlite" and "mysql"
/// </summary>
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))

177
TShockAPI/DB/BanManager.cs Normal file
View file

@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}
}

46
TShockAPI/DB/DbExt.cs Normal file
View file

@ -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<Type, Func<IDataReader, int, object>> ReadFuncs = new Dictionary<Type, Func<IDataReader, int, object>>()
{
{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<T>(this IDataReader reader, string column)
{
return reader.Get<T>(reader.GetOrdinal(column));
}
public static T Get<T>(this IDataReader reader, int column)
{
if (ReadFuncs.ContainsKey(typeof(T)))
return (T)ReadFuncs[typeof(T)](reader, column);
throw new NotImplementedException();
}
}
}

View file

@ -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<Group> groups = new List<Group>();
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<string>("GroupName") == group)
return true;
}
}
}
catch (SqliteExecutionException ex)
{
Log.Error(ex.ToString());
}
return false;
}
public void LoadPermisions()
{
groups = new List<Group>();
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<string>("GroupName");
int order = Int32.Parse(reader.Get<string>("OrderBy"));
group = new Group(groupname);
group.Order = order;
//Inherit Given commands
foreach (string perm in reader.Get<string>("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());
}
}
}
}

View file

@ -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<string>("ItemName") == name)
return true;
}
}
}
catch (SqliteExecutionException ex)
{
Log.Error(ex.ToString());
}
return false;
}
}
}

View file

@ -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 <http://www.gnu.org/licenses/>.
*/
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<Region> Regions = new List<Region>();
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<int>("X1");
int Y1 = reader.Get<int>("Y1");
int X2 = reader.Get<int>("X2");
int Y2 = reader.Get<int>("Y2");
int Protected = reader.Get<int>("Protected");
string MergedIDs = DbExt.Get<string>(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<string> ListIDs(string MergedIDs)
{
List<string> SplitIDs = new List<string>();
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<string>("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<Region> ListAllRegions()
{
List<Region> Regions = new List<Region>();
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<int>("X1"), reader.Get<int>("Y1"), reader.Get<int>("X2"), reader.Get<int>("Y2")), reader.Get<string>("RegionName"), reader.Get<int>("Protected"), reader.Get<string>("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;
}
}
}

194
TShockAPI/DB/UserManager.cs Normal file
View file

@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}
/// <summary>
/// Fetches the hashed password and group for a given username
/// </summary>
/// <param name="username">string username</param>
/// <returns>string[] {password, group}</returns>
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<string>("Password");
returndata[1] = reader.Get<string>("UserGroup");
return returndata;
}
}
}
}
catch (SqliteExecutionException ex)
{
Log.Error(ex.ToString());
}
return returndata;
}
/// <summary>
/// Returns a Group for a ip from the database
/// </summary>
/// <param name="ply">string ip</param>
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<string>("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<string>("ID");
return ID;
}
}
}
}
catch (SqliteExecutionException ex)
{
Log.Error(ex.ToString());
}
return "0";
}
}
}

View file

@ -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 <http://www.gnu.org/licenses/>.
*/
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<int>("X"), reader.Get<int>("Y")), reader.Get<string>("WarpName"), reader.Get<string>("WorldID"));
}
}
}
catch (SqliteExecutionException ex)
{
Log.Error(ex.ToString());
}
return new Warp();
}
public List<Warp> ListAllWarps()
{
List<Warp> Warps = new List<Warp>();
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<int>("X"), reader.Get<int>("Y")), reader.Get<string>("WarpName"), reader.Get<string>("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;
}
}
}

View file

@ -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());
}

View file

@ -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)
{
@ -534,7 +534,7 @@ namespace TShockAPI
args.Player.SendTileSquare(tilex, tiley);
return true;
}
if (!args.Player.Group.HasPermission("editspawn") && RegionManager.InProtectedArea(tilex, tiley, Tools.GetPlayerIP(args.Player.Name)))
if (!args.Player.Group.HasPermission("editspawn") && TShock.Regions.InProtectedArea(tilex, tiley, Tools.GetPlayerIP(args.Player.Name)))
{
args.Player.SendMessage("Region protected from changes.", Color.Red);
args.Player.SendTileSquare(tilex, tiley);

View file

@ -22,11 +22,12 @@ namespace TShockAPI
{
public class Group
{
private readonly List<string> permissions = new List<string>();
public readonly List<string> permissions = new List<string>();
private readonly List<string> negatedpermissions = new List<string>();
public string Name { get; protected set; }
public Group Parent { get; protected set; }
public int Order { get; set; }
public Group(string groupname, Group parentgroup = null)
{

View file

@ -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 <http://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Terraria;
namespace TShockAPI
{
class ItemManager
{
public static List<ItemBan> BannedItems = new List<ItemBan>();
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;
}
}
}

View file

@ -86,7 +86,9 @@ namespace TShockAPI
/// <param name="message">The message to be written.</param>
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
/// <param name="message">The message to be written.</param>
public static void ConsoleInfo(String message)
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine(message);
Console.ForegroundColor = ConsoleColor.Gray;
Write(message, LogLevel.Info);
}

View file

@ -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 <http://www.gnu.org/licenses/>.
*/
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<Region> Regions = new List<Region>();
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<string> RegionAllowedIPs = new List<string>();
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;
}
}
}

View file

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

View file

@ -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
@ -88,14 +95,55 @@ namespace TShockAPI
#endif
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Bans = new BanManager(FileTools.BansPath);
Backups = new BackupManager(Path.Combine(SavePath, "backups"));
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 +155,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 +165,7 @@ namespace TShockAPI
public override void DeInitialize()
{
Bans.SaveBans();
DB.Close();
GameHooks.PostInitialize -= OnPostInit;
GameHooks.Update -= OnUpdate;
ServerHooks.Join -= OnJoin;
@ -203,8 +246,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 +292,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 +306,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 +333,6 @@ namespace TShockAPI
}
Players[ply] = player;
}
private void OnLeave(int ply)
@ -382,6 +425,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 +464,6 @@ namespace TShockAPI
if (Commands.HandleCommand(TSPlayer.Server, text))
e.Handled = true;
}
}
private void GetData(GetDataEventArgs e)

View file

@ -48,9 +48,20 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<Reference Include="Community.CsharpSqlite.SQLiteClient">
<HintPath>SqlBins\Community.CsharpSqlite.SQLiteClient.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Xna.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86" />
<Reference Include="Microsoft.Xna.Framework.Game, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86" />
<Reference Include="Microsoft.Xna.Framework.Graphics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86" />
<Reference Include="MySql.Data, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\TShock Testing Environment\MySql.Data.dll</HintPath>
</Reference>
<Reference Include="MySql.Web, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\TShock Testing Environment\MySql.Web.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json">
<HintPath>.\Newtonsoft.Json.dll</HintPath>
</Reference>
@ -73,9 +84,12 @@
</ItemGroup>
<ItemGroup>
<Compile Include="BackupManager.cs" />
<Compile Include="BanManager.cs" />
<Compile Include="DB\BanManager.cs" />
<Compile Include="DB\ItemManager.cs" />
<Compile Include="DB\DbExt.cs" />
<Compile Include="DB\GroupManager.cs" />
<Compile Include="DB\UserManager.cs" />
<Compile Include="IPackable.cs" />
<Compile Include="ItemManager.cs" />
<Compile Include="Commands.cs" />
<Compile Include="ConfigFile.cs" />
<Compile Include="FileTools.cs" />
@ -84,8 +98,8 @@
<Compile Include="Log.cs" />
<Compile Include="Net\NetTile.cs" />
<Compile Include="Net\WorldInfoMsg.cs" />
<Compile Include="DB\RegionManager.cs" />
<Compile Include="RconHandler.cs" />
<Compile Include="RegionManager.cs" />
<Compile Include="RememberPosManager.cs" />
<Compile Include="Resources.Designer.cs">
<AutoGen>True</AutoGen>
@ -97,7 +111,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TSPlayer.cs" />
<Compile Include="UpdateManager.cs" />
<Compile Include="WarpsManager.cs" />
<Compile Include="DB\WarpsManager.cs" />
</ItemGroup>
<ItemGroup>
<None Include="config\groups.txt" />
@ -137,6 +151,7 @@
<ItemGroup>
<Content Include="config\itembans.txt" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PreBuildEvent>

View file

@ -29,8 +29,8 @@ namespace TShockAPI
{
internal class Tools
{
private static Random random = new Random();
private static List<Group> groups = new List<Group>();
public static Random Random = new Random();
//private static List<Group> groups = new List<Group>();
/// <summary>
/// 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<Item>();
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> { 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> { 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<Group>();
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();
}
/// <summary>
/// Returns a Group from the name of the group
/// </summary>
@ -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");
}
/// <summary>
/// Returns a Group for a ip from users.txt
/// </summary>
/// <param name="ply">string ip</param>
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");
}
/// <summary>
/// Fetches the hashed password and group for a given username
/// </summary>
/// <param name="username">string username</param>
/// <returns>string[] {password, group}</returns>
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;
}
/// <summary>
/// Returns an IPv4 address from a DNS query
/// </summary>

View file

@ -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 = {};
/// <summary>

View file

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