diff --git a/contrib/README.md b/contrib/README.md index a9f9284..6746242 100644 --- a/contrib/README.md +++ b/contrib/README.md @@ -60,6 +60,18 @@ Supported platforms: Linux (required tools: `sysfs`) **vicious.contrib.batproc** +**vicious.contrib.btc** + +Provides current Bitcoin price in any currency by code ( +https://en.wikipedia.org/wiki/ISO_4217). +Supported platforms: Linux, FreeBSD (required tools: `curl`) + +- Arguments: + * takes currency code, i.e. `"usd"`, `"rub"` and other. `"usd"` by + default +- Returns + * a table with string keys: {price} + **vicious.contrib.countfiles** **vicious.widgets.cmus** diff --git a/contrib/btc_all.lua b/contrib/btc_all.lua new file mode 100644 index 0000000..5bf40f8 --- /dev/null +++ b/contrib/btc_all.lua @@ -0,0 +1,57 @@ +--------------------------------------------------- +-- Licensed under the GNU General Public License v2 +-- * (c) 2017, 0x5b +--------------------------------------------------- + +-- {{{ Grab environment +local setmetatable = setmetatable +local pcall = pcall +local helpers = require("vicious.helpers") +local spawn = require("awful.spawn") +local json = require("json") +local string = { + sub = string.sub, + upper = string.upper, +} +-- }}} + + +-- Btc: provides current bitcoin price +-- vicious.widgets.btc +local btc_linux = {} + + +-- {{ Bitcoin widget type +function btc_linux.async(format, warg, callback) + -- Default values + if not warg then warg = "usd" end + + local btc = { ["{price}"] = "N/A" } + local currency_code = string.upper(warg) + local url = "https://api.coindesk.com/v1/bpi/currentprice/" .. currency_code .. ".json" + local cmd = "curl "..helpers.shellquote(url) + + -- {{ Checking response + local function parse(response) + -- If 'response' is not json, 'json.decode' will return Error + local status, data = pcall(function() return json.decode(response) end) + if not status or not data then + return btc + end + + btc["{price}"] = string.sub(data["bpi"][currency_code]["rate"], 0, -3) + return btc + end + -- }} + + spawn.easy_async(cmd, function(stdout) callback(parse(stdout)) end) +end +-- }}} + +-- {{ Bitcoin widget type +local function worker(format, warg) + btc_linux.async(format, warg, function(data) return data end) +end +-- }}} + +return setmetatable(btc_linux, { __call = function(_, ...) return worker(...) end }) diff --git a/contrib/btc_linux.lua b/contrib/btc_linux.lua new file mode 100644 index 0000000..5bf40f8 --- /dev/null +++ b/contrib/btc_linux.lua @@ -0,0 +1,57 @@ +--------------------------------------------------- +-- Licensed under the GNU General Public License v2 +-- * (c) 2017, 0x5b +--------------------------------------------------- + +-- {{{ Grab environment +local setmetatable = setmetatable +local pcall = pcall +local helpers = require("vicious.helpers") +local spawn = require("awful.spawn") +local json = require("json") +local string = { + sub = string.sub, + upper = string.upper, +} +-- }}} + + +-- Btc: provides current bitcoin price +-- vicious.widgets.btc +local btc_linux = {} + + +-- {{ Bitcoin widget type +function btc_linux.async(format, warg, callback) + -- Default values + if not warg then warg = "usd" end + + local btc = { ["{price}"] = "N/A" } + local currency_code = string.upper(warg) + local url = "https://api.coindesk.com/v1/bpi/currentprice/" .. currency_code .. ".json" + local cmd = "curl "..helpers.shellquote(url) + + -- {{ Checking response + local function parse(response) + -- If 'response' is not json, 'json.decode' will return Error + local status, data = pcall(function() return json.decode(response) end) + if not status or not data then + return btc + end + + btc["{price}"] = string.sub(data["bpi"][currency_code]["rate"], 0, -3) + return btc + end + -- }} + + spawn.easy_async(cmd, function(stdout) callback(parse(stdout)) end) +end +-- }}} + +-- {{ Bitcoin widget type +local function worker(format, warg) + btc_linux.async(format, warg, function(data) return data end) +end +-- }}} + +return setmetatable(btc_linux, { __call = function(_, ...) return worker(...) end })