-- 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 = ui:get_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 = ui:get_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
]]