Skip to content

Commit

Permalink
Refactoring + fixes for those refactorings
Browse files Browse the repository at this point in the history
  • Loading branch information
Jarno458 committed Aug 2, 2024
1 parent 5a60895 commit 3113ea0
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 31 deletions.
6 changes: 3 additions & 3 deletions Archipelago.MultiClient.Net.Tests/ItemInfoFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ public void Scout_should_be_related_when_player_is_active_player()
Player = 1
}, "Hollow Knight", "Hollow Knight", itemInfoResolver, playerHelper, activePlayer);

Assert.That(scoutedItem.IsRelatedToActivePlayer, Is.True);
Assert.That(scoutedItem.IsReceiverRelatedToActivePlayer, Is.True);
}

[Test]
Expand Down Expand Up @@ -247,7 +247,7 @@ public void Scout_should_be_related_when_player_is_relevant_group()
Player = 3
}, "Hollow Knight", "Hollow Knight", itemInfoResolver, playerHelper, group);

Assert.That(scoutedItem.IsRelatedToActivePlayer, Is.True);
Assert.That(scoutedItem.IsReceiverRelatedToActivePlayer, Is.True);
}

[Test]
Expand Down Expand Up @@ -278,7 +278,7 @@ public void Scout_should_not_be_related_when_player_is_shared_itemlink()
Player = 2
}, "Hollow Knight", "Hollow Knight", itemInfoResolver, playerHelper, otherPlayer);

Assert.That(scoutedItem.IsRelatedToActivePlayer, Is.False);
Assert.That(scoutedItem.IsReceiverRelatedToActivePlayer, Is.False);
}

static IArchipelagoSession CreateTestSession(bool scouted, string remotePlayerGame, string myGame, SerializableItemInfo itemInfo)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;

Expand Down
11 changes: 7 additions & 4 deletions Archipelago.MultiClient.Net.Tests/MessageLogHelperFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -360,17 +360,20 @@ public void Should_preserve_extra_properties_on_ItemPrintJsonPacket()
[Test]
public void Should_preserve_extra_properties_on_ItemCheatPrintJsonPacket()
{
var playerColleciton = GetPlayerCollection(new List<PlayerInfo> {
new PlayerInfo { Team = 0, Slot = 1, Game = "Game1" },
new PlayerInfo { Team = 0, Slot = 2, Game = "Game2" },
});

var socket = Substitute.For<IArchipelagoSocketHelper>();
var itemInfoResolver = Substitute.For<IItemInfoResolver>();
itemInfoResolver.GetItemName(Arg.Any<long>(), Arg.Any<string>()).Returns(_ => null);
itemInfoResolver.GetLocationName(Arg.Any<long>(), Arg.Any<string>()).Returns(_ => null);
var players = Substitute.For<IPlayerHelper>();
players.GetPlayerAlias(2).Returns("LocalPlayer");
players.Players.Returns(GetPlayerCollection(new List<PlayerInfo> {
new PlayerInfo { Team = 0, Slot = 1, Game = "Game1" },
new PlayerInfo { Team = 0, Slot = 2, Game = "Game2" },
}));
players.Players.Returns(playerColleciton);
players.GetPlayerInfo(Arg.Any<int>(), Arg.Any<int>()).Returns(x => players.Players[x.ArgAt<int>(0)][x.ArgAt<int>(1)]);
players.ActivePlayer.Returns(playerColleciton[0][2]);
var connectionInfo = Substitute.For<IConnectionInfoProvider>();
connectionInfo.Team.Returns(0);
connectionInfo.Slot.Returns(2);
Expand Down
54 changes: 54 additions & 0 deletions Archipelago.MultiClient.Net.Tests/PlayerInfoFixture.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using Archipelago.MultiClient.Net.Helpers;
using NUnit.Framework;

namespace Archipelago.MultiClient.Net.Tests
{
[TestFixture]
class PlayerInfoFixture
{
[Test]
public void IsRelatedTo_should_work_both_ways()
{
var PlayerA = new PlayerInfo { Team = 0, Slot = 1 };
var PlayerB = new PlayerInfo { Team = 0, Slot = 2 };
var GroupC = new PlayerInfo { Team = 0, Slot = 3, GroupMembers = [1,2] };

Assert.IsTrue(PlayerA.IsRelatedTo(PlayerA));
Assert.IsTrue(PlayerB.IsRelatedTo(PlayerB));
Assert.IsTrue(GroupC.IsRelatedTo(GroupC));

Assert.IsTrue(PlayerA.IsRelatedTo(GroupC));
Assert.IsTrue(GroupC.IsRelatedTo(PlayerA));

Assert.IsTrue(PlayerB.IsRelatedTo(GroupC));
Assert.IsTrue(GroupC.IsRelatedTo(PlayerB));

Assert.IsFalse(PlayerA.IsRelatedTo(PlayerB));
Assert.IsFalse(PlayerB.IsRelatedTo(PlayerA));
}

[Test]
public void IsRelatedTo_should_not_work_cross_teams()
{
var Player = new PlayerInfo { Team = 0, Slot = 1 };
var Group = new PlayerInfo { Team = 1, Slot = 2, GroupMembers = [1] };

Assert.IsFalse(Player.IsRelatedTo(Group));
Assert.IsFalse(Group.IsRelatedTo(Player));
}

[Test]
public void Equality_should_check_slot_and_team()
{
var PlayerA = new PlayerInfo { Team = 0, Slot = 1, Name = "Player", Game = "GameOne" };
var PlayerB = new PlayerInfo { Team = 0, Slot = 1, Name = "Different Player Name has no impact", GroupMembers = [1], Game = "Game2" };
var PlayerC = new PlayerInfo { Team = 1, Slot = 1, Name = "Player", Game = "GameOne" };
var PlayerD = new PlayerInfo { Team = 0, Slot = 2 };

Assert.That(PlayerA, Is.EqualTo(PlayerB));
Assert.That(PlayerA, Is.Not.EqualTo(PlayerC));
Assert.That(PlayerA, Is.Not.EqualTo(PlayerD));
Assert.That((PlayerInfo)null, Is.EqualTo(null));
}
}
}
12 changes: 12 additions & 0 deletions Archipelago.MultiClient.Net/Helpers/PlayerHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,18 @@ public IEnumerable<PlayerInfo> GetGroupMembers(IPlayerHelper playerHelper)
return GroupMembers.Select(g => playerHelper.GetPlayerInfo(Team, g));
}

/// <summary>
/// True if this player is the same player, or if either player is a group (e.g. itemlinks) that contains the other player
/// </summary>
/// <param name="other"></param>
/// <returns></returns>
public bool IsRelatedTo(PlayerInfo other) => this == other
|| (Team == other.Team
&& (
other.GroupMembers != null && other.GroupMembers.Contains(this)
|| (GroupMembers != null && GroupMembers.Contains(other))
));

/// <summary>
/// Converts the PlayerInfo to the slot
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
using Archipelago.MultiClient.Net.Helpers;
using Archipelago.MultiClient.Net.MessageLog.Parts;
using Archipelago.MultiClient.Net.Models;
using System.Linq;

namespace Archipelago.MultiClient.Net.MessageLog.Messages
{
Expand All @@ -15,6 +14,8 @@ namespace Archipelago.MultiClient.Net.MessageLog.Messages
/// </summary>
public class ItemSendLogMessage : LogMessage
{
PlayerInfo ActivePlayer { get; }

/// <summary>
/// The player who received the item
/// </summary>
Expand All @@ -28,17 +29,17 @@ public class ItemSendLogMessage : LogMessage
/// <summary>
/// Checks if the Receiver is the current connected player
/// </summary>
public bool IsReceiverTheActivePlayer { get; }
public bool IsReceiverTheActivePlayer => Receiver == ActivePlayer;

/// <summary>
/// True if the Sender is the current connected player
/// </summary>
public bool IsSenderTheActivePlayer { get; }
public bool IsSenderTheActivePlayer => Sender == ActivePlayer;

/// <summary>
/// True if either the Receiver or Sender share any slot groups (e.g. itemlinks) with the current connected player
/// </summary>
public bool IsRelatedToActivePlayer { get; }
public bool IsRelatedToActivePlayer => ActivePlayer.IsRelatedTo(Receiver) || ActivePlayer.IsRelatedTo(Sender);

/// <summary>
/// The Item that was send
Expand All @@ -57,17 +58,11 @@ internal ItemSendLogMessage(MessagePart[] parts,
int receiver, int sender, NetworkItem item, int team,
IItemInfoResolver itemInfoResolver) : base(parts)
{
ActivePlayer = players.ActivePlayer ?? new PlayerInfo();
Receiver = players.GetPlayerInfo(team, receiver) ?? new PlayerInfo();
Sender = players.GetPlayerInfo(team, sender) ?? new PlayerInfo();
var itemPlayer = players.GetPlayerInfo(team, item.Player) ?? new PlayerInfo();

IsReceiverTheActivePlayer = Receiver == players.ActivePlayer;
IsSenderTheActivePlayer = Sender == players.ActivePlayer;

IsRelatedToActivePlayer = IsReceiverTheActivePlayer || IsSenderTheActivePlayer
|| (Receiver?.GetGroupMembers(players)?.Contains(players.ActivePlayer) ?? false)
|| (Sender?.GetGroupMembers(players)?.Contains(players.ActivePlayer) ?? false);

Item = new ItemInfo(item, Receiver.Game, Sender.Game, itemInfoResolver, itemPlayer);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Archipelago.MultiClient.Net.Helpers;
using Archipelago.MultiClient.Net.MessageLog.Parts;
using System.Linq;

namespace Archipelago.MultiClient.Net.MessageLog.Messages
{
Expand All @@ -12,6 +11,8 @@ namespace Archipelago.MultiClient.Net.MessageLog.Messages
/// </summary>
public abstract class PlayerSpecificLogMessage : LogMessage
{
PlayerInfo ActivePlayer { get; }

/// <summary>
/// The player information about the player this message is concerning
/// </summary>
Expand All @@ -20,21 +21,19 @@ public abstract class PlayerSpecificLogMessage : LogMessage
/// <summary>
/// True if the player this message is concerning is the current connected player
/// </summary>
public bool IsActivePlayer { get; }
public bool IsActivePlayer => Player == ActivePlayer;

/// <summary>
/// True if the player this message is concerning any slot groups (e.g. itemlinks) with the current connected player
/// </summary>
public bool IsRelatedToActivePlayer { get; }
public bool IsRelatedToActivePlayer => ActivePlayer.IsRelatedTo(Player);

internal PlayerSpecificLogMessage(MessagePart[] parts,
IPlayerHelper players, int team, int slot)
: base(parts)
{
ActivePlayer = players.ActivePlayer ?? new PlayerInfo();
Player = players.GetPlayerInfo(team, slot) ?? new PlayerInfo();
IsActivePlayer = Player == players.ActivePlayer;
IsRelatedToActivePlayer = IsActivePlayer
|| (Player.GetGroupMembers(players)?.Contains(players.ActivePlayer) ?? false);
}
}
}
9 changes: 3 additions & 6 deletions Archipelago.MultiClient.Net/Models/ItemInfo.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using Archipelago.MultiClient.Net.DataPackage;
using Archipelago.MultiClient.Net.Enums;
using Archipelago.MultiClient.Net.Helpers;
using System.Linq;

namespace Archipelago.MultiClient.Net.Models
{
Expand Down Expand Up @@ -108,9 +107,9 @@ public class ScoutedItemInfo : ItemInfo
public new PlayerInfo Player => base.Player;

/// <summary>
/// True if the player this message is concerning any slot groups (e.g. itemlinks) with the current connected player
/// True if the receiver is concerning any slot groups (e.g. itemlinks) with the current connected player
/// </summary>
public bool IsRelatedToActivePlayer { get; }
public bool IsReceiverRelatedToActivePlayer { get; }

/// <summary>
/// The constructor what else did you expect it to be
Expand All @@ -119,9 +118,7 @@ public ScoutedItemInfo(NetworkItem item, string receiverGame, string senderGame,
IPlayerHelper players, PlayerInfo player)
: base(item, receiverGame, senderGame, itemInfoResolver, player)
{
var activePlayer = players.ActivePlayer;
IsRelatedToActivePlayer = player == activePlayer
|| (player?.GetGroupMembers(players)?.Contains(activePlayer) ?? false);
IsReceiverRelatedToActivePlayer = (players.ActivePlayer ?? new PlayerInfo()).IsRelatedTo(player);
}
}
}

0 comments on commit 3113ea0

Please sign in to comment.