diff --git a/currencies-widget.lua b/currencies-widget.lua new file mode 100644 index 0000000..d8c5fb0 --- /dev/null +++ b/currencies-widget.lua @@ -0,0 +1,115 @@ +-- name = "Курсы валют" +-- description = "Виджет курсов валют. Нажмите на дату чтобы изменить ее." +-- data_source = "https://github.com/fawazahmed0/currency-api#readme" +-- type = "widget" +-- author = "Andrey Gavrilov" +-- version = "1.0" +-- arguments_help = "Введите список валютных пар в формате usd:rub btc:usd" +-- arguments_default = "usd:rub eur:rub" + +local sx = require "pl.stringx" + +-- constants +local red_color = "#f44336" +local green_color = "#48ad47" +local text_color = ui:get_secondary_text_color() +local equals = " = " + +-- global vars +local result_curr = "" +local tabl = {} + +function on_resume() + ui:set_folding_flag(true) + ui:show_lines(tabl) +end + +function on_alarm() + get_rates("latest", "curr") +end + +function get_rates(loc_date,id) + http:get("https://cdn.jsdelivr.net/gh/fawazahmed0/currency-api@1/"..loc_date.."/currencies/usd.json",id) +end + +function on_network_result_curr(result) + result_curr = result + + local dat = ajson:get_value(result, "object string:date") + local prev_date = prev_date(dat) + + get_rates(prev_date, "prev") +end + +function on_network_result_prev(result) + tabl = create_tab(result) + ui:show_lines(tabl) +end + +function on_click(idx) + ui:show_edit_dialog("Введите дату курсов", "Введите дату курсов в формате 2020.12.31. Пустое значение - текущая дата.") +end + +function on_dialog_action(dat) + if dat == "" then dat = "latest" end + get_rates(sx.replace(dat, ".", "-"), "curr") +end + +function create_tab(result) + local result_prev = result + local curs = aio:get_args() + local tab = {} + + -- set title + local dat = ajson:get_value(result_curr, "object string:date") + ui:set_title(ui:get_default_title().." "..sx.replace(dat, "-", ".")) + + for idx, pair in ipairs(curs) do + local cur = sx.split(pair, ":") + + local rate_curr1 = get_rate(result_curr, cur[1]) + local rate_curr2 = get_rate(result_curr, cur[2]) + local rate_prev1 = get_rate(result_prev, cur[1]) + local rate_prev2 = get_rate(result_prev, cur[2]) + + local rate_curr = round(rate_curr2/rate_curr1, 4) + local rate_prev = round(rate_prev2/rate_prev1, 4) + local change = round((rate_curr-rate_prev)/rate_prev*100,2) + + local line = "1 "..string.upper(cur[1])..equals..rate_curr.." "..string.upper(cur[2]) + line = line..get_formatted_change_text(change) + + tab[idx] = line + end + + return tab +end + +-- utils -- + +function get_prev_date(dat) + local prev_date = sx.split(dat, "-") + local prev_time = os.time{year=prev_date[1], month=prev_date[2], day=prev_date[3]} - (60*60*24) + return os.date("%Y-%m-%d", prev_time) +end + +function get_rate(json, currency) + return ajson:get_value(json, "object object:usd double:"..currency) +end + +function get_formatted_change_text(change) + if change > 0 then + return " +"..change.."%" + elseif change < 0 then + return " "..change.."%" + else + return " "..change.."%" + end +end + +function round(x, n) + local n = math.pow(10, n or 0) + local x = x * n + if x >= 0 then x = math.floor(x + 0.5) else x = math.ceil(x - 0.5) end + return x / n +end diff --git a/json-test.lua b/json-test.lua index a5bc3f5..85d5b8e 100644 --- a/json-test.lua +++ b/json-test.lua @@ -2,5 +2,5 @@ json = require "json" function on_resume() local t = json.decode('[1,2,3,{"x":10}]') - ui:show_text(t[2]) + ui:show_text(t[4].x) end