Files
SPT-Server-Build/Libraries/SPTarkov.Server.Core/Helpers/Dialogue/AbstractDialogChatBot.cs
T
2025-07-28 19:39:29 +00:00

97 lines
3.3 KiB
C#

using SPTarkov.Server.Core.Helpers.Dialog.Commando;
using SPTarkov.Server.Core.Models.Common;
using SPTarkov.Server.Core.Models.Eft.Dialog;
using SPTarkov.Server.Core.Models.Eft.Profile;
using SPTarkov.Server.Core.Models.Utils;
using SPTarkov.Server.Core.Services;
namespace SPTarkov.Server.Core.Helpers.Dialogue;
public abstract class AbstractDialogChatBot(
ISptLogger<AbstractDialogChatBot> _logger,
MailSendService _mailSendService,
ServerLocalisationService localisationService,
IEnumerable<IChatCommand> chatCommands
) : IDialogueChatBot
{
protected readonly IDictionary<string, IChatCommand> _chatCommands = chatCommands.ToDictionary(command => command.CommandPrefix);
public abstract UserDialogInfo GetChatBot();
public async ValueTask<string> HandleMessage(MongoId sessionId, SendMessageRequest request)
{
if (request.Text.Length == 0)
{
_logger.Error(localisationService.GetText("chatbot-command_was_empty"));
return request.DialogId;
}
var splitCommand = request.Text.Split(" ");
if (
splitCommand.Length > 1
&& _chatCommands.TryGetValue(splitCommand[0], out var commando)
&& commando.Commands.Contains(splitCommand[1])
)
{
return await commando.Handle(splitCommand[1], GetChatBot(), sessionId, request);
}
if (string.Equals(splitCommand.FirstOrDefault(), "help", StringComparison.OrdinalIgnoreCase))
{
return await SendPlayerHelpMessage(sessionId, request);
}
_mailSendService.SendUserMessageToPlayer(sessionId, GetChatBot(), GetUnrecognizedCommandMessage(), [], null);
return string.Empty;
}
protected async ValueTask<string> SendPlayerHelpMessage(MongoId sessionId, SendMessageRequest request)
{
_mailSendService.SendUserMessageToPlayer(sessionId, GetChatBot(), "The available commands will be listed below:", [], null);
foreach (var chatCommand in _chatCommands.Values)
{
// due to BSG being dumb with messages we need a mandatory timeout between messages so they get out on the right order
await Task.Delay(TimeSpan.FromSeconds(1));
_mailSendService.SendUserMessageToPlayer(
sessionId,
GetChatBot(),
$"Commands available for \"{chatCommand.CommandPrefix}\" prefix:",
[],
null
);
await Task.Delay(TimeSpan.FromSeconds(1));
foreach (var subCommand in chatCommand.Commands)
{
_mailSendService.SendUserMessageToPlayer(
sessionId,
GetChatBot(),
$"Subcommand {subCommand}:\n{chatCommand.GetCommandHelp(subCommand)}",
[],
null
);
await Task.Delay(TimeSpan.FromSeconds(1));
}
}
return request.DialogId;
}
public void RegisterChatCommand(IChatCommand chatCommand)
{
var prefix = chatCommand.CommandPrefix;
if (!_chatCommands.TryAdd(prefix, chatCommand))
{
throw new Exception($"The command \"{prefix}\" attempting to be registered already exists.");
}
}
protected abstract string GetUnrecognizedCommandMessage();
}