Files
SPT-Server-Build/Libraries/SPTarkov.Server.Core/Services/MatchBotDetailsCacheService.cs
T
Chomp 31ae5feb41 Bot generation performance (#231)
* chore: Bot generation performance improvements (#227)

* Bot generation performance improvements

* Revert debug logging logic

* Get rid of Info log which is bound to be printed inevitably at each bot wave generation

* Use assault const

* Removed comments

Removed lowercase side constants
Renamed equipment role to better explain its purpose

Fixed `Blocks` property being serialised to client

Updated `_slotsWithNoCompatIssues` to use existing enum type

Reduced log line to be debug

* Fixed `GetRandomTextThatMatchesPartialKey` incorrectly checking eft locales instead of spt locales

* Updated various methods to be protected

---------

Co-authored-by: hulkhan22 <clandestine984@gmail.com>
Co-authored-by: Chomp <dev@dev.sp-tarkov.com>
2025-05-04 12:51:45 +01:00

90 lines
2.5 KiB
C#

using System.Collections.Concurrent;
using SPTarkov.Common.Annotations;
using SPTarkov.Server.Core.Constants;
using SPTarkov.Server.Core.Models.Eft.Common.Tables;
using SPTarkov.Server.Core.Models.Enums;
using SPTarkov.Server.Core.Models.Spt.Bots;
using SPTarkov.Server.Core.Models.Utils;
namespace SPTarkov.Server.Core.Services;
/// <summary>
/// Cache bots in a dictionary, keyed by the bots ID
/// </summary>
[Injectable(InjectionType.Singleton)]
public class MatchBotDetailsCacheService(
ISptLogger<MatchBotDetailsCacheService> _logger
)
{
private static readonly HashSet<string> _sidesToCache =
[
Sides.PmcUsec,
Sides.PmcBear
];
protected readonly ConcurrentDictionary<string, BotDetailsForChatMessages> BotDetailsCache = new();
/// <summary>
/// Store a bot in the cache, keyed by its ID.
/// </summary>
/// <param name="botToCache"> Bot details to cache </param>
public void CacheBot(BotBase botToCache)
{
if (botToCache is null || botToCache.Id is null)
{
return;
}
if (botToCache.Info?.Nickname is null)
{
_logger.Warning($"Unable to cache: {botToCache.Info?.Settings?.Role} bot with id: {botToCache.Id} as it lacks a nickname");
return;
}
// If bot isn't a PMC, skip
if (botToCache.Info?.Settings?.Role is null || !_sidesToCache.Contains(botToCache.Info.Settings.Role))
{
return;
}
BotDetailsCache.TryAdd(botToCache.Id, new BotDetailsForChatMessages()
{
Nickname = botToCache.Info.Nickname.Trim(),
Side = botToCache.Info.Side == Sides.PmcUsec ? DogtagSide.Usec : DogtagSide.Bear,
Aid = botToCache.Aid,
Type = botToCache.Info.MemberCategory,
Level = botToCache.Info.Level,
});
}
/// <summary>
/// Clean the cache of all bot details.
/// </summary>
public void ClearCache()
{
BotDetailsCache.Clear();
}
/// <summary>
/// Find a bot in the cache by its ID.
/// </summary>
/// <param name="id"> ID of bot to find </param>
/// <returns></returns>
public BotDetailsForChatMessages? GetBotById(string? id)
{
if (id == null)
{
return null;
}
var botInCache = BotDetailsCache.GetValueOrDefault(id, null);
if (botInCache is null)
{
_logger.Warning($"Bot not found in match bot cache: {id}");
return null;
}
return botInCache;
}
}