mirror of
https://github.com/RaidMax/IW4M-Admin.git
synced 2025-06-10 15:20:48 -05:00
-removes flag penality when unflagging a player
-fixed 'just now ago' on webfront -webfront playerlist level colors are hidden to non admin users -tempban length can now be specified (<int>m, <int>h, <int>d, <int>y)
This commit is contained in:
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Linq;
|
||||
using SharedLibrary.Network;
|
||||
using SharedLibrary.Helpers;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SharedLibrary.Commands
|
||||
@ -96,10 +97,15 @@ namespace SharedLibrary.Commands
|
||||
{
|
||||
E.Target.lastOffense = Utilities.RemoveWords(E.Data, 1);
|
||||
String Message = E.Target.lastOffense;
|
||||
var length = Message.ParseTimespan();
|
||||
|
||||
if (length.TotalHours != 1)
|
||||
Message = Utilities.RemoveWords(Message, 1);
|
||||
|
||||
if (E.Origin.Level > E.Target.Level)
|
||||
{
|
||||
await E.Target.TempBan(Message, E.Origin);
|
||||
await E.Origin.Tell($"Successfully temp banned {E.Target.Name}");
|
||||
await E.Target.TempBan(Message, length, E.Origin);
|
||||
await E.Origin.Tell($"Successfully temp banned ^5{E.Target.Name} ^7for ^5{length.TimeSpanText()}");
|
||||
}
|
||||
else
|
||||
await E.Origin.Tell("You cannot temp ban " + E.Target.Name);
|
||||
@ -391,7 +397,7 @@ namespace SharedLibrary.Commands
|
||||
|
||||
foreach (Player P in db_players)
|
||||
{
|
||||
String mesg = String.Format("[^3{0}^7] [^3@{1}^7] - [{2}^7] - {3} | last seen {4} ago", P.Name, P.DatabaseID, Utilities.ConvertLevelToColor(P.Level), P.IP, P.GetLastConnection());
|
||||
String mesg = String.Format("[^3{0}^7] [^3@{1}^7] - [{2}^7] - {3} | last seen {4}", P.Name, P.DatabaseID, Utilities.ConvertLevelToColor(P.Level), P.IP, P.GetLastConnection());
|
||||
await E.Origin.Tell(mesg);
|
||||
}
|
||||
}
|
||||
@ -510,6 +516,7 @@ namespace SharedLibrary.Commands
|
||||
if (E.Target.Level == Player.Permission.Flagged)
|
||||
{
|
||||
E.Target.SetLevel(Player.Permission.User);
|
||||
E.Owner.Manager.GetClientPenalties().RemovePenalty(new Penalty(Penalty.Type.Flag, "", E.Target.NetworkID, "", DateTime.Now, "", DateTime.Now));
|
||||
await E.Origin.Tell("You have ^5unflagged ^7" + E.Target.Name);
|
||||
}
|
||||
|
||||
@ -517,7 +524,7 @@ namespace SharedLibrary.Commands
|
||||
{
|
||||
E.Data = Utilities.RemoveWords(E.Data, 1);
|
||||
E.Target.SetLevel(Player.Permission.Flagged);
|
||||
E.Owner.Manager.GetClientPenalties().AddPenalty(new Penalty(Penalty.Type.Flag, E.Data, E.Target.NetworkID, E.Origin.NetworkID, DateTime.Now, E.Target.IP));
|
||||
E.Owner.Manager.GetClientPenalties().AddPenalty(new Penalty(Penalty.Type.Flag, E.Data, E.Target.NetworkID, E.Origin.NetworkID, DateTime.Now, E.Target.IP, DateTime.Now));
|
||||
await E.Owner.ExecuteEvent(new Event(Event.GType.Flag, E.Data, E.Origin, E.Target, E.Owner));
|
||||
await E.Origin.Tell("You have ^5flagged ^7" + E.Target.Name);
|
||||
}
|
||||
@ -617,7 +624,7 @@ namespace SharedLibrary.Commands
|
||||
}
|
||||
|
||||
var B = E.Owner.Manager.GetClientPenalties().FindPenalties(E.Target);
|
||||
var BannedPenalty = B.Find(b => b.BType == Penalty.Type.Ban);
|
||||
var BannedPenalty = B.Find(b => b.BType > Penalty.Type.Kick && b.Expires > DateTime.Now);
|
||||
|
||||
if (BannedPenalty == null)
|
||||
{
|
||||
@ -627,13 +634,7 @@ namespace SharedLibrary.Commands
|
||||
|
||||
Player Banner = E.Owner.Manager.GetClientDatabase().GetPlayer(BannedPenalty.PenaltyOriginID, -1);
|
||||
|
||||
if (Banner == null)
|
||||
{
|
||||
await E.Origin.Tell("Ban was found for the player, but origin of the ban is unavailable.");
|
||||
return;
|
||||
}
|
||||
|
||||
await E.Origin.Tell(String.Format("^1{0} ^7was banned by ^5{1} ^7for: {2}", E.Target.Name, Banner.Name, BannedPenalty.Reason));
|
||||
await E.Origin.Tell(String.Format("^1{0} ^7was banned by ^5{1} ^7for: {2} {3}", E.Target.Name, Banner?.Name ?? "IW4MAdmin", BannedPenalty.Reason, BannedPenalty.BType == Penalty.Type.TempBan ? $"({(BannedPenalty.Expires - DateTime.Now).TimeSpanText()} remaining)" : ""));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -227,7 +227,7 @@ namespace SharedLibrary
|
||||
{
|
||||
String Create = "CREATE TABLE [CLIENTS] ( [Name] TEXT NULL, [npID] TEXT NULL, [Number] INTEGER PRIMARY KEY AUTOINCREMENT, [Level] INT DEFAULT 0 NULL, [LastOffense] TEXT NULL, [Connections] INT DEFAULT 1 NULL, [IP] TEXT NULL, [LastConnection] TEXT NULL, [UID] TEXT NULL, [Masked] INT DEFAULT 0, [Reserved] INT DEFAULT 0);";
|
||||
ExecuteNonQuery(Create);
|
||||
Create = "CREATE TABLE [BANS] ( [TYPE] TEXT NULL, [Reason] TEXT NULL, [npID] TEXT NULL, [bannedByID] TEXT NULL, [IP] TEXT NULL, [TIME] TEXT NULL);";
|
||||
Create = "CREATE TABLE [BANS] ( [TYPE] TEXT NULL, [Reason] TEXT NULL, [npID] TEXT NULL, [bannedByID] TEXT NULL, [IP] TEXT NULL, [TIME] TEXT NULL, [EXPIRES] TEXT);";
|
||||
ExecuteNonQuery(Create);
|
||||
}
|
||||
}
|
||||
@ -453,7 +453,7 @@ namespace SharedLibrary
|
||||
if (Row["TYPE"].ToString().Length != 0)
|
||||
BanType = (Penalty.Type)Enum.Parse(typeof(Penalty.Type), Row["TYPE"].ToString());
|
||||
|
||||
ClientPenalties.Add(new Penalty(BanType, Row["Reason"].ToString().Trim(), Row["npID"].ToString(), Row["bannedByID"].ToString(), DateTime.Parse(Row["TIME"].ToString()), Row["IP"].ToString()));
|
||||
ClientPenalties.Add(new Penalty(BanType, Row["Reason"].ToString().Trim(), Row["npID"].ToString(), Row["bannedByID"].ToString(), DateTime.Parse(Row["TIME"].ToString()), Row["IP"].ToString(), DateTime.Parse(Row["EXPIRES"].ToString())));
|
||||
|
||||
}
|
||||
|
||||
@ -470,12 +470,8 @@ namespace SharedLibrary
|
||||
if (Row["TIME"].ToString().Length < 2) //compatibility with my old database
|
||||
Row["TIME"] = DateTime.Now.ToString();
|
||||
|
||||
Penalty.Type BanType = Penalty.Type.Ban;
|
||||
if (Row["TYPE"].ToString().Length != 0)
|
||||
BanType = (Penalty.Type)Enum.Parse(typeof(Penalty.Type), Row["TYPE"].ToString());
|
||||
|
||||
ClientPenalties.Add(new Penalty(BanType, Row["Reason"].ToString().Trim(), Row["npID"].ToString(), Row["bannedByID"].ToString(), DateTime.Parse(Row["TIME"].ToString()), Row["IP"].ToString()));
|
||||
|
||||
var BanType = (Penalty.Type)Enum.Parse(typeof(Penalty.Type), Row["TYPE"].ToString());
|
||||
ClientPenalties.Add(new Penalty(BanType, Row["Reason"].ToString().Trim(), Row["npID"].ToString(), Row["bannedByID"].ToString(), DateTime.Parse(Row["TIME"].ToString()), Row["IP"].ToString(), DateTime.Parse(Row["EXPIRES"].ToString())));
|
||||
}
|
||||
|
||||
return ClientPenalties;
|
||||
@ -542,7 +538,7 @@ namespace SharedLibrary
|
||||
|
||||
|
||||
//Add specified ban to database
|
||||
public void AddBan(Penalty B)
|
||||
public void AddPenalty(Penalty B)
|
||||
{
|
||||
Dictionary<String, object> newBan = new Dictionary<String, object>
|
||||
{
|
||||
@ -551,7 +547,8 @@ namespace SharedLibrary
|
||||
{ "bannedByID", B.PenaltyOriginID },
|
||||
{ "IP", B.IP },
|
||||
{ "TIME", Utilities.DateTimeSQLite(DateTime.Now) },
|
||||
{ "TYPE", B.BType }
|
||||
{ "TYPE", B.BType },
|
||||
{ "EXPIRES", B.Expires }
|
||||
};
|
||||
Insert("BANS", newBan);
|
||||
}
|
||||
|
@ -5,12 +5,13 @@ namespace SharedLibrary
|
||||
{
|
||||
public class Penalty
|
||||
{
|
||||
public Penalty(Type BType, String Reas, String TargID, String From, DateTime time, String ip)
|
||||
public Penalty(Type BType, String Reas, String TargID, String From, DateTime time, String ip, DateTime exp)
|
||||
{
|
||||
Reason = Reas.CleanChars().StripColors();
|
||||
OffenderID = TargID;
|
||||
PenaltyOriginID = From;
|
||||
When = time;
|
||||
Expires = exp;
|
||||
IP = ip;
|
||||
this.BType = BType;
|
||||
}
|
||||
@ -34,6 +35,7 @@ namespace SharedLibrary
|
||||
public String OffenderID { get; private set; }
|
||||
public String PenaltyOriginID { get; private set; }
|
||||
public DateTime When { get; private set; }
|
||||
public DateTime Expires { get; private set; }
|
||||
public String IP { get; private set; }
|
||||
public Type BType { get; private set; }
|
||||
}
|
||||
|
@ -154,9 +154,9 @@ namespace SharedLibrary
|
||||
await lastEvent.Owner.Kick(Message, this, Sender);
|
||||
}
|
||||
|
||||
public async Task TempBan(String Message, Player Sender)
|
||||
public async Task TempBan(String Message, TimeSpan Length, Player Sender)
|
||||
{
|
||||
await lastEvent.Owner.TempBan(Message, this, Sender);
|
||||
await lastEvent.Owner.TempBan(Message, Length, this, Sender);
|
||||
}
|
||||
|
||||
public async Task Warn(String Message, Player Sender)
|
||||
|
@ -210,7 +210,7 @@ namespace SharedLibrary
|
||||
/// </summary>
|
||||
/// <param name="Reason">Reason for banning the player</param>
|
||||
/// <param name="Target">The player to ban</param>
|
||||
abstract public Task TempBan(String Reason, Player Target, Player Origin);
|
||||
abstract public Task TempBan(String Reason, TimeSpan length, Player Target, Player Origin);
|
||||
|
||||
/// <summary>
|
||||
/// Perm ban a player from the server
|
||||
|
@ -25,6 +25,7 @@
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
<CodeAnalysisRuleSet>..\..\..\RuleSet1.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
|
@ -229,23 +229,23 @@ namespace SharedLibrary
|
||||
if (Elapsed.TotalMinutes < 120)
|
||||
{
|
||||
if (Elapsed.TotalMinutes < 1.5)
|
||||
return "1 minute";
|
||||
return Math.Round(Elapsed.TotalMinutes, 0) + " minutes";
|
||||
return "1 minute ago";
|
||||
return Math.Round(Elapsed.TotalMinutes, 0) + " minutes ago";
|
||||
}
|
||||
if (Elapsed.TotalHours <= 24)
|
||||
{
|
||||
if (Elapsed.TotalHours < 1.5)
|
||||
return "1 hour";
|
||||
return Math.Round(Elapsed.TotalHours, 0) + " hours";
|
||||
return "1 hour ago";
|
||||
return Math.Round(Elapsed.TotalHours, 0) + " hours ago";
|
||||
}
|
||||
if (Elapsed.TotalDays <= 365)
|
||||
{
|
||||
if (Elapsed.TotalDays < 1.5)
|
||||
return "1 day";
|
||||
return Math.Round(Elapsed.TotalDays, 0) + " days";
|
||||
return "1 day ago";
|
||||
return Math.Round(Elapsed.TotalDays, 0) + " days ago";
|
||||
}
|
||||
else
|
||||
return "a very long time";
|
||||
return "a very long time ago";
|
||||
}
|
||||
|
||||
public static Game GetGame(string gameName)
|
||||
@ -263,5 +263,48 @@ namespace SharedLibrary
|
||||
|
||||
return Game.UKN;
|
||||
}
|
||||
|
||||
public static TimeSpan ParseTimespan(this string input)
|
||||
{
|
||||
var expressionMatch = Regex.Match(input, @"[0-9]+.\b");
|
||||
|
||||
if (!expressionMatch.Success) // fallback to default tempban length of 1 hour
|
||||
return new TimeSpan(1, 0, 0);
|
||||
|
||||
char lengthDenote = expressionMatch.Value[expressionMatch.Value.Length - 1];
|
||||
int length = Int32.Parse(expressionMatch.Value.Substring(0, expressionMatch.Value.Length - 1));
|
||||
|
||||
switch (lengthDenote)
|
||||
{
|
||||
case 'm':
|
||||
return new TimeSpan(0, length, 0);
|
||||
case 'h':
|
||||
return new TimeSpan(length, 0, 0);
|
||||
case 'd':
|
||||
return new TimeSpan(length, 0, 0, 0);
|
||||
case 'w':
|
||||
return new TimeSpan(length * 7, 0, 0, 0);
|
||||
case 'y':
|
||||
return new TimeSpan(length * 365, 0, 0, 0);
|
||||
default:
|
||||
return new TimeSpan(1, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public static string TimeSpanText(this TimeSpan span)
|
||||
{
|
||||
if (span.TotalMinutes < 6)
|
||||
return $"{span.Minutes} minutes";
|
||||
else if (span.TotalHours < 24)
|
||||
return $"{span.Hours} hours";
|
||||
else if (span.TotalDays < 7)
|
||||
return $"{span.Days} days";
|
||||
else if (span.TotalDays > 7 && span.TotalDays < 365)
|
||||
return $"{Math.Ceiling(span.Days / 7.0)} weeks";
|
||||
else if (span.TotalDays >= 365)
|
||||
return $"{Math.Ceiling(span.Days / 365.0)} years";
|
||||
|
||||
return "1 hour";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user