import obspython as obs
import time

plugin_version = 1.2
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> (если необходимо)</li>
<li>Укажите название сцены в поле <b>Название сцены</b></li>
<li>Создайте <b>источник</b> (если необходимо)</li>
<li>Укажите название источника в поле <b>Название источника</b></li>
<li>Установите задержку скрытия <b>источника</b></li>
<li>Установите <b>горячую клавишу</b> в настрйоках - <b>"RUST Map Overlay"</b></li>
</ol>
Пока Вы держите зажатой указанную Вами кнопку, источник будет отображаться.<br>
Как только Вы отпустите кнопку, источник будет скрыт на сцене
"""

class HotkeyListener:
    def __init__(self, callback, obsSettings, _id):
        self._id = _id
        self.obsSettings = obsSettings
        self.hotkeyId = obs.OBS_INVALID_HOTKEY_ID
        self.hotkeyKey = None
        self.callback = callback
        self.load()

    def load(self):
        self.hotkeyKey = obs.obs_data_get_array(self.obsSettings,  str(self._id))
        obs.obs_data_array_release(self.hotkeyKey)
        self.hotkeyId = obs.obs_hotkey_register_frontend(str(self._id), str(self._id), self.callback)
        obs.obs_hotkey_load(self.hotkeyId, self.hotkeyKey)
        self.save()

    def save(self):
        self.hotkeyKey = obs.obs_hotkey_save(self.hotkeyId)
        obs.obs_data_set_array(self.obsSettings, str(self._id), self.hotkeyKey)
        obs.obs_data_array_release(self.hotkeyKey)

def HotkeyListener_callback(isPressed):
    obsSource = obs.obs_frontend_get_current_scene()
    if data.scene != "" and data.scene != obs.obs_source_get_name(obsSource):
        obs.obs_source_release(obsSource)
        return
    obs.obs_source_release(obsSource)
    if isPressed:
        overlay_toggle(True)
    else:  
        time.sleep(data.delay)
        overlay_toggle(False)

def overlay_toggle(state):
    obsSource = obs.obs_frontend_get_current_scene()
    obsScene = obs.obs_scene_from_source(obsSource)
    obsItem = obs.obs_scene_find_source(obsScene, data.image)
    obs.obs_sceneitem_set_visible(obsItem, state)
    obs.obs_source_release(obsSource)

def script_properties():
    props = obs.obs_properties_create()
    obs.obs_properties_add_float_slider(props, "cdevrust_delay", "Задержка скрытия в мс:", 0, 0.99, 0.02)
    obs.obs_properties_add_text(props, "cdevrust_sceneName", "Название сцены:", obs.OBS_TEXT_DEFAULT)
    obs.obs_properties_add_text(props, "cdevrust_sourceName", "Название источника:", obs.OBS_TEXT_DEFAULT)
    return props

def script_save(config):
    data.hotkey.save()

def script_load(config):
    data.hotkey = HotkeyListener(HotkeyListener_callback, config, "CDEV [RUST Map Overlay]")
    data.delay = obs.obs_data_get_double(config, "cdevrust_delay")
    data.scene = obs.obs_data_get_string(config, "cdevrust_sceneName")
    data.source = obs.obs_data_get_string(config, "cdevrust_sourceName")

def script_update(config):
    data.delay = obs.obs_data_get_double(config, "cdevrust_delay")
    data.scene = obs.obs_data_get_string(config, "cdevrust_sceneName")
    data.source = obs.obs_data_get_string(config, "cdevrust_sourceName")

class Defaults:
    delay = 0
    hotkey = None
    scene = ""
    source = ""

data = Defaults()