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; } } }