Implement follow request / confirmation UI
This commit is contained in:
parent
d6ef60a3d8
commit
0a410d289d
11 changed files with 481 additions and 79 deletions
|
@ -14,6 +14,7 @@ import {
|
|||
SubToPusherRoomMessage,
|
||||
VariableMessage,
|
||||
VariableWithTagMessage,
|
||||
ServerToClientMessage,
|
||||
} from "../Messages/generated/messages_pb";
|
||||
import { ProtobufUtils } from "../Model/Websocket/ProtobufUtils";
|
||||
import { RoomSocket, ZoneSocket } from "src/RoomManager";
|
||||
|
@ -95,10 +96,20 @@ export class GameRoom {
|
|||
return Array.from(this.groups.values());
|
||||
}
|
||||
|
||||
public getGroupIncludingUser(user: User): Group | undefined {
|
||||
const foundGroups = this.getGroups().filter((grp) => grp.includes(user));
|
||||
return foundGroups[0];
|
||||
}
|
||||
|
||||
public getUsers(): Map<number, User> {
|
||||
return this.users;
|
||||
}
|
||||
|
||||
public getUserByName(name: string): User | undefined {
|
||||
let foundUsers = Array.from(this.users.values());
|
||||
foundUsers = foundUsers.filter((user: User) => user.name === name);
|
||||
return foundUsers[0];
|
||||
}
|
||||
public getUserByUuid(uuid: string): User | undefined {
|
||||
return this.usersByUuid.get(uuid);
|
||||
}
|
||||
|
@ -226,6 +237,20 @@ export class GameRoom {
|
|||
}
|
||||
}
|
||||
|
||||
public sendToOthersInGroupIncludingUser(user: User, message: ServerToClientMessage): void {
|
||||
this.getGroupIncludingUser(user)
|
||||
?.getUsers()
|
||||
.forEach((currentUser: User) => {
|
||||
if (currentUser.name !== user.name) {
|
||||
currentUser.socket.write(message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public sendToUserWithName(name: string, message: ServerToClientMessage): void {
|
||||
this.getUserByName(name)?.socket.write(message);
|
||||
}
|
||||
|
||||
setSilent(user: User, silent: boolean) {
|
||||
if (user.silent === silent) {
|
||||
return;
|
||||
|
|
|
@ -8,7 +8,9 @@ import {
|
|||
BatchToPusherMessage,
|
||||
BatchToPusherRoomMessage,
|
||||
EmotePromptMessage,
|
||||
FollowMeRequestMessage,
|
||||
FollowRequestMessage,
|
||||
FollowConfirmationMessage,
|
||||
FollowAbortMessage,
|
||||
EmptyMessage,
|
||||
ItemEventMessage,
|
||||
JoinRoomMessage,
|
||||
|
@ -117,11 +119,23 @@ const roomManager: IRoomManagerServer = {
|
|||
user,
|
||||
message.getEmotepromptmessage() as EmotePromptMessage
|
||||
);
|
||||
} else if (message.hasFollowmerequestmessage()) {
|
||||
socketManager.handleFollowMeRequestMessage(
|
||||
} else if (message.hasFollowrequestmessage()) {
|
||||
socketManager.handleFollowRequestMessage(
|
||||
room,
|
||||
user,
|
||||
message.getFollowmerequestmessage() as FollowMeRequestMessage
|
||||
message.getFollowrequestmessage() as FollowRequestMessage
|
||||
);
|
||||
} else if (message.hasFollowconfirmationmessage()) {
|
||||
socketManager.handleFollowConfirmationMessage(
|
||||
room,
|
||||
user,
|
||||
message.getFollowconfirmationmessage() as FollowConfirmationMessage
|
||||
);
|
||||
} else if (message.hasFollowabortmessage()) {
|
||||
socketManager.handleFollowAbortMessage(
|
||||
room,
|
||||
user,
|
||||
message.getFollowabortmessage() as FollowAbortMessage
|
||||
);
|
||||
} else if (message.hasSendusermessage()) {
|
||||
const sendUserMessage = message.getSendusermessage();
|
||||
|
|
|
@ -30,7 +30,9 @@ import {
|
|||
BanUserMessage,
|
||||
RefreshRoomMessage,
|
||||
EmotePromptMessage,
|
||||
FollowMeRequestMessage,
|
||||
FollowRequestMessage,
|
||||
FollowConfirmationMessage,
|
||||
FollowAbortMessage,
|
||||
VariableMessage,
|
||||
BatchToPusherRoomMessage,
|
||||
SubToPusherRoomMessage,
|
||||
|
@ -835,24 +837,30 @@ export class SocketManager {
|
|||
room.emitEmoteEvent(user, emoteEventMessage);
|
||||
}
|
||||
|
||||
handleFollowMeRequestMessage(room: GameRoom, user: User, requestMessage: FollowMeRequestMessage) {
|
||||
// Find group including the requesting user
|
||||
let foundGroups = room.getGroups().filter((grp) => grp.includes(user));
|
||||
if (!foundGroups[0]) {
|
||||
return;
|
||||
}
|
||||
let group = foundGroups[0];
|
||||
|
||||
// Send invitations to other group members
|
||||
requestMessage.setPlayername(user.name);
|
||||
handleFollowRequestMessage(room: GameRoom, user: User, message: FollowRequestMessage) {
|
||||
const clientMessage = new ServerToClientMessage();
|
||||
clientMessage.setFollowmerequestmessage(requestMessage);
|
||||
group.getUsers().forEach((currentUser: User) => {
|
||||
if (user.name !== currentUser.name) {
|
||||
console.log("Inviting " + currentUser.name + " to follow " + user.name);
|
||||
currentUser.socket.write(clientMessage);
|
||||
}
|
||||
});
|
||||
clientMessage.setFollowrequestmessage(message);
|
||||
room.sendToOthersInGroupIncludingUser(user, clientMessage);
|
||||
}
|
||||
|
||||
handleFollowConfirmationMessage(room: GameRoom, user: User, message: FollowConfirmationMessage) {
|
||||
const clientMessage = new ServerToClientMessage();
|
||||
clientMessage.setFollowconfirmationmessage(message);
|
||||
room.sendToUserWithName(message.getLeader(), clientMessage);
|
||||
}
|
||||
|
||||
handleFollowAbortMessage(room: GameRoom, user: User, message: FollowAbortMessage) {
|
||||
if (message.getRole() === "leader") {
|
||||
const clientMessage = new ServerToClientMessage();
|
||||
clientMessage.setFollowabortmessage(message);
|
||||
room.sendToOthersInGroupIncludingUser(user, clientMessage);
|
||||
} else {
|
||||
const recipient = message.getPlayername();
|
||||
message.setPlayername(user.name);
|
||||
const clientMessage = new ServerToClientMessage();
|
||||
clientMessage.setFollowabortmessage(message);
|
||||
room.sendToUserWithName(recipient, clientMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue