using BotSharp.Abstraction.Repositories; using BotSharp.Abstraction.Users.Enums; namespace BotSharp.Core.Conversations.Services; public partial class ConversationService : IConversationService { private readonly ILogger _logger; private readonly IServiceProvider _services; private readonly IUserIdentity _user; private readonly ConversationSetting _settings; private readonly IConversationStorage _storage; private readonly IConversationStateService _state; private string _conversationId; public string ConversationId => _conversationId; public IConversationStateService States => _state; public ConversationService( IServiceProvider services, IUserIdentity user, ConversationSetting settings, IConversationStorage storage, IConversationStateService state, ILogger logger) { _services = services; _user = user; _settings = settings; _storage = storage; _state = state; _logger = logger; } public async Task DeleteConversation(string id) { var db = _services.GetRequiredService(); var isDeleted = db.DeleteConversation(id); return await Task.FromResult(isDeleted); } public async Task UpdateConversationTitle(string id, string title) { var db = _services.GetRequiredService(); db.UpdateConversationTitle(id, title); var conversation = db.GetConversation(id); return conversation; } public async Task GetConversation(string id) { var db = _services.GetRequiredService(); var conversation = db.GetConversation(id); return conversation; } public async Task> GetConversations() { var db = _services.GetRequiredService(); var user = db.GetUserById(_user.Id); var conversations = db.GetConversations(user.Role == UserRole.CSR ? null : user?.Id); return conversations.OrderByDescending(x => x.CreatedTime).ToList(); } public async Task> GetLastConversations() { var db = _services.GetRequiredService(); return db.GetLastConversations(); } public async Task NewConversation(Conversation sess) { var db = _services.GetRequiredService(); var user = db.GetUserById(_user.Id); var foundUserId = user?.Id ?? string.Empty; var record = sess; record.Id = sess.Id.IfNullOrEmptyAs(Guid.NewGuid().ToString()); record.UserId = sess.UserId.IfNullOrEmptyAs(foundUserId); record.Title = "New Conversation"; db.CreateNewConversation(record); var hooks = _services.GetServices().ToList(); foreach (var hook in hooks) { await hook.OnConversationInitialized(record); } return record; } public Task CleanHistory(string agentId) { throw new NotImplementedException(); } public List GetDialogHistory(int lastCount = 50) { if (string.IsNullOrEmpty(_conversationId)) { throw new ArgumentNullException("ConversationId is null."); } var dialogs = _storage.GetDialogs(_conversationId); return dialogs .Where(x => x.CreatedAt > DateTime.UtcNow.AddHours(-24)) .TakeLast(lastCount) .ToList(); } public void SetConversationId(string conversationId, List states) { _conversationId = conversationId; _state.Load(_conversationId); states.ForEach(x => _state.SetState(x.Split('=')[0], x.Split('=')[1])); } }