Parcourir la source

cleaning up chat code a bit

tags/v0.8.0
Shaun il y a 4 ans
Parent
révision
e5e2a6f835
2 fichiers modifiés avec 196 ajouts et 181 suppressions
  1. +0
    -127
      src/server/components/social.js
  2. +196
    -54
      src/server/components/social/chat.js

+ 0
- 127
src/server/components/social.js Voir le fichier

@@ -65,133 +65,6 @@ module.exports = {
});
},

sendPartyMessage: function (msg) {
if (!this.party) {
this.obj.socket.emit('events', {
onGetMessages: [{
messages: [{
class: 'color-redA',
message: 'you are not in a party',
type: 'info'
}]
}]
});

return;
}

let charname = this.obj.auth.charname;
let message = msg.data.message.substr(1);

this.party.forEach(function (p) {
let player = cons.players.find(c => c.id === p);

player.socket.emit('events', {
onGetMessages: [{
messages: [{
class: 'color-tealC',
message: '(party: ' + charname + '): ' + message,
type: 'chat',
source: this.obj.name
}]
}]
});
}, this);
},

sendCustomChannelMessage: function (msg) {
let pList = cons.players;
let pLen = pList.length;
let origMessage = msg.data.message.substr(1);

let channel = origMessage.split(' ')[0];
let message = origMessage.substr(channel.length);

if ((!channel) || (!message)) {
this.obj.socket.emit('events', {
onGetMessages: [{
messages: [{
class: 'color-redA',
message: 'syntax: $channel message',
type: 'info'
}]
}]
});
return;
} else if (!this.isInChannel(this.obj, channel)) {
this.obj.socket.emit('events', {
onGetMessages: [{
messages: [{
class: 'color-redA',
message: 'you are not currently in channel: ' + channel,
type: 'info'
}]
}]
});
return;
} else if (pLen > 0) {
for (let i = 0; i < pLen; i++) {
if (this.isInChannel(pList[i], channel)) {
pList[i].socket.emit('events', {
onGetMessages: [{
messages: [{
class: 'color-grayB',
message: '[' + channel + '] ' + this.obj.auth.charname + ': ' + message,
type: channel.trim(),
source: this.obj.name
}]
}]
});
}
}
}
},

sendPrivateMessage: function (messageString) {
let playerName = '';
//Check if there's a space in the name
if (messageString[1] === "'") {
playerName = messageString.substring(2, messageString.indexOf("'", 2));
messageString = messageString.replace("@'" + playerName + "' ", '');
} else {
playerName = messageString.substring(1, messageString.indexOf(' '));
messageString = messageString.replace('@' + playerName + ' ', '');
}

if (playerName === this.obj.name)
return;

let target = cons.players.find(p => p.name === playerName);
if (!target)
return;

this.obj.socket.emit('event', {
event: 'onGetMessages',
data: {
messages: [{
class: 'color-yellowB',
message: '(you to ' + playerName + '): ' + messageString,
type: 'chat',
subType: 'privateOut',
source: this.obj.name
}]
}
});

target.socket.emit('event', {
event: 'onGetMessages',
data: {
messages: [{
class: 'color-yellowB',
message: '(' + this.obj.name + ' to you): ' + messageString,
type: 'chat',
subType: 'privateIn',
source: this.obj.name
}]
}
});
},

chat: function (msg) {
chat(this, msg);
},


+ 196
- 54
src/server/components/social/chat.js Voir le fichier

@@ -1,100 +1,242 @@
let roles = require('../../config/roles');
let events = require('../../misc/events');
const roles = require('../../config/roles');
const events = require('../../misc/events');
const profanities = require('../../misc/profanities');
const canChat = require('./canChat');

module.exports = (cpnSocial, msg) => {
if (!msg.data.message)
const sendRegularMessage = ({ obj }, msg) => {
let charname = obj.auth.charname;

let prefix = roles.getRoleMessagePrefix(obj) || '';
let msgStyle = roles.getRoleMessageStyle(obj) || 'color-grayB';

cons.emit('event', {
event: 'onGetMessages',
data: {
messages: [{
class: msgStyle,
message: prefix + charname + ': ' + msg.data.message,
item: msg.data.item,
type: 'chat',
source: obj.name
}]
}
});
};

const sendPartyMessage = ({ party, obj }, msg) => {
if (!party) {
obj.socket.emit('events', {
onGetMessages: [{
messages: [{
class: 'color-redA',
message: 'you are not in a party',
type: 'info'
}]
}]
});

return;
}

let charname = obj.auth.charname;
let message = msg.data.message.substr(1);

party.forEach(p => {
let player = cons.players.find(c => c.id === p);

player.socket.emit('events', {
onGetMessages: [{
messages: [{
class: 'color-tealC',
message: '(party: ' + charname + '): ' + message,
type: 'chat',
source: obj.name
}]
}]
});
});
};

const sendCustomChannelMessage = (cpnSocial, msg) => {
const { obj } = cpnSocial;
const sendMessage = cpnSocial.sendMessage.bind(cpnSocial);

msg.data.message = msg.data.message
let pList = cons.players;
let pLen = pList.length;
let origMessage = msg.data.message.substr(1);

let channel = origMessage.split(' ')[0];
let message = origMessage.substr(channel.length);

if ((!channel) || (!message)) {
obj.socket.emit('events', {
onGetMessages: [{
messages: [{
class: 'color-redA',
message: 'syntax: $channel message',
type: 'info'
}]
}]
});
return;
} else if (!cpnSocial.isInChannel(obj, channel)) {
obj.socket.emit('events', {
onGetMessages: [{
messages: [{
class: 'color-redA',
message: 'you are not currently in channel: ' + channel,
type: 'info'
}]
}]
});
return;
} else if (pLen > 0) {
for (let i = 0; i < pLen; i++) {
if (cpnSocial.isInChannel(pList[i], channel)) {
pList[i].socket.emit('events', {
onGetMessages: [{
messages: [{
class: 'color-grayB',
message: '[' + channel + '] ' + obj.auth.charname + ': ' + message,
type: channel.trim(),
source: obj.name
}]
}]
});
}
}
}
};

const sendPrivateMessage = ({ obj: { name: sourcePlayerName, socket } }, msg) => {
let message = msg.data.message.substr(1);

let playerName = '';
//Check if there's a space in the name
if (message[0] === "'")
playerName = message.substring(1, message.indexOf("'", 1));
else
playerName = message.substring(0, message.indexOf(' '));

message = message.substr(playerName.length);

if (playerName === sourcePlayerName)
return;

let target = cons.players.find(p => p.name === playerName);
if (!target)
return;

socket.emit('event', {
event: 'onGetMessages',
data: {
messages: [{
class: 'color-yellowB',
message: '(you to ' + playerName + '): ' + message,
type: 'chat',
subType: 'privateOut',
source: sourcePlayerName
}]
}
});

target.socket.emit('event', {
event: 'onGetMessages',
data: {
messages: [{
class: 'color-yellowB',
message: '(' + sourcePlayerName + ' to you): ' + message,
type: 'chat',
subType: 'privateIn',
source: sourcePlayerName
}]
}
});
};

const sendErrorMsg = (cpnSocial, msgString) => {
cpnSocial.sendMessage(msgString, 'color-redA');
};

module.exports = (cpnSocial, msg) => {
const { data: msgData } = msg;

if (!msgData.message)
return;

const { obj, muted, maxChatLength, messageHistory } = cpnSocial;
const sendError = sendErrorMsg.bind(null, cpnSocial);

msgData.message = msgData.message
.split('<')
.join('&lt;')
.split('>')
.join('&gt;');

if (!msg.data.message)
if (!msgData.message)
return;

if (msg.data.message.trim() === '')
if (msgData.message.trim() === '')
return;

if (cpnSocial.muted) {
sendMessage('You have been muted from talking', 'color-redA');
if (muted) {
sendError('You have been muted from talking');

return;
}

let messageString = msg.data.message;
if (messageString.length > cpnSocial.maxChatLength)
let messageString = msgData.message;
if (messageString.length > maxChatLength)
return;

let history = cpnSocial.messageHistory;

let time = +new Date();
history.spliceWhere(h => ((time - h.time) > 5000));
messageHistory.spliceWhere(h => ((time - h.time) > 5000));

if (messageHistory.length) {
if (messageHistory[messageHistory.length - 1].msg === messageString) {
sendError('You have already sent that message');

if (history.length > 0) {
if (history[history.length - 1].msg === messageString) {
sendMessage('You have already sent that message', 'color-redA');
return;
} else if (history.length >= 3) {
sendMessage('You are sending too many messages', 'color-redA');
} else if (messageHistory.length >= 3) {
sendError('You are sending too many messages');

return;
}
}

cpnSocial.onBeforeChat(msg.data);
if (msg.data.ignore)
cpnSocial.onBeforeChat(msgData);
if (msgData.ignore)
return;

if (!msg.data.item && !profanities.isClean(messageString)) {
sendMessage('Profanities detected in message. Blocked.', 'color-redA');
if (!msgData.item && !profanities.isClean(messageString)) {
sendError('Profanities detected in message. Blocked.');

return;
}

if (!canChat(obj, time)) {
sendMessage('Your character needs to be played for at least 3 minutes or be at least level 3 to be able to send messages in chat.', 'color-redA');
sendError('Your character needs to be played for at least 3 minutes or be at least level 3 to be able to send messages in chat.');

return;
}

history.push({
messageHistory.push({
msg: messageString,
time: time
});

let charname = obj.auth.charname;

let msgStyle = roles.getRoleMessageStyle(obj) || ('color-grayB');

let msgEvent = {
source: charname,
source: obj.auth.charname,
msg: messageString
};
events.emit('onBeforeSendMessage', msgEvent);
messageString = msgEvent.msg;
if (messageString[0] === '@')
cpnSocial.sendPrivateMessage(messageString);
else if (messageString[0] === '$')
cpnSocial.sendCustomChannelMessage(msg);
else if (messageString[0] === '%')
cpnSocial.sendPartyMessage(msg);
else {
let prefix = roles.getRoleMessagePrefix(obj) || '';

cons.emit('event', {
event: 'onGetMessages',
data: {
messages: [{
class: msgStyle,
message: prefix + charname + ': ' + msg.data.message,
item: msg.data.item,
type: 'chat',
source: obj.name
}]
}
});
}

const firstChar = messageString[0];

const messageHandler = {
$: sendCustomChannelMessage,
'@': sendPrivateMessage,
'%': sendPartyMessage
}[firstChar] || sendRegularMessage;

messageHandler(cpnSocial, msg);
};

Chargement…
Annuler
Enregistrer