From ccb8c429da9720a45ef143ed7e4c05e6151c4e09 Mon Sep 17 00:00:00 2001 From: streetturtle Date: Thu, 17 Sep 2020 22:52:25 -0400 Subject: [PATCH] new widget - github contributions --- github-contributions-widget/README.md | 42 ++++++++ .../github-contributions-widget.lua | 96 ++++++++++++++++++ github-contributions-widget/screenshot.jpg | Bin 0 -> 14613 bytes github-contributions-widget/screenshot1.jpg | Bin 0 -> 10879 bytes github-contributions-widget/screenshot2.jpg | Bin 0 -> 6164 bytes 5 files changed, 138 insertions(+) create mode 100644 github-contributions-widget/README.md create mode 100644 github-contributions-widget/github-contributions-widget.lua create mode 100644 github-contributions-widget/screenshot.jpg create mode 100644 github-contributions-widget/screenshot1.jpg create mode 100644 github-contributions-widget/screenshot2.jpg diff --git a/github-contributions-widget/README.md b/github-contributions-widget/README.md new file mode 100644 index 0000000..328b22e --- /dev/null +++ b/github-contributions-widget/README.md @@ -0,0 +1,42 @@ +# Github Contributions Widget + +Shows the contribution graph, similar to the one on the github profile page: + +![screenshot](./screenshot.jpg) + +## Customization + +It is possible to customize the widget by providing a table with all or some of the following config parameters: + +| Name | Default | Description | +|---|---|---| +| `username` | 'streetturtle' | Username | +| `days` | `365` | Number of days in the past, more days - wider the widget | +| `empty_color` | `beautiful.bg_normal` | Color of the days with no contributions | +| `with_border` | `true` | Should the graph contains border or not | +| `margin_top` | `1` | Top margin | + +Few more screenshots: + +1000 days: +![screenshot1](./screenshot1.jpg) + +No borders: +![screenshot2](./screenshot2.jpg) + + +## Installation + +Clone/download repo under **~/.config/awesome** and use widget in **rc.lua**: + +```lua +local github_contributions_widget = require("awesome-wm-widgets.github-contributions-widget.github-contributions-widget") +... +s.mytasklist, -- Middle widget + { -- Right widgets + layout = wibox.layout.fixed.horizontal, + ... + -- default + github_contributions_widget({username = ''}), + ... +``` diff --git a/github-contributions-widget/github-contributions-widget.lua b/github-contributions-widget/github-contributions-widget.lua new file mode 100644 index 0000000..3025d17 --- /dev/null +++ b/github-contributions-widget/github-contributions-widget.lua @@ -0,0 +1,96 @@ +------------------------------------------------- +-- Github Contributions Widget for Awesome Window Manager +-- Shows the contributions graph +-- More details could be found here: +-- https://github.com/streetturtle/awesome-wm-widgets/tree/master/github-contributions-widget + +-- @author Pavel Makhov +-- @copyright 2020 Pavel Makhov +------------------------------------------------- + +local awful = require("awful") +local wibox = require("wibox") +local beautiful = require("beautiful") + +local GET_CONTRIBUTIONS_CMD = [[bash -c "curl -s https://github-contributions.now.sh/api/v1/%s | jq -r '[.contributions[] | select ( .date | strptime(\"%%Y-%%m-%%d\") | mktime < now)][:%s]| .[].color'"]] +-- in case github-contributions.now.sh stops working contributions can be scrapped from the github.com with the command below. Note that the order is reversed. +local GET_CONTRIBUTIONS_CMD_FALLBACK = [[bash -c "curl -s https://github.com/users/%s/contributions | grep -o '\" fill=\"\#[0-9a-fA-F]\{6\}\" da' | grep -o '\#[0-9a-fA-F]\{6\}'"]] + +local github_contributions_widget = wibox.widget{ + reflection = { + horizontal = true, + vertical = true, + }, + widget = wibox.container.mirror +} + +local function worker(args) + + local args = args or {} + + local username = args.username or 'streetturtle' + local days = args.days or 365 + local empty_color = args.empty_color or beautiful.bg_normal + local with_border = args.with_border + local margin_top = args.margin_top or 1 + + if with_border == nil then with_border = true end + + local function hex2rgb(hex) + if hex == '#ebedf0' then hex = empty_color end + hex = tostring(hex):gsub("#","") + return tonumber("0x" .. hex:sub(1, 2)), + tonumber("0x" .. hex:sub(3, 4)), + tonumber("0x" .. hex:sub(5, 6)) + end + + local function get_square(color) + local r, g, b = hex2rgb(color) + + return wibox.widget{ + fit = function(self, context, width, height) + return 3, 3 + end, + draw = function(self, context, cr, width, height) + cr:set_source_rgb(r/255, g/255, b/255) + cr:rectangle(0, 0, with_border and 2 or 3, with_border and 2 or 3) + cr:fill() + end, + layout = wibox.widget.base.make_widget + } + end + + local col = {layout = wibox.layout.fixed.vertical} + local row = {layout = wibox.layout.fixed.horizontal} + local a = 5 - os.date('%w') + for i = 0, a do + table.insert(col, get_square('#ebedf0')) + end + + local update_widget = function(widget, stdout, _, _, _) + for colors in stdout:gmatch("[^\r\n]+") do + if a%7 == 0 then + table.insert(row, col) + col = {layout = wibox.layout.fixed.vertical} + end + table.insert(col, get_square(colors)) + a = a + 1 + end + github_contributions_widget:setup( + { + row, + top = margin_top, + layout = wibox.container.margin + } + ) + end + + awful.spawn.easy_async(string.format(GET_CONTRIBUTIONS_CMD, username, days), + function(stdout, stderr) + update_widget(github_contributions_widget, stdout) + end) + + return github_contributions_widget +end + +return setmetatable(github_contributions_widget, { __call = function(_, ...) return worker(...) end }) diff --git a/github-contributions-widget/screenshot.jpg b/github-contributions-widget/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..15ad4567b5ac6474ccd85b1f7b4b15600fff3533 GIT binary patch literal 14613 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 literal 0 HcmV?d00001 diff --git a/github-contributions-widget/screenshot1.jpg b/github-contributions-widget/screenshot1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1eeb44294f7d578517afddbdcae2ca918d033ae GIT binary patch literal 10879 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 literal 0 HcmV?d00001