Play time tracking: Job timers 3: more titles: when the (#9978)
Co-authored-by: Veritius <veritiusgaming@gmail.com> Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
This commit is contained in:
committed by
GitHub
parent
6b94db0336
commit
e852ada6c8
@@ -359,6 +359,59 @@ namespace Content.Server.Database
|
||||
public abstract Task AddServerRoleUnbanAsync(ServerRoleUnbanDef serverRoleUnban);
|
||||
#endregion
|
||||
|
||||
#region Playtime
|
||||
public async Task<List<PlayTime>> GetPlayTimes(Guid player)
|
||||
{
|
||||
await using var db = await GetDb();
|
||||
|
||||
return await db.DbContext.PlayTime
|
||||
.Where(p => p.PlayerId == player)
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
public async Task UpdatePlayTimes(IReadOnlyCollection<PlayTimeUpdate> updates)
|
||||
{
|
||||
await using var db = await GetDb();
|
||||
|
||||
// Ideally I would just be able to send a bunch of UPSERT commands, but EFCore is a pile of garbage.
|
||||
// So... In the interest of not making this take forever at high update counts...
|
||||
// Bulk-load play time objects for all players involved.
|
||||
// This allows us to semi-efficiently load all entities we need in a single DB query.
|
||||
// Then we can update & insert without further round-trips to the DB.
|
||||
|
||||
var players = updates.Select(u => u.User.UserId).Distinct().ToArray();
|
||||
var dbTimes = (await db.DbContext.PlayTime
|
||||
.Where(p => players.Contains(p.PlayerId))
|
||||
.ToArrayAsync())
|
||||
.GroupBy(p => p.PlayerId)
|
||||
.ToDictionary(g => g.Key, g => g.ToDictionary(p => p.Tracker, p => p));
|
||||
|
||||
foreach (var (user, tracker, time) in updates)
|
||||
{
|
||||
if (dbTimes.TryGetValue(user.UserId, out var userTimes)
|
||||
&& userTimes.TryGetValue(tracker, out var ent))
|
||||
{
|
||||
// Already have a tracker in the database, update it.
|
||||
ent.TimeSpent = time;
|
||||
continue;
|
||||
}
|
||||
|
||||
// No tracker, make a new one.
|
||||
var playTime = new PlayTime
|
||||
{
|
||||
Tracker = tracker,
|
||||
PlayerId = user.UserId,
|
||||
TimeSpent = time
|
||||
};
|
||||
|
||||
db.DbContext.PlayTime.Add(playTime);
|
||||
}
|
||||
|
||||
await db.DbContext.SaveChangesAsync();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Player Records
|
||||
/*
|
||||
* PLAYER RECORDS
|
||||
@@ -597,14 +650,15 @@ namespace Content.Server.Database
|
||||
|
||||
#region Admin Logs
|
||||
|
||||
public async Task<Server> AddOrGetServer(string serverName)
|
||||
public async Task<(Server, bool existed)> AddOrGetServer(string serverName)
|
||||
{
|
||||
await using var db = await GetDb();
|
||||
var server = await db.DbContext.Server.Where(server => server.Name.Equals(serverName)).SingleOrDefaultAsync();
|
||||
var server = await db.DbContext.Server
|
||||
.Where(server => server.Name.Equals(serverName))
|
||||
.SingleOrDefaultAsync();
|
||||
|
||||
if (server != default)
|
||||
{
|
||||
return server;
|
||||
}
|
||||
return (server, true);
|
||||
|
||||
server = new Server
|
||||
{
|
||||
@@ -615,7 +669,7 @@ namespace Content.Server.Database
|
||||
|
||||
await db.DbContext.SaveChangesAsync();
|
||||
|
||||
return server;
|
||||
return (server, false);
|
||||
}
|
||||
|
||||
public virtual async Task AddAdminLogs(List<QueuedLog> logs)
|
||||
@@ -921,5 +975,6 @@ namespace Content.Server.Database
|
||||
|
||||
public abstract ValueTask DisposeAsync();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user