reldens
Version:
Reldens - MMORPG Platform
279 lines (263 loc) • 11 kB
JavaScript
/**
*
* Reldens - ChatMessageActions
*
*/
const { MessageFactory } = require('../../../chat/message-factory');
const { ChatConst } = require('../../../chat/constants');
const { TeamsConst } = require('../../constants');
const { Logger, sc } = require('@reldens/utils');
class ChatMessageActions
{
constructor(props)
{
this.events = sc.get(props, 'events', false);
this.chatPlugin = sc.get(props, 'chatPlugin', false);
this.client = false;
}
listenEvents()
{
if(!this.events){
Logger.error('EventsManager undefined in Teams ChatMessageActions.');
return false;
}
if(!this.chatPlugin){
Logger.error('ChatPlugin undefined in Teams ChatMessageActions.');
return false;
}
this.inviteTeamAcceptedEventListener();
this.inviteTeamRejectedEventListener();
this.teamMemberLeaveEventListener();
this.inviteClanAcceptedEventListener();
this.inviteClanRejectedEventListener();
this.clanMemberLeavingEventListener();
}
inviteTeamAcceptedEventListener()
{
this.events.on('reldens.afterPlayerJoinedTeam', async (props) => {
let playerJoining = sc.get(props, 'playerJoining', false);
if(!playerJoining){
Logger.warning('Missing event property "playerJoining".');
return false;
}
let currentTeam = sc.get(props, 'currentTeam', false);
if(!currentTeam){
Logger.warning('Missing event property "currentTeam".');
return false;
}
let message = this.createMessage(TeamsConst.CHAT.MESSAGE.INVITE_ACCEPTED, playerJoining.playerName, 'team');
await this.sendMessage(
message,
'Team',
currentTeam.ownerClient,
playerJoining.player_id,
playerJoining.state.room_id
);
let messageEnter = this.createMessage(TeamsConst.CHAT.MESSAGE.ENTER, playerJoining.playerName, 'team');
let otherClients = Object.assign({}, currentTeam.clients);
delete otherClients[playerJoining.player_id];
delete otherClients[currentTeam.owner.player_id];
for(let i of Object.keys(otherClients)){
let player = currentTeam.players[i];
await this.sendMessage(messageEnter, 'Team', otherClients[i], player.player_id, player.state.room_id);
}
});
}
inviteTeamRejectedEventListener()
{
this.events.on('reldens.teamJoinInviteRejected', async (props) => {
let playerSendingInvite = sc.get(props, 'playerSendingInvite', false);
let playerRejectingName = sc.get(props, 'playerRejectingName', false);
if(!playerSendingInvite || !playerRejectingName){
return false;
}
let message = this.createMessage(TeamsConst.CHAT.MESSAGE.INVITE_REJECTED, playerRejectingName, 'team');
await this.sendMessage(
message,
'Team',
playerSendingInvite.client,
playerSendingInvite.playerId,
playerSendingInvite.roomId
);
});
}
teamMemberLeaveEventListener()
{
this.events.on('reldens.teamLeaveBeforeSendUpdate', async (props) => {
let currentTeam = sc.get(props, 'currentTeam', false);
if(!currentTeam){
return false;
}
let removingPlayerId = sc.get(props, 'playerId', false);
if(!removingPlayerId){
return false;
}
let removingPlayer = currentTeam.players[removingPlayerId];
let room = sc.get(props, 'room', false);
if(!room){
Logger.warning('Room undefined on "teamLeaveBeforeSendUpdate" event.');
return false;
}
let isOwnerDisbanding = sc.get(props, 'isOwnerDisbanding', false);
if(isOwnerDisbanding){
return await this.ownerDisbandTeam(removingPlayer, currentTeam, room);
}
let leavingPlayerId = sc.get(props, 'singleRemoveId', false);
if(!leavingPlayerId){
return false;
}
let message = this.createMessage(TeamsConst.CHAT.MESSAGE.LEFT, '', 'team');
let otherClients = Object.assign({}, currentTeam.clients);
delete otherClients[leavingPlayerId];
for(let i of Object.keys(otherClients)){
let player = currentTeam.players[i];
await this.sendMessage(message, 'Team', otherClients[i], player.player_id, player.state.room_id);
}
let areLessPlayerThanRequired = sc.get(props, 'areLessPlayerThanRequired', false);
if(areLessPlayerThanRequired){
await this.sendMessage(
TeamsConst.CHAT.MESSAGE.NOT_ENOUGH_PLAYERS,
'Team',
currentTeam.clients[removingPlayerId],
removingPlayer.player_id,
removingPlayer.state.room_id,
);
}
return true;
});
}
async ownerDisbandTeam(ownerPlayer, currentTeam, room)
{
let message = this.createMessage(TeamsConst.CHAT.MESSAGE.DISBANDED, currentTeam.owner.playerName, 'team');
let leavingPlayer = room.activePlayerByPlayerId(ownerPlayer.player_id, room.roomId);
if(!leavingPlayer){
Logger.warning('Leaving team player width ID "'+ownerPlayer.player_id+'" not found.');
return false;
}
await this.sendMessage(message, 'Team', leavingPlayer.client, ownerPlayer.player_id, ownerPlayer.state.room_id);
return true;
}
inviteClanAcceptedEventListener()
{
this.events.on('reldens.afterPlayerJoinedClan', async (props) => {
let playerJoining = sc.get(props, 'playerJoining', false);
if(!playerJoining){
return false;
}
let clan = sc.get(props, 'clan', false);
if(!clan){
return false;
}
let playerJoiningName = playerJoining.playerName;
let message = this.createMessage(
TeamsConst.CHAT.MESSAGE.INVITE_ACCEPTED,
playerJoiningName
);
await this.sendMessage(message, 'Clan', clan.ownerClient, clan.owner.player_id, playerJoining.state.room_id);
});
}
inviteClanRejectedEventListener()
{
this.events.on('reldens.clanJoinInviteRejected', async (props) => {
let clientSendingInvite = sc.get(props, 'clientSendingInvite', false);
let playerRejectingName = sc.get(props, 'playerRejectingName', false);
let clanInvite = sc.get(props, 'clanInvite', false);
if(!clientSendingInvite || !playerRejectingName){
return false;
}
let message = this.createMessage(
TeamsConst.CHAT.MESSAGE.INVITE_REJECTED,
playerRejectingName
);
await this.sendMessage(
message,
'Clan',
clientSendingInvite,
clanInvite.owner.player_id,
clanInvite.players[clanInvite.owner.player_id].state.room_id
);
});
}
clanMemberLeavingEventListener()
{
this.events.on('reldens.clanLeaveBeforeSendUpdate', async (props) => {
let playerLeavingId = sc.get(props, 'playerId', false);
if(!playerLeavingId){
Logger.error('Leaving player ID undefined on "clanLeaveBeforeSendUpdate" event.');
return false;
}
let currentClan = sc.get(props, 'currentClan', false);
if(!currentClan){
Logger.error('Clan undefined on "clanLeaveBeforeSendUpdate" event.');
return false;
}
let disbandClan = sc.get(props, 'disbandClan', false);
let leavingPlayer = currentClan.players[playerLeavingId];
let leavingClient = currentClan.clients[playerLeavingId];
if(disbandClan){
let message = this.createMessage(
TeamsConst.CHAT.MESSAGE.DISBANDED,
leavingPlayer.playerName,
'clan'
);
await this.sendMessage(
message,
'Clan',
leavingClient,
leavingPlayer.player_id,
leavingPlayer.state.room_id
);
return true;
}
let message = this.createMessage(
props.singleRemoveId ? TeamsConst.CHAT.MESSAGE.REMOVED : TeamsConst.CHAT.MESSAGE.LEAVE,
leavingPlayer.playerName,
'clan'
);
await this.sendMessage(message, 'Clan', leavingClient, leavingPlayer.player_id, leavingPlayer.state.room_id);
return true;
});
}
createMessage(baseChatMessage = '', playerName = '', groupName = '')
{
let message = baseChatMessage.replace('%playerName', playerName);
// @TODO - BETA - Split class in multiple actions, remove the "groupName" since it will limit the translations.
if(groupName){
message = message.replace('%groupName', groupName);
}
return message;
}
async sendMessage(message, chatFrom, client, playerId, roomId)
{
if(!client){
Logger.critical('Client undefined for message.', message, chatFrom, client);
return false;
}
let messageObject = MessageFactory.create(
ChatConst.TYPES.TEAMS,
message,
{},
chatFrom
);
client.send('*', messageObject);
if(!playerId){
Logger.error('Undefined playerId for save chat message.', message);
return false;
}
if(!roomId){
Logger.error('Undefined roomId for save chat message.', message);
return false;
}
let saveResult = await this.chatPlugin.chatManager.saveMessage(
message,
playerId,
roomId,
false,
ChatConst.TYPES.TEAMS
);
if(!saveResult){
Logger.error('Save team chat message error.', messageObject, playerId, roomId);
}
}
}
module.exports.ChatMessageActions = ChatMessageActions;