using System.Linq;
using Content.Server._Sunrise.Messenger;
using Content.Server.CartridgeLoader;
using Content.Shared.DeviceNetwork;
using Content.Shared.DeviceNetwork.Events;
using Content.Shared._Sunrise.Messenger;
using Content.Shared.DeviceNetwork.Components;
using Content.Shared.PDA.Ringer;
using Content.Shared.StatusIcon;
using Robust.Shared.Prototypes;
namespace Content.Server._Sunrise.CartridgeLoader.Cartridges;
///
/// Часть системы картриджа мессенджера, отвечающая за обработку входящих пакетов
///
public sealed partial class MessengerCartridgeSystem
{
private void OnPacketReceived(EntityUid uid, MessengerCartridgeComponent component, CartridgeDeviceNetPacketEvent args)
{
var packet = args.PacketEvent;
if (!packet.Data.TryGetValue(DeviceNetworkConstants.Command, out string? command))
{
return;
}
var loaderUid = args.Loader;
if (loaderUid == EntityUid.Invalid)
{
Sawmill.Warning($"Packet received but LoaderUid is invalid");
return;
}
switch (command)
{
case MessengerCommands.CmdUserRegistered:
HandleUserRegistered(uid, component, packet, loaderUid);
break;
case MessengerCommands.CmdUsersList:
HandleUsersList(uid, component, packet, loaderUid);
break;
case MessengerCommands.CmdGroupsList:
HandleGroupsList(uid, component, packet, loaderUid);
break;
case MessengerCommands.CmdMessagesList:
HandleMessagesList(uid, component, packet, loaderUid);
break;
case MessengerCommands.CmdMessageReceived:
HandleMessageReceived(uid, component, packet, loaderUid);
break;
case MessengerCommands.CmdGroupCreated:
HandleGroupCreated(uid, component, packet, loaderUid);
break;
case MessengerCommands.CmdUserAddedToGroup:
HandleUserAddedToGroup(uid, component, packet, loaderUid);
break;
case MessengerCommands.CmdInviteReceived:
HandleInviteReceived(uid, component, packet, loaderUid);
break;
case MessengerCommands.CmdInvitesList:
HandleInvitesList(uid, component, packet, loaderUid);
break;
case MessengerCommands.CmdUserLeftGroup:
HandleUserLeftGroup(uid, component, packet, loaderUid);
break;
case MessengerCommands.CmdGroupDeleted:
HandleGroupDeleted(uid, component, packet, loaderUid);
break;
case MessengerCommands.CmdMessageDeleted:
HandleMessageDeleted(uid, component, packet, loaderUid);
break;
default:
Sawmill.Warning($"Unknown command received: {command}");
break;
}
}
private void HandleUserRegistered(EntityUid uid, MessengerCartridgeComponent component, DeviceNetworkPacketEvent packet, EntityUid loaderUid)
{
if (!packet.Data.TryGetValue("user_id", out string? userId))
{
Sawmill.Warning($"UserRegistered packet missing user_id");
return;
}
Sawmill.Info($"User registered successfully: {userId}");
component.UserId = userId;
component.IsRegistered = true;
component.LastRegistrationAttempt = null;
if (TryComp(loaderUid, out var deviceNetwork))
{
RequestUsers(uid, component, loaderUid, deviceNetwork);
RequestGroups(uid, component, loaderUid, deviceNetwork);
}
UpdateUiState(uid, loaderUid, component);
}
private void HandleUsersList(EntityUid uid, MessengerCartridgeComponent component, DeviceNetworkPacketEvent args, EntityUid loaderUid)
{
if (!args.Data.TryGetValue("users", out List>? usersData))
return;
var users = new List();
foreach (var userData in usersData)
{
if (!userData.TryGetValue("user_id", out object? userIdObj) ||
!userData.TryGetValue("user_name", out object? userNameObj))
continue;
var userId = userIdObj?.ToString();
var userName = userNameObj?.ToString();
if (userId == null || userName == null)
continue;
userData.TryGetValue("job_title", out object? jobTitleObj);
userData.TryGetValue("department_id", out object? departmentIdObj);
userData.TryGetValue("job_icon_id", out object? jobIconIdObj);
var jobTitle = jobTitleObj?.ToString();
var departmentId = departmentIdObj?.ToString();
ProtoId? jobIconId = null;
if (jobIconIdObj != null && !string.IsNullOrEmpty(jobIconIdObj.ToString()))
{
jobIconId = new ProtoId(jobIconIdObj.ToString()!);
}
users.Add(new MessengerUser(userId, userName, jobTitle, departmentId, jobIconId));
}
component.Users = users;
UpdateUiState(uid, loaderUid, component);
}
private void HandleGroupsList(EntityUid uid, MessengerCartridgeComponent component, DeviceNetworkPacketEvent packet, EntityUid loaderUid)
{
if (!packet.Data.TryGetValue("groups", out List>? groupsData))
return;
Dictionary? serverUnreadCounts = null;
if (packet.Data.TryGetValue("unread_counts", out object? unreadCountsObj))
{
if (unreadCountsObj is Dictionary unreadCountsDict)
{
serverUnreadCounts = new Dictionary();
foreach (var (chatId, countObj) in unreadCountsDict)
{
if (int.TryParse(countObj?.ToString(), out var count))
{
serverUnreadCounts[chatId] = count;
}
}
}
}
var groups = new List();
foreach (var groupData in groupsData)
{
if (!groupData.TryGetValue("group_id", out object? groupIdObj) ||
!groupData.TryGetValue("group_name", out object? groupNameObj))
continue;
var groupId = groupIdObj?.ToString();
var groupName = groupNameObj?.ToString();
if (groupId == null || groupName == null)
continue;
List? membersList = null;
if (groupData.TryGetValue("members", out object? membersObj))
{
if (membersObj is List