Merge branch 'sql' of github.com:TShock/TShock into general-devel-sql (test)
This commit is contained in:
commit
9cefc69075
23 changed files with 1369 additions and 834 deletions
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
177
TShockAPI/DB/BanManager.cs
Normal 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
46
TShockAPI/DB/DbExt.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
150
TShockAPI/DB/GroupManager.cs
Normal file
150
TShockAPI/DB/GroupManager.cs
Normal 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
88
TShockAPI/DB/ItemManager.cs
Normal file
88
TShockAPI/DB/ItemManager.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
280
TShockAPI/DB/RegionManager.cs
Normal file
280
TShockAPI/DB/RegionManager.cs
Normal 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
194
TShockAPI/DB/UserManager.cs
Normal 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";
|
||||
}
|
||||
}
|
||||
}
|
||||
162
TShockAPI/DB/WarpsManager.cs
Normal file
162
TShockAPI/DB/WarpsManager.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue