diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 38abe4b5fd0..12c30989923 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -79,7 +79,7 @@ var/global/admin_ooc_colour = "#b82e00" else display_name = holder.fakekey - to_chat(C, "OOC: [display_name]: [msg]") + to_chat(C, "OOC: [display_name]: [msg]") /proc/toggle_ooc() config.ooc_allowed = ( !config.ooc_allowed ) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 63241ce43c5..4309bb28719 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -149,8 +149,11 @@ adminhelp(reply) //sender has left, adminhelp instead return + // for emoji, we have to define a specific span for jquery to look for + msg = "[msg]" + recieve_message = "[type] from-[recieve_pm_type][key_name(src, C, C.holder ? 1 : 0, type)]: [msg]" - to_chat(C, recieve_message) + to_chat(C, recieve_message) //we also have to pass the allowEmoji flag to_chat(src, "[send_pm_type][type] to-[key_name(C, src, holder ? 1 : 0, type)]: [msg]") /*if(holder && !C.holder) diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index c5c0e8e93d2..c7204d36577 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -367,3 +367,6 @@ h1.alert, h2.alert {color: #000000;} /* HELPER CLASSES */ .text-normal {font-weight: normal; font-style: normal;} .hidden {display: none; visibility: hidden;} + +/* EMOJI STUFF */ +.emoji {max-height: 16px; max-width: 16px} \ No newline at end of file diff --git a/goon/browserassets/html/browserOutput.html b/goon/browserassets/html/browserOutput.html index feaa5f0ecda..ea9c7528015 100644 --- a/goon/browserassets/html/browserOutput.html +++ b/goon/browserassets/html/browserOutput.html @@ -16,6 +16,8 @@ + + diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js index 2abf26079d8..d2ff2b0dcba 100644 --- a/goon/browserassets/js/browserOutput.js +++ b/goon/browserassets/js/browserOutput.js @@ -62,7 +62,10 @@ var opts = { 'clientData': [], // List of macros in the 'hotkeymode' macro set. - 'macros': {} + 'macros': {}, + + // Emoji toggle + 'enableEmoji': true }; function outerHTML(el) { @@ -97,6 +100,32 @@ function linkify(text) { }); } +function emojiparse(el) { + + if (!UNICODE_9_EMOJI || !twemoji) { //something didn't load right, probably IE8 + return; + } + + var $el = $(el); + + var $emojiZone = $el.find(".emoji_enabled"); + + if ($emojiZone.length) { + $emojiZone.each(function () { + var html = $(this).html(); + html = html.replace(/\:(.*?)\:/g, function (match, p1, offset, s) { + var unicode_entity = UNICODE_9_EMOJI[p1]; + if (unicode_entity) { + return unicode_entity; + } + return match; + }); + html = $.parseHTML(twemoji.parse(html, {size: "svg", ext: ".svg"})); + $(this).html(html); + }); + } +} + // Colorizes the highlight spans function setHighlightColor(match) { match.style.background = opts.highlightColor @@ -127,6 +156,12 @@ function output(message, flag) { if (flag !== 'internal') opts.lastPang = Date.now(); + // Basically we url_encode twice server side so we can manually read the encoded version and actually do UTF-8. + // The replace for + is because FOR SOME REASON, BYOND replaces spaces with a + instead of %20, and a plus with %2b. + // Marvelous. + message = message.replace(/\+/g, "%20"); + message = decoder(message); + //The behemoth of filter-code (for Admin message filters) //Note: This is proooobably hella inefficient var filteredOut = false; @@ -215,7 +250,7 @@ function output(message, flag) { message = linkify(message); } - opts.messageCount++; + opts.messageCount++; //Actually append the message var entry = document.createElement('div'); @@ -227,6 +262,13 @@ function output(message, flag) { } entry.innerHTML = message; + + // emoji! + if (opts.enableEmoji) { + emojiparse(entry); + } + + $messages[0].appendChild(entry); //Actually do the snap @@ -240,6 +282,11 @@ function output(message, flag) { } } +function internalOutput(message, flag) +{ + output(escaper(message), flag); +} + //Runs a route within byond, client or server side. Consider this "ehjax" for byond. function runByond(uri) { window.location = uri; @@ -339,7 +386,7 @@ function ehjaxCallback(data) { $('#pingDot').css('color', '#'+hex); } else if (data == 'roundrestart') { opts.restarting = true; - output('
The connection has been closed because the server is restarting. Please wait while you automatically reconnect.
', 'internal'); + internalOutput('
The connection has been closed because the server is restarting. Please wait while you automatically reconnect.
', 'internal'); } else if (data == 'stopaudio') { $('.dectalk').remove(); } else { @@ -374,9 +421,9 @@ function ehjaxCallback(data) { changeMode(data.modeChange); } else if (data.firebug) { if (data.trigger) { - output('Loading firebug console, triggered by '+data.trigger+'...', 'internal'); + internalOutput('Loading firebug console, triggered by '+data.trigger+'...', 'internal'); } else { - output('Loading firebug console...', 'internal'); + internalOutput('Loading firebug console...', 'internal'); } var firebugEl = document.createElement('script'); firebugEl.src = 'https://getfirebug.com/firebug-lite-debug.js'; @@ -387,7 +434,7 @@ function ehjaxCallback(data) { message = ' '+ 'You hear a strange robotic voice...' + message; } - output(message, 'preventLink'); + internalOutput(message, 'preventLink'); } } } @@ -451,7 +498,7 @@ $(function() { if (!opts.noResponse) { //Only actually append a message if the previous ping didn't also fail (to prevent spam) opts.noResponse = true; opts.noResponseCount++; - output('
You are either AFK, experiencing lag or the connection has closed.
', 'internal'); + internalOutput('
You are either AFK, experiencing lag or the connection has closed.
', 'internal'); } } else if (opts.noResponse) { //Previous ping attempt failed ohno $('.connectionClosed[data-count="'+opts.noResponseCount+'"]:not(.restored)').addClass('restored').text('Your connection has been restored (probably)!'); @@ -490,18 +537,18 @@ $(function() { if (savedConfig.sfontSize) { $messages.css('font-size', savedConfig.sfontSize); - output('Loaded font size setting of: '+savedConfig.sfontSize+'', 'internal'); + internalOutput('Loaded font size setting of: '+savedConfig.sfontSize+'', 'internal'); } if (savedConfig.sfontType) { $messages.css('font-family', savedConfig.sfontType); - output('Loaded font type setting of: '+savedConfig.sfontType+'', 'internal'); + internalOutput('Loaded font type setting of: '+savedConfig.sfontType+'', 'internal'); } if (savedConfig.spingDisabled) { if (savedConfig.spingDisabled == 'true') { opts.pingDisabled = true; $('#ping').hide(); } - output('Loaded ping display of: '+(opts.pingDisabled ? 'hidden' : 'visible')+'', 'internal'); + internalOutput('Loaded ping display of: '+(opts.pingDisabled ? 'hidden' : 'visible')+'', 'internal'); } if (savedConfig.shighlightTerms) { var savedTerms = $.parseJSON(savedConfig.shighlightTerms); @@ -513,13 +560,13 @@ $(function() { } if (actualTerms) { actualTerms = actualTerms.substring(0, actualTerms.length - 2); - output('Loaded highlight strings of: ' + actualTerms+'', 'internal'); + internalOutput('Loaded highlight strings of: ' + actualTerms+'', 'internal'); opts.highlightTerms = savedTerms; } } if (savedConfig.shighlightColor) { opts.highlightColor = savedConfig.shighlightColor; - output('Loaded highlight color of: '+savedConfig.shighlightColor+'', 'internal'); + internalOutput('Loaded highlight color of: '+savedConfig.shighlightColor+'', 'internal'); } (function() { @@ -606,14 +653,14 @@ $(function() { } e.preventDefault() - + var k = e.which; var command; // Command to execute through winset. // Hardcoded because else there would be no feedback message. if (k == 113) { // F2 runByond('byond://winset?screenshot=auto'); - output('Screenshot taken', 'internal'); + internalOutput('Screenshot taken', 'internal'); } var c = ""; @@ -747,7 +794,7 @@ $(function() { fontSize = fontSize - 1 + 'px'; $messages.css({'font-size': fontSize}); setCookie('fontsize', fontSize, 365); - output('Font size set to '+fontSize+'', 'internal'); + internalOutput('Font size set to '+fontSize+'', 'internal'); }); $('#increaseFont').click(function(e) { @@ -755,7 +802,7 @@ $(function() { fontSize = fontSize + 1 + 'px'; $messages.css({'font-size': fontSize}); setCookie('fontsize', fontSize, 365); - output('Font size set to '+fontSize+'', 'internal'); + internalOutput('Font size set to '+fontSize+'', 'internal'); }); $('#chooseFont').click(function(e) { @@ -821,7 +868,7 @@ $(function() { $('#highlightTerm').click(function(e) { if(!($().mark)) { - output('Highlighting is disabled. You are probably using Internet Explorer 8 and need to update.', 'internal'); + internalOutput('Highlighting is disabled. You are probably using Internet Explorer 8 and need to update.', 'internal'); return; } if ($('.popup .highlightTerm').is(':visible')) {return;} diff --git a/goon/browserassets/json/unicode_9_annotations.json b/goon/browserassets/json/unicode_9_annotations.json new file mode 100644 index 00000000000..fb39b0a4c69 --- /dev/null +++ b/goon/browserassets/json/unicode_9_annotations.json @@ -0,0 +1,1189 @@ +var UNICODE_9_EMOJI = { + "female_sign": "โ™€", + "male_sign": "โ™‚", + "medical_symbol": "โš•", + "man_dancing": "๐Ÿ•บ", + "black_heart": "๐Ÿ–ค", + "call_me_hand": "๐Ÿค™", + "raised_back_of_hand": "๐Ÿคš", + "left-facing_fist": "๐Ÿค›", + "right-facing_fist": "๐Ÿคœ", + "handshake": "๐Ÿค", + "crossed_fingers": "๐Ÿคž", + "cowboy_hat_face": "๐Ÿค ", + "clown_face": "๐Ÿคก", + "nauseated_face": "๐Ÿคข", + "rolling_on_the_floor_laughing": "๐Ÿคฃ", + "drooling_face": "๐Ÿคค", + "lying_face": "๐Ÿคฅ", + "person_facepalming": "๐Ÿคฆ", + "woman_facepalming": "๐Ÿคฆโ€โ™€", + "man_facepalming": "๐Ÿคฆโ€โ™‚", + "sneezing_face": "๐Ÿคง", + "pregnant_woman": "๐Ÿคฐ", + "selfie": "๐Ÿคณ", + "prince": "๐Ÿคด", + "man_in_tuxedo": "๐Ÿคต", + "mrs_claus": "๐Ÿคถ", + "person_shrugging": "๐Ÿคท", + "woman_shrugging": "๐Ÿคทโ€โ™€", + "man_shrugging": "๐Ÿคทโ€โ™‚", + "person_cartwheeling": "๐Ÿคธ", + "woman_cartwheeling": "๐Ÿคธโ€โ™€", + "man_cartwheeling": "๐Ÿคธโ€โ™‚", + "person_juggling": "๐Ÿคน", + "woman_juggling": "๐Ÿคนโ€โ™€", + "man_juggling": "๐Ÿคนโ€โ™‚", + "person_fencing": "๐Ÿคบ", + "people_wrestling": "๐Ÿคผ", + "women_wrestling": "๐Ÿคผโ€โ™€", + "men_wrestling": "๐Ÿคผโ€โ™‚", + "person_playing_water_polo": "๐Ÿคฝ", + "woman_playing_water_polo": "๐Ÿคฝโ€โ™€", + "man_playing_water_polo": "๐Ÿคฝโ€โ™‚", + "person_playing_handball": "๐Ÿคพ", + "woman_playing_handball": "๐Ÿคพโ€โ™€", + "man_playing_handball": "๐Ÿคพโ€โ™‚", + "wilted_flower": "๐Ÿฅ€", + "drum": "๐Ÿฅ", + "clinking_glasses": "๐Ÿฅ‚", + "tumbler_glass": "๐Ÿฅƒ", + "spoon": "๐Ÿฅ„", + "goal_net": "๐Ÿฅ…", + "1st_place_medal": "๐Ÿฅ‡", + "2nd_place_medal": "๐Ÿฅˆ", + "3rd_place_medal": "๐Ÿฅ‰", + "boxing_glove": "๐ŸฅŠ", + "martial_arts_uniform": "๐Ÿฅ‹", + "croissant": "๐Ÿฅ", + "avocado": "๐Ÿฅ‘", + "cucumber": "๐Ÿฅ’", + "bacon": "๐Ÿฅ“", + "potato": "๐Ÿฅ”", + "carrot": "๐Ÿฅ•", + "baguette_bread": "๐Ÿฅ–", + "green_salad": "๐Ÿฅ—", + "shallow_pan_of_food": "๐Ÿฅ˜", + "stuffed_flatbread": "๐Ÿฅ™", + "egg": "๐Ÿฅš", + "glass_of_milk": "๐Ÿฅ›", + "peanuts": "๐Ÿฅœ", + "kiwi_fruit": "๐Ÿฅ", + "pancakes": "๐Ÿฅž", + "eagle": "๐Ÿฆ…", + "duck": "๐Ÿฆ†", + "bat": "๐Ÿฆ‡", + "shark": "๐Ÿฆˆ", + "owl": "๐Ÿฆ‰", + "fox_face": "๐ŸฆŠ", + "butterfly": "๐Ÿฆ‹", + "deer": "๐ŸฆŒ", + "gorilla": "๐Ÿฆ", + "lizard": "๐ŸฆŽ", + "rhinoceros": "๐Ÿฆ", + "shrimp": "๐Ÿฆ", + "squid": "๐Ÿฆ‘", + "grinning_face": "๐Ÿ˜€", + "grinning_face_with_smiling_eyes": "๐Ÿ˜", + "face_with_tears_of_joy": "๐Ÿ˜‚", + "smiling_face_with_open_mouth": "๐Ÿ˜ƒ", + "smiling_face_with_open_mouth_&_smiling_eyes": "๐Ÿ˜„", + "smiling_face_with_open_mouth_&_cold_sweat": "๐Ÿ˜…", + "smiling_face_with_open_mouth_&_closed_eyes": "๐Ÿ˜†", + "winking_face": "๐Ÿ˜‰", + "smiling_face_with_smiling_eyes": "๐Ÿ˜Š", + "face_savouring_delicious_food": "๐Ÿ˜‹", + "smiling_face_with_sunglasses": "๐Ÿ˜Ž", + "smiling_face_with_heart-eyes": "๐Ÿ˜", + "face_blowing_a_kiss": "๐Ÿ˜˜", + "kissing_face": "๐Ÿ˜—", + "kissing_face_with_smiling_eyes": "๐Ÿ˜™", + "kissing_face_with_closed_eyes": "๐Ÿ˜š", + "smiling_face": "โ˜บ", + "slightly_smiling_face": "๐Ÿ™‚", + "hugging_face": "๐Ÿค—", + "smiling_face_with_halo": "๐Ÿ˜‡", + "thinking_face": "๐Ÿค”", + "neutral_face": "๐Ÿ˜", + "expressionless_face": "๐Ÿ˜‘", + "face_without_mouth": "๐Ÿ˜ถ", + "face_with_rolling_eyes": "๐Ÿ™„", + "smirking_face": "๐Ÿ˜", + "persevering_face": "๐Ÿ˜ฃ", + "disappointed_but_relieved_face": "๐Ÿ˜ฅ", + "face_with_open_mouth": "๐Ÿ˜ฎ", + "zipper-mouth_face": "๐Ÿค", + "hushed_face": "๐Ÿ˜ฏ", + "sleepy_face": "๐Ÿ˜ช", + "tired_face": "๐Ÿ˜ซ", + "sleeping_face": "๐Ÿ˜ด", + "relieved_face": "๐Ÿ˜Œ", + "nerd_face": "๐Ÿค“", + "face_with_stuck-out_tongue": "๐Ÿ˜›", + "face_with_stuck-out_tongue_&_winking_eye": "๐Ÿ˜œ", + "face_with_stuck-out_tongue_&_closed_eyes": "๐Ÿ˜", + "frowning_face": "โ˜น", + "slightly_frowning_face": "๐Ÿ™", + "unamused_face": "๐Ÿ˜’", + "face_with_cold_sweat": "๐Ÿ˜“", + "pensive_face": "๐Ÿ˜”", + "confused_face": "๐Ÿ˜•", + "confounded_face": "๐Ÿ˜–", + "upside-down_face": "๐Ÿ™ƒ", + "face_with_medical_mask": "๐Ÿ˜ท", + "face_with_thermometer": "๐Ÿค’", + "face_with_head-bandage": "๐Ÿค•", + "money-mouth_face": "๐Ÿค‘", + "astonished_face": "๐Ÿ˜ฒ", + "disappointed_face": "๐Ÿ˜ž", + "worried_face": "๐Ÿ˜Ÿ", + "face_with_steam_from_nose": "๐Ÿ˜ค", + "crying_face": "๐Ÿ˜ข", + "loudly_crying_face": "๐Ÿ˜ญ", + "frowning_face_with_open_mouth": "๐Ÿ˜ฆ", + "anguished_face": "๐Ÿ˜ง", + "fearful_face": "๐Ÿ˜จ", + "weary_face": "๐Ÿ˜ฉ", + "grimacing_face": "๐Ÿ˜ฌ", + "face_with_open_mouth_&_cold_sweat": "๐Ÿ˜ฐ", + "face_screaming_in_fear": "๐Ÿ˜ฑ", + "flushed_face": "๐Ÿ˜ณ", + "dizzy_face": "๐Ÿ˜ต", + "pouting_face": "๐Ÿ˜ก", + "angry_face": "๐Ÿ˜ ", + "smiling_face_with_horns": "๐Ÿ˜ˆ", + "angry_face_with_horns": "๐Ÿ‘ฟ", + "ogre": "๐Ÿ‘น", + "goblin": "๐Ÿ‘บ", + "skull": "๐Ÿ’€", + "skull_and_crossbones": "โ˜ ", + "ghost": "๐Ÿ‘ป", + "alien": "๐Ÿ‘ฝ", + "alien_monster": "๐Ÿ‘พ", + "robot_face": "๐Ÿค–", + "pile_of_poo": "๐Ÿ’ฉ", + "smiling_cat_face_with_open_mouth": "๐Ÿ˜บ", + "grinning_cat_face_with_smiling_eyes": "๐Ÿ˜ธ", + "cat_face_with_tears_of_joy": "๐Ÿ˜น", + "smiling_cat_face_with_heart-eyes": "๐Ÿ˜ป", + "cat_face_with_wry_smile": "๐Ÿ˜ผ", + "kissing_cat_face_with_closed_eyes": "๐Ÿ˜ฝ", + "weary_cat_face": "๐Ÿ™€", + "crying_cat_face": "๐Ÿ˜ฟ", + "pouting_cat_face": "๐Ÿ˜พ", + "see-no-evil_monkey": "๐Ÿ™ˆ", + "hear-no-evil_monkey": "๐Ÿ™‰", + "speak-no-evil_monkey": "๐Ÿ™Š", + "boy": "๐Ÿ‘ฆ", + "girl": "๐Ÿ‘ง", + "man": "๐Ÿ‘จ", + "man_health_worker": "๐Ÿ‘จโ€โš•", + "man_student": "๐Ÿ‘จโ€๐ŸŽ“", + "man_farmer": "๐Ÿ‘จโ€๐ŸŒพ", + "man_cook": "๐Ÿ‘จโ€๐Ÿณ", + "man_teacher": "๐Ÿ‘จโ€๐Ÿซ", + "man_factory_worker": "๐Ÿ‘จโ€๐Ÿญ", + "man_artist": "๐Ÿ‘จโ€๐ŸŽจ", + "man_firefighter": "๐Ÿ‘จโ€๐Ÿš’", + "man_pilot": "๐Ÿ‘จโ€โœˆ", + "man_astronaut": "๐Ÿ‘จโ€๐Ÿš€", + "man_singer": "๐Ÿ‘จโ€๐ŸŽค", + "man_technologist": "๐Ÿ‘จโ€๐Ÿ’ป", + "man_scientist": "๐Ÿ‘จโ€๐Ÿ”ฌ", + "man_office_worker": "๐Ÿ‘จโ€๐Ÿ’ผ", + "man_mechanic": "๐Ÿ‘จโ€๐Ÿ”ง", + "man_judge": "๐Ÿ‘จโ€โš–", + "woman": "๐Ÿ‘ฉ", + "woman_health_worker": "๐Ÿ‘ฉโ€โš•", + "woman_student": "๐Ÿ‘ฉโ€๐ŸŽ“", + "woman_farmer": "๐Ÿ‘ฉโ€๐ŸŒพ", + "woman_cook": "๐Ÿ‘ฉโ€๐Ÿณ", + "woman_teacher": "๐Ÿ‘ฉโ€๐Ÿซ", + "woman_factory_worker": "๐Ÿ‘ฉโ€๐Ÿญ", + "woman_artist": "๐Ÿ‘ฉโ€๐ŸŽจ", + "woman_firefighter": "๐Ÿ‘ฉโ€๐Ÿš’", + "woman_pilot": "๐Ÿ‘ฉโ€โœˆ", + "woman_astronaut": "๐Ÿ‘ฉโ€๐Ÿš€", + "woman_singer": "๐Ÿ‘ฉโ€๐ŸŽค", + "woman_technologist": "๐Ÿ‘ฉโ€๐Ÿ’ป", + "woman_scientist": "๐Ÿ‘ฉโ€๐Ÿ”ฌ", + "woman_office_worker": "๐Ÿ‘ฉโ€๐Ÿ’ผ", + "woman_mechanic": "๐Ÿ‘ฉโ€๐Ÿ”ง", + "woman_judge": "๐Ÿ‘ฉโ€โš–", + "old_man": "๐Ÿ‘ด", + "old_woman": "๐Ÿ‘ต", + "baby": "๐Ÿ‘ถ", + "blond-haired_person": "๐Ÿ‘ฑ", + "blond-haired_woman": "๐Ÿ‘ฑโ€โ™€", + "blond-haired_man": "๐Ÿ‘ฑโ€โ™‚", + "police_officer": "๐Ÿ‘ฎ", + "woman_police_officer": "๐Ÿ‘ฎโ€โ™€", + "man_police_officer": "๐Ÿ‘ฎโ€โ™‚", + "man_with_chinese_cap": "๐Ÿ‘ฒ", + "person_wearing_turban": "๐Ÿ‘ณ", + "woman_wearing_turban": "๐Ÿ‘ณโ€โ™€", + "man_wearing_turban": "๐Ÿ‘ณโ€โ™‚", + "construction_worker": "๐Ÿ‘ท", + "woman_construction_worker": "๐Ÿ‘ทโ€โ™€", + "man_construction_worker": "๐Ÿ‘ทโ€โ™‚", + "rescue_workers_helmet": "โ›‘", + "princess": "๐Ÿ‘ธ", + "guard": "๐Ÿ’‚", + "woman_guard": "๐Ÿ’‚โ€โ™€", + "man_guard": "๐Ÿ’‚โ€โ™‚", + "detective": "๐Ÿ•ต", + "woman_detective": "๐Ÿ•ตโ€โ™€", + "man_detective": "๐Ÿ•ตโ€โ™‚", + "santa_claus": "๐ŸŽ…", + "baby_angel": "๐Ÿ‘ผ", + "people_with_bunny_ears_partying": "๐Ÿ‘ฏ", + "women_with_bunny_ears_partying": "๐Ÿ‘ฏโ€โ™€", + "men_with_bunny_ears_partying": "๐Ÿ‘ฏโ€โ™‚", + "person_getting_massage": "๐Ÿ’†", + "woman_getting_massage": "๐Ÿ’†โ€โ™€", + "man_getting_massage": "๐Ÿ’†โ€โ™‚", + "person_getting_haircut": "๐Ÿ’‡", + "woman_getting_haircut": "๐Ÿ’‡โ€โ™€", + "man_getting_haircut": "๐Ÿ’‡โ€โ™‚", + "bride_with_veil": "๐Ÿ‘ฐ", + "person_frowning": "๐Ÿ™", + "woman_frowning": "๐Ÿ™โ€โ™€", + "man_frowning": "๐Ÿ™โ€โ™‚", + "person_pouting": "๐Ÿ™Ž", + "woman_pouting": "๐Ÿ™Žโ€โ™€", + "man_pouting": "๐Ÿ™Žโ€โ™‚", + "person_gesturing_no": "๐Ÿ™…", + "woman_gesturing_no": "๐Ÿ™…โ€โ™€", + "man_gesturing_no": "๐Ÿ™…โ€โ™‚", + "person_gesturing_ok": "๐Ÿ™†", + "woman_gesturing_ok": "๐Ÿ™†โ€โ™€", + "man_gesturing_ok": "๐Ÿ™†โ€โ™‚", + "person_tipping_hand": "๐Ÿ’", + "woman_tipping_hand": "๐Ÿ’โ€โ™€", + "man_tipping_hand": "๐Ÿ’โ€โ™‚", + "person_raising_hand": "๐Ÿ™‹", + "woman_raising_hand": "๐Ÿ™‹โ€โ™€", + "man_raising_hand": "๐Ÿ™‹โ€โ™‚", + "person_bowing": "๐Ÿ™‡", + "woman_bowing": "๐Ÿ™‡โ€โ™€", + "man_bowing": "๐Ÿ™‡โ€โ™‚", + "raising_hands": "๐Ÿ™Œ", + "folded_hands": "๐Ÿ™", + "speaking_head": "๐Ÿ—ฃ", + "bust_in_silhouette": "๐Ÿ‘ค", + "busts_in_silhouette": "๐Ÿ‘ฅ", + "person_walking": "๐Ÿšถ", + "woman_walking": "๐Ÿšถโ€โ™€", + "man_walking": "๐Ÿšถโ€โ™‚", + "person_running": "๐Ÿƒ", + "woman_running": "๐Ÿƒโ€โ™€", + "man_running": "๐Ÿƒโ€โ™‚", + "woman_dancing": "๐Ÿ’ƒ", + "man_in_business_suit_levitating": "๐Ÿ•ด", + "kiss": "๐Ÿ’", + "couple_with_heart": "๐Ÿ’‘", + "family": "๐Ÿ‘ช", + "man_and_woman_holding_hands": "๐Ÿ‘ซ", + "two_men_holding_hands": "๐Ÿ‘ฌ", + "two_women_holding_hands": "๐Ÿ‘ญ", + "light_skin_tone": "๐Ÿป", + "medium-light_skin_tone": "๐Ÿผ", + "medium_skin_tone": "๐Ÿฝ", + "medium-dark_skin_tone": "๐Ÿพ", + "dark_skin_tone": "๐Ÿฟ", + "flexed_biceps": "๐Ÿ’ช", + "backhand_index_pointing_left": "๐Ÿ‘ˆ", + "backhand_index_pointing_right": "๐Ÿ‘‰", + "index_pointing_up": "โ˜", + "backhand_index_pointing_up": "๐Ÿ‘†", + "middle_finger": "๐Ÿ–•", + "backhand_index_pointing_down": "๐Ÿ‘‡", + "victory_hand": "โœŒ", + "vulcan_salute": "๐Ÿ––", + "sign_of_the_horns": "๐Ÿค˜", + "raised_hand_with_fingers_splayed": "๐Ÿ–", + "raised_fist": "โœŠ", + "raised_hand": "โœ‹", + "oncoming_fist": "๐Ÿ‘Š", + "ok_hand": "๐Ÿ‘Œ", + "thumbs_up": "๐Ÿ‘", + "thumbs_down": "๐Ÿ‘Ž", + "waving_hand": "๐Ÿ‘‹", + "clapping_hands": "๐Ÿ‘", + "open_hands": "๐Ÿ‘", + "writing_hand": "โœ", + "nail_polish": "๐Ÿ’…", + "ear": "๐Ÿ‘‚", + "nose": "๐Ÿ‘ƒ", + "footprints": "๐Ÿ‘ฃ", + "eyes": "๐Ÿ‘€", + "eye": "๐Ÿ‘", + "eye_in_speech_bubble": "๐Ÿ‘โ€๐Ÿ—จ", + "tongue": "๐Ÿ‘…", + "mouth": "๐Ÿ‘„", + "kiss_mark": "๐Ÿ’‹", + "heart_with_arrow": "๐Ÿ’˜", + "red_heart": "โค", + "beating_heart": "๐Ÿ’“", + "broken_heart": "๐Ÿ’”", + "two_hearts": "๐Ÿ’•", + "sparkling_heart": "๐Ÿ’–", + "growing_heart": "๐Ÿ’—", + "blue_heart": "๐Ÿ’™", + "green_heart": "๐Ÿ’š", + "yellow_heart": "๐Ÿ’›", + "purple_heart": "๐Ÿ’œ", + "heart_with_ribbon": "๐Ÿ’", + "revolving_hearts": "๐Ÿ’ž", + "heart_decoration": "๐Ÿ’Ÿ", + "heavy_heart_exclamation": "โฃ", + "love_letter": "๐Ÿ’Œ", + "zzz": "๐Ÿ’ค", + "anger_symbol": "๐Ÿ’ข", + "bomb": "๐Ÿ’ฃ", + "collision": "๐Ÿ’ฅ", + "sweat_droplets": "๐Ÿ’ฆ", + "dashing_away": "๐Ÿ’จ", + "dizzy": "๐Ÿ’ซ", + "speech_balloon": "๐Ÿ’ฌ", + "left_speech_bubble": "๐Ÿ—จ", + "right_anger_bubble": "๐Ÿ—ฏ", + "thought_balloon": "๐Ÿ’ญ", + "hole": "๐Ÿ•ณ", + "glasses": "๐Ÿ‘“", + "sunglasses": "๐Ÿ•ถ", + "necktie": "๐Ÿ‘”", + "t-shirt": "๐Ÿ‘•", + "jeans": "๐Ÿ‘–", + "dress": "๐Ÿ‘—", + "kimono": "๐Ÿ‘˜", + "bikini": "๐Ÿ‘™", + "womans_clothes": "๐Ÿ‘š", + "purse": "๐Ÿ‘›", + "handbag": "๐Ÿ‘œ", + "clutch_bag": "๐Ÿ‘", + "shopping_bags": "๐Ÿ›", + "school_backpack": "๐ŸŽ’", + "mans_shoe": "๐Ÿ‘ž", + "running_shoe": "๐Ÿ‘Ÿ", + "high-heeled_shoe": "๐Ÿ‘ ", + "womans_sandal": "๐Ÿ‘ก", + "womans_boot": "๐Ÿ‘ข", + "crown": "๐Ÿ‘‘", + "womans_hat": "๐Ÿ‘’", + "top_hat": "๐ŸŽฉ", + "graduation_cap": "๐ŸŽ“", + "prayer_beads": "๐Ÿ“ฟ", + "lipstick": "๐Ÿ’„", + "ring": "๐Ÿ’", + "gem_stone": "๐Ÿ’Ž", + "monkey_face": "๐Ÿต", + "monkey": "๐Ÿ’", + "dog_face": "๐Ÿถ", + "dog": "๐Ÿ•", + "poodle": "๐Ÿฉ", + "wolf_face": "๐Ÿบ", + "cat_face": "๐Ÿฑ", + "cat": "๐Ÿˆ", + "lion_face": "๐Ÿฆ", + "tiger_face": "๐Ÿฏ", + "tiger": "๐Ÿ…", + "leopard": "๐Ÿ†", + "horse_face": "๐Ÿด", + "horse": "๐ŸŽ", + "unicorn_face": "๐Ÿฆ„", + "cow_face": "๐Ÿฎ", + "ox": "๐Ÿ‚", + "water_buffalo": "๐Ÿƒ", + "cow": "๐Ÿ„", + "pig_face": "๐Ÿท", + "pig": "๐Ÿ–", + "boar": "๐Ÿ—", + "pig_nose": "๐Ÿฝ", + "ram": "๐Ÿ", + "sheep": "๐Ÿ‘", + "goat": "๐Ÿ", + "camel": "๐Ÿช", + "two-hump_camel": "๐Ÿซ", + "elephant": "๐Ÿ˜", + "mouse_face": "๐Ÿญ", + "mouse": "๐Ÿ", + "rat": "๐Ÿ€", + "hamster_face": "๐Ÿน", + "rabbit_face": "๐Ÿฐ", + "rabbit": "๐Ÿ‡", + "chipmunk": "๐Ÿฟ", + "bear_face": "๐Ÿป", + "koala": "๐Ÿจ", + "panda_face": "๐Ÿผ", + "paw_prints": "๐Ÿพ", + "turkey": "๐Ÿฆƒ", + "chicken": "๐Ÿ”", + "rooster": "๐Ÿ“", + "hatching_chick": "๐Ÿฃ", + "baby_chick": "๐Ÿค", + "front-facing_baby_chick": "๐Ÿฅ", + "bird": "๐Ÿฆ", + "penguin": "๐Ÿง", + "dove": "๐Ÿ•Š", + "frog_face": "๐Ÿธ", + "crocodile": "๐ŸŠ", + "turtle": "๐Ÿข", + "snake": "๐Ÿ", + "dragon_face": "๐Ÿฒ", + "dragon": "๐Ÿ‰", + "spouting_whale": "๐Ÿณ", + "whale": "๐Ÿ‹", + "dolphin": "๐Ÿฌ", + "fish": "๐ŸŸ", + "tropical_fish": "๐Ÿ ", + "blowfish": "๐Ÿก", + "octopus": "๐Ÿ™", + "spiral_shell": "๐Ÿš", + "crab": "๐Ÿฆ€", + "snail": "๐ŸŒ", + "bug": "๐Ÿ›", + "ant": "๐Ÿœ", + "honeybee": "๐Ÿ", + "lady_beetle": "๐Ÿž", + "spider": "๐Ÿ•ท", + "spider_web": "๐Ÿ•ธ", + "scorpion": "๐Ÿฆ‚", + "bouquet": "๐Ÿ’", + "cherry_blossom": "๐ŸŒธ", + "white_flower": "๐Ÿ’ฎ", + "rosette": "๐Ÿต", + "rose": "๐ŸŒน", + "hibiscus": "๐ŸŒบ", + "sunflower": "๐ŸŒป", + "blossom": "๐ŸŒผ", + "tulip": "๐ŸŒท", + "shamrock": "โ˜˜", + "seedling": "๐ŸŒฑ", + "evergreen_tree": "๐ŸŒฒ", + "deciduous_tree": "๐ŸŒณ", + "palm_tree": "๐ŸŒด", + "cactus": "๐ŸŒต", + "sheaf_of_rice": "๐ŸŒพ", + "herb": "๐ŸŒฟ", + "four_leaf_clover": "๐Ÿ€", + "maple_leaf": "๐Ÿ", + "fallen_leaf": "๐Ÿ‚", + "leaf_fluttering_in_wind": "๐Ÿƒ", + "grapes": "๐Ÿ‡", + "melon": "๐Ÿˆ", + "watermelon": "๐Ÿ‰", + "tangerine": "๐ŸŠ", + "lemon": "๐Ÿ‹", + "banana": "๐ŸŒ", + "pineapple": "๐Ÿ", + "red_apple": "๐ŸŽ", + "green_apple": "๐Ÿ", + "pear": "๐Ÿ", + "peach": "๐Ÿ‘", + "cherries": "๐Ÿ’", + "strawberry": "๐Ÿ“", + "tomato": "๐Ÿ…", + "eggplant": "๐Ÿ†", + "ear_of_corn": "๐ŸŒฝ", + "hot_pepper": "๐ŸŒถ", + "mushroom": "๐Ÿ„", + "chestnut": "๐ŸŒฐ", + "bread": "๐Ÿž", + "cheese_wedge": "๐Ÿง€", + "meat_on_bone": "๐Ÿ–", + "poultry_leg": "๐Ÿ—", + "hamburger": "๐Ÿ”", + "french_fries": "๐ŸŸ", + "pizza": "๐Ÿ•", + "hot_dog": "๐ŸŒญ", + "taco": "๐ŸŒฎ", + "burrito": "๐ŸŒฏ", + "popcorn": "๐Ÿฟ", + "pot_of_food": "๐Ÿฒ", + "bento_box": "๐Ÿฑ", + "rice_cracker": "๐Ÿ˜", + "rice_ball": "๐Ÿ™", + "cooked_rice": "๐Ÿš", + "curry_rice": "๐Ÿ›", + "steaming_bowl": "๐Ÿœ", + "spaghetti": "๐Ÿ", + "roasted_sweet_potato": "๐Ÿ ", + "oden": "๐Ÿข", + "sushi": "๐Ÿฃ", + "fried_shrimp": "๐Ÿค", + "fish_cake_with_swirl": "๐Ÿฅ", + "dango": "๐Ÿก", + "soft_ice_cream": "๐Ÿฆ", + "shaved_ice": "๐Ÿง", + "ice_cream": "๐Ÿจ", + "doughnut": "๐Ÿฉ", + "cookie": "๐Ÿช", + "birthday_cake": "๐ŸŽ‚", + "shortcake": "๐Ÿฐ", + "chocolate_bar": "๐Ÿซ", + "candy": "๐Ÿฌ", + "lollipop": "๐Ÿญ", + "custard": "๐Ÿฎ", + "honey_pot": "๐Ÿฏ", + "baby_bottle": "๐Ÿผ", + "hot_beverage": "โ˜•", + "teacup_without_handle": "๐Ÿต", + "sake": "๐Ÿถ", + "bottle_with_popping_cork": "๐Ÿพ", + "wine_glass": "๐Ÿท", + "cocktail_glass": "๐Ÿธ", + "tropical_drink": "๐Ÿน", + "beer_mug": "๐Ÿบ", + "clinking_beer_mugs": "๐Ÿป", + "fork_and_knife_with_plate": "๐Ÿฝ", + "fork_and_knife": "๐Ÿด", + "cooking": "๐Ÿณ", + "amphora": "๐Ÿบ", + "globe_showing_europe-africa": "๐ŸŒ", + "globe_showing_americas": "๐ŸŒŽ", + "globe_showing_asia-australia": "๐ŸŒ", + "globe_with_meridians": "๐ŸŒ", + "world_map": "๐Ÿ—บ", + "snow-capped_mountain": "๐Ÿ”", + "mountain": "โ›ฐ", + "volcano": "๐ŸŒ‹", + "mount_fuji": "๐Ÿ—ป", + "camping": "๐Ÿ•", + "beach_with_umbrella": "๐Ÿ–", + "desert": "๐Ÿœ", + "desert_island": "๐Ÿ", + "national_park": "๐Ÿž", + "stadium": "๐ŸŸ", + "classical_building": "๐Ÿ›", + "building_construction": "๐Ÿ—", + "house": "๐Ÿ ", + "cityscape": "๐Ÿ™", + "derelict_house": "๐Ÿš", + "house_with_garden": "๐Ÿก", + "church": "โ›ช", + "kaaba": "๐Ÿ•‹", + "mosque": "๐Ÿ•Œ", + "synagogue": "๐Ÿ•", + "shinto_shrine": "โ›ฉ", + "office_building": "๐Ÿข", + "japanese_post_office": "๐Ÿฃ", + "post_office": "๐Ÿค", + "hospital": "๐Ÿฅ", + "bank": "๐Ÿฆ", + "hotel": "๐Ÿจ", + "love_hotel": "๐Ÿฉ", + "convenience_store": "๐Ÿช", + "school": "๐Ÿซ", + "department_store": "๐Ÿฌ", + "factory": "๐Ÿญ", + "japanese_castle": "๐Ÿฏ", + "castle": "๐Ÿฐ", + "wedding": "๐Ÿ’’", + "tokyo_tower": "๐Ÿ—ผ", + "statue_of_liberty": "๐Ÿ—ฝ", + "map_of_japan": "๐Ÿ—พ", + "fountain": "โ›ฒ", + "tent": "โ›บ", + "foggy": "๐ŸŒ", + "night_with_stars": "๐ŸŒƒ", + "sunrise_over_mountains": "๐ŸŒ„", + "sunrise": "๐ŸŒ…", + "cityscape_at_dusk": "๐ŸŒ†", + "sunset": "๐ŸŒ‡", + "bridge_at_night": "๐ŸŒ‰", + "hot_springs": "โ™จ", + "milky_way": "๐ŸŒŒ", + "carousel_horse": "๐ŸŽ ", + "ferris_wheel": "๐ŸŽก", + "roller_coaster": "๐ŸŽข", + "barber_pole": "๐Ÿ’ˆ", + "circus_tent": "๐ŸŽช", + "performing_arts": "๐ŸŽญ", + "framed_picture": "๐Ÿ–ผ", + "artist_palette": "๐ŸŽจ", + "slot_machine": "๐ŸŽฐ", + "locomotive": "๐Ÿš‚", + "railway_car": "๐Ÿšƒ", + "high-speed_train": "๐Ÿš„", + "high-speed_train_with_bullet_nose": "๐Ÿš…", + "train": "๐Ÿš†", + "metro": "๐Ÿš‡", + "light_rail": "๐Ÿšˆ", + "station": "๐Ÿš‰", + "tram": "๐ŸšŠ", + "monorail": "๐Ÿš", + "mountain_railway": "๐Ÿšž", + "tram_car": "๐Ÿš‹", + "bus": "๐ŸšŒ", + "oncoming_bus": "๐Ÿš", + "trolleybus": "๐ŸšŽ", + "bus_stop": "๐Ÿš", + "minibus": "๐Ÿš", + "ambulance": "๐Ÿš‘", + "fire_engine": "๐Ÿš’", + "police_car": "๐Ÿš“", + "oncoming_police_car": "๐Ÿš”", + "taxi": "๐Ÿš•", + "oncoming_taxi": "๐Ÿš–", + "automobile": "๐Ÿš—", + "oncoming_automobile": "๐Ÿš˜", + "sport_utility_vehicle": "๐Ÿš™", + "delivery_truck": "๐Ÿšš", + "articulated_lorry": "๐Ÿš›", + "tractor": "๐Ÿšœ", + "bicycle": "๐Ÿšฒ", + "fuel_pump": "โ›ฝ", + "motorway": "๐Ÿ›ฃ", + "railway_track": "๐Ÿ›ค", + "police_car_light": "๐Ÿšจ", + "horizontal_traffic_light": "๐Ÿšฅ", + "vertical_traffic_light": "๐Ÿšฆ", + "construction": "๐Ÿšง", + "anchor": "โš“", + "sailboat": "โ›ต", + "person_rowing_boat": "๐Ÿšฃ", + "woman_rowing_boat": "๐Ÿšฃโ€โ™€", + "man_rowing_boat": "๐Ÿšฃโ€โ™‚", + "speedboat": "๐Ÿšค", + "passenger_ship": "๐Ÿ›ณ", + "ferry": "โ›ด", + "motor_boat": "๐Ÿ›ฅ", + "ship": "๐Ÿšข", + "airplane": "โœˆ", + "small_airplane": "๐Ÿ›ฉ", + "airplane_departure": "๐Ÿ›ซ", + "airplane_arrival": "๐Ÿ›ฌ", + "seat": "๐Ÿ’บ", + "helicopter": "๐Ÿš", + "suspension_railway": "๐ŸšŸ", + "mountain_cableway": "๐Ÿš ", + "aerial_tramway": "๐Ÿšก", + "rocket": "๐Ÿš€", + "satellite": "๐Ÿ›ฐ", + "bellhop_bell": "๐Ÿ›Ž", + "door": "๐Ÿšช", + "person_in_bed": "๐Ÿ›Œ", + "bed": "๐Ÿ›", + "couch_and_lamp": "๐Ÿ›‹", + "toilet": "๐Ÿšฝ", + "shower": "๐Ÿšฟ", + "person_taking_bath": "๐Ÿ›€", + "bathtub": "๐Ÿ›", + "hourglass": "โŒ›", + "hourglass_with_flowing_sand": "โณ", + "watch": "โŒš", + "alarm_clock": "โฐ", + "stopwatch": "โฑ", + "timer_clock": "โฒ", + "mantelpiece_clock": "๐Ÿ•ฐ", + "twelve_oclock": "๐Ÿ•›", + "twelve-thirty": "๐Ÿ•ง", + "one_oclock": "๐Ÿ•", + "one-thirty": "๐Ÿ•œ", + "two_oclock": "๐Ÿ•‘", + "two-thirty": "๐Ÿ•", + "three_oclock": "๐Ÿ•’", + "three-thirty": "๐Ÿ•ž", + "four_oclock": "๐Ÿ•“", + "four-thirty": "๐Ÿ•Ÿ", + "five_oclock": "๐Ÿ•”", + "five-thirty": "๐Ÿ• ", + "six_oclock": "๐Ÿ••", + "six-thirty": "๐Ÿ•ก", + "seven_oclock": "๐Ÿ•–", + "seven-thirty": "๐Ÿ•ข", + "eight_oclock": "๐Ÿ•—", + "eight-thirty": "๐Ÿ•ฃ", + "nine_oclock": "๐Ÿ•˜", + "nine-thirty": "๐Ÿ•ค", + "ten_oclock": "๐Ÿ•™", + "ten-thirty": "๐Ÿ•ฅ", + "eleven_oclock": "๐Ÿ•š", + "eleven-thirty": "๐Ÿ•ฆ", + "new_moon": "๐ŸŒ‘", + "waxing_crescent_moon": "๐ŸŒ’", + "first_quarter_moon": "๐ŸŒ“", + "waxing_gibbous_moon": "๐ŸŒ”", + "full_moon": "๐ŸŒ•", + "waning_gibbous_moon": "๐ŸŒ–", + "last_quarter_moon": "๐ŸŒ—", + "waning_crescent_moon": "๐ŸŒ˜", + "crescent_moon": "๐ŸŒ™", + "new_moon_face": "๐ŸŒš", + "first_quarter_moon_with_face": "๐ŸŒ›", + "last_quarter_moon_with_face": "๐ŸŒœ", + "thermometer": "๐ŸŒก", + "sun": "โ˜€", + "full_moon_with_face": "๐ŸŒ", + "sun_with_face": "๐ŸŒž", + "white_medium_star": "โญ", + "glowing_star": "๐ŸŒŸ", + "shooting_star": "๐ŸŒ ", + "cloud": "โ˜", + "sun_behind_cloud": "โ›…", + "cloud_with_lightning_and_rain": "โ›ˆ", + "sun_behind_small_cloud": "๐ŸŒค", + "sun_behind_large_cloud": "๐ŸŒฅ", + "sun_behind_rain_cloud": "๐ŸŒฆ", + "cloud_with_rain": "๐ŸŒง", + "cloud_with_snow": "๐ŸŒจ", + "cloud_with_lightning": "๐ŸŒฉ", + "tornado": "๐ŸŒช", + "fog": "๐ŸŒซ", + "wind_face": "๐ŸŒฌ", + "cyclone": "๐ŸŒ€", + "rainbow": "๐ŸŒˆ", + "closed_umbrella": "๐ŸŒ‚", + "umbrella": "โ˜‚", + "umbrella_with_rain_drops": "โ˜”", + "umbrella_on_ground": "โ›ฑ", + "high_voltage": "โšก", + "snowflake": "โ„", + "snowman": "โ˜ƒ", + "snowman_without_snow": "โ›„", + "comet": "โ˜„", + "fire": "๐Ÿ”ฅ", + "droplet": "๐Ÿ’ง", + "water_wave": "๐ŸŒŠ", + "jack-o-lantern": "๐ŸŽƒ", + "christmas_tree": "๐ŸŽ„", + "fireworks": "๐ŸŽ†", + "sparkler": "๐ŸŽ‡", + "sparkles": "โœจ", + "balloon": "๐ŸŽˆ", + "party_popper": "๐ŸŽ‰", + "confetti_ball": "๐ŸŽŠ", + "tanabata_tree": "๐ŸŽ‹", + "crossed_flags": "๐ŸŽŒ", + "pine_decoration": "๐ŸŽ", + "japanese_dolls": "๐ŸŽŽ", + "carp_streamer": "๐ŸŽ", + "wind_chime": "๐ŸŽ", + "moon_viewing_ceremony": "๐ŸŽ‘", + "ribbon": "๐ŸŽ€", + "wrapped_gift": "๐ŸŽ", + "military_medal": "๐ŸŽ–", + "reminder_ribbon": "๐ŸŽ—", + "film_frames": "๐ŸŽž", + "admission_tickets": "๐ŸŽŸ", + "ticket": "๐ŸŽซ", + "label": "๐Ÿท", + "soccer_ball": "โšฝ", + "baseball": "โšพ", + "basketball": "๐Ÿ€", + "american_football": "๐Ÿˆ", + "rugby_football": "๐Ÿ‰", + "tennis": "๐ŸŽพ", + "pool_8_ball": "๐ŸŽฑ", + "bowling": "๐ŸŽณ", + "flag_in_hole": "โ›ณ", + "person_golfing": "๐ŸŒ", + "woman_golfing": "๐ŸŒโ€โ™€", + "man_golfing": "๐ŸŒโ€โ™‚", + "ice_skate": "โ›ธ", + "fishing_pole": "๐ŸŽฃ", + "running_shirt": "๐ŸŽฝ", + "skis": "๐ŸŽฟ", + "skier": "โ›ท", + "snowboarder": "๐Ÿ‚", + "person_surfing": "๐Ÿ„", + "woman_surfing": "๐Ÿ„โ€โ™€", + "man_surfing": "๐Ÿ„โ€โ™‚", + "horse_racing": "๐Ÿ‡", + "person_swimming": "๐ŸŠ", + "woman_swimming": "๐ŸŠโ€โ™€", + "man_swimming": "๐ŸŠโ€โ™‚", + "person_bouncing_ball": "โ›น", + "woman_bouncing_ball": "โ›นโ€โ™€", + "man_bouncing_ball": "โ›นโ€โ™‚", + "person_lifting_weights": "๐Ÿ‹", + "woman_lifting_weights": "๐Ÿ‹โ€โ™€", + "man_lifting_weights": "๐Ÿ‹โ€โ™‚", + "person_biking": "๐Ÿšด", + "woman_biking": "๐Ÿšดโ€โ™€", + "man_biking": "๐Ÿšดโ€โ™‚", + "person_mountain_biking": "๐Ÿšต", + "woman_mountain_biking": "๐Ÿšตโ€โ™€", + "man_mountain_biking": "๐Ÿšตโ€โ™‚", + "racing_car": "๐ŸŽ", + "motorcycle": "๐Ÿ", + "sports_medal": "๐Ÿ…", + "trophy": "๐Ÿ†", + "cricket": "๐Ÿ", + "volleyball": "๐Ÿ", + "field_hockey": "๐Ÿ‘", + "ice_hockey": "๐Ÿ’", + "ping_pong": "๐Ÿ“", + "badminton": "๐Ÿธ", + "direct_hit": "๐ŸŽฏ", + "video_game": "๐ŸŽฎ", + "joystick": "๐Ÿ•น", + "game_die": "๐ŸŽฒ", + "spade_suit": "โ™ ", + "heart_suit": "โ™ฅ", + "diamond_suit": "โ™ฆ", + "club_suit": "โ™ฃ", + "joker": "๐Ÿƒ", + "mahjong_red_dragon": "๐Ÿ€„", + "flower_playing_cards": "๐ŸŽด", + "muted_speaker": "๐Ÿ”‡", + "speaker_low_volume": "๐Ÿ”ˆ", + "speaker_medium_volume": "๐Ÿ”‰", + "speaker_high_volume": "๐Ÿ”Š", + "loudspeaker": "๐Ÿ“ข", + "megaphone": "๐Ÿ“ฃ", + "postal_horn": "๐Ÿ“ฏ", + "bell": "๐Ÿ””", + "bell_with_slash": "๐Ÿ”•", + "musical_score": "๐ŸŽผ", + "musical_note": "๐ŸŽต", + "musical_notes": "๐ŸŽถ", + "studio_microphone": "๐ŸŽ™", + "level_slider": "๐ŸŽš", + "control_knobs": "๐ŸŽ›", + "microphone": "๐ŸŽค", + "headphone": "๐ŸŽง", + "saxophone": "๐ŸŽท", + "guitar": "๐ŸŽธ", + "musical_keyboard": "๐ŸŽน", + "trumpet": "๐ŸŽบ", + "violin": "๐ŸŽป", + "radio": "๐Ÿ“ป", + "mobile_phone": "๐Ÿ“ฑ", + "mobile_phone_with_arrow": "๐Ÿ“ฒ", + "telephone": "โ˜Ž", + "telephone_receiver": "๐Ÿ“ž", + "pager": "๐Ÿ“Ÿ", + "fax_machine": "๐Ÿ“ ", + "battery": "๐Ÿ”‹", + "electric_plug": "๐Ÿ”Œ", + "laptop_computer": "๐Ÿ’ป", + "desktop_computer": "๐Ÿ–ฅ", + "printer": "๐Ÿ–จ", + "keyboard": "โŒจ", + "computer_mouse": "๐Ÿ–ฑ", + "trackball": "๐Ÿ–ฒ", + "computer_disk": "๐Ÿ’ฝ", + "floppy_disk": "๐Ÿ’พ", + "optical_disk": "๐Ÿ’ฟ", + "dvd": "๐Ÿ“€", + "movie_camera": "๐ŸŽฅ", + "clapper_board": "๐ŸŽฌ", + "film_projector": "๐Ÿ“ฝ", + "television": "๐Ÿ“บ", + "camera": "๐Ÿ“ท", + "camera_with_flash": "๐Ÿ“ธ", + "video_camera": "๐Ÿ“น", + "videocassette": "๐Ÿ“ผ", + "left-pointing_magnifying_glass": "๐Ÿ”", + "right-pointing_magnifying_glass": "๐Ÿ”Ž", + "microscope": "๐Ÿ”ฌ", + "telescope": "๐Ÿ”ญ", + "satellite_antenna": "๐Ÿ“ก", + "candle": "๐Ÿ•ฏ", + "light_bulb": "๐Ÿ’ก", + "flashlight": "๐Ÿ”ฆ", + "red_paper_lantern": "๐Ÿฎ", + "notebook_with_decorative_cover": "๐Ÿ“”", + "closed_book": "๐Ÿ“•", + "open_book": "๐Ÿ“–", + "green_book": "๐Ÿ“—", + "blue_book": "๐Ÿ“˜", + "orange_book": "๐Ÿ“™", + "books": "๐Ÿ“š", + "notebook": "๐Ÿ““", + "ledger": "๐Ÿ“’", + "page_with_curl": "๐Ÿ“ƒ", + "scroll": "๐Ÿ“œ", + "page_facing_up": "๐Ÿ“„", + "newspaper": "๐Ÿ“ฐ", + "rolled-up_newspaper": "๐Ÿ—ž", + "bookmark_tabs": "๐Ÿ“‘", + "bookmark": "๐Ÿ”–", + "money_bag": "๐Ÿ’ฐ", + "yen_banknote": "๐Ÿ’ด", + "dollar_banknote": "๐Ÿ’ต", + "euro_banknote": "๐Ÿ’ถ", + "pound_banknote": "๐Ÿ’ท", + "money_with_wings": "๐Ÿ’ธ", + "credit_card": "๐Ÿ’ณ", + "chart_increasing_with_yen": "๐Ÿ’น", + "envelope": "โœ‰", + "e-mail": "๐Ÿ“ง", + "incoming_envelope": "๐Ÿ“จ", + "envelope_with_arrow": "๐Ÿ“ฉ", + "outbox_tray": "๐Ÿ“ค", + "inbox_tray": "๐Ÿ“ฅ", + "package": "๐Ÿ“ฆ", + "closed_mailbox_with_raised_flag": "๐Ÿ“ซ", + "closed_mailbox_with_lowered_flag": "๐Ÿ“ช", + "open_mailbox_with_raised_flag": "๐Ÿ“ฌ", + "open_mailbox_with_lowered_flag": "๐Ÿ“ญ", + "postbox": "๐Ÿ“ฎ", + "ballot_box_with_ballot": "๐Ÿ—ณ", + "pencil": "โœ", + "black_nib": "โœ’", + "fountain_pen": "๐Ÿ–‹", + "pen": "๐Ÿ–Š", + "paintbrush": "๐Ÿ–Œ", + "crayon": "๐Ÿ–", + "memo": "๐Ÿ“", + "briefcase": "๐Ÿ’ผ", + "file_folder": "๐Ÿ“", + "open_file_folder": "๐Ÿ“‚", + "card_index_dividers": "๐Ÿ—‚", + "calendar": "๐Ÿ“…", + "tear-off_calendar": "๐Ÿ“†", + "spiral_notepad": "๐Ÿ—’", + "spiral_calendar": "๐Ÿ—“", + "card_index": "๐Ÿ“‡", + "chart_increasing": "๐Ÿ“ˆ", + "chart_decreasing": "๐Ÿ“‰", + "bar_chart": "๐Ÿ“Š", + "clipboard": "๐Ÿ“‹", + "pushpin": "๐Ÿ“Œ", + "round_pushpin": "๐Ÿ“", + "paperclip": "๐Ÿ“Ž", + "linked_paperclips": "๐Ÿ–‡", + "straight_ruler": "๐Ÿ“", + "triangular_ruler": "๐Ÿ“", + "scissors": "โœ‚", + "card_file_box": "๐Ÿ—ƒ", + "file_cabinet": "๐Ÿ—„", + "wastebasket": "๐Ÿ—‘", + "locked": "๐Ÿ”’", + "unlocked": "๐Ÿ”“", + "locked_with_pen": "๐Ÿ”", + "locked_with_key": "๐Ÿ”", + "key": "๐Ÿ”‘", + "old_key": "๐Ÿ—", + "hammer": "๐Ÿ”จ", + "pick": "โ›", + "hammer_and_pick": "โš’", + "hammer_and_wrench": "๐Ÿ› ", + "wrench": "๐Ÿ”ง", + "nut_and_bolt": "๐Ÿ”ฉ", + "gear": "โš™", + "clamp": "๐Ÿ—œ", + "alembic": "โš—", + "balance_scale": "โš–", + "link": "๐Ÿ”—", + "chains": "โ›“", + "syringe": "๐Ÿ’‰", + "pill": "๐Ÿ’Š", + "dagger": "๐Ÿ—ก", + "kitchen_knife": "๐Ÿ”ช", + "crossed_swords": "โš”", + "pistol": "๐Ÿ”ซ", + "shield": "๐Ÿ›ก", + "bow_and_arrow": "๐Ÿน", + "chequered_flag": "๐Ÿ", + "white_flag": "๐Ÿณ", + "rainbow_flag": "๐Ÿณโ€๐ŸŒˆ", + "black_flag": "๐Ÿด", + "triangular_flag": "๐Ÿšฉ", + "cigarette": "๐Ÿšฌ", + "coffin": "โšฐ", + "funeral_urn": "โšฑ", + "moai": "๐Ÿ—ฟ", + "oil_drum": "๐Ÿ›ข", + "crystal_ball": "๐Ÿ”ฎ", + "atm_sign": "๐Ÿง", + "litter_in_bin_sign": "๐Ÿšฎ", + "potable_water": "๐Ÿšฐ", + "wheelchair_symbol": "โ™ฟ", + "mens_room": "๐Ÿšน", + "womens_room": "๐Ÿšบ", + "restroom": "๐Ÿšป", + "baby_symbol": "๐Ÿšผ", + "water_closet": "๐Ÿšพ", + "passport_control": "๐Ÿ›‚", + "customs": "๐Ÿ›ƒ", + "baggage_claim": "๐Ÿ›„", + "left_luggage": "๐Ÿ›…", + "warning": "โš ", + "children_crossing": "๐Ÿšธ", + "no_entry": "โ›”", + "prohibited": "๐Ÿšซ", + "no_bicycles": "๐Ÿšณ", + "no_smoking": "๐Ÿšญ", + "no_littering": "๐Ÿšฏ", + "non-potable_water": "๐Ÿšฑ", + "no_pedestrians": "๐Ÿšท", + "radioactive": "โ˜ข", + "biohazard": "โ˜ฃ", + "up_arrow": "โฌ†", + "up-right_arrow": "โ†—", + "right_arrow": "โžก", + "down-right_arrow": "โ†˜", + "down_arrow": "โฌ‡", + "down-left_arrow": "โ†™", + "left_arrow": "โฌ…", + "up-left_arrow": "โ†–", + "up-down_arrow": "โ†•", + "left-right_arrow": "โ†”", + "right_arrow_curving_left": "โ†ฉ", + "left_arrow_curving_right": "โ†ช", + "right_arrow_curving_up": "โคด", + "right_arrow_curving_down": "โคต", + "clockwise_vertical_arrows": "๐Ÿ”ƒ", + "anticlockwise_arrows_button": "๐Ÿ”„", + "back_arrow": "๐Ÿ”™", + "end_arrow": "๐Ÿ”š", + "on!_arrow": "๐Ÿ”›", + "soon_arrow": "๐Ÿ”œ", + "top_arrow": "๐Ÿ”", + "place_of_worship": "๐Ÿ›", + "atom_symbol": "โš›", + "om": "๐Ÿ•‰", + "star_of_david": "โœก", + "wheel_of_dharma": "โ˜ธ", + "yin_yang": "โ˜ฏ", + "latin_cross": "โœ", + "orthodox_cross": "โ˜ฆ", + "star_and_crescent": "โ˜ช", + "peace_symbol": "โ˜ฎ", + "menorah": "๐Ÿ•Ž", + "dotted_six-pointed_star": "๐Ÿ”ฏ", + "recycling_symbol": "โ™ป", + "name_badge": "๐Ÿ“›", + "fleur-de-lis": "โšœ", + "japanese_symbol_for_beginner": "๐Ÿ”ฐ", + "trident_emblem": "๐Ÿ”ฑ", + "heavy_large_circle": "โญ•", + "white_heavy_check_mark": "โœ…", + "ballot_box_with_check": "โ˜‘", + "heavy_check_mark": "โœ”", + "heavy_multiplication_x": "โœ–", + "cross_mark": "โŒ", + "cross_mark_button": "โŽ", + "heavy_plus_sign": "โž•", + "heavy_minus_sign": "โž–", + "heavy_division_sign": "โž—", + "curly_loop": "โžฐ", + "double_curly_loop": "โžฟ", + "part_alternation_mark": "ใ€ฝ", + "eight-spoked_asterisk": "โœณ", + "eight-pointed_star": "โœด", + "sparkle": "โ‡", + "currency_exchange": "๐Ÿ’ฑ", + "heavy_dollar_sign": "๐Ÿ’ฒ", + "double_exclamation_mark": "โ€ผ", + "exclamation_question_mark": "โ‰", + "question_mark": "โ“", + "white_question_mark": "โ”", + "white_exclamation_mark": "โ•", + "exclamation_mark": "โ—", + "wavy_dash": "ใ€ฐ", + "copyright": "ยฉ", + "registered": "ยฎ", + "trade_mark": "โ„ข", + "aries": "โ™ˆ", + "taurus": "โ™‰", + "gemini": "โ™Š", + "cancer": "โ™‹", + "leo": "โ™Œ", + "virgo": "โ™", + "libra": "โ™Ž", + "scorpius": "โ™", + "sagittarius": "โ™", + "capricorn": "โ™‘", + "aquarius": "โ™’", + "pisces": "โ™“", + "ophiuchus": "โ›Ž", + "shuffle_tracks_button": "๐Ÿ”€", + "repeat_button": "๐Ÿ”", + "repeat_single_button": "๐Ÿ”‚", + "play_button": "โ–ถ", + "fast-forward_button": "โฉ", + "next_track_button": "โญ", + "play_or_pause_button": "โฏ", + "reverse_button": "โ—€", + "fast_reverse_button": "โช", + "last_track_button": "โฎ", + "up_button": "๐Ÿ”ผ", + "fast_up_button": "โซ", + "down_button": "๐Ÿ”ฝ", + "fast_down_button": "โฌ", + "pause_button": "โธ", + "stop_button": "โน", + "record_button": "โบ", + "eject_button": "โ", + "cinema": "๐ŸŽฆ", + "dim_button": "๐Ÿ”…", + "bright_button": "๐Ÿ”†", + "antenna_bars": "๐Ÿ“ถ", + "no_mobile_phones": "๐Ÿ“ต", + "vibration_mode": "๐Ÿ“ณ", + "mobile_phone_off": "๐Ÿ“ด", + "keycap_10": "๐Ÿ”Ÿ", + "hundred_points": "๐Ÿ’ฏ", + "no_one_under_eighteen": "๐Ÿ”ž", + "input_latin_uppercase": "๐Ÿ” ", + "input_latin_lowercase": "๐Ÿ”ก", + "input_numbers": "๐Ÿ”ข", + "input_symbols": "๐Ÿ”ฃ", + "input_latin_letters": "๐Ÿ”ค", + "a_button_(blood_type)": "๐Ÿ…ฐ", + "ab_button_(blood_type)": "๐Ÿ†Ž", + "b_button_(blood_type)": "๐Ÿ…ฑ", + "cl_button": "๐Ÿ†‘", + "cool_button": "๐Ÿ†’", + "free_button": "๐Ÿ†“", + "information": "โ„น", + "id_button": "๐Ÿ†”", + "circled_m": "โ“‚", + "new_button": "๐Ÿ†•", + "ng_button": "๐Ÿ†–", + "o_button_(blood_type)": "๐Ÿ…พ", + "ok_button": "๐Ÿ†—", + "p_button": "๐Ÿ…ฟ", + "sos_button": "๐Ÿ†˜", + "up!_button": "๐Ÿ†™", + "vs_button": "๐Ÿ†š", + "japanese_here_button": "๐Ÿˆ", + "japanese_service_charge_button": "๐Ÿˆ‚", + "japanese_monthly_amount_button": "๐Ÿˆท", + "japanese_not_free_of_charge_button": "๐Ÿˆถ", + "japanese_reserved_button": "๐Ÿˆฏ", + "japanese_bargain_button": "๐Ÿ‰", + "japanese_discount_button": "๐Ÿˆน", + "japanese_free_of_charge_button": "๐Ÿˆš", + "japanese_prohibited_button": "๐Ÿˆฒ", + "japanese_acceptable_button": "๐Ÿ‰‘", + "japanese_application_button": "๐Ÿˆธ", + "japanese_passing_grade_button": "๐Ÿˆด", + "japanese_vacancy_button": "๐Ÿˆณ", + "japanese_congratulations_button": "ใŠ—", + "japanese_secret_button": "ใŠ™", + "japanese_open_for_business_button": "๐Ÿˆบ", + "japanese_no_vacancy_button": "๐Ÿˆต", + "black_small_square": "โ–ช", + "white_small_square": "โ–ซ", + "white_medium_square": "โ—ป", + "black_medium_square": "โ—ผ", + "white_medium-small_square": "โ—ฝ", + "black_medium-small_square": "โ—พ", + "black_large_square": "โฌ›", + "white_large_square": "โฌœ", + "large_orange_diamond": "๐Ÿ”ถ", + "large_blue_diamond": "๐Ÿ”ท", + "small_orange_diamond": "๐Ÿ”ธ", + "small_blue_diamond": "๐Ÿ”น", + "red_triangle_pointed_up": "๐Ÿ”บ", + "red_triangle_pointed_down": "๐Ÿ”ป", + "diamond_with_a_dot": "๐Ÿ’ ", + "radio_button": "๐Ÿ”˜", + "black_square_button": "๐Ÿ”ฒ", + "white_square_button": "๐Ÿ”ณ", + "white_circle": "โšช", + "black_circle": "โšซ", + "red_circle": "๐Ÿ”ด", + "blue_circle": "๐Ÿ”ต", + "stop_sign": "๐Ÿ›‘", + "shopping_cart": "๐Ÿ›’", + "kick_scooter": "๐Ÿ›ด", + "motor_scooter": "๐Ÿ›ต", + "canoe": "๐Ÿ›ถ" +}; \ No newline at end of file diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm index d89b600a052..7a440f8ef4d 100644 --- a/goon/code/datums/browserOutput.dm +++ b/goon/code/datums/browserOutput.dm @@ -8,7 +8,8 @@ var/list/chatResources = list( "goon/browserassets/css/fonts/fontawesome-webfont.ttf", "goon/browserassets/css/fonts/fontawesome-webfont.woff", "goon/browserassets/css/font-awesome.css", - "goon/browserassets/css/browserOutput.css" + "goon/browserassets/css/browserOutput.css", + "goon/browserassets/json/unicode_9_annotations.json" ) /var/savefile/iconCache = new /savefile("data/iconCache.sav") @@ -210,8 +211,8 @@ var/list/chatResources = list( var/to_chat_filename var/to_chat_line var/to_chat_src -// Call using macro: to_chat(target, message) -/proc/__to_chat(target, message) +// Call using macro: to_chat(target, message, flag) +/proc/__to_chat(target, message, flag) if(!is_valid_tochat_message(message) || !is_valid_tochat_target(target)) target << message @@ -262,5 +263,9 @@ var/to_chat_src C.chatOutput.messageQueue.Add(message) return + // url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the javascript. + var/output_message = "[url_encode(url_encode(message))]" + if(flag) + output_message += "&[url_encode(flag)]" - target << output(url_encode(message), "browseroutput:output") + target << output(output_message, "browseroutput:output")