using Content.Shared.Database;
using Robust.Shared.Network;
using Robust.Shared.Serialization;
namespace Content.Shared._Sunrise.MentorHelp
{
///
/// Shared base class for mentor help system
///
public abstract class SharedMentorHelpSystem : EntitySystem
{
public override void Initialize()
{
base.Initialize();
SubscribeNetworkEvent(OnCreateTicketMessage);
SubscribeNetworkEvent(OnClaimTicketMessage);
SubscribeNetworkEvent(OnReplyMessage);
SubscribeNetworkEvent(OnCloseTicketMessage);
SubscribeNetworkEvent(OnRequestTicketsMessage);
SubscribeNetworkEvent(OnUnassignTicketMessage);
SubscribeNetworkEvent(OnRequestStatisticsMessage);
SubscribeNetworkEvent(OnRequestTicketMessagesMessage);
}
protected virtual void OnCreateTicketMessage(MentorHelpCreateTicketMessage message, EntitySessionEventArgs eventArgs) { }
protected virtual void OnClaimTicketMessage(MentorHelpClaimTicketMessage message, EntitySessionEventArgs eventArgs) { }
protected virtual void OnReplyMessage(MentorHelpReplyMessage message, EntitySessionEventArgs eventArgs) { }
protected virtual void OnCloseTicketMessage(MentorHelpCloseTicketMessage message, EntitySessionEventArgs eventArgs) { }
protected virtual void OnRequestTicketsMessage(MentorHelpRequestTicketsMessage message, EntitySessionEventArgs eventArgs) { }
protected virtual void OnUnassignTicketMessage(MentorHelpUnassignTicketMessage message, EntitySessionEventArgs eventArgs) { }
protected virtual void OnRequestStatisticsMessage(MentorHelpRequestStatisticsMessage message, EntitySessionEventArgs eventArgs) { }
protected virtual void OnRequestTicketMessagesMessage(MentorHelpRequestTicketMessagesMessage message, EntitySessionEventArgs eventArgs) { }
}
public struct MentorHelpStatistics
{
public Guid MentorUserId { get; set; }
public int TicketsClaimed { get; set; }
public int MessagesCount { get; set; }
}
///
/// Message to create a new mentor help ticket
///
[Serializable, NetSerializable]
public sealed class MentorHelpCreateTicketMessage : EntityEventArgs
{
public string Subject { get; }
public string Message { get; }
public MentorHelpCreateTicketMessage(string subject, string message)
{
Subject = subject;
Message = message;
}
}
///
/// Message to claim a mentor help ticket
///
[Serializable, NetSerializable]
public sealed class MentorHelpClaimTicketMessage : EntityEventArgs
{
public int TicketId { get; }
public MentorHelpClaimTicketMessage(int ticketId)
{
TicketId = ticketId;
}
}
///
/// Message to reply to a mentor help ticket
///
[Serializable, NetSerializable]
public sealed class MentorHelpReplyMessage : EntityEventArgs
{
public int TicketId { get; }
public string Message { get; }
public bool IsStaffOnly { get; }
public MentorHelpReplyMessage(int ticketId, string message, bool isStaffOnly = false)
{
TicketId = ticketId;
Message = message;
IsStaffOnly = isStaffOnly;
}
}
///
/// Message to unassign a mentor help ticket
///
[Serializable, NetSerializable]
public sealed class MentorHelpUnassignTicketMessage : EntityEventArgs
{
public int TicketId { get; }
public MentorHelpUnassignTicketMessage(int ticketId)
{
TicketId = ticketId;
}
}
///
/// Message to close a mentor help ticket
///
[Serializable, NetSerializable]
public sealed class MentorHelpCloseTicketMessage : EntityEventArgs
{
public int TicketId { get; }
public MentorHelpCloseTicketMessage(int ticketId)
{
TicketId = ticketId;
}
}
///
/// Message to request tickets (from client)
///
[Serializable, NetSerializable]
public sealed class MentorHelpRequestTicketsMessage : EntityEventArgs
{
public bool OnlyMine { get; }
public MentorHelpRequestTicketsMessage(bool onlyMine = false)
{
OnlyMine = onlyMine;
}
}
///
/// Message with ticket update (to client)
///
[Serializable, NetSerializable]
public sealed class MentorHelpTicketUpdateMessage : EntityEventArgs
{
public MentorHelpTicketData Ticket { get; }
public MentorHelpTicketUpdateMessage(MentorHelpTicketData ticket)
{
Ticket = ticket;
}
}
///
/// Message with tickets list (to client)
///
[Serializable, NetSerializable]
public sealed class MentorHelpTicketsListMessage : EntityEventArgs
{
public List Tickets { get; }
public MentorHelpTicketsListMessage(List tickets)
{
Tickets = tickets;
}
}
///
/// Message with ticket messages (to client)
///
[Serializable, NetSerializable]
public sealed class MentorHelpTicketMessagesMessage : EntityEventArgs
{
public int TicketId { get; }
public List Messages { get; }
public MentorHelpTicketMessagesMessage(int ticketId, List messages)
{
TicketId = ticketId;
Messages = messages;
}
}
///
/// Serializable ticket data for networking
///
[Serializable, NetSerializable]
public sealed class MentorHelpTicketData
{
public int Id { get; set; }
public NetUserId PlayerId { get; set; }
public string PlayerName { get; set; } = string.Empty;
public NetUserId? AssignedToUserId { get; set; }
public string? AssignedToName { get; set; }
public string Subject { get; set; } = string.Empty;
public MentorHelpTicketStatus Status { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
public DateTime? ClosedAt { get; set; }
public NetUserId? ClosedByUserId { get; set; }
public string? ClosedByName { get; set; }
public int? RoundId { get; set; }
public bool HasUnreadMessages { get; set; }
}
///
/// Serializable message data for networking
///
[Serializable, NetSerializable]
public sealed class MentorHelpMessageData
{
public int Id { get; set; }
public int TicketId { get; set; }
public NetUserId SenderUserId { get; set; }
public string SenderName { get; set; } = string.Empty;
public string FormattedSender { get; set; } = string.Empty;
public string Message { get; set; } = string.Empty;
public DateTime SentAt { get; set; }
public bool IsStaffOnly { get; set; }
}
///
/// DTO для передачи статистики по менторам
///
[Serializable, NetSerializable]
public sealed class MentorHelpStatisticsData
{
public string MentorName { get; set; } = string.Empty;
public int TicketsClaimed { get; set; }
public int MessagesCount { get; set; }
}
///
/// Сообщение-запрос статистики по менторам
///
[Serializable, NetSerializable]
public sealed class MentorHelpRequestStatisticsMessage : EntityEventArgs
{
// Пустой класс-запрос
}
///
/// Сообщение с результатами статистики по менторам
///
[Serializable, NetSerializable]
public sealed class MentorHelpStatisticsMessage : EntityEventArgs
{
public List Statistics { get; }
public MentorHelpStatisticsMessage(List statistics)
{
Statistics = statistics;
}
}
///
/// Message to request messages for a specific ticket (from client)
///
[Serializable, NetSerializable]
public sealed class MentorHelpRequestTicketMessagesMessage : EntityEventArgs
{
public int TicketId { get; }
public MentorHelpRequestTicketMessagesMessage(int ticketId)
{
TicketId = ticketId;
}
}
///
/// Message sent from server to client instructing it to open (focus) a specific ticket in the UI.
/// This is used immediately after creating a ticket so the creating player sees their new ticket.
///
[Serializable, NetSerializable]
public sealed class MentorHelpOpenTicketMessage : EntityEventArgs
{
public int TicketId { get; }
public MentorHelpOpenTicketMessage(int ticketId)
{
TicketId = ticketId;
}
}
}