a lot of stuff and added dbus_proxy as sub module

This commit is contained in:
Rene
2022-09-12 21:16:19 +02:00
parent e5cdb33eec
commit 3d8b240ef0
26 changed files with 1730 additions and 297 deletions

View File

@@ -1,6 +1,14 @@
local ical = {}
local gfilesystem = require("gears.filesystem")
local gobject = require("gears.object")
local gtable = require("gears.table")
local naughty = require("naughty")
local json = require("src.lib.json-lua.json-lua")
local ical = { mt = {} }
ical.VCALENDAR = {}
ical._private = {}
ical._private.cache = {}
ical._private.parser = {}
--[[
@@ -63,24 +71,74 @@ ical._private.parser = {}
DTSTAMP = "...",
]]
---Takes a path to an .ical file then parses it into a lua table and returns it
---@param path string Path to the .ical file
---@return table | nil calendar New calendar table or nil on error
function ical.new(path)
local handler = io.open(path, "r")
function ical._private.add_to_cache(file, vcal)
-- Copy file to src/config/files/calendar/
local path = gfilesystem.get_configuration_dir() .. "src/config/"
local file_name = file:match(".*/(.*)")
if not
os.execute("cp " ..
file .. " " .. gfilesystem.get_configuration_dir() .. "src/config/files/calendar/" .. file_name) then
naughty.notification({
app_name = "Systemnotification",
title = "Error",
text = "Could not copy file to config/files/calendar/",
timeout = 0,
urgency = "critical",
})
return
end
local handler = io.open(path .. "calendar.json", "r")
if not handler then return end
local json_data = json:decode(handler:read("a"))
handler:close()
if not (type(json_data) == "table") then return end
table.insert(json_data, {
file = file_name,
VCALENDAR = vcal,
})
json_data = json:encode(json_data)
handler = io.open(path .. "calendar.json", "w")
if not handler then return end
handler:write(json_data)
handler:close()
end
function ical:add_calendar(file)
local handler = io.open(file, "r")
if not handler then return end
-- Check if the line is a BEGIN:VCALENDAR
local v, k = handler:read("l"):match("([A-Z]+):([A-Z]+)")
local vcal = {}
if v:match("BEGIN") and k:match("VCALENDAR") then
table.insert(ical.VCALENDAR, ical._private.parser.VCALENDAR(handler))
return ical
vcal = self._private.parser.VCALENDAR(handler)
table.insert(self.VCALENDAR, vcal)
self._private.add_to_cache(file, vcal)
end
end
function ical.new(args)
args = args or {}
local ret = gobject {}
gtable.crush(ret, ical, true)
local path = gfilesystem.get_configuration_dir() .. "src/config/calendar.json"
local handler = io.open(path, "r")
if not handler then return end
local json_data = json:decode(handler:read("a"))
handler:close()
if not (type(json_data) == "table") then return end
--Load into the cache
for _, v in ipairs(json_data) do
ret._private.cache[v.file] = v.VCALENDAR
table.insert(ret.VCALENDAR, v.VCALENDAR)
end
return ical
end
function ical._private.parser.VEVENT(handler)
function ical._private.parser:VEVENT(handler)
local VEVENT = {}
while true do
@@ -92,11 +150,11 @@ function ical._private.parser.VEVENT(handler)
local v, k = line:match("(.*):(.*)")
if v:match("CREATED") then
VEVENT.CREATED = ical._private.parser.to_datetime(k)
VEVENT.CREATED = self._private.parser.to_datetime(k)
elseif v:match("LAST-MODIFIED") then
VEVENT.LAST_MODIFIED = ical._private.parser.to_datetime(k)
VEVENT.LAST_MODIFIED = self._private.parser.to_datetime(k)
elseif v:match("DTSTAMP") then
VEVENT.DTSTAMP = ical._private.parser.to_datetime(k)
VEVENT.DTSTAMP = self._private.parser.to_datetime(k)
elseif v:match("UID") then
VEVENT.UID = k
elseif v:match("SUMMARY") then
@@ -104,20 +162,20 @@ function ical._private.parser.VEVENT(handler)
elseif v:match("RRULE") then
VEVENT.RRULE = {
FREQ = k:match("FREQ=([A-Z]+)"),
UNTIL = ical._private.parser.to_datetime(k:match("UNTIL=([TZ0-9]+)")),
UNTIL = self._private.parser.to_datetime(k:match("UNTIL=([TZ0-9]+)")),
WKST = k:match("WKST=([A-Z]+)"),
COUNT = k:match("COUNT=([0-9]+)"),
INTERVAL = k:match("INTERVAL=([0-9]+)")
}
elseif v:match("DTSTART") then
VEVENT.DTSTART = {
DTSTART = ical._private.parser.to_datetime(k),
DTSTART = self._private.parser.to_datetime(k),
TZID = v:match("TZID=([a-zA-Z-\\/]+)"),
VALUE = v:match("VALUE=([A-Z]+)")
}
elseif v:match("DTEND") then
VEVENT.DTEND = {
DTEND = ical._private.parser.to_datetime(k),
DTEND = self._private.parser.to_datetime(k),
TZID = v:match("TZID=([a-zA-Z-\\/]+)"),
VALUE = v:match("VALUE=([A-Z]+)")
}
@@ -134,11 +192,12 @@ function ical._private.parser.VEVENT(handler)
}
elseif v:match("BEGIN") then
if k:match("VALARM") then
VEVENT.VALARM = ical._private.parser.VALARM(handler)
VEVENT.VALARM = self._private.parser:VALARM(handler)
end
elseif v:match("UID") then
VEVENT.UID = k
end
end
--VEVENT.duration = VEVENT.DTSTART.DTSTART - VEVENT.DTEND.DTEND
return VEVENT
@@ -153,7 +212,7 @@ function ical._private.parser.alarm_to_time(alarm)
return time .. unit
end
function ical._private.parser.VALARM(handler)
function ical._private.parser:VALARM(handler)
local VALARM = {}
while true do
@@ -169,7 +228,7 @@ function ical._private.parser.VALARM(handler)
elseif v:match("TRIGGER;VALUE=DURATION") then
VALARM.TRIGGER = {
VALUE = v:match("VALUE=(.*):"),
TRIGGER = ical._private.parser.alarm_to_time(k)
TRIGGER = self._private.parser.alarm_to_time(k)
}
elseif v:match("DESCRIPTION") then
VALARM.DESCRIPTION = k
@@ -179,7 +238,7 @@ function ical._private.parser.VALARM(handler)
return VALARM
end
function ical._private.parser.VCALENDAR(handler)
function ical._private.parser:VCALENDAR(handler)
local VCALENDAR = {}
VCALENDAR.VEVENT = {}
VCALENDAR.VTIMEZONE = {}
@@ -199,9 +258,9 @@ function ical._private.parser.VCALENDAR(handler)
VCALENDAR.VERSION = k
elseif v:match("BEGIN") then
if k:match("VTIMEZONE") then
VCALENDAR.VTIMEZONE = ical._private.parser.VTIMEZONE(handler)
VCALENDAR.VTIMEZONE = self._private.parser:VTIMEZONE(handler)
elseif k:match("VEVENT") then
table.insert(VCALENDAR.VEVENT, ical._private.parser.VEVENT(handler))
table.insert(VCALENDAR.VEVENT, self._private.parser:VEVENT(handler))
end
end
end
@@ -211,7 +270,7 @@ function ical._private.parser.VCALENDAR(handler)
return VCALENDAR
end
function ical._private.parser.VTIMEZONE(handler)
function ical._private.parser:VTIMEZONE(handler)
local VTIMEZONE = {}
while true do
@@ -227,9 +286,9 @@ function ical._private.parser.VTIMEZONE(handler)
end
if v:match("BEGIN") then
if k:match("DAYLIGHT") then
VTIMEZONE.DAYLIGHT = ical._private.parser.DAYLIGHT(handler)
VTIMEZONE.DAYLIGHT = self._private.parser:DAYLIGHT(handler)
elseif k:match("STANDARD") then
VTIMEZONE.STANDARD = ical._private.parser.STANDARD(handler)
VTIMEZONE.STANDARD = self._private.parser:STANDARD(handler)
end
end
end
@@ -237,7 +296,7 @@ function ical._private.parser.VTIMEZONE(handler)
return VTIMEZONE
end
function ical._private.parser.DAYLIGHT(handler)
function ical._private.parser:DAYLIGHT(handler)
local DAYLIGHT = {}
while true do
@@ -249,13 +308,13 @@ function ical._private.parser.DAYLIGHT(handler)
local v, k = line:match("(.*):(.*)")
if v:match("TZOFFSETFROM") then
DAYLIGHT.TZOFFSETFROM = ical._private.parser.offset(k)
DAYLIGHT.TZOFFSETFROM = self._private.parser.offset(k)
elseif v:match("TZOFFSETTO") then
DAYLIGHT.TZOFFSETTO = ical._private.parser.offset(k)
DAYLIGHT.TZOFFSETTO = self._private.parser.offset(k)
elseif v:match("TZNAME") then
DAYLIGHT.TZNAME = k
elseif v:match("DTSTART") then
DAYLIGHT.DTSTART = ical._private.parser.to_datetime(k)
DAYLIGHT.DTSTART = self._private.parser.to_datetime(k)
elseif v:match("RRULE") then
DAYLIGHT.RRULE = {
FREQ = k:match("FREQ=([A-Z]+)"),
@@ -271,7 +330,7 @@ end
---Parses the STANDARD property into a table
---@param handler table
---@return table STANDARD The STANDARD property as a table
function ical._private.parser.STANDARD(handler)
function ical._private.parser:STANDARD(handler)
local STANDARD = {}
-- Read each line until END:STANDARD is read
@@ -285,13 +344,13 @@ function ical._private.parser.STANDARD(handler)
-- Break down each line into the property:value
local v, k = line:match("(.*):(.*)")
if v:match("TZOFFSETFROM") then
STANDARD.TZOFFSETFROM = ical._private.parser.offset(k)
STANDARD.TZOFFSETFROM = self._private.parser.offset(k)
elseif v:match("TZOFFSETTO") then
STANDARD.TZOFFSETTO = ical._private.parser.offset(k)
STANDARD.TZOFFSETTO = self._private.parser.offset(k)
elseif v:match("TZNAME") then
STANDARD.TZNAME = k
elseif v:match("DTSTART") then
STANDARD.DTSTART = ical._private.parser.to_datetime(k)
STANDARD.DTSTART = self._private.parser.to_datetime(k)
elseif v:match("RRULE") then
STANDARD.RRULE = {
FREQ = k:match("FREQ=([A-Z]+)"),
@@ -329,4 +388,8 @@ function ical._private.parser.offset(offset)
return s * (tonumber(h) * 3600 + tonumber(m) * 60)
end
return ical
function ical.mt:__call(...)
return ical.new(...)
end
return setmetatable(ical, ical.mt)