140 lines
4.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|