Commands /region list and /warp list now work

Regions now use User ID's for /region allow (can be IP or Username/password based ID)
Minor Tweaks
A reset of your database is recommended
This commit is contained in:
Twitchy 2011-07-09 20:41:31 +12:00
parent cb7033d89c
commit 243b0297b9
6 changed files with 156 additions and 28 deletions

View file

@ -305,6 +305,7 @@ namespace TShockAPI
if (exr[0] == encrPass) if (exr[0] == encrPass)
{ {
args.Player.Group = Tools.GetGroup(exr[1]); args.Player.Group = Tools.GetGroup(exr[1]);
args.Player.UserName = args.Parameters[0];
args.Player.SendMessage("Authenticated as " + args.Parameters[0] + " successfully.", Color.LimeGreen); args.Player.SendMessage("Authenticated as " + args.Parameters[0] + " successfully.", Color.LimeGreen);
return; return;
} }
@ -964,16 +965,18 @@ namespace TShockAPI
if (args.Parameters.Count > 1) if (args.Parameters.Count > 1)
int.TryParse(args.Parameters[1], out page); int.TryParse(args.Parameters[1], out page);
var sb = new StringBuilder(); var sb = new StringBuilder();
if (TShock.Warps.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++) for (int j = (15 * (page - 1)); j < (15 * page); j++)
{ {
if (TShock.Warps.Warps[j].WorldWarpName == Main.worldName) if (Warps[j].WorldWarpID == Main.worldID.ToString())
{ {
if (sb.Length != 0) if (sb.Length != 0)
sb.Append(", "); sb.Append(", ");
sb.Append("/").Append(TShock.Warps.Warps[j].WarpName); sb.Append("/").Append(Warps[j].WarpName);
if (j == TShock.Warps.Warps.Count - 1) if (j == Warps.Count - 1)
{ {
args.Player.SendMessage(sb.ToString(), Color.Yellow); args.Player.SendMessage(sb.ToString(), Color.Yellow);
break; break;
@ -986,7 +989,7 @@ namespace TShockAPI
} }
} }
} }
if (TShock.Warps.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); args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 1)), Color.Yellow);
} }
@ -1315,7 +1318,7 @@ namespace TShockAPI
{ {
string playerName = args.Parameters[1]; string playerName = args.Parameters[1];
string regionName = ""; string regionName = "";
string playerIP = null; string playerID = "0";
for (int i = 2; i < args.Parameters.Count; i++) for (int i = 2; i < args.Parameters.Count; i++)
{ {
@ -1328,9 +1331,18 @@ namespace TShockAPI
regionName = regionName + " " + args.Parameters[i]; regionName = regionName + " " + args.Parameters[i];
} }
} }
if ((playerIP = Tools.GetPlayerIP(playerName)) != null) if ((playerID = TShock.Users.GetUserID(Tools.FindPlayer(playerName)[0].UserName)) != "0")
{ {
if (TShock.Regions.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); args.Player.SendMessage("Added user " + playerName + " to " + regionName, Color.Yellow);
} }
@ -1346,6 +1358,44 @@ namespace TShockAPI
args.Player.SendMessage("Invalid syntax! Proper syntax: /region allow [name] [region]", Color.Red); args.Player.SendMessage("Invalid syntax! Proper syntax: /region allow [name] [region]", Color.Red);
break; 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": case "help":
default: default:
{ {

View file

@ -43,7 +43,7 @@ namespace TShockAPI.DB
using (var com = database.CreateCommand()) using (var com = database.CreateCommand())
{ {
com.CommandText = com.CommandText =
"CREATE TABLE IF NOT EXISTS 'Regions' ('X1' INTEGER(11) NOT NULL, 'Y1' INTEGER(11) NOT NULL, 'X2' INTEGER(11) NOT NULL, 'Y2' INTEGER(11) NOT NULL, 'RegionName' VARCHAR(32) NOT NULL, 'WorldID' VARCHAR(255) NOT NULL, 'UserIds' VARCHAR(255) NOT NULL, 'Protected' INTEGER(1));"; "CREATE TABLE IF NOT EXISTS 'Regions' ('X1' NUMERIC, 'Y1' NUMERIC, 'X2' NUMERIC, 'Y2' NUMERIC, 'RegionName' TEXT, 'WorldID' TEXT, 'UserIds' TEXT, 'Protected' NUMERIC);";
com.ExecuteNonQuery(); com.ExecuteNonQuery();
} }
} }
@ -139,7 +139,9 @@ namespace TShockAPI.DB
int Y2 = reader.Get<int>("Y2"); int Y2 = reader.Get<int>("Y2");
int Protected = reader.Get<int>("Protected"); int Protected = reader.Get<int>("Protected");
string MergedIDs = DbExt.Get<string>(reader, "UserIds"); string MergedIDs = DbExt.Get<string>(reader, "UserIds");
List<string> SplitIDs = ListIDs(MergedIDs);
string[] SplitIDs = MergedIDs.Split(',');
if (X >= X1 && if (X >= X1 &&
X <= X2 && X <= X2 &&
Y >= Y1 && Y >= Y1 &&
@ -190,7 +192,7 @@ namespace TShockAPI.DB
{ {
using (var com = database.CreateCommand()) using (var com = database.CreateCommand())
{ {
com.CommandText = "SELECT * FROM Regions WHERE RegionName=@name WorldID=@worldid"; com.CommandText = "SELECT * FROM Regions WHERE RegionName=@name AND WorldID=@worldid";
com.AddParameter("@name", regionName); com.AddParameter("@name", regionName);
com.AddParameter("@worldid", Main.worldID.ToString()); com.AddParameter("@worldid", Main.worldID.ToString());
@ -198,7 +200,7 @@ namespace TShockAPI.DB
{ {
if (reader.Read()) if (reader.Read())
{ {
MergedIDs = DbExt.Get<string>(reader, "UserIds"); MergedIDs = reader.Get<string>("UserIds");
} }
} }
@ -207,10 +209,8 @@ namespace TShockAPI.DB
else else
MergedIDs = MergedIDs + "," + ID; MergedIDs = MergedIDs + "," + ID;
com.CommandText = "UPDATE Regions SET UserIds='@ids' WHERE RegionName=@name WorldID=@worldid"; com.CommandText = "UPDATE Regions SET UserIds=@ids";
com.AddParameter("@ids", MergedIDs); com.AddParameter("@ids", MergedIDs);
com.AddParameter("@name", regionName);
com.AddParameter("@worldid", Main.worldID.ToString());
if (com.ExecuteNonQuery() > 0) if (com.ExecuteNonQuery() > 0)
return true; return true;
else else
@ -223,30 +223,51 @@ namespace TShockAPI.DB
return false; 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)
{
}
return Regions;
}
} }
public class Region public class Region
{ {
public Rectangle RegionArea { get; set; } public Rectangle RegionArea { get; set; }
public string RegionName { get; set; } public string RegionName { get; set; }
public bool DisableBuild { get; set; } public int DisableBuild { get; set; }
public string WorldRegionName { get; set; } public string RegionWorldID { get; set; }
public string RegionAllowedIDs { get; set; } public string RegionAllowedIDs { get; set; }
public Region(Rectangle region, string name, bool disablebuild, string worldname) public Region(Rectangle region, string name, int disablebuild, string worldname)
{ {
RegionArea = region; RegionArea = region;
RegionName = name; RegionName = name;
DisableBuild = disablebuild; DisableBuild = disablebuild;
WorldRegionName = worldname; RegionWorldID = worldname;
} }
public Region() public Region()
{ {
RegionArea = Rectangle.Empty; RegionArea = Rectangle.Empty;
RegionName = string.Empty; RegionName = string.Empty;
DisableBuild = true; DisableBuild = 1;
WorldRegionName = string.Empty; RegionWorldID = string.Empty;
} }
} }
} }

View file

@ -137,8 +137,45 @@ namespace TShockAPI.DB
} }
catch (SqliteExecutionException ex) catch (SqliteExecutionException ex)
{ {
} }
return Tools.GetGroup("default"); 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)
{
}
return "0";
}
} }
} }

View file

@ -34,8 +34,6 @@ namespace TShockAPI.DB
{ {
private IDbConnection database; private IDbConnection database;
public List<Warp> Warps = new List<Warp>();
public WarpManager(IDbConnection db) public WarpManager(IDbConnection db)
{ {
database = db; database = db;
@ -43,7 +41,7 @@ namespace TShockAPI.DB
using (var com = database.CreateCommand()) using (var com = database.CreateCommand())
{ {
com.CommandText = com.CommandText =
"CREATE TABLE IF NOT EXISTS 'Warps' ('X' INTEGER(11) NOT NULL, 'Y' INTEGER(11) NOT NULL, 'WarpName' TEXT UNIQUE, 'WorldID' TEXT);"; "CREATE TABLE IF NOT EXISTS 'Warps' ('X' NUMERIC, 'Y' NUMERIC, 'WarpName' TEXT UNIQUE, 'WorldID' TEXT);";
com.ExecuteNonQuery(); com.ExecuteNonQuery();
} }
} }
@ -109,26 +107,47 @@ namespace TShockAPI.DB
} }
return new Warp(); 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)
{
}
return Warps;
}
} }
public class Warp public class Warp
{ {
public Vector2 WarpPos { get; set; } public Vector2 WarpPos { get; set; }
public string WarpName { get; set; } public string WarpName { get; set; }
public string WorldWarpName { get; set; } public string WorldWarpID { get; set; }
public Warp(Vector2 warppos, string name, string worldname) public Warp(Vector2 warppos, string name, string worldname)
{ {
WarpPos = warppos; WarpPos = warppos;
WarpName = name; WarpName = name;
WorldWarpName = worldname; WorldWarpID = worldname;
} }
public Warp() public Warp()
{ {
WarpPos = Vector2.Zero; WarpPos = Vector2.Zero;
WarpName = null; WarpName = null;
WorldWarpName = string.Empty; WorldWarpID = string.Empty;
} }
} }
} }

View file

@ -259,7 +259,7 @@ namespace TShockAPI
return true; 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)))
{ {
args.Player.SendMessage("Region protected from changes.", Color.Red); args.Player.SendMessage("Region protected from changes.", Color.Red);
args.Player.SendTileSquare(x, y); args.Player.SendTileSquare(x, y);

View file

@ -42,6 +42,7 @@ namespace TShockAPI
public Vector2 oldSpawn = Vector2.Zero; public Vector2 oldSpawn = Vector2.Zero;
public TSPlayer LastWhisper; public TSPlayer LastWhisper;
public int LoginAttempts { get; set; } public int LoginAttempts { get; set; }
public string UserName { get; set; }
Player FakePlayer = null; Player FakePlayer = null;