flying-squid/src/lib/plugins/chat.js
2020-04-02 15:59:36 +02:00

166 lines
4.9 KiB
JavaScript

const permissions = require("./permissions").permissions();
module.exports.server = function (serv) {
serv.broadcast = (message, { whitelist = serv.players, blacklist = [], system = false } = {}) => {
if (whitelist.type === 'player') whitelist = [whitelist]
if (typeof message === 'string') message = serv.parseClassic(message)
whitelist.filter(w => blacklist.indexOf(w) === -1).forEach(player => {
if (!system) player.chat(message)
else player.system(message)
})
}
serv.color = {
'black': '&0',
'dark_blue': '&1',
'dark_green': '&2',
'dark_cyan': '&3',
'dark_red': '&4',
'purple': '&5',
'dark_purple': '&5',
'gold': '&6',
'gray': '&7',
'grey': '&7',
'dark_gray': '&8',
'dark_grey': '&8',
'blue': '&9',
'green': '&a',
'aqua': '&b',
'cyan': '&b',
'red': '&c',
'pink': '&d',
'light_purple': '&d',
'yellow': '&e',
'white': '&f',
'random': '&k',
'obfuscated': '&k',
'bold': '&l',
'strikethrough': '&m',
'underlined': '&n',
'underline': '&n',
'italic': '&o',
'italics': '&o',
'reset': '&r'
}
serv.parseClassic = (message) => {
if (typeof message === 'object') return message
const messageList = []
let text = ''
let nextChanged = false
let color = 'white'
let bold = false
let italic = false
let underlined = false
let strikethrough = false
let random = false
const colors = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'k', 'l', 'm', 'n', 'o', 'r', '&']
const convertColor = ['black', 'dark_blue', 'dark_green', 'dark_cyan', 'dark_red', 'dark_purple', 'gold',
'gray', 'dark_gray', 'blue', 'green', 'aqua', 'red', 'light_purple', 'yellow', 'white',
'random', 'bold', 'strikethrough', 'underlined', 'italic', 'reset', '&']
function createJSON () {
if (!text.trim()) return
messageList.push({
text: text,
color: color,
bold: bold,
italic: italic,
underlined: underlined,
strikethrough: strikethrough,
obfuscated: random
})
text = ''
}
while (message !== '') {
const currChar = message[0]
if (nextChanged) {
const newColor = convertColor[colors.indexOf(currChar)]
if (newColor) {
if (newColor === 'bold') bold = true
else if (newColor === 'strikethrough') strikethrough = true
else if (newColor === 'underlined') underlined = true
else if (newColor === 'italic') italic = true
else if (newColor === 'random') random = true
else if (newColor === '&') text += '&'
else if (newColor === 'reset') {
strikethrough = false
bold = false
underlined = false
random = false
italic = false
color = 'white'
} else color = newColor
}
nextChanged = false
} else if (currChar === '&') {
if (nextChanged) {
text += '&'
nextChanged = false
} else {
nextChanged = true
createJSON()
}
} else {
text += currChar
}
message = message.slice(1, message.length)
}
createJSON()
if (messageList.length > 0) {
return {
text: '',
extra: messageList
}
} else return { text: '' }
}
}
module.exports.player = function (player, serv) {
player._client.on('chat', ({ message } = {}) => {
if (message[0] === '/') {
if(!permissions.hasPermission(player.username, "commands.use"))return player.chat("You don't have permission to use commands");
player.behavior('command', { command: message.slice(1) }, ({ command }) => player.handleCommand(command))
} else {
if(!permissions.hasPermission(player.username, "chat.send"))return player.chat("You don't have permission to use chat");
player.behavior('chat', {
message: message,
prefix: permissions.getPrefix(player.username) + player.username + permissions.getSuffix(player.username) + permissions.getSeparator(),
text: message,
whitelist: serv.players,
blacklist: []
}, ({ prefix, text, whitelist, blacklist }) => {
const obj = serv.parseClassic(prefix)
if (!obj.extra) obj.extra = []
obj.extra.push(serv.parseClassic(text))
serv.broadcast(obj, {
whitelist: whitelist,
blacklist: blacklist
})
})
}
})
player.chat = message => {
if (typeof message === 'string') message = serv.parseClassic(message)
player._client.write('chat', { message: JSON.stringify(message), position: 0 })
}
player.emptyChat = (count = 1) => {
for (let i = 0; i < count; i++) {
player.chat('')
}
}
player.system = message => {
if (typeof message === 'string') message = serv.parseClassic(message)
player._client.write('chat', { message: JSON.stringify(message), position: 2 })
}
}