-- name = "Курсы валют ЦБ" -- description = "Виджет отображает курсы валют Центрального Банка России" -- data_source = "https://www.cbr.ru/" -- type = "widget" -- lang = "ru" -- author = "Andrey Gavrilov" -- version = "1.0" local cur = "USD" local base_cur = "RUB" local nominal = 1 local cur_id = "R01235" local idx = 0 local history = "" function on_alarm() get_rates() end function on_click() http:get("https://www.cbr.ru/scripts/XML_daily.asp","today") end function on_long_click() if history == "" then return end ui:show_dialog("История курсов ЦБ\n"..nominal.." "..cur.." / "..base_cur,history) end function on_settings() local xml = require "xml" local t = xml:parse(currencies) local names = {} for i,v in ipairs(t.Valuta.Item) do table.insert(names,v.Name:value()) if v["@ID"] == cur_id then idx = i end end ui:show_radio_dialog("Выберите валюту",names,idx) end function on_dialog_action(data) if data == -1 then return end local xml = require "xml" local t = xml:parse(currencies) cur = t.Valuta.Item[data].ISO_Char_Code:value() cur_id = t.Valuta.Item[data]["@ID"] idx = data get_rates() end function on_network_result_today(result,error) local xml = require "xml" local t = xml:parse(result) local today = "" local date_today = t.ValCurs["@Date"] for i,v in ipairs(t.ValCurs.Valute) do if i>1 then today = today.."
" end today = today..v.Nominal:value().." "..v.CharCode:value().." = "..v.Value:value():replace(",",".").." "..base_cur end ui:show_dialog("Курсы валют ЦБ\n"..date_today,today) end function on_network_result_history(result,error) history = "" local color = aio:colors() local equals = " = " local xml = require "xml" local t = xml:parse(result) if t.ValCurs.Record == nil then ui:show_text("Для валюты "..cur.." не заданы курсы") return end local points = {} local k=#t.ValCurs.Record local dd = t.ValCurs.Record[1]["@Date"]:split(".") nominal = t.ValCurs.Record[k].Nominal:value() local tp = os.time{day=dd[1],month=dd[2],year=dd[3]} - 24*60*60 for i,v in ipairs(t.ValCurs.Record) do dd = v["@Date"]:split(".") local tm = os.time{day=dd[1],month=dd[2],year=dd[3]} for tt=tp+24*60*60, tm, 24*60*60 do local point = {} table.insert(point,tt*1000) table.insert(point,v.Value:value():replace(",",".")/v.Nominal:value()*nominal) table.insert(points,point) end tp = tm history = v["@Date"]..": "..nominal.." "..cur.." = "..v.Value:value():replace(",",".")/v.Nominal:value()*nominal.." "..base_cur..history if i<#t.ValCurs.Record then history = "
"..history end end local ch = round((t.ValCurs.Record[k].Value:value():replace(",",".")/t.ValCurs.Record[k].Nominal:value()*nominal-t.ValCurs.Record[k-1].Value:value():replace(",",".")/t.ValCurs.Record[k-1].Nominal:value()*nominal)/t.ValCurs.Record[k-1].Value:value():replace(",",".")*t.ValCurs.Record[k-1].Nominal:value()/nominal*100,2) ui:show_chart(points,"x:date y:number",t.ValCurs.Record[k].Value:value():replace(",",".")/t.ValCurs.Record[k].Nominal:value()*nominal.." "..base_cur,true,nominal.." "..cur..equals..t.ValCurs.Record[k].Value:value():replace(",",".")/t.ValCurs.Record[k].Nominal:value()*nominal.." "..base_cur.." "..get_formatted_change_text(ch)) end function get_rates() local date2 = os.date("%d/%m/%Y") local dd = date2:split("/") local t = os.time{day=dd[1],month=dd[2],year=dd[3]}-30*24*60*60 local date1 = os.date("%d/%m/%Y",t) local str = "https://www.cbr.ru/scripts/XML_dynamic.asp?date_req1="..date1.."&date_req2="..date2.."&VAL_NM_RQ="..cur_id http:get(str,"history") end function get_formatted_change_text(change) local color = aio:colors() if change > 0 then return " +"..change.."%" elseif change < 0 then return " "..change.."%" else return " "..change.."%" end end currencies = [[ Австралийский доллар Australian Dollar 1 R01010 36 AUD Азербайджанский манат Azerbaijan Manat 1 R01020 944 AZN Фунт стерлингов Соединенного королевства British Pound Sterling 1 R01035 826 GBP Армянский драм Armenia Dram 1000 R01060 51 AMD Белорусский рубль Belarussian Ruble 1 R01090 933 BYN Болгарский лев Bulgarian lev 1 R01100 975 BGN Бразильский реал Brazil Real 1 R01115 986 BRL Венгерский форинт Hungarian Forint 100 R01135 348 HUF Гонконгский доллар Hong Kong Dollar 10 R01200 344 HKD Датская крона Danish Krone 10 R01215 208 DKK Доллар США US Dollar 1 R01235 840 USD Евро Euro 1 R01239 978 EUR Индийская рупия Indian Rupee 100 R01270 356 INR Казахстанский тенге Kazakhstan Tenge 100 R01335 398 KZT Канадский доллар Canadian Dollar 1 R01350 124 CAD Киргизский сом Kyrgyzstan Som 100 R01370 417 KGS Китайский юань China Yuan 10 R01375 156 CNY Молдавский лей Moldova Lei 10 R01500 498 MDL Норвежская крона Norwegian Krone 10 R01535 578 NOK Польский злотый Polish Zloty 1 R01565 985 PLN Румынский лей Romanian Leu 10 R01585 946 RON СДР (специальные права заимствования) SDR 1 R01589 960 XDR Сингапурский доллар Singapore Dollar 1 R01625 702 SGD Таджикский сомони Tajikistan Ruble 10 R01670 972 TJS Турецкая лира Turkish Lira 1 R01700 949 TRY Новый туркменский манат New Turkmenistan Manat 1 R01710 934 TMT Узбекский сум Uzbekistan Sum 1000 R01717 860 UZS Украинская гривна Ukrainian Hryvnia 10 R01720 980 UAH Чешская крона Czech Koruna 10 R01760 203 CZK Шведская крона Swedish Krona 10 R01770 752 SEK Швейцарский франк Swiss Franc 1 R01775 756 CHF Южноафриканский рэнд S.African Rand 10 R01810 710 ZAR Вон Республики Корея South Korean Won 1000 R01815 410 KRW Японская иена Japanese Yen 100 R01820 392 JPY ]]