Class: RageFlip::Emote

Inherits:
Object
  • Object
show all
Defined in:
lib/rage_flip/emote.rb

Constant Summary collapse

EMOTES =
{
  # Custom ASCII Art and Text Emotes
  "disapproval" => "(ಠ_ಠ)",
  "bugeyes" => "(⊙_◎)",
  "dogshrug" => '¯\_🐶_/¯',
  "facepalm" => "(-‸ლ)",
  "flip" => "(╯°□°)╯︵ ┻━┻",
  "fu" => "t(-__-t)",
  "heresatable" => "┬─┬ ノ( ゜-゜ノ)",
  "javaflip" => "(╯°□°)╯︵ ┻ɐʌɐɾ┻",
  "kungfuhamster" => "    ()__()\n    / o o\\   ;\n   |'=Y=';-/\n   { \\  / }\n    mmm mmm   ",
  "omw" => "On my way!",
  "rage" => "ಠ益ಠ",
  "rageflip" => "(ノಠ益ಠ)ノ彡┻━┻",
  "rockhand" => '\m/ (>_<) \m/',
  "shrug" => '¯\_(ツ)_/¯',
  "shrugtable" => '┻━┻ ︵ ¯\(ツ)/¯ ︵ ┻━┻',
  "unsee" => "♨_♨",
  "yuno" => "ლ(ಠ益ಠლ)",

  # Keyboard Shortcuts
  "cmd-" => "⌘-",
  "cmd" => "",
  "command" => "",
  "cntl" => "",
  "optn" => "",
  "option" => "",
  "shft" => "",
  "shift" => "",

  # Smileys & People
  "grin" => "😀",
  "smiley" => "😃",
  "smile" => "😄",
  "grinning" => "😁",
  "laughing" => "😆",
  "sweat_smile" => "😅",
  "rofl" => "🤣",
  "joy" => "😂",
  "slightsmile" => "🙂",
  "upsidedown" => "🙃",
  "meltingface" => "🫠",
  "wink" => "😉",
  "blush" => "😊",
  "innocent" => "😇",
  "hearteyessmile" => "🥰",
  "hearteyes" => "😍",
  "starstruck" => "🤩",
  "kissing" => "😗",
  "kissingheart" => "😘",
  "relaxed" => "☺️",
  "kissingclosedeyes" => "😚",
  "kissingsmile" => "😙",
  "yum" => "😋",
  "tongueout" => "😛",
  "tonguewink" => "😜",
  "zany" => "🤪",
  "tongueclosedeyes" => "😝",
  "moneymouth" => "🤑",
  "hugs" => "🤗",
  "handovermouth" => "🤭",
  "shush" => "🫢",
  "thinking" => "🤔",
  "salute" => "🫡",
  "zipper" => "🤐",
  "raisedeyebrow" => "🤨",
  "neutral" => "😐",
  "expressionless" => "😑",
  "nomouth" => "😶",
  "dottedline" => "🫥",
  "cloudface" => "😶‍🌫️",
  "smirk" => "😏",
  "unamused" => "😒",
  "eyeroll" => "🙄",
  "grimace" => "😬",
  "cringe" => "😬",
  "lyingface" => "🤥",
  "shakingface" => "🫨",
  "relieved" => "😌",
  "pensive" => "😔",
  "sleepy" => "😪",
  "drool" => "🤤",
  "sleeping" => "😴",
  "mask" => "😷",
  "sick" => "🤒",
  "bandage" => "🤕",
  "nauseated" => "🤢",
  "vomit" => "🤮",
  "sneeze" => "🤧",
  "hot" => "🥵",
  "cold" => "🥶",
  "woozy" => "🥴",
  "dizzy" => "😵",
  "spiraleyes" => "😵‍💫",
  "explodinghead" => "🤯",
  "cowboy" => "🤠",
  "party" => "🥳",
  "disguised" => "🥸",
  "sunglasses" => "😎",
  "nerd" => "🤓",
  "monocle" => "🧐",
  "confused" => "😕",
  "faceexhaling" => "😮‍💨",
  "worried" => "😟",
  "slightfrown" => "🙁",
  "frown" => "☹️",
  "openmouth" => "😮",
  "hushed" => "😯",
  "astonished" => "😲",
  "flushed" => "😳",
  "pleading" => "🥺",
  "holdingbacktears" => "🥹",
  "frowning" => "😦",
  "anguished" => "😧",
  "fearful" => "😨",
  "anxious" => "😰",
  "sad" => "😥",
  "cry" => "😢",
  "sob" => "😭",
  "scream" => "😱",
  "omg" => "😱",
  "confounded" => "😖",
  "persevere" => "😣",
  "disappointed" => "😞",
  "sweat" => "😓",
  "weary" => "😩",
  "tired" => "😫",
  "yawning" => "🥱",
  "triumph" => "😤",
  "pout" => "😡",
  "angry" => "😠",
  "cursing" => "🤬",
  "smiling_imp" => "😈",
  "imp" => "👿",
  "skull" => "💀",
  "crossbones" => "☠️",
  "clown" => "🤡",
  "poop" => "💩",
  "ghost" => "👻",
  "alien" => "👽",
  "alienmonster" => "👾",
  "robot" => "🤖",
  "smilingcat" => "😺",
  "grincat" => "😸",
  "joycat" => "😹",
  "heartcat" => "😻",
  "smirkcat" => "😼",
  "kissingcat" => "😽",
  "screamcat" => "🙀",
  "omgcat" => "🙀",
  "cryingcat" => "😿",
  "poutcat" => "😾",
  "heart" => "❤️",
  "orange_heart" => "🧡",
  "yellow_heart" => "💛",
  "green_heart" => "💚",
  "blue_heart" => "💙",
  "purple_heart" => "💜",
  "brown_heart" => "🤎",
  "black_heart" => "🖤",
  "grey_heart" => "🩶",
  "white_heart" => "🤍",
  "pinkheart" => "🩷",
  "lightheart" => "🩵",
  "broken_heart" => "💔",
  "heartexclamation" => "❣️",
  "twohearts" => "💕",
  "revolvingheart" => "💞",
  "heartbeat" => "💓",
  "growingheart" => "💗",
  "sparklingheart" => "💖",
  "heartarrow" => "💘",
  "loveeyes" => "😍",
  "kiss" => "💋",
  "envelope" => "💌",
  "cupid" => "💘",
  "bouquet" => "💐",
  "fire" => "🔥",
  "heartfire" => "❤️‍🔥",
  "mendingeart" => "❤️‍🩹",
  "sparkles" => "",
  "star" => "",
  "dizzystar" => "💫",
  "sweat_drops" => "💦",
  "dash" => "💨",
  "boom" => "💥",
  "wave" => "👋",
  "raisedback" => "🤚",
  "splayed" => "🖐️",
  "hand" => "",
  "vulcan" => "🖖",
  "rightwardshand" => "🫱",
  "leftwardshand" => "🫲",
  "palmdown" => "🫳",
  "palmup" => "🫴",
  "leftwardspush" => "🫷",
  "rightwardspush" => "🫸",
  "okhand" => "👌",
  "pinched" => "🤌",
  "pinching" => "🤏",
  "v" => "✌️",
  "crossed" => "🤞",
  "indexpoint" => "🫰",
  "iloveyou" => "🤟",
  "metal" => "🤘",
  "callme" => "🤙",
  "pointleft" => "👈",
  "pointright" => "👉",
  "pointup" => "👆",
  "middlefinger" => "🖕",
  "pointdown" => "👇",
  "pointup2" => "☝️",
  "indexleft" => "🫵",
  "thumbsup" => "👍",
  "thumbsdown" => "👎",
  "fist" => "",
  "facepunch" => "👊",
  "leftfist" => "🤛",
  "rightfist" => "🤜",
  "clap" => "👏",
  "raisehands" => "🙌",
  "hearthand" => "🫶",
  "openhands" => "👐",
  "palmsup" => "🤲",
  "handshake" => "🤝",
  "pray" => "🙏",
  "writing" => "✍️",
  "nails" => "💅",
  "selfie" => "🤳",
  "muscle" => "💪",
  "mechanicalarm" => "🦾",
  "mechanicalleg" => "🦿",
  "leg" => "🦵",
  "foot" => "🦶",
  "ear" => "👂",
  "earwithhearing" => "🦻",
  "nose" => "👃",
  "brain" => "🧠",
  "anatomicalheart" => "🫀",
  "lungs" => "🫁",
  "tooth" => "🦷",
  "bone" => "🦴",
  "eyes" => "👀",
  "eye" => "👁️",
  "tongue" => "👅",
  "lips" => "👄",
  "bitinglip" => "🫦",

  # Animals & Nature
  "monkey" => "🐵",
  "monkeyface" => "🐒",
  "gorilla" => "🦍",
  "orangutan" => "🦧",
  "dog" => "🐶",
  "dogface" => "🐕",
  "guidedog" => "🦮",
  "servicedog" => "🐕‍🦺",
  "poodle" => "🐩",
  "wolf" => "🐺",
  "fox" => "🦊",
  "raccoon" => "🦝",
  "cat" => "🐱",
  "catface" => "🐈",
  "blackcat" => "🐈‍⬛",
  "lion" => "🦁",
  "tiger" => "🐯",
  "tigerface" => "🐅",
  "leopard" => "🐆",
  "horse" => "🐴",
  "moose" => "🫎",
  "donkey" => "🫏",
  "horseface" => "🐎",
  "unicorn" => "🦄",
  "zebra" => "🦓",
  "deer" => "🦌",
  "bison" => "🦬",
  "cow" => "🐮",
  "ox" => "🐂",
  "waterbuffalo" => "🐃",
  "cowface" => "🐄",
  "pig" => "🐷",
  "pigface" => "🐖",
  "boar" => "🐗",
  "piglips" => "🐽",
  "ram" => "🐏",
  "sheep" => "🐑",
  "goat" => "🐐",
  "camel" => "🐪",
  "twohump" => "🐫",
  "llama" => "🦙",
  "giraffe" => "🦒",
  "elephant" => "🐘",
  "mammoth" => "🦣",
  "rhino" => "🦏",
  "hippo" => "🦛",
  "mouse" => "🐭",
  "mouseface" => "🐁",
  "rat" => "🐀",
  "hamster" => "🐹",
  "rabbit" => "🐰",
  "rabbitface" => "🐇",
  "chipmunk" => "🐿️",
  "beaver" => "🦫",
  "hedgehog" => "🦔",
  "bat" => "🦇",
  "bear" => "🐻",
  "polarbear" => "🐻‍❄️",
  "koala" => "🐨",
  "panda" => "🐼",
  "sloth" => "🦥",
  "otter" => "🦦",
  "skunk" => "🦨",
  "kangaroo" => "🦘",
  "badger" => "🦡",
  "pawprints" => "🐾",
  "turkeybird" => "🦃",
  "chicken" => "🐔",
  "rooster" => "🐓",
  "hatchingchick" => "🐣",
  "babychick" => "🐤",
  "chick" => "🐥",
  "bird" => "🐦",
  "penguin" => "🐧",
  "dove" => "🕊️",
  "eagle" => "🦅",
  "duck" => "🦆",
  "swan" => "🦢",
  "owl" => "🦉",
  "dodo" => "🦤",
  "feather" => "🪶",
  "flamingo" => "🦩",
  "peacock" => "🦚",
  "parrot" => "🦜",
  "wing" => "🪽",
  "blackbird" => "🐦‍⬛",
  "goose" => "🪿",
  "frog" => "🐸",
  "crocodile" => "🐊",
  "turtle" => "🐢",
  "lizard" => "🦎",
  "snake" => "🐍",
  "dragon" => "🐲",
  "dragonface" => "🐉",
  "sauropod" => "🦕",
  "trex" => "🦖",
  "whale" => "🐳",
  "whaleface" => "🐋",
  "dolphin" => "🐬",
  "seal" => "🦭",
  "fish" => "🐟",
  "tropicalfish" => "🐠",
  "blowfish" => "🐡",
  "shark" => "🦈",
  "octopus" => "🐙",
  "shell" => "🐚",
  "coral" => "🪸",
  "jellyfish" => "🪼",
  "snail" => "🐌",
  "butterfly" => "🦋",
  "bug" => "🐛",
  "ant" => "🐜",
  "bee" => "🐝",
  "beetle" => "🪲",
  "ladybug" => "🐞",
  "cricketbug" => "🦗",
  "cockroach" => "🪳",
  "spider" => "🕷️",
  "web" => "🕸️",
  "scorpion" => "🦂",
  "mosquito" => "🦟",
  "fly" => "🪰",
  "worm" => "🪱",
  "microbe" => "🦠",
  "flowers" => "💐",
  "cherryblossom" => "🌸",
  "whiteblossom" => "💮",
  "lotusflower" => "🪷",
  "rosetteflower" => "🏵️",
  "rose" => "🌹",
  "wilted" => "🥀",
  "hibiscus" => "🌺",
  "sunflower" => "🌻",
  "blossom" => "🌼",
  "tulip" => "🌷",
  "hyacinth" => "🪻",
  "seedling" => "🌱",
  "potplant" => "🪴",
  "tree" => "🌲",
  "deciduoustree" => "🌳",
  "palm" => "🌴",
  "cactus" => "🌵",
  "grain" => "🌾",
  "herb" => "🌿",
  "shamrock" => "☘️",
  "clover" => "🍀",
  "maple" => "🍁",
  "fallenleaf" => "🍂",
  "leaves" => "🍃",
  "emptyness" => "🪹",
  "eggsnest" => "🪺",
  "mushroom" => "🍄",

  # Combined/Custom Emotes
  "bullshit" => "🐄💩",
  "catshit" => "🐱💩",
  "dogshit" => "🐶💩",
  "pandashit" => "🐼💩",
  "horseshit" => "🐴💩",
  "koalashit" => "🐨💩",
  "batshit" => "🦇💩",
  "shboatload" => "💩🚢",
  "noevil" => "🙈🙉🙊",

  # Food & Drink
  "grapes" => "🍇",
  "melon" => "🍈",
  "watermelon" => "🍉",
  "tangerine" => "🍊",
  "lemon" => "🍋",
  "banana" => "🍌",
  "pineapple" => "🍍",
  "mango" => "🥭",
  "apple" => "🍎",
  "greenapple" => "🍏",
  "pear" => "🍐",
  "peach" => "🍑",
  "cherries" => "🍒",
  "strawberry" => "🍓",
  "blueberries" => "🫐",
  "kiwi" => "🥝",
  "tomato" => "🍅",
  "olive" => "🫒",
  "coconut" => "🥥",
  "avocado" => "🥑",
  "eggplant" => "🍆",
  "potato" => "🥔",
  "carrot" => "🥕",
  "corn" => "🌽",
  "hotpepper" => "🌶️",
  "bellpepper" => "🫑",
  "cucumber" => "🥒",
  "leafy" => "🥬",
  "broccoli" => "🥦",
  "garlic" => "🧄",
  "onion" => "🧅",
  "peanuts" => "🥜",
  "beans" => "🫘",
  "chestnut" => "🌰",
  "ginger" => "🫚",
  "peas" => "🫛",
  "bread" => "🍞",
  "croissant" => "🥐",
  "baguette" => "🥖",
  "flatbread" => "🫓",
  "pretzel" => "🥨",
  "bagel" => "🥯",
  "pancakes" => "🥞",
  "waffle" => "🧇",
  "cheese" => "🧀",
  "meat" => "🍖",
  "poultryleg" => "🍗",
  "cutmeat" => "🥩",
  "bacon" => "🥓",
  "hamburger" => "🍔",
  "fries" => "🍟",
  "pizza" => "🍕",
  "hotdog" => "🌭",
  "sandwich" => "🥪",
  "taco" => "🌮",
  "burrito" => "🌯",
  "tamale" => "🫔",
  "stuffedflatbread" => "🥙",
  "falafel" => "🧆",
  "egg" => "🥚",
  "cooking" => "🍳",
  "paella" => "🥘",
  "fondue" => "🫕",
  "pot" => "🍲",
  "bowl" => "🥣",
  "salad" => "🥗",
  "popcorn" => "🍿",
  "butter" => "🧈",
  "salt" => "🧂",
  "cannedstuff" => "🥫",
  "bento" => "🍱",
  "ricecrackers" => "🍘",
  "riceball" => "🍙",
  "rice" => "🍚",
  "curry" => "🍛",
  "ramen" => "🍜",
  "spaghetti" => "🍝",
  "sweetpotato" => "🍠",
  "oden" => "🍢",
  "sushi" => "🍣",
  "friedshrimp" => "🍤",
  "fishcake" => "🍥",
  "mooncake" => "🥮",
  "dango" => "🍡",
  "dumpling" => "🥟",
  "fortunecookie" => "🥠",
  "takeout" => "🥡",
  "crab" => "🦀",
  "lobster" => "🦞",
  "shrimp" => "🦐",
  "squid" => "🦑",
  "oyster" => "🦪",
  "icecream" => "🍦",
  "shavice" => "🍧",
  "softice" => "🍨",
  "doughnut" => "🍩",
  "cookie" => "🍪",
  "birthdaycake" => "🎂",
  "shortcake" => "🍰",
  "cupcake" => "🧁",
  "pie" => "🥧",
  "chocbar" => "🍫",
  "candy" => "🍬",
  "lollipop" => "🍭",
  "custard" => "🍮",
  "honeypot" => "🍯",
  "babybottle" => "🍼",
  "milk" => "🥛",
  "coffee" => "",
  "teapot" => "🫖",
  "tea" => "🍵",
  "sake" => "🍶",
  "champagne" => "🍾",
  "wine" => "🍷",
  "cocktail" => "🍸",
  "tropical" => "🍹",
  "beer" => "🍺",
  "beers" => "🍻",
  "clinking" => "🥂",
  "tumbler" => "🥃",
  "pouringdrink" => "🫗",
  "cupstraw" => "🥤",
  "beverage" => "🧋",
  "mate" => "🧉",
  "icecube" => "🧊",
  "chopsticks" => "🥢",
  "platefork" => "🍽️",
  "forkknife" => "🍴",
  "spoon" => "🥄",
  "knife" => "🔪",
  "jar" => "🫙",
  "amphora" => "🏺",

  # Activity
  "soccer" => "",
  "basketball" => "🏀",
  "football" => "🏈",
  "baseball" => "",
  "softball" => "🥎",
  "tennis" => "🎾",
  "volleyball" => "🏐",
  "rugby" => "🏉",
  "frisbee" => "🥏",
  "8ball" => "🎱",
  "pingpong" => "🏓",
  "badminton" => "🏸",
  "hockeystick" => "🏒",
  "fieldhockey" => "🏑",
  "lacrosse" => "🥍",
  "cricket" => "🏏",
  "goal" => "🥅",
  "golfclub" => "",
  "boomerang" => "🪃",
  "archery" => "🏹",
  "fishingpole" => "🎣",
  "divingmask" => "🤿",
  "boxingglove" => "🥊",
  "karate" => "🥋",
  "running" => "🏃",
  "walking" => "🚶",
  "standingperson" => "🧍",
  "kneelingperson" => "🧎",
  "wheelchair" => "🦽",
  "motorizedwheelchair" => "🦼",
  "dancer" => "💃",
  "dancing" => "🕺",
  "suit" => "🕴️",
  "couple" => "👫",
  "twomen" => "👬",
  "twowomen" => "👭",
  "personwhitecane" => "🧑‍🦯",
  "personmotorized" => "🧑‍🦽",
  "personmanual" => "🧑‍🦼",
  "runners" => "🏃‍♀️",
  "skier" => "⛷️",
  "snowboarder" => "🏂",
  "climber" => "🧗",
  "fencer" => "🤺",
  "horseracing" => "🏇",
  "skater" => "⛸️",
  "lifter" => "🏋️",
  "biker" => "🚴",
  "mountainbiker" => "🚵",
  "cartwheel" => "🤸",
  "wrestlers" => "🤼",
  "waterpolo" => "🤽",
  "handball" => "🤾",
  "juggling" => "🤹",
  "lotus" => "🧘",
  "bath" => "🛀",
  "bed" => "🛌",
  "trophy" => "🏆",
  "medal" => "🏅",
  "goldmedal" => "🥇",
  "silvermedal" => "🥈",
  "bronzemedal" => "🥉",
  "sportsmedal" => "🏅",
  "rosette" => "🏵️",
  "ribbon" => "🎀",
  "ticket" => "🎫",
  "tickets" => "🎟️",
  "performingarts" => "🎭",
  "art" => "🎨",
  "circus" => "🎪",
  "microphone" => "🎤",
  "headphones" => "🎧",
  "musicalnotes" => "🎶",
  "keyboard" => "🎹",
  "saxophone" => "🎷",
  "accordion" => "🪗",
  "guitar" => "🎸",
  "violin" => "🎻",
  "trumpet" => "🎺",
  "drum" => "🥁",
  "longdrum" => "🪘",
  "maracas" => "🪇",
  "flute" => "🪈",
  "clapboard" => "🎬",
  "bowtie" => "🎗️",
  "videogame" => "🎮",
  "dart" => "🎯",
  "dice" => "🎲",
  "puzzle" => "🧩",
  "teddybear" => "🧸",
  "pinata" => "🪅",
  "mirrorball" => "🪩",
  "nestingdolls" => "🪆",
  "spadessuit" => "♠️",
  "heartssuit" => "♥️",
  "diamondssuit" => "♦️",
  "clubssuit" => "♣️",
  "chessmono" => "♟️",
  "joker" => "🃏",
  "mahjong" => "🀄",
  "flowercard" => "🎴",

  # Travel & Places
  "globe" => "🌍",
  "globeamericas" => "🌎",
  "globeasia" => "🌏",
  "globemeridians" => "🌐",
  "worldmap" => "🗺️",
  "japanmap" => "🗾",
  "compass" => "🧭",
  "mountain" => "⛰️",
  "mountainsnow" => "🏔️",
  "volcano" => "🌋",
  "mountfuji" => "🗻",
  "camping" => "🏕️",
  "beachumbrella" => "🏖️",
  "desert" => "🏜️",
  "desertisland" => "🏝️",
  "nationalpark" => "🏞️",
  "stadium" => "🏟️",
  "classicalbuilding" => "🏛️",
  "buildingconstruction" => "🏗️",
  "brick" => "🧱",
  "rock" => "🪨",
  "wood" => "🪵",
  "hut" => "🛖",
  "houses" => "🏘️",
  "derelict" => "🏚️",
  "house" => "🏠",
  "garden" => "🏡",
  "officebuilding" => "🏢",
  "japanpost" => "🏣",
  "postoffice" => "🏤",
  "hospital" => "🏥",
  "bank" => "🏦",
  "hotel" => "🏨",
  "lovehotel" => "🏩",
  "store" => "🏪",
  "school" => "🏫",
  "department" => "🏬",
  "factory" => "🏭",
  "castle" => "🏯",
  "wedding" => "💒",
  "tower" => "🗼",
  "liberty" => "🗽",
  "church" => "",
  "mosque" => "🕌",
  "hindu" => "🛕",
  "synagogue" => "🕍",
  "shinto" => "⛩️",
  "kaaba" => "🕋",
  "fountain" => "",
  "tent" => "",
  "foggy" => "🌁",
  "nightstars" => "🌃",
  "citysunrise" => "🌇",
  "citysunset" => "🌆",
  "cityscape" => "🏙️",
  "bridge" => "🌉",
  "hotsprings" => "♨️",
  "carousel" => "🎠",
  "playgroundslide" => "🛝",
  "ferriswheel" => "🎡",
  "rollercoaster" => "🎢",
  "barberpole" => "💈",
  "tents" => "🎪",
  "locomotive" => "🚂",
  "railcar" => "🚃",
  "highspeed" => "🚄",
  "bullet" => "🚅",
  "train" => "🚆",
  "metro" => "🚇",
  "lightrail" => "🚈",
  "station" => "🚉",
  "tram" => "🚊",
  "monorail" => "🚝",
  "mountainrail" => "🚞",
  "tramcar" => "🚋",
  "bus" => "🚌",
  "oncomingbus" => "🚍",
  "trolleybus" => "🚎",
  "minibus" => "🚐",
  "ambulance" => "🚑",
  "fireengine" => "🚒",
  "policecar" => "🚓",
  "oncomingpolice" => "🚔",
  "taxi" => "🚕",
  "oncomingtaxi" => "🚖",
  "car" => "🚗",
  "oncomingcar" => "🚘",
  "suv" => "🚙",
  "deliverytruck" => "🚚",
  "articulatedlorry" => "🚛",
  "tractor" => "🚜",
  "racingcar" => "🏎️",
  "motorcycle" => "🏍️",
  "motorscooter" => "🛵",
  "manualwheelchair" => "🦽",
  "motorwheelchair" => "🦼",
  "autorigshaw" => "🛺",
  "bicycle" => "🚲",
  "kickscooter" => "🛴",
  "skateboard" => "🛹",
  "rollerblades" => "🛼",
  "busstop" => "🚏",
  "motorway" => "🛣️",
  "railwaytrack" => "🛤️",
  "oildrum" => "🛢️",
  "fuelpump" => "",
  "wheel" => "🛞",
  "policelights" => "🚨",
  "horizontallight" => "🚥",
  "verticallight" => "🚦",
  "stopsign" => "🛑",
  "construction" => "🚧",
  "anchor" => "",
  "ringbuoy" => "🛟",
  "sailboat" => "",
  "canoe" => "🛶",
  "speedboat" => "🚤",
  "ferry" => "⛴️",
  "motorboat" => "🛥️",
  "ship" => "🚢",
  "airplane" => "✈️",
  "smallplane" => "🛩️",
  "departure" => "🛫",
  "arrival" => "🛬",
  "parachute" => "🪂",
  "seat" => "💺",
  "helicopter" => "🚁",
  "suspensionrail" => "🚟",
  "cablecar" => "🚠",
  "gondola" => "🚡",
  "satellite" => "🛰️",
  "rocket" => "🚀",
  "flyingsaucer" => "🛸",
  "bellhop" => "🛎️",
  "luggage" => "🧳",
  "hourglass" => "",
  "hourglassflowing" => "",
  "watch" => "",
  "alarmclock" => "",
  "stopwatch" => "⏱️",
  "timerclock" => "⏲️",
  "mantelclock" => "🕰️",
  "twelve" => "🕐",
  "twelvethirty" => "🕧",
  "one" => "🕑",
  "onethirty" => "🕜",
  "two" => "🕒",
  "twothirty" => "🕝",
  "three" => "🕒",
  "threethirty" => "🕞",
  "four" => "🕓",
  "fourthirty" => "🕟",
  "five" => "🕔",
  "fivethirty" => "🕠",
  "six" => "🕕",
  "sixthirty" => "🕡",
  "seven" => "🕖",
  "seventhirty" => "🕢",
  "eight" => "🕗",
  "eightthirty" => "🕣",
  "nine" => "🕘",
  "ninethirty" => "🕤",
  "ten" => "🕙",
  "tenthirty" => "🕥",
  "eleven" => "🕚",
  "eleventhirty" => "🕦",
  "newmoon" => "🌑",
  "waxingcrescent" => "🌒",
  "firstquarter" => "🌓",
  "waxinggibbous" => "🌔",
  "fullmoon" => "🌕",
  "waninggibbous" => "🌖",
  "lastquarter" => "🌗",
  "waningcrescent" => "🌘",
  "crescentmoon" => "🌙",
  "newmoonface" => "🌚",
  "firstquarterface" => "🌛",
  "lastquarterface" => "🌜",
  "thermometer" => "🌡️",
  "sun" => "☀️",
  "fullmoonface" => "🌝",
  "sunwithface" => "🌞",
  "ringedplanet" => "🪐",
  "starsvg" => "",
  "glowingstar" => "🌟",
  "shootingstar" => "🌠",
  "milkyway" => "🌌",
  "cloud" => "☁️",
  "sunbehindcloud" => "",
  "cloudsun" => "🌤️",
  "cloudrain" => "🌧️",
  "cloudsnow" => "🌨️",
  "cloudlightning" => "🌩️",
  "cloudtornado" => "🌪️",
  "fog" => "🌫️",
  "windface" => "🌬️",
  "cyclone" => "🌀",
  "rainbow" => "🌈",
  "closedumbrella" => "🌂",
  "umbrella" => "☂️",
  "umbrellarain" => "",
  "umbrellaground" => "⛱️",
  "bolt" => "",
  "snowflake" => "❄️",
  "snowman" => "☃️",
  "snowmanballs" => "",
  "comet" => "☄️",
  "droplet" => "💧",
  "ocean" => "🌊",

  # Objects
  "eyeglasses" => "👓",
  "darkglasses" => "🕶️",
  "goggles" => "🥽",
  "labcoat" => "🥼",
  "safetyvest" => "🦺",
  "necktie" => "👔",
  "tshirt" => "👕",
  "jeans" => "👖",
  "scarf" => "🧣",
  "gloves" => "🧤",
  "coat" => "🧥",
  "socks" => "🧦",
  "dress" => "👗",
  "kimono" => "👘",
  "sari" => "🥻",
  "onepieceswimsuit" => "🩱",
  "briefs" => "🩲",
  "shorts" => "🩳",
  "bikini" => "👙",
  "blouse" => "👚",
  "foldedhands" => "👐",
  "purse" => "👛",
  "handbag" => "👜",
  "clutchbag" => "👝",
  "shoppingbags" => "🛍️",
  "backpack" => "🎒",
  "thongsandal" => "🩴",
  "shoe" => "👞",
  "runningshoe" => "👟",
  "hikingboot" => "🥾",
  "flatsandal" => "🥿",
  "highheeledsandal" => "👡",
  "heels" => "👠",
  "boot" => "👢",
  "balletshoes" => "🩰",
  "crown" => "👑",
  "tophat" => "🎩",
  "gradcap" => "🎓",
  "billedcap" => "🧢",
  "militaryhelmet" => "🪖",
  "rescueworkerhelmet" => "⛑️",
  "prayerbeads" => "📿",
  "lipstick" => "💄",
  "ring" => "💍",
  "gem" => "💎",
  "mutedspeaker" => "🔇",
  "speaker" => "🔈",
  "mediumspeaker" => "🔉",
  "loudspeaker" => "📢",
  "megaphone" => "📣",
  "postalhorn" => "📯",
  "bell" => "🔔",
  "nobell" => "🔕",
  "musicscore" => "🎼",
  "musicalnote" => "🎵",
  "studiomicrophone" => "🎙️",
  "levelslider" => "🎚️",
  "controlknobs" => "🎛️",
  "radio" => "📻",
  "banjo" => "🪕",
  "mobilephone" => "📱",
  "phonearrow" => "📲",
  "telephone" => "☎️",
  "pager" => "📟",
  "fax" => "📠",
  "battery" => "🔋",
  "lowbattery" => "🪫",
  "electricplug" => "🔌",
  "computer" => "💻",
  "desktop" => "🖥️",
  "printer" => "🖨️",
  "keyboardobj" => "⌨️",
  "computermouse" => "🖱️",
  "trackball" => "🖲️",
  "disk" => "💽",
  "floppy" => "💾",
  "cd" => "💿",
  "dvd" => "📀",
  "abacus" => "🧮",
  "moviecamera" => "🎥",
  "filmframes" => "🎞️",
  "projector" => "📽️",
  "televisin" => "📺",
  "cameraphoto" => "📷",
  "camerawithflash" => "📸",
  "videocamera" => "📹",
  "vhs" => "📼",
  "mag" => "🔍",
  "magleft" => "🔎",
  "candle" => "🕯️",
  "bulb" => "💡",
  "flashlight" => "🔦",
  "lantern" => "🏮",
  "diyalamp" => "🪔",
  "notebookdecorative" => "📔",
  "closedbook" => "📕",
  "openbook" => "📖",
  "greenbook" => "📗",
  "bluebook" => "📘",
  "orangebook" => "📙",
  "books" => "📚",
  "notebook" => "📓",
  "ledger" => "📒",
  "pagewithcurl" => "📃",
  "scroll" => "📜",
  "pagebookmark" => "📄",
  "newspaper" => "📰",
  "rollednewspaper" => "🗞️",
  "bookmarktabs" => "📑",
  "bookmark" => "🔖",
  "label" => "🏷️",
  "moneybag" => "💰",
  "coin" => "🪙",
  "yen" => "💴",
  "dollar" => "💵",
  "euro" => "💶",
  "pound" => "💷",
  "moneywings" => "💸",
  "creditcard" => "💳",
  "receipt" => "🧾",
  "chartincrease" => "📈",
  "chartdecrease" => "📉",
  "envelopearrow" => "📧",
  "email" => "📧",
  "incomingenvelope" => "📨",
  "envelopearrowdown" => "📩",
  "outboxtray" => "📤",
  "inboxtray" => "📥",
  "parcel" => "📦",
  "mailbox" => "📫",
  "mailboxclosed" => "📪",
  "mailboxflag" => "📬",
  "mailboxnoflag" => "📭",
  "postbox" => "📮",
  "ballotbox" => "🗳️",
  "pencil" => "✏️",
  "blacknib" => "✒️",
  "fountainpen" => "🖋️",
  "pen" => "🖊️",
  "paintbrush" => "🖌️",
  "crayon" => "🖍️",
  "memo" => "📝",
  "briefcase" => "💼",
  "filefolder" => "📁",
  "openfolder" => "📂",
  "dividers" => "🗂️",
  "calendar" => "📅",
  "tearoffcalendar" => "📆",
  "spiralnotebook" => "🗒️",
  "spiralcalendar" => "🗓️",
  "cardindex" => "📇",
  "chartincreasing" => "📈",
  "chartdecreasing" => "📉",
  "bargraph" => "📊",
  "clipboard" => "📋",
  "pushpin" => "📌",
  "roundpin" => "📍",
  "paperclip" => "📎",
  "linkedpaperclips" => "🖇️",
  "straightruler" => "📏",
  "triangularruler" => "📐",
  "scissors" => "✂️",
  "cardfilebox" => "🗃️",
  "filing" => "🗄️",
  "wastebasket" => "🗑️",
  "locked" => "🔒",
  "unlocked" => "🔓",
  "lockedwithpen" => "🔏",
  "lockedwithkey" => "🔐",
  "key" => "🔑",
  "oldkey" => "🗝️",
  "hammer" => "🔨",
  "axe" => "🪓",
  "pick" => "⛏️",
  "hammerandpick" => "⚒️",
  "hammerwrench" => "🛠️",
  "dagger" => "🗡️",
  "swords" => "⚔️",
  "pistol" => "🔫",
  "boomerangobj" => "🪃",
  "bowwitharrow" => "🏹",
  "shield" => "🛡️",
  "carpentrysaw" => "🪚",
  "wrench" => "🔧",
  "screwdriver" => "🪛",
  "nutandbolt" => "🔩",
  "gear" => "⚙️",
  "clamp" => "🗜️",
  "balancescale" => "⚖️",
  "whitecane" => "🦯",
  "link" => "🔗",
  "chains" => "⛓️",
  "hook" => "🪝",
  "toolbox" => "🧰",
  "magnet" => "🧲",
  "ladder" => "🪜",
  "alembic" => "⚗️",
  "testtube" => "🧪",
  "petridish" => "🧫",
  "dna" => "🧬",
  "microscope" => "🔬",
  "telescope" => "🔭",
  "satelliteantenna" => "📡",
  "syringe" => "💉",
  "dropofblood" => "🩸",
  "pill" => "💊",
  "adhesivebandage" => "🩹",
  "crutch" => "🩼",
  "stethoscope" => "🩺",
  "xray" => "🩻",
  "door" => "🚪",
  "elevator" => "🛗",
  "mirror" => "🪞",
  "window" => "🪟",
  "sofaandlamp" => "🛋️",
  "chair" => "🪑",
  "toilet" => "🚽",
  "plunger" => "🪠",
  "shower" => "🚿",
  "bathtub" => "🛁",
  "mousetrap" => "🪤",
  "razor" => "🪒",
  "lotionbottle" => "🧴",
  "safetypin" => "🧷",
  "broom" => "🧹",
  "basket" => "🧺",
  "rollofpaper" => "🧻",
  "bucket" => "🪣",
  "soap" => "🧼",
  "bubbles" => "🫧",
  "toothbrush" => "🪥",
  "sponge" => "🧽",
  "fireextinguisher" => "🧯",
  "shoppingcart" => "🛒",
  "cigarette" => "🚬",
  "coffin" => "⚰️",
  "headstone" => "🪦",
  "funeralurn" => "⚱️",
  "nazaramulet" => "🧿",
  "hamsa" => "🪬",
  "moai" => "🗿",
  "placard" => "🪧",
  "identificationcard" => "🪪",

  # Symbols
  "atm" => "🏧",
  "litersign" => "🚮",
  "potablewater" => "🚰",
  "wheelchairsymbol" => "",
  "mensroom" => "🚹",
  "womensroom" => "🚺",
  "restroom" => "🚻",
  "babysymbol" => "🚼",
  "wc" => "🚾",
  "passportcontrol" => "🛂",
  "customs" => "🛃",
  "baggageclaim" => "🛄",
  "leftluggage" => "🛅",
  "warning" => "⚠️",
  "childcrossing" => "🚸",
  "noentry" => "",
  "prohibited" => "🚫",
  "nobicycles" => "🚳",
  "nosmoking" => "🚭",
  "nolittering" => "🚯",
  "nonpotable" => "🚱",
  "nopedestrians" => "🚷",
  "nophone" => "📵",
  "eighteenplus" => "🔞",
  "up" => "⬆️",
  "upright" => "↗️",
  "right" => "➡️",
  "downright" => "↘️",
  "down" => "⬇️",
  "downleft" => "↙️",
  "left" => "⬅️",
  "upleft" => "↖️",
  "updown" => "↕️",
  "leftright" => "↔️",
  "leftcurve" => "↩️",
  "rightcurve" => "↪️",
  "rightarrowcurving" => "⤴️",
  "leftarrowcurving" => "⤵️",
  "clockwise" => "🔃",
  "counterclockwise" => "🔄",
  "back" => "🔙",
  "end" => "🔚",
  "on" => "🔛",
  "soon" => "🔜",
  "top" => "🔝",
  "placeofreligion" => "🛐",
  "om" => "🕉️",
  "starofdavid" => "✡️",
  "wheelofdharma" => "☸️",
  "yinyang" => "☯️",
  "latincross" => "✝️",
  "orthodoxcross" => "☦️",
  "starandcrescent" => "☪️",
  "peaceandlove" => "☮️",
  "menorah" => "🕎",
  "sixpointedstar" => "🔯",
  "khanda" => "🪯",
  "aries" => "",
  "taurus" => "",
  "gemini" => "",
  "cancer" => "",
  "leo" => "",
  "virgo" => "",
  "libra" => "",
  "scorpius" => "",
  "sagittarius" => "",
  "capricorn" => "",
  "aquarius" => "",
  "pisces" => "",
  "ophiuchus" => "",
  "shuffletracks" => "🔀",
  "repeat" => "🔁",
  "repeatone" => "🔂",
  "playbtn" => "▶️",
  "fastforward" => "",
  "nexttrack" => "⏭️",
  "playorpause" => "⏯️",
  "reverse" => "◀️",
  "rewind" => "",
  "lasttrack" => "⏮️",
  "upbutton" => "🔼",
  "fastup" => "",
  "downbutton" => "🔽",
  "fastdown" => "",
  "pausebutton" => "⏸️",
  "stopbutton" => "⏹️",
  "recordbutton" => "⏺️",
  "ejectbutton" => "⏏️",
  "cinema" => "🎦",
  "lowbrightness" => "🔅",
  "highbrightness" => "🔆",
  "signalstrength" => "📶",
  "wireless" => "📳",
  "vibration" => "📳",
  "phoneoff" => "📴",
  "female" => "♀️",
  "male" => "♂️",
  "transgender" => "⚧️",
  "multiply" => "✖️",
  "plus" => "",
  "minus" => "",
  "divide" => "",
  "heavyequals" => "🟰",
  "infinity" => "♾️",
  "bangbang" => "‼️",
  "interrobang" => "⁉️",
  "question" => "",
  "greyquestion" => "",
  "exclamation" => "",
  "greyexclamation" => "",
  "wavy" => "〰️",
  "currencyexchange" => "💱",
  "heavydollar" => "💲",
  "medicalymbol" => "⚕️",
  "recycle" => "♻️",
  "fleurdelis" => "⚜️",
  "trident" => "🔱",
  "namebadge" => "📛",
  "beginner" => "🔰",
  "hollowredcircle" => "",
  "checkmark" => "",
  "checkmarkbox" => "☑️",
  "checkmarkbtn" => "✔️",
  "crossmark" => "",
  "crossbtn" => "",
  "curlloop" => "",
  "doublecurl" => "",
  "partalt" => "〽️",
  "eightspoke" => "✳️",
  "eightpointedstar" => "✴️",
  "sparkle" => "❇️",
  "copyright" => "©️",
  "registered" => "®️",
  "trademark" => "™️",
  "keycap" => "#️⃣",
  "keycapzero" => "0️⃣",
  "keycapone" => "1️⃣",
  "keycaptwo" => "2️⃣",
  "keycapthree" => "3️⃣",
  "keycapfour" => "4️⃣",
  "keycapfive" => "5️⃣",
  "keycapsix" => "6️⃣",
  "keycapseven" => "7️⃣",
  "keycapeight" => "8️⃣",
  "keycapnine" => "9️⃣",
  "keycapten" => "🔟",
  "hundredpoints" => "💯",
  "inputlatinuppercase" => "🔠",
  "inputlatinlowercase" => "🔡",
  "inputnumbers" => "🔢",
  "inputsymbols" => "🔣",
  "inputlatinletters" => "🔤",
  "ablood" => "🅰️",
  "abblood" => "🆎",
  "bblood" => "🅱️",
  "cl" => "🆑",
  "cool" => "🆒",
  "free" => "🆓",
  "information" => "ℹ️",
  "id" => "🆔",
  "circledm" => "Ⓜ️",
  "new" => "🆕",
  "ng" => "🆖",
  "oblood" => "🅾️",
  "ok" => "🆗",
  "parking" => "🅿️",
  "sos" => "🆘",
  "upexclamation" => "🆙",
  "vs" => "🆚",
  "kana" => "🈁",
  "pointingup" => "🈂️",
  "u5272" => "🈷️",
  "u5408" => "🈴",
  "u55b6" => "🈺",
  "u6307" => "🈯",
  "u6708" => "🈷️",
  "u6709" => "🈶",
  "u6e80" => "🈵",
  "u7121" => "🈚",
  "u7533" => "🈸",
  "u7981" => "🈲",
  "u7a7a" => "🈳",
  "accept" => "🉑",
  "redsquare" => "🟥",
  "orangesquare" => "🟧",
  "yellowsquare" => "🟨",
  "greensquare" => "🟩",
  "bluesquare" => "🟦",
  "purplesquare" => "🟪",
  "brownsquare" => "🟫",
  "blacklargesquare" => "",
  "whitelargesquare" => "",
  "blackmediumsquare" => "◼️",
  "whitemediumsquare" => "◻️",
  "blackmedimsmallesquare" => "",
  "whitemediusmallesquare" => "",
  "blacksmallsquare" => "▪️",
  "whitesmallsquare" => "▫️",
  "largeorgdiamond" => "🔶",
  "largebluediamond" => "🔷",
  "smallorgdiamond" => "🔸",
  "smallbluediamond" => "🔹",
  "redtriup" => "🔺",
  "redtridown" => "🔻",
  "diamondorange" => "💠",
  "radiobtn" => "🔘",
  "whitesqbtn" => "🔳",
  "blacksqbtn" => "🔲",
  "chequeredflag" => "🏁",
  "triangularflag" => "🚩",
  "crossedflags" => "🎌",
  "blackflag" => "🏴",
  "whiteflag" => "🏳️",
  "rainbowflag" => "🏳️‍🌈",
  "transgenderflag" => "🏳️‍⚧️",
  "pirateflag" => "🏴‍☠️",

  # Flags
  "ascensionisland" => "🇦🇨",
  "andorra" => "🇦🇩",
  "uae" => "🇦🇪",
  "afghanistan" => "🇦🇫",
  "antiguabarbuda" => "🇦🇬",
  "anguilla" => "🇦🇮",
  "albania" => "🇦🇱",
  "armenia" => "🇦🇲",
  "angola" => "🇦🇴",
  "antarctica" => "🇦🇶",
  "argentina" => "🇦🇷",
  "americansamoa" => "🇦🇸",
  "austria" => "🇦🇹",
  "australia" => "🇦🇺",
  "aruba" => "🇦🇼",
  "alandislands" => "🇦🇽",
  "azerbaijan" => "🇦🇿",
  "bosniaherz" => "🇧🇦",
  "barbados" => "🇧🇧",
  "bangladesh" => "🇧🇩",
  "belgium" => "🇧🇪",
  "burkinafaso" => "🇧🇫",
  "bulgaria" => "🇧🇬",
  "bahrain" => "🇧🇭",
  "burundi" => "🇧🇮",
  "benin" => "🇧🇯",
  "stbarts" => "🇧🇱",
  "bermuda" => "🇧🇲",
  "brunei" => "🇧🇳",
  "bolivia" => "🇧🇴",
  "caribnetherlands" => "🇧🇶",
  "brazil" => "🇧🇷",
  "bahamas" => "🇧🇸",
  "bhutan" => "🇧🇹",
  "bouvetisland" => "🇧🇻",
  "botswana" => "🇧🇼",
  "belarus" => "🇧🇾",
  "belize" => "🇧🇿",
  "canada" => "🇨🇦",
  "cocosislands" => "🇨🇨",
  "congokinshasa" => "🇨🇩",
  "centralafrican" => "🇨🇫",
  "congobrazzaville" => "🇨🇬",
  "switzerland" => "🇨🇭",
  "ivorycoast" => "🇨🇮",
  "cookislands" => "🇨🇰",
  "chile" => "🇨🇱",
  "cameroon" => "🇨🇲",
  "china" => "🇨🇳",
  "colombia" => "🇨🇴",
  "clipperton" => "🇨🇵",
  "costarica" => "🇨🇷",
  "cuba" => "🇨🇺",
  "capeverde" => "🇨🇻",
  "curacao" => "🇨🇼",
  "christmasisland" => "🇨🇽",
  "cyprus" => "🇨🇾",
  "czechia" => "🇨🇿",
  "germany" => "🇩🇪",
  "diegogarcia" => "🇩🇬",
  "djibouti" => "🇩🇯",
  "denmark" => "🇩🇰",
  "dominica" => "🇩🇲",
  "dominicanrep" => "🇩🇴",
  "algeria" => "🇩🇿",
  "ceutamelilla" => "🇪🇦",
  "ecuador" => "🇪🇨",
  "estonia" => "🇪🇪",
  "egypt" => "🇪🇬",
  "westernsahara" => "🇪🇭",
  "eritrea" => "🇪🇷",
  "spain" => "🇪🇸",
  "ethiopia" => "🇪🇹",
  "eu" => "🇪🇺",
  "finland" => "🇫🇮",
  "fiji" => "🇫🇯",
  "falklands" => "🇫🇰",
  "micronesia" => "🇫🇲",
  "faroeislands" => "🇫🇴",
  "france" => "🇫🇷",
  "gabon" => "🇬🇦",
  "uk" => "🇬🇧",
  "grenada" => "🇬🇩",
  "georgia" => "🇬🇪",
  "frenchguiana" => "🇬🇫",
  "guernsey" => "🇬🇬",
  "ghana" => "🇬🇭",
  "gibraltar" => "🇬🇮",
  "greenland" => "🇬🇱",
  "gambia" => "🇬🇲",
  "guinea" => "🇬🇳",
  "guadeloupe" => "🇬🇵",
  "equatorialguinea" => "🇬🇶",
  "greece" => "🇬🇷",
  "southgeorgia" => "🇬🇸",
  "guatemala" => "🇬🇹",
  "guam" => "🇬🇺",
  "guineabissau" => "🇬🇼",
  "guyana" => "🇬🇾",
  "hongkong" => "🇭🇰",
  "heardmcdonald" => "🇭🇲",
  "honduras" => "🇭🇳",
  "croatia" => "🇭🇷",
  "haiti" => "🇭🇹",
  "hungary" => "🇭🇺",
  "canaryislands" => "🇮🇨",
  "indonesia" => "🇮🇩",
  "ireland" => "🇮🇪",
  "israel" => "🇮🇱",
  "isleofman" => "🇮🇲",
  "india" => "🇮🇳",
  "britishindianocean" => "🇮🇴",
  "iraq" => "🇮🇶",
  "iran" => "🇮🇷",
  "iceland" => "🇮🇸",
  "italy" => "🇮🇹",
  "jersey" => "🇯🇪",
  "jamaica" => "🇯🇲",
  "jordan" => "🇯🇴",
  "japan" => "🇯🇵",
  "kenya" => "🇰🇪",
  "kyrgyzstan" => "🇰🇬",
  "cambodia" => "🇰🇭",
  "kiribati" => "🇰🇮",
  "comoros" => "🇰🇲",
  "stkittsnevis" => "🇰🇳",
  "northkorea" => "🇰🇵",
  "southkorea" => "🇰🇷",
  "kuwait" => "🇰🇼",
  "caymanislands" => "🇰🇾",
  "kazakhstan" => "🇰🇿",
  "laos" => "🇱🇦",
  "lebanon" => "🇱🇧",
  "stlucia" => "🇱🇨",
  "liechtenstein" => "🇱🇮",
  "srilanka" => "🇱🇰",
  "liberia" => "🇱🇷",
  "lesotho" => "🇱🇸",
  "lithuania" => "🇱🇹",
  "luxembourg" => "🇱🇺",
  "latvia" => "🇱🇻",
  "libya" => "🇱🇾",
  "morocco" => "🇲🇦",
  "monaco" => "🇲🇨",
  "moldova" => "🇲🇩",
  "montenegro" => "🇲🇪",
  "stmartin" => "🇲🇫",
  "madagascar" => "🇲🇬",
  "marshallislands" => "🇲🇭",
  "macedonia" => "🇲🇰",
  "mali" => "🇲🇱",
  "myanmar" => "🇲🇲",
  "mongolia" => "🇲🇳",
  "macau" => "🇲🇴",
  "northernmariana" => "🇲🇵",
  "martinique" => "🇲🇶",
  "mauritania" => "🇲🇷",
  "montserrat" => "🇲🇸",
  "malta" => "🇲🇹",
  "mauritius" => "🇲🇺",
  "maldives" => "🇲🇻",
  "malawi" => "🇲🇼",
  "mexico" => "🇲🇽",
  "malaysia" => "🇲🇾",
  "mozambique" => "🇲🇿",
  "namibia" => "🇳🇦",
  "newcaledonia" => "🇳🇨",
  "niger" => "🇳🇪",
  "norfolkisland" => "🇳🇫",
  "nigeria" => "🇳🇬",
  "nicaragua" => "🇳🇮",
  "netherlands" => "🇳🇱",
  "norway" => "🇳🇴",
  "nepal" => "🇳🇵",
  "nauru" => "🇳🇷",
  "niue" => "🇳🇺",
  "newzealand" => "🇳🇿",
  "oman" => "🇴🇲",
  "panama" => "🇵🇦",
  "peru" => "🇵🇪",
  "frenchpolynesia" => "🇵🇫",
  "papuanewguinea" => "🇵🇬",
  "philippines" => "🇵🇭",
  "pakistan" => "🇵🇰",
  "poland" => "🇵🇱",
  "stpierremiq" => "🇵🇲",
  "pitcairnislands" => "🇵🇳",
  "puertorico" => "🇵🇷",
  "palestinianterritories" => "🇵🇸",
  "portugal" => "🇵🇹",
  "palau" => "🇵🇼",
  "paraguay" => "🇵🇾",
  "qatar" => "🇶🇦",
  "reunion" => "🇷🇪",
  "romania" => "🇷🇴",
  "serbia" => "🇷🇸",
  "russia" => "🇷🇺",
  "rwanda" => "🇷🇼",
  "saudiarabia" => "🇸🇦",
  "solomonislands" => "🇸🇧",
  "seychelles" => "🇸🇨",
  "sudan" => "🇸🇩",
  "sweden" => "🇸🇪",
  "singapore" => "🇸🇬",
  "sthelena" => "🇸🇭",
  "slovenia" => "🇸🇮",
  "svalbardjanmayen" => "🇸🇯",
  "slovakia" => "🇸🇰",
  "sierraleone" => "🇸🇱",
  "sanmarino" => "🇸🇲",
  "senegal" => "🇸🇳",
  "somalia" => "🇸🇴",
  "suriname" => "🇸🇷",
  "southsudan" => "🇸🇸",
  "saotomeprincipe" => "🇸🇹",
  "elsalvador" => "🇸🇻",
  "sintmaarten" => "🇸🇽",
  "syria" => "🇸🇾",
  "eswatini" => "🇸🇿",
  "tristanda" => "🇹🇦",
  "turkscaicos" => "🇹🇨",
  "chad" => "🇹🇩",
  "frenchsouthern" => "🇹🇫",
  "togo" => "🇹🇬",
  "thailand" => "🇹🇭",
  "tajikistan" => "🇹🇯",
  "tokelau" => "🇹🇰",
  "timorleste" => "🇹🇱",
  "turkmenistan" => "🇹🇲",
  "tunisia" => "🇹🇳",
  "tonga" => "🇹🇴",
  "turkey" => "🇹🇷",
  "trinidadtobago" => "🇹🇹",
  "tuvalu" => "🇹🇻",
  "taiwan" => "🇹🇼",
  "tanzania" => "🇹🇿",
  "ukraine" => "🇺🇦",
  "uganda" => "🇺🇬",
  "usoutlyingislands" => "🇺🇲",
  "un" => "🇺🇳",
  "us" => "🇺🇸",
  "uruguay" => "🇺🇾",
  "uzbekistan" => "🇺🇿",
  "vaticancity" => "🇻🇦",
  "stvincentgren" => "🇻🇨",
  "venezuela" => "🇻🇪",
  "britishvirginislands" => "🇻🇬",
  "usvirginislands" => "🇻🇮",
  "vietnam" => "🇻🇳",
  "vanuatu" => "🇻🇺",
  "wallisfutuna" => "🇼🇫",
  "samoa" => "🇼🇸",
  "kosovo" => "🇽🇰",
  "yemen" => "🇾🇪",
  "mayotte" => "🇾🇹",
  "southafrica" => "🇿🇦",
  "zambia" => "🇿🇲",
  "zimbabwe" => "🇿🇼",
  "england" => "🏴󠁧󠁢󠁥󠁮󠁧󠁿",
  "scotland" => "🏴󠁧󠁢󠁳󠁣󠁴󠁿",
  "wales" => "🏴󠁧󠁢󠁷󠁬󠁳󠁿"
}.freeze
CATEGORIES =

Category definitions - maps category names to emote ranges

{
  "custom" => {
    description: "Custom ASCII Art and Text Emotes",
    emotes: ["disapproval", "bugeyes", "dogshrug", "facepalm", "flip", "fu", "heresatable",
             "javaflip", "kungfuhamster", "omw", "rage", "rageflip", "rockhand", "shrug", "shrugtable",
             "unsee", "yuno"]
  },
  "keyboard" => {
    description: "Keyboard Shortcuts",
    emotes: ["cmd-", "cmd", "command", "cntl", "optn", "option", "shft", "shift"]
  },
  "smileys" => {
    description: "Smileys & People",
    emotes: EMOTES.keys.select { |k|
      ["grin", "smiley", "smile", "grinning", "laughing", "sweat_smile", "rofl", "joy",
       "slightsmile", "upsidedown", "meltingface", "wink", "blush", "innocent", "hearteyessmile",
       "hearteyes", "starstruck", "kissing", "kissingheart", "relaxed", "kissingclosedeyes",
       "kissingsmile", "yum", "tongueout", "tonguewink", "zany", "tongueclosedeyes", "moneymouth",
       "hugs", "handovermouth", "shush", "thinking", "salute", "zipper", "raisedeyebrow", "neutral",
       "expressionless", "nomouth", "dottedline", "cloudface", "smirk", "unamused", "eyeroll",
       "grimace", "cringe", "lyingface", "shakingface", "relieved", "pensive", "sleepy", "drool", "sleeping",
       "mask", "sick", "bandage", "nauseated", "vomit", "sneeze", "hot", "cold", "woozy", "dizzy",
       "spiraleyes", "explodinghead", "cowboy", "party", "disguised", "sunglasses", "nerd", "monocle",
       "confused", "faceexhaling", "worried", "slightfrown", "frown", "openmouth", "hushed",
       "astonished", "flushed", "pleading", "holdingbacktears", "frowning", "anguished", "fearful",
       "anxious", "sad", "cry", "sob", "scream", "omg", "confounded", "persevere", "disappointed",
       "sweat", "weary", "tired", "yawning", "triumph", "pout", "angry", "cursing", "smiling_imp",
       "imp", "skull", "crossbones", "clown", "poop", "ghost", "alien", "alienmonster", "robot",
       "smilingcat", "grincat", "joycat", "heartcat", "smirkcat", "kissingcat", "screamcat", "omgcat",
       "cryingcat", "poutcat", "heart", "orange_heart", "yellow_heart", "green_heart", "blue_heart",
       "purple_heart", "brown_heart", "black_heart", "grey_heart", "white_heart", "pinkheart",
       "lightheart", "broken_heart", "heartexclamation", "twohearts", "revolvingheart", "heartbeat",
       "growingheart", "sparklingheart", "heartarrow", "loveeyes", "kiss", "envelope", "cupid",
       "bouquet", "fire", "heartfire", "mendingeart", "sparkles", "star", "dizzystar", "sweat_drops",
       "dash", "boom", "wave", "raisedback", "splayed", "hand", "vulcan", "rightwardshand",
       "leftwardshand", "palmdown", "palmup", "leftwardspush", "rightwardspush", "okhand", "pinched",
       "pinching", "v", "crossed", "indexpoint", "iloveyou", "metal", "callme", "pointleft",
       "pointright", "pointup", "middlefinger", "pointdown", "pointup2", "indexleft", "thumbsup",
       "thumbsdown", "fist", "facepunch", "leftfist", "rightfist", "clap", "raisehands", "hearthand",
       "openhands", "palmsup", "handshake", "pray", "writing", "nails", "selfie", "muscle",
       "mechanicalarm", "mechanicalleg", "leg", "foot", "ear", "earwithhearing", "nose", "brain",
       "anatomicalheart", "lungs", "tooth", "bone", "eyes", "eye", "tongue", "lips", "bitinglip"].include?(k)
    }
  },
  "animals" => {
    description: "Animals & Nature",
    emotes: EMOTES.keys.select { |k|
      k.start_with?("monkey", "gorilla", "orangutan", "dog", "guide", "service", "poodle", "wolf",
                    "fox", "raccoon", "cat", "black", "lion", "tiger", "leopard", "horse", "moose",
                    "donkey", "unicorn", "zebra", "deer", "bison", "cow", "ox", "water", "pig", "boar",
                    "ram", "sheep", "goat", "camel", "two", "llama", "giraffe", "elephant", "mammoth",
                    "rhino", "hippo", "mouse", "rat", "hamster", "rabbit", "chipmunk", "beaver",
                    "hedgehog", "bat", "bear", "polar", "koala", "panda", "sloth", "otter", "skunk",
                    "kangaroo", "badger", "paw", "turkey", "chicken", "rooster", "hatching", "baby",
                    "chick", "bird", "penguin", "dove", "eagle", "duck", "swan", "owl", "dodo",
                    "feather", "flamingo", "peacock", "parrot", "wing", "goose", "frog", "crocodile",
                    "turtle", "lizard", "snake", "dragon", "sauropod", "trex", "whale", "dolphin",
                    "seal", "fish", "tropical", "blow", "shark", "octopus", "shell", "coral", "jelly",
                    "snail", "butterfly", "bug", "ant", "bee", "beetle", "lady", "cricket", "cockroach",
                    "spider", "web", "scorpion", "mosquito", "fly", "worm", "microbe", "flowers",
                    "cherry", "white", "lotus", "rosette", "rose", "wilted", "hibiscus", "sunflower",
                    "blossom", "tulip", "hyacinth", "seedling", "pot", "tree", "deciduous", "palm",
                    "cactus", "grain", "herb", "shamrock", "clover", "maple", "fallen", "leaves",
                    "empty", "eggs", "mushroom") ||
             ["turkeybird", "monkey", "monkeyface", "gorilla", "orangutan", "dog", "dogface", "guidedog", "servicedog",
              "poodle", "wolf", "fox", "raccoon", "cat", "catface", "blackcat", "lion", "tiger",
              "tigerface", "leopard", "horse", "moose", "donkey", "horseface", "unicorn", "zebra",
              "deer", "bison", "cow", "ox", "waterbuffalo", "cowface", "pig", "pigface", "boar",
              "piglips", "ram", "sheep", "goat", "camel", "twohump", "llama", "giraffe", "elephant",
              "mammoth", "rhino", "hippo", "mouse", "mouseface", "rat", "hamster", "rabbit",
              "rabbitface", "chipmunk", "beaver", "hedgehog", "bat", "bear", "polarbear", "koala",
              "panda", "sloth", "otter", "skunk", "kangaroo", "badger", "pawprints", "turkey",
              "chicken", "rooster", "hatchingchick", "babychick", "chick", "bird", "penguin", "dove",
              "eagle", "duck", "swan", "owl", "dodo", "feather", "flamingo", "peacock", "parrot",
              "wing", "blackbird", "goose", "frog", "crocodile", "turtle", "lizard", "snake",
              "dragon", "dragonface", "sauropod", "trex", "whale", "whaleface", "dolphin", "seal",
              "fish", "tropicalfish", "blowfish", "shark", "octopus", "shell", "coral", "jellyfish",
              "snail", "butterfly", "bug", "ant", "bee", "beetle", "ladybug", "cricketbug", "cockroach",
              "spider", "web", "scorpion", "mosquito", "fly", "worm", "microbe", "flowers",
              "cherryblossom", "whiteblossom", "lotusflower", "rosetteflower", "rose", "wilted", "hibiscus",
              "sunflower", "blossom", "tulip", "hyacinth", "seedling", "potplant", "tree",
              "deciduoustree", "palm", "cactus", "grain", "herb", "shamrock", "clover", "maple",
              "fallenleaf", "leaves", "emptyness", "eggsnest", "mushroom"].include?(k)
    }
  },
  "combined" => {
    description: "Combined/Custom Emotes",
    emotes: ["bullshit", "catshit", "dogshit", "pandashit", "horseshit", "koalashit", "batshit",
             "shboatload", "noevil"]
  },
  "food" => {
    description: "Food & Drink",
    emotes: ["grapes", "melon", "watermelon", "tangerine", "lemon", "banana", "pineapple", "mango",
             "apple", "greenapple", "pear", "peach", "cherries", "strawberry", "blueberries", "kiwi",
             "tomato", "olive", "coconut", "avocado", "eggplant", "potato", "carrot", "corn",
             "hotpepper", "bellpepper", "cucumber", "leafy", "broccoli", "garlic", "onion", "peanuts",
             "beans", "chestnut", "ginger", "peas", "bread", "croissant", "baguette", "flatbread",
             "pretzel", "bagel", "pancakes", "waffle", "cheese", "meat", "poultryleg", "cutmeat",
             "bacon", "hamburger", "fries", "pizza", "hotdog", "sandwich", "taco", "burrito", "tamale",
             "stuffedflatbread", "falafel", "egg", "cooking", "paella", "fondue", "pot", "bowl",
             "salad", "popcorn", "butter", "salt", "cannedstuff", "bento", "ricecrackers", "riceball",
             "rice", "curry", "ramen", "spaghetti", "sweetpotato", "oden", "sushi", "friedshrimp",
             "fishcake", "mooncake", "dango", "dumpling", "fortunecookie", "takeout", "crab", "lobster",
             "shrimp", "squid", "oyster", "icecream", "shavice", "softice", "doughnut", "cookie",
             "birthdaycake", "shortcake", "cupcake", "pie", "chocbar", "candy", "lollipop", "custard",
             "honeypot", "babybottle", "milk", "coffee", "teapot", "tea", "sake", "champagne", "wine",
             "cocktail", "tropical", "beer", "beers", "clinking", "tumbler", "pouringdrink", "cupstraw",
             "beverage", "mate", "icecube", "chopsticks", "platefork", "forkknife", "spoon", "knife",
             "jar", "amphora"]
  },
  "activity" => {
    description: "Activity",
    emotes: ["soccer", "basketball", "football", "baseball", "softball", "tennis", "volleyball",
             "rugby", "frisbee", "8ball", "pingpong", "badminton", "hockeystick", "fieldhockey",
             "lacrosse", "cricket", "goal", "golfclub", "boomerang", "archery", "fishingpole",
             "divingmask", "boxingglove", "karate", "running", "walking", "standingperson",
             "kneelingperson", "wheelchair", "motorizedwheelchair", "dancer", "dancing", "suit",
             "couple", "twomen", "twowomen", "personwhitecane", "personmotorized", "personmanual",
             "runners", "skier", "snowboarder", "climber", "fencer", "horseracing", "skater", "lifter",
             "biker", "mountainbiker", "cartwheel", "wrestlers", "waterpolo", "handball", "juggling",
             "lotus", "bath", "bed", "trophy", "medal", "goldmedal", "silvermedal", "bronzemedal",
             "sportsmedal", "rosette", "ribbon", "ticket", "tickets", "performingarts", "art", "circus",
             "microphone", "headphones", "musicalnotes", "keyboard", "saxophone", "accordion", "guitar",
             "violin", "trumpet", "drum", "longdrum", "maracas", "flute", "clapboard", "bowtie",
             "videogame", "dart", "dice", "puzzle", "teddybear", "pinata", "mirrorball", "nestingdolls",
             "spadessuit", "heartssuit", "diamondssuit", "clubssuit", "chessmono", "joker", "mahjong",
             "flowercard"]
  },
  "travel" => {
    description: "Travel & Places",
    emotes: ["globe", "globeamericas", "globeasia", "globemeridians", "worldmap", "japanmap", "compass",
             "mountain", "mountainsnow", "volcano", "mountfuji", "camping", "beachumbrella", "desert",
             "desertisland", "nationalpark", "stadium", "classicalbuilding", "buildingconstruction",
             "brick", "rock", "wood", "hut", "houses", "derelict", "house", "garden", "officebuilding",
             "japanpost", "postoffice", "hospital", "bank", "hotel", "lovehotel", "store", "school",
             "department", "factory", "castle", "wedding", "tower", "liberty", "church", "mosque",
             "hindu", "synagogue", "shinto", "kaaba", "fountain", "tent", "foggy", "nightstars",
             "citysunrise", "citysunset", "cityscape", "bridge", "hotsprings", "carousel",
             "playgroundslide", "ferriswheel", "rollercoaster", "barberpole", "tents", "locomotive",
             "railcar", "highspeed", "bullet", "train", "metro", "lightrail", "station", "tram",
             "monorail", "mountainrail", "tramcar", "bus", "oncomingbus", "trolleybus", "minibus",
             "ambulance", "fireengine", "policecar", "oncomingpolice", "taxi", "oncomingtaxi", "car",
             "oncomingcar", "suv", "deliverytruck", "articulatedlorry", "tractor", "racingcar",
             "motorcycle", "motorscooter", "manualwheelchair", "motorwheelchair", "autorigshaw",
             "bicycle", "kickscooter", "skateboard", "rollerblades", "busstop", "motorway",
             "railwaytrack", "oildrum", "fuelpump", "wheel", "policelights", "horizontallight",
             "verticallight", "stopsign", "construction", "anchor", "ringbuoy", "sailboat", "canoe",
             "speedboat", "ferry", "motorboat", "ship", "airplane", "smallplane", "departure", "arrival",
             "parachute", "seat", "helicopter", "suspensionrail", "cablecar", "gondola", "satellite",
             "rocket", "flyingsaucer", "bellhop", "luggage", "hourglass", "hourglassflowing", "watch",
             "alarmclock", "stopwatch", "timerclock", "mantelclock", "twelve", "twelvethirty", "one",
             "onethirty", "two", "twothirty", "three", "threethirty", "four", "fourthirty", "five",
             "fivethirty", "six", "sixthirty", "seven", "seventhirty", "eight", "eightthirty", "nine",
             "ninethirty", "ten", "tenthirty", "eleven", "eleventhirty", "newmoon", "waxingcrescent",
             "firstquarter", "waxinggibbous", "fullmoon", "waninggibbous", "lastquarter",
             "waningcrescent", "crescentmoon", "newmoonface", "firstquarterface", "lastquarterface",
             "thermometer", "sun", "fullmoonface", "sunwithface", "ringedplanet", "starsvg",
             "glowingstar", "shootingstar", "milkyway", "cloud", "sunbehindcloud", "cloudsun",
             "cloudrain", "cloudsnow", "cloudlightning", "cloudtornado", "fog", "windface", "cyclone",
             "rainbow", "closedumbrella", "umbrella", "umbrellarain", "umbrellaground", "bolt",
             "snowflake", "snowman", "snowmanballs", "comet", "droplet", "ocean"]
  },
  "objects" => {
    description: "Objects",
    emotes: ["eyeglasses", "darkglasses", "goggles", "labcoat", "safetyvest", "necktie", "tshirt",
             "jeans", "scarf", "gloves", "coat", "socks", "dress", "kimono", "sari",
             "onepieceswimsuit", "briefs", "shorts", "bikini", "foldedhands", "purse", "handbag",
             "clutchbag", "shoppingbags", "backpack", "thongsandal", "shoe", "runningshoe",
             "hikingboot", "flatsandal", "highheeledsandal", "heels", "boot", "balletshoes", "crown",
             "tophat", "gradcap", "billedcap", "militaryhelmet", "rescueworkerhelmet", "prayerbeads",
             "lipstick", "ring", "gem", "mutedspeaker", "speaker", "mediumspeaker", "loudspeaker",
             "megaphone", "postalhorn", "bell", "nobell", "musicscore", "musicalnote",
             "studiomicrophone", "levelslider", "controlknobs", "radio", "banjo", "mobilephone",
             "phonearrow", "telephone", "pager", "fax", "battery", "lowbattery", "electricplug",
             "computer", "desktop", "printer", "keyboardobj", "computermouse", "trackball", "disk",
             "floppy", "cd", "dvd", "abacus", "moviecamera", "filmframes", "projector", "televisin",
             "cameraphoto", "camerawithflash", "videocamera", "vhs", "mag", "magleft", "candle", "bulb",
             "flashlight", "lantern", "diyalamp", "notebookdecorative", "closedbook", "openbook",
             "greenbook", "bluebook", "orangebook", "books", "notebook", "ledger", "pagewithcurl",
             "scroll", "pagebookmark", "newspaper", "rollednewspaper", "bookmarktabs", "bookmark",
             "label", "moneybag", "coin", "yen", "dollar", "euro", "pound", "moneywings", "creditcard",
             "receipt", "chartincrease", "chartdecrease", "envelopearrow", "email", "incomingenvelope",
             "envelopearrowdown", "outboxtray", "inboxtray", "parcel", "mailbox", "mailboxclosed",
             "mailboxflag", "mailboxnoflag", "postbox", "ballotbox", "pencil", "blacknib",
             "fountainpen", "pen", "paintbrush", "crayon", "memo", "briefcase", "filefolder",
             "openfolder", "dividers", "calendar", "tearoffcalendar", "spiralnotebook",
             "spiralcalendar", "cardindex", "chartincreasing", "chartdecreasing", "bargraph",
             "clipboard", "pushpin", "roundpin", "paperclip", "linkedpaperclips", "straightruler",
             "triangularruler", "scissors", "cardfilebox", "filing", "wastebasket", "locked",
             "unlocked", "lockedwithpen", "lockedwithkey", "key", "oldkey", "hammer", "axe", "pick",
             "hammerandpick", "hammerwrench", "dagger", "swords", "pistol", "boomerangobj",
             "bowwitharrow", "shield", "carpentrysaw", "wrench", "screwdriver", "nutandbolt", "gear",
             "clamp", "balancescale", "whitecane", "link", "chains", "hook", "toolbox", "magnet",
             "ladder", "alembic", "testtube", "petridish", "dna", "microscope", "telescope",
             "satelliteantenna", "syringe", "dropofblood", "pill", "adhesivebandage", "crutch",
             "stethoscope", "xray", "door", "elevator", "mirror", "window", "sofaandlamp", "chair",
             "toilet", "plunger", "shower", "bathtub", "mousetrap", "razor", "lotionbottle",
             "safetypin", "broom", "basket", "rollofpaper", "bucket", "soap", "bubbles", "toothbrush",
             "sponge", "fireextinguisher", "shoppingcart", "cigarette", "coffin", "headstone",
             "funeralurn", "nazaramulet", "hamsa", "moai", "placard", "identificationcard"]
  },
  "symbols" => {
    description: "Symbols",
    emotes: ["atm", "litersign", "potablewater", "wheelchairsymbol", "mensroom", "womensroom",
             "restroom", "babysymbol", "wc", "passportcontrol", "customs", "baggageclaim",
             "leftluggage", "warning", "childcrossing", "noentry", "prohibited", "nobicycles",
             "nosmoking", "nolittering", "nonpotable", "nopedestrians", "nophone", "eighteenplus",
             "up", "upright", "right", "downright", "down", "downleft", "left", "upleft", "updown",
             "leftright", "leftcurve", "rightcurve", "rightarrowcurving", "leftarrowcurving",
             "clockwise", "counterclockwise", "back", "end", "on", "soon", "top", "placeofreligion",
             "om", "starofdavid", "wheelofdharma", "yinyang", "latincross", "orthodoxcross",
             "starandcrescent", "peaceandlove", "menorah", "sixpointedstar", "khanda", "aries",
             "taurus", "gemini", "cancer", "leo", "virgo", "libra", "scorpius", "sagittarius",
             "capricorn", "aquarius", "pisces", "ophiuchus", "shuffletracks", "repeat", "repeatone",
             "playbtn", "fastforward", "nexttrack", "playorpause", "reverse", "rewind", "lasttrack",
             "upbutton", "fastup", "downbutton", "fastdown", "pausebutton", "stopbutton",
             "recordbutton", "ejectbutton", "cinema", "lowbrightness", "highbrightness",
             "signalstrength", "wireless", "vibration", "phoneoff", "female", "male", "transgender",
             "multiply", "plus", "minus", "divide", "heavyequals", "infinity", "bangbang",
             "interrobang", "question", "greyquestion", "exclamation", "greyexclamation", "wavy",
             "currencyexchange", "heavydollar", "medicalymbol", "recycle", "fleurdelis", "trident",
             "namebadge", "beginner", "hollowredcircle", "checkmark", "checkmarkbox", "checkmarkbtn",
             "crossmark", "crossbtn", "curlloop", "doublecurl", "partalt", "eightspoke",
             "eightpointedstar", "sparkle", "copyright", "registered", "trademark", "keycap",
             "keycapzero", "keycapone", "keycaptwo", "keycapthree", "keycapfour", "keycapfive",
             "keycapsix", "keycapseven", "keycapeight", "keycapnine", "keycapten", "hundredpoints",
             "inputlatinuppercase", "inputlatinlowercase", "inputnumbers", "inputsymbols",
             "inputlatinletters", "ablood", "abblood", "bblood", "cl", "cool", "free", "information",
             "id", "circledm", "new", "ng", "oblood", "ok", "parking", "sos", "upexclamation", "vs",
             "kana", "pointingup", "u5272", "u5408", "u55b6", "u6307", "u6708", "u6709", "u6e80",
             "u7121", "u7533", "u7981", "u7a7a", "accept", "redsquare", "orangesquare", "yellowsquare",
             "greensquare", "bluesquare", "purplesquare", "brownsquare", "blacklargesquare",
             "whitelargesquare", "blackmediumsquare", "whitemediumsquare", "blackmedimsmallesquare",
             "whitemediusmallesquare", "blacksmallsquare", "whitesmallsquare", "largeorgdiamond",
             "largebluediamond", "smallorgdiamond", "smallbluediamond", "redtriup", "redtridown",
             "diamondorange", "radiobtn", "whitesqbtn", "blacksqbtn", "chequeredflag",
             "triangularflag", "crossedflags", "blackflag", "whiteflag", "rainbowflag",
             "transgenderflag", "pirateflag"]
  },
  "flags" => {
    description: "Flags",
    emotes: ["ascensionisland", "andorra", "uae", "afghanistan", "antiguabarbuda", "anguilla",
             "albania", "armenia", "angola", "antarctica", "argentina", "americansamoa", "austria",
             "australia", "aruba", "alandislands", "azerbaijan", "bosniaherz", "barbados", "bangladesh",
             "belgium", "burkinafaso", "bulgaria", "bahrain", "burundi", "benin", "stbarts", "bermuda",
             "brunei", "bolivia", "caribnetherlands", "brazil", "bahamas", "bhutan", "bouvetisland",
             "botswana", "belarus", "belize", "canada", "cocosislands", "congokinshasa",
             "centralafrican", "congobrazzaville", "switzerland", "ivorycoast", "cookislands", "chile",
             "cameroon", "china", "colombia", "clipperton", "costarica", "cuba", "capeverde", "curacao",
             "christmasisland", "cyprus", "czechia", "germany", "diegogarcia", "djibouti", "denmark",
             "dominica", "dominicanrep", "algeria", "ceutamelilla", "ecuador", "estonia", "egypt",
             "westernsahara", "eritrea", "spain", "ethiopia", "eu", "finland", "fiji", "falklands",
             "micronesia", "faroeislands", "france", "gabon", "uk", "grenada", "georgia", "frenchguiana",
             "guernsey", "ghana", "gibraltar", "greenland", "gambia", "guinea", "guadeloupe",
             "equatorialguinea", "greece", "southgeorgia", "guatemala", "guam", "guineabissau", "guyana",
             "hongkong", "heardmcdonald", "honduras", "croatia", "haiti", "hungary", "canaryislands",
             "indonesia", "ireland", "israel", "isleofman", "india", "britishindianocean", "iraq",
             "iran", "iceland", "italy", "jersey", "jamaica", "jordan", "japan", "kenya", "kyrgyzstan",
             "cambodia", "kiribati", "comoros", "stkittsnevis", "northkorea", "southkorea", "kuwait",
             "caymanislands", "kazakhstan", "laos", "lebanon", "stlucia", "liechtenstein", "srilanka",
             "liberia", "lesotho", "lithuania", "luxembourg", "latvia", "libya", "morocco", "monaco",
             "moldova", "montenegro", "stmartin", "madagascar", "marshallislands", "macedonia", "mali",
             "myanmar", "mongolia", "macau", "northernmariana", "martinique", "mauritania", "montserrat",
             "malta", "mauritius", "maldives", "malawi", "mexico", "malaysia", "mozambique", "namibia",
             "newcaledonia", "niger", "norfolkisland", "nigeria", "nicaragua", "netherlands", "norway",
             "nepal", "nauru", "niue", "newzealand", "oman", "panama", "peru", "frenchpolynesia",
             "papuanewguinea", "philippines", "pakistan", "poland", "stpierremiq", "pitcairnislands",
             "puertorico", "palestinianterritories", "portugal", "palau", "paraguay", "qatar", "reunion",
             "romania", "serbia", "russia", "rwanda", "saudiarabia", "solomonislands", "seychelles",
             "sudan", "sweden", "singapore", "sthelena", "slovenia", "svalbardjanmayen", "slovakia",
             "sierraleone", "sanmarino", "senegal", "somalia", "suriname", "southsudan",
             "saotomeprincipe", "elsalvador", "sintmaarten", "syria", "eswatini", "tristanda",
             "turkscaicos", "chad", "frenchsouthern", "togo", "thailand", "tajikistan", "tokelau",
             "timorleste", "turkmenistan", "tunisia", "tonga", "turkey", "trinidadtobago", "tuvalu",
             "taiwan", "tanzania", "ukraine", "uganda", "usoutlyingislands", "un", "us", "uruguay",
             "uzbekistan", "vaticancity", "stvincentgren", "venezuela", "britishvirginislands",
             "usvirginislands", "vietnam", "vanuatu", "wallisfutuna", "samoa", "kosovo", "yemen",
             "mayotte", "southafrica", "zambia", "zimbabwe", "england", "scotland", "wales"]
  }
}.freeze
CONFIG_DIR =
File.expand_path("~/.config/rage_flip")
JSON_CONFIG_FILE =
File.join(CONFIG_DIR, "emote.json")
YAML_CONFIG_FILE =
File.join(CONFIG_DIR, "emote.yml")

Class Method Summary collapse

Class Method Details

.all_emotesObject



1907
1908
1909
# File 'lib/rage_flip/emote.rb', line 1907

def self.all_emotes
  @all_emotes ||= EMOTES.merge(load_custom_emotes)
end

.category_namesObject

Get all category names



2059
2060
2061
# File 'lib/rage_flip/emote.rb', line 2059

def self.category_names
  CATEGORIES.keys
end

.custom_config_pathObject



1881
1882
1883
1884
1885
# File 'lib/rage_flip/emote.rb', line 1881

def self.custom_config_path
  return JSON_CONFIG_FILE if File.exist?(JSON_CONFIG_FILE)
  return YAML_CONFIG_FILE if File.exist?(YAML_CONFIG_FILE)
  nil
end

.emoji_only?(value) ⇒ Boolean

Check if an emote value contains only emoji (no ASCII art or text)

Returns:

  • (Boolean)


1917
1918
1919
1920
1921
# File 'lib/rage_flip/emote.rb', line 1917

def self.emoji_only?(value)
  # Remove all emoji and see if anything is left (besides spaces)
  # This regex matches emoji characters
  value.gsub(/[\p{Emoji}\p{Emoji_Presentation}\p{Emoji_Modifier}\p{Emoji_Component}]/, '').strip.empty?
end

.emoji_only_emotesObject

Get all emoji-only emotes



1924
1925
1926
# File 'lib/rage_flip/emote.rb', line 1924

def self.emoji_only_emotes
  @emoji_only_emotes ||= all_emotes.select { |name, value| emoji_only?(value) }
end

.emote_exists?(name) ⇒ Boolean

Returns:

  • (Boolean)


2050
2051
2052
# File 'lib/rage_flip/emote.rb', line 2050

def self.emote_exists?(name)
  all_emotes.key?(name.downcase)
end

.emote_namesObject



2054
2055
2056
# File 'lib/rage_flip/emote.rb', line 2054

def self.emote_names
  all_emotes.keys
end

.find_emote_combination(name, start = 0, memo = {}) ⇒ Object

Find a valid combination of emoji-only emotes that match the compound name



1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
# File 'lib/rage_flip/emote.rb', line 1944

def self.find_emote_combination(name, start = 0, memo = {})
  return [] if start >= name.length
  return memo[[name, start]] if memo.key?([name, start])

  # Try each emoji-only emote starting at this position
  emoji_only_emotes.each do |emote_name, emote_value|
    next unless name[start..-1].start_with?(emote_name)

    rest_start = start + emote_name.length
    if rest_start >= name.length
      # We've matched the entire string
      memo[[name, start]] = [emote_value]
      return [emote_value]
    end

    # Try to match the rest
    rest = find_emote_combination(name, rest_start, memo)
    if rest
      result = [emote_value] + rest
      memo[[name, start]] = result
      return result
    end
  end

  memo[[name, start]] = nil
  nil
end

.get_category_emotes(category_name) ⇒ Object

Get emotes for a specific category



2079
2080
2081
2082
2083
2084
2085
2086
# File 'lib/rage_flip/emote.rb', line 2079

def self.get_category_emotes(category_name)
  category = CATEGORIES[category_name.downcase]
  return [] unless category

  emotes = category[:emotes]
  # Filter to only include emotes that actually exist
  emotes.select { |name| EMOTES.key?(name) }
end

.init_custom_configObject



2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
# File 'lib/rage_flip/emote.rb', line 2028

def self.init_custom_config
  FileUtils.mkdir_p(CONFIG_DIR) unless Dir.exist?(CONFIG_DIR)

  if File.exist?(JSON_CONFIG_FILE) || File.exist?(YAML_CONFIG_FILE)
    existing_file = File.exist?(JSON_CONFIG_FILE) ? JSON_CONFIG_FILE : YAML_CONFIG_FILE
    return "Custom emote config already exists: #{existing_file}"
  end

  # Create a sample JSON config file
  sample_config = {
    "example" => "This is an example custom emote",
    "heart" => "❤️",
    "wave" => "👋"
  }

  File.write(JSON_CONFIG_FILE, JSON.pretty_generate(sample_config))
  refresh_emotes

  "Custom emote config initialized: #{JSON_CONFIG_FILE}\n" +
  "Edit this file to add your custom emotes, then use 'emote list-custom' to see them."
end

.list_categoriesObject

List all categories with their descriptions



2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
# File 'lib/rage_flip/emote.rb', line 2064

def self.list_categories
  output = ["Available categories:", ""]
  max_name_length = CATEGORIES.keys.map(&:length).max

  CATEGORIES.each do |name, info|
    count = get_category_emotes(name).length
    output << "  #{name.ljust(max_name_length + 2)} - #{info[:description]} (#{count} emotes)"
  end

  output << ""
  output << "Use 'emote category <name>' to see emotes in a specific category"
  output.join("\n")
end

.list_category(category_name) ⇒ Object

List emotes in a specific category



2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
# File 'lib/rage_flip/emote.rb', line 2089

def self.list_category(category_name)
  category_name = category_name.downcase
  category = CATEGORIES[category_name]

  unless category
    return "Unknown category: #{category_name}\n\n" + list_categories
  end

  emotes = get_category_emotes(category_name)

  if emotes.empty?
    return "No emotes found in category: #{category_name}"
  end

  output = ["#{category[:description]}:", ""]
  # Sort emotes by name for better organization
  sorted_emotes = emotes.sort.map { |name| [name, EMOTES[name]] }

  # Calculate max name length for better alignment
  max_name_length = sorted_emotes.map { |name, _| name.length }.max

  sorted_emotes.each do |name, emote|
    output << "  #{name.ljust(max_name_length + 2)} - #{emote}"
  end

  output.join("\n")
end

.list_custom_emotesObject



2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
# File 'lib/rage_flip/emote.rb', line 2001

def self.list_custom_emotes
  custom_emotes = load_custom_emotes

  if custom_emotes.empty?
    return "No custom emotes found. Use 'emote init-custom' to create a custom emote config file."
  end

  output = ["Custom emotes:"]
  # Sort emotes by name for better organization
  sorted_emotes = custom_emotes.sort_by { |name, _| name }

  # Calculate max name length for better alignment
  max_name_length = sorted_emotes.map { |name, _| name.length }.max

  sorted_emotes.each do |name, emote|
    output << "  #{name.ljust(max_name_length + 2)} - #{emote}"
  end

  config_path = custom_config_path
  if config_path
    output << ""
    output << "Config file: #{config_path}"
  end

  output.join("\n")
end

.list_emotesObject



1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
# File 'lib/rage_flip/emote.rb', line 1987

def self.list_emotes
  output = ["Available emotes:"]
  # Sort emotes by name for better organization
  sorted_emotes = all_emotes.sort_by { |name, _| name }

  # Calculate max name length for better alignment
  max_name_length = sorted_emotes.map { |name, _| name.length }.max

  sorted_emotes.each do |name, emote|
    output << "  #{name.ljust(max_name_length + 2)} - #{emote}"
  end
  output.join("\n")
end

.load_custom_emotesObject



1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
# File 'lib/rage_flip/emote.rb', line 1887

def self.load_custom_emotes
  config_path = custom_config_path
  return {} unless config_path

  begin
    content = File.read(config_path)
    case File.extname(config_path)
    when '.json'
      JSON.parse(content)
    when '.yml', '.yaml'
      YAML.safe_load(content) || {}
    else
      {}
    end
  rescue => e
    puts "Warning: Failed to load custom emotes from #{config_path}: #{e.message}"
    {}
  end
end

.process(emote_name) ⇒ Object



1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
# File 'lib/rage_flip/emote.rb', line 1972

def self.process(emote_name)
  emote_name = emote_name.downcase

  # First check if it exists as-is
  if all_emotes.key?(emote_name)
    return all_emotes[emote_name]
  end

  # Try to split as compound emote
  compound_result = split_compound_emote(emote_name)
  return compound_result.join('') if compound_result

  nil
end

.refresh_emotesObject



1911
1912
1913
1914
# File 'lib/rage_flip/emote.rb', line 1911

def self.refresh_emotes
  @all_emotes = nil
  @emoji_only_emotes = nil
end

.show_helpObject

Show help text



2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
# File 'lib/rage_flip/emote.rb', line 2118

def self.show_help
  <<~HELP
    Usage: emote [command] [arguments]

    Commands:
      emote                    - List all available emotes
      emote list               - List all available emotes
      emote categories         - List all emote categories
      emote category <name>    - List emotes in a specific category
      emote list-custom        - List custom emotes
      emote init-custom        - Initialize custom emote config file
      emote help               - Show this help message
      emote <name> [<name>...] - Output one or more emotes (copies to clipboard)

    Examples:
      emote smile              - Output 😄
      emote pizza beer         - Output 🍕🍺
      emote categories         - Show all categories
      emote category food      - Show all food emotes

    Categories:
      custom, keyboard, smileys, animals, combined, food,
      activity, travel, objects, symbols, flags

    Compound Emotes:
      You can combine emoji-only emotes by using hyphens or concatenating names:
      emote cat-poop          - Output 🐱💩
      emote catpoop           - Output 🐱💩
  HELP
end

.split_compound_emote(compound_name) ⇒ Object

Try to split a compound emote name into parts Returns an array of emote values if successful, nil otherwise



1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
# File 'lib/rage_flip/emote.rb', line 1930

def self.split_compound_emote(compound_name)
  # First try splitting by hyphen
  if compound_name.include?('-')
    parts = compound_name.split('-')
    results = parts.map { |part| all_emotes[part] }
    return results if results.all? && results.all? { |r| emoji_only?(r) }
  end

  # Try to find a combination of emoji-only emotes without separator
  # Use dynamic programming to find valid splits
  return find_emote_combination(compound_name)
end