aboutsummaryrefslogblamecommitdiffstats
path: root/slack/slack_emoji.py
blob: d6247c3b0a4224c2ead7ed8ad2884959864b50a1 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13



                                  
                                      







                                                        
 


                                        
 




                                                                  




































                                                                                   
from __future__ import annotations

import json
import os
from typing import TYPE_CHECKING, Dict

import weechat

from slack.error import store_and_format_exception
from slack.log import print_error

if TYPE_CHECKING:
    from typing_extensions import NotRequired, TypedDict

    class EmojiSkinVariation(TypedDict):
        name: str
        unicode: str

    class Emoji(TypedDict):
        aliasOf: NotRequired[str]
        name: str
        skinVariations: NotRequired[Dict[str, EmojiSkinVariation]]
        unicode: str


def load_standard_emojis() -> Dict[str, Emoji]:
    weechat_dir = weechat.info_get("weechat_data_dir", "") or weechat.info_get(
        "weechat_dir", ""
    )
    weechat_sharedir = weechat.info_get("weechat_sharedir", "")
    local_weemoji, global_weemoji = (
        f"{path}/weemoji.json" for path in (weechat_dir, weechat_sharedir)
    )
    path = (
        global_weemoji
        if os.path.exists(global_weemoji) and not os.path.exists(local_weemoji)
        else local_weemoji
    )
    if not os.path.exists(path):
        return {}

    try:
        with open(path) as f:
            emojis: Dict[str, Emoji] = json.loads(f.read())

            emojis_skin_tones: Dict[str, Emoji] = {
                skin_tone["name"]: {
                    "name": skin_tone["name"],
                    "unicode": skin_tone["unicode"],
                }
                for emoji in emojis.values()
                if "skinVariations" in emoji
                for skin_tone in emoji["skinVariations"].values()
            }

            emojis.update(emojis_skin_tones)
            return emojis
    except Exception as e:
        print_error(f"couldn't read weemoji.json: {store_and_format_exception(e)}")
        return {}