Admin logs (#5419)
* Add admin logging, models, migrations * Add logging damage changes * Add Log admin flag, LogFilter, Logs admin menu tab, message Refactor admin logging API * Change admin log get method names * Fix the name again * Minute amount of reorganization * Reset Postgres db snapshot * Reset Sqlite db snapshot * Make AdminLog have a composite primary key of round, id * Minute cleanup * Change admin system to do a type check instead of index check * Make admin logs use C# 10 interpolated string handlers * Implement UI on its own window Custom controls Searching Add admin log converters * Implement limits into the query * Change logs to be put into an OutputPanel instead for text wrapping * Add log <-> player m2m relationship back * UI improvements, make text wrap, add separators * Remove entity prefix from damaged log * Add explicit m2m model, fix any players filter * Add debug command to test bulk adding logs * Admin logs now just kinda go * Add histogram for database update time * Make admin log system update run every 5 seconds * Add a cap to the log queue and a metric for how many times it has been reached * Add metric for logs sent in a round * Make cvars out of admin logs queue send delay and cap * Merge fixes * Reset some changes * Add test for adding and getting a single log * Add tests for bulk adding logs * Add test for querying logs * Add CallerArgumentExpression to LogStringHandler methods and test * Improve UI, fix SQLite, add searching by round * Add entities to admin logs * Move distinct after orderby * Add migrations * ef core eat my ass * Add cvar for client logs batch size * Sort logs from newest to oldest by default * Merge fixes * Reorganize tests and add one for date ordering * Add note to log types to not change their numeric values * Add impacts to logs, better UI filtering * Make log add callable from shared for convenience * Get current round id directly from game ticker * Revert namespace change for DamageableSystem
This commit is contained in:
committed by
GitHub
parent
0f7e81b564
commit
319aec109d
@@ -3,6 +3,8 @@ using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Net;
|
||||
using System.Text.Json;
|
||||
using Content.Shared.Administration.Logs;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace Content.Server.Database
|
||||
@@ -31,6 +33,9 @@ namespace Content.Server.Database
|
||||
public DbSet<Player> Player { get; set; } = default!;
|
||||
public DbSet<Admin> Admin { get; set; } = null!;
|
||||
public DbSet<AdminRank> AdminRank { get; set; } = null!;
|
||||
public DbSet<Round> Round { get; set; } = null!;
|
||||
public DbSet<AdminLog> AdminLog { get; set; } = null!;
|
||||
public DbSet<AdminLogPlayer> AdminLogPlayer { get; set; } = null!;
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
@@ -79,6 +84,22 @@ namespace Content.Server.Database
|
||||
modelBuilder.Entity<AdminRankFlag>()
|
||||
.HasIndex(f => new {f.Flag, f.AdminRankId})
|
||||
.IsUnique();
|
||||
|
||||
modelBuilder.Entity<AdminLog>()
|
||||
.HasKey(log => new {log.Id, log.RoundId});
|
||||
|
||||
modelBuilder.Entity<AdminLog>()
|
||||
.Property(log => log.Id)
|
||||
.ValueGeneratedOnAdd();
|
||||
|
||||
modelBuilder.Entity<AdminLogPlayer>()
|
||||
.HasOne(player => player.Player)
|
||||
.WithMany(player => player.AdminLogs)
|
||||
.HasForeignKey(player => player.PlayerUserId)
|
||||
.HasPrincipalKey(player => player.UserId);
|
||||
|
||||
modelBuilder.Entity<AdminLogPlayer>()
|
||||
.HasKey(logPlayer => new {logPlayer.PlayerUserId, logPlayer.LogId, logPlayer.RoundId});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,6 +199,10 @@ namespace Content.Server.Database
|
||||
public DateTime LastSeenTime { get; set; }
|
||||
public IPAddress LastSeenAddress { get; set; } = null!;
|
||||
public byte[]? LastSeenHWId { get; set; }
|
||||
|
||||
// Data that changes with each round
|
||||
public List<Round> Rounds { get; set; } = null!;
|
||||
public List<AdminLogPlayer> AdminLogs { get; set; } = null!;
|
||||
}
|
||||
|
||||
public class Admin
|
||||
@@ -217,4 +242,54 @@ namespace Content.Server.Database
|
||||
public int AdminRankId { get; set; }
|
||||
public AdminRank Rank { get; set; } = default!;
|
||||
}
|
||||
|
||||
public class Round
|
||||
{
|
||||
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||
public int Id { get; set; }
|
||||
|
||||
public List<Player> Players { get; set; } = default!;
|
||||
|
||||
public List<AdminLog> AdminLogs { get; set; } = default!;
|
||||
}
|
||||
|
||||
[Index(nameof(Type))]
|
||||
public class AdminLog
|
||||
{
|
||||
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||
public int Id { get; set; }
|
||||
|
||||
[Key, ForeignKey("Round")] public int RoundId { get; set; }
|
||||
public Round Round { get; set; } = default!;
|
||||
|
||||
[Required] public LogType Type { get; set; }
|
||||
|
||||
[Required] public LogImpact Impact { get; set; }
|
||||
|
||||
[Required] public DateTime Date { get; set; }
|
||||
|
||||
[Required] public string Message { get; set; } = default!;
|
||||
|
||||
[Required, Column(TypeName = "jsonb")] public JsonDocument Json { get; set; } = default!;
|
||||
|
||||
public List<AdminLogPlayer> Players { get; set; } = default!;
|
||||
|
||||
public List<AdminLogEntity> Entities { get; set; } = default!;
|
||||
}
|
||||
|
||||
public class AdminLogPlayer
|
||||
{
|
||||
[Required, Key, ForeignKey("Player")] public Guid PlayerUserId { get; set; }
|
||||
public Player Player { get; set; } = default!;
|
||||
|
||||
[Required, Key] public int LogId { get; set; }
|
||||
[Required, Key] public int RoundId { get; set; }
|
||||
[ForeignKey("LogId,RoundId")] public AdminLog Log { get; set; } = default!;
|
||||
}
|
||||
|
||||
public class AdminLogEntity
|
||||
{
|
||||
[Required, Key] public int Uid { get; set; }
|
||||
public string? Name { get; set; } = default!;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user