timer/lua/timer.lua
2024-10-07 21:32:23 +02:00

162 lines
3.9 KiB
Lua
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local TOML = require("toml")
local augroup = vim.api.nvim_create_augroup("Timer", { clear = true })
local focus_events = {}
local clean_to = 1
function trim(s)
return (s:gsub("^%s*(.-)%s*$", "%1"))
end
local function clean_from(from, events)
local to = 1
local clean_events = {}
-- coppy until from
for i = 1, from - 1, 1 do
table.insert(clean_events, events[i])
end
local last = {}
for i = from, #events, 1
do
local event = events[i]
local next_event = events[i + 1]
if next_event == nil then
--do nothing
elseif next_event.event == "gain" and event.event == "lose" then
if os.difftime(next_event.time, event.time) > 5 * 60 then
table.insert(clean_events, event)
end
end
if last == nil then
-- do nothing
elseif last.event == "lose" and event.event == "gain" then
if os.difftime(event.time, last.time) > 5 * 60 then
table.insert(clean_events, event)
end
end
last = event
end
return clean_events
end
local function time()
focus_events = clean_from(clean_to + 1, focus_events)
clean_to = #focus_events
local t = 0
local start = os.time()
for _, fe in pairs(focus_events) do
if fe.event == "gain" then
start = fe.time
else
t = t + os.difftime(fe.time, start)
end
if focus_events[#focus_events].event == "gain" then
t = t + os.difftime(os.time(), focus_events[#focus_events].time)
end
end
return t
end
local function log_time()
print(time())
end
local function log_time_table()
for i, e in pairs(focus_events) do
print(i, e.event, os.date("%H:%M:%S", e.time))
end
end
local function focus_gained()
print("Huiii Fokus")
table.insert(focus_events, {
time = os.time(),
event = "gain",
})
end
local function focus_lost()
print("Hokus pokus fort ist der fokus")
table.insert(focus_events, {
time = os.time(),
event = "lose",
})
end
local function persist()
local filename = ".timer.toml"
local username = trim(os.getenv("USER")) .. "_at_" .. trim(io.popen("hostname -s"):read("*a"))
local today = os.date("%y-%m-%d", os.time())
local table = {}
local file = io.open(filename, "r")
-- if file exists read
if file ~= nil then
table = TOML.parse(file:read("*a"))
file:close()
end
-- write time to table
if table[today] ~= nil and table[today][username] ~= nil then
table[today][username] = table[today][username] + time()
else
if table[today] == nil then
table[today] = {}
end
table[today][username] = time()
end
-- write table to file
file = io.open(filename, "w")
if file == nil then
error("can't write to .timer file")
return
end
file:write("## dates and their corresponding seconds been here :)\n", TOML.encode(table), "\n")
file.close()
--reset timer
clean_to = 1
focus_events = {}
focus_gained()
end
local function setup()
vim.api.nvim_create_autocmd("VimEnter",
{ group = augroup, desc = "Start Timer", once = true, callback = focus_gained })
vim.api.nvim_create_autocmd("ExitPre",
{ group = augroup, desc = "Persist timer", once = true, callback = persist })
vim.api.nvim_create_autocmd("FocusGained", { group = augroup, callback = focus_gained })
vim.api.nvim_create_autocmd("FocusLost", { group = augroup, callback = focus_lost })
vim.api.nvim_create_user_command(
'Timer', -- The name of the command (accessible via :TimerStart)
log_time,
{ nargs = 0 } -- No arguments for this command (you can configure this later)
)
vim.api.nvim_create_user_command(
'TimerLog', -- The name of the command (accessible via :TimerStart)
log_time_table,
{ nargs = 0 } -- No arguments for this command (you can configure this later)
)
vim.api.nvim_create_user_command(
'TimerSave', -- The name of the command (accessible via :TimerStart)
persist,
{ nargs = 0 } -- No arguments for this command (you can configure this later)
)
end
return { setup = setup }