Merge branch 'feature/back-players-proximity' into barycenter_based_groups

This commit is contained in:
David Négrier 2020-04-29 22:06:37 +02:00
commit 5ffc5a420e
2 changed files with 67 additions and 15 deletions

View File

@ -15,13 +15,13 @@ export class World {
private connectCallback: (user1: string, user2: string) => void; private connectCallback: (user1: string, user2: string) => void;
private disconnectCallback: (user1: string, user2: string) => void; private disconnectCallback: (user1: string, user2: string) => void;
constructor(connectCallback: (user1: string, user2: string) => void, disconnectCallback: (user1: string, user2: string) => void) constructor(connectCallback: (user1: string, user2: string) => void, disconnectCallback: (user1: string, user2: string) => void)
{ {
this.users = new Map<string, UserInterface>(); this.users = new Map<string, UserInterface>();
this.groups = []; this.groups = [];
this.connectCallback = connectCallback; this.connectCallback = connectCallback;
this.disconnectCallback = disconnectCallback; this.disconnectCallback = disconnectCallback;
} }
public join(userPosition: MessageUserPosition): void { public join(userPosition: MessageUserPosition): void {
this.users.set(userPosition.userId, { this.users.set(userPosition.userId, {
@ -60,9 +60,17 @@ export class World {
closestUser.group.join(user); closestUser.group.join(user);
} }
} }
} else {
// If the user is part of a group:
// should we split the group?
// TODO: analyze the group of the user:
// => take one user. "walk the tree of users, each branch being a link<MIN_DISTANCE"
// If some users are not in the subgroup, take the other user and loop
// At the end, we will have a list of subgroups. From this list, we can send disconnect messages
} }
// TODO : vérifier qu'ils ne sont pas déja dans un groupe plein
} }
/** /**
@ -101,7 +109,7 @@ export class World {
} }
let distance = World.computeDistance(user, currentUser); // compute distance between peers. let distance = World.computeDistance(user, currentUser); // compute distance between peers.
if(distance <= minimumDistanceFound) { if(distance <= minimumDistanceFound) {
if (typeof currentUser.group === 'undefined' || !currentUser.group.isFull()) { if (typeof currentUser.group === 'undefined' || !currentUser.group.isFull()) {
@ -112,11 +120,11 @@ export class World {
} }
/* /*
if(context.groups.length > 0) { if(context.groups.length > 0) {
context.groups.forEach(group => { context.groups.forEach(group => {
if(group.isPartOfGroup(userPosition)) { // Is the user in a group ? if(group.isPartOfGroup(userPosition)) { // Is the user in a group ?
if(group.isStillIn(userPosition)) { // Is the user leaving the group ? (is the user at more than max distance of each player) if(group.isStillIn(userPosition)) { // Is the user leaving the group ? (is the user at more than max distance of each player)
// Should we split the group? (is each player reachable from the current player?) // Should we split the group? (is each player reachable from the current player?)
// This is needed if // This is needed if
// A <==> B <==> C <===> D // A <==> B <==> C <===> D
@ -141,7 +149,7 @@ export class World {
} }
*/ */
} }
}, this.users); }, this.users);
return matchingUser; return matchingUser;
@ -169,7 +177,7 @@ export class World {
} }
}); });
}); });
distances.sort(World.compareDistances); distances.sort(World.compareDistances);
return distances; return distances;
@ -195,7 +203,7 @@ export class World {
// Detecte le ou les users qui se sont fait sortir du groupe // Detecte le ou les users qui se sont fait sortir du groupe
let difference = users.filter(x => !groupTmp.includes(x)); let difference = users.filter(x => !groupTmp.includes(x));
// TODO : Notify users un difference that they have left the group // TODO : Notify users un difference that they have left the group
} }
let newgroup = new Group(groupTmp); let newgroup = new Group(groupTmp);
@ -212,4 +220,4 @@ export class World {
} }
return 0; return 0;
}*/ }*/
} }

View File

@ -12,7 +12,7 @@ describe("World", () => {
connectCalled = true; connectCalled = true;
} }
let disconnect = (user1: string, user2: string): void => { let disconnect = (user1: string, user2: string): void => {
} }
let world = new World(connect, disconnect); let world = new World(connect, disconnect);
@ -53,14 +53,58 @@ describe("World", () => {
})); }));
expect(connectCalled).toBe(false); expect(connectCalled).toBe(false);
}); });
/**
it("should disconnect user1 and user2", () => {
let connectCalled: boolean = false;
let disconnectCalled: boolean = false;
let connect = (user1: string, user2: string): void => {
connectCalled = true;
}
let disconnect = (user1: string, user2: string): void => {
disconnectCalled = true;
}
let world = new World(connect, disconnect);
world.join(new MessageUserPosition({
userId: "foo",
roomId: 1,
position: new Point(100, 100)
}));
world.join(new MessageUserPosition({
userId: "bar",
roomId: 1,
position: new Point(259, 100)
}));
expect(connectCalled).toBe(false);
world.updatePosition(new MessageUserPosition({
userId: "bar",
roomId: 1,
position: new Point(261, 100)
}));
expect(disconnectCalled).toBe(true);
disconnectCalled = false;
world.updatePosition(new MessageUserPosition({
userId: "bar",
roomId: 1,
position: new Point(262, 100)
}));
expect(disconnectCalled).toBe(false);
});
/**
it('Should return the distances between all users', () => { it('Should return the distances between all users', () => {
let connectCalled: boolean = false; let connectCalled: boolean = false;
let connect = (user1: string, user2: string): void => { let connect = (user1: string, user2: string): void => {
connectCalled = true; connectCalled = true;
} }
let disconnect = (user1: string, user2: string): void => { let disconnect = (user1: string, user2: string): void => {
} }
let world = new World(connect, disconnect); let world = new World(connect, disconnect);
@ -100,4 +144,4 @@ describe("World", () => {
//expect(distances).toBe([]); //expect(distances).toBe([]);
}) })
**/ **/
}) })