Moved the welcome plugin announcements into the plugin configuration

EF optimizations for webfront requests
removed FindAll command and moved it's functionality into find
fixed undefined link on admin page
This commit is contained in:
RaidMax 2018-02-11 19:17:20 -06:00
parent 1dbacd2188
commit d2ead61061
12 changed files with 191 additions and 132 deletions

View File

@ -172,7 +172,6 @@ namespace IW4MAdmin
Commands.Add(new CListBanInfo()); Commands.Add(new CListBanInfo());
Commands.Add(new CListAlias()); Commands.Add(new CListAlias());
Commands.Add(new CExecuteRCON()); Commands.Add(new CExecuteRCON());
Commands.Add(new CFindAllPlayers());
Commands.Add(new CPlugins()); Commands.Add(new CPlugins());
Commands.Add(new CIP()); Commands.Add(new CIP());
Commands.Add(new CMask()); Commands.Add(new CMask());

View File

@ -318,6 +318,7 @@ namespace IW4MAdmin
throw new SharedLibrary.Exceptions.CommandException($"{E.Origin} specified invalid player for \"{C.Name}\""); throw new SharedLibrary.Exceptions.CommandException($"{E.Origin} specified invalid player for \"{C.Name}\"");
} }
} }
E.Data = E.Data.Trim();
return C; return C;
} }

View File

@ -97,7 +97,6 @@ namespace IW4MAdmin
{ {
var f = File.ReadAllBytes(path.Replace("/", "\\").Substring(1)); var f = File.ReadAllBytes(path.Replace("/", "\\").Substring(1));
if (path.Contains(".css")) if (path.Contains(".css"))
{ {
HttpResponse css = new HttpResponse() HttpResponse css = new HttpResponse()
@ -383,9 +382,11 @@ namespace IW4MAdmin
if (S != null) if (S != null)
{ {
// fixme int ip = querySet["ip"].ConvertToIP();
Func<EFClient, bool> predicate = c => c.IPAddress == querySet["IP"].ConvertToIP(); var admins = (await (ApplicationManager.GetInstance().GetClientService() as ClientService).GetPrivilegedClients());
Player admin = (await ApplicationManager.GetInstance().GetClientService().Find(predicate)).FirstOrDefault()?.AsPlayer(); Player admin = admins.FirstOrDefault(a => a.IPAddress == ip)?.AsPlayer();
if (ip == 16777343)
admin = admins.First(a => a.IPAddress == 0).AsPlayer();
if (admin == null) if (admin == null)
admin = new Player() { Name = "RestUser"}; admin = new Player() { Name = "RestUser"};
@ -626,9 +627,10 @@ namespace IW4MAdmin
contentType = GetContentType(), contentType = GetContentType(),
content = Admins.Select(a => new content = Admins.Select(a => new
{ {
ClientId = a.ClientId, a.ClientId,
Level = a.Level, a.Level,
Name = a.Name a.Name,
playerID = a.ClientId
}), }),
additionalHeaders = new Dictionary<string, string>() additionalHeaders = new Dictionary<string, string>()
}; };
@ -746,15 +748,16 @@ namespace IW4MAdmin
public async Task<HttpResponse> GetPage(System.Collections.Specialized.NameValueCollection querySet, IDictionary<string, string> headers) public async Task<HttpResponse> GetPage(System.Collections.Specialized.NameValueCollection querySet, IDictionary<string, string> headers)
{ {
List<PlayerInfo> pInfo = new List<PlayerInfo>(); List<PlayerInfo> pInfo = new List<PlayerInfo>();
IList<SharedLibrary.Database.Models.EFClient> matchedPlayers = new List<SharedLibrary.Database.Models.EFClient>(); IList<EFClient> matchedPlayers = new List<EFClient>();
HttpResponse resp = new HttpResponse() HttpResponse resp = new HttpResponse()
{ {
contentType = GetContentType(), contentType = GetContentType(),
additionalHeaders = new Dictionary<string, string>() additionalHeaders = new Dictionary<string, string>()
}; };
Func<EFClient, bool> predicate = c => c.IPAddress == querySet["IP"].ConvertToIP() && c.Level > Player.Permission.Trusted;
bool authed = (await ApplicationManager.GetInstance().GetClientService().Find(predicate)).Count > 0 int ip = querySet["IP"].ConvertToIP();
|| querySet["IP"] == "127.0.0.1"; var admins = (await (ApplicationManager.GetInstance().GetClientService() as ClientService).GetPrivilegedClients());
bool authed = admins.FirstOrDefault(c => c.IPAddress == ip) != null || ip == 16777343;
bool recent = false; bool recent = false;
bool individual = querySet["id"] != null; bool individual = querySet["id"] != null;
@ -770,7 +773,7 @@ namespace IW4MAdmin
else if (querySet["name"] != null) else if (querySet["name"] != null)
{ {
matchedPlayers = await ApplicationManager.GetInstance().GetClientService().Find(c => c.Name.Contains(querySet["name"])); matchedPlayers = (await ApplicationManager.GetInstance().GetClientService().GetClientByName(querySet["name"]));
} }
else if (querySet["recent"] != null) else if (querySet["recent"] != null)
@ -865,15 +868,6 @@ namespace IW4MAdmin
public string name; public string name;
} }
[Serializable]
struct PageInfo
{
public string pageName;
public string pagePath;
public string pageType;
public bool visible;
}
[Serializable] [Serializable]
struct PlayerInfo struct PlayerInfo
{ {
@ -903,17 +897,4 @@ namespace IW4MAdmin
public string penaltyTime; public string penaltyTime;
public string Expires; public string Expires;
} }
[Serializable]
struct CommandInfo
{
public List<string> Result;
}
[Serializable]
class PrivilegedUsers
{
public Player.Permission Permission { get; set; }
public List<Player> Players { get; set; }
}
} }

Binary file not shown.

View File

@ -331,6 +331,10 @@ namespace StatsPlugin.Helpers
public async Task AddMessageAsync(int clientId, int serverId, string message) public async Task AddMessageAsync(int clientId, int serverId, string message)
{ {
// the web users can have no account
if (clientId < 1)
return;
var messageSvc = ContextThreads[serverId].MessageSvc; var messageSvc = ContextThreads[serverId].MessageSvc;
messageSvc.Insert(new EFClientMessage() messageSvc.Insert(new EFClientMessage()
{ {

View File

@ -21,7 +21,7 @@ namespace StatsPlugin.Helpers
{ {
var killstreakMessages = new Dictionary<int, string>() var killstreakMessages = new Dictionary<int, string>()
{ {
{ -1, "Try not to kill yourself anymore" }, { -1, "Try not to kill yourself anymore" },
{ 5, "Great job! You're on a ^55 killstreak!" }, { 5, "Great job! You're on a ^55 killstreak!" },
{ 10, "Amazing! ^510 kills ^7without dying!" }, { 10, "Amazing! ^510 kills ^7without dying!" },
{ 25, "You better call in that nuke, ^525 killstreak!" } { 25, "You better call in that nuke, ^525 killstreak!" }

View File

@ -12,6 +12,7 @@ using SharedLibrary.Helpers;
using SharedLibrary.Objects; using SharedLibrary.Objects;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using StatsPlugin.Models; using StatsPlugin.Models;
using SharedLibrary.Services;
namespace IW4MAdmin.Plugins namespace IW4MAdmin.Plugins
{ {
@ -59,10 +60,35 @@ namespace IW4MAdmin.Plugins
public async Task OnLoadAsync(IManager manager) public async Task OnLoadAsync(IManager manager)
{ {
#if DO_IMPORT
var svc = new GenericRepository<EFServer>();
svc.Insert(new EFServer()
{
Active = true,
Port = 28960,
ServerId = Math.Abs("127.0.0.1:28960".GetHashCode()),
});
svc.Insert(new EFServer()
{
Active = true,
Port = 28965,
ServerId = Math.Abs("127.0.0.1:28965".GetHashCode()),
});
svc.Insert(new EFServer()
{
Active = true,
Port = 28970,
ServerId = Math.Abs("127.0.0.1:28970".GetHashCode()),
});
svc.SaveChanges();
#endif
Interval = DateTime.Now; Interval = DateTime.Now;
var clients = new List<Player>(); var clients = new List<Player>();
var oldClients = new Dictionary<int, Player>(); var oldClients = new Dictionary<int, Player>();
#region CLIENTS #region CLIENTS
if (File.Exists("import_clients.csv")) if (File.Exists("import_clients.csv"))
{ {
manager.GetLogger().WriteVerbose("Beginning import of existing clients"); manager.GetLogger().WriteVerbose("Beginning import of existing clients");
@ -72,10 +98,10 @@ namespace IW4MAdmin.Plugins
{ {
string[] fields = Regex.Replace(line, "\".*\"", "").Split(','); string[] fields = Regex.Replace(line, "\".*\"", "").Split(',');
fields.All(f => fields.All(f =>
{ {
f = f.StripColors().Trim(); f = f.StripColors().Trim();
return true; return true;
}); });
if (fields.Length != 11) if (fields.Length != 11)
{ {
@ -104,13 +130,13 @@ namespace IW4MAdmin.Plugins
clients.Add(client); clients.Add(client);
oldClients.Add(client.ClientId, client); oldClients.Add(client.ClientId, client);
} }
//#if DO_IMPORT //#if DO_IMPORT
clients = clients.Distinct().ToList(); clients = clients.Distinct().ToList();
clients = clients clients = clients
.GroupBy(c => new { c.Name, c.IPAddress }) .GroupBy(c => new { c.Name, c.IPAddress })
.Select(c => c.FirstOrDefault()) .Select(c => c.FirstOrDefault())
.ToList(); .ToList();
//newClients = clients.ToList(); //newClients = clients.ToList();
//newClients.ForEach(c => c.ClientId = 0); //newClients.ForEach(c => c.ClientId = 0);
@ -126,10 +152,10 @@ namespace IW4MAdmin.Plugins
{ {
manager.GetLogger().WriteError("Saving imported clients failed"); manager.GetLogger().WriteError("Saving imported clients failed");
} }
//#endif //#endif
} }
#endregion #endregion
#region PENALTIES #region PENALTIES
if (File.Exists("import_penalties.csv")) if (File.Exists("import_penalties.csv"))
{ {
var penalties = new List<Penalty>(); var penalties = new List<Penalty>();
@ -140,10 +166,10 @@ namespace IW4MAdmin.Plugins
string[] fields = Regex.Replace(line, "\".*,.*\"", comma).Split(','); string[] fields = Regex.Replace(line, "\".*,.*\"", comma).Split(',');
fields.All(f => fields.All(f =>
{ {
f = f.StripColors().Trim(); f = f.StripColors().Trim();
return true; return true;
}); });
if (fields.Length != 7) if (fields.Length != 7)
{ {
@ -151,7 +177,7 @@ namespace IW4MAdmin.Plugins
return; return;
} }
if (fields[2].Contains("0110") || fields[2].Contains("0000000")) if (fields[2].Substring(0, 5) == "01100" || fields[2].Contains("0000000"))
continue; continue;
try try
{ {
@ -159,13 +185,17 @@ namespace IW4MAdmin.Plugins
var expires = DateTime.Parse(fields[6]); var expires = DateTime.Parse(fields[6]);
var when = DateTime.Parse(fields[5]); var when = DateTime.Parse(fields[5]);
var penaltyType = (Penalty.PenaltyType)Int32.Parse(fields[0]);
if (penaltyType == Penalty.PenaltyType.Ban)
expires = DateTime.MaxValue;
var penalty = new Penalty() var penalty = new Penalty()
{ {
Type = (Penalty.PenaltyType)Int32.Parse(fields[0]), Type = penaltyType,
Expires = expires == DateTime.MinValue ? when : expires, Expires = expires == DateTime.MinValue ? when : expires,
Punisher = new SharedLibrary.Database.Models.EFClient() { NetworkId = fields[3].ConvertLong() }, Punisher = new SharedLibrary.Database.Models.EFClient() { NetworkId = fields[3].ConvertLong() },
Offender = new SharedLibrary.Database.Models.EFClient() { NetworkId = fields[2].ConvertLong() }, Offender = new SharedLibrary.Database.Models.EFClient() { NetworkId = fields[2].ConvertLong() },
Offense = fields[1], Offense = fields[1].Replace("\"", "").Trim(),
Active = true, Active = true,
When = when, When = when,
}; };
@ -184,8 +214,8 @@ namespace IW4MAdmin.Plugins
manager.GetLogger().WriteVerbose($"Imported {penalties.Count} penalties"); manager.GetLogger().WriteVerbose($"Imported {penalties.Count} penalties");
//#endif //#endif
} }
#endregion #endregion
#region CHATHISTORY #region CHATHISTORY
// load the entire database lol // load the entire database lol
var cls = manager.GetClientService().Find(c => c.Active).Result; var cls = manager.GetClientService().Find(c => c.Active).Result;
@ -199,10 +229,10 @@ namespace IW4MAdmin.Plugins
string[] fields = Regex.Replace(line, "\".*,.*\"", comma).Split(','); string[] fields = Regex.Replace(line, "\".*,.*\"", comma).Split(',');
fields.All(f => fields.All(f =>
{ {
f = f.StripColors().Trim(); f = f.StripColors().Trim();
return true; return true;
}); });
if (fields.Length != 4) if (fields.Length != 4)
{ {
@ -239,8 +269,8 @@ namespace IW4MAdmin.Plugins
manager.GetLogger().WriteVerbose($"Read {chatHistory.Count} messages for import"); manager.GetLogger().WriteVerbose($"Read {chatHistory.Count} messages for import");
SharedLibrary.Database.Importer.ImportSQLite(chatHistory); SharedLibrary.Database.Importer.ImportSQLite(chatHistory);
} }
#endregion #endregion
#region STATS #region STATS
if (File.Exists("import_stats.csv")) if (File.Exists("import_stats.csv"))
{ {
var stats = new List<EFClientStatistics>(); var stats = new List<EFClientStatistics>();
@ -260,8 +290,8 @@ namespace IW4MAdmin.Plugins
try try
{ {
if (fields[0].Substring(0, 5) == "01100") if (fields[0].Substring(0, 5) == "01100")
continue; continue;
long id = fields[0].ConvertLong(); long id = fields[0].ConvertLong();
var client = cls.First(c => c.NetworkId == id); var client = cls.First(c => c.NetworkId == id);
@ -300,7 +330,7 @@ namespace IW4MAdmin.Plugins
manager.GetLogger().WriteError("Saving imported stats failed"); manager.GetLogger().WriteError("Saving imported stats failed");
} }
} }
#endregion #endregion
} }
public async Task OnTickAsync(Server S) public async Task OnTickAsync(Server S)

View File

@ -6,6 +6,7 @@ using System.Threading.Tasks;
using SharedLibrary.Network; using SharedLibrary.Network;
using SharedLibrary.Objects; using SharedLibrary.Objects;
using SharedLibrary.Helpers;
namespace Welcome_Plugin namespace Welcome_Plugin
{ {
@ -46,13 +47,12 @@ namespace Welcome_Plugin
return "fourth"; return "fourth";
case 5: case 5:
return "fifth"; return "fifth";
case 100: /* case 100:
return "One-Hundreth (amazing!)"; return "One-Hundreth (amazing!)";
case 500: case 500:
return "you're really ^5dedicated ^7to this server! This is your ^5500th^7"; return "you're really ^5dedicated ^7to this server! This is your ^5500th^7";
case 1000: case 1000:
return "you deserve a medal. it's your ^11000th^7"; return "you deserve a medal. it's your ^11000th^7";*/
default: default:
return connection.ToString() + Prefix; return connection.ToString() + Prefix;
} }
@ -64,8 +64,11 @@ namespace Welcome_Plugin
public string Name => "Welcome Plugin"; public string Name => "Welcome Plugin";
private Dictionary<int, ConfigurationManager> Configs;
public async Task OnLoadAsync(IManager manager) public async Task OnLoadAsync(IManager manager)
{ {
await Task.FromResult(Configs = new Dictionary<int, ConfigurationManager>());
} }
public async Task OnUnloadAsync() public async Task OnUnloadAsync()
@ -81,34 +84,59 @@ namespace Welcome_Plugin
if (E.Type == Event.GType.Connect) if (E.Type == Event.GType.Connect)
{ {
Player newPlayer = E.Origin; Player newPlayer = E.Origin;
var cfg = Configs[S.GetHashCode()];
if (newPlayer.Level >= Player.Permission.Trusted && !E.Origin.Masked) if (newPlayer.Level >= Player.Permission.Trusted && !E.Origin.Masked)
await E.Owner.Broadcast(Utilities.ConvertLevelToColor(newPlayer.Level) + " ^5" + newPlayer.Name + " ^7has joined the server."); await E.Owner.Broadcast(ProcessAnnouncement(cfg.GetProperty<string>("PrivilegedAnnouncementMessage"), newPlayer));
await newPlayer.Tell($"Welcome ^5{newPlayer.Name}^7, this is your ^5{TimesConnected(newPlayer)} ^7time connecting!"); await newPlayer.Tell(ProcessAnnouncement(cfg.GetProperty<string>("UserWelcomeMessage"), newPlayer));
if (newPlayer.Level == Player.Permission.Flagged) if (newPlayer.Level == Player.Permission.Flagged)
await E.Owner.ToAdmins($"^1NOTICE: ^7Flagged player ^5{newPlayer.Name}^7 has joined!"); await E.Owner.ToAdmins($"^1NOTICE: ^7Flagged player ^5{newPlayer.Name}^7 has joined!");
else else
await E.Owner.Broadcast(ProcessAnnouncement(cfg.GetProperty<string>("UserAnnouncementMessage"), newPlayer));
}
if (E.Type == Event.GType.Start)
{
var cfg = new ConfigurationManager(S);
Configs.Add(S.GetHashCode(), cfg);
if (cfg.GetProperty<string>("UserWelcomeMessage") == null)
{ {
try string welcomeMsg = "Welcome ^5{{ClientName}}^7, this is your ^5{{TimesConnected}} ^7time connecting!";
{ cfg.AddProperty(new KeyValuePair<string, dynamic>("UserWelcomeMessage", welcomeMsg));
CountryLookupProj.CountryLookup CLT = new CountryLookupProj.CountryLookup("Plugins/GeoIP.dat"); }
await E.Owner.Broadcast($"^5{newPlayer.Name} ^7hails from ^5{CLT.lookupCountryName(newPlayer.IPAddressString)}");
}
catch (Exception) if (cfg.GetProperty<string>("PrivilegedAnnouncementMessage") == null)
{ {
E.Owner.Manager.GetLogger().WriteError("Could not open file Plugins/GeoIP.dat for Welcome Plugin"); string annoucementMsg = "{{ClientLevel}} {{ClientName}} has joined the server";
} cfg.AddProperty(new KeyValuePair<string, dynamic>("PrivilegedAnnouncementMessage", annoucementMsg));
}
if (cfg.GetProperty<string>("UserAnnouncementMessage") == null)
{
string annoucementMsg = "^5{{ClientName}}^7hails from ^5{{ClientLocation}}";
cfg.AddProperty(new KeyValuePair<string, dynamic>("UserAnnouncementMessage", annoucementMsg));
} }
} }
}
if (E.Type == Event.GType.Disconnect) private string ProcessAnnouncement(string msg, Player joining)
{
msg = msg.Replace("{{ClientName}}", joining.Name);
msg = msg.Replace("{{ClientLevel}}", Utilities.ConvertLevelToColor(joining.Level));
try
{ {
CountryLookupProj.CountryLookup CLT = new CountryLookupProj.CountryLookup("Plugins/GeoIP.dat");
msg = msg.Replace("{{ClientLocation}}", CLT.lookupCountryName(joining.IPAddressString));
} }
catch (Exception)
{
joining.CurrentServer.Manager.GetLogger().WriteError("Could not open file Plugins/GeoIP.dat for Welcome Plugin");
}
msg = msg.Replace("{{TimesConnected}}", TimesConnected(joining));
return msg;
} }
} }
} }

View File

@ -10,6 +10,7 @@ using SharedLibrary.Objects;
using SharedLibrary.Database; using SharedLibrary.Database;
using System.Data.Entity; using System.Data.Entity;
using SharedLibrary.Database.Models; using SharedLibrary.Database.Models;
using SharedLibrary.Services;
namespace SharedLibrary.Commands namespace SharedLibrary.Commands
{ {
@ -526,7 +527,7 @@ namespace SharedLibrary.Commands
public override async Task ExecuteAsync(Event E) public override async Task ExecuteAsync(Event E)
{ {
var db_players = await E.Owner.Manager.GetClientService().Find(c => c.Name.Contains(E.Data)); var db_players = await (E.Owner.Manager.GetClientService() as ClientService).GetClientByName(E.Data);
if (db_players.Count == 0) if (db_players.Count == 0)
{ {
@ -534,51 +535,17 @@ namespace SharedLibrary.Commands
return; return;
} }
foreach (Player P in db_players) foreach (var P in db_players)
{ {
String mesg = String.Format("[^3{0}^7] [^3@{1}^7] - [{2}^7] - {3} | last seen {4}", P.Name, P.ClientNumber, Utilities.ConvertLevelToColor(P.Level), P.IPAddress, P.GetLastConnection()); // they're not going by another alias
await E.Origin.Tell(mesg); string msg = P.Name.ToLower().Contains(E.Data.ToLower()) ?
$"[^3{P.Name}^7] [^3@{P.ClientId}^7] - [{ Utilities.ConvertLevelToColor(P.Level)}^7] - {P.IPAddressString} | last seen {Utilities.GetTimePassed(P.LastConnection)}" :
$"({P.AliasLink.Children.First(a => a.Name.ToLower().Contains(E.Data.ToLower())).Name})->[^3{P.Name}^7] [^3@{P.ClientId}^7] - [{ Utilities.ConvertLevelToColor(P.Level)}^7] - {P.IPAddressString} | last seen {Utilities.GetTimePassed(P.LastConnection)}";
await E.Origin.Tell(msg);
} }
} }
} }
public class CFindAllPlayers : Command
{
public CFindAllPlayers() :
base("findall", "find a player by their aliase(s)", "fa", Player.Permission.Administrator, false, new CommandArgument[]
{
new CommandArgument()
{
Name = "player",
Required = true,
}
})
{ }
public override async Task ExecuteAsync(Event E)
{
E.Data = E.Data.Trim();
if (E.Data.Length < 3)
{
await E.Origin.Tell("You must enter at least 3 characters");
return;
}
var db_aliases = await E.Owner.Manager.GetAliasService()
.Find(a => a.Name.ToLower().Contains(E.Data.ToLower()));
if (db_aliases.Count == 0)
{
await E.Origin.Tell("No players found");
return;
}
foreach (var P in db_aliases)
await E.Origin.Tell($"^4{P.Name} ^7now goes by ^5{P.Link.Children.OrderByDescending(a => a.DateAdded).First().Name}");
}
}
public class CListRules : Command public class CListRules : Command
{ {
public CListRules() : public CListRules() :
@ -668,9 +635,10 @@ namespace SharedLibrary.Commands
public override async Task ExecuteAsync(Event E) public override async Task ExecuteAsync(Event E)
{ {
// todo: move unflag to seperate command
if (E.Target.Level >= E.Origin.Level) if (E.Target.Level >= E.Origin.Level)
{ {
await E.Origin.Tell("You cannot flag " + E.Target.Name); await E.Origin.Tell($"You cannot flag {E.Target.Name}");
return; return;
} }
@ -678,7 +646,7 @@ namespace SharedLibrary.Commands
{ {
E.Target.Level = Player.Permission.User; E.Target.Level = Player.Permission.User;
await E.Owner.Manager.GetClientService().Update(E.Target); await E.Owner.Manager.GetClientService().Update(E.Target);
await E.Origin.Tell("You have ^5unflagged ^7" + E.Target.Name); await E.Origin.Tell($"You have ^5unflagged ^7{E.Target.Name}");
} }
else else

View File

@ -52,7 +52,7 @@ namespace SharedLibrary.Database
NetworkId = entityToInsert.NetworkId NetworkId = entityToInsert.NetworkId
}; };
context = AddClient(context, client, count, 100, true); context = AddClient(context, client, count, 1000, true);
} }
context.SaveChanges(); context.SaveChanges();
@ -84,6 +84,8 @@ namespace SharedLibrary.Database
context.Dispose(); context.Dispose();
context = new DatabaseContext(); context = new DatabaseContext();
context.Configuration.AutoDetectChangesEnabled = false; context.Configuration.AutoDetectChangesEnabled = false;
context.Configuration.LazyLoadingEnabled = false;
context.Configuration.ProxyCreationEnabled = false;
} }
} }
@ -119,7 +121,7 @@ namespace SharedLibrary.Database
var penalty = new EFPenalty() var penalty = new EFPenalty()
{ {
Active = true, Active = true,
Expires = entityToInsert.Expires.Year == 9999 ? DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MinValue.ToString()) : entityToInsert.Expires, Expires = entityToInsert.Expires.Year == 9999 ? DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MaxValue.ToString()) : entityToInsert.Expires,
Offender = offender, Offender = offender,
Punisher = punisher, Punisher = punisher,
Offense = entityToInsert.Offense, Offense = entityToInsert.Offense,
@ -128,7 +130,7 @@ namespace SharedLibrary.Database
Link = offender.AliasLink Link = offender.AliasLink
}; };
context = AddPenalty(context, penalty, count, 100, true); context = AddPenalty(context, penalty, count, 1000, true);
} }
context.SaveChanges(); context.SaveChanges();
@ -160,6 +162,8 @@ namespace SharedLibrary.Database
context.Dispose(); context.Dispose();
context = new DatabaseContext(); context = new DatabaseContext();
context.Configuration.AutoDetectChangesEnabled = false; context.Configuration.AutoDetectChangesEnabled = false;
context.Configuration.LazyLoadingEnabled = false;
context.Configuration.ProxyCreationEnabled = false;
} }
} }
@ -181,7 +185,7 @@ namespace SharedLibrary.Database
foreach (var entityToInsert in SQLiteData) foreach (var entityToInsert in SQLiteData)
{ {
++count; ++count;
context = AddSQLite(context, entityToInsert, count, 100, true); context = AddSQLite(context, entityToInsert, count, 1000, true);
} }
context.SaveChanges(); context.SaveChanges();
@ -214,6 +218,8 @@ namespace SharedLibrary.Database
context.Dispose(); context.Dispose();
context = new DatabaseContext(); context = new DatabaseContext();
context.Configuration.AutoDetectChangesEnabled = false; context.Configuration.AutoDetectChangesEnabled = false;
context.Configuration.LazyLoadingEnabled = false;
context.Configuration.ProxyCreationEnabled = false;
} }
} }
return context; return context;

View File

@ -1,4 +1,5 @@
using System; using Microsoft.CSharp.RuntimeBinder;
using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
@ -54,6 +55,11 @@ namespace SharedLibrary.Helpers
return ConfigSet[prop].ToObject<T>(); return ConfigSet[prop].ToObject<T>();
} }
catch (RuntimeBinderException)
{
return ConfigSet[prop];
}
catch (Exception) catch (Exception)
{ {
return default(T); return default(T);

View File

@ -8,6 +8,7 @@ using System.Data.Entity;
using SharedLibrary.Database; using SharedLibrary.Database;
using SharedLibrary.Database.Models; using SharedLibrary.Database.Models;
using System.Linq.Expressions; using System.Linq.Expressions;
using SharedLibrary.Objects;
namespace SharedLibrary.Services namespace SharedLibrary.Services
{ {
@ -91,11 +92,16 @@ namespace SharedLibrary.Services
return await Task.Run(() => return await Task.Run(() =>
{ {
using (var context = new DatabaseContext()) using (var context = new DatabaseContext())
{
context.Configuration.AutoDetectChangesEnabled = false;
context.Configuration.LazyLoadingEnabled = false;
context.Configuration.ProxyCreationEnabled = false;
return context.Clients return context.Clients
.AsNoTracking() .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();
}
}); });
} }
@ -104,7 +110,7 @@ namespace SharedLibrary.Services
using (var context = new DatabaseContext()) using (var context = new DatabaseContext())
{ {
context.Configuration.LazyLoadingEnabled = false; context.Configuration.LazyLoadingEnabled = false;
context.Configuration.ProxyCreationEnabled = false; //context.Configuration.ProxyCreationEnabled = false;
return await new DatabaseContext().Clients return await new DatabaseContext().Clients
.AsNoTracking() .AsNoTracking()
.Include(c => c.CurrentAlias) .Include(c => c.CurrentAlias)
@ -191,13 +197,43 @@ namespace SharedLibrary.Services
public async Task<IList<EFClient>> GetPrivilegedClients() public async Task<IList<EFClient>> GetPrivilegedClients()
{ {
using (var context = new DatabaseContext()) using (var context = new DatabaseContext())
{
context.Configuration.LazyLoadingEnabled = false;
context.Configuration.ProxyCreationEnabled = false;
context.Configuration.AutoDetectChangesEnabled = false;
return await new DatabaseContext().Clients return await new DatabaseContext().Clients
.AsNoTracking() .AsNoTracking()
.Include(c => c.CurrentAlias) .Include(c => c.CurrentAlias)
.Where(c => c.Level >= Objects.Player.Permission.Trusted) .Where(c => c.Level >= Player.Permission.Trusted)
.ToListAsync(); .ToListAsync();
}
} }
public async Task<IList<EFClient>> GetClientByName(string name)
{
using (var context = new DatabaseContext())
{
context.Configuration.LazyLoadingEnabled = false;
context.Configuration.ProxyCreationEnabled = false;
context.Configuration.AutoDetectChangesEnabled = false;
var iqClients = (from alias in context.Aliases
.AsNoTracking()
where alias.Name
.Contains(name)
join link in context.AliasLinks
on alias.LinkId equals link.AliasLinkId
join client in context.Clients
.AsNoTracking()
on alias.LinkId equals client.AliasLinkId
select client)
.Include(c => c.CurrentAlias)
.Include(c => c.AliasLink.Children);
return await iqClients.ToListAsync();
}
}
public async Task<IList<EFClient>> GetRecentClients(int offset, int count) public async Task<IList<EFClient>> GetRecentClients(int offset, int count)
{ {