update map names for IW4 (issue #48)
only check shared GUID for IW4 optimized get privileged clients query fine-tuned the version printout to include revision numbers
This commit is contained in:
parent
a786541484
commit
98adfb12d2
@ -5,7 +5,7 @@
|
|||||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||||
<MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>
|
<MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>
|
||||||
<PackageId>RaidMax.IW4MAdmin.Application</PackageId>
|
<PackageId>RaidMax.IW4MAdmin.Application</PackageId>
|
||||||
<Version>2.1.9</Version>
|
<Version>2.1.9.1</Version>
|
||||||
<Authors>RaidMax</Authors>
|
<Authors>RaidMax</Authors>
|
||||||
<Company>Forever None</Company>
|
<Company>Forever None</Company>
|
||||||
<Product>IW4MAdmin</Product>
|
<Product>IW4MAdmin</Product>
|
||||||
|
@ -171,7 +171,7 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"Alias": "IW4 Credits",
|
"Alias": "Test map",
|
||||||
"Name": "iw4_credits"
|
"Name": "iw4_credits"
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -190,6 +190,11 @@
|
|||||||
"Name": "mp_cargoship_sh"
|
"Name": "mp_cargoship_sh"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"Alias": "Cargoship",
|
||||||
|
"Name": "mp_cargoship"
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"Alias": "Shipment",
|
"Alias": "Shipment",
|
||||||
"Name": "mp_shipment"
|
"Name": "mp_shipment"
|
||||||
@ -216,23 +221,43 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"Alias": "Favela - Tropical",
|
"Alias": "Tropical Favela",
|
||||||
"Name": "mp_fav_tropical"
|
"Name": "mp_fav_tropical"
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"Alias": "Estate - Tropical",
|
"Alias": "Tropical Estate",
|
||||||
"Name": "mp_estate_tropical"
|
"Name": "mp_estate_tropical"
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"Alias": "Crash - Tropical",
|
"Alias": "Tropical Crash",
|
||||||
"Name": "mp_crash_tropical"
|
"Name": "mp_crash_tropical"
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"Alias": "Forgotten City",
|
"Alias": "Forgotten City",
|
||||||
"Name": "mp_bloc_sh"
|
"Name": "mp_bloc_sh"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"Alias": "Crossfire",
|
||||||
|
"Name": "mp_cross_fire"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"Alias": "Bloc",
|
||||||
|
"Name": "mp_bloc"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"Alias": "Oilrig",
|
||||||
|
"Name": "oilrig"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"Name": "Village",
|
||||||
|
"Alias": "co_hunted"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -18,23 +18,23 @@ namespace IW4MAdmin.Application
|
|||||||
{
|
{
|
||||||
Manager = mgr;
|
Manager = mgr;
|
||||||
OutOfOrderEvents = new SortedList<long, GameEvent>();
|
OutOfOrderEvents = new SortedList<long, GameEvent>();
|
||||||
IsProcessingEvent = new SemaphoreSlim(2, 2);
|
IsProcessingEvent = new SemaphoreSlim(1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddEvent(GameEvent gameEvent)
|
public void AddEvent(GameEvent gameEvent)
|
||||||
{
|
{
|
||||||
IsProcessingEvent.Wait();
|
// IsProcessingEvent.Wait();
|
||||||
((Manager as ApplicationManager).OnServerEvent)(this, new GameEventArgs(null, false, gameEvent));
|
((Manager as ApplicationManager).OnServerEvent)(this, new GameEventArgs(null, false, gameEvent));
|
||||||
if (gameEvent.Type == GameEvent.EventType.Connect)
|
// IsProcessingEvent.Release(1);
|
||||||
{
|
//if (gameEvent.Type == GameEvent.EventType.Connect)
|
||||||
IsProcessingEvent.Wait();
|
//{
|
||||||
if (!gameEvent.OnProcessed.Wait(30 * 1000))
|
// IsProcessingEvent.Wait();
|
||||||
{
|
// if (!gameEvent.OnProcessed.Wait(10 * 1000))
|
||||||
Manager.GetLogger().WriteError($"{Utilities.CurrentLocalization.LocalizationIndex["SERVER_ERROR_COMMAND_TIMEOUT"]} [{gameEvent.Id}, {gameEvent.Type}]");
|
// {
|
||||||
}
|
// Manager.GetLogger().WriteError($"{Utilities.CurrentLocalization.LocalizationIndex["SERVER_ERROR_COMMAND_TIMEOUT"]} [{gameEvent.Id}, {gameEvent.Type}]");
|
||||||
IsProcessingEvent.Release(1);
|
// }
|
||||||
}
|
// IsProcessingEvent.Release(1);
|
||||||
IsProcessingEvent.Release(1);
|
//}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
|
@ -23,20 +23,16 @@ namespace IW4MAdmin.Application
|
|||||||
public static void Main(string[] args)
|
public static void Main(string[] args)
|
||||||
{
|
{
|
||||||
AppDomain.CurrentDomain.SetData("DataDirectory", OperatingDirectory);
|
AppDomain.CurrentDomain.SetData("DataDirectory", OperatingDirectory);
|
||||||
//System.Diagnostics.Process.GetCurrentProcess().PriorityClass = System.Diagnostics.ProcessPriorityClass.BelowNormal;
|
|
||||||
|
|
||||||
Console.OutputEncoding = Encoding.UTF8;
|
Console.OutputEncoding = Encoding.UTF8;
|
||||||
Console.ForegroundColor = ConsoleColor.Gray;
|
Console.ForegroundColor = ConsoleColor.Gray;
|
||||||
|
|
||||||
Version = Assembly.GetExecutingAssembly().GetName().Version.Major +
|
Version = Utilities.GetVersionAsDouble();
|
||||||
Assembly.GetExecutingAssembly().GetName().Version.Minor / 10.0f +
|
|
||||||
Assembly.GetExecutingAssembly().GetName().Version.Build / 100.0f;
|
|
||||||
Version = Math.Round(Version, 3);
|
|
||||||
|
|
||||||
Console.WriteLine("=====================================================");
|
Console.WriteLine("=====================================================");
|
||||||
Console.WriteLine(" IW4M ADMIN");
|
Console.WriteLine(" IW4M ADMIN");
|
||||||
Console.WriteLine(" by RaidMax ");
|
Console.WriteLine(" by RaidMax ");
|
||||||
Console.WriteLine($" Version {Version.ToString("0.00")}");
|
Console.WriteLine($" Version {Utilities.GetVersionAsString()}");
|
||||||
Console.WriteLine("=====================================================");
|
Console.WriteLine("=====================================================");
|
||||||
|
|
||||||
Index loc = null;
|
Index loc = null;
|
||||||
@ -111,7 +107,7 @@ namespace IW4MAdmin.Application
|
|||||||
var consoleTask = Task.Run(async () =>
|
var consoleTask = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
String userInput;
|
String userInput;
|
||||||
Player Origin = ServerManager.GetClientService().Get(1).Result.AsPlayer();
|
Player Origin = Utilities.IW4MAdminClient;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
@ -263,6 +263,7 @@ namespace IW4MAdmin.Application
|
|||||||
await new ContextSeed(db).Seed();
|
await new ContextSeed(db).Seed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo: optimize this
|
||||||
var ipList = (await ClientSvc.Find(c => c.Level > Player.Permission.Trusted))
|
var ipList = (await ClientSvc.Find(c => c.Level > Player.Permission.Trusted))
|
||||||
.Select(c => new
|
.Select(c => new
|
||||||
{
|
{
|
||||||
|
@ -206,7 +206,7 @@ namespace IW4MAdmin
|
|||||||
if (currentBan != null)
|
if (currentBan != null)
|
||||||
{
|
{
|
||||||
Logger.WriteInfo($"Banned client {player} trying to connect...");
|
Logger.WriteInfo($"Banned client {player} trying to connect...");
|
||||||
var autoKickClient = (await Manager.GetClientService().Get(1)).AsPlayer();
|
var autoKickClient = Utilities.IW4MAdminClient;
|
||||||
autoKickClient.CurrentServer = this;
|
autoKickClient.CurrentServer = this;
|
||||||
|
|
||||||
// the player is permanently banned
|
// the player is permanently banned
|
||||||
@ -847,7 +847,7 @@ namespace IW4MAdmin
|
|||||||
{
|
{
|
||||||
if (Target.Warnings >= 4)
|
if (Target.Warnings >= 4)
|
||||||
{
|
{
|
||||||
await Target.Kick(loc["SERVER_WARNLIMT_REACHED"], (await Manager.GetClientService().Get(1)).AsPlayer());
|
await Target.Kick(loc["SERVER_WARNLIMT_REACHED"], Utilities.IW4MAdminClient);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,9 +4,15 @@ var plugin = {
|
|||||||
name: 'Shared GUID Kicker Plugin',
|
name: 'Shared GUID Kicker Plugin',
|
||||||
|
|
||||||
onEventAsync: function (gameEvent, server) {
|
onEventAsync: function (gameEvent, server) {
|
||||||
// connect event
|
// make sure we only check for IW4(x)
|
||||||
|
if (server.GameName !== 2) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// connect or join event
|
||||||
if (gameEvent.Type === 3 ||
|
if (gameEvent.Type === 3 ||
|
||||||
gameEvent.Type === 4) {
|
gameEvent.Type === 4) {
|
||||||
|
// this GUID seems to have been packed in a IW4 torrent and results in an unreasonable amount of people using the same GUID
|
||||||
if (gameEvent.Origin.NetworkId === -805366929435212061) {
|
if (gameEvent.Origin.NetworkId === -805366929435212061) {
|
||||||
gameEvent.Origin.Kick('Your GUID is generic. Delete players/guids.dat and rejoin', _IW4MAdminClient);
|
gameEvent.Origin.Kick('Your GUID is generic. Delete players/guids.dat and rejoin', _IW4MAdminClient);
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using static SharedLibraryCore.Objects.Player;
|
||||||
|
|
||||||
namespace SharedLibraryCore.Dtos
|
namespace SharedLibraryCore.Dtos
|
||||||
{
|
{
|
||||||
@ -10,5 +11,7 @@ namespace SharedLibraryCore.Dtos
|
|||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public int ClientId { get; set; }
|
public int ClientId { get; set; }
|
||||||
|
public int LinkId { get; set; }
|
||||||
|
public Permission Level { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ using SharedLibraryCore.Database.Models;
|
|||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using SharedLibraryCore.Objects;
|
using SharedLibraryCore.Objects;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using SharedLibraryCore.Dtos;
|
||||||
|
|
||||||
namespace SharedLibraryCore.Services
|
namespace SharedLibraryCore.Services
|
||||||
{
|
{
|
||||||
@ -94,10 +95,9 @@ namespace SharedLibraryCore.Services
|
|||||||
{
|
{
|
||||||
return await Task.Run(() =>
|
return await Task.Run(() =>
|
||||||
{
|
{
|
||||||
using (var context = new DatabaseContext())
|
using (var context = new DatabaseContext(true))
|
||||||
{
|
{
|
||||||
return context.Clients
|
return context.Clients
|
||||||
.AsNoTracking()
|
|
||||||
.Include(c => c.CurrentAlias)
|
.Include(c => c.CurrentAlias)
|
||||||
.Include(c => c.AliasLink.Children)
|
.Include(c => c.AliasLink.Children)
|
||||||
.Where(e).ToList();
|
.Where(e).ToList();
|
||||||
@ -107,11 +107,8 @@ namespace SharedLibraryCore.Services
|
|||||||
|
|
||||||
public async Task<EFClient> Get(int entityID)
|
public async Task<EFClient> Get(int entityID)
|
||||||
{
|
{
|
||||||
using (var context = new DatabaseContext())
|
using (var context = new DatabaseContext(true))
|
||||||
{
|
{
|
||||||
context.ChangeTracker.AutoDetectChangesEnabled = false;
|
|
||||||
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
|
|
||||||
|
|
||||||
var iqClient = from client in context.Clients
|
var iqClient = from client in context.Clients
|
||||||
.Include(c => c.CurrentAlias)
|
.Include(c => c.CurrentAlias)
|
||||||
.Include(c => c.AliasLink.Children)
|
.Include(c => c.AliasLink.Children)
|
||||||
@ -128,6 +125,9 @@ namespace SharedLibraryCore.Services
|
|||||||
linkedClient.NetworkId
|
linkedClient.NetworkId
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
#if DEBUG == true
|
||||||
|
var clientSql = iqClient.ToSql();
|
||||||
|
#endif
|
||||||
var foundClient = await iqClient.FirstOrDefaultAsync();
|
var foundClient = await iqClient.FirstOrDefaultAsync();
|
||||||
|
|
||||||
if (foundClient == null)
|
if (foundClient == null)
|
||||||
@ -143,15 +143,19 @@ namespace SharedLibraryCore.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<EFClient> GetUnique(long entityAttribute)
|
private static readonly Func<DatabaseContext, long, Task<EFClient>> _getUniqueQuery =
|
||||||
{
|
EF.CompileAsyncQuery((DatabaseContext context, long networkId) =>
|
||||||
using (var context = new DatabaseContext())
|
context.Clients
|
||||||
{
|
|
||||||
return await context.Clients
|
|
||||||
.AsNoTracking()
|
|
||||||
.Include(c => c.CurrentAlias)
|
.Include(c => c.CurrentAlias)
|
||||||
.Include(c => c.AliasLink.Children)
|
.Include(c => c.AliasLink.Children)
|
||||||
.SingleOrDefaultAsync(c => c.NetworkId == entityAttribute);
|
.FirstOrDefault(c => c.NetworkId == networkId)
|
||||||
|
);
|
||||||
|
|
||||||
|
public async Task<EFClient> GetUnique(long entityAttribute)
|
||||||
|
{
|
||||||
|
using (var context = new DatabaseContext(true))
|
||||||
|
{
|
||||||
|
return await _getUniqueQuery(context, entityAttribute);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -219,7 +223,7 @@ namespace SharedLibraryCore.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#region ServiceSpecific
|
#region ServiceSpecific
|
||||||
public async Task<IList<EFClient>> GetOwners()
|
public async Task<IList<EFClient>> GetOwners()
|
||||||
{
|
{
|
||||||
using (var context = new DatabaseContext())
|
using (var context = new DatabaseContext())
|
||||||
@ -228,32 +232,24 @@ namespace SharedLibraryCore.Services
|
|||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<bool> IsAuthenticated(int clientIP)
|
public async Task<IList<ClientInfo>> GetPrivilegedClients()
|
||||||
{
|
{
|
||||||
using (var context = new DatabaseContext())
|
using (var context = new DatabaseContext(disableTracking: true))
|
||||||
{
|
{
|
||||||
var iqMatching = from alias in context.Aliases
|
|
||||||
where alias.IPAddress == clientIP
|
|
||||||
join client in context.Clients
|
|
||||||
on alias.LinkId equals client.AliasLinkId
|
|
||||||
where client.Level > Player.Permission.Trusted
|
|
||||||
select client;
|
|
||||||
|
|
||||||
return (await iqMatching.CountAsync()) > 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<IList<EFClient>> GetPrivilegedClients()
|
|
||||||
{
|
|
||||||
using (var context = new DatabaseContext())
|
|
||||||
{
|
|
||||||
context.ChangeTracker.AutoDetectChangesEnabled = false;
|
|
||||||
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
|
|
||||||
|
|
||||||
var iqClients = from client in context.Clients
|
var iqClients = from client in context.Clients
|
||||||
.Include(c => c.CurrentAlias)
|
|
||||||
where client.Level >= Player.Permission.Trusted
|
where client.Level >= Player.Permission.Trusted
|
||||||
select client;
|
where client.Active
|
||||||
|
select new ClientInfo()
|
||||||
|
{
|
||||||
|
ClientId = client.ClientId,
|
||||||
|
Name = client.CurrentAlias.Name,
|
||||||
|
LinkId = client.AliasLinkId,
|
||||||
|
Level = client.Level
|
||||||
|
};
|
||||||
|
|
||||||
|
#if DEBUG == true
|
||||||
|
var clientsSql = iqClients.ToSql();
|
||||||
|
#endif
|
||||||
|
|
||||||
return await iqClients.ToListAsync();
|
return await iqClients.ToListAsync();
|
||||||
}
|
}
|
||||||
@ -356,6 +352,6 @@ namespace SharedLibraryCore.Services
|
|||||||
using (var context = new DatabaseContext())
|
using (var context = new DatabaseContext())
|
||||||
return await context.Clients.SumAsync(c => c.TotalConnectionTime);
|
return await context.Clients.SumAsync(c => c.TotalConnectionTime);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -507,6 +507,14 @@ namespace SharedLibraryCore
|
|||||||
return response.FirstOrDefault(r => r[0] == '\\')?.DictionaryFromKeyValue();
|
return response.FirstOrDefault(r => r[0] == '\\')?.DictionaryFromKeyValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static double GetVersionAsDouble()
|
||||||
|
{
|
||||||
|
string version = Assembly.GetCallingAssembly().GetName().Version.ToString();
|
||||||
|
version = version.Replace(".", "");
|
||||||
|
return double.Parse(version) / 1000.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetVersionAsString() => Assembly.GetCallingAssembly().GetName().Version.ToString();
|
||||||
|
|
||||||
#if DEBUG == true
|
#if DEBUG == true
|
||||||
|
|
||||||
@ -530,7 +538,7 @@ namespace SharedLibraryCore
|
|||||||
var queryCompilationContext = databaseDependencies.QueryCompilationContextFactory.Create(false);
|
var queryCompilationContext = databaseDependencies.QueryCompilationContextFactory.Create(false);
|
||||||
var modelVisitor = (RelationalQueryModelVisitor)queryCompilationContext.CreateQueryModelVisitor();
|
var modelVisitor = (RelationalQueryModelVisitor)queryCompilationContext.CreateQueryModelVisitor();
|
||||||
modelVisitor.CreateQueryExecutor<TEntity>(queryModel);
|
modelVisitor.CreateQueryExecutor<TEntity>(queryModel);
|
||||||
var sql = modelVisitor.Queries.First().ToString();
|
var sql = modelVisitor.Queries.First().ToString().Replace("\"", "`");
|
||||||
|
|
||||||
return sql;
|
return sql;
|
||||||
}
|
}
|
||||||
|
@ -119,9 +119,8 @@ namespace WebfrontCore.Controllers
|
|||||||
public async Task<IActionResult> PrivilegedAsync()
|
public async Task<IActionResult> PrivilegedAsync()
|
||||||
{
|
{
|
||||||
var admins = (await Manager.GetClientService().GetPrivilegedClients())
|
var admins = (await Manager.GetClientService().GetPrivilegedClients())
|
||||||
.Where(a => a.Active)
|
.OrderByDescending(a => a.Level)
|
||||||
.OrderByDescending(a => a.Level).ThenByDescending(a => a.LastConnection)
|
.GroupBy(a => a.LinkId).Select(a => a.First());
|
||||||
.GroupBy(a => a.AliasLinkId).Select(a => a.First());
|
|
||||||
|
|
||||||
var adminsDict = new Dictionary<SharedLibraryCore.Objects.Player.Permission, IList<ClientInfo>>();
|
var adminsDict = new Dictionary<SharedLibraryCore.Objects.Player.Permission, IList<ClientInfo>>();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user