World Restriction Check

Disabled incoming messages when world is Restricted.
This commit is contained in:
SketchFoxsky 2024-09-20 18:12:09 -04:00 committed by GitHub
parent 71d780248f
commit 498dcff8b9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,248 +1,250 @@
using ABI_RC.Core.Networking.IO.Social; using ABI_RC.Core.Networking.IO.Social;
using ABI_RC.Core.Savior; using ABI_RC.Core.Savior;
using ABI_RC.Systems.ModNetwork; using ABI_RC.Systems.ModNetwork;
using NAK.Stickers.Utilities; using NAK.Stickers.Utilities;
using UnityEngine; using UnityEngine;
namespace NAK.Stickers.Networking; namespace NAK.Stickers.Networking;
public static partial class ModNetwork public static partial class ModNetwork
{ {
#region Inbound Buffers #region Inbound Buffers
private static readonly Dictionary<string, byte[]> _textureChunkBuffers = new(); private static readonly Dictionary<string, byte[]> _textureChunkBuffers = new();
private static readonly Dictionary<string, int> _receivedChunkCounts = new(); private static readonly Dictionary<string, int> _receivedChunkCounts = new();
private static readonly Dictionary<string, int> _expectedChunkCounts = new(); private static readonly Dictionary<string, int> _expectedChunkCounts = new();
private static readonly Dictionary<string, (int stickerSlot, Guid Hash, int Width, int Height)> _textureMetadata = new(); private static readonly Dictionary<string, (int stickerSlot, Guid Hash, int Width, int Height)> _textureMetadata = new();
#endregion Inbound Buffers #endregion Inbound Buffers
#region Reset Method #region Reset Method
public static void Reset() public static void Reset()
{ {
_textureChunkBuffers.Clear(); _textureChunkBuffers.Clear();
_receivedChunkCounts.Clear(); _receivedChunkCounts.Clear();
_expectedChunkCounts.Clear(); _expectedChunkCounts.Clear();
_textureMetadata.Clear(); _textureMetadata.Clear();
LoggerInbound("ModNetwork inbound buffers and metadata have been reset."); LoggerInbound("ModNetwork inbound buffers and metadata have been reset.");
} }
#endregion Reset Method #endregion Reset Method
#region Inbound Methods #region Inbound Methods
private static bool ShouldReceiveFromSender(string sender) private static bool ShouldReceiveFromSender(string sender)
{ {
if (_disallowedForSession.Contains(sender)) if (_disallowedForSession.Contains(sender))
return false; // ignore messages from disallowed users return false; // ignore messages from disallowed users
if (MetaPort.Instance.blockedUserIds.Contains(sender)) if (MetaPort.Instance.blockedUserIds.Contains(sender))
return false; // ignore messages from blocked users return false; // ignore messages from blocked users
if (ModSettings.Entry_FriendsOnly.Value && !Friends.FriendsWith(sender)) if (ModSettings.Entry_FriendsOnly.Value && !Friends.FriendsWith(sender))
return false; // ignore messages from non-friends if friends only is enabled return false; // ignore messages from non-friends if friends only is enabled
if (StickerSystem.RestrictedInstance == true) // ignore messages from users when the world is restricted. This also includes older or modified version of Stickers mod.
return true; return false;
}
return true;
private static void HandleMessageReceived(ModNetworkMessage msg) }
{
try private static void HandleMessageReceived(ModNetworkMessage msg)
{ {
string sender = msg.Sender; try
msg.Read(out byte msgTypeRaw); {
string sender = msg.Sender;
if (!Enum.IsDefined(typeof(MessageType), msgTypeRaw)) msg.Read(out byte msgTypeRaw);
return;
if (!Enum.IsDefined(typeof(MessageType), msgTypeRaw))
if (!ShouldReceiveFromSender(sender)) return;
return;
if (!ShouldReceiveFromSender(sender))
LoggerInbound($"Received message from {msg.Sender}, Type: {(MessageType)msgTypeRaw}"); return;
switch ((MessageType)msgTypeRaw) LoggerInbound($"Received message from {msg.Sender}, Type: {(MessageType)msgTypeRaw}");
{
case MessageType.PlaceSticker: switch ((MessageType)msgTypeRaw)
HandlePlaceSticker(msg); {
break; case MessageType.PlaceSticker:
case MessageType.ClearSticker: HandlePlaceSticker(msg);
HandleClearSticker(msg); break;
break; case MessageType.ClearSticker:
case MessageType.ClearAllStickers: HandleClearSticker(msg);
HandleClearAllStickers(msg); break;
break; case MessageType.ClearAllStickers:
case MessageType.StartTexture: HandleClearAllStickers(msg);
HandleStartTexture(msg); break;
break; case MessageType.StartTexture:
case MessageType.SendTexture: HandleStartTexture(msg);
HandleSendTexture(msg); break;
break; case MessageType.SendTexture:
case MessageType.EndTexture: HandleSendTexture(msg);
HandleEndTexture(msg); break;
break; case MessageType.EndTexture:
case MessageType.RequestTexture: HandleEndTexture(msg);
HandleRequestTexture(msg); break;
break; case MessageType.RequestTexture:
default: HandleRequestTexture(msg);
LoggerInbound($"Invalid message type received: {msgTypeRaw}"); break;
break; default:
} LoggerInbound($"Invalid message type received: {msgTypeRaw}");
} break;
catch (Exception e) }
{ }
LoggerInbound($"Error handling message from {msg.Sender}: {e.Message}", true); catch (Exception e)
} {
} LoggerInbound($"Error handling message from {msg.Sender}: {e.Message}", true);
}
private static void HandlePlaceSticker(ModNetworkMessage msg) }
{
msg.Read(out int stickerSlot); private static void HandlePlaceSticker(ModNetworkMessage msg)
msg.Read(out Guid textureHash); {
msg.Read(out Vector3 position); msg.Read(out int stickerSlot);
msg.Read(out Vector3 forward); msg.Read(out Guid textureHash);
msg.Read(out Vector3 up); msg.Read(out Vector3 position);
msg.Read(out Vector3 forward);
if (!StickerSystem.Instance.HasTextureHash(msg.Sender, textureHash)) msg.Read(out Vector3 up);
SendRequestTexture(stickerSlot, textureHash);
if (!StickerSystem.Instance.HasTextureHash(msg.Sender, textureHash))
StickerSystem.Instance.OnStickerPlaceReceived(msg.Sender, stickerSlot, position, forward, up); SendRequestTexture(stickerSlot, textureHash);
}
StickerSystem.Instance.OnStickerPlaceReceived(msg.Sender, stickerSlot, position, forward, up);
private static void HandleClearSticker(ModNetworkMessage msg) }
{
msg.Read(out int stickerSlot); private static void HandleClearSticker(ModNetworkMessage msg)
StickerSystem.Instance.OnStickerClearReceived(msg.Sender, stickerSlot); {
} msg.Read(out int stickerSlot);
StickerSystem.Instance.OnStickerClearReceived(msg.Sender, stickerSlot);
private static void HandleClearAllStickers(ModNetworkMessage msg) }
{
StickerSystem.Instance.OnStickerClearAllReceived(msg.Sender); private static void HandleClearAllStickers(ModNetworkMessage msg)
} {
StickerSystem.Instance.OnStickerClearAllReceived(msg.Sender);
private static void HandleStartTexture(ModNetworkMessage msg) }
{
string sender = msg.Sender; private static void HandleStartTexture(ModNetworkMessage msg)
msg.Read(out int stickerSlot); {
msg.Read(out Guid textureHash); string sender = msg.Sender;
msg.Read(out int chunkCount); msg.Read(out int stickerSlot);
msg.Read(out int width); msg.Read(out Guid textureHash);
msg.Read(out int height); msg.Read(out int chunkCount);
msg.Read(out int width);
if (_textureChunkBuffers.ContainsKey(sender)) msg.Read(out int height);
{
LoggerInbound($"Received StartTexture message from {sender} while still receiving texture data!"); if (_textureChunkBuffers.ContainsKey(sender))
return; {
} LoggerInbound($"Received StartTexture message from {sender} while still receiving texture data!");
return;
if (StickerSystem.Instance.HasTextureHash(sender, textureHash)) }
{
LoggerInbound($"Received StartTexture message from {sender} with existing texture hash {textureHash}, skipping texture data."); if (StickerSystem.Instance.HasTextureHash(sender, textureHash))
return; {
} LoggerInbound($"Received StartTexture message from {sender} with existing texture hash {textureHash}, skipping texture data.");
return;
if (chunkCount > MaxChunkCount) }
{
LoggerInbound($"Received StartTexture message from {sender} with too many chunks: {chunkCount}", true); if (chunkCount > MaxChunkCount)
return; {
} LoggerInbound($"Received StartTexture message from {sender} with too many chunks: {chunkCount}", true);
return;
_textureMetadata[sender] = (stickerSlot, textureHash, width, height); }
_textureChunkBuffers[sender] = new byte[Mathf.Clamp(chunkCount * ChunkSize, 0, MaxTextureSize)];
_expectedChunkCounts[sender] = Mathf.Clamp(chunkCount, 0, MaxChunkCount); _textureMetadata[sender] = (stickerSlot, textureHash, width, height);
_receivedChunkCounts[sender] = 0; _textureChunkBuffers[sender] = new byte[Mathf.Clamp(chunkCount * ChunkSize, 0, MaxTextureSize)];
_expectedChunkCounts[sender] = Mathf.Clamp(chunkCount, 0, MaxChunkCount);
LoggerInbound($"Received StartTexture message from {sender}: Slot: {stickerSlot}, Hash: {textureHash}, Chunks: {chunkCount}, Resolution: {width}x{height}"); _receivedChunkCounts[sender] = 0;
}
LoggerInbound($"Received StartTexture message from {sender}: Slot: {stickerSlot}, Hash: {textureHash}, Chunks: {chunkCount}, Resolution: {width}x{height}");
private static void HandleSendTexture(ModNetworkMessage msg) }
{
string sender = msg.Sender; private static void HandleSendTexture(ModNetworkMessage msg)
msg.Read(out int chunkIdx); {
msg.Read(out byte[] chunkData); string sender = msg.Sender;
msg.Read(out int chunkIdx);
if (!_textureChunkBuffers.TryGetValue(sender, out var buffer)) msg.Read(out byte[] chunkData);
return;
if (!_textureChunkBuffers.TryGetValue(sender, out var buffer))
int startIndex = chunkIdx * ChunkSize; return;
Array.Copy(chunkData, 0, buffer, startIndex, chunkData.Length);
int startIndex = chunkIdx * ChunkSize;
_receivedChunkCounts[sender]++; Array.Copy(chunkData, 0, buffer, startIndex, chunkData.Length);
if (_receivedChunkCounts[sender] < _expectedChunkCounts[sender])
return; _receivedChunkCounts[sender]++;
if (_receivedChunkCounts[sender] < _expectedChunkCounts[sender])
(int stickerSlot, Guid Hash, int Width, int Height) metadata = _textureMetadata[sender]; return;
// All chunks received, reassemble texture (int stickerSlot, Guid Hash, int Width, int Height) metadata = _textureMetadata[sender];
_textureChunkBuffers.Remove(sender);
_receivedChunkCounts.Remove(sender); // All chunks received, reassemble texture
_expectedChunkCounts.Remove(sender); _textureChunkBuffers.Remove(sender);
_textureMetadata.Remove(sender); _receivedChunkCounts.Remove(sender);
_expectedChunkCounts.Remove(sender);
// Validate image _textureMetadata.Remove(sender);
if (!ImageUtility.IsValidImage(buffer))
{ // Validate image
LoggerInbound($"[Inbound] Received texture data is not a valid image from {sender}!", true); if (!ImageUtility.IsValidImage(buffer))
return; {
} LoggerInbound($"[Inbound] Received texture data is not a valid image from {sender}!", true);
return;
// Validate data TODO: fix hash??????? }
(Guid imageHash, int width, int height) = ImageUtility.ExtractImageInfo(buffer);
if (metadata.Width != width // Validate data TODO: fix hash???????
|| metadata.Height != height) (Guid imageHash, int width, int height) = ImageUtility.ExtractImageInfo(buffer);
{ if (metadata.Width != width
LoggerInbound($"Received texture data does not match metadata! Expected: {metadata.Hash} ({metadata.Width}x{metadata.Height}), received: {imageHash} ({width}x{height})", true); || metadata.Height != height)
return; {
} LoggerInbound($"Received texture data does not match metadata! Expected: {metadata.Hash} ({metadata.Width}x{metadata.Height}), received: {imageHash} ({width}x{height})", true);
return;
Texture2D texture = new(1,1); }
texture.LoadImage(buffer);
texture.Compress(true); Texture2D texture = new(1,1);
texture.LoadImage(buffer);
StickerSystem.Instance.OnPlayerStickerTextureReceived(sender, metadata.Hash, texture, metadata.stickerSlot); texture.Compress(true);
LoggerInbound($"All chunks received and texture reassembled from {sender}. " + StickerSystem.Instance.OnPlayerStickerTextureReceived(sender, metadata.Hash, texture, metadata.stickerSlot);
$"Texture size: {metadata.Width}x{metadata.Height}");
} LoggerInbound($"All chunks received and texture reassembled from {sender}. " +
$"Texture size: {metadata.Width}x{metadata.Height}");
private static void HandleEndTexture(ModNetworkMessage msg) }
{
string sender = msg.Sender; private static void HandleEndTexture(ModNetworkMessage msg)
if (!_textureChunkBuffers.ContainsKey(sender)) {
return; string sender = msg.Sender;
if (!_textureChunkBuffers.ContainsKey(sender))
LoggerInbound($"Received EndTexture message without all chunks received from {sender}! Only {_receivedChunkCounts[sender]} out of {_expectedChunkCounts[sender]} received."); return;
_textureChunkBuffers.Remove(sender); LoggerInbound($"Received EndTexture message without all chunks received from {sender}! Only {_receivedChunkCounts[sender]} out of {_expectedChunkCounts[sender]} received.");
_receivedChunkCounts.Remove(sender);
_expectedChunkCounts.Remove(sender); _textureChunkBuffers.Remove(sender);
_textureMetadata.Remove(sender); _receivedChunkCounts.Remove(sender);
} _expectedChunkCounts.Remove(sender);
_textureMetadata.Remove(sender);
private static void HandleRequestTexture(ModNetworkMessage msg) }
{
string sender = msg.Sender; private static void HandleRequestTexture(ModNetworkMessage msg)
msg.Read(out int stickerSlot); {
msg.Read(out Guid textureHash); string sender = msg.Sender;
msg.Read(out int stickerSlot);
if (!_isSubscribedToModNetwork || IsSendingTexture) msg.Read(out Guid textureHash);
return;
if (!_isSubscribedToModNetwork || IsSendingTexture)
if (stickerSlot < 0 || stickerSlot >= _textureStorage.Length) return;
{
LoggerInbound($"Received RequestTexture message from {sender} with invalid slot {stickerSlot}!"); if (stickerSlot < 0 || stickerSlot >= _textureStorage.Length)
return; {
} LoggerInbound($"Received RequestTexture message from {sender} with invalid slot {stickerSlot}!");
return;
if (_textureStorage[stickerSlot].textureHash != textureHash) }
{
LoggerInbound($"Received RequestTexture message from {sender} with invalid texture hash {textureHash} for slot {stickerSlot}!"); if (_textureStorage[stickerSlot].textureHash != textureHash)
return; {
} LoggerInbound($"Received RequestTexture message from {sender} with invalid texture hash {textureHash} for slot {stickerSlot}!");
return;
SendTexture(stickerSlot); }
}
SendTexture(stickerSlot);
#endregion Inbound Methods }
#endregion Inbound Methods
} }