import obspython as S

plugin_version = 1.0
source_name = "RUSTMapOverlay"

def script_description():
  return f"""
<h3>CDEV [RUST Map Overlay] v{plugin_version}</h3>
Плагин закрывающий экран во время просмотра карты в игре <b>RUST</b>
<h4>Инструкция:</h4>
<ol>
<li>Создайте <b>источник</b> с названием <b>"{source_name}"</b></li>
<li>Установите <b>горячую клавишу</b> в настрйоках - <b>"RUST Map Overlay"</b></li>
</ol>
Пока Вы держите зажатой указанную Вами кнопку, источник будет отображаться.<br>
Как только Вы отпустите кнопку, источник будет скрыт на сцене
"""

print(f"Map Overlay CDEV v{plugin_version}")

class Hotkey:
    def __init__(self, callback, obs_settings, _id):
        self.obs_data = obs_settings
        self.hotkey_id = S.OBS_INVALID_HOTKEY_ID
        self.hotkey_saved_key = None
        self.callback = callback
        self._id = _id

        self.load_hotkey()
        self.register_hotkey()
        self.save_hotkey()

    def register_hotkey(self):
        description = "CDEV [" + str(self._id) + "]"
        self.hotkey_id = S.obs_hotkey_register_frontend(
            "htk_id" + str(self._id), description, self.callback
        )
        S.obs_hotkey_load(self.hotkey_id, self.hotkey_saved_key)

    def load_hotkey(self):
        self.hotkey_saved_key = S.obs_data_get_array(
            self.obs_data, "htk_id" + str(self._id)
        )
        S.obs_data_array_release(self.hotkey_saved_key)

    def save_hotkey(self):
        self.hotkey_saved_key = S.obs_hotkey_save(self.hotkey_id)
        S.obs_data_set_array(
            self.obs_data, "htk_id" + str(self._id), self.hotkey_saved_key
        )
        S.obs_data_array_release(self.hotkey_saved_key)

class Keyboard:
    def __init__(self):
        self.hotkeys_map = {}
        self.hotkeys_obj = []
        self.inspect_self()

    def desc(description):
        def actual_decorator(func):
            func.desc = description
            return func

        return actual_decorator

    def do_load(self, settings):
        for h_id, cb in self.hotkeys_map.items():
            self.hotkeys_obj.append(Hotkey(cb, settings, h_id))

    def do_save(self, settings):
        for i in self.hotkeys_obj:
            if i is not None:
                i.save_hotkey()

    def inspect_self(self):
        for attr, value in vars(self.__class__).items():
            if callable(value) and hasattr(value, "desc"):
                self.hotkeys_map[value.desc] = value

    @desc("RUST Mao Overlay")
    def cb1(pressed):
        if pressed:
            showOverlay()
        else:
            hideOverlay()

kbd = Keyboard()

class e:
    txt = "default txt"

e1 = e()
e2 = e()

def showOverlay():
  current_scene_as_source = S.obs_frontend_get_current_scene()
  if current_scene_as_source:
    current_scene = S.obs_scene_from_source(current_scene_as_source)
    scene_item = S.obs_scene_find_source_recursive(current_scene, source_name)
    if scene_item:
        S.obs_sceneitem_set_visible(scene_item, True)
    S.obs_source_release(current_scene_as_source)

def hideOverlay():
  current_scene_as_source = S.obs_frontend_get_current_scene()
  if current_scene_as_source:
    current_scene = S.obs_scene_from_source(current_scene_as_source)
    scene_item = S.obs_scene_find_source_recursive(current_scene, source_name)
    if scene_item:
        S.obs_sceneitem_set_visible(scene_item, False)
    S.obs_source_release(current_scene_as_source)

def script_load(settings):
    kbd.do_load(settings)

def script_save(settings):
    kbd.do_save(settings)