diff options
-rw-r--r-- | lua/sleep.lua | 121 | ||||
-rw-r--r-- | sleep.json | 12 |
2 files changed, 125 insertions, 8 deletions
diff --git a/lua/sleep.lua b/lua/sleep.lua index d84480e..a47f87e 100644 --- a/lua/sleep.lua +++ b/lua/sleep.lua @@ -1,13 +1,17 @@ -local timer = { +local config_file = "../sleep.json" -- TODO: update path to . + +local time = { minutes = 25, active = false, format = "%02d:%02d:%02d", -- (HH:MM:SS) remaining = nil, + prev_state = { - timestamp = nil, + timestamp = "", + remaining = nil, was_active = false, + last_update = "", -- ISO 8601 }, - config_file = "sleep.json" } local gesture_state = { @@ -16,12 +20,113 @@ local gesture_state = { latency = 3, -- seconds } -local function reinstate_tstamp() - -- call read_config and grab the exported time stamp, then seek to that position in the file + +--[[ todo: +perhaps instead of using a json config_file, we simply write the state attributes at the top of this config_file. +then have test.lua edit itself as need be. +]] + +--[[ +TODO: merge `read_default_time()` and `read_prev_state` + into `read_jsonkey_value(file_str, block_key, value_key)` + then have called by `reinstate_prevstate()` to retrieve keys (timestamp, last_updated, etc.) + and also wherever read_default_time shoudl be called, will retrieve default_time in config block + + (parsing logic is the same, so we should reduce the code) +]] + +--------------------------- +-- JSON PARSER -- +--------------------------- + +local function read_default_time(file_str) + local config_block_i = string.find(file_str, "\"config\"") + if not config_block_i then + print("\"config\" not found in " .. config_file) + return nil + end + + local end_config_i = string.find(file_str, "}", config_block_i) + if not end_config_i then + print("formatting error in " .. config_file) + return nil + end + + local substr = string.sub(file_str, config_block_i, end_config_i) + local def_time = string.match(substr, "\"default_time\"%s*:%s*(%d+)") + + if not def_time then + print("could not extract \"default_time\" value in \"config\" key from " .. config_file) + return nil + end + + return tonumber(def_time) +end + +local function read_prev_state(file_str) + -- we want to extract under previous_state: + -- timestamp + -- last_updated + -- was_active + -- last_update + + local prevstate_block_i = string.find(file_str, "\"previous_state\"") + if not prevstate_block_i then + print("\"previous_state\" block not found in " .. config_file) + return nil + end + + local end_prevstate_i = string.find(file_str, "}", prevstate_block_i) + if not end_prevstate_i then + print("formatting error in " .. config_file) + return nil + end + + local substr = string.sub(file_str, prevstate_block_i, end_prevstate_i) + local tstamp = string.match(substr, "\"timestamp\"%s*:%s*\"(.-)\"") + local lastup = string.match(substr, "\"last_updated\"%s*:%s*\"(.-)\"") + local was_active = string.match(substr, "\"was_active\"%s*:%s*([a-zA-Z]+)") + + if not tstamp then + print("could not extract \"timestamp\" value in \"previous_state\" key from " .. config_file) + return nil + end + + if not lastup then + print("could not extract \"last_updated\" value in \"previous_state\" key from " .. config_file) + return nil + end + + if not was_active then + print("could not extract \"was_active\" value in \"previous_state\" key from " .. config_file) + return nil + end end local function read_config() - -- if failed, then return mock/default settings defined here + print("opening", config_file .. "...") + + local openf = io.input(config_file) + if openf == nil then + print("failed to open", config_file .. "!") + -- TODO: we should make sure it exists, otherwise should create it + end + + local file_str = openf:read("*all") + if file_str == nil or file_str == "" then + print("failed to read config_file into string or config_file is empty") + end + + read_default_time(file_str) + read_prev_state(file_str) + + print("closing", config_file .. ".") + io.close(openf) +end + +local function reinstate_tstamp() + -- call read_config and grab the exported time stamp, then seek to that position in the config_file + -- config_file is, timer end local function export_time() @@ -59,10 +164,10 @@ local function handle_gesture() -- should include debouncing logic for clean gesture input (eg. ignore calls made within some tiny time before each other) end --- called immediately upon opening a media file +-- called immediately upon opening a media config_file function main() mp.osd_message("Sleep timer script initialized!", 3) end mp.add_key_binding(nil, "sleep", handle_gesture) -- the user invokes this by gesturing (user-set in input.conf) -main() -- this is run upon opening a media file +main() -- this is run upon opening a media config_file diff --git a/sleep.json b/sleep.json new file mode 100644 index 0000000..39eb3bd --- /dev/null +++ b/sleep.json @@ -0,0 +1,12 @@ +{ + "config": { + "default_time": 25, + "default_time_format": "%02d:%02d:%02d" + "_comment_default_time_format": "DO NOT CHANGE THIS! ^" + }, + "previous_state": { + "timestamp": "00:00:00", + "last_updated": "2025-01-02T23:07:25Z" + "was_active": false, + } +} |