diff --git a/client/css/style.css b/client/css/style.css index 7fbd6492..29323197 100644 --- a/client/css/style.css +++ b/client/css/style.css @@ -1338,8 +1338,7 @@ kbd { #help .help-item .subject { white-space: nowrap; - padding-right: 10px; - min-width: 150px; + padding-right: 15px; } #help .help-item .description p { @@ -1486,7 +1485,8 @@ kbd { background: transparent; } -#context-menu { +#context-menu, +.textcomplete-menu { position: absolute; list-style: none; margin: 0; @@ -1505,7 +1505,8 @@ kbd { background-color: rgba(0, 0, 0, .1); } -.context-menu-item { +.context-menu-item, +.textcomplete-item { cursor: pointer; display: block; padding: 4px 8px; @@ -1514,15 +1515,33 @@ kbd { margin-bottom: 6px; } -.context-menu-item:hover { +.context-menu-item:hover, +.textcomplete-item:hover, +.textcomplete-menu .active { background-color: #f6f6f6; } -.context-menu-item:before { +.context-menu-item:before, +.textcomplete-item:before { width: 20px; display: inline-block; } +.textcomplete-item a { + color: #333; +} + +.textcomplete-item a:hover { + opacity: 1; +} + +.textcomplete-item .emoji { + margin-right: 8px; + width: 16px; + text-align: center; + display: inline-block; +} + /** * Tooltips v0.5.3 * See http://primercss.io/tooltips/ diff --git a/client/index.html b/client/index.html index 1b40bfce..5103e0ba 100644 --- a/client/index.html +++ b/client/index.html @@ -532,6 +532,49 @@ +
+ Start typing the following characters followed by any letter to + trigger the autocompletion dropdown: +
+ +@
+ Nickname
+#
+ Channel
+/
+ Commands (see list of commands below)
+:
+ Emoji
+All commands can be autocompleted with tab.
diff --git a/client/js/libs/jquery/inputhistory.js b/client/js/libs/jquery/inputhistory.js index 1f5b7bf8..d6f98360 100644 --- a/client/js/libs/jquery/inputhistory.js +++ b/client/js/libs/jquery/inputhistory.js @@ -34,7 +34,7 @@ import jQuery from "jquery"; var key = e.which; switch (key) { case 13: // Enter - if (e.shiftKey) { + if (e.shiftKey || self.data("autocompleting")) { return; // multiline input } @@ -56,7 +56,7 @@ import jQuery from "jquery"; case 38: // Up case 40: // Down // NOTICE: This is specific to The Lounge. - if (e.ctrlKey || e.metaKey) { + if (e.ctrlKey || e.metaKey || self.data("autocompleting")) { break; } diff --git a/client/js/libs/simplemap.json b/client/js/libs/simplemap.json new file mode 100644 index 00000000..2f3f0567 --- /dev/null +++ b/client/js/libs/simplemap.json @@ -0,0 +1,1434 @@ +{ + "100": "๐ฏ", + "1234": "๐ข", + "grinning": "๐", + "grimacing": "๐ฌ", + "grin": "๐", + "joy": "๐", + "rofl": "๐คฃ", + "smiley": "๐", + "smile": "๐", + "sweat_smile": "๐ ", + "laughing": "๐", + "innocent": "๐", + "wink": "๐", + "blush": "๐", + "slightly_smiling_face": "๐", + "upside_down_face": "๐", + "relaxed": "โบ๏ธ", + "yum": "๐", + "relieved": "๐", + "heart_eyes": "๐", + "kissing_heart": "๐", + "kissing": "๐", + "kissing_smiling_eyes": "๐", + "kissing_closed_eyes": "๐", + "stuck_out_tongue_winking_eye": "๐", + "stuck_out_tongue_closed_eyes": "๐", + "stuck_out_tongue": "๐", + "money_mouth_face": "๐ค", + "nerd_face": "๐ค", + "sunglasses": "๐", + "clown_face": "๐คก", + "cowboy_hat_face": "๐ค ", + "hugs": "๐ค", + "smirk": "๐", + "no_mouth": "๐ถ", + "neutral_face": "๐", + "expressionless": "๐", + "unamused": "๐", + "roll_eyes": "๐", + "thinking": "๐ค", + "lying_face": "๐คฅ", + "flushed": "๐ณ", + "disappointed": "๐", + "worried": "๐", + "angry": "๐ ", + "rage": "๐ก", + "pensive": "๐", + "confused": "๐", + "slightly_frowning_face": "๐", + "frowning_face": "โน", + "persevere": "๐ฃ", + "confounded": "๐", + "tired_face": "๐ซ", + "weary": "๐ฉ", + "triumph": "๐ค", + "open_mouth": "๐ฎ", + "scream": "๐ฑ", + "fearful": "๐จ", + "cold_sweat": "๐ฐ", + "hushed": "๐ฏ", + "frowning": "๐ฆ", + "anguished": "๐ง", + "cry": "๐ข", + "disappointed_relieved": "๐ฅ", + "drooling_face": "๐คค", + "sleepy": "๐ช", + "sweat": "๐", + "sob": "๐ญ", + "dizzy_face": "๐ต", + "astonished": "๐ฒ", + "zipper_mouth_face": "๐ค", + "nauseated_face": "๐คข", + "sneezing_face": "๐คง", + "mask": "๐ท", + "face_with_thermometer": "๐ค", + "face_with_head_bandage": "๐ค", + "sleeping": "๐ด", + "zzz": "๐ค", + "poop": "๐ฉ", + "smiling_imp": "๐", + "imp": "๐ฟ", + "japanese_ogre": "๐น", + "japanese_goblin": "๐บ", + "skull": "๐", + "ghost": "๐ป", + "alien": "๐ฝ", + "robot": "๐ค", + "smiley_cat": "๐บ", + "smile_cat": "๐ธ", + "joy_cat": "๐น", + "heart_eyes_cat": "๐ป", + "smirk_cat": "๐ผ", + "kissing_cat": "๐ฝ", + "scream_cat": "๐", + "crying_cat_face": "๐ฟ", + "pouting_cat": "๐พ", + "raised_hands": "๐", + "clap": "๐", + "wave": "๐", + "call_me_hand": "๐ค", + "+1": "๐", + "-1": "๐", + "facepunch": "๐", + "fist": "โ", + "fist_left": "๐ค", + "fist_right": "๐ค", + "v": "โ", + "ok_hand": "๐", + "raised_hand": "โ", + "raised_back_of_hand": "๐ค", + "open_hands": "๐", + "muscle": "๐ช", + "pray": "๐", + "handshake": "๐ค", + "point_up": "โ", + "point_up_2": "๐", + "point_down": "๐", + "point_left": "๐", + "point_right": "๐", + "fu": "๐", + "raised_hand_with_fingers_splayed": "๐", + "metal": "๐ค", + "crossed_fingers": "๐ค", + "vulcan_salute": "๐", + "writing_hand": "โ", + "selfie": "๐คณ", + "nail_care": "๐ ", + "lips": "๐", + "tongue": "๐ ", + "ear": "๐", + "nose": "๐", + "eye": "๐", + "eyes": "๐", + "bust_in_silhouette": "๐ค", + "busts_in_silhouette": "๐ฅ", + "speaking_head": "๐ฃ", + "baby": "๐ถ", + "boy": "๐ฆ", + "girl": "๐ง", + "man": "๐จ", + "woman": "๐ฉ", + "blonde_woman": "๐ฑโโ๏ธ", + "blonde_man": "๐ฑ", + "older_man": "๐ด", + "older_woman": "๐ต", + "man_with_gua_pi_mao": "๐ฒ", + "woman_with_turban": "๐ณโโ๏ธ", + "man_with_turban": "๐ณ", + "policewoman": "๐ฎโโ๏ธ", + "policeman": "๐ฎ", + "construction_worker_woman": "๐ทโโ๏ธ", + "construction_worker_man": "๐ท", + "guardswoman": "๐โโ๏ธ", + "guardsman": "๐", + "female_detective": "๐ต๏ธโโ๏ธ", + "male_detective": "๐ต", + "woman_health_worker": "๐ฉโโ๏ธ", + "man_health_worker": "๐จโโ๏ธ", + "woman_farmer": "๐ฉโ๐พ", + "man_farmer": "๐จโ๐พ", + "woman_cook": "๐ฉโ๐ณ", + "man_cook": "๐จโ๐ณ", + "woman_student": "๐ฉโ๐", + "man_student": "๐จโ๐", + "woman_singer": "๐ฉโ๐ค", + "man_singer": "๐จโ๐ค", + "woman_teacher": "๐ฉโ๐ซ", + "man_teacher": "๐จโ๐ซ", + "woman_factory_worker": "๐ฉโ๐ญ", + "man_factory_worker": "๐จโ๐ญ", + "woman_technologist": "๐ฉโ๐ป", + "man_technologist": "๐จโ๐ป", + "woman_office_worker": "๐ฉโ๐ผ", + "man_office_worker": "๐จโ๐ผ", + "woman_mechanic": "๐ฉโ๐ง", + "man_mechanic": "๐จโ๐ง", + "woman_scientist": "๐ฉโ๐ฌ", + "man_scientist": "๐จโ๐ฌ", + "woman_artist": "๐ฉโ๐จ", + "man_artist": "๐จโ๐จ", + "woman_firefighter": "๐ฉโ๐", + "man_firefighter": "๐จโ๐", + "woman_pilot": "๐ฉโโ๏ธ", + "man_pilot": "๐จโโ๏ธ", + "woman_astronaut": "๐ฉโ๐", + "man_astronaut": "๐จโ๐", + "woman_judge": "๐ฉโโ๏ธ", + "man_judge": "๐จโโ๏ธ", + "mrs_claus": "๐คถ", + "santa": "๐ ", + "angel": "๐ผ", + "pregnant_woman": "๐คฐ", + "princess": "๐ธ", + "prince": "๐คด", + "bride_with_veil": "๐ฐ", + "man_in_tuxedo": "๐คต", + "running_woman": "๐โโ๏ธ", + "running_man": "๐", + "walking_woman": "๐ถโโ๏ธ", + "walking_man": "๐ถ", + "dancer": "๐", + "man_dancing": "๐บ", + "dancing_women": "๐ฏ", + "dancing_men": "๐ฏโโ๏ธ", + "couple": "๐ซ", + "two_men_holding_hands": "๐ฌ", + "two_women_holding_hands": "๐ญ", + "bowing_woman": "๐โโ๏ธ", + "bowing_man": "๐", + "man_facepalming": "๐คฆ", + "woman_facepalming": "๐คฆโโ๏ธ", + "woman_shrugging": "๐คท", + "man_shrugging": "๐คทโโ๏ธ", + "tipping_hand_woman": "๐", + "tipping_hand_man": "๐โโ๏ธ", + "no_good_woman": "๐ ", + "no_good_man": "๐ โโ๏ธ", + "ok_woman": "๐", + "ok_man": "๐โโ๏ธ", + "raising_hand_woman": "๐", + "raising_hand_man": "๐โโ๏ธ", + "pouting_woman": "๐", + "pouting_man": "๐โโ๏ธ", + "frowning_woman": "๐", + "frowning_man": "๐โโ๏ธ", + "haircut_woman": "๐", + "haircut_man": "๐โโ๏ธ", + "massage_woman": "๐", + "massage_man": "๐โโ๏ธ", + "couple_with_heart_woman_man": "๐", + "couple_with_heart_woman_woman": "๐ฉโโค๏ธโ๐ฉ", + "couple_with_heart_man_man": "๐จโโค๏ธโ๐จ", + "couplekiss_man_woman": "๐", + "couplekiss_woman_woman": "๐ฉโโค๏ธโ๐โ๐ฉ", + "couplekiss_man_man": "๐จโโค๏ธโ๐โ๐จ", + "family_man_woman_boy": "๐ช", + "family_man_woman_girl": "๐จโ๐ฉโ๐ง", + "family_man_woman_girl_boy": "๐จโ๐ฉโ๐งโ๐ฆ", + "family_man_woman_boy_boy": "๐จโ๐ฉโ๐ฆโ๐ฆ", + "family_man_woman_girl_girl": "๐จโ๐ฉโ๐งโ๐ง", + "family_woman_woman_boy": "๐ฉโ๐ฉโ๐ฆ", + "family_woman_woman_girl": "๐ฉโ๐ฉโ๐ง", + "family_woman_woman_girl_boy": "๐ฉโ๐ฉโ๐งโ๐ฆ", + "family_woman_woman_boy_boy": "๐ฉโ๐ฉโ๐ฆโ๐ฆ", + "family_woman_woman_girl_girl": "๐ฉโ๐ฉโ๐งโ๐ง", + "family_man_man_boy": "๐จโ๐จโ๐ฆ", + "family_man_man_girl": "๐จโ๐จโ๐ง", + "family_man_man_girl_boy": "๐จโ๐จโ๐งโ๐ฆ", + "family_man_man_boy_boy": "๐จโ๐จโ๐ฆโ๐ฆ", + "family_man_man_girl_girl": "๐จโ๐จโ๐งโ๐ง", + "family_woman_boy": "๐ฉโ๐ฆ", + "family_woman_girl": "๐ฉโ๐ง", + "family_woman_girl_boy": "๐ฉโ๐งโ๐ฆ", + "family_woman_boy_boy": "๐ฉโ๐ฆโ๐ฆ", + "family_woman_girl_girl": "๐ฉโ๐งโ๐ง", + "family_man_boy": "๐จโ๐ฆ", + "family_man_girl": "๐จโ๐ง", + "family_man_girl_boy": "๐จโ๐งโ๐ฆ", + "family_man_boy_boy": "๐จโ๐ฆโ๐ฆ", + "family_man_girl_girl": "๐จโ๐งโ๐ง", + "womans_clothes": "๐", + "tshirt": "๐", + "jeans": "๐", + "necktie": "๐", + "dress": "๐", + "bikini": "๐", + "kimono": "๐", + "lipstick": "๐", + "kiss": "๐", + "footprints": "๐ฃ", + "high_heel": "๐ ", + "sandal": "๐ก", + "boot": "๐ข", + "mans_shoe": "๐", + "athletic_shoe": "๐", + "womans_hat": "๐", + "tophat": "๐ฉ", + "rescue_worker_helmet": "โ", + "mortar_board": "๐", + "crown": "๐", + "school_satchel": "๐", + "pouch": "๐", + "purse": "๐", + "handbag": "๐", + "briefcase": "๐ผ", + "eyeglasses": "๐", + "dark_sunglasses": "๐ถ", + "ring": "๐", + "closed_umbrella": "๐", + "dog": "๐ถ", + "cat": "๐ฑ", + "mouse": "๐ญ", + "hamster": "๐น", + "rabbit": "๐ฐ", + "fox_face": "๐ฆ", + "bear": "๐ป", + "panda_face": "๐ผ", + "koala": "๐จ", + "tiger": "๐ฏ", + "lion": "๐ฆ", + "cow": "๐ฎ", + "pig": "๐ท", + "pig_nose": "๐ฝ", + "frog": "๐ธ", + "squid": "๐ฆ", + "octopus": "๐", + "shrimp": "๐ฆ", + "monkey_face": "๐ต", + "gorilla": "๐ฆ", + "see_no_evil": "๐", + "hear_no_evil": "๐", + "speak_no_evil": "๐", + "monkey": "๐", + "chicken": "๐", + "penguin": "๐ง", + "bird": "๐ฆ", + "baby_chick": "๐ค", + "hatching_chick": "๐ฃ", + "hatched_chick": "๐ฅ", + "duck": "๐ฆ", + "eagle": "๐ฆ ", + "owl": "๐ฆ", + "bat": "๐ฆ", + "wolf": "๐บ", + "boar": "๐", + "horse": "๐ด", + "unicorn": "๐ฆ", + "honeybee": "๐", + "bug": "๐", + "butterfly": "๐ฆ", + "snail": "๐", + "beetle": "๐", + "ant": "๐", + "spider": "๐ท", + "scorpion": "๐ฆ", + "crab": "๐ฆ", + "snake": "๐", + "lizard": "๐ฆ", + "turtle": "๐ข", + "tropical_fish": "๐ ", + "fish": "๐", + "blowfish": "๐ก", + "dolphin": "๐ฌ", + "shark": "๐ฆ", + "whale": "๐ณ", + "whale2": "๐", + "crocodile": "๐", + "leopard": "๐", + "tiger2": "๐ ", + "water_buffalo": "๐", + "ox": "๐", + "cow2": "๐", + "deer": "๐ฆ", + "dromedary_camel": "๐ช", + "camel": "๐ซ", + "elephant": "๐", + "rhinoceros": "๐ฆ", + "goat": "๐", + "ram": "๐", + "sheep": "๐", + "racehorse": "๐", + "pig2": "๐", + "rat": "๐", + "mouse2": "๐", + "rooster": "๐", + "turkey": "๐ฆ", + "dove": "๐", + "dog2": "๐", + "poodle": "๐ฉ", + "cat2": "๐", + "rabbit2": "๐", + "chipmunk": "๐ฟ", + "paw_prints": "๐พ", + "dragon": "๐", + "dragon_face": "๐ฒ", + "cactus": "๐ต", + "christmas_tree": "๐", + "evergreen_tree": "๐ฒ", + "deciduous_tree": "๐ณ", + "palm_tree": "๐ด", + "seedling": "๐ฑ", + "herb": "๐ฟ", + "shamrock": "โ", + "four_leaf_clover": "๐", + "bamboo": "๐", + "tanabata_tree": "๐", + "leaves": "๐", + "fallen_leaf": "๐", + "maple_leaf": "๐", + "ear_of_rice": "๐พ", + "hibiscus": "๐บ", + "sunflower": "๐ป", + "rose": "๐น", + "wilted_flower": "๐ฅ", + "tulip": "๐ท", + "blossom": "๐ผ", + "cherry_blossom": "๐ธ", + "bouquet": "๐", + "mushroom": "๐", + "chestnut": "๐ฐ", + "jack_o_lantern": "๐", + "shell": "๐", + "spider_web": "๐ธ", + "earth_americas": "๐", + "earth_africa": "๐", + "earth_asia": "๐", + "full_moon": "๐", + "waning_gibbous_moon": "๐", + "last_quarter_moon": "๐", + "waning_crescent_moon": "๐", + "new_moon": "๐", + "waxing_crescent_moon": "๐", + "first_quarter_moon": "๐", + "waxing_gibbous_moon": "๐", + "new_moon_with_face": "๐", + "full_moon_with_face": "๐", + "first_quarter_moon_with_face": "๐", + "last_quarter_moon_with_face": "๐", + "sun_with_face": "๐", + "crescent_moon": "๐", + "star": "โญ", + "star2": "๐", + "dizzy": "๐ซ", + "sparkles": "โจ", + "comet": "โ", + "sunny": "โ๏ธ", + "sun_behind_small_cloud": "๐ค", + "partly_sunny": "โ ", + "sun_behind_large_cloud": "๐ฅ", + "sun_behind_rain_cloud": "๐ฆ", + "cloud": "โ๏ธ", + "cloud_with_rain": "๐ง", + "cloud_with_lightning_and_rain": "โ", + "cloud_with_lightning": "๐ฉ", + "zap": "โก", + "fire": "๐ฅ", + "boom": "๐ฅ", + "snowflake": "โ๏ธ", + "cloud_with_snow": "๐จ", + "snowman": "โ", + "snowman_with_snow": "โ", + "wind_face": "๐ฌ", + "dash": "๐จ", + "tornado": "๐ช", + "fog": "๐ซ", + "open_umbrella": "โ", + "umbrella": "โ", + "droplet": "๐ง", + "sweat_drops": "๐ฆ", + "ocean": "๐", + "green_apple": "๐", + "apple": "๐", + "pear": "๐", + "tangerine": "๐", + "lemon": "๐", + "banana": "๐", + "watermelon": "๐", + "grapes": "๐", + "strawberry": "๐", + "melon": "๐", + "cherries": "๐", + "peach": "๐", + "pineapple": "๐", + "kiwi_fruit": "๐ฅ", + "avocado": "๐ฅ", + "tomato": "๐ ", + "eggplant": "๐", + "cucumber": "๐ฅ", + "carrot": "๐ฅ", + "hot_pepper": "๐ถ", + "potato": "๐ฅ", + "corn": "๐ฝ", + "sweet_potato": "๐ ", + "peanuts": "๐ฅ", + "honey_pot": "๐ฏ", + "croissant": "๐ฅ", + "bread": "๐", + "baguette_bread": "๐ฅ", + "cheese": "๐ง", + "egg": "๐ฅ", + "bacon": "๐ฅ", + "pancakes": "๐ฅ", + "poultry_leg": "๐", + "meat_on_bone": "๐", + "fried_shrimp": "๐ค", + "fried_egg": "๐ณ", + "hamburger": "๐", + "fries": "๐", + "stuffed_flatbread": "๐ฅ", + "hotdog": "๐ญ", + "pizza": "๐", + "spaghetti": "๐", + "taco": "๐ฎ", + "burrito": "๐ฏ", + "green_salad": "๐ฅ", + "shallow_pan_of_food": "๐ฅ", + "ramen": "๐", + "stew": "๐ฒ", + "fish_cake": "๐ฅ", + "sushi": "๐ฃ", + "bento": "๐ฑ", + "curry": "๐", + "rice_ball": "๐", + "rice": "๐", + "rice_cracker": "๐", + "oden": "๐ข", + "dango": "๐ก", + "shaved_ice": "๐ง", + "ice_cream": "๐จ", + "icecream": "๐ฆ", + "cake": "๐ฐ", + "birthday": "๐", + "custard": "๐ฎ", + "candy": "๐ฌ", + "lollipop": "๐ญ", + "chocolate_bar": "๐ซ", + "popcorn": "๐ฟ", + "doughnut": "๐ฉ", + "cookie": "๐ช", + "milk_glass": "๐ฅ", + "beer": "๐บ", + "beers": "๐ป", + "clinking_glasses": "๐ฅ", + "wine_glass": "๐ท", + "tumbler_glass": "๐ฅ", + "cocktail": "๐ธ", + "tropical_drink": "๐น", + "champagne": "๐พ", + "sake": "๐ถ", + "tea": "๐ต", + "coffee": "โ", + "baby_bottle": "๐ผ", + "spoon": "๐ฅ", + "fork_and_knife": "๐ด", + "plate_with_cutlery": "๐ฝ", + "soccer": "โฝ", + "basketball": "๐", + "football": "๐", + "baseball": "โพ", + "tennis": "๐พ", + "volleyball": "๐", + "rugby_football": "๐", + "8ball": "๐ฑ", + "golf": "โณ", + "golfing_woman": "๐๏ธโโ๏ธ", + "golfing_man": "๐", + "ping_pong": "๐", + "badminton": "๐ธ", + "goal_net": "๐ฅ ", + "ice_hockey": "๐", + "field_hockey": "๐", + "cricket": "๐", + "ski": "๐ฟ", + "skier": "โท", + "snowboarder": "๐", + "person_fencing": "๐คบ", + "women_wrestling": "๐คผโโ๏ธ", + "men_wrestling": "๐คผโโ๏ธ", + "woman_cartwheeling": "๐คธโโ๏ธ", + "man_cartwheeling": "๐คธโโ๏ธ", + "woman_playing_handball": "๐คพโโ๏ธ", + "man_playing_handball": "๐คพโโ๏ธ", + "ice_skate": "โธ", + "bow_and_arrow": "๐น", + "fishing_pole_and_fish": "๐ฃ", + "boxing_glove": "๐ฅ", + "martial_arts_uniform": "๐ฅ", + "rowing_woman": "๐ฃโโ๏ธ", + "rowing_man": "๐ฃ", + "swimming_woman": "๐โโ๏ธ", + "swimming_man": "๐", + "woman_playing_water_polo": "๐คฝโโ๏ธ", + "man_playing_water_polo": "๐คฝโโ๏ธ", + "surfing_woman": "๐โโ๏ธ", + "surfing_man": "๐", + "bath": "๐", + "basketball_woman": "โน๏ธโโ๏ธ", + "basketball_man": "โน", + "weight_lifting_woman": "๐๏ธโโ๏ธ", + "weight_lifting_man": "๐", + "biking_woman": "๐ดโโ๏ธ", + "biking_man": "๐ด", + "mountain_biking_woman": "๐ตโโ๏ธ", + "mountain_biking_man": "๐ต", + "horse_racing": "๐", + "business_suit_levitating": "๐ด", + "trophy": "๐", + "running_shirt_with_sash": "๐ฝ", + "medal_sports": "๐ ", + "medal_military": "๐", + "1st_place_medal": "๐ฅ", + "2nd_place_medal": "๐ฅ", + "3rd_place_medal": "๐ฅ", + "reminder_ribbon": "๐", + "rosette": "๐ต", + "ticket": "๐ซ", + "tickets": "๐", + "performing_arts": "๐ญ", + "art": "๐จ", + "circus_tent": "๐ช", + "woman_juggling": "๐คนโโ๏ธ", + "man_juggling": "๐คนโโ๏ธ", + "microphone": "๐ค", + "headphones": "๐ง", + "musical_score": "๐ผ", + "musical_keyboard": "๐น", + "drum": "๐ฅ", + "saxophone": "๐ท", + "trumpet": "๐บ", + "guitar": "๐ธ", + "violin": "๐ป", + "clapper": "๐ฌ", + "video_game": "๐ฎ", + "space_invader": "๐พ", + "dart": "๐ฏ", + "game_die": "๐ฒ", + "slot_machine": "๐ฐ", + "bowling": "๐ณ", + "red_car": "๐", + "taxi": "๐", + "blue_car": "๐", + "bus": "๐", + "trolleybus": "๐", + "racing_car": "๐", + "police_car": "๐", + "ambulance": "๐", + "fire_engine": "๐", + "minibus": "๐", + "truck": "๐", + "articulated_lorry": "๐", + "tractor": "๐", + "kick_scooter": "๐ด", + "motorcycle": "๐", + "bike": "๐ฒ", + "motor_scooter": "๐ต", + "rotating_light": "๐จ", + "oncoming_police_car": "๐", + "oncoming_bus": "๐", + "oncoming_automobile": "๐", + "oncoming_taxi": "๐", + "aerial_tramway": "๐ก", + "mountain_cableway": "๐ ", + "suspension_railway": "๐", + "railway_car": "๐", + "train": "๐", + "monorail": "๐", + "bullettrain_side": "๐", + "bullettrain_front": "๐ ", + "light_rail": "๐", + "mountain_railway": "๐", + "steam_locomotive": "๐", + "train2": "๐", + "metro": "๐", + "tram": "๐", + "station": "๐", + "helicopter": "๐", + "small_airplane": "๐ฉ", + "airplane": "โ๏ธ", + "flight_departure": "๐ซ", + "flight_arrival": "๐ฌ", + "sailboat": "โต", + "motor_boat": "๐ฅ", + "speedboat": "๐ค", + "ferry": "โด", + "passenger_ship": "๐ณ", + "rocket": "๐", + "artificial_satellite": "๐ฐ", + "seat": "๐บ", + "canoe": "๐ถ", + "anchor": "โ", + "construction": "๐ง", + "fuelpump": "โฝ", + "busstop": "๐", + "vertical_traffic_light": "๐ฆ", + "traffic_light": "๐ฅ", + "checkered_flag": "๐", + "ship": "๐ข", + "ferris_wheel": "๐ก", + "roller_coaster": "๐ข", + "carousel_horse": "๐ ", + "building_construction": "๐", + "foggy": "๐", + "tokyo_tower": "๐ผ", + "factory": "๐ญ", + "fountain": "โฒ", + "rice_scene": "๐", + "mountain": "โฐ", + "mountain_snow": "๐", + "mount_fuji": "๐ป", + "volcano": "๐", + "japan": "๐พ", + "camping": "๐", + "tent": "โบ", + "national_park": "๐", + "motorway": "๐ฃ", + "railway_track": "๐ค", + "sunrise": "๐ ", + "sunrise_over_mountains": "๐", + "desert": "๐", + "beach_umbrella": "๐", + "desert_island": "๐", + "city_sunrise": "๐", + "city_sunset": "๐", + "cityscape": "๐", + "night_with_stars": "๐", + "bridge_at_night": "๐", + "milky_way": "๐", + "stars": "๐ ", + "sparkler": "๐", + "fireworks": "๐", + "rainbow": "๐", + "houses": "๐", + "european_castle": "๐ฐ", + "japanese_castle": "๐ฏ", + "stadium": "๐", + "statue_of_liberty": "๐ฝ", + "house": "๐ ", + "house_with_garden": "๐ก", + "derelict_house": "๐", + "office": "๐ข", + "department_store": "๐ฌ", + "post_office": "๐ฃ", + "european_post_office": "๐ค", + "hospital": "๐ฅ", + "bank": "๐ฆ", + "hotel": "๐จ", + "convenience_store": "๐ช", + "school": "๐ซ", + "love_hotel": "๐ฉ", + "wedding": "๐", + "classical_building": "๐", + "church": "โช", + "mosque": "๐", + "synagogue": "๐", + "kaaba": "๐", + "shinto_shrine": "โฉ", + "watch": "โ", + "iphone": "๐ฑ", + "calling": "๐ฒ", + "computer": "๐ป", + "keyboard": "โจ", + "desktop_computer": "๐ฅ", + "printer": "๐จ", + "computer_mouse": "๐ฑ", + "trackball": "๐ฒ", + "joystick": "๐น", + "clamp": "๐", + "minidisc": "๐ฝ", + "floppy_disk": "๐พ", + "cd": "๐ฟ", + "dvd": "๐", + "vhs": "๐ผ", + "camera": "๐ท", + "camera_flash": "๐ธ", + "video_camera": "๐น", + "movie_camera": "๐ฅ", + "film_projector": "๐ฝ", + "film_strip": "๐", + "telephone_receiver": "๐", + "phone": "โ๏ธ", + "pager": "๐", + "fax": "๐ ", + "tv": "๐บ", + "radio": "๐ป", + "studio_microphone": "๐", + "level_slider": "๐", + "control_knobs": "๐", + "stopwatch": "โฑ", + "timer_clock": "โฒ", + "alarm_clock": "โฐ", + "mantelpiece_clock": "๐ฐ", + "hourglass_flowing_sand": "โณ", + "hourglass": "โ", + "satellite": "๐ก", + "battery": "๐", + "electric_plug": "๐", + "bulb": "๐ก", + "flashlight": "๐ฆ", + "candle": "๐ฏ", + "wastebasket": "๐", + "oil_drum": "๐ข", + "money_with_wings": "๐ธ", + "dollar": "๐ต", + "yen": "๐ด", + "euro": "๐ถ", + "pound": "๐ท", + "moneybag": "๐ฐ", + "credit_card": "๐ณ", + "gem": "๐", + "balance_scale": "โ", + "wrench": "๐ง", + "hammer": "๐จ", + "hammer_and_pick": "โ", + "hammer_and_wrench": "๐ ", + "pick": "โ", + "nut_and_bolt": "๐ฉ", + "gear": "โ", + "chains": "โ", + "gun": "๐ซ", + "bomb": "๐ฃ", + "hocho": "๐ช", + "dagger": "๐ก", + "crossed_swords": "โ", + "shield": "๐ก", + "smoking": "๐ฌ", + "skull_and_crossbones": "โ ", + "coffin": "โฐ", + "funeral_urn": "โฑ", + "amphora": "๐บ", + "crystal_ball": "๐ฎ", + "prayer_beads": "๐ฟ", + "barber": "๐", + "alembic": "โ", + "telescope": "๐ญ", + "microscope": "๐ฌ", + "hole": "๐ณ", + "pill": "๐", + "syringe": "๐", + "thermometer": "๐ก", + "label": "๐ท", + "bookmark": "๐", + "toilet": "๐ฝ", + "shower": "๐ฟ", + "bathtub": "๐", + "key": "๐", + "old_key": "๐", + "couch_and_lamp": "๐", + "sleeping_bed": "๐", + "bed": "๐", + "door": "๐ช", + "bellhop_bell": "๐", + "framed_picture": "๐ผ", + "world_map": "๐บ", + "parasol_on_ground": "โฑ", + "moyai": "๐ฟ", + "shopping": "๐", + "shopping_cart": "๐", + "balloon": "๐", + "flags": "๐", + "ribbon": "๐", + "gift": "๐", + "confetti_ball": "๐", + "tada": "๐", + "dolls": "๐", + "wind_chime": "๐", + "crossed_flags": "๐", + "izakaya_lantern": "๐ฎ", + "email": "โ๏ธ", + "envelope_with_arrow": "๐ฉ", + "incoming_envelope": "๐จ", + "e-mail": "๐ง", + "love_letter": "๐", + "postbox": "๐ฎ", + "mailbox_closed": "๐ช", + "mailbox": "๐ซ", + "mailbox_with_mail": "๐ฌ", + "mailbox_with_no_mail": "๐ญ", + "package": "๐ฆ", + "postal_horn": "๐ฏ", + "inbox_tray": "๐ฅ", + "outbox_tray": "๐ค", + "scroll": "๐", + "page_with_curl": "๐", + "bookmark_tabs": "๐", + "bar_chart": "๐", + "chart_with_upwards_trend": "๐", + "chart_with_downwards_trend": "๐", + "page_facing_up": "๐", + "date": "๐ ", + "calendar": "๐", + "spiral_calendar": "๐", + "card_index": "๐", + "card_file_box": "๐", + "ballot_box": "๐ณ", + "file_cabinet": "๐", + "clipboard": "๐", + "spiral_notepad": "๐", + "file_folder": "๐", + "open_file_folder": "๐", + "card_index_dividers": "๐", + "newspaper_roll": "๐", + "newspaper": "๐ฐ", + "notebook": "๐", + "closed_book": "๐", + "green_book": "๐", + "blue_book": "๐", + "orange_book": "๐", + "notebook_with_decorative_cover": "๐", + "ledger": "๐", + "books": "๐", + "open_book": "๐", + "link": "๐", + "paperclip": "๐", + "paperclips": "๐", + "scissors": "โ๏ธ", + "triangular_ruler": "๐", + "straight_ruler": "๐", + "pushpin": "๐", + "round_pushpin": "๐", + "triangular_flag_on_post": "๐ฉ", + "white_flag": "๐ณ", + "black_flag": "๐ด", + "rainbow_flag": "๐ณ๏ธโ๐", + "closed_lock_with_key": "๐", + "lock": "๐", + "unlock": "๐", + "lock_with_ink_pen": "๐", + "pen": "๐", + "fountain_pen": "๐", + "black_nib": "โ๏ธ", + "memo": "๐", + "pencil2": "โ๏ธ", + "crayon": "๐", + "paintbrush": "๐", + "mag": "๐", + "mag_right": "๐", + "heart": "โค๏ธ", + "yellow_heart": "๐", + "green_heart": "๐", + "blue_heart": "๐", + "purple_heart": "๐", + "black_heart": "๐ค", + "broken_heart": "๐", + "heavy_heart_exclamation": "โฃ", + "two_hearts": "๐", + "revolving_hearts": "๐", + "heartbeat": "๐", + "heartpulse": "๐", + "sparkling_heart": "๐", + "cupid": "๐", + "gift_heart": "๐", + "heart_decoration": "๐", + "peace_symbol": "โฎ", + "latin_cross": "โ", + "star_and_crescent": "โช", + "om": "๐", + "wheel_of_dharma": "โธ", + "star_of_david": "โก", + "six_pointed_star": "๐ฏ", + "menorah": "๐", + "yin_yang": "โฏ", + "orthodox_cross": "โฆ", + "place_of_worship": "๐", + "ophiuchus": "โ", + "aries": "โ", + "taurus": "โ", + "gemini": "โ", + "cancer": "โ", + "leo": "โ", + "virgo": "โ", + "libra": "โ", + "scorpius": "โ", + "sagittarius": "โ", + "capricorn": "โ", + "aquarius": "โ", + "pisces": "โ", + "id": "๐", + "atom_symbol": "โ", + "u7a7a": "๐ณ", + "u5272": "๐น", + "radioactive": "โข", + "biohazard": "โฃ", + "mobile_phone_off": "๐ด", + "vibration_mode": "๐ณ", + "u6709": "๐ถ", + "u7121": "๐", + "u7533": "๐ธ", + "u55b6": "๐บ", + "u6708": "๐ท๏ธ", + "eight_pointed_black_star": "โด๏ธ", + "vs": "๐", + "accept": "๐", + "white_flower": "๐ฎ", + "ideograph_advantage": "๐", + "secret": "ใ๏ธ", + "congratulations": "ใ๏ธ", + "u5408": "๐ด", + "u6e80": "๐ต", + "u7981": "๐ฒ", + "a": "๐ ฐ๏ธ", + "b": "๐ ฑ๏ธ", + "ab": "๐", + "cl": "๐", + "o2": "๐ พ๏ธ", + "sos": "๐", + "no_entry": "โ", + "name_badge": "๐", + "no_entry_sign": "๐ซ", + "x": "โ", + "o": "โญ", + "stop_sign": "๐", + "anger": "๐ข", + "hotsprings": "โจ๏ธ", + "no_pedestrians": "๐ท", + "do_not_litter": "๐ฏ", + "no_bicycles": "๐ณ", + "non-potable_water": "๐ฑ", + "underage": "๐", + "no_mobile_phones": "๐ต", + "exclamation": "โ", + "grey_exclamation": "โ", + "question": "โ", + "grey_question": "โ", + "bangbang": "โผ๏ธ", + "interrobang": "โ๏ธ", + "low_brightness": "๐ ", + "high_brightness": "๐", + "trident": "๐ฑ", + "fleur_de_lis": "โ", + "part_alternation_mark": "ใฝ๏ธ", + "warning": "โ ๏ธ", + "children_crossing": "๐ธ", + "beginner": "๐ฐ", + "recycle": "โป๏ธ", + "u6307": "๐ฏ", + "chart": "๐น", + "sparkle": "โ๏ธ", + "eight_spoked_asterisk": "โณ๏ธ", + "negative_squared_cross_mark": "โ", + "white_check_mark": "โ ", + "diamond_shape_with_a_dot_inside": "๐ ", + "cyclone": "๐", + "loop": "โฟ", + "globe_with_meridians": "๐", + "m": "โ๏ธ", + "atm": "๐ง", + "sa": "๐๏ธ", + "passport_control": "๐", + "customs": "๐", + "baggage_claim": "๐", + "left_luggage": "๐ ", + "wheelchair": "โฟ", + "no_smoking": "๐ญ", + "wc": "๐พ", + "parking": "๐ ฟ๏ธ", + "potable_water": "๐ฐ", + "mens": "๐น", + "womens": "๐บ", + "baby_symbol": "๐ผ", + "restroom": "๐ป", + "put_litter_in_its_place": "๐ฎ", + "cinema": "๐ฆ", + "signal_strength": "๐ถ", + "koko": "๐", + "ng": "๐", + "ok": "๐", + "up": "๐", + "cool": "๐", + "new": "๐", + "free": "๐", + "zero": "0๏ธโฃ", + "one": "1๏ธโฃ", + "two": "2๏ธโฃ", + "three": "3๏ธโฃ", + "four": "4๏ธโฃ", + "five": "5๏ธโฃ", + "six": "6๏ธโฃ", + "seven": "7๏ธโฃ", + "eight": "8๏ธโฃ", + "nine": "9๏ธโฃ", + "keycap_ten": "๐", + "asterisk": "*โฃ", + "arrow_forward": "โถ๏ธ", + "pause_button": "โธ", + "next_track_button": "โญ", + "stop_button": "โน", + "record_button": "โบ", + "play_or_pause_button": "โฏ", + "previous_track_button": "โฎ", + "fast_forward": "โฉ", + "rewind": "โช", + "twisted_rightwards_arrows": "๐", + "repeat": "๐", + "repeat_one": "๐", + "arrow_backward": "โ๏ธ", + "arrow_up_small": "๐ผ", + "arrow_down_small": "๐ฝ", + "arrow_double_up": "โซ", + "arrow_double_down": "โฌ", + "arrow_right": "โก๏ธ", + "arrow_left": "โฌ ๏ธ", + "arrow_up": "โฌ๏ธ", + "arrow_down": "โฌ๏ธ", + "arrow_upper_right": "โ๏ธ", + "arrow_lower_right": "โ๏ธ", + "arrow_lower_left": "โ๏ธ", + "arrow_upper_left": "โ๏ธ", + "arrow_up_down": "โ๏ธ", + "left_right_arrow": "โ๏ธ", + "arrows_counterclockwise": "๐", + "arrow_right_hook": "โช๏ธ", + "leftwards_arrow_with_hook": "โฉ๏ธ", + "arrow_heading_up": "โคด๏ธ", + "arrow_heading_down": "โคต๏ธ", + "hash": "#๏ธโฃ", + "information_source": "โน๏ธ", + "abc": "๐ค", + "abcd": "๐ก", + "capital_abcd": "๐ ", + "symbols": "๐ฃ", + "musical_note": "๐ต", + "notes": "๐ถ", + "wavy_dash": "ใฐ๏ธ", + "curly_loop": "โฐ", + "heavy_check_mark": "โ๏ธ", + "arrows_clockwise": "๐", + "heavy_plus_sign": "โ", + "heavy_minus_sign": "โ", + "heavy_division_sign": "โ", + "heavy_multiplication_x": "โ๏ธ", + "heavy_dollar_sign": "๐ฒ", + "currency_exchange": "๐ฑ", + "copyright": "ยฉ๏ธ", + "registered": "ยฎ๏ธ", + "tm": "โข๏ธ", + "end": "๐", + "back": "๐", + "on": "๐", + "top": "๐", + "soon": "๐", + "ballot_box_with_check": "โ๏ธ", + "radio_button": "๐", + "white_circle": "โช", + "black_circle": "โซ", + "red_circle": "๐ด", + "large_blue_circle": "๐ต", + "small_orange_diamond": "๐ธ", + "small_blue_diamond": "๐น", + "large_orange_diamond": "๐ถ", + "large_blue_diamond": "๐ท", + "small_red_triangle": "๐บ", + "black_small_square": "โช๏ธ", + "white_small_square": "โซ๏ธ", + "black_large_square": "โฌ", + "white_large_square": "โฌ", + "small_red_triangle_down": "๐ป", + "black_medium_square": "โผ๏ธ", + "white_medium_square": "โป๏ธ", + "black_medium_small_square": "โพ", + "white_medium_small_square": "โฝ", + "black_square_button": "๐ฒ", + "white_square_button": "๐ณ", + "speaker": "๐", + "sound": "๐", + "loud_sound": "๐", + "mute": "๐", + "mega": "๐ฃ", + "loudspeaker": "๐ข", + "bell": "๐", + "no_bell": "๐", + "black_joker": "๐", + "mahjong": "๐", + "spades": "โ ๏ธ", + "clubs": "โฃ๏ธ", + "hearts": "โฅ๏ธ", + "diamonds": "โฆ๏ธ", + "flower_playing_cards": "๐ด", + "thought_balloon": "๐ญ", + "right_anger_bubble": "๐ฏ", + "speech_balloon": "๐ฌ", + "left_speech_bubble": "๐จ", + "clock1": "๐", + "clock2": "๐", + "clock3": "๐", + "clock4": "๐", + "clock5": "๐", + "clock6": "๐", + "clock7": "๐", + "clock8": "๐", + "clock9": "๐", + "clock10": "๐", + "clock11": "๐", + "clock12": "๐", + "clock130": "๐", + "clock230": "๐", + "clock330": "๐", + "clock430": "๐", + "clock530": "๐ ", + "clock630": "๐ก", + "clock730": "๐ข", + "clock830": "๐ฃ", + "clock930": "๐ค", + "clock1030": "๐ฅ", + "clock1130": "๐ฆ", + "clock1230": "๐ง", + "afghanistan": "๐ฆ๐ซ", + "aland_islands": "๐ฆ๐ฝ", + "albania": "๐ฆ๐ฑ", + "algeria": "๐ฉ๐ฟ", + "american_samoa": "๐ฆ๐ธ", + "andorra": "๐ฆ๐ฉ", + "angola": "๐ฆ๐ด", + "anguilla": "๐ฆ๐ฎ", + "antarctica": "๐ฆ๐ถ", + "antigua_barbuda": "๐ฆ๐ฌ", + "argentina": "๐ฆ๐ท", + "armenia": "๐ฆ๐ฒ", + "aruba": "๐ฆ๐ผ", + "australia": "๐ฆ๐บ", + "austria": "๐ฆ๐น", + "azerbaijan": "๐ฆ๐ฟ", + "bahamas": "๐ง๐ธ", + "bahrain": "๐ง๐ญ", + "bangladesh": "๐ง๐ฉ", + "barbados": "๐ง๐ง", + "belarus": "๐ง๐พ", + "belgium": "๐ง๐ช", + "belize": "๐ง๐ฟ", + "benin": "๐ง๐ฏ", + "bermuda": "๐ง๐ฒ", + "bhutan": "๐ง๐น", + "bolivia": "๐ง๐ด", + "caribbean_netherlands": "๐ง๐ถ", + "bosnia_herzegovina": "๐ง๐ฆ", + "botswana": "๐ง๐ผ", + "brazil": "๐ง๐ท", + "british_indian_ocean_territory": "๐ฎ๐ด", + "british_virgin_islands": "๐ป๐ฌ", + "brunei": "๐ง๐ณ", + "bulgaria": "๐ง๐ฌ", + "burkina_faso": "๐ง๐ซ", + "burundi": "๐ง๐ฎ", + "cape_verde": "๐จ๐ป", + "cambodia": "๐ฐ๐ญ", + "cameroon": "๐จ๐ฒ", + "canada": "๐จ๐ฆ", + "canary_islands": "๐ฎ๐จ", + "cayman_islands": "๐ฐ๐พ", + "central_african_republic": "๐จ๐ซ", + "chad": "๐น๐ฉ", + "chile": "๐จ๐ฑ", + "cn": "๐จ๐ณ", + "christmas_island": "๐จ๐ฝ", + "cocos_islands": "๐จ๐จ", + "colombia": "๐จ๐ด", + "comoros": "๐ฐ๐ฒ", + "congo_brazzaville": "๐จ๐ฌ", + "congo_kinshasa": "๐จ๐ฉ", + "cook_islands": "๐จ๐ฐ", + "costa_rica": "๐จ๐ท", + "croatia": "๐ญ๐ท", + "cuba": "๐จ๐บ", + "curacao": "๐จ๐ผ", + "cyprus": "๐จ๐พ", + "czech_republic": "๐จ๐ฟ", + "denmark": "๐ฉ๐ฐ", + "djibouti": "๐ฉ๐ฏ", + "dominica": "๐ฉ๐ฒ", + "dominican_republic": "๐ฉ๐ด", + "ecuador": "๐ช๐จ", + "egypt": "๐ช๐ฌ", + "el_salvador": "๐ธ๐ป", + "equatorial_guinea": "๐ฌ๐ถ", + "eritrea": "๐ช๐ท", + "estonia": "๐ช๐ช", + "ethiopia": "๐ช๐น", + "eu": "๐ช๐บ", + "falkland_islands": "๐ซ๐ฐ", + "faroe_islands": "๐ซ๐ด", + "fiji": "๐ซ๐ฏ", + "finland": "๐ซ๐ฎ", + "fr": "๐ซ๐ท", + "french_guiana": "๐ฌ๐ซ", + "french_polynesia": "๐ต๐ซ", + "french_southern_territories": "๐น๐ซ", + "gabon": "๐ฌ๐ฆ", + "gambia": "๐ฌ๐ฒ", + "georgia": "๐ฌ๐ช", + "de": "๐ฉ๐ช", + "ghana": "๐ฌ๐ญ", + "gibraltar": "๐ฌ๐ฎ", + "greece": "๐ฌ๐ท", + "greenland": "๐ฌ๐ฑ", + "grenada": "๐ฌ๐ฉ", + "guadeloupe": "๐ฌ๐ต", + "guam": "๐ฌ๐บ", + "guatemala": "๐ฌ๐น", + "guernsey": "๐ฌ๐ฌ", + "guinea": "๐ฌ๐ณ", + "guinea_bissau": "๐ฌ๐ผ", + "guyana": "๐ฌ๐พ", + "haiti": "๐ญ๐น", + "honduras": "๐ญ๐ณ", + "hong_kong": "๐ญ๐ฐ", + "hungary": "๐ญ๐บ", + "iceland": "๐ฎ๐ธ", + "india": "๐ฎ๐ณ", + "indonesia": "๐ฎ๐ฉ", + "iran": "๐ฎ๐ท", + "iraq": "๐ฎ๐ถ", + "ireland": "๐ฎ๐ช", + "isle_of_man": "๐ฎ๐ฒ", + "israel": "๐ฎ๐ฑ", + "it": "๐ฎ๐น", + "cote_divoire": "๐จ๐ฎ", + "jamaica": "๐ฏ๐ฒ", + "jp": "๐ฏ๐ต", + "jersey": "๐ฏ๐ช", + "jordan": "๐ฏ๐ด", + "kazakhstan": "๐ฐ๐ฟ", + "kenya": "๐ฐ๐ช", + "kiribati": "๐ฐ๐ฎ", + "kosovo": "๐ฝ๐ฐ", + "kuwait": "๐ฐ๐ผ", + "kyrgyzstan": "๐ฐ๐ฌ", + "laos": "๐ฑ๐ฆ", + "latvia": "๐ฑ๐ป", + "lebanon": "๐ฑ๐ง", + "lesotho": "๐ฑ๐ธ", + "liberia": "๐ฑ๐ท", + "libya": "๐ฑ๐พ", + "liechtenstein": "๐ฑ๐ฎ", + "lithuania": "๐ฑ๐น", + "luxembourg": "๐ฑ๐บ", + "macau": "๐ฒ๐ด", + "macedonia": "๐ฒ๐ฐ", + "madagascar": "๐ฒ๐ฌ", + "malawi": "๐ฒ๐ผ", + "malaysia": "๐ฒ๐พ", + "maldives": "๐ฒ๐ป", + "mali": "๐ฒ๐ฑ", + "malta": "๐ฒ๐น", + "marshall_islands": "๐ฒ๐ญ", + "martinique": "๐ฒ๐ถ", + "mauritania": "๐ฒ๐ท", + "mauritius": "๐ฒ๐บ", + "mayotte": "๐พ๐น", + "mexico": "๐ฒ๐ฝ", + "micronesia": "๐ซ๐ฒ", + "moldova": "๐ฒ๐ฉ", + "monaco": "๐ฒ๐จ", + "mongolia": "๐ฒ๐ณ", + "montenegro": "๐ฒ๐ช", + "montserrat": "๐ฒ๐ธ", + "morocco": "๐ฒ๐ฆ", + "mozambique": "๐ฒ๐ฟ", + "myanmar": "๐ฒ๐ฒ", + "namibia": "๐ณ๐ฆ", + "nauru": "๐ณ๐ท", + "nepal": "๐ณ๐ต", + "netherlands": "๐ณ๐ฑ", + "new_caledonia": "๐ณ๐จ", + "new_zealand": "๐ณ๐ฟ", + "nicaragua": "๐ณ๐ฎ", + "niger": "๐ณ๐ช", + "nigeria": "๐ณ๐ฌ", + "niue": "๐ณ๐บ", + "norfolk_island": "๐ณ๐ซ", + "northern_mariana_islands": "๐ฒ๐ต", + "north_korea": "๐ฐ๐ต", + "norway": "๐ณ๐ด", + "oman": "๐ด๐ฒ", + "pakistan": "๐ต๐ฐ", + "palau": "๐ต๐ผ", + "palestinian_territories": "๐ต๐ธ", + "panama": "๐ต๐ฆ", + "papua_new_guinea": "๐ต๐ฌ", + "paraguay": "๐ต๐พ", + "peru": "๐ต๐ช", + "philippines": "๐ต๐ญ", + "pitcairn_islands": "๐ต๐ณ", + "poland": "๐ต๐ฑ", + "portugal": "๐ต๐น", + "puerto_rico": "๐ต๐ท", + "qatar": "๐ถ๐ฆ", + "reunion": "๐ท๐ช", + "romania": "๐ท๐ด", + "ru": "๐ท๐บ", + "rwanda": "๐ท๐ผ", + "st_barthelemy": "๐ง๐ฑ", + "st_helena": "๐ธ๐ญ", + "st_kitts_nevis": "๐ฐ๐ณ", + "st_lucia": "๐ฑ๐จ", + "st_pierre_miquelon": "๐ต๐ฒ", + "st_vincent_grenadines": "๐ป๐จ", + "samoa": "๐ผ๐ธ", + "san_marino": "๐ธ๐ฒ", + "sao_tome_principe": "๐ธ๐น", + "saudi_arabia": "๐ธ๐ฆ", + "senegal": "๐ธ๐ณ", + "serbia": "๐ท๐ธ", + "seychelles": "๐ธ๐จ", + "sierra_leone": "๐ธ๐ฑ", + "singapore": "๐ธ๐ฌ", + "sint_maarten": "๐ธ๐ฝ", + "slovakia": "๐ธ๐ฐ", + "slovenia": "๐ธ๐ฎ", + "solomon_islands": "๐ธ๐ง", + "somalia": "๐ธ๐ด", + "south_africa": "๐ฟ๐ฆ", + "south_georgia_south_sandwich_islands": "๐ฌ๐ธ", + "kr": "๐ฐ๐ท", + "south_sudan": "๐ธ๐ธ", + "es": "๐ช๐ธ", + "sri_lanka": "๐ฑ๐ฐ", + "sudan": "๐ธ๐ฉ", + "suriname": "๐ธ๐ท", + "swaziland": "๐ธ๐ฟ", + "sweden": "๐ธ๐ช", + "switzerland": "๐จ๐ญ", + "syria": "๐ธ๐พ", + "taiwan": "๐น๐ผ", + "tajikistan": "๐น๐ฏ", + "tanzania": "๐น๐ฟ", + "thailand": "๐น๐ญ", + "timor_leste": "๐น๐ฑ", + "togo": "๐น๐ฌ", + "tokelau": "๐น๐ฐ", + "tonga": "๐น๐ด", + "trinidad_tobago": "๐น๐น", + "tunisia": "๐น๐ณ", + "tr": "๐น๐ท", + "turkmenistan": "๐น๐ฒ", + "turks_caicos_islands": "๐น๐จ", + "tuvalu": "๐น๐ป", + "uganda": "๐บ๐ฌ", + "ukraine": "๐บ๐ฆ", + "united_arab_emirates": "๐ฆ๐ช", + "uk": "๐ฌ๐ง", + "us": "๐บ๐ธ", + "us_virgin_islands": "๐ป๐ฎ", + "uruguay": "๐บ๐พ", + "uzbekistan": "๐บ๐ฟ", + "vanuatu": "๐ป๐บ", + "vatican_city": "๐ป๐ฆ", + "venezuela": "๐ป๐ช", + "vietnam": "๐ป๐ณ", + "wallis_futuna": "๐ผ๐ซ", + "western_sahara": "๐ช๐ญ", + "yemen": "๐พ๐ช", + "zambia": "๐ฟ๐ฒ", + "zimbabwe": "๐ฟ๐ผ" +} \ No newline at end of file diff --git a/client/js/lounge.js b/client/js/lounge.js index e9b78f2f..327808dd 100644 --- a/client/js/lounge.js +++ b/client/js/lounge.js @@ -2,12 +2,14 @@ // vendor libraries require("jquery-ui/ui/widgets/sortable"); +require("jquery-textcomplete"); const $ = require("jquery"); const moment = require("moment"); const Mousetrap = require("mousetrap"); const URI = require("urijs"); // our libraries +const emojiMap = require("./libs/simplemap.json"); require("./libs/jquery/inputhistory"); require("./libs/jquery/stickyscroll"); require("./libs/jquery/tabcomplete"); @@ -41,6 +43,73 @@ $(function() { var favicon = $("#favicon"); + // Autocompletion Strategies + + const emojiStrategy = { + id: "emoji", + match: /\B:([-+\w]*)$/, + search(term, callback) { + callback(Object.keys(emojiMap).filter(name => name.indexOf(term) === 0)); + }, + template(value) { + return `${emojiMap[value]} ${value}`; + }, + replace(value) { + return emojiMap[value]; + }, + index: 1 + }; + + const nicksStrategy = { + id: "nicks", + match: /\B(@([a-zA-Z_[\]\\^{}|`@][a-zA-Z0-9_[\]\\^{}|`-]*)?)$/, + search(term, callback) { + term = term.slice(1); + if (term[0] === "@") { + callback(completeNicks(term.slice(1)).map(val => "@" + val)); + } else { + callback(completeNicks(term)); + } + }, + template(value) { + return value; + }, + replace(value) { + return value; + }, + index: 1 + }; + + const chanStrategy = { + id: "chans", + match: /\B((#|\+|&|![A-Z0-9]{5})([^\x00\x0A\x0D\x20\x2C\x3A]+(:[^\x00\x0A\x0D\x20\x2C\x3A]*)?)?)$/, + search(term, callback, match) { + callback(completeChans(match[0])); + }, + template(value) { + return value; + }, + replace(value) { + return value; + }, + index: 1 + }; + + const commandStrategy = { + id: "commands", + match: /^\/(\w*)$/, + search(term, callback) { + callback(completeCommands("/" + term)); + }, + template(value) { + return value; + }, + replace(value) { + return value; + }, + index: 1 + }; + socket.on("auth", function(data) { var login = $("#sign-in"); var token; @@ -638,7 +707,18 @@ $(function() { chat.find(".chan.active .chat").trigger("msg.sticky"); // fix growing }) - .tab(complete, {hint: false}); + .tab(completeNicks, {hint: false}) + .textcomplete([emojiStrategy, nicksStrategy, chanStrategy, commandStrategy], { + dropdownClassName: "textcomplete-menu", + placement: "top" + }).on({ + "textComplete:show": function() { + $(this).data("autocompleting", true); + }, + "textComplete:hide": function() { + $(this).data("autocompleting", false); + } + }); var focus = $.noop; if (!("ontouchstart" in window || navigator.maxTouchPoints > 0)) { @@ -1272,18 +1352,31 @@ $(function() { .find(".messages .msg, .date-marker").remove(); } - function complete(word) { - var words = constants.commands.slice(); - var users = chat.find(".active").find(".users"); - var nicks = users.data("nicks"); + function completeNicks(word) { + const users = chat.find(".active").find(".users"); + const words = users.data("nicks"); - for (var i in nicks) { - words.push(nicks[i]); - } + return $.grep( + words, + w => !w.toLowerCase().indexOf(word.toLowerCase()) + ); + } + + function completeCommands(word) { + const words = constants.commands.slice(); + + return $.grep( + words, + w => !w.toLowerCase().indexOf(word.toLowerCase()) + ); + } + + function completeChans(word) { + const words = []; sidebar.find(".chan") .each(function() { - var self = $(this); + const self = $(this); if (!self.hasClass("lobby")) { words.push(self.data("title")); } @@ -1291,9 +1384,7 @@ $(function() { return $.grep( words, - function(w) { - return !w.toLowerCase().indexOf(word.toLowerCase()); - } + w => !w.toLowerCase().indexOf(word.toLowerCase()) ); } diff --git a/package.json b/package.json index 447d0e43..fc8693d7 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "handlebars": "4.0.6", "handlebars-loader": "1.5.0", "jquery": "3.2.1", + "jquery-textcomplete": "1.8.0", "jquery-ui": "1.12.1", "mocha": "3.3.0", "mousetrap": "1.6.1", diff --git a/webpack.config.js b/webpack.config.js index b54015cb..0cdd6833 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -13,6 +13,7 @@ let config = { "js/bundle.vendor.js": [ "handlebars/runtime", "jquery", + "jquery-textcomplete", "jquery-ui/ui/widgets/sortable", "moment", "mousetrap",