diff --git a/scripts/client/chatbox.js b/scripts/client/chatbox.js index 37526c4b..d74eb237 100644 --- a/scripts/client/chatbox.js +++ b/scripts/client/chatbox.js @@ -46,11 +46,13 @@ function unBindChatBoxKeys() { // =========================================================================== function receiveChatBoxMessageFromServer(messageString, colour) { - if(bottomMessageIndex => chatBoxHistory.length-1) { - message(messageString, colour); + let colouredString = replaceColoursInMessage(messageString); + + if(bottomMessageIndex >= chatBoxHistory.length-1) { + message(colouredString, colour); bottomMessageIndex = chatBoxHistory.length-1; } - addToChatBoxHistory(messageString, colour); + addToChatBoxHistory(colouredString, colour); } // =========================================================================== diff --git a/scripts/server/colour.js b/scripts/server/colour.js deleted file mode 100644 index 3ffe0889..00000000 --- a/scripts/server/colour.js +++ /dev/null @@ -1,367 +0,0 @@ -// =========================================================================== -// Vortrex's Roleplay Resource -// https://github.com/VortrexFTW/gtac_roleplay -// =========================================================================== -// FILE: colour.js -// DESC: Provides colours, functions and usage -// TYPE: Server (JavaScript) -// =========================================================================== - -let serverColours = { - hex: { - byType: { - talkMessage: "C8C8C8", - shoutMessage: "FFFFC8", - whisperMessage: "828282", - doActionMessage: "B19CD9", - meActionMessage: "B19CD9", - errorMessage: "ED4337", - syntaxMessage: "C8C8C8", - normalMessage: "FFFFFF", - alertMessage: "FFFF00", - successMessage: "00B400", - clanChatMessage: "00BE00", - businessBlue: "0099FF", - houseGreen: "11CC11", - clanOrange: "FF9900", - vehiclePurple: "960096", - jobYellow: "FFFF00", - }, - byName: { - white: "FFFFFF", - black: "000000", - red: "FF0000", - yellow: "FFFF00", - royalBlue: "0000FF", - teal: "00FFFF", - orange: "FF8000", - softRed: "ED4337", - softGreen: "32CD32", - lightPurple: "960096", - lightGrey: "C8C8C8", - mediumGrey: "969696", - darkGrey: "404040", - policeBlue: "3250C8", - medicPink: "DB7093", - firefighterRed: "CD3C3C", - busDriverGreen: "32A032", - taxiDriverYellow: "F0E664", - deliveryPurple: "B19CD9", - civilianWhite: "C8C8C8", - burntYellow: "D2D200", - burntOrange: "D27800", - bankGreen: "00B400", - softYellow: "EAC67E", - businessBlue: "0099FF", - houseGreen: "11CC11", - clanOrange: "FF9900", - vehiclePurple: "960096", - jobYellow: "FFFF00", - }, - }, - - byType: { - talkMessage: toColour(200, 200, 200), - shoutMessage: toColour(255, 255, 200), - whisperMessage: toColour(130, 130, 130), - doActionMessage: toColour(177, 156, 217, 255), - meActionMessage: toColour(177, 156, 217, 255), - errorMessage: toColour(237, 67, 55, 255), - syntaxMessage: toColour(200, 200, 200, 255), - normalMessage: toColour(255, 255, 255, 255), - alertMessage: toColour(255, 255, 0, 255), - successMessage: toColour(0, 180, 0, 255), - clanChatMessage: toColour(0, 190, 0, 255), - }, - byName: { - white: toColour(255, 255, 255, 255), - black: toColour(0, 0, 0, 255), - red: toColour(255, 0, 0, 255), - yellow: toColour(255, 255, 0, 255), - royalBlue: toColour(0, 0, 255, 255), - teal: toColour(0, 255, 255, 255), - orange: toColour(255, 128, 0, 255), - softRed: toColour(205, 60, 60, 255), - softGreen: toColour(50, 205, 50, 255), - lightPurple: toColour(150, 0, 150, 255), - lightGrey: toColour(200, 200, 200, 255), - mediumGrey: toColour(150, 150, 150, 255), - darkGrey: toColour(64, 64, 64, 255), - policeBlue: toColour(50, 80, 200, 255), - medicPink: toColour(219, 112, 147, 255), - firefighterRed: toColour(205, 60, 60, 255), - busDriverGreen: toColour(50, 160, 50, 255), - taxiDriverYellow: toColour(240, 230, 100, 255), - deliveryPurple: toColour(177, 156, 217, 255), - civilianWhite: toColour(200, 200, 200, 255), - burntYellow: toColour(210, 210, 0, 255), - burntOrange: toColour(210, 120, 0, 255), - bankGreen: toColour(0, 150, 0, 255), - softYellow: toColour(234, 198, 126, 255), - businessBlue: toColour(0, 153, 255, 255), - houseGreen: toColour(17, 204, 17, 255), - clanOrange: toColour(255, 153, 0, 255), - }, -}; - -// =========================================================================== - -function getServerColours() { - return serverColours; -} - -// =========================================================================== - -function getColourByType(typeName) { - return getServerColours().byType[typeName]; -} - -// =========================================================================== - -function getColourByName(colourName) { - return getServerColours().byName[colourName]; -} - -// =========================================================================== - -function getHexColourByName(colourName) { - //let rgbaColour = getServerColours().byName[colourName]; - //let rgbaArray = rgbaArrayFromToColour(rgbaColour); - //return rgbToHex(rgbaArray[0], rgbaArray[1], rgbaArray[2]); - - return `#${getServerColours().hex.byName[colourName]}`; -} - -// =========================================================================== - -function getHexColourByType(colourName) { - //let rgbaColour = getServerColours().byType[colourName]; - //let rgbaArray = rgbaArrayFromToColour(rgbaColour); - //return rgbToHex(rgbaArray[0], rgbaArray[1], rgbaArray[2]); - - return `#${getServerColours().hex.byType[colourName]}`; -} - -// =========================================================================== - -function getPlayerColour(client) { - if(getPlayerData(client) != false) { - if(!isPlayerLoggedIn(client)) { - return getColourByName("darkGrey"); - } else { - if(isPlayerWorking(client)) { - return getJobData(getJobIndexFromDatabaseId(getPlayerCurrentSubAccount(client).job)).colour; - } - } - } - - return getColourByName("civilianWhite"); -} - -// =========================================================================== - -/** - * Gets the red/green colour depending on bool (red = false, green = true) for inline use in chatbox messages - * - * @param {Boolean} boolValue The boolean value - * @return {String} Red or green inline HEX colour string - * - */ -function getBoolRedGreenInlineColour(boolValue) { - return (!boolValue) ? "{softRed}" : "{softGreen}"; -} - -// =========================================================================== - -/** - * Gets an array of RGB colour values from a HEX colour string - * - * @param {String} hexColour Hex colour string - * @return {Array} 3-slot array where each slot is an RGB colour value - * - */ -function hexToRgb(h) { - return [ - '0x'+h[1]+h[2]|0, - '0x'+h[3]+h[4]|0, - '0x'+h[5]+h[6]|0 - ]; -} - -// =========================================================================== - -/** - * Gets a HEX colour string from RGB values, without brackets (example: #FFFFFF) - * - * @param {Number} red Red RGB value - * @param {Number} green Green RGB value - * @param {Number} blue Blue RGB value - * @return {String} HEX colour string - * - */ -function rgbToHex(r, g, b) { - return "#"+((1<<24)+(r<<16)+(g<<8)+ b).toString(16).slice(1); -} - -// =========================================================================== - -/** - * Gets the current colour for a player (affected by job and status) - * - * @param {Client} client Player client - * @return {Number} Colour integer - * - */ -function getClientChatColour(client) { - let tempJob = getPlayerCurrentSubAccount(client).job; - if(tempJob != -1) { - if(getPlayerData(client).isWorking) { - return getJobData(tempJob).jobColour; - } - } - return getColourByName("white"); -} - -// =========================================================================== - -/** - * Gets a toColour-created colour integer with random RGB values (alpha is always 255) - * - * @return {Number} Colour integer - * - */ -function getRandomRGB() { - return toColour.apply(null, [ - getRandom(0, 255), - getRandom(0, 255), - getRandom(0, 255), - 255 - ]); -} - -// =========================================================================== - -/** - * Gets a hex formatting colour by name for use inline in chatbox messages (example: [#FFFFFF]). - * - * @param {String} colourName - Colour name - * @return {String} HEX-formatted colour string with brackets - * - */ -function getInlineChatColourByName(colourName) { - return `{${colourName}}`; -} - -// =========================================================================== - -/** - * Gets a hex formatting colour by type for use inline in chatbox messages (example: [#FFFFFF]). - * - * @param {String} colourName - Colour type - * @return {String} HEX-formatted colour string with brackets - * - */ -function getInlineChatColourByType(colourName) { - return `{${colourName}}`; -} - -// =========================================================================== - -/** - * Gets an array of RGBA colour values from a toColour integer. - * - * @param {Number} colour - Colour integer created by toColour - * @return {Array} 4-slot array where each slot is an RGBA colour value - * - */ -function rgbaArrayFromToColour(colour) { - //return [ - // (colour >> 24) & 0xFF, // red - // (colour >> 16) & 0xFF, - // (colour >> 8) & 0xFF, - // colour & 0xFF // alpha - //]; - return [ - (colour >> 16) & 0xFF, // red - (colour >> 8) & 0xFF, - colour & 0xFF, - (colour >> 24) & 0xFF// alpha - ]; -} - -// =========================================================================== - -function hexFromToColour(colour) { - let rgba = rgbaArrayFromToColour(colour); - return rgbToHex(rgba[0], rgba[1], rgba[2]); -} - -// =========================================================================== - -function replaceColoursInMessage(messageText) { - if(messageText == null) { - return ""; - } - - let tempFind = `{RESETCOLOUR}`; - let tempRegex = new RegExp(tempFind, 'g'); - messageText = messageText.replace(tempRegex, "[/#]"); - - tempFind = `{ALTCOLOUR}`; - tempRegex = new RegExp(tempFind, 'g'); - messageText = messageText.replace(tempRegex, "[#C8C8C8]"); - - tempFind = `{MAINCOLOUR}`; - tempRegex = new RegExp(tempFind, 'g'); - messageText = messageText.replace(tempRegex, "[#FFFFFF]"); - - for(let i in getServerColours().hex.byName) { - let find = `{${i}}`; - let re = new RegExp(find, 'g'); - messageText = messageText.replace(re, `[#${getServerColours().hex.byName[i]}]`); - } - - for(let i in getServerColours().hex.byType) { - let find = `{${i}}`; - let re = new RegExp(find, 'g'); - messageText = messageText.replace(re, `[#${getServerColours().hex.byType[i]}]`); - } - - return messageText; -} - -// =========================================================================== - -function removeColoursInMessage(messageText) { - if(messageText == null) { - return ""; - } - - let tempFind = `{RESETCOLOUR}`; - let tempRegex = new RegExp(tempFind, 'g'); - messageText = messageText.replace(tempRegex, ""); - - tempFind = `{ALTCOLOUR}`; - tempRegex = new RegExp(tempFind, 'g'); - messageText = messageText.replace(tempRegex, ""); - - tempFind = `{MAINCOLOUR}`; - tempRegex = new RegExp(tempFind, 'g'); - messageText = messageText.replace(tempRegex, ""); - - for(let i in getServerColours().hex.byName) { - let find = `{${i}}`; - let re = new RegExp(find, 'g'); - messageText = messageText.replace(re, ""); - } - - for(let i in getServerColours().hex.byType) { - let find = `{${i}}`; - let re = new RegExp(find, 'g'); - messageText = messageText.replace(re, ""); - } - - return messageText; -} - -// =========================================================================== \ No newline at end of file diff --git a/scripts/server/locale.js b/scripts/server/locale.js index f10c0b02..a45ef9e8 100644 --- a/scripts/server/locale.js +++ b/scripts/server/locale.js @@ -34,8 +34,6 @@ function getLocaleString(client, stringName, ...args) { submitBugReport(client, `(AUTOMATED REPORT) Locale string "${stringName}" is missing for "${getPlayerLocaleName(client)}"`); } - tempString = replaceColoursInMessage(tempString); - for(let i = 1; i <= args.length; i++) { tempString = tempString.replace(`{${i}}`, args[i-1]); } @@ -47,7 +45,6 @@ function getLocaleString(client, stringName, ...args) { function getGroupedLocaleString(client, stringName, index, ...args) { let tempString = getRawGroupedLocaleString(stringName, getPlayerData(client).locale, index); - tempString = replaceColoursInMessage(tempString); for(let i = 1; i <= args.length; i++) { tempString = tempString.replace(`{${i}}`, args[i-1]); diff --git a/scripts/server/messaging.js b/scripts/server/messaging.js index 91a5608f..e27eb770 100644 --- a/scripts/server/messaging.js +++ b/scripts/server/messaging.js @@ -33,19 +33,19 @@ function messageAdminAction(messageText) { * */ function messagePlayerNormal(client, messageText, colour = COLOUR_WHITE) { - if(isConsole(client) || client == null) { - logToConsole(LOG_INFO, `${removeColoursInMessage(messageText)}`); - } + //if(isConsole(client) || client == null) { + // logToConsole(LOG_INFO, `${removeColoursInMessage(messageText)}`); + //} - sendChatBoxMessageToPlayer(client, `${replaceColoursInMessage(messageText)}`, colour); + sendChatBoxMessageToPlayer(client, messageText, colour); return true; } // =========================================================================== function messageAdmins(messageText, colour = getColourByName("softRed")) { - let plainMessage = removeColoursInMessage(messageText); - console.warn(`๐Ÿ›ก๏ธ ${plainMessage}`); + //let plainMessage = removeColoursInMessage(messageText); + //console.warn(`๐Ÿ›ก๏ธ ${plainMessage}`); let clients = getClients(); for(let i in clients) { @@ -54,9 +54,9 @@ function messageAdmins(messageText, colour = getColourByName("softRed")) { } } - if(getServerConfig().discordConfig.sendAdminEvents) { - messageDiscordAdminChannel(plainMessage); - } + //if(getServerConfig().discordConfig.sendAdminEvents) { + // messageDiscordAdminChannel(plainMessage); + //} } // =========================================================================== @@ -236,17 +236,6 @@ function clearChatBox(client) { // =========================================================================== -function replaceEmojiInString(messageString) { - for(let i in emojiReplaceString) { - while(messageString.indexOf(emojiReplaceString[i][0]) != -1) { - messageString = messageString.replace(emojiReplaceString[i][0], emojiReplaceString[i][1]); - } - } - return messageString; -} - -// =========================================================================== - function messagePlayerHelpContent(client, messageString) { messagePlayerNormal(client, `{clanOrange}โ€ข {MAINCOLOUR}${messageString}`); } diff --git a/scripts/shared/gamedata.js b/scripts/shared/gamedata.js index 6c44119e..497dcdbb 100644 --- a/scripts/shared/gamedata.js +++ b/scripts/shared/gamedata.js @@ -5355,3 +5355,4 @@ let gameData = { ], }; +// =========================================================================== \ No newline at end of file diff --git a/scripts/shared/utilities.js b/scripts/shared/utilities.js index 808ccb91..1cd8fd4a 100644 --- a/scripts/shared/utilities.js +++ b/scripts/shared/utilities.js @@ -170,6 +170,963 @@ let cardinalDirections = [ // =========================================================================== +let serverColours = { + hex: { + byType: { + talkMessage: "C8C8C8", + shoutMessage: "FFFFC8", + whisperMessage: "828282", + doActionMessage: "B19CD9", + meActionMessage: "B19CD9", + errorMessage: "ED4337", + syntaxMessage: "C8C8C8", + normalMessage: "FFFFFF", + alertMessage: "FFFF00", + successMessage: "00B400", + clanChatMessage: "00BE00", + businessBlue: "0099FF", + houseGreen: "11CC11", + clanOrange: "FF9900", + vehiclePurple: "960096", + jobYellow: "FFFF00", + }, + byName: { + white: "FFFFFF", + black: "000000", + red: "FF0000", + yellow: "FFFF00", + royalBlue: "0000FF", + teal: "00FFFF", + orange: "FF8000", + softRed: "ED4337", + softGreen: "32CD32", + lightPurple: "960096", + lightGrey: "C8C8C8", + mediumGrey: "969696", + darkGrey: "404040", + policeBlue: "3250C8", + medicPink: "DB7093", + firefighterRed: "CD3C3C", + busDriverGreen: "32A032", + taxiDriverYellow: "F0E664", + deliveryPurple: "B19CD9", + civilianWhite: "C8C8C8", + burntYellow: "D2D200", + burntOrange: "D27800", + bankGreen: "00B400", + softYellow: "EAC67E", + businessBlue: "0099FF", + houseGreen: "11CC11", + clanOrange: "FF9900", + vehiclePurple: "960096", + jobYellow: "FFFF00", + }, + }, + + byType: { + talkMessage: toColour(200, 200, 200), + shoutMessage: toColour(255, 255, 200), + whisperMessage: toColour(130, 130, 130), + doActionMessage: toColour(177, 156, 217, 255), + meActionMessage: toColour(177, 156, 217, 255), + errorMessage: toColour(237, 67, 55, 255), + syntaxMessage: toColour(200, 200, 200, 255), + normalMessage: toColour(255, 255, 255, 255), + alertMessage: toColour(255, 255, 0, 255), + successMessage: toColour(0, 180, 0, 255), + clanChatMessage: toColour(0, 190, 0, 255), + }, + byName: { + white: toColour(255, 255, 255, 255), + black: toColour(0, 0, 0, 255), + red: toColour(255, 0, 0, 255), + yellow: toColour(255, 255, 0, 255), + royalBlue: toColour(0, 0, 255, 255), + teal: toColour(0, 255, 255, 255), + orange: toColour(255, 128, 0, 255), + softRed: toColour(205, 60, 60, 255), + softGreen: toColour(50, 205, 50, 255), + lightPurple: toColour(150, 0, 150, 255), + lightGrey: toColour(200, 200, 200, 255), + mediumGrey: toColour(150, 150, 150, 255), + darkGrey: toColour(64, 64, 64, 255), + policeBlue: toColour(50, 80, 200, 255), + medicPink: toColour(219, 112, 147, 255), + firefighterRed: toColour(205, 60, 60, 255), + busDriverGreen: toColour(50, 160, 50, 255), + taxiDriverYellow: toColour(240, 230, 100, 255), + deliveryPurple: toColour(177, 156, 217, 255), + civilianWhite: toColour(200, 200, 200, 255), + burntYellow: toColour(210, 210, 0, 255), + burntOrange: toColour(210, 120, 0, 255), + bankGreen: toColour(0, 150, 0, 255), + softYellow: toColour(234, 198, 126, 255), + businessBlue: toColour(0, 153, 255, 255), + houseGreen: toColour(17, 204, 17, 255), + clanOrange: toColour(255, 153, 0, 255), + }, +}; + +let serverEmoji = [ + [":hash:", "#"], + [":zero:", "0"], + [":one:", "1"], + [":two:", "2"], + [":three:", "3"], + [":four:", "4"], + [":five:", "5"], + [":six:", "6"], + [":seven:", "7"], + [":eight:", "8"], + [":nine:", "9"], + [":copyright:", "ยฉ"], + [":registered:", "ยฎ"], + [":bangbang:", "โ€ผ"], + [":interrobang:", "โ‰"], + [":tm:", "โ„ข"], + [":information_source:", "โ„น"], + [":left_right_arrow:", "โ†”"], + [":arrow_up_down:", "โ†•"], + [":arrow_upper_left:", "โ†–"], + [":arrow_upper_right:", "โ†—"], + [":arrow_lower_right:", "โ†˜"], + [":arrow_lower_left:", "โ†™"], + [":leftwards_arrow_with_hook:", "โ†ฉ"], + [":arrow_right_hook:", "โ†ช"], + [":watch:", "โŒš"], + [":hourglass:", "โŒ›"], + [":fast_forward:", "โฉ"], + [":rewind:", "โช"], + [":arrow_double_up:", "โซ"], + [":arrow_double_down:", "โฌ"], + [":alarm_clock:", "โฐ"], + [":hourglass_flowing_sand:", "โณ"], + [":m:", "โ“œ"], + [":black_small_square:", "โ–ช"], + [":white_small_square:", "โ–ซ"], + [":arrow_forward:", "โ–ถ"], + [":arrow_backward:", "โ—€"], + [":white_medium_square:", "โ—ป"], + [":black_medium_square:", "โ—ผ"], + [":white_medium_small_square:", "โ—ฝ"], + [":black_medium_small_square:", "โ—พ"], + [":sunny:", "โ˜€"], + [":cloud:", "โ˜"], + [":telephone:", "โ˜Ž"], + [":ballot_box_with_check:", "โ˜‘"], + [":umbrella:", "โ˜”"], + [":coffee:", "โ˜•"], + [":point_up:", "โ˜"], + [":relaxed:", "โ˜บ"], + [":aries:", "โ™ˆ"], + [":taurus:", "โ™‰"], + [":gemini:", "โ™Š"], + [":cancer:", "โ™‹"], + [":leo:", "โ™Œ"], + [":virgo:", "โ™"], + [":libra:", "โ™Ž"], + [":scorpius:", "โ™"], + [":sagittarius:", "โ™"], + [":capricorn:", "โ™‘"], + [":aquarius:", "โ™’"], + [":pisces:", "โ™“"], + [":spades:", "โ™ "], + [":clubs:", "โ™ฃ"], + [":hearts:", "โ™ฅ"], + [":diamonds:", "โ™ฆ"], + [":hotsprings:", "โ™จ"], + [":recycle:", "โ™ป"], + [":wheelchair:", "โ™ฟ"], + [":anchor:", "โš“"], + [":warning:", "โš "], + [":zap:", "โšก"], + [":white_circle:", "โšช"], + [":black_circle:", "โšซ"], + [":soccer:", "โšฝ"], + [":baseball:", "โšพ"], + [":snowman:", "โ›„"], + [":partly_sunny:", "โ›…"], + [":ophiuchus:", "โ›Ž"], + [":no_entry:", "โ›”"], + [":church:", "โ›ช"], + [":fountain:", "โ›ฒ"], + [":golf:", "โ›ณ"], + [":sailboat:", "โ›ต"], + [":tent:", "โ›บ"], + [":fuelpump:", "โ›ฝ"], + [":scissors:", "โœ‚"], + [":white_check_mark:", "โœ…"], + [":airplane:", "โœˆ"], + [":envelope:", "โœ‰"], + [":fist:", "โœŠ"], + [":raised_hand:", "โœ‹"], + [":v:", "โœŒ"], + [":pencil2:", "โœ"], + [":black_nib:", "โœ’"], + [":heavy_check_mark:", "โœ”"], + [":heavy_multiplication_x:", "โœ–"], + [":sparkles:", "โœจ"], + [":eight_spoked_asterisk:", "โœณ"], + [":eight_pointed_black_star:", "โœด"], + [":snowflake:", "โ„"], + [":sparkle:", "โ‡"], + [":x:", "โŒ"], + [":negative_squared_cross_mark:", "โŽ"], + [":question:", "โ“"], + [":grey_question:", "โ”"], + [":grey_exclamation:", "โ•"], + [":exclamation:", "โ—"], + [":heart:", "โค"], + [":heavy_plus_sign:", "โž•"], + [":heavy_minus_sign:", "โž–"], + [":heavy_division_sign:", "โž—"], + [":arrow_right:", "โžก"], + [":curly_loop:", "โžฐ"], + [":arrow_heading_up:", "โคด"], + [":arrow_heading_down:", "โคต"], + [":arrow_left:", "โฌ…"], + [":arrow_up:", "โฌ†"], + [":arrow_down:", "โฌ‡"], + [":black_large_square:", "โฌ›"], + [":white_large_square:", "โฌœ"], + [":star:", "โญ"], + [":o:", "โญ•"], + [":wavy_dash:", "ใ€ฐ"], + [":part_alternation_mark:", "ใ€ฝ"], + [":congratulations:", "ใŠ—"], + [":secret:", "ใŠ™"], + [":mahjong:", "๐Ÿ€„"], + [":black_joker:", "๐Ÿƒ"], + [":a:", "๐Ÿ…ฐ"], + [":b:", "๐Ÿ…ฑ"], + [":o2:", "๐Ÿ…พ"], + [":parking:", "๐Ÿ…ฟ"], + [":ab:", "๐Ÿ†Ž"], + [":cl:", "๐Ÿ†‘"], + [":cool:", "๐Ÿ†’"], + [":free:", "๐Ÿ†“"], + [":id:", "๐Ÿ†”"], + [":new:", "๐Ÿ†•"], + [":ng:", "๐Ÿ†–"], + [":ok:", "๐Ÿ†—"], + [":sos:", "๐Ÿ†˜"], + [":up:", "๐Ÿ†™"], + [":vs:", "๐Ÿ†š"], + [":cn:", "๐Ÿ‡จ ๐Ÿ‡ณ"], + [":de:", "๐Ÿ‡ฉ ๐Ÿ‡ช"], + [":es:", "๐Ÿ‡ช ๐Ÿ‡ธ"], + [":fr:", "๐Ÿ‡ซ ๐Ÿ‡ท"], + [":uk:", "๐Ÿ‡ฌ ๐Ÿ‡ง"], + [":it:", "๐Ÿ‡ฎ ๐Ÿ‡น"], + [":jp:", "๐Ÿ‡ฏ ๐Ÿ‡ต"], + [":kr:", "๐Ÿ‡ฐ ๐Ÿ‡ท"], + [":ru:", "๐Ÿ‡ท ๐Ÿ‡บ"], + [":us:", "๐Ÿ‡บ ๐Ÿ‡ธ"], + [":koko:", "๐Ÿˆ"], + [":sa:", "๐Ÿˆ‚"], + [":u7121:", "๐Ÿˆš"], + [":u6307:", "๐Ÿˆฏ"], + [":u7981:", "๐Ÿˆฒ"], + [":u7a7a:", "๐Ÿˆณ"], + [":u5408:", "๐Ÿˆด"], + [":u6e80:", "๐Ÿˆต"], + [":u6709:", "๐Ÿˆถ"], + [":u6708:", "๐Ÿˆท"], + [":u7533:", "๐Ÿˆธ"], + [":u5272:", "๐Ÿˆน"], + [":u55b6:", "๐Ÿˆบ"], + [":ideograph_advantage:", "๐Ÿ‰"], + [":accept:", "๐Ÿ‰‘"], + [":cyclone:", "๐ŸŒ€"], + [":foggy:", "๐ŸŒ"], + [":closed_umbrella:", "๐ŸŒ‚"], + [":night_with_stars:", "๐ŸŒƒ"], + [":sunrise_over_mountains:", "๐ŸŒ„"], + [":sunrise:", "๐ŸŒ…"], + [":city_sunset:", "๐ŸŒ†"], + [":city_sunrise:", "๐ŸŒ‡"], + [":rainbow:", "๐ŸŒˆ"], + [":bridge_at_night:", "๐ŸŒ‰"], + [":ocean:", "๐ŸŒŠ"], + [":volcano:", "๐ŸŒ‹"], + [":milky_way:", "๐ŸŒŒ"], + [":earth_asia:", "๐ŸŒ"], + [":new_moon:", "๐ŸŒ‘"], + [":first_quarter_moon:", "๐ŸŒ“"], + [":waxing_gibbous_moon:", "๐ŸŒ”"], + [":full_moon:", "๐ŸŒ•"], + [":crescent_moon:", "๐ŸŒ™"], + [":first_quarter_moon_with_face:", "๐ŸŒ›"], + [":star2:", "๐ŸŒŸ"], + [":stars:", "๐ŸŒ "], + [":chestnut:", "๐ŸŒฐ"], + [":seedling:", "๐ŸŒฑ"], + [":palm_tree:", "๐ŸŒด"], + [":cactus:", "๐ŸŒต"], + [":tulip:", "๐ŸŒท"], + [":cherry_blossom:", "๐ŸŒธ"], + [":rose:", "๐ŸŒน"], + [":hibiscus:", "๐ŸŒบ"], + [":sunflower:", "๐ŸŒป"], + [":blossom:", "๐ŸŒผ"], + [":corn:", "๐ŸŒฝ"], + [":ear_of_rice:", "๐ŸŒพ"], + [":herb:", "๐ŸŒฟ"], + [":four_leaf_clover:", "๐Ÿ€"], + [":maple_leaf:", "๐Ÿ"], + [":fallen_leaf:", "๐Ÿ‚"], + [":leaves:", "๐Ÿƒ"], + [":mushroom:", "๐Ÿ„"], + [":tomato:", "๐Ÿ…"], + [":eggplant:", "๐Ÿ†"], + [":grapes:", "๐Ÿ‡"], + [":melon:", "๐Ÿˆ"], + [":watermelon:", "๐Ÿ‰"], + [":tangerine:", "๐ŸŠ"], + [":banana:", "๐ŸŒ"], + [":pineapple:", "๐Ÿ"], + [":apple:", "๐ŸŽ"], + [":green_apple:", "๐Ÿ"], + [":peach:", "๐Ÿ‘"], + [":cherries:", "๐Ÿ’"], + [":strawberry:", "๐Ÿ“"], + [":hamburger:", "๐Ÿ”"], + [":pizza:", "๐Ÿ•"], + [":meat_on_bone:", "๐Ÿ–"], + [":poultry_leg:", "๐Ÿ—"], + [":rice_cracker:", "๐Ÿ˜"], + [":rice_ball:", "๐Ÿ™"], + [":rice:", "๐Ÿš"], + [":curry:", "๐Ÿ›"], + [":ramen:", "๐Ÿœ"], + [":spaghetti:", "๐Ÿ"], + [":bread:", "๐Ÿž"], + [":fries:", "๐ŸŸ"], + [":sweet_potato:", "๐Ÿ "], + [":dango:", "๐Ÿก"], + [":oden:", "๐Ÿข"], + [":sushi:", "๐Ÿฃ"], + [":fried_shrimp:", "๐Ÿค"], + [":fish_cake:", "๐Ÿฅ"], + [":icecream:", "๐Ÿฆ"], + [":shaved_ice:", "๐Ÿง"], + [":ice_cream:", "๐Ÿจ"], + [":doughnut:", "๐Ÿฉ"], + [":cookie:", "๐Ÿช"], + [":chocolate_bar:", "๐Ÿซ"], + [":candy:", "๐Ÿฌ"], + [":lollipop:", "๐Ÿญ"], + [":custard:", "๐Ÿฎ"], + [":honey_pot:", "๐Ÿฏ"], + [":cake:", "๐Ÿฐ"], + [":bento:", "๐Ÿฑ"], + [":stew:", "๐Ÿฒ"], + [":egg:", "๐Ÿณ"], + [":fork_and_knife:", "๐Ÿด"], + [":tea:", "๐Ÿต"], + [":sake:", "๐Ÿถ"], + [":wine_glass:", "๐Ÿท"], + [":cocktail:", "๐Ÿธ"], + [":tropical_drink:", "๐Ÿน"], + [":beer:", "๐Ÿบ"], + [":beers:", "๐Ÿป"], + [":ribbon:", "๐ŸŽ€"], + [":gift:", "๐ŸŽ"], + [":birthday:", "๐ŸŽ‚"], + [":jack_o_lantern:", "๐ŸŽƒ"], + [":christmas_tree:", "๐ŸŽ„"], + [":santa:", "๐ŸŽ…"], + [":fireworks:", "๐ŸŽ†"], + [":sparkler:", "๐ŸŽ‡"], + [":balloon:", "๐ŸŽˆ"], + [":tada:", "๐ŸŽ‰"], + [":confetti_ball:", "๐ŸŽŠ"], + [":tanabata_tree:", "๐ŸŽ‹"], + [":crossed_flags:", "๐ŸŽŒ"], + [":bamboo:", "๐ŸŽ"], + [":dolls:", "๐ŸŽŽ"], + [":flags:", "๐ŸŽ"], + [":wind_chime:", "๐ŸŽ"], + [":rice_scene:", "๐ŸŽ‘"], + [":school_satchel:", "๐ŸŽ’"], + [":mortar_board:", "๐ŸŽ“"], + [":carousel_horse:", "๐ŸŽ "], + [":ferris_wheel:", "๐ŸŽก"], + [":roller_coaster:", "๐ŸŽข"], + [":fishing_pole_and_fish:", "๐ŸŽฃ"], + [":microphone:", "๐ŸŽค"], + [":movie_camera:", "๐ŸŽฅ"], + [":cinema:", "๐ŸŽฆ"], + [":headphones:", "๐ŸŽง"], + [":art:", "๐ŸŽจ"], + [":tophat:", "๐ŸŽฉ"], + [":circus_tent:", "๐ŸŽช"], + [":ticket:", "๐ŸŽซ"], + [":clapper:", "๐ŸŽฌ"], + [":performing_arts:", "๐ŸŽญ"], + [":video_game:", "๐ŸŽฎ"], + [":dart:", "๐ŸŽฏ"], + [":slot_machine:", "๐ŸŽฐ"], + [":_8ball:", "๐ŸŽฑ"], + [":game_die:", "๐ŸŽฒ"], + [":bowling:", "๐ŸŽณ"], + [":flower_playing_cards:", "๐ŸŽด"], + [":musical_note:", "๐ŸŽต"], + [":notes:", "๐ŸŽถ"], + [":saxophone:", "๐ŸŽท"], + [":guitar:", "๐ŸŽธ"], + [":musical_keyboard:", "๐ŸŽน"], + [":trumpet:", "๐ŸŽบ"], + [":violin:", "๐ŸŽป"], + [":musical_score:", "๐ŸŽผ"], + [":running_shirt_with_sash:", "๐ŸŽฝ"], + [":tennis:", "๐ŸŽพ"], + [":ski:", "๐ŸŽฟ"], + [":basketball:", "๐Ÿ€"], + [":checkered_flag:", "๐Ÿ"], + [":snowboarder:", "๐Ÿ‚"], + [":runner:", "๐Ÿƒ"], + [":surfer:", "๐Ÿ„"], + [":trophy:", "๐Ÿ†"], + [":football:", "๐Ÿˆ"], + [":swimmer:", "๐ŸŠ"], + [":house:", "๐Ÿ "], + [":house_with_garden:", "๐Ÿก"], + [":office:", "๐Ÿข"], + [":post_office:", "๐Ÿฃ"], + [":hospital:", "๐Ÿฅ"], + [":bank:", "๐Ÿฆ"], + [":atm:", "๐Ÿง"], + [":hotel:", "๐Ÿจ"], + [":love_hotel:", "๐Ÿฉ"], + [":convenience_store:", "๐Ÿช"], + [":school:", "๐Ÿซ"], + [":department_store:", "๐Ÿฌ"], + [":factory:", "๐Ÿญ"], + [":izakaya_lantern:", "๐Ÿฎ"], + [":japanese_castle:", "๐Ÿฏ"], + [":european_castle:", "๐Ÿฐ"], + [":snail:", "๐ŸŒ"], + [":snake:", "๐Ÿ"], + [":racehorse:", "๐ŸŽ"], + [":sheep:", "๐Ÿ‘"], + [":monkey:", "๐Ÿ’"], + [":chicken:", "๐Ÿ”"], + [":boar:", "๐Ÿ—"], + [":elephant:", "๐Ÿ˜"], + [":octopus:", "๐Ÿ™"], + [":shell:", "๐Ÿš"], + [":bug:", "๐Ÿ›"], + [":ant:", "๐Ÿœ"], + [":bee:", "๐Ÿ"], + [":beetle:", "๐Ÿž"], + [":fish:", "๐ŸŸ"], + [":tropical_fish:", "๐Ÿ "], + [":blowfish:", "๐Ÿก"], + [":turtle:", "๐Ÿข"], + [":hatching_chick:", "๐Ÿฃ"], + [":baby_chick:", "๐Ÿค"], + [":hatched_chick:", "๐Ÿฅ"], + [":bird:", "๐Ÿฆ"], + [":penguin:", "๐Ÿง"], + [":koala:", "๐Ÿจ"], + [":poodle:", "๐Ÿฉ"], + [":camel:", "๐Ÿซ"], + [":dolphin:", "๐Ÿฌ"], + [":mouse:", "๐Ÿญ"], + [":cow:", "๐Ÿฎ"], + [":tiger:", "๐Ÿฏ"], + [":rabbit:", "๐Ÿฐ"], + [":cat:", "๐Ÿฑ"], + [":dragon_face:", "๐Ÿฒ"], + [":whale:", "๐Ÿณ"], + [":horse:", "๐Ÿด"], + [":monkey_face:", "๐Ÿต"], + [":dog:", "๐Ÿถ"], + [":pig:", "๐Ÿท"], + [":frog:", "๐Ÿธ"], + [":hamster:", "๐Ÿน"], + [":wolf:", "๐Ÿบ"], + [":bear:", "๐Ÿป"], + [":panda_face:", "๐Ÿผ"], + [":pig_nose:", "๐Ÿฝ"], + [":feet:", "๐Ÿพ"], + [":eyes:", "๐Ÿ‘€"], + [":ear:", "๐Ÿ‘‚"], + [":nose:", "๐Ÿ‘ƒ"], + [":lips:", "๐Ÿ‘„"], + [":tongue:", "๐Ÿ‘…"], + [":point_up_2:", "๐Ÿ‘†"], + [":point_down:", "๐Ÿ‘‡"], + [":point_left:", "๐Ÿ‘ˆ"], + [":point_right:", "๐Ÿ‘‰"], + [":punch:", "๐Ÿ‘Š"], + [":wave:", "๐Ÿ‘‹"], + [":ok_hand:", "๐Ÿ‘Œ"], + [":thumbsup:", "๐Ÿ‘"], + [":thumbsdown:", "๐Ÿ‘Ž"], + [":clap:", "๐Ÿ‘"], + [":open_hands:", "๐Ÿ‘"], + [":crown:", "๐Ÿ‘‘"], + [":womans_hat:", "๐Ÿ‘’"], + [":eyeglasses:", "๐Ÿ‘“"], + [":necktie:", "๐Ÿ‘”"], + [":shirt:", "๐Ÿ‘•"], + [":jeans:", "๐Ÿ‘–"], + [":dress:", "๐Ÿ‘—"], + [":kimono:", "๐Ÿ‘˜"], + [":bikini:", "๐Ÿ‘™"], + [":womans_clothes:", "๐Ÿ‘š"], + [":purse:", "๐Ÿ‘›"], + [":handbag:", "๐Ÿ‘œ"], + [":pouch:", "๐Ÿ‘"], + [":mans_shoe:", "๐Ÿ‘ž"], + [":athletic_shoe:", "๐Ÿ‘Ÿ"], + [":high_heel:", "๐Ÿ‘ "], + [":sandal:", "๐Ÿ‘ก"], + [":boot:", "๐Ÿ‘ข"], + [":footprints:", "๐Ÿ‘ฃ"], + [":bust_in_silhouette:", "๐Ÿ‘ค"], + [":boy:", "๐Ÿ‘ฆ"], + [":girl:", "๐Ÿ‘ง"], + [":man:", "๐Ÿ‘จ"], + [":woman:", "๐Ÿ‘ฉ"], + [":family:", "๐Ÿ‘ช"], + [":couple:", "๐Ÿ‘ซ"], + [":cop:", "๐Ÿ‘ฎ"], + [":dancers:", "๐Ÿ‘ฏ"], + [":bride_with_veil:", "๐Ÿ‘ฐ"], + [":person_with_blond_hair:", "๐Ÿ‘ฑ"], + [":man_with_gua_pi_mao:", "๐Ÿ‘ฒ"], + [":man_with_turban:", "๐Ÿ‘ณ"], + [":older_man:", "๐Ÿ‘ด"], + [":older_woman:", "๐Ÿ‘ต"], + [":baby:", "๐Ÿ‘ถ"], + [":construction_worker:", "๐Ÿ‘ท"], + [":princess:", "๐Ÿ‘ธ"], + [":japanese_ogre:", "๐Ÿ‘น"], + [":japanese_goblin:", "๐Ÿ‘บ"], + [":ghost:", "๐Ÿ‘ป"], + [":angel:", "๐Ÿ‘ผ"], + [":alien:", "๐Ÿ‘ฝ"], + [":space_invader:", "๐Ÿ‘พ"], + [":robot_face:", "๐Ÿค–"], + [":imp:", "๐Ÿ‘ฟ"], + [":skull:", "๐Ÿ’€"], + [":information_desk_person:", "๐Ÿ’"], + [":guardsman:", "๐Ÿ’‚"], + [":dancer:", "๐Ÿ’ƒ"], + [":lipstick:", "๐Ÿ’„"], + [":nail_care:", "๐Ÿ’…"], + [":massage:", "๐Ÿ’†"], + [":haircut:", "๐Ÿ’‡"], + [":barber:", "๐Ÿ’ˆ"], + [":syringe:", "๐Ÿ’‰"], + [":pill:", "๐Ÿ’Š"], + [":kiss:", "๐Ÿ’‹"], + [":love_letter:", "๐Ÿ’Œ"], + [":ring:", "๐Ÿ’"], + [":gem:", "๐Ÿ’Ž"], + [":couplekiss:", "๐Ÿ’"], + [":bouquet:", "๐Ÿ’"], + [":couple_with_heart:", "๐Ÿ’‘"], + [":wedding:", "๐Ÿ’’"], + [":heartbeat:", "๐Ÿ’“"], + [":broken_heart:", "๐Ÿ’”"], + [":two_hearts:", "๐Ÿ’•"], + [":sparkling_heart:", "๐Ÿ’–"], + [":heartpulse:", "๐Ÿ’—"], + [":cupid:", "๐Ÿ’˜"], + [":blue_heart:", "๐Ÿ’™"], + [":green_heart:", "๐Ÿ’š"], + [":yellow_heart:", "๐Ÿ’›"], + [":purple_heart:", "๐Ÿ’œ"], + [":gift_heart:", "๐Ÿ’"], + [":revolving_hearts:", "๐Ÿ’ž"], + [":heart_decoration:", "๐Ÿ’Ÿ"], + [":diamond_shape_with_a_dot_inside:", "๐Ÿ’ "], + [":bulb:", "๐Ÿ’ก"], + [":anger:", "๐Ÿ’ข"], + [":bomb:", "๐Ÿ’ฃ"], + [":zzz:", "๐Ÿ’ค"], + [":boom:", "๐Ÿ’ฅ"], + [":sweat_drops:", "๐Ÿ’ฆ"], + [":droplet:", "๐Ÿ’ง"], + [":dash:", "๐Ÿ’จ"], + [":poop:", "๐Ÿ’ฉ"], + [":muscle:", "๐Ÿ’ช"], + [":dizzy:", "๐Ÿ’ซ"], + [":speech_balloon:", "๐Ÿ’ฌ"], + [":white_flower:", "๐Ÿ’ฎ"], + [":_100:", "๐Ÿ’ฏ"], + [":moneybag:", "๐Ÿ’ฐ"], + [":currency_exchange:", "๐Ÿ’ฑ"], + [":heavy_dollar_sign:", "๐Ÿ’ฒ"], + [":credit_card:", "๐Ÿ’ณ"], + [":yen:", "๐Ÿ’ด"], + [":dollar:", "๐Ÿ’ต"], + [":money_with_wings:", "๐Ÿ’ธ"], + [":chart:", "๐Ÿ’น"], + [":seat:", "๐Ÿ’บ"], + [":computer:", "๐Ÿ’ป"], + [":briefcase:", "๐Ÿ’ผ"], + [":minidisc:", "๐Ÿ’ฝ"], + [":floppy_disk:", "๐Ÿ’พ"], + [":cd:", "๐Ÿ’ฟ"], + [":dvd:", "๐Ÿ“€"], + [":file_folder:", "๐Ÿ“"], + [":open_file_folder:", "๐Ÿ“‚"], + [":page_with_curl:", "๐Ÿ“ƒ"], + [":page_facing_up:", "๐Ÿ“„"], + [":date:", "๐Ÿ“…"], + [":calendar:", "๐Ÿ“†"], + [":card_index:", "๐Ÿ“‡"], + [":chart_with_upwards_trend:", "๐Ÿ“ˆ"], + [":chart_with_downwards_trend:", "๐Ÿ“‰"], + [":bar_chart:", "๐Ÿ“Š"], + [":clipboard:", "๐Ÿ“‹"], + [":pushpin:", "๐Ÿ“Œ"], + [":round_pushpin:", "๐Ÿ“"], + [":paperclip:", "๐Ÿ“Ž"], + [":straight_ruler:", "๐Ÿ“"], + [":triangular_ruler:", "๐Ÿ“"], + [":bookmark_tabs:", "๐Ÿ“‘"], + [":ledger:", "๐Ÿ“’"], + [":notebook:", "๐Ÿ““"], + [":notebook_with_decorative_cover:", "๐Ÿ“”"], + [":closed_book:", "๐Ÿ“•"], + [":book:", "๐Ÿ“–"], + [":green_book:", "๐Ÿ“—"], + [":blue_book:", "๐Ÿ“˜"], + [":orange_book:", "๐Ÿ“™"], + [":books:", "๐Ÿ“š"], + [":name_badge:", "๐Ÿ“›"], + [":scroll:", "๐Ÿ“œ"], + [":pencil:", "๐Ÿ“"], + [":telephone_receiver:", "๐Ÿ“ž"], + [":pager:", "๐Ÿ“Ÿ"], + [":fax:", "๐Ÿ“ "], + [":satellite:", "๐Ÿ“ก"], + [":loudspeaker:", "๐Ÿ“ข"], + [":mega:", "๐Ÿ“ฃ"], + [":outbox_tray:", "๐Ÿ“ค"], + [":inbox_tray:", "๐Ÿ“ฅ"], + [":package:", "๐Ÿ“ฆ"], + [":e_mail:", "๐Ÿ“ง"], + [":incoming_envelope:", "๐Ÿ“จ"], + [":envelope_with_arrow:", "๐Ÿ“ฉ"], + [":mailbox_closed:", "๐Ÿ“ช"], + [":mailbox:", "๐Ÿ“ซ"], + [":postbox:", "๐Ÿ“ฎ"], + [":newspaper:", "๐Ÿ“ฐ"], + [":iphone:", "๐Ÿ“ฑ"], + [":calling:", "๐Ÿ“ฒ"], + [":vibration_mode:", "๐Ÿ“ณ"], + [":mobile_phone_off:", "๐Ÿ“ด"], + [":signal_strength:", "๐Ÿ“ถ"], + [":camera:", "๐Ÿ“ท"], + [":video_camera:", "๐Ÿ“น"], + [":tv:", "๐Ÿ“บ"], + [":radio:", "๐Ÿ“ป"], + [":vhs:", "๐Ÿ“ผ"], + [":arrows_clockwise:", "๐Ÿ”ƒ"], + [":loud_sound:", "๐Ÿ”Š"], + [":battery:", "๐Ÿ”‹"], + [":electric_plug:", "๐Ÿ”Œ"], + [":mag:", "๐Ÿ”"], + [":mag_right:", "๐Ÿ”Ž"], + [":lock_with_ink_pen:", "๐Ÿ”"], + [":closed_lock_with_key:", "๐Ÿ”"], + [":key:", "๐Ÿ”‘"], + [":lock:", "๐Ÿ”’"], + [":unlock:", "๐Ÿ”“"], + [":bell:", "๐Ÿ””"], + [":bookmark:", "๐Ÿ”–"], + [":link:", "๐Ÿ”—"], + [":radio_button:", "๐Ÿ”˜"], + [":back:", "๐Ÿ”™"], + [":end:", "๐Ÿ”š"], + [":on:", "๐Ÿ”›"], + [":soon:", "๐Ÿ”œ"], + [":top:", "๐Ÿ”"], + [":underage:", "๐Ÿ”ž"], + [":keycap_ten:", "๐Ÿ”Ÿ"], + [":capital_abcd:", "๐Ÿ” "], + [":abcd:", "๐Ÿ”ก"], + [":_1234:", "๐Ÿ”ข"], + [":symbols:", "๐Ÿ”ฃ"], + [":abc:", "๐Ÿ”ค"], + [":fire:", "๐Ÿ”ฅ"], + [":flashlight:", "๐Ÿ”ฆ"], + [":wrench:", "๐Ÿ”ง"], + [":hammer:", "๐Ÿ”จ"], + [":nut_and_bolt:", "๐Ÿ”ฉ"], + [":knife:", "๐Ÿ”ช"], + [":gun:", "๐Ÿ”ซ"], + [":crystal_ball:", "๐Ÿ”ฎ"], + [":six_pointed_star:", "๐Ÿ”ฏ"], + [":beginner:", "๐Ÿ”ฐ"], + [":trident:", "๐Ÿ”ฑ"], + [":black_square_button:", "๐Ÿ”ฒ"], + [":white_square_button:", "๐Ÿ”ณ"], + [":red_circle:", "๐Ÿ”ด"], + [":large_blue_circle:", "๐Ÿ”ต"], + [":large_orange_diamond:", "๐Ÿ”ถ"], + [":large_blue_diamond:", "๐Ÿ”ท"], + [":small_orange_diamond:", "๐Ÿ”ธ"], + [":small_blue_diamond:", "๐Ÿ”น"], + [":small_red_triangle:", "๐Ÿ”บ"], + [":small_red_triangle_down:", "๐Ÿ”ป"], + [":arrow_up_small:", "๐Ÿ”ผ"], + [":arrow_down_small:", "๐Ÿ”ฝ"], + [":clock1:", "๐Ÿ•"], + [":clock2:", "๐Ÿ•‘"], + [":clock3:", "๐Ÿ•’"], + [":clock4:", "๐Ÿ•“"], + [":clock5:", "๐Ÿ•”"], + [":clock6:", "๐Ÿ••"], + [":clock7:", "๐Ÿ•–"], + [":clock8:", "๐Ÿ•—"], + [":clock9:", "๐Ÿ•˜"], + [":clock10:", "๐Ÿ•™"], + [":clock11:", "๐Ÿ•š"], + [":clock12:", "๐Ÿ•›"], + [":mount_fuji:", "๐Ÿ—ป"], + [":tokyo_tower:", "๐Ÿ—ผ"], + [":statue_of_liberty:", "๐Ÿ—ฝ"], + [":japan:", "๐Ÿ—พ"], + [":moyai:", "๐Ÿ—ฟ"], + [":grin:", "๐Ÿ˜"], + [":joy:", "๐Ÿ˜‚"], + [":smiley:", "๐Ÿ˜ƒ"], + [":smile:", "๐Ÿ˜„"], + [":sweat_smile:", "๐Ÿ˜…"], + [":laughing:", "๐Ÿ˜†"], + [":wink:", "๐Ÿ˜‰"], + [":blush:", "๐Ÿ˜Š"], + [":yum:", "๐Ÿ˜‹"], + [":relieved:", "๐Ÿ˜Œ"], + [":heart_eyes:", "๐Ÿ˜"], + [":smirk:", "๐Ÿ˜"], + [":unamused:", "๐Ÿ˜’"], + [":sweat:", "๐Ÿ˜“"], + [":pensive:", "๐Ÿ˜”"], + [":confounded:", "๐Ÿ˜–"], + [":kissing_heart:", "๐Ÿ˜˜"], + [":kissing_closed_eyes:", "๐Ÿ˜š"], + [":stuck_out_tongue_winking_eye:", "๐Ÿ˜œ"], + [":stuck_out_tongue_closed_eyes:", "๐Ÿ˜"], + [":disappointed:", "๐Ÿ˜ž"], + [":angry:", "๐Ÿ˜ "], + [":rage:", "๐Ÿ˜ก"], + [":cry:", "๐Ÿ˜ข"], + [":persevere:", "๐Ÿ˜ฃ"], + [":triumph:", "๐Ÿ˜ค"], + [":disappointed_relieved:", "๐Ÿ˜ฅ"], + [":fearful:", "๐Ÿ˜จ"], + [":weary:", "๐Ÿ˜ฉ"], + [":sleepy:", "๐Ÿ˜ช"], + [":tired_face:", "๐Ÿ˜ซ"], + [":sob:", "๐Ÿ˜ญ"], + [":cold_sweat:", "๐Ÿ˜ฐ"], + [":scream:", "๐Ÿ˜ฑ"], + [":astonished:", "๐Ÿ˜ฒ"], + [":flushed:", "๐Ÿ˜ณ"], + [":dizzy_face:", "๐Ÿ˜ต"], + [":mask:", "๐Ÿ˜ท"], + [":smile_cat:", "๐Ÿ˜ธ"], + [":joy_cat:", "๐Ÿ˜น"], + [":smiley_cat:", "๐Ÿ˜บ"], + [":heart_eyes_cat:", "๐Ÿ˜ป"], + [":smirk_cat:", "๐Ÿ˜ผ"], + [":kissing_cat:", "๐Ÿ˜ฝ"], + [":pouting_cat:", "๐Ÿ˜พ"], + [":crying_cat_face:", "๐Ÿ˜ฟ"], + [":scream_cat:", "๐Ÿ™€"], + [":no_good:", "๐Ÿ™…"], + [":ok_woman:", "๐Ÿ™†"], + [":bow:", "๐Ÿ™‡"], + [":see_no_evil:", "๐Ÿ™ˆ"], + [":hear_no_evil:", "๐Ÿ™‰"], + [":speak_no_evil:", "๐Ÿ™Š"], + [":raising_hand:", "๐Ÿ™‹"], + [":raised_hands:", "๐Ÿ™Œ"], + [":person_frowning:", "๐Ÿ™"], + [":person_with_pouting_face:", "๐Ÿ™Ž"], + [":pray:", "๐Ÿ™"], + [":rocket:", "๐Ÿš€"], + [":railway_car:", "๐Ÿšƒ"], + [":bullettrain_side:", "๐Ÿš„"], + [":bullettrain_front:", "๐Ÿš…"], + [":metro:", "๐Ÿš‡"], + [":station:", "๐Ÿš‰"], + [":bus:", "๐ŸšŒ"], + [":busstop:", "๐Ÿš"], + [":ambulance:", "๐Ÿš‘"], + [":fire_engine:", "๐Ÿš’"], + [":police_car:", "๐Ÿš“"], + [":taxi:", "๐Ÿš•"], + [":red_car:", "๐Ÿš—"], + [":blue_car:", "๐Ÿš™"], + [":truck:", "๐Ÿšš"], + [":ship:", "๐Ÿšข"], + [":speedboat:", "๐Ÿšค"], + [":traffic_light:", "๐Ÿšฅ"], + [":construction:", "๐Ÿšง"], + [":rotating_light:", "๐Ÿšจ"], + [":triangular_flag_on_post:", "๐Ÿšฉ"], + [":door:", "๐Ÿšช"], + [":no_entry_sign:", "๐Ÿšซ"], + [":smoking:", "๐Ÿšฌ"], + [":no_smoking:", "๐Ÿšญ"], + [":bike:", "๐Ÿšฒ"], + [":walking:", "๐Ÿšถ"], + [":mens:", "๐Ÿšน"], + [":womens:", "๐Ÿšบ"], + [":restroom:", "๐Ÿšป"], + [":baby_symbol:", "๐Ÿšผ"], + [":toilet:", "๐Ÿšฝ"], + [":wc:", "๐Ÿšพ"], + [":bath:", "๐Ÿ›€"], + [":articulated_lorry:", "๐Ÿš›"], + [":kissing_smiling_eyes:", "๐Ÿ˜™"], + [":pear:", "๐Ÿ"], + [":bicyclist:", "๐Ÿšด"], + [":rabbit2:", "๐Ÿ‡"], + [":clock830:", "๐Ÿ•ฃ"], + [":train:", "๐Ÿš‹"], + [":oncoming_automobile:", "๐Ÿš˜"], + [":expressionless:", "๐Ÿ˜‘"], + [":smiling_imp:", "๐Ÿ˜ˆ"], + [":frowning:", "๐Ÿ˜ฆ"], + [":no_mouth:", "๐Ÿ˜ถ"], + [":baby_bottle:", "๐Ÿผ"], + [":non_potable_water:", "๐Ÿšฑ"], + [":open_mouth:", "๐Ÿ˜ฎ"], + [":last_quarter_moon_with_face:", "๐ŸŒœ"], + [":do_not_litter:", "๐Ÿšฏ"], + [":sunglasses:", "๐Ÿ˜Ž"], + [":loop:", "โžฟ"], + [":last_quarter_moon:", "๐ŸŒ—"], + [":grinning:", "๐Ÿ˜€"], + [":euro:", "๐Ÿ’ถ"], + [":clock330:", "๐Ÿ•ž"], + [":telescope:", "๐Ÿ”ญ"], + [":globe_with_meridians:", "๐ŸŒ"], + [":postal_horn:", "๐Ÿ“ฏ"], + [":stuck_out_tongue:", "๐Ÿ˜›"], + [":clock1030:", "๐Ÿ•ฅ"], + [":pound:", "๐Ÿ’ท"], + [":two_men_holding_hands:", "๐Ÿ‘ฌ"], + [":tiger2:", "๐Ÿ…"], + [":anguished:", "๐Ÿ˜ง"], + [":vertical_traffic_light:", "๐Ÿšฆ"], + [":confused:", "๐Ÿ˜•"], + [":repeat:", "๐Ÿ”"], + [":oncoming_police_car:", "๐Ÿš”"], + [":tram:", "๐ŸšŠ"], + [":dragon:", "๐Ÿ‰"], + [":earth_americas:", "๐ŸŒŽ"], + [":rugby_football:", "๐Ÿ‰"], + [":left_luggage:", "๐Ÿ›…"], + [":sound:", "๐Ÿ”‰"], + [":clock630:", "๐Ÿ•ก"], + [":dromedary_camel:", "๐Ÿช"], + [":oncoming_bus:", "๐Ÿš"], + [":horse_racing:", "๐Ÿ‡"], + [":rooster:", "๐Ÿ“"], + [":rowboat:", "๐Ÿšฃ"], + [":customs:", "๐Ÿ›ƒ"], + [":repeat_one:", "๐Ÿ”‚"], + [":waxing_crescent_moon:", "๐ŸŒ’"], + [":mountain_railway:", "๐Ÿšž"], + [":clock930:", "๐Ÿ•ค"], + [":put_litter_in_its_place:", "๐Ÿšฎ"], + [":arrows_counterclockwise:", "๐Ÿ”„"], + [":clock130:", "๐Ÿ•œ"], + [":goat:", "๐Ÿ"], + [":pig2:", "๐Ÿ–"], + [":innocent:", "๐Ÿ˜‡"], + [":no_bicycles:", "๐Ÿšณ"], + [":light_rail:", "๐Ÿšˆ"], + [":whale2:", "๐Ÿ‹"], + [":train2:", "๐Ÿš†"], + [":earth_africa:", "๐ŸŒ"], + [":shower:", "๐Ÿšฟ"], + [":waning_gibbous_moon:", "๐ŸŒ–"], + [":steam_locomotive:", "๐Ÿš‚"], + [":cat2:", "๐Ÿˆ"], + [":tractor:", "๐Ÿšœ"], + [":thought_balloon:", "๐Ÿ’ญ"], + [":two_women_holding_hands:", "๐Ÿ‘ญ"], + [":full_moon_with_face:", "๐ŸŒ"], + [":mouse2:", "๐Ÿ"], + [":clock430:", "๐Ÿ•Ÿ"], + [":worried:", "๐Ÿ˜Ÿ"], + [":rat:", "๐Ÿ€"], + [":ram:", "๐Ÿ"], + [":dog2:", "๐Ÿ•"], + [":kissing:", "๐Ÿ˜—"], + [":helicopter:", "๐Ÿš"], + [":clock1130:", "๐Ÿ•ฆ"], + [":no_mobile_phones:", "๐Ÿ“ต"], + [":european_post_office:", "๐Ÿค"], + [":ox:", "๐Ÿ‚"], + [":mountain_cableway:", "๐Ÿš "], + [":sleeping:", "๐Ÿ˜ด"], + [":cow2:", "๐Ÿ„"], + [":minibus:", "๐Ÿš"], + [":clock730:", "๐Ÿ•ข"], + [":aerial_tramway:", "๐Ÿšก"], + [":speaker:", "๐Ÿ”ˆ"], + [":no_bell:", "๐Ÿ”•"], + [":mailbox_with_mail:", "๐Ÿ“ฌ"], + [":no_pedestrians:", "๐Ÿšท"], + [":microscope:", "๐Ÿ”ฌ"], + [":bathtub:", "๐Ÿ›"], + [":suspension_railway:", "๐ŸšŸ"], + [":crocodile:", "๐ŸŠ"], + [":mountain_bicyclist:", "๐Ÿšต"], + [":waning_crescent_moon:", "๐ŸŒ˜"], + [":monorail:", "๐Ÿš"], + [":children_crossing:", "๐Ÿšธ"], + [":clock230:", "๐Ÿ•"], + [":busts_in_silhouette:", "๐Ÿ‘ฅ"], + [":mailbox_with_no_mail:", "๐Ÿ“ญ"], + [":leopard:", "๐Ÿ†"], + [":deciduous_tree:", "๐ŸŒณ"], + [":oncoming_taxi:", "๐Ÿš–"], + [":lemon:", "๐Ÿ‹"], + [":mute:", "๐Ÿ”‡"], + [":baggage_claim:", "๐Ÿ›„"], + [":twisted_rightwards_arrows:", "๐Ÿ”€"], + [":sun_with_face:", "๐ŸŒž"], + [":trolleybus:", "๐ŸšŽ"], + [":evergreen_tree:", "๐ŸŒฒ"], + [":passport_control:", "๐Ÿ›‚"], + [":new_moon_with_face:", "๐ŸŒš"], + [":potable_water:", "๐Ÿšฐ"], + [":high_brightness:", "๐Ÿ”†"], + [":low_brightness:", "๐Ÿ”…"], + [":clock530:", "๐Ÿ• "], + [":hushed:", "๐Ÿ˜ฏ"], + [":grimacing:", "๐Ÿ˜ฌ"], + [":water_buffalo:", "๐Ÿƒ"], + [":neutral_face:", "๐Ÿ˜"], + [":clock1230:", "๐Ÿ•ง"], + [":P", "๐Ÿ˜›" ], + [":)", "๐Ÿ™‚" ], + [":D", "๐Ÿ˜ƒ" ], + [":o", "๐Ÿ˜ฎ" ], + [":O", "๐Ÿ˜ฎ" ], + [":(", "โ˜น๏ธ" ], + [":|", "๐Ÿ˜" ], +]; + +// =========================================================================== + +// =========================================================================== + function makeLargeNumberReadable(num) { return new Number(num).toLocaleString("en-US"); } @@ -1459,4 +2416,275 @@ function getConsoleClient() { } } +// =========================================================================== + +function getServerColours() { + return serverColours; +} + +// =========================================================================== + +function getColourByType(typeName) { + return getServerColours().byType[typeName]; +} + +// =========================================================================== + +function getColourByName(colourName) { + return getServerColours().byName[colourName]; +} + +// =========================================================================== + +function getHexColourByName(colourName) { + //let rgbaColour = getServerColours().byName[colourName]; + //let rgbaArray = rgbaArrayFromToColour(rgbaColour); + //return rgbToHex(rgbaArray[0], rgbaArray[1], rgbaArray[2]); + + return `#${getServerColours().hex.byName[colourName]}`; +} + +// =========================================================================== + +function getHexColourByType(colourName) { + //let rgbaColour = getServerColours().byType[colourName]; + //let rgbaArray = rgbaArrayFromToColour(rgbaColour); + //return rgbToHex(rgbaArray[0], rgbaArray[1], rgbaArray[2]); + + return `#${getServerColours().hex.byType[colourName]}`; +} + +// =========================================================================== + +function getPlayerColour(client) { + if(getPlayerData(client) != false) { + if(!isPlayerLoggedIn(client)) { + return getColourByName("darkGrey"); + } else { + if(isPlayerWorking(client)) { + return getJobData(getJobIndexFromDatabaseId(getPlayerCurrentSubAccount(client).job)).colour; + } + } + } + + return getColourByName("civilianWhite"); +} + +// =========================================================================== + +/** + * Gets the red/green colour depending on bool (red = false, green = true) for inline use in chatbox messages + * + * @param {Boolean} boolValue The boolean value + * @return {String} Red or green inline HEX colour string + * + */ +function getBoolRedGreenInlineColour(boolValue) { + return (!boolValue) ? "{softRed}" : "{softGreen}"; +} + +// =========================================================================== + +/** + * Gets an array of RGB colour values from a HEX colour string + * + * @param {String} hexColour Hex colour string + * @return {Array} 3-slot array where each slot is an RGB colour value + * + */ +function hexToRgb(h) { + return [ + '0x'+h[1]+h[2]|0, + '0x'+h[3]+h[4]|0, + '0x'+h[5]+h[6]|0 + ]; +} + +// =========================================================================== + +/** + * Gets a HEX colour string from RGB values, without brackets (example: #FFFFFF) + * + * @param {Number} red Red RGB value + * @param {Number} green Green RGB value + * @param {Number} blue Blue RGB value + * @return {String} HEX colour string + * + */ +function rgbToHex(r, g, b) { + return "#"+((1<<24)+(r<<16)+(g<<8)+ b).toString(16).slice(1); +} + +// =========================================================================== + +/** + * Gets the current colour for a player (affected by job and status) + * + * @param {Client} client Player client + * @return {Number} Colour integer + * + */ +function getClientChatColour(client) { + let tempJob = getPlayerCurrentSubAccount(client).job; + if(tempJob != -1) { + if(getPlayerData(client).isWorking) { + return getJobData(tempJob).jobColour; + } + } + return getColourByName("white"); +} + +// =========================================================================== + +/** + * Gets a toColour-created colour integer with random RGB values (alpha is always 255) + * + * @return {Number} Colour integer + * + */ +function getRandomRGB() { + return toColour.apply(null, [ + getRandom(0, 255), + getRandom(0, 255), + getRandom(0, 255), + 255 + ]); +} + +// =========================================================================== + +/** + * Gets a hex formatting colour by name for use inline in chatbox messages (example: [#FFFFFF]). + * + * @param {String} colourName - Colour name + * @return {String} HEX-formatted colour string with brackets + * + */ +function getInlineChatColourByName(colourName) { + return `{${colourName}}`; +} + +// =========================================================================== + +/** + * Gets a hex formatting colour by type for use inline in chatbox messages (example: [#FFFFFF]). + * + * @param {String} colourName - Colour type + * @return {String} HEX-formatted colour string with brackets + * + */ +function getInlineChatColourByType(colourName) { + return `{${colourName}}`; +} + +// =========================================================================== + +/** + * Gets an array of RGBA colour values from a toColour integer. + * + * @param {Number} colour - Colour integer created by toColour + * @return {Array} 4-slot array where each slot is an RGBA colour value + * + */ +function rgbaArrayFromToColour(colour) { + //return [ + // (colour >> 24) & 0xFF, // red + // (colour >> 16) & 0xFF, + // (colour >> 8) & 0xFF, + // colour & 0xFF // alpha + //]; + return [ + (colour >> 16) & 0xFF, // red + (colour >> 8) & 0xFF, + colour & 0xFF, + (colour >> 24) & 0xFF// alpha + ]; +} + +// =========================================================================== + +function hexFromToColour(colour) { + let rgba = rgbaArrayFromToColour(colour); + return rgbToHex(rgba[0], rgba[1], rgba[2]); +} + +// =========================================================================== + +function replaceColoursInMessage(messageText) { + if(messageText == null) { + return ""; + } + + let tempFind = `{RESETCOLOUR}`; + let tempRegex = new RegExp(tempFind, 'g'); + messageText = messageText.replace(tempRegex, "[/#]"); + + tempFind = `{ALTCOLOUR}`; + tempRegex = new RegExp(tempFind, 'g'); + messageText = messageText.replace(tempRegex, "[#C8C8C8]"); + + tempFind = `{MAINCOLOUR}`; + tempRegex = new RegExp(tempFind, 'g'); + messageText = messageText.replace(tempRegex, "[#FFFFFF]"); + + for(let i in getServerColours().hex.byName) { + let find = `{${i}}`; + let re = new RegExp(find, 'g'); + messageText = messageText.replace(re, `[#${getServerColours().hex.byName[i]}]`); + } + + for(let i in getServerColours().hex.byType) { + let find = `{${i}}`; + let re = new RegExp(find, 'g'); + messageText = messageText.replace(re, `[#${getServerColours().hex.byType[i]}]`); + } + + return messageText; +} + +// =========================================================================== + +function removeColoursInMessage(messageText) { + if(messageText == null) { + return ""; + } + + let tempFind = `{RESETCOLOUR}`; + let tempRegex = new RegExp(tempFind, 'g'); + messageText = messageText.replace(tempRegex, ""); + + tempFind = `{ALTCOLOUR}`; + tempRegex = new RegExp(tempFind, 'g'); + messageText = messageText.replace(tempRegex, ""); + + tempFind = `{MAINCOLOUR}`; + tempRegex = new RegExp(tempFind, 'g'); + messageText = messageText.replace(tempRegex, ""); + + for(let i in getServerColours().hex.byName) { + let find = `{${i}}`; + let re = new RegExp(find, 'g'); + messageText = messageText.replace(re, ""); + } + + for(let i in getServerColours().hex.byType) { + let find = `{${i}}`; + let re = new RegExp(find, 'g'); + messageText = messageText.replace(re, ""); + } + + return messageText; +} + +// =========================================================================== + +function replaceEmojiInString(messageString) { + for(let i in emojiReplaceString) { + while(messageString.indexOf(emojiReplaceString[i][0]) != -1) { + messageString = messageString.replace(emojiReplaceString[i][0], emojiReplaceString[i][1]); + } + } + return messageString; +} + // =========================================================================== \ No newline at end of file