Files
ChatBot/ChatBot/Models/ChatSession.cs
Leonid Pershin e46013b70b fixes
2025-10-16 08:08:17 +03:00

140 lines
4.2 KiB
C#

using ChatBot.Models.Dto;
namespace ChatBot.Models
{
/// <summary>
/// Represents a chat session with message history and AI parameters
/// </summary>
public class ChatSession
{
private readonly object _lock = new object();
private readonly List<ChatMessage> _messageHistory = new List<ChatMessage>();
/// <summary>
/// Unique identifier for the chat session
/// </summary>
public string SessionId { get; set; } = Guid.NewGuid().ToString();
/// <summary>
/// Telegram chat ID (can be private chat or group chat)
/// </summary>
public long ChatId { get; set; }
/// <summary>
/// Chat type (private, group, supergroup, channel)
/// </summary>
public string ChatType { get; set; } = "private";
/// <summary>
/// Chat title (for groups)
/// </summary>
public string ChatTitle { get; set; } = string.Empty;
/// <summary>
/// AI model to use for this session
/// </summary>
public string Model { get; set; } = string.Empty;
/// <summary>
/// When the session was created
/// </summary>
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
/// <summary>
/// When the session was last updated
/// </summary>
public DateTime LastUpdatedAt { get; set; } = DateTime.UtcNow;
/// <summary>
/// Maximum number of messages to keep in history
/// </summary>
public int MaxHistoryLength { get; set; } = 20;
/// <summary>
/// Add a message to the history and manage history length (thread-safe)
/// </summary>
public void AddMessage(ChatMessage message)
{
lock (_lock)
{
_messageHistory.Add(message);
LastUpdatedAt = DateTime.UtcNow;
// Trim history if it exceeds max length
if (_messageHistory.Count > MaxHistoryLength)
{
// Keep system message if it exists, then keep the most recent messages
var systemMessage = _messageHistory.FirstOrDefault(m => m.Role == "system");
var recentMessages = _messageHistory
.Where(m => m.Role != "system")
.TakeLast(MaxHistoryLength - (systemMessage != null ? 1 : 0))
.ToList();
_messageHistory.Clear();
if (systemMessage != null)
{
_messageHistory.Add(systemMessage);
}
_messageHistory.AddRange(recentMessages);
}
}
}
/// <summary>
/// Add a user message with username information
/// </summary>
public void AddUserMessage(string content, string username)
{
var message = new ChatMessage
{
Role = "user",
Content = ChatType == "private" ? content : $"{username}: {content}",
};
AddMessage(message);
}
/// <summary>
/// Add an assistant message
/// </summary>
public void AddAssistantMessage(string content)
{
var message = new ChatMessage { Role = "assistant", Content = content };
AddMessage(message);
}
/// <summary>
/// Get all messages (thread-safe)
/// </summary>
public List<ChatMessage> GetAllMessages()
{
lock (_lock)
{
return new List<ChatMessage>(_messageHistory);
}
}
/// <summary>
/// Get the count of messages in history (thread-safe)
/// </summary>
public int GetMessageCount()
{
lock (_lock)
{
return _messageHistory.Count;
}
}
/// <summary>
/// Clear message history (thread-safe)
/// </summary>
public void ClearHistory()
{
lock (_lock)
{
_messageHistory.Clear();
LastUpdatedAt = DateTime.UtcNow;
}
}
}
}