update values for snap and offset

fix some issues from .NET Core 3.0 upgrade
This commit is contained in:
RaidMax 2019-10-07 10:26:07 -05:00
parent c4e0b0272c
commit 068e943fd3
14 changed files with 1522 additions and 265 deletions

View File

@ -17,7 +17,7 @@ namespace LiveRadar.Web.Controllers
[HttpGet] [HttpGet]
[Route("Radar/{serverId}")] [Route("Radar/{serverId}")]
public IActionResult Index(long? serverId = null) public IActionResult Index([FromQuery] long? serverId = null)
{ {
ViewBag.IsFluid = true; ViewBag.IsFluid = true;
ViewBag.Title = Utilities.CurrentLocalization.LocalizationIndex["WEBFRONT_RADAR_TITLE"]; ViewBag.Title = Utilities.CurrentLocalization.LocalizationIndex["WEBFRONT_RADAR_TITLE"];

View File

@ -303,12 +303,12 @@
}; };
function updateRadarData() { function updateRadarData() {
$.getJSON('@Url.Action("Data", "Radar", null)', function (_radarItem) { $.getJSON('@Url.Action("Data", "Radar", new { serverId = ViewBag.ActiveServerId })', function (_radarItem) {
newRadarData = _radarItem; newRadarData = _radarItem;
}); });
$.getJSON('@Url.Action("Map", "Radar", null)', function (_map) { $.getJSON('@Url.Action("Map", "Radar", new { serverId = ViewBag.ActiveServerId })', function (_map) {
stateInfo.mapInfo = _map stateInfo.mapInfo = _map
}); });
@ -458,7 +458,7 @@
} }
$(document).ready(function () { $(document).ready(function () {
$.getJSON('@Url.Action("Map", "Radar", null)', function (_map) { $.getJSON('@Url.Action("Map", "Radar", new { serverId = ViewBag.ActiveServerId })', function (_map) {
stateInfo.mapInfo = _map; stateInfo.mapInfo = _map;
updateRadarData(); updateRadarData();
setInterval(updateRadarData, stateInfo.updateFrequency); setInterval(updateRadarData, stateInfo.updateFrequency);

View File

@ -125,32 +125,32 @@ namespace IW4MAdmin.Plugins.Stats.Cheat
//var marginOfError = Thresholds.GetMarginOfError(sessionSnapHits); //var marginOfError = Thresholds.GetMarginOfError(sessionSnapHits);
//var marginOfErrorLifetime = Thresholds.GetMarginOfError(ClientStats.SnapHitCount); //var marginOfErrorLifetime = Thresholds.GetMarginOfError(ClientStats.SnapHitCount);
if (sessionSnapHits >= Thresholds.LowSampleMinKills && if (sessionSnapHits >= Thresholds.MediumSampleMinKills &&
sessionAverageSnapAmount >= Thresholds.SnapFlagValue/* + marginOfError*/) sessionAverageSnapAmount >= Thresholds.SnapFlagValue/* + marginOfError*/)
{ {
results.Add(new DetectionPenaltyResult() results.Add(new DetectionPenaltyResult()
{ {
ClientPenalty = EFPenalty.PenaltyType.Flag, ClientPenalty = EFPenalty.PenaltyType.Flag,
Value = sessionAverageSnapAmount, Value = sessionAverageSnapAmount,
HitCount = ClientStats.SnapHitCount, HitCount = sessionSnapHits,
Type = DetectionType.Snap Type = DetectionType.Snap
}); });
} }
if (sessionSnapHits >= Thresholds.LowSampleMinKills && if (sessionSnapHits >= Thresholds.MediumSampleMinKills &&
sessionAverageSnapAmount >= Thresholds.SnapBanValue/* + marginOfError*/) sessionAverageSnapAmount >= Thresholds.SnapBanValue/* + marginOfError*/)
{ {
results.Add(new DetectionPenaltyResult() results.Add(new DetectionPenaltyResult()
{ {
ClientPenalty = EFPenalty.PenaltyType.Ban, ClientPenalty = EFPenalty.PenaltyType.Ban,
Value = sessionAverageSnapAmount, Value = sessionAverageSnapAmount,
HitCount = ClientStats.SnapHitCount, HitCount = sessionSnapHits,
Type = DetectionType.Snap Type = DetectionType.Snap
}); });
} }
// lifetime // lifetime
if (ClientStats.SnapHitCount >= Thresholds.MediumSampleMinKills && if (ClientStats.SnapHitCount >= Thresholds.MediumSampleMinKills * 2 &&
ClientStats.AverageSnapValue >= Thresholds.SnapFlagValue/* + marginOfErrorLifetime*/) ClientStats.AverageSnapValue >= Thresholds.SnapFlagValue/* + marginOfErrorLifetime*/)
{ {
results.Add(new DetectionPenaltyResult() results.Add(new DetectionPenaltyResult()
@ -162,7 +162,7 @@ namespace IW4MAdmin.Plugins.Stats.Cheat
}); });
} }
if (ClientStats.SnapHitCount >= Thresholds.MediumSampleMinKills && if (ClientStats.SnapHitCount >= Thresholds.MediumSampleMinKills * 2 &&
ClientStats.AverageSnapValue >= Thresholds.SnapBanValue/* + marginOfErrorLifetime*/) ClientStats.AverageSnapValue >= Thresholds.SnapBanValue/* + marginOfErrorLifetime*/)
{ {
results.Add(new DetectionPenaltyResult() results.Add(new DetectionPenaltyResult()
@ -183,7 +183,6 @@ namespace IW4MAdmin.Plugins.Stats.Cheat
int angleOffsetIndex = totalUsableAngleCount / 2; int angleOffsetIndex = totalUsableAngleCount / 2;
if (hit.AnglesList.Count == 5) if (hit.AnglesList.Count == 5)
{ {
double realAgainstPredict = Vector3.ViewAngleDistance(hit.AnglesList[angleOffsetIndex - 1], hit.AnglesList[angleOffsetIndex + 1], hit.ViewAngles); double realAgainstPredict = Vector3.ViewAngleDistance(hit.AnglesList[angleOffsetIndex - 1], hit.AnglesList[angleOffsetIndex + 1], hit.ViewAngles);
// LIFETIME // LIFETIME
@ -201,15 +200,15 @@ namespace IW4MAdmin.Plugins.Stats.Cheat
if (weightedLifetimeAverage > Thresholds.MaxOffset(totalHits) && if (weightedLifetimeAverage > Thresholds.MaxOffset(totalHits) &&
hitLoc.HitCount > 100) hitLoc.HitCount > 100)
{ {
Log.WriteDebug("*** Reached Max Lifetime Average for Angle Difference ***"); //Log.WriteDebug("*** Reached Max Lifetime Average for Angle Difference ***");
Log.WriteDebug($"Lifetime Average = {newAverage}"); //Log.WriteDebug($"Lifetime Average = {newAverage}");
Log.WriteDebug($"Bone = {hitLoc.Location}"); //Log.WriteDebug($"Bone = {hitLoc.Location}");
Log.WriteDebug($"HitCount = {hitLoc.HitCount}"); //Log.WriteDebug($"HitCount = {hitLoc.HitCount}");
Log.WriteDebug($"ID = {hit.AttackerId}"); //Log.WriteDebug($"ID = {hit.AttackerId}");
results.Add(new DetectionPenaltyResult() results.Add(new DetectionPenaltyResult()
{ {
ClientPenalty = EFPenalty.PenaltyType.Flag, ClientPenalty = EFPenalty.PenaltyType.Ban,
Value = hitLoc.HitOffsetAverage, Value = hitLoc.HitOffsetAverage,
HitCount = hitLoc.HitCount, HitCount = hitLoc.HitCount,
Type = DetectionType.Offset Type = DetectionType.Offset
@ -236,7 +235,7 @@ namespace IW4MAdmin.Plugins.Stats.Cheat
results.Add(new DetectionPenaltyResult() results.Add(new DetectionPenaltyResult()
{ {
ClientPenalty = EFPenalty.PenaltyType.Flag, ClientPenalty = EFPenalty.PenaltyType.Ban,
Value = weightedSessionAverage, Value = weightedSessionAverage,
HitCount = HitCount, HitCount = HitCount,
Type = DetectionType.Offset, Type = DetectionType.Offset,

View File

@ -48,13 +48,13 @@ namespace IW4MAdmin.Plugins.Stats.Cheat
public const int HighSampleMinKills = 100; public const int HighSampleMinKills = 100;
public const double KillTimeThreshold = 0.2; public const double KillTimeThreshold = 0.2;
public const int LowSampleMinKillsRecoil = 5; public const int LowSampleMinKillsRecoil = 5;
public const double SnapFlagValue = 6.12; public const double SnapFlagValue = 5.5;
public const double SnapBanValue = 9.67; public const double SnapBanValue = 8.7;
public const double MaxStrainBan = 0.9; public const double MaxStrainBan = 0.9;
private const double _offsetMeanLog = -2.727273; private const double _offsetMeanLog = -2.3243889;
private const double _offsetSdLog = 0.458325; private const double _offsetSdLog = 0.5851351;
public static double MaxOffset(int sampleSize) => Math.Exp(Math.Max(_offsetMeanLog + (_offsetMeanLog / Math.Sqrt(sampleSize)), _offsetMeanLog - (_offsetMeanLog / Math.Sqrt(sampleSize))) + 4 * (_offsetSdLog)); public static double MaxOffset(int sampleSize) => Math.Exp(Math.Max(_offsetMeanLog + (_offsetMeanLog / Math.Sqrt(sampleSize)), _offsetMeanLog - (_offsetMeanLog / Math.Sqrt(sampleSize))) + 4 * (_offsetSdLog));
public const double MaxStrainFlag = 0.36; public const double MaxStrainFlag = 0.36;

View File

@ -843,7 +843,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
Active = true, Active = true,
Newest = true, Newest = true,
ServerId = clientStats.ServerId, ServerId = clientStats.ServerId,
RatingHistoryId = clientHistory.RatingHistoryId, RatingHistory = clientHistory,
ActivityAmount = currentServerTotalPlaytime, ActivityAmount = currentServerTotalPlaytime,
}; };
@ -921,7 +921,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
Performance = performanceAverage, Performance = performanceAverage,
Ranking = overallClientRanking, Ranking = overallClientRanking,
ServerId = null, ServerId = null,
RatingHistoryId = clientHistory.RatingHistoryId, RatingHistory = clientHistory,
ActivityAmount = clientStatsList.Sum(s => s.TimePlayed) ActivityAmount = clientStatsList.Sum(s => s.TimePlayed)
}; };

View File

@ -17,11 +17,13 @@ namespace IW4MAdmin.Plugins.Stats.Models
[Required] [Required]
public float MaxAngleDistance { get; set; } public float MaxAngleDistance { get; set; }
[Required] [Required]
public int ClientId { get; set; } [Column("EFClientStatisticsClientId")]
[ForeignKey("ClientId"), Column(Order = 0 )] public int EFClientStatisticsClientId { get; set; }
[ForeignKey("EFClientStatisticsClientId")]
public EFClient Client { get; set; } public EFClient Client { get; set; }
public long ServerId { get; set; } [Column("EFClientStatisticsServerId")]
[ForeignKey("ServerId"), Column(Order = 1)] public long EFClientStatisticsServerId { get; set; }
[ForeignKey("EFClientStatisticsServerId")]
public EFServer Server { get; set; } public EFServer Server { get; set; }
} }
} }

View File

@ -13,12 +13,12 @@ namespace Stats.Models
// fix linking from SQLCe // fix linking from SQLCe
builder.Entity<EFHitLocationCount>() builder.Entity<EFHitLocationCount>()
.Property(c => c.ClientId) .Property(c => c.EFClientStatisticsClientId)
.HasColumnName("EFClientStatistics_ClientId"); .HasColumnName("EFClientStatisticsClientId");
builder.Entity<EFHitLocationCount>() builder.Entity<EFHitLocationCount>()
.Property(c => c.ServerId) .Property(c => c.EFClientStatisticsServerId)
.HasColumnName("EFClientStatistics_ServerId"); .HasColumnName("EFClientStatisticsServerId");
builder.Entity<EFRating>() builder.Entity<EFRating>()
.HasIndex(p => new { p.Performance, p.Ranking, p.When }); .HasIndex(p => new { p.Performance, p.Ranking, p.When });

View File

@ -111,13 +111,6 @@ namespace SharedLibraryCore.Database
break; break;
} }
} }
#if DEBUG
#pragma warning disable CS0612 // Type or member is obsolete
// optionsBuilder.UseLoggerFactory(_loggerFactory)
#pragma warning restore CS0612 // Type or member is obsolete
// .EnableSensitiveDataLogging();
#endif
} }
protected override void OnModelCreating(ModelBuilder modelBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder)

View File

@ -0,0 +1,910 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database;
namespace SharedLibraryCore.Migrations
{
[DbContext(typeof(DatabaseContext))]
[Migration("20191004172550_RenameClientHitLocationCountColumns")]
partial class RenameClientHitLocationCountColumns
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "3.0.0");
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFACSnapshot", b =>
{
b.Property<int>("SnapshotId")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("ClientId")
.HasColumnType("INTEGER");
b.Property<int>("CurrentSessionLength")
.HasColumnType("INTEGER");
b.Property<double>("CurrentStrain")
.HasColumnType("REAL");
b.Property<int>("CurrentViewAngleId")
.HasColumnType("INTEGER");
b.Property<int>("Deaths")
.HasColumnType("INTEGER");
b.Property<double>("Distance")
.HasColumnType("REAL");
b.Property<double>("EloRating")
.HasColumnType("REAL");
b.Property<int>("HitDestinationId")
.HasColumnType("INTEGER");
b.Property<int>("HitLocation")
.HasColumnType("INTEGER");
b.Property<int>("HitOriginId")
.HasColumnType("INTEGER");
b.Property<int>("HitType")
.HasColumnType("INTEGER");
b.Property<int>("Hits")
.HasColumnType("INTEGER");
b.Property<int>("Kills")
.HasColumnType("INTEGER");
b.Property<int>("LastStrainAngleId")
.HasColumnType("INTEGER");
b.Property<double>("RecoilOffset")
.HasColumnType("REAL");
b.Property<double>("SessionAngleOffset")
.HasColumnType("REAL");
b.Property<double>("SessionAverageSnapValue")
.HasColumnType("REAL");
b.Property<double>("SessionSPM")
.HasColumnType("REAL");
b.Property<int>("SessionScore")
.HasColumnType("INTEGER");
b.Property<int>("SessionSnapHits")
.HasColumnType("INTEGER");
b.Property<double>("StrainAngleBetween")
.HasColumnType("REAL");
b.Property<int>("TimeSinceLastEvent")
.HasColumnType("INTEGER");
b.Property<int>("WeaponId")
.HasColumnType("INTEGER");
b.Property<DateTime>("When")
.HasColumnType("TEXT");
b.HasKey("SnapshotId");
b.HasIndex("ClientId");
b.HasIndex("CurrentViewAngleId");
b.HasIndex("HitDestinationId");
b.HasIndex("HitOriginId");
b.HasIndex("LastStrainAngleId");
b.ToTable("EFACSnapshot");
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFACSnapshotVector3", b =>
{
b.Property<int>("ACSnapshotVector3Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int>("SnapshotId")
.HasColumnType("INTEGER");
b.Property<int>("Vector3Id")
.HasColumnType("INTEGER");
b.HasKey("ACSnapshotVector3Id");
b.HasIndex("SnapshotId");
b.HasIndex("Vector3Id");
b.ToTable("EFACSnapshotVector3");
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientKill", b =>
{
b.Property<long>("KillId")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("AttackerId")
.HasColumnType("INTEGER");
b.Property<int>("Damage")
.HasColumnType("INTEGER");
b.Property<int?>("DeathOriginVector3Id")
.HasColumnType("INTEGER");
b.Property<int>("DeathType")
.HasColumnType("INTEGER");
b.Property<double>("Fraction")
.HasColumnType("REAL");
b.Property<int>("HitLoc")
.HasColumnType("INTEGER");
b.Property<bool>("IsKill")
.HasColumnType("INTEGER");
b.Property<int?>("KillOriginVector3Id")
.HasColumnType("INTEGER");
b.Property<int>("Map")
.HasColumnType("INTEGER");
b.Property<long>("ServerId")
.HasColumnType("INTEGER");
b.Property<int>("VictimId")
.HasColumnType("INTEGER");
b.Property<int?>("ViewAnglesVector3Id")
.HasColumnType("INTEGER");
b.Property<double>("VisibilityPercentage")
.HasColumnType("REAL");
b.Property<int>("Weapon")
.HasColumnType("INTEGER");
b.Property<DateTime>("When")
.HasColumnType("TEXT");
b.HasKey("KillId");
b.HasIndex("AttackerId");
b.HasIndex("DeathOriginVector3Id");
b.HasIndex("KillOriginVector3Id");
b.HasIndex("ServerId");
b.HasIndex("VictimId");
b.HasIndex("ViewAnglesVector3Id");
b.ToTable("EFClientKills");
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientMessage", b =>
{
b.Property<long>("MessageId")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("ClientId")
.HasColumnType("INTEGER");
b.Property<string>("Message")
.HasColumnType("TEXT");
b.Property<long>("ServerId")
.HasColumnType("INTEGER");
b.Property<DateTime>("TimeSent")
.HasColumnType("TEXT");
b.HasKey("MessageId");
b.HasIndex("ClientId");
b.HasIndex("ServerId");
b.HasIndex("TimeSent");
b.ToTable("EFClientMessages");
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientRatingHistory", b =>
{
b.Property<int>("RatingHistoryId")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("ClientId")
.HasColumnType("INTEGER");
b.HasKey("RatingHistoryId");
b.HasIndex("ClientId");
b.ToTable("EFClientRatingHistory");
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientStatistics", b =>
{
b.Property<int>("ClientId")
.HasColumnType("INTEGER");
b.Property<long>("ServerId")
.HasColumnType("INTEGER");
b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<double>("AverageRecoilOffset")
.HasColumnType("REAL");
b.Property<double>("AverageSnapValue")
.HasColumnType("REAL");
b.Property<int>("Deaths")
.HasColumnType("INTEGER");
b.Property<double>("EloRating")
.HasColumnType("REAL");
b.Property<int>("Kills")
.HasColumnType("INTEGER");
b.Property<double>("MaxStrain")
.HasColumnType("REAL");
b.Property<double>("RollingWeightedKDR")
.HasColumnType("REAL");
b.Property<double>("SPM")
.HasColumnType("REAL");
b.Property<double>("Skill")
.HasColumnType("REAL");
b.Property<int>("SnapHitCount")
.HasColumnType("INTEGER");
b.Property<int>("TimePlayed")
.HasColumnType("INTEGER");
b.Property<double>("VisionAverage")
.HasColumnType("REAL");
b.HasKey("ClientId", "ServerId");
b.HasIndex("ServerId");
b.ToTable("EFClientStatistics");
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFHitLocationCount", b =>
{
b.Property<int>("HitLocationCountId")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("EFClientStatisticsClientId")
.HasColumnName("EFClientStatisticsClientId")
.HasColumnType("INTEGER");
b.Property<long>("EFClientStatisticsServerId")
.HasColumnName("EFClientStatisticsServerId")
.HasColumnType("INTEGER");
b.Property<int>("HitCount")
.HasColumnType("INTEGER");
b.Property<float>("HitOffsetAverage")
.HasColumnType("REAL");
b.Property<int>("Location")
.HasColumnType("INTEGER");
b.Property<float>("MaxAngleDistance")
.HasColumnType("REAL");
b.HasKey("HitLocationCountId");
b.HasIndex("EFClientStatisticsServerId");
b.HasIndex("EFClientStatisticsClientId", "EFClientStatisticsServerId");
b.ToTable("EFHitLocationCounts");
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFRating", b =>
{
b.Property<int>("RatingId")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("ActivityAmount")
.HasColumnType("INTEGER");
b.Property<bool>("Newest")
.HasColumnType("INTEGER");
b.Property<double>("Performance")
.HasColumnType("REAL");
b.Property<int>("Ranking")
.HasColumnType("INTEGER");
b.Property<int>("RatingHistoryId")
.HasColumnType("INTEGER");
b.Property<long?>("ServerId")
.HasColumnType("INTEGER");
b.Property<DateTime>("When")
.HasColumnType("TEXT");
b.HasKey("RatingId");
b.HasIndex("RatingHistoryId");
b.HasIndex("ServerId");
b.HasIndex("Performance", "Ranking", "When");
b.ToTable("EFRating");
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFServer", b =>
{
b.Property<long>("ServerId")
.HasColumnType("INTEGER");
b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<string>("EndPoint")
.HasColumnType("TEXT");
b.Property<int?>("GameName")
.HasColumnType("INTEGER");
b.Property<int>("Port")
.HasColumnType("INTEGER");
b.HasKey("ServerId");
b.ToTable("EFServers");
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFServerStatistics", b =>
{
b.Property<int>("StatisticId")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<long>("ServerId")
.HasColumnType("INTEGER");
b.Property<long>("TotalKills")
.HasColumnType("INTEGER");
b.Property<long>("TotalPlayTime")
.HasColumnType("INTEGER");
b.HasKey("StatisticId");
b.HasIndex("ServerId");
b.ToTable("EFServerStatistics");
});
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFAlias", b =>
{
b.Property<int>("AliasId")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<DateTime>("DateAdded")
.HasColumnType("TEXT");
b.Property<int?>("IPAddress")
.HasColumnType("INTEGER");
b.Property<int>("LinkId")
.HasColumnType("INTEGER");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("TEXT")
.HasMaxLength(24);
b.Property<string>("SearchableName")
.HasColumnType("TEXT")
.HasMaxLength(24);
b.HasKey("AliasId");
b.HasIndex("IPAddress");
b.HasIndex("LinkId");
b.HasIndex("Name");
b.HasIndex("SearchableName");
b.ToTable("EFAlias");
});
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFAliasLink", b =>
{
b.Property<int>("AliasLinkId")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.HasKey("AliasLinkId");
b.ToTable("EFAliasLinks");
});
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFChangeHistory", b =>
{
b.Property<int>("ChangeHistoryId")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<string>("Comment")
.HasColumnType("TEXT")
.HasMaxLength(128);
b.Property<string>("CurrentValue")
.HasColumnType("TEXT");
b.Property<int>("OriginEntityId")
.HasColumnType("INTEGER");
b.Property<string>("PreviousValue")
.HasColumnType("TEXT");
b.Property<int>("TargetEntityId")
.HasColumnType("INTEGER");
b.Property<DateTime>("TimeChanged")
.HasColumnType("TEXT");
b.Property<int>("TypeOfChange")
.HasColumnType("INTEGER");
b.HasKey("ChangeHistoryId");
b.ToTable("EFChangeHistory");
});
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFClient", b =>
{
b.Property<int>("ClientId")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("AliasLinkId")
.HasColumnType("INTEGER");
b.Property<int>("Connections")
.HasColumnType("INTEGER");
b.Property<int>("CurrentAliasId")
.HasColumnType("INTEGER");
b.Property<DateTime>("FirstConnection")
.HasColumnType("TEXT");
b.Property<DateTime>("LastConnection")
.HasColumnType("TEXT");
b.Property<int>("Level")
.HasColumnType("INTEGER");
b.Property<bool>("Masked")
.HasColumnType("INTEGER");
b.Property<long>("NetworkId")
.HasColumnType("INTEGER");
b.Property<string>("Password")
.HasColumnType("TEXT");
b.Property<string>("PasswordSalt")
.HasColumnType("TEXT");
b.Property<int>("TotalConnectionTime")
.HasColumnType("INTEGER");
b.HasKey("ClientId");
b.HasIndex("AliasLinkId");
b.HasIndex("CurrentAliasId");
b.HasIndex("NetworkId")
.IsUnique();
b.ToTable("EFClients");
});
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFMeta", b =>
{
b.Property<int>("MetaId")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("ClientId")
.HasColumnType("INTEGER");
b.Property<DateTime>("Created")
.HasColumnType("TEXT");
b.Property<string>("Extra")
.HasColumnType("TEXT");
b.Property<string>("Key")
.IsRequired()
.HasColumnType("TEXT")
.HasMaxLength(32);
b.Property<DateTime>("Updated")
.HasColumnType("TEXT");
b.Property<string>("Value")
.IsRequired()
.HasColumnType("TEXT");
b.HasKey("MetaId");
b.HasIndex("ClientId");
b.HasIndex("Key");
b.ToTable("EFMeta");
});
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFPenalty", b =>
{
b.Property<int>("PenaltyId")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<string>("AutomatedOffense")
.HasColumnType("TEXT");
b.Property<DateTime?>("Expires")
.HasColumnType("TEXT");
b.Property<bool>("IsEvadedOffense")
.HasColumnType("INTEGER");
b.Property<int>("LinkId")
.HasColumnType("INTEGER");
b.Property<int>("OffenderId")
.HasColumnType("INTEGER");
b.Property<string>("Offense")
.IsRequired()
.HasColumnType("TEXT");
b.Property<int>("PunisherId")
.HasColumnType("INTEGER");
b.Property<int>("Type")
.HasColumnType("INTEGER");
b.Property<DateTime>("When")
.HasColumnType("TEXT");
b.HasKey("PenaltyId");
b.HasIndex("LinkId");
b.HasIndex("OffenderId");
b.HasIndex("PunisherId");
b.ToTable("EFPenalties");
});
modelBuilder.Entity("SharedLibraryCore.Helpers.Vector3", b =>
{
b.Property<int>("Vector3Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<float>("X")
.HasColumnType("REAL");
b.Property<float>("Y")
.HasColumnType("REAL");
b.Property<float>("Z")
.HasColumnType("REAL");
b.HasKey("Vector3Id");
b.ToTable("Vector3");
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFACSnapshot", b =>
{
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
.WithMany()
.HasForeignKey("ClientId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Helpers.Vector3", "CurrentViewAngle")
.WithMany()
.HasForeignKey("CurrentViewAngleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Helpers.Vector3", "HitDestination")
.WithMany()
.HasForeignKey("HitDestinationId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Helpers.Vector3", "HitOrigin")
.WithMany()
.HasForeignKey("HitOriginId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Helpers.Vector3", "LastStrainAngle")
.WithMany()
.HasForeignKey("LastStrainAngleId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFACSnapshotVector3", b =>
{
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFACSnapshot", "Snapshot")
.WithMany("PredictedViewAngles")
.HasForeignKey("SnapshotId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Helpers.Vector3", "Vector")
.WithMany()
.HasForeignKey("Vector3Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientKill", b =>
{
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Attacker")
.WithMany()
.HasForeignKey("AttackerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Helpers.Vector3", "DeathOrigin")
.WithMany()
.HasForeignKey("DeathOriginVector3Id");
b.HasOne("SharedLibraryCore.Helpers.Vector3", "KillOrigin")
.WithMany()
.HasForeignKey("KillOriginVector3Id");
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
.WithMany()
.HasForeignKey("ServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Victim")
.WithMany()
.HasForeignKey("VictimId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Helpers.Vector3", "ViewAngles")
.WithMany()
.HasForeignKey("ViewAnglesVector3Id");
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientMessage", b =>
{
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
.WithMany()
.HasForeignKey("ClientId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
.WithMany()
.HasForeignKey("ServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientRatingHistory", b =>
{
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
.WithMany()
.HasForeignKey("ClientId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientStatistics", b =>
{
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
.WithMany()
.HasForeignKey("ClientId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
.WithMany()
.HasForeignKey("ServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFHitLocationCount", b =>
{
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
.WithMany()
.HasForeignKey("EFClientStatisticsClientId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
.WithMany()
.HasForeignKey("EFClientStatisticsServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFClientStatistics", null)
.WithMany("HitLocations")
.HasForeignKey("EFClientStatisticsClientId", "EFClientStatisticsServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFRating", b =>
{
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFClientRatingHistory", "RatingHistory")
.WithMany("Ratings")
.HasForeignKey("RatingHistoryId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
.WithMany()
.HasForeignKey("ServerId");
});
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFServerStatistics", b =>
{
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
.WithMany()
.HasForeignKey("ServerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFAlias", b =>
{
b.HasOne("SharedLibraryCore.Database.Models.EFAliasLink", "Link")
.WithMany("Children")
.HasForeignKey("LinkId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
});
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFClient", b =>
{
b.HasOne("SharedLibraryCore.Database.Models.EFAliasLink", "AliasLink")
.WithMany()
.HasForeignKey("AliasLinkId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Database.Models.EFAlias", "CurrentAlias")
.WithMany()
.HasForeignKey("CurrentAliasId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFMeta", b =>
{
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
.WithMany("Meta")
.HasForeignKey("ClientId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFPenalty", b =>
{
b.HasOne("SharedLibraryCore.Database.Models.EFAliasLink", "Link")
.WithMany("ReceivedPenalties")
.HasForeignKey("LinkId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Offender")
.WithMany("ReceivedPenalties")
.HasForeignKey("OffenderId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Punisher")
.WithMany("AdministeredPenalties")
.HasForeignKey("PunisherId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,196 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations
{
public partial class RenameClientHitLocationCountColumns : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
if (migrationBuilder.ActiveProvider == "Microsoft.EntityFrameworkCore.Sqlite")
{
migrationBuilder.Sql(@"PRAGMA foreign_keys = 0;
CREATE TABLE sqlitestudio_temp_table AS SELECT *
FROM EFHitLocationCounts;
DROP TABLE EFHitLocationCounts;
CREATE TABLE EFHitLocationCounts (
HitLocationCountId INTEGER NOT NULL
CONSTRAINT PK_EFHitLocationCounts PRIMARY KEY AUTOINCREMENT,
Active INTEGER NOT NULL,
EFClientStatisticsClientId INTEGER NOT NULL,
HitCount INTEGER NOT NULL,
HitOffsetAverage REAL NOT NULL,
Location INTEGER NOT NULL,
EFClientStatisticsServerId INTEGER NOT NULL,
MaxAngleDistance REAL NOT NULL
DEFAULT 0,
CONSTRAINT FK_EFHitLocationCounts_EFClients_EFClientStatistics_ClientId FOREIGN KEY (
EFClientStatisticsClientId
)
REFERENCES EFClients (ClientId) ON DELETE CASCADE,
CONSTRAINT FK_EFHitLocationCounts_EFServers_EFClientStatistics_ServerId FOREIGN KEY (
EFClientStatisticsServerId
)
REFERENCES EFServers (ServerId) ON DELETE CASCADE,
CONSTRAINT FK_EFHitLocationCounts_EFClientStatistics_EFClientStatistics_ClientId_EFClientStatistics_ServerId FOREIGN KEY (
EFClientStatisticsClientId,
EFClientStatisticsServerId
)
REFERENCES EFClientStatistics (ClientId,
ServerId) ON DELETE CASCADE
);
INSERT INTO EFHitLocationCounts (
HitLocationCountId,
Active,
EFClientStatisticsClientId,
HitCount,
HitOffsetAverage,
Location,
EFClientStatisticsServerId,
MaxAngleDistance
)
SELECT HitLocationCountId,
Active,
EFClientStatistics_ClientId,
HitCount,
HitOffsetAverage,
Location,
EFClientStatistics_ServerId,
MaxAngleDistance
FROM sqlitestudio_temp_table;
DROP TABLE sqlitestudio_temp_table;
CREATE INDEX IX_EFHitLocationCounts_EFClientStatistics_ServerId ON EFHitLocationCounts (
EFClientStatisticsServerId
);
CREATE INDEX IX_EFHitLocationCounts_EFClientStatistics_ClientId_EFClientStatistics_ServerId ON EFHitLocationCounts (
EFClientStatisticsClientId,
EFClientStatisticsServerId
);
PRAGMA foreign_keys = 1;
", true);
}
migrationBuilder.DropForeignKey(
name: "FK_EFHitLocationCounts_EFClients_EFClientStatistics_ClientId",
table: "EFHitLocationCounts");
migrationBuilder.DropForeignKey(
name: "FK_EFHitLocationCounts_EFServers_EFClientStatistics_ServerId",
table: "EFHitLocationCounts");
migrationBuilder.DropForeignKey(
name: "FK_EFHitLocationCounts_EFClientStatistics_EFClientStatistics_ClientId_EFClientStatistics_ServerId",
table: "EFHitLocationCounts");
migrationBuilder.RenameColumn(
name: "EFClientStatistics_ServerId",
table: "EFHitLocationCounts",
newName: "EFClientStatisticsServerId");
migrationBuilder.RenameColumn(
name: "EFClientStatistics_ClientId",
table: "EFHitLocationCounts",
newName: "EFClientStatisticsClientId");
migrationBuilder.RenameIndex(
name: "IX_EFHitLocationCounts_EFClientStatistics_ClientId_EFClientStatistics_ServerId",
table: "EFHitLocationCounts",
newName: "IX_EFHitLocationCounts_EFClientStatisticsClientId_EFClientStatisticsServerId");
migrationBuilder.RenameIndex(
name: "IX_EFHitLocationCounts_EFClientStatistics_ServerId",
table: "EFHitLocationCounts",
newName: "IX_EFHitLocationCounts_EFClientStatisticsServerId");
migrationBuilder.AddForeignKey(
name: "FK_EFHitLocationCounts_EFClients_EFClientStatisticsClientId",
table: "EFHitLocationCounts",
column: "EFClientStatisticsClientId",
principalTable: "EFClients",
principalColumn: "ClientId",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_EFHitLocationCounts_EFServers_EFClientStatisticsServerId",
table: "EFHitLocationCounts",
column: "EFClientStatisticsServerId",
principalTable: "EFServers",
principalColumn: "ServerId",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_EFHitLocationCounts_EFClientStatistics_EFClientStatisticsClientId_EFClientStatisticsServerId",
table: "EFHitLocationCounts",
columns: new[] { "EFClientStatisticsClientId", "EFClientStatisticsServerId" },
principalTable: "EFClientStatistics",
principalColumns: new[] { "ClientId", "ServerId" },
onDelete: ReferentialAction.Cascade);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_EFHitLocationCounts_EFClients_EFClientStatisticsClientId",
table: "EFHitLocationCounts");
migrationBuilder.DropForeignKey(
name: "FK_EFHitLocationCounts_EFServers_EFClientStatisticsServerId",
table: "EFHitLocationCounts");
migrationBuilder.DropForeignKey(
name: "FK_EFHitLocationCounts_EFClientStatistics_EFClientStatisticsClientId_EFClientStatisticsServerId",
table: "EFHitLocationCounts");
migrationBuilder.RenameColumn(
name: "EFClientStatisticsServerId",
table: "EFHitLocationCounts",
newName: "EFClientStatistics_ServerId");
migrationBuilder.RenameColumn(
name: "EFClientStatisticsClientId",
table: "EFHitLocationCounts",
newName: "EFClientStatistics_ClientId");
migrationBuilder.RenameIndex(
name: "IX_EFHitLocationCounts_EFClientStatisticsClientId_EFClientStatisticsServerId",
table: "EFHitLocationCounts",
newName: "IX_EFHitLocationCounts_EFClientStatistics_ClientId_EFClientStatistics_ServerId");
migrationBuilder.RenameIndex(
name: "IX_EFHitLocationCounts_EFClientStatisticsServerId",
table: "EFHitLocationCounts",
newName: "IX_EFHitLocationCounts_EFClientStatistics_ServerId");
migrationBuilder.AddForeignKey(
name: "FK_EFHitLocationCounts_EFClients_EFClientStatistics_ClientId",
table: "EFHitLocationCounts",
column: "EFClientStatistics_ClientId",
principalTable: "EFClients",
principalColumn: "ClientId",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_EFHitLocationCounts_EFServers_EFClientStatistics_ServerId",
table: "EFHitLocationCounts",
column: "EFClientStatistics_ServerId",
principalTable: "EFServers",
principalColumn: "ServerId",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_EFHitLocationCounts_EFClientStatistics_EFClientStatistics_ClientId_EFClientStatistics_ServerId",
table: "EFHitLocationCounts",
columns: new[] { "EFClientStatistics_ClientId", "EFClientStatistics_ServerId" },
principalTable: "EFClientStatistics",
principalColumns: new[] { "ClientId", "ServerId" },
onDelete: ReferentialAction.Cascade);
}
}
}

View File

@ -14,62 +14,88 @@ namespace SharedLibraryCore.Migrations
{ {
#pragma warning disable 612, 618 #pragma warning disable 612, 618
modelBuilder modelBuilder
.HasAnnotation("ProductVersion", "2.2.6-servicing-10079"); .HasAnnotation("ProductVersion", "3.0.0");
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFACSnapshot", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFACSnapshot", b =>
{ {
b.Property<int>("SnapshotId") b.Property<int>("SnapshotId")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active"); b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("ClientId"); b.Property<int>("ClientId")
.HasColumnType("INTEGER");
b.Property<int>("CurrentSessionLength"); b.Property<int>("CurrentSessionLength")
.HasColumnType("INTEGER");
b.Property<double>("SessionAverageSnapValue"); b.Property<double>("CurrentStrain")
.HasColumnType("REAL");
b.Property<double>("CurrentStrain"); b.Property<int>("CurrentViewAngleId")
.HasColumnType("INTEGER");
b.Property<int>("CurrentViewAngleId"); b.Property<int>("Deaths")
.HasColumnType("INTEGER");
b.Property<int>("Deaths"); b.Property<double>("Distance")
.HasColumnType("REAL");
b.Property<double>("Distance"); b.Property<double>("EloRating")
.HasColumnType("REAL");
b.Property<double>("EloRating"); b.Property<int>("HitDestinationId")
.HasColumnType("INTEGER");
b.Property<int>("HitDestinationId"); b.Property<int>("HitLocation")
.HasColumnType("INTEGER");
b.Property<int>("HitLocation"); b.Property<int>("HitOriginId")
.HasColumnType("INTEGER");
b.Property<int>("HitOriginId"); b.Property<int>("HitType")
.HasColumnType("INTEGER");
b.Property<int>("HitType"); b.Property<int>("Hits")
.HasColumnType("INTEGER");
b.Property<int>("Hits"); b.Property<int>("Kills")
.HasColumnType("INTEGER");
b.Property<int>("Kills"); b.Property<int>("LastStrainAngleId")
.HasColumnType("INTEGER");
b.Property<int>("LastStrainAngleId"); b.Property<double>("RecoilOffset")
.HasColumnType("REAL");
b.Property<double>("RecoilOffset"); b.Property<double>("SessionAngleOffset")
.HasColumnType("REAL");
b.Property<double>("SessionAngleOffset"); b.Property<double>("SessionAverageSnapValue")
.HasColumnType("REAL");
b.Property<double>("SessionSPM"); b.Property<double>("SessionSPM")
.HasColumnType("REAL");
b.Property<int>("SessionScore"); b.Property<int>("SessionScore")
.HasColumnType("INTEGER");
b.Property<int>("SessionSnapHits"); b.Property<int>("SessionSnapHits")
.HasColumnType("INTEGER");
b.Property<double>("StrainAngleBetween"); b.Property<double>("StrainAngleBetween")
.HasColumnType("REAL");
b.Property<int>("TimeSinceLastEvent"); b.Property<int>("TimeSinceLastEvent")
.HasColumnType("INTEGER");
b.Property<int>("WeaponId"); b.Property<int>("WeaponId")
.HasColumnType("INTEGER");
b.Property<DateTime>("When"); b.Property<DateTime>("When")
.HasColumnType("TEXT");
b.HasKey("SnapshotId"); b.HasKey("SnapshotId");
@ -89,11 +115,14 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFACSnapshotVector3", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFACSnapshotVector3", b =>
{ {
b.Property<int>("ACSnapshotVector3Id") b.Property<int>("ACSnapshotVector3Id")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int>("SnapshotId"); b.Property<int>("SnapshotId")
.HasColumnType("INTEGER");
b.Property<int>("Vector3Id"); b.Property<int>("Vector3Id")
.HasColumnType("INTEGER");
b.HasKey("ACSnapshotVector3Id"); b.HasKey("ACSnapshotVector3Id");
@ -107,39 +136,56 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientKill", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientKill", b =>
{ {
b.Property<long>("KillId") b.Property<long>("KillId")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active"); b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("AttackerId"); b.Property<int>("AttackerId")
.HasColumnType("INTEGER");
b.Property<int>("Damage"); b.Property<int>("Damage")
.HasColumnType("INTEGER");
b.Property<int?>("DeathOriginVector3Id"); b.Property<int?>("DeathOriginVector3Id")
.HasColumnType("INTEGER");
b.Property<int>("DeathType"); b.Property<int>("DeathType")
.HasColumnType("INTEGER");
b.Property<double>("Fraction"); b.Property<double>("Fraction")
.HasColumnType("REAL");
b.Property<int>("HitLoc"); b.Property<int>("HitLoc")
.HasColumnType("INTEGER");
b.Property<bool>("IsKill"); b.Property<bool>("IsKill")
.HasColumnType("INTEGER");
b.Property<int?>("KillOriginVector3Id"); b.Property<int?>("KillOriginVector3Id")
.HasColumnType("INTEGER");
b.Property<int>("Map"); b.Property<int>("Map")
.HasColumnType("INTEGER");
b.Property<long>("ServerId"); b.Property<long>("ServerId")
.HasColumnType("INTEGER");
b.Property<int>("VictimId"); b.Property<int>("VictimId")
.HasColumnType("INTEGER");
b.Property<int?>("ViewAnglesVector3Id"); b.Property<int?>("ViewAnglesVector3Id")
.HasColumnType("INTEGER");
b.Property<double>("VisibilityPercentage"); b.Property<double>("VisibilityPercentage")
.HasColumnType("REAL");
b.Property<int>("Weapon"); b.Property<int>("Weapon")
.HasColumnType("INTEGER");
b.Property<DateTime>("When"); b.Property<DateTime>("When")
.HasColumnType("TEXT");
b.HasKey("KillId"); b.HasKey("KillId");
@ -161,17 +207,23 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientMessage", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientMessage", b =>
{ {
b.Property<long>("MessageId") b.Property<long>("MessageId")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active"); b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("ClientId"); b.Property<int>("ClientId")
.HasColumnType("INTEGER");
b.Property<string>("Message"); b.Property<string>("Message")
.HasColumnType("TEXT");
b.Property<long>("ServerId"); b.Property<long>("ServerId")
.HasColumnType("INTEGER");
b.Property<DateTime>("TimeSent"); b.Property<DateTime>("TimeSent")
.HasColumnType("TEXT");
b.HasKey("MessageId"); b.HasKey("MessageId");
@ -187,11 +239,14 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientRatingHistory", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientRatingHistory", b =>
{ {
b.Property<int>("RatingHistoryId") b.Property<int>("RatingHistoryId")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active"); b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("ClientId"); b.Property<int>("ClientId")
.HasColumnType("INTEGER");
b.HasKey("RatingHistoryId"); b.HasKey("RatingHistoryId");
@ -202,35 +257,50 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientStatistics", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientStatistics", b =>
{ {
b.Property<int>("ClientId"); b.Property<int>("ClientId")
.HasColumnType("INTEGER");
b.Property<long>("ServerId"); b.Property<long>("ServerId")
.HasColumnType("INTEGER");
b.Property<bool>("Active"); b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<double>("AverageRecoilOffset"); b.Property<double>("AverageRecoilOffset")
.HasColumnType("REAL");
b.Property<double>("AverageSnapValue"); b.Property<double>("AverageSnapValue")
.HasColumnType("REAL");
b.Property<int>("Deaths"); b.Property<int>("Deaths")
.HasColumnType("INTEGER");
b.Property<double>("EloRating"); b.Property<double>("EloRating")
.HasColumnType("REAL");
b.Property<int>("Kills"); b.Property<int>("Kills")
.HasColumnType("INTEGER");
b.Property<double>("MaxStrain"); b.Property<double>("MaxStrain")
.HasColumnType("REAL");
b.Property<double>("RollingWeightedKDR"); b.Property<double>("RollingWeightedKDR")
.HasColumnType("REAL");
b.Property<double>("SPM"); b.Property<double>("SPM")
.HasColumnType("REAL");
b.Property<double>("Skill"); b.Property<double>("Skill")
.HasColumnType("REAL");
b.Property<int>("SnapHitCount"); b.Property<int>("SnapHitCount")
.HasColumnType("INTEGER");
b.Property<int>("TimePlayed"); b.Property<int>("TimePlayed")
.HasColumnType("INTEGER");
b.Property<double>("VisionAverage"); b.Property<double>("VisionAverage")
.HasColumnType("REAL");
b.HasKey("ClientId", "ServerId"); b.HasKey("ClientId", "ServerId");
@ -242,29 +312,37 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFHitLocationCount", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFHitLocationCount", b =>
{ {
b.Property<int>("HitLocationCountId") b.Property<int>("HitLocationCountId")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active"); b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("ClientId") b.Property<int>("EFClientStatisticsClientId")
.HasColumnName("EFClientStatistics_ClientId"); .HasColumnName("EFClientStatisticsClientId")
.HasColumnType("INTEGER");
b.Property<int>("HitCount"); b.Property<long>("EFClientStatisticsServerId")
.HasColumnName("EFClientStatisticsServerId")
.HasColumnType("INTEGER");
b.Property<float>("HitOffsetAverage"); b.Property<int>("HitCount")
.HasColumnType("INTEGER");
b.Property<int>("Location"); b.Property<float>("HitOffsetAverage")
.HasColumnType("REAL");
b.Property<float>("MaxAngleDistance"); b.Property<int>("Location")
.HasColumnType("INTEGER");
b.Property<long>("ServerId") b.Property<float>("MaxAngleDistance")
.HasColumnName("EFClientStatistics_ServerId"); .HasColumnType("REAL");
b.HasKey("HitLocationCountId"); b.HasKey("HitLocationCountId");
b.HasIndex("ServerId"); b.HasIndex("EFClientStatisticsServerId");
b.HasIndex("ClientId", "ServerId"); b.HasIndex("EFClientStatisticsClientId", "EFClientStatisticsServerId");
b.ToTable("EFHitLocationCounts"); b.ToTable("EFHitLocationCounts");
}); });
@ -272,23 +350,32 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFRating", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFRating", b =>
{ {
b.Property<int>("RatingId") b.Property<int>("RatingId")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active"); b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("ActivityAmount"); b.Property<int>("ActivityAmount")
.HasColumnType("INTEGER");
b.Property<bool>("Newest"); b.Property<bool>("Newest")
.HasColumnType("INTEGER");
b.Property<double>("Performance"); b.Property<double>("Performance")
.HasColumnType("REAL");
b.Property<int>("Ranking"); b.Property<int>("Ranking")
.HasColumnType("INTEGER");
b.Property<int>("RatingHistoryId"); b.Property<int>("RatingHistoryId")
.HasColumnType("INTEGER");
b.Property<long?>("ServerId"); b.Property<long?>("ServerId")
.HasColumnType("INTEGER");
b.Property<DateTime>("When"); b.Property<DateTime>("When")
.HasColumnType("TEXT");
b.HasKey("RatingId"); b.HasKey("RatingId");
@ -303,15 +390,20 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFServer", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFServer", b =>
{ {
b.Property<long>("ServerId"); b.Property<long>("ServerId")
.HasColumnType("INTEGER");
b.Property<bool>("Active"); b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<string>("EndPoint"); b.Property<string>("EndPoint")
.HasColumnType("TEXT");
b.Property<int?>("GameName"); b.Property<int?>("GameName")
.HasColumnType("INTEGER");
b.Property<int>("Port"); b.Property<int>("Port")
.HasColumnType("INTEGER");
b.HasKey("ServerId"); b.HasKey("ServerId");
@ -321,15 +413,20 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFServerStatistics", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFServerStatistics", b =>
{ {
b.Property<int>("StatisticId") b.Property<int>("StatisticId")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active"); b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<long>("ServerId"); b.Property<long>("ServerId")
.HasColumnType("INTEGER");
b.Property<long>("TotalKills"); b.Property<long>("TotalKills")
.HasColumnType("INTEGER");
b.Property<long>("TotalPlayTime"); b.Property<long>("TotalPlayTime")
.HasColumnType("INTEGER");
b.HasKey("StatisticId"); b.HasKey("StatisticId");
@ -341,21 +438,28 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFAlias", b => modelBuilder.Entity("SharedLibraryCore.Database.Models.EFAlias", b =>
{ {
b.Property<int>("AliasId") b.Property<int>("AliasId")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active"); b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<DateTime>("DateAdded"); b.Property<DateTime>("DateAdded")
.HasColumnType("TEXT");
b.Property<int?>("IPAddress"); b.Property<int?>("IPAddress")
.HasColumnType("INTEGER");
b.Property<int>("LinkId"); b.Property<int>("LinkId")
.HasColumnType("INTEGER");
b.Property<string>("Name") b.Property<string>("Name")
.IsRequired() .IsRequired()
.HasColumnType("TEXT")
.HasMaxLength(24); .HasMaxLength(24);
b.Property<string>("SearchableName") b.Property<string>("SearchableName")
.HasColumnType("TEXT")
.HasMaxLength(24); .HasMaxLength(24);
b.HasKey("AliasId"); b.HasKey("AliasId");
@ -374,9 +478,11 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFAliasLink", b => modelBuilder.Entity("SharedLibraryCore.Database.Models.EFAliasLink", b =>
{ {
b.Property<int>("AliasLinkId") b.Property<int>("AliasLinkId")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active"); b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.HasKey("AliasLinkId"); b.HasKey("AliasLinkId");
@ -386,24 +492,33 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFChangeHistory", b => modelBuilder.Entity("SharedLibraryCore.Database.Models.EFChangeHistory", b =>
{ {
b.Property<int>("ChangeHistoryId") b.Property<int>("ChangeHistoryId")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active"); b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<string>("Comment") b.Property<string>("Comment")
.HasColumnType("TEXT")
.HasMaxLength(128); .HasMaxLength(128);
b.Property<string>("CurrentValue"); b.Property<string>("CurrentValue")
.HasColumnType("TEXT");
b.Property<int>("OriginEntityId"); b.Property<int>("OriginEntityId")
.HasColumnType("INTEGER");
b.Property<string>("PreviousValue"); b.Property<string>("PreviousValue")
.HasColumnType("TEXT");
b.Property<int>("TargetEntityId"); b.Property<int>("TargetEntityId")
.HasColumnType("INTEGER");
b.Property<DateTime>("TimeChanged"); b.Property<DateTime>("TimeChanged")
.HasColumnType("TEXT");
b.Property<int>("TypeOfChange"); b.Property<int>("TypeOfChange")
.HasColumnType("INTEGER");
b.HasKey("ChangeHistoryId"); b.HasKey("ChangeHistoryId");
@ -413,31 +528,44 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFClient", b => modelBuilder.Entity("SharedLibraryCore.Database.Models.EFClient", b =>
{ {
b.Property<int>("ClientId") b.Property<int>("ClientId")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active"); b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("AliasLinkId"); b.Property<int>("AliasLinkId")
.HasColumnType("INTEGER");
b.Property<int>("Connections"); b.Property<int>("Connections")
.HasColumnType("INTEGER");
b.Property<int>("CurrentAliasId"); b.Property<int>("CurrentAliasId")
.HasColumnType("INTEGER");
b.Property<DateTime>("FirstConnection"); b.Property<DateTime>("FirstConnection")
.HasColumnType("TEXT");
b.Property<DateTime>("LastConnection"); b.Property<DateTime>("LastConnection")
.HasColumnType("TEXT");
b.Property<int>("Level"); b.Property<int>("Level")
.HasColumnType("INTEGER");
b.Property<bool>("Masked"); b.Property<bool>("Masked")
.HasColumnType("INTEGER");
b.Property<long>("NetworkId"); b.Property<long>("NetworkId")
.HasColumnType("INTEGER");
b.Property<string>("Password"); b.Property<string>("Password")
.HasColumnType("TEXT");
b.Property<string>("PasswordSalt"); b.Property<string>("PasswordSalt")
.HasColumnType("TEXT");
b.Property<int>("TotalConnectionTime"); b.Property<int>("TotalConnectionTime")
.HasColumnType("INTEGER");
b.HasKey("ClientId"); b.HasKey("ClientId");
@ -454,24 +582,32 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFMeta", b => modelBuilder.Entity("SharedLibraryCore.Database.Models.EFMeta", b =>
{ {
b.Property<int>("MetaId") b.Property<int>("MetaId")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active"); b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<int>("ClientId"); b.Property<int>("ClientId")
.HasColumnType("INTEGER");
b.Property<DateTime>("Created"); b.Property<DateTime>("Created")
.HasColumnType("TEXT");
b.Property<string>("Extra"); b.Property<string>("Extra")
.HasColumnType("TEXT");
b.Property<string>("Key") b.Property<string>("Key")
.IsRequired() .IsRequired()
.HasColumnType("TEXT")
.HasMaxLength(32); .HasMaxLength(32);
b.Property<DateTime>("Updated"); b.Property<DateTime>("Updated")
.HasColumnType("TEXT");
b.Property<string>("Value") b.Property<string>("Value")
.IsRequired(); .IsRequired()
.HasColumnType("TEXT");
b.HasKey("MetaId"); b.HasKey("MetaId");
@ -485,28 +621,39 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFPenalty", b => modelBuilder.Entity("SharedLibraryCore.Database.Models.EFPenalty", b =>
{ {
b.Property<int>("PenaltyId") b.Property<int>("PenaltyId")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("Active"); b.Property<bool>("Active")
.HasColumnType("INTEGER");
b.Property<string>("AutomatedOffense"); b.Property<string>("AutomatedOffense")
.HasColumnType("TEXT");
b.Property<DateTime?>("Expires"); b.Property<DateTime?>("Expires")
.HasColumnType("TEXT");
b.Property<bool>("IsEvadedOffense"); b.Property<bool>("IsEvadedOffense")
.HasColumnType("INTEGER");
b.Property<int>("LinkId"); b.Property<int>("LinkId")
.HasColumnType("INTEGER");
b.Property<int>("OffenderId"); b.Property<int>("OffenderId")
.HasColumnType("INTEGER");
b.Property<string>("Offense") b.Property<string>("Offense")
.IsRequired(); .IsRequired()
.HasColumnType("TEXT");
b.Property<int>("PunisherId"); b.Property<int>("PunisherId")
.HasColumnType("INTEGER");
b.Property<int>("Type"); b.Property<int>("Type")
.HasColumnType("INTEGER");
b.Property<DateTime>("When"); b.Property<DateTime>("When")
.HasColumnType("TEXT");
b.HasKey("PenaltyId"); b.HasKey("PenaltyId");
@ -522,13 +669,17 @@ namespace SharedLibraryCore.Migrations
modelBuilder.Entity("SharedLibraryCore.Helpers.Vector3", b => modelBuilder.Entity("SharedLibraryCore.Helpers.Vector3", b =>
{ {
b.Property<int>("Vector3Id") b.Property<int>("Vector3Id")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<float>("X"); b.Property<float>("X")
.HasColumnType("REAL");
b.Property<float>("Y"); b.Property<float>("Y")
.HasColumnType("REAL");
b.Property<float>("Z"); b.Property<float>("Z")
.HasColumnType("REAL");
b.HasKey("Vector3Id"); b.HasKey("Vector3Id");
@ -540,27 +691,32 @@ namespace SharedLibraryCore.Migrations
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client") b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
.WithMany() .WithMany()
.HasForeignKey("ClientId") .HasForeignKey("ClientId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Helpers.Vector3", "CurrentViewAngle") b.HasOne("SharedLibraryCore.Helpers.Vector3", "CurrentViewAngle")
.WithMany() .WithMany()
.HasForeignKey("CurrentViewAngleId") .HasForeignKey("CurrentViewAngleId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Helpers.Vector3", "HitDestination") b.HasOne("SharedLibraryCore.Helpers.Vector3", "HitDestination")
.WithMany() .WithMany()
.HasForeignKey("HitDestinationId") .HasForeignKey("HitDestinationId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Helpers.Vector3", "HitOrigin") b.HasOne("SharedLibraryCore.Helpers.Vector3", "HitOrigin")
.WithMany() .WithMany()
.HasForeignKey("HitOriginId") .HasForeignKey("HitOriginId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Helpers.Vector3", "LastStrainAngle") b.HasOne("SharedLibraryCore.Helpers.Vector3", "LastStrainAngle")
.WithMany() .WithMany()
.HasForeignKey("LastStrainAngleId") .HasForeignKey("LastStrainAngleId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFACSnapshotVector3", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFACSnapshotVector3", b =>
@ -568,12 +724,14 @@ namespace SharedLibraryCore.Migrations
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFACSnapshot", "Snapshot") b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFACSnapshot", "Snapshot")
.WithMany("PredictedViewAngles") .WithMany("PredictedViewAngles")
.HasForeignKey("SnapshotId") .HasForeignKey("SnapshotId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Helpers.Vector3", "Vector") b.HasOne("SharedLibraryCore.Helpers.Vector3", "Vector")
.WithMany() .WithMany()
.HasForeignKey("Vector3Id") .HasForeignKey("Vector3Id")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientKill", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientKill", b =>
@ -581,7 +739,8 @@ namespace SharedLibraryCore.Migrations
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Attacker") b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Attacker")
.WithMany() .WithMany()
.HasForeignKey("AttackerId") .HasForeignKey("AttackerId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Helpers.Vector3", "DeathOrigin") b.HasOne("SharedLibraryCore.Helpers.Vector3", "DeathOrigin")
.WithMany() .WithMany()
@ -594,12 +753,14 @@ namespace SharedLibraryCore.Migrations
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server") b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
.WithMany() .WithMany()
.HasForeignKey("ServerId") .HasForeignKey("ServerId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Victim") b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Victim")
.WithMany() .WithMany()
.HasForeignKey("VictimId") .HasForeignKey("VictimId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Helpers.Vector3", "ViewAngles") b.HasOne("SharedLibraryCore.Helpers.Vector3", "ViewAngles")
.WithMany() .WithMany()
@ -611,12 +772,14 @@ namespace SharedLibraryCore.Migrations
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client") b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
.WithMany() .WithMany()
.HasForeignKey("ClientId") .HasForeignKey("ClientId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server") b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
.WithMany() .WithMany()
.HasForeignKey("ServerId") .HasForeignKey("ServerId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientRatingHistory", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientRatingHistory", b =>
@ -624,7 +787,8 @@ namespace SharedLibraryCore.Migrations
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client") b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
.WithMany() .WithMany()
.HasForeignKey("ClientId") .HasForeignKey("ClientId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientStatistics", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFClientStatistics", b =>
@ -632,30 +796,35 @@ namespace SharedLibraryCore.Migrations
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client") b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
.WithMany() .WithMany()
.HasForeignKey("ClientId") .HasForeignKey("ClientId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server") b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
.WithMany() .WithMany()
.HasForeignKey("ServerId") .HasForeignKey("ServerId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFHitLocationCount", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFHitLocationCount", b =>
{ {
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client") b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
.WithMany() .WithMany()
.HasForeignKey("ClientId") .HasForeignKey("EFClientStatisticsClientId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server") b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
.WithMany() .WithMany()
.HasForeignKey("ServerId") .HasForeignKey("EFClientStatisticsServerId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFClientStatistics") b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFClientStatistics", null)
.WithMany("HitLocations") .WithMany("HitLocations")
.HasForeignKey("ClientId", "ServerId") .HasForeignKey("EFClientStatisticsClientId", "EFClientStatisticsServerId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFRating", b => modelBuilder.Entity("IW4MAdmin.Plugins.Stats.Models.EFRating", b =>
@ -663,7 +832,8 @@ namespace SharedLibraryCore.Migrations
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFClientRatingHistory", "RatingHistory") b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFClientRatingHistory", "RatingHistory")
.WithMany("Ratings") .WithMany("Ratings")
.HasForeignKey("RatingHistoryId") .HasForeignKey("RatingHistoryId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server") b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
.WithMany() .WithMany()
@ -675,7 +845,8 @@ namespace SharedLibraryCore.Migrations
b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server") b.HasOne("IW4MAdmin.Plugins.Stats.Models.EFServer", "Server")
.WithMany() .WithMany()
.HasForeignKey("ServerId") .HasForeignKey("ServerId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFAlias", b => modelBuilder.Entity("SharedLibraryCore.Database.Models.EFAlias", b =>
@ -683,7 +854,8 @@ namespace SharedLibraryCore.Migrations
b.HasOne("SharedLibraryCore.Database.Models.EFAliasLink", "Link") b.HasOne("SharedLibraryCore.Database.Models.EFAliasLink", "Link")
.WithMany("Children") .WithMany("Children")
.HasForeignKey("LinkId") .HasForeignKey("LinkId")
.OnDelete(DeleteBehavior.Restrict); .OnDelete(DeleteBehavior.Restrict)
.IsRequired();
}); });
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFClient", b => modelBuilder.Entity("SharedLibraryCore.Database.Models.EFClient", b =>
@ -691,12 +863,14 @@ namespace SharedLibraryCore.Migrations
b.HasOne("SharedLibraryCore.Database.Models.EFAliasLink", "AliasLink") b.HasOne("SharedLibraryCore.Database.Models.EFAliasLink", "AliasLink")
.WithMany() .WithMany()
.HasForeignKey("AliasLinkId") .HasForeignKey("AliasLinkId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Database.Models.EFAlias", "CurrentAlias") b.HasOne("SharedLibraryCore.Database.Models.EFAlias", "CurrentAlias")
.WithMany() .WithMany()
.HasForeignKey("CurrentAliasId") .HasForeignKey("CurrentAliasId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFMeta", b => modelBuilder.Entity("SharedLibraryCore.Database.Models.EFMeta", b =>
@ -704,7 +878,8 @@ namespace SharedLibraryCore.Migrations
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client") b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Client")
.WithMany("Meta") .WithMany("Meta")
.HasForeignKey("ClientId") .HasForeignKey("ClientId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
}); });
modelBuilder.Entity("SharedLibraryCore.Database.Models.EFPenalty", b => modelBuilder.Entity("SharedLibraryCore.Database.Models.EFPenalty", b =>
@ -712,17 +887,20 @@ namespace SharedLibraryCore.Migrations
b.HasOne("SharedLibraryCore.Database.Models.EFAliasLink", "Link") b.HasOne("SharedLibraryCore.Database.Models.EFAliasLink", "Link")
.WithMany("ReceivedPenalties") .WithMany("ReceivedPenalties")
.HasForeignKey("LinkId") .HasForeignKey("LinkId")
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Offender") b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Offender")
.WithMany("ReceivedPenalties") .WithMany("ReceivedPenalties")
.HasForeignKey("OffenderId") .HasForeignKey("OffenderId")
.OnDelete(DeleteBehavior.Restrict); .OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Punisher") b.HasOne("SharedLibraryCore.Database.Models.EFClient", "Punisher")
.WithMany("AdministeredPenalties") .WithMany("AdministeredPenalties")
.HasForeignKey("PunisherId") .HasForeignKey("PunisherId")
.OnDelete(DeleteBehavior.Restrict); .OnDelete(DeleteBehavior.Restrict)
.IsRequired();
}); });
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }

View File

@ -290,26 +290,26 @@ namespace SharedLibraryCore.Services
{ {
using (var context = new DatabaseContext(true)) using (var context = new DatabaseContext(true))
{ {
var iqClient = from client in context.Clients var iqClient = from _c in context.Clients
.Include(c => c.CurrentAlias) .Include(c => c.CurrentAlias)
.Include(c => c.AliasLink.Children) .Include(c => c.AliasLink.Children)
.Include(c => c.Meta) .Include(c => c.Meta)
where client.ClientId == entityID where _c.ClientId == entityID
select new select _c;
{
Client = client, var client = await iqClient.FirstOrDefaultAsync();
LinkedAccounts = (from linkedClient in context.Clients
where client.AliasLinkId == linkedClient.AliasLinkId var foundClient = new
select new {
{ Client = client,
linkedClient.ClientId, LinkedAccounts = await context.Clients.Where(_client => _client.AliasLinkId == client.AliasLinkId)
linkedClient.NetworkId .Select(_linkedClient => new
}) {
}; _linkedClient.ClientId,
#if DEBUG == true _linkedClient.NetworkId
var clientSql = iqClient.ToSql(); })
#endif .ToListAsync()
var foundClient = await iqClient.FirstOrDefaultAsync(); };
if (foundClient == null) if (foundClient == null)
{ {
@ -585,6 +585,7 @@ namespace SharedLibraryCore.Services
var iqClients = context.Clients var iqClients = context.Clients
.Where(_client => _client.CurrentAlias.IPAddress != null) .Where(_client => _client.CurrentAlias.IPAddress != null)
.Where(_client => _client.FirstConnection >= startOfPeriod) .Where(_client => _client.FirstConnection >= startOfPeriod)
.OrderByDescending(_client => _client.FirstConnection)
.Select(_client => new PlayerInfo() .Select(_client => new PlayerInfo()
{ {
ClientId = _client.ClientId, ClientId = _client.ClientId,
@ -592,6 +593,7 @@ namespace SharedLibraryCore.Services
IPAddress = _client.CurrentAlias.IPAddress.ConvertIPtoString(), IPAddress = _client.CurrentAlias.IPAddress.ConvertIPtoString(),
LastConnection = _client.FirstConnection LastConnection = _client.FirstConnection
}); });
#if DEBUG #if DEBUG
var sql = iqClients.ToSql(); var sql = iqClients.ToSql();
#endif #endif

View File

@ -25,7 +25,7 @@ namespace SharedLibraryCore
public static class Utilities public static class Utilities
{ {
#if DEBUG == true #if DEBUG == true
public static string OperatingDirectory => $"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}{Path.DirectorySeparatorChar}"; public static string OperatingDirectory => $"{Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)}{Path.DirectorySeparatorChar}";
#else #else
public static string OperatingDirectory => $"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}{Path.DirectorySeparatorChar}..{Path.DirectorySeparatorChar}"; public static string OperatingDirectory => $"{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}{Path.DirectorySeparatorChar}..{Path.DirectorySeparatorChar}";
#endif #endif
@ -850,30 +850,9 @@ namespace SharedLibraryCore
public static bool ShouldHideLevel(this Permission perm) => perm == Permission.Flagged; public static bool ShouldHideLevel(this Permission perm) => perm == Permission.Flagged;
#if DEBUG == true #if DEBUG == true
private static readonly TypeInfo QueryCompilerTypeInfo = typeof(QueryCompiler).GetTypeInfo();
private static readonly FieldInfo QueryCompilerField = typeof(EntityQueryProvider).GetTypeInfo().DeclaredFields.First(x => x.Name == "_queryCompiler");
private static readonly FieldInfo QueryModelGeneratorField = QueryCompilerTypeInfo.DeclaredFields.First(x => x.Name == "_queryModelGenerator");
private static readonly FieldInfo DataBaseField = QueryCompilerTypeInfo.DeclaredFields.Single(x => x.Name == "_database");
private static readonly PropertyInfo DatabaseDependenciesField = typeof(Microsoft.EntityFrameworkCore.Storage.Database).GetTypeInfo().DeclaredProperties.Single(x => x.Name == "Dependencies");
public static string ToSql<TEntity>(this IQueryable<TEntity> query) where TEntity : class public static string ToSql<TEntity>(this IQueryable<TEntity> query) where TEntity : class
{ {
var queryCompiler = (QueryCompiler)QueryCompilerField.GetValue(query.Provider); return "";
var modelGenerator = (QueryModelGenerator)QueryModelGeneratorField.GetValue(queryCompiler);
var queryModel = modelGenerator.ParseQuery(query.Expression);
var database = (IDatabase)DataBaseField.GetValue(queryCompiler);
var databaseDependencies = (DatabaseDependencies)DatabaseDependenciesField.GetValue(database);
var queryCompilationContext = databaseDependencies.QueryCompilationContextFactory.Create(false);
var modelVisitor = (RelationalQueryModelVisitor)queryCompilationContext.CreateQueryModelVisitor();
modelVisitor.CreateQueryExecutor<TEntity>(queryModel);
var sql = modelVisitor.Queries.First().ToString();
return sql;
} }
#endif #endif
} }

View File

@ -13,7 +13,6 @@ namespace WebfrontCore
{ {
public class Startup public class Startup
{ {
private readonly IWebHostEnvironment _appHost;
public static IConfigurationRoot Configuration { get; private set; } public static IConfigurationRoot Configuration { get; private set; }
public Startup(IWebHostEnvironment env) public Startup(IWebHostEnvironment env)
@ -22,8 +21,6 @@ namespace WebfrontCore
.AddEnvironmentVariables(); .AddEnvironmentVariables();
Configuration = builder.Build(); Configuration = builder.Build();
_appHost = env;
} }
// This method gets called by the runtime. Use this method to add services to the container. // This method gets called by the runtime. Use this method to add services to the container.
@ -112,6 +109,7 @@ namespace WebfrontCore
app.UseStaticFiles(); app.UseStaticFiles();
app.UseAuthentication(); app.UseAuthentication();
app.UseAuthorization();
app.UseCors("AllowAll"); app.UseCors("AllowAll");
app.UseRouting(); app.UseRouting();