summaryrefslogtreecommitdiff
path: root/stackoverflow-widget/stackoverflow.lua
diff options
context:
space:
mode:
authorPavel Makhov <pmakhov@theoctavegroup.com>2019-11-14 22:23:43 -0500
committerPavel Makhov <pmakhov@theoctavegroup.com>2019-11-14 22:23:43 -0500
commit63d3c3dd1dfc3d435f4807f69666674b00dc6bd3 (patch)
tree2246f2ba3fe7547adef43d2e7638f173bf6f1281 /stackoverflow-widget/stackoverflow.lua
parent85ed393e634fb76daf141ec87b92181b1b8e3316 (diff)
Add stackoverflow widget
Diffstat (limited to 'stackoverflow-widget/stackoverflow.lua')
-rw-r--r--stackoverflow-widget/stackoverflow.lua123
1 files changed, 123 insertions, 0 deletions
diff --git a/stackoverflow-widget/stackoverflow.lua b/stackoverflow-widget/stackoverflow.lua
new file mode 100644
index 0000000..3ac9bfe
--- /dev/null
+++ b/stackoverflow-widget/stackoverflow.lua
@@ -0,0 +1,123 @@
+-------------------------------------------------
+-- Stackoverflow Widget for Awesome Window Manager
+-- Shows new questions by a given tag
+-- More details could be found here:
+-- https://github.com/streetturtle/awesome-wm-widgets/tree/master/stackoverflow-widget
+
+-- @author Pavel Makhov
+-- @copyright 2019 Pavel Makhov
+-------------------------------------------------
+
+local awful = require("awful")
+local wibox = require("wibox")
+local watch = require("awful.widget.watch")
+local json = require("json")
+local spawn = require("awful.spawn")
+local gears = require("gears")
+local beautiful = require("beautiful")
+
+local HOME_DIR = os.getenv("HOME")
+
+local GET_QUESTIONS_CMD = [[bash -c "curl --compressed -s -X GET 'http://api.stackexchange.com/2.2/questions/no-answers?page=1&pagesize=%s&order=desc&sort=activity&tagged=%s&site=stackoverflow'"]]
+
+local stackoverflow_widget = {}
+
+local function worker(args)
+
+ local args = args or {}
+
+ local icon = args.icon or HOME_DIR .. '/.config/awesome/awesome-wm-widgets/stackoverflow-widget/so-icon.svg'
+ local limit = args.limit or 5
+ local tagged = args.tagged or 'awesome-wm'
+
+ local rows = {
+ { widget = wibox.widget.textbox },
+ layout = wibox.layout.fixed.vertical,
+ }
+
+ local popup = awful.popup{
+ visible = true,
+ ontop = true,
+ visible = false,
+ shape = gears.shape.rounded_rect,
+ border_width = 1,
+ border_color = beautiful.bg_focus,
+ maximum_width = 400,
+ preferred_positions = top,
+ offset = { y = 5 },
+ widget = {}
+ }
+
+ stackoverflow_widget = wibox.widget {
+ {
+ image = icon,
+ widget = wibox.widget.imagebox
+ },
+ {
+ id = "txt",
+ widget = wibox.widget.textbox
+ },
+ layout = wibox.layout.fixed.horizontal,
+ set_text = function(self, new_value)
+ self.txt.text = new_value
+ end,
+ }
+
+ local update_widget = function(widget, stdout, stderr, _, _)
+
+ local result = json.decode(stdout)
+
+ for i = 0, #rows do rows[i]=nil end
+ for _, item in ipairs(result.items) do
+ local tags = ''
+ for i = 1, #item.tags do tags = tags .. item.tags[i] .. ' ' end
+ local row = wibox.widget {
+ {
+ {
+ {
+ text = item.title,
+ widget = wibox.widget.textbox
+ },
+ {
+ text = tags,
+ align = 'right',
+ widget = wibox.widget.textbox
+ },
+ layout = wibox.layout.align.vertical
+ },
+ margins = 8,
+ layout = wibox.container.margin
+ },
+ widget = wibox.container.background
+ }
+
+ row:connect_signal("button::release", function(_, _, _, button)
+ spawn.with_shell("google-chrome " .. item.link)
+ popup.visible = false
+ end)
+
+ row:connect_signal("mouse::enter", function(c) c:set_bg(beautiful.bg_focus) end)
+ row:connect_signal("mouse::leave", function(c) c:set_bg(beautiful.bg_normal) end)
+
+ table.insert(rows, row)
+ end
+
+ popup:setup(rows)
+ end
+
+ stackoverflow_widget:buttons(
+ awful.util.table.join(
+ awful.button({}, 1, function()
+ if popup.visible then
+ popup.visible = not popup.visible
+ else
+ popup:move_next_to(mouse.current_widget_geometry)
+ end
+ end)
+ )
+ )
+ watch(string.format(GET_QUESTIONS_CMD, limit, tagged), 300, update_widget, stackoverflow_widget)
+ return stackoverflow_widget
+end
+
+return setmetatable(stackoverflow_widget, { __call = function(_, ...) return worker(...) end })