-- name = "Календарь" -- description = "Производственный календарь" -- data_source = "https://isdayoff.ru/" -- type = "widget" -- author = "Andrey Gavrilov" -- version = "1.0" local color = require "md_colors" local days = {} local tab = {} local pr_text_color = ui:get_primary_text_color() local sec_text_color = ui:get_secondary_text_color() local year = os.date("*t").year local month = os.date("*t").month function on_alarm() is_days_off(year,month) end function is_days_off(y,m) http:get("https://isdayoff.ru/api/getdata?year="..y.."&month="..m.."&pre=1&delimeter=-&covid=1") end function on_network_result(result) days = result:split("-") tab = get_cal(year,month) ui:show_grid(tab, 8, true) ui:set_title(ui:get_default_title().." ("..string.format("%02d.%04d",month,year)..")") end function on_click(i) if i == 1 then local time = get_time(begin_month(year,month))-24*60*60 local y,m,d = get_day(time) year = y month = m elseif i == 8 then local time = get_time(end_month(year,month))+24*60*60 local y,m,d = get_day(time) year = y month = m elseif i > 1 and i < 8 then ui:show_edit_dialog("Введите месяц и год", "Формат - 12.2020. Пустое значение - текущий месяц", string.format("%02d.%04d", month, year)) elseif (i-1)%8 ~= 0 and tab[i] ~= " " then ui:show_toast(os.date("*t", get_time(year,month,tab[i]:match(">(%d+)<"))).yday) return else return end is_days_off(year,month) end function on_dialog_action(data) if data == -1 then return elseif data == "" then local date = os.date("*t") if year == date.year and month == date.month then return end year = date.year month = date.month is_days_off(year,month) return elseif not check_date(data) then return else local m,y = data:match("(%d+)%.(%d+)") if year == tonumber(y) and month == tonumber(m) then return end end local m,y = data:match("(%d+)%.(%d+)") year = tonumber(y) month = tonumber(m) is_days_off(year,month) end function get_cal(y,m) local from = get_time(begin_month(y,m)) local tab = { "< #", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс >" } table.insert(tab,""..weeknumber(get_day(from)).."") for i =1, weekday(get_day(from))-1,1 do table.insert(tab," ") end local to = get_time(end_month(y,m)) local k=0 for time = from,to,24*60*60 do k=k+1 local y,m,d = get_day(time) table.insert(tab, format_day(d,k)) if weekday(get_day(time))==7 and time ~= to then table.insert(tab, ""..weeknumber(get_day(time+24*60*60)).."") end end for i = weekday(get_day(to))+1,7,1 do table.insert(tab," ") end return tab end function weeknumber(y,m,d) local yday = os.date("*t",os.time{day=d,month=m,year=y}).yday local wday = weekday(y,m,1) return math.floor((yday+10-wday)/7) end function weekday(y,m,d) local wday = os.date("*t",os.time{day=d,month=m,year=y}).wday-1 if wday == 0 then wday = 7 end return wday end function begin_month(y,m) local time = os.time{day=1,month=m,year=y} local date = os.date("*t",time) return date.year,date.month,date.day end function end_month(y,m) local time = os.time{day=1,month=m,year=y}+31*24*60*60 local date = os.date("*t",time) local time = os.time{day=1,month=date.month,year=date.year}-24*60*60 local date = os.date("*t",time) return date.year,date.month,date.day end function get_day(t) local date = os.date("*t",t) return date.year,date.month,date.day end function get_time(y,m,d) return os.time{day=d,month=m,year=y} end function format_day(d,k) local day = d if days[k] == "2" then day = ""..day.."" elseif days[k] == "1" then day = ""..day.."" elseif days[k] == "4" then day = ""..day.."" else day = ""..day.."" end if year == os.date("*t").year and month == os.date("*t").month and d == os.date("*t").day then day = ""..day.."" end return day end function check_date(date) local m, Y = date:match("(%d+).(%d+)") local time = os.time{day=1, month=m or 0, year=Y or 0} local str = string.format("%02d.%04d", m or 0, Y or 0) return str == os.date("%m.%Y", time) end