71 lines
1.9 KiB
Lua
71 lines
1.9 KiB
Lua
-- It uses data from central bank of Russia
|
|
--- and external service to get json from xml
|
|
-- Privacy and security is unknown
|
|
|
|
local rub = {
|
|
url = 'https://api.factmaven.com/xml-to-json/?xml='
|
|
.. 'https://www.cbr.ru/scripts/XML_daily.asp',
|
|
|
|
tools = require 'etc.api.tools',
|
|
}
|
|
|
|
function rub:course(wants)
|
|
local resp, succ = self.tools._req(self.url, 'GET')
|
|
if not succ then return 'err' end
|
|
resp = self.tools.json.decode(resp or '{}')
|
|
|
|
resp = resp.ValCurs
|
|
table.insert(resp.Valute, {
|
|
ID = 'R01000',
|
|
NumCode = '001',
|
|
CharCode = 'RUB',
|
|
Nominal = 1,
|
|
Name = 'Российский рубль',
|
|
Value = '1'
|
|
})
|
|
local uah = table.findV(resp.Valute, {CharCode = 'UAH'})
|
|
table.insert(resp.Valute, {
|
|
ID = 'R02000',
|
|
NumCode = '200',
|
|
CharCode = 'SHT',
|
|
Nominal = 1,
|
|
Name = 'Штаны',
|
|
Value = ('%f'):format(tonumber(uah.Value:gsub(',', '.'), nil) / uah.Nominal * 40)
|
|
})
|
|
|
|
wants = type(wants) == 'table' and wants or {}
|
|
local r, founds = {}, {}
|
|
|
|
for i = 1, #resp.Valute do
|
|
local v = resp.Valute[i]
|
|
if table.find(wants, v.CharCode) then
|
|
table.insert(founds, v.CharCode)
|
|
table.insert(r, ('%d %s (%s) - %f ₽'):format(v.Nominal, v.Name, v.CharCode, v.Value:gsub(',', '.')))
|
|
end
|
|
end
|
|
|
|
return r, resp.Date, founds
|
|
end
|
|
|
|
return {
|
|
run = function(C, msg)
|
|
local wants = {'USD', 'EUR', table.unpack(msg.args)}
|
|
for i = 1, #wants do wants[i] = wants[i]:upper() end -- uppercase
|
|
|
|
local v, d, f = rub:course(wants)
|
|
if v == 'error' then
|
|
return C.api:reply(msg, C.locale:get('error', 'req_err', msg.l))
|
|
end
|
|
|
|
local nf = {}
|
|
for _, i in pairs(wants) do
|
|
if not table.find(f, i) then table.insert(nf, i) end
|
|
end
|
|
|
|
local s = msg.loc.cur:format(d, table.concat(v, '\n'))
|
|
if #nf > 0 then s = s .. msg.loc.notf .. table.concat(nf, ',') end
|
|
|
|
C.api:reply(msg, s .. msg.loc.prov)
|
|
end
|
|
}
|