From 6fd06db338dd2d1c6b17a5918a6bb56a22a43f42 Mon Sep 17 00:00:00 2001 From: Hossein Mehrabi Date: Mon, 4 Jun 2018 05:31:38 +0430 Subject: [PATCH 001/140] added bittrex module --- cryptoexchanges/bittrex/bittrex.go | 49 ++++++++ cryptoexchanges/bittrex/display.go | 65 ++++++++++ cryptoexchanges/bittrex/widget.go | 187 +++++++++++++++++++++++++++++ wtf.go | 3 + 4 files changed, 304 insertions(+) create mode 100644 cryptoexchanges/bittrex/bittrex.go create mode 100644 cryptoexchanges/bittrex/display.go create mode 100644 cryptoexchanges/bittrex/widget.go diff --git a/cryptoexchanges/bittrex/bittrex.go b/cryptoexchanges/bittrex/bittrex.go new file mode 100644 index 00000000..d4f4eed4 --- /dev/null +++ b/cryptoexchanges/bittrex/bittrex.go @@ -0,0 +1,49 @@ +package bittrex + +type summaryList struct { + items []*fCurrency +} + +// fCurrency From Currency +type fCurrency struct { + name string + displayName string + to []*tCurrency +} + +// tCurrency To Currency +type tCurrency struct { + name string + summaryInfo +} + +type summaryInfo struct { + Low string + High string + Volume string + Last string + OpenSellOrders string + OpenBuyOrders string +} + +type summaryResponse struct { + Success bool `json:"success"` + Message string `json:"message"` + Result []struct { + MarketName string `json:"MarketName"` + High float64 `json:"High"` + Low float64 `json:"Low"` + Last float64 `json:"Last"` + Volume float64 `json:"Volume"` + OpenSellOrders int `json:"OpenSellOrders"` + OpenBuyOrders int `json:"OpenBuyOrders"` + } `json:"result"` +} + +func (list *summaryList) addSummaryItem(name, displayName string, toList []*tCurrency) { + list.items = append(list.items, &fCurrency{ + name: name, + displayName: displayName, + to: toList, + }) +} diff --git a/cryptoexchanges/bittrex/display.go b/cryptoexchanges/bittrex/display.go new file mode 100644 index 00000000..28c368e5 --- /dev/null +++ b/cryptoexchanges/bittrex/display.go @@ -0,0 +1,65 @@ +package bittrex + +import ( + "bytes" + "fmt" + "text/template" +) + +func (widget *Widget) display() { + if ok == false { + widget.View.SetText(fmt.Sprintf("%s", errorText)) + return + } + + str := "" + str += summaryText(&widget.summaryList, &widget.TextColors) + + widget.View.SetText(fmt.Sprintf("%s", str)) +} + +func summaryText(list *summaryList, colors *TextColors) string { + str := "" + + for _, fromCurrency := range list.items { + str += fmt.Sprintf("[%s]%s[%s](%s):\n", colors.base.displayName, fromCurrency.displayName, colors.base.name, fromCurrency.name) + + resultTemplate := template.New("bittrex") + + for _, toCurrency := range fromCurrency.to { + writer := new(bytes.Buffer) + strTemplate, _ := resultTemplate.Parse( + "\t[{{.nameColor}}]{{.mName}}\n" + + formatableText("High", "High") + + formatableText("Low", "Low") + + formatableText("Last", "Last") + + formatableText("Volume", "Volume") + + formatableText("OpenSellOrders", "OpenSellOrders") + + formatableText("OpenBuyOrders", "OpenBuyOrders"), + ) + + strTemplate.Execute(writer, map[string]string{ + "nameColor": colors.market.name, + "fieldColor": colors.market.field, + "valueColor": colors.market.value, + "mName": toCurrency.name, + "High": toCurrency.High, + "Low": toCurrency.Low, + "Last": toCurrency.Last, + "Volume": toCurrency.Volume, + "OpenSellOrders": toCurrency.OpenSellOrders, + "OpenBuyOrders": toCurrency.OpenBuyOrders, + }) + + str += writer.String() + } + + } + + return str + +} + +func formatableText(key, value string) string { + return fmt.Sprintf("\t\t[{{.fieldColor}}]%s: [{{.valueColor}}]{{.%s}}\n", key, value) +} diff --git a/cryptoexchanges/bittrex/widget.go b/cryptoexchanges/bittrex/widget.go new file mode 100644 index 00000000..9f5039dd --- /dev/null +++ b/cryptoexchanges/bittrex/widget.go @@ -0,0 +1,187 @@ +package bittrex + +import ( + "encoding/json" + "fmt" + "time" + + "net/http" + + "github.com/olebedev/config" + "github.com/senorprogrammer/wtf/wtf" +) + +// Config is a pointer to the global config object +var Config *config.Config + +type TextColors struct { + base struct { + name string + displayName string + } + market struct { + name string + field string + value string + } +} + +var ok = true +var errorText = "" +var started = false +var baseURL = "https://bittrex.com/api/v1.1/public/getmarketsummary" + +// Widget define wtf widget to register widget later +type Widget struct { + wtf.TextWidget + summaryList + updateInterval int + TextColors +} + +// NewWidget Make new instance of widget +func NewWidget() *Widget { + + widget := Widget{ + TextWidget: wtf.NewTextWidget(" $ Bittrex ", "bittrex", false), + summaryList: summaryList{}, + updateInterval: Config.UInt("wtf.mods.bittrex.updateInterval", 10), + } + + started = false + ok = true + errorText = "" + + widget.config() + widget.setSummaryList() + + return &widget +} + +func (widget *Widget) config() { + widget.TextColors.base.name = Config.UString("wtf.mods.bittrex.colors.base.name", "red") + widget.TextColors.base.displayName = Config.UString("wtf.mods.bittrex.colors.base.displayName", "grey") + widget.TextColors.market.name = Config.UString("wtf.mods.bittrex.colors.market.name", "red") + widget.TextColors.market.field = Config.UString("wtf.mods.bittrex.colors.market.field", "coral") + widget.TextColors.market.value = Config.UString("wtf.mods.bittrex.colors.market.value", "white") +} + +func (widget *Widget) setSummaryList() { + sCurrencies, _ := Config.Map("wtf.mods.bittrex.summary") + for fromCurrencyName := range sCurrencies { + displayName, _ := Config.String("wtf.mods.bittrex.summary." + fromCurrencyName + ".displayName") + toCurrencyList := makeSummaryToList(fromCurrencyName) + widget.summaryList.addSummaryItem(fromCurrencyName, displayName, toCurrencyList) + } +} + +func makeSummaryToList(currencyName string) []*tCurrency { + tCurrencyList := []*tCurrency{} + + configToList, _ := Config.List("wtf.mods.bittrex.summary." + currencyName + ".market") + for _, toCurrencyName := range configToList { + tCurrencyList = append(tCurrencyList, makeToCurrency(toCurrencyName.(string))) + } + + return tCurrencyList +} + +func makeToCurrency(name string) *tCurrency { + return &tCurrency{ + name: name, + summaryInfo: summaryInfo{ + High: "-1", + Low: "-1", + Volume: "-1", + Last: "-1", + OpenBuyOrders: "-1", + OpenSellOrders: "-1", + }, + } +} + +/* -------------------- Exported Functions -------------------- */ + +// Refresh & update after interval time +func (widget *Widget) Refresh() { + if widget.Disabled() { + return + } + + if started == false { + go func() { + for { + widget.updateSummary() + time.Sleep(time.Second * time.Duration(widget.updateInterval)) + } + }() + started = true + } + + widget.UpdateRefreshedAt() + + widget.display() + +} + +/* -------------------- Unexported Functions -------------------- */ + +func (widget *Widget) updateSummary() { + client := &http.Client{ + Timeout: time.Duration(5 * time.Second), + } + + for _, fromCurrency := range widget.summaryList.items { + for _, toCurrency := range fromCurrency.to { + request := makeRequest(fromCurrency.name, toCurrency.name) + response, err := client.Do(request) + + if err != nil { + ok = false + errorText = "Please Check Your Internet Connection!" + break + } else { + ok = true + errorText = "" + } + + if response.StatusCode != http.StatusOK { + errorText = response.Status + ok = false + break + } else { + ok = true + errorText = "" + } + + defer response.Body.Close() + jsonResponse := summaryResponse{} + decoder := json.NewDecoder(response.Body) + decoder.Decode(&jsonResponse) + + if !jsonResponse.Success { + ok = false + errorText = fmt.Sprintf("%s-%s: %s", fromCurrency.name, toCurrency.name, jsonResponse.Message) + break + } + ok = true + errorText = "" + + toCurrency.Last = fmt.Sprintf("%f", jsonResponse.Result[0].Last) + toCurrency.High = fmt.Sprintf("%f", jsonResponse.Result[0].High) + toCurrency.Low = fmt.Sprintf("%f", jsonResponse.Result[0].Low) + toCurrency.Volume = fmt.Sprintf("%f", jsonResponse.Result[0].Volume) + toCurrency.OpenBuyOrders = fmt.Sprintf("%d", jsonResponse.Result[0].OpenBuyOrders) + toCurrency.OpenSellOrders = fmt.Sprintf("%d", jsonResponse.Result[0].OpenSellOrders) + } + } + + widget.display() +} + +func makeRequest(fName, tName string) *http.Request { + url := fmt.Sprintf("%s?market=%s-%s", baseURL, fName, tName) + request, _ := http.NewRequest("GET", url, nil) + + return request +} diff --git a/wtf.go b/wtf.go index ed36b454..5ba51d4e 100644 --- a/wtf.go +++ b/wtf.go @@ -13,6 +13,7 @@ import ( "github.com/senorprogrammer/wtf/bamboohr" "github.com/senorprogrammer/wtf/clocks" "github.com/senorprogrammer/wtf/cmdrunner" + "github.com/senorprogrammer/wtf/cryptoexchanges/bittrex" "github.com/senorprogrammer/wtf/cryptoexchanges/cryptolive" "github.com/senorprogrammer/wtf/gcal" "github.com/senorprogrammer/wtf/git" @@ -175,6 +176,7 @@ func makeWidgets(app *tview.Application, pages *tview.Pages) { prettyweather.Config = Config wtf.Config = Config cryptolive.Config = Config + bittrex.Config = Config Widgets = []wtf.Wtfable{ bamboohr.NewWidget(), @@ -196,6 +198,7 @@ func makeWidgets(app *tview.Application, pages *tview.Pages) { weather.NewWidget(app, pages), cryptolive.NewWidget(), prettyweather.NewWidget(), + bittrex.NewWidget(), } FocusTracker = wtf.FocusTracker{ From 7ed874b4dde2c820b476c77091fa5109aede122f Mon Sep 17 00:00:00 2001 From: Hossein Mehrabi Date: Mon, 4 Jun 2018 06:19:42 +0430 Subject: [PATCH 002/140] add module to docs --- docs/posts/modules/bittrex/index.html | 243 ++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 docs/posts/modules/bittrex/index.html diff --git a/docs/posts/modules/bittrex/index.html b/docs/posts/modules/bittrex/index.html new file mode 100644 index 00000000..13817360 --- /dev/null +++ b/docs/posts/modules/bittrex/index.html @@ -0,0 +1,243 @@ + + + + + + + + + + + + + Module: Bittrex | WTF - A Terminal Dashboard + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Module: Bittrex

+ +
+ +
+ +

Get the last 24 hour summary of cryptocurrencies market.

+ +

Source Code

+
+
wtf/bittrex/
+
+

Required ENV Variables

+ +

None.

+ +

Keyboard Commands

+ +

None.

+ +

Configuration

+
+
bittrex:
+  enabled: true
+  position:
+    top: 1
+    left: 2
+    height: 1
+    width: 1
+  updateInterval: 15
+  summary: 
+   BTC:
+     displayName: Bitcoin
+     market: 
+       - ETH
+       - LTC
+   ETH:
+     displayName: Ethereum
+     market: 
+       - LTC
+  colors: 
+   base: 
+     name: red
+     displayName: grey
+   market:
+     name: red
+     field: coral
+     value: white
+
+
+
+

Attributes

+ + + +

+ enabled +
Determines whether or not this module is executed and if its data displayed onscreen. +
Values: + true, + false.

+ +

+ position +
Defines where in the grid this module’s widget will be displayed. +
+

+ +

+ updateInterval +
How often, in seconds, this module will update its data. +
Values: A positive integer +
Default Value: 10

+ +

+ colors +
Sets color of texts. +
Values: A valid color +

+ +
+ + +
+ + + + \ No newline at end of file From 0386cf88ecc6e315bcd3865e22f2cd7fc05e8f3e Mon Sep 17 00:00:00 2001 From: Hossein Mehrabi Date: Mon, 4 Jun 2018 06:29:58 +0430 Subject: [PATCH 003/140] avoid panics --- cryptoexchanges/bittrex/widget.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cryptoexchanges/bittrex/widget.go b/cryptoexchanges/bittrex/widget.go index 9f5039dd..dc85f3e2 100644 --- a/cryptoexchanges/bittrex/widget.go +++ b/cryptoexchanges/bittrex/widget.go @@ -127,6 +127,11 @@ func (widget *Widget) Refresh() { /* -------------------- Unexported Functions -------------------- */ func (widget *Widget) updateSummary() { + // In case if anything bad happened! + defer func() { + recover() + }() + client := &http.Client{ Timeout: time.Duration(5 * time.Second), } From f8a3b5741499b2266247e4c6cb2767943bdf27ba Mon Sep 17 00:00:00 2001 From: Hossein Mehrabi Date: Mon, 4 Jun 2018 06:57:37 +0430 Subject: [PATCH 004/140] better variable names --- cryptoexchanges/bittrex/bittrex.go | 18 +++++------ cryptoexchanges/bittrex/display.go | 20 ++++++------- cryptoexchanges/bittrex/widget.go | 48 +++++++++++++++--------------- 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/cryptoexchanges/bittrex/bittrex.go b/cryptoexchanges/bittrex/bittrex.go index d4f4eed4..c06f65cb 100644 --- a/cryptoexchanges/bittrex/bittrex.go +++ b/cryptoexchanges/bittrex/bittrex.go @@ -1,18 +1,18 @@ package bittrex type summaryList struct { - items []*fCurrency + items []*bCurrency } -// fCurrency From Currency -type fCurrency struct { +// Base Currency +type bCurrency struct { name string displayName string - to []*tCurrency + markets []*mCurrency } -// tCurrency To Currency -type tCurrency struct { +// Market Currency +type mCurrency struct { name string summaryInfo } @@ -40,10 +40,10 @@ type summaryResponse struct { } `json:"result"` } -func (list *summaryList) addSummaryItem(name, displayName string, toList []*tCurrency) { - list.items = append(list.items, &fCurrency{ +func (list *summaryList) addSummaryItem(name, displayName string, marketList []*mCurrency) { + list.items = append(list.items, &bCurrency{ name: name, displayName: displayName, - to: toList, + markets: marketList, }) } diff --git a/cryptoexchanges/bittrex/display.go b/cryptoexchanges/bittrex/display.go index 28c368e5..29cc6124 100644 --- a/cryptoexchanges/bittrex/display.go +++ b/cryptoexchanges/bittrex/display.go @@ -21,12 +21,12 @@ func (widget *Widget) display() { func summaryText(list *summaryList, colors *TextColors) string { str := "" - for _, fromCurrency := range list.items { - str += fmt.Sprintf("[%s]%s[%s](%s):\n", colors.base.displayName, fromCurrency.displayName, colors.base.name, fromCurrency.name) + for _, baseCurrency := range list.items { + str += fmt.Sprintf("[%s]%s[%s](%s):\n", colors.base.displayName, baseCurrency.displayName, colors.base.name, baseCurrency.name) resultTemplate := template.New("bittrex") - for _, toCurrency := range fromCurrency.to { + for _, marketCurrency := range baseCurrency.markets { writer := new(bytes.Buffer) strTemplate, _ := resultTemplate.Parse( "\t[{{.nameColor}}]{{.mName}}\n" + @@ -42,13 +42,13 @@ func summaryText(list *summaryList, colors *TextColors) string { "nameColor": colors.market.name, "fieldColor": colors.market.field, "valueColor": colors.market.value, - "mName": toCurrency.name, - "High": toCurrency.High, - "Low": toCurrency.Low, - "Last": toCurrency.Last, - "Volume": toCurrency.Volume, - "OpenSellOrders": toCurrency.OpenSellOrders, - "OpenBuyOrders": toCurrency.OpenBuyOrders, + "mName": marketCurrency.name, + "High": marketCurrency.High, + "Low": marketCurrency.Low, + "Last": marketCurrency.Last, + "Volume": marketCurrency.Volume, + "OpenSellOrders": marketCurrency.OpenSellOrders, + "OpenBuyOrders": marketCurrency.OpenBuyOrders, }) str += writer.String() diff --git a/cryptoexchanges/bittrex/widget.go b/cryptoexchanges/bittrex/widget.go index dc85f3e2..fd5c04ed 100644 --- a/cryptoexchanges/bittrex/widget.go +++ b/cryptoexchanges/bittrex/widget.go @@ -68,26 +68,26 @@ func (widget *Widget) config() { func (widget *Widget) setSummaryList() { sCurrencies, _ := Config.Map("wtf.mods.bittrex.summary") - for fromCurrencyName := range sCurrencies { - displayName, _ := Config.String("wtf.mods.bittrex.summary." + fromCurrencyName + ".displayName") - toCurrencyList := makeSummaryToList(fromCurrencyName) - widget.summaryList.addSummaryItem(fromCurrencyName, displayName, toCurrencyList) + for baseCurrencyName := range sCurrencies { + displayName, _ := Config.String("wtf.mods.bittrex.summary." + baseCurrencyName + ".displayName") + mCurrencyList := makeSummaryMarketList(baseCurrencyName) + widget.summaryList.addSummaryItem(baseCurrencyName, displayName, mCurrencyList) } } -func makeSummaryToList(currencyName string) []*tCurrency { - tCurrencyList := []*tCurrency{} +func makeSummaryMarketList(currencyName string) []*mCurrency { + mCurrencyList := []*mCurrency{} - configToList, _ := Config.List("wtf.mods.bittrex.summary." + currencyName + ".market") - for _, toCurrencyName := range configToList { - tCurrencyList = append(tCurrencyList, makeToCurrency(toCurrencyName.(string))) + configMarketList, _ := Config.List("wtf.mods.bittrex.summary." + currencyName + ".market") + for _, mCurrencyName := range configMarketList { + mCurrencyList = append(mCurrencyList, makeMarketCurrency(mCurrencyName.(string))) } - return tCurrencyList + return mCurrencyList } -func makeToCurrency(name string) *tCurrency { - return &tCurrency{ +func makeMarketCurrency(name string) *mCurrency { + return &mCurrency{ name: name, summaryInfo: summaryInfo{ High: "-1", @@ -136,9 +136,9 @@ func (widget *Widget) updateSummary() { Timeout: time.Duration(5 * time.Second), } - for _, fromCurrency := range widget.summaryList.items { - for _, toCurrency := range fromCurrency.to { - request := makeRequest(fromCurrency.name, toCurrency.name) + for _, baseCurrency := range widget.summaryList.items { + for _, mCurrency := range baseCurrency.markets { + request := makeRequest(baseCurrency.name, mCurrency.name) response, err := client.Do(request) if err != nil { @@ -166,26 +166,26 @@ func (widget *Widget) updateSummary() { if !jsonResponse.Success { ok = false - errorText = fmt.Sprintf("%s-%s: %s", fromCurrency.name, toCurrency.name, jsonResponse.Message) + errorText = fmt.Sprintf("%s-%s: %s", baseCurrency.name, mCurrency.name, jsonResponse.Message) break } ok = true errorText = "" - toCurrency.Last = fmt.Sprintf("%f", jsonResponse.Result[0].Last) - toCurrency.High = fmt.Sprintf("%f", jsonResponse.Result[0].High) - toCurrency.Low = fmt.Sprintf("%f", jsonResponse.Result[0].Low) - toCurrency.Volume = fmt.Sprintf("%f", jsonResponse.Result[0].Volume) - toCurrency.OpenBuyOrders = fmt.Sprintf("%d", jsonResponse.Result[0].OpenBuyOrders) - toCurrency.OpenSellOrders = fmt.Sprintf("%d", jsonResponse.Result[0].OpenSellOrders) + mCurrency.Last = fmt.Sprintf("%f", jsonResponse.Result[0].Last) + mCurrency.High = fmt.Sprintf("%f", jsonResponse.Result[0].High) + mCurrency.Low = fmt.Sprintf("%f", jsonResponse.Result[0].Low) + mCurrency.Volume = fmt.Sprintf("%f", jsonResponse.Result[0].Volume) + mCurrency.OpenBuyOrders = fmt.Sprintf("%d", jsonResponse.Result[0].OpenBuyOrders) + mCurrency.OpenSellOrders = fmt.Sprintf("%d", jsonResponse.Result[0].OpenSellOrders) } } widget.display() } -func makeRequest(fName, tName string) *http.Request { - url := fmt.Sprintf("%s?market=%s-%s", baseURL, fName, tName) +func makeRequest(baseName, marketName string) *http.Request { + url := fmt.Sprintf("%s?market=%s-%s", baseURL, baseName, marketName) request, _ := http.NewRequest("GET", url, nil) return request From 6e1b8b3b47e0f0308b0c0a1b4710911919424885 Mon Sep 17 00:00:00 2001 From: liyiheng Date: Mon, 4 Jun 2018 10:31:05 +0800 Subject: [PATCH 005/140] Bug fix: lsb_release --- system/system_info.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/system_info.go b/system/system_info.go index 63fa6770..1582ebe7 100644 --- a/system/system_info.go +++ b/system/system_info.go @@ -22,7 +22,8 @@ func NewSystemInfo() *SystemInfo { var cmd *exec.Cmd switch runtime.GOOS { case "linux": - cmd = exec.Command("uname -a", arg...) + arg = append(arg, "-a") + cmd = exec.Command("lsb_release", arg...) case "darwin": cmd = exec.Command("sw_vers", arg...) default: @@ -33,7 +34,6 @@ func NewSystemInfo() *SystemInfo { for _, row := range strings.Split(raw, "\n") { parts := strings.Split(row, ":") - if len(parts) < 2 { continue } From 9828e5ba3e4352dafaa8030141438494f128cfae Mon Sep 17 00:00:00 2001 From: liyiheng Date: Mon, 4 Jun 2018 14:27:05 +0800 Subject: [PATCH 006/140] Improvement: Power mod for Linux --- bamboohr/calendar.go | 2 - bamboohr/employee.go | 2 - jira/issues.go | 3 - jira/search_result.go | 2 - power/battery.go | 2 + power/battery_linux.go | 118 ++++++++++++++++++++++++++++++++++++++++ power/source.go | 2 + power/source_linux.go | 15 +++++ todo/item.go | 2 - wtf/position.go | 2 - wtf_tests/utils_test.go | 2 +- 11 files changed, 138 insertions(+), 14 deletions(-) create mode 100644 power/battery_linux.go create mode 100644 power/source_linux.go diff --git a/bamboohr/calendar.go b/bamboohr/calendar.go index 2b2dadea..4dcb3840 100644 --- a/bamboohr/calendar.go +++ b/bamboohr/calendar.go @@ -1,7 +1,5 @@ package bamboohr -import () - type Calendar struct { Items []Item `xml:"item"` } diff --git a/bamboohr/employee.go b/bamboohr/employee.go index 02d179d6..7cc655bd 100644 --- a/bamboohr/employee.go +++ b/bamboohr/employee.go @@ -1,7 +1,5 @@ package bamboohr -import () - /* * Note: this currently implements the minimum number of fields to fulfill the Away functionality. * Undoubtedly there are more fields than this to an employee diff --git a/jira/issues.go b/jira/issues.go index ecaceb92..a8ad546f 100644 --- a/jira/issues.go +++ b/jira/issues.go @@ -1,8 +1,5 @@ package jira -import ( -) - type Issue struct { Expand string `json:"expand"` ID string `json:"id"` diff --git a/jira/search_result.go b/jira/search_result.go index 66a3f1a8..7febef6d 100644 --- a/jira/search_result.go +++ b/jira/search_result.go @@ -1,7 +1,5 @@ package jira -import () - type SearchResult struct { StartAt int `json:"startAt"` MaxResults int `json:"maxResults"` diff --git a/power/battery.go b/power/battery.go index c837b7f8..08b7fdfe 100644 --- a/power/battery.go +++ b/power/battery.go @@ -1,3 +1,5 @@ +// +build !linux + package power import ( diff --git a/power/battery_linux.go b/power/battery_linux.go new file mode 100644 index 00000000..ef538374 --- /dev/null +++ b/power/battery_linux.go @@ -0,0 +1,118 @@ +// +build linux + +package power + +import ( + "fmt" + "os/exec" + "strconv" + "strings" + + "github.com/senorprogrammer/wtf/wtf" +) + +var batteryState string + +type Battery struct { + args []string + cmd string + result string + + Charge string + Remaining string +} + +func NewBattery() *Battery { + var battery *Battery + //sh := `upower -i $(upower -e | grep '/battery') | grep --color=never -E "state|to\ full|to\ empty|percentage"` + battery = &Battery{ + //args: []string{"-c", sh}, + //cmd: "/bin/sh", + } + return battery +} + +/* -------------------- Exported Functions -------------------- */ + +func (battery *Battery) Refresh() { + data := battery.execute() + battery.result = battery.parse(data) +} + +func (battery *Battery) String() string { + return battery.result +} + +/* -------------------- Unexported Functions -------------------- */ + +func (battery *Battery) execute() string { + cmd := exec.Command("upower", "-e") + lines := strings.Split(wtf.ExecuteCommand(cmd), "\n") + var target string + for _, l := range lines { + if strings.Contains(l, "/battery") { + target = l + break + } + } + cmd = exec.Command("upower", "-i", target) + return wtf.ExecuteCommand(cmd) +} + +func (battery *Battery) parse(data string) string { + lines := strings.Split(data, "\n") + if len(lines) < 2 { + return "unknown" + } + table := make(map[string]string) + for _, line := range lines { + parts := strings.Split(line, ":") + if len(parts) < 2 { + continue + } + table[strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1]) + } + if s := table["time to empty"]; s == "" { + table["time to empty"] = "∞" + } + str := "" + str = str + fmt.Sprintf(" %10s: %s\n", "Charge", battery.formatCharge(table["percentage"])) + str = str + fmt.Sprintf(" %10s: %s\n", "Remaining", table["time to empty"]) + str = str + fmt.Sprintf(" %10s: %s\n", "State", battery.formatState(table["state"])) + if s := table["time to full"]; s != "" { + str = str + fmt.Sprintf(" %10s: %s\n", "TimeToFull", table["time to full"]) + } + batteryState = table["state"] + return str +} + +func (battery *Battery) formatCharge(data string) string { + percent, _ := strconv.ParseFloat(strings.Replace(data, "%", "", -1), 32) + color := "" + + switch { + case percent >= 70: + color = "[green]" + case percent >= 35: + color = "[yellow]" + default: + color = "[red]" + } + + return color + data + "[white]" +} + +func (battery *Battery) formatState(data string) string { + color := "" + + switch data { + case "charging": + color = "[green]" + case "discharging": + color = "[yellow]" + default: + color = "[white]" + } + + return color + data + "[white]" +} diff --git a/power/source.go b/power/source.go index b5f0faff..e6eff36c 100644 --- a/power/source.go +++ b/power/source.go @@ -1,3 +1,5 @@ +// +build !linux + package power import ( diff --git a/power/source_linux.go b/power/source_linux.go new file mode 100644 index 00000000..0e9a0f8f --- /dev/null +++ b/power/source_linux.go @@ -0,0 +1,15 @@ +// +build linux + +package power + +// powerSource returns the name of the current power source, probably one of +// "AC Power" or "Battery Power" +func powerSource() string { + switch batteryState { + case "charging": + return "AC Power" + case "discharging": + return "Battery Power" + } + return batteryState +} diff --git a/todo/item.go b/todo/item.go index aa77f41e..bc87b897 100644 --- a/todo/item.go +++ b/todo/item.go @@ -1,7 +1,5 @@ package todo -import () - type Item struct { Checked bool Text string diff --git a/wtf/position.go b/wtf/position.go index 5fd02346..521a93b3 100644 --- a/wtf/position.go +++ b/wtf/position.go @@ -1,7 +1,5 @@ package wtf -import () - type Position struct { top int left int diff --git a/wtf_tests/utils_test.go b/wtf_tests/utils_test.go index 9a6c005c..15b0e734 100644 --- a/wtf_tests/utils_test.go +++ b/wtf_tests/utils_test.go @@ -3,8 +3,8 @@ package wtf_tests import ( "testing" - . "github.com/senorprogrammer/wtf/wtf" "github.com/go-test/deep" + . "github.com/senorprogrammer/wtf/wtf" ) /* -------------------- Exclude() -------------------- */ From fc445cf2e76b8c80ae669e281f91dd1f1a8a043f Mon Sep 17 00:00:00 2001 From: liyiheng Date: Mon, 4 Jun 2018 14:57:05 +0800 Subject: [PATCH 007/140] Improvement: Battery state on Linux --- power/source_linux.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/power/source_linux.go b/power/source_linux.go index 0e9a0f8f..a28368c8 100644 --- a/power/source_linux.go +++ b/power/source_linux.go @@ -6,7 +6,7 @@ package power // "AC Power" or "Battery Power" func powerSource() string { switch batteryState { - case "charging": + case "charging", "fully-charged": return "AC Power" case "discharging": return "Battery Power" From f9db4cc9901d41d4a1d0e8f4890c7f8ba5e565d6 Mon Sep 17 00:00:00 2001 From: lucus Date: Mon, 4 Jun 2018 17:40:02 +0900 Subject: [PATCH 008/140] Fix issue #89 Better handle dns on macOS --- security/dns.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/security/dns.go b/security/dns.go index 7360d801..69edfcc3 100644 --- a/security/dns.go +++ b/security/dns.go @@ -42,7 +42,8 @@ func dnsLinux() []string { } func dnsMacOS() []string { - cmd := exec.Command("networksetup", "-getdnsservers", "Wi-Fi") + cmdString := `scutil --dns | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'` + cmd := exec.Command("sh", "-c", cmdString) out := wtf.ExecuteCommand(cmd) lines := strings.Split(out, "\n") From 64f8dbcf8d42bc4a32bf9314f99914bd824ba534 Mon Sep 17 00:00:00 2001 From: Chris Cummer Date: Mon, 4 Jun 2018 04:20:17 -0700 Subject: [PATCH 009/140] Update Configuration documentation with an explanation of the grid layout system --- _site/content/posts/configuration.md | 27 +++++++++++++++++++++++++++ docs/posts/configuration/index.html | 26 ++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/_site/content/posts/configuration.md b/_site/content/posts/configuration.md index 183f0119..46e9e03a 100644 --- a/_site/content/posts/configuration.md +++ b/_site/content/posts/configuration.md @@ -51,3 +51,30 @@ wouldn't want to have laying about in the config files. For modules that require them, the name of the required environment variable(s) can be found in that module's "Required ENV Variables" section of the documentation. See OpsGenie for an example. + +## Grid Layout + +WTF uses the `Grid` layout system from [tview](https://github.com/rivo/tview/blob/master/grid.go) to position widgets +onscreen. It's not immediately obvious how this works, so here's an +explanation: + +Think of your terminal screen as a matrix of letter positions, say `100` chrs wide and `58` chrs tall. + +Columns breaks up the width of the screen into chunks, each chunk a specified number of characters wide. use + +`[10, 10, 10, 10, 10, 10, 10, 10, 10, 10]` + +Ten columns that are ten characters wide + +Rows break up the height of the screen into chunks, each chunk a specified number of characters tall. If we wanted to have five rows: + +`[10, 10, 10, 10, 18]` + +The co-ordinate system starts at top-left and defines how wide and tall a widget is. If we wanted to put a 2-col, 2-row widget in the bottom of the screen, we'd position it at: + +``` + top: 4 // top starts in the 4th row + left: 9 // left starts in the 9th column + height: 2 // span down rows 4 & 5 (18 characters in size, total) + width: 2 // span across cols 9 & 10 (20 characters in size, total) +``` diff --git a/docs/posts/configuration/index.html b/docs/posts/configuration/index.html index 02125fe1..8520f951 100644 --- a/docs/posts/configuration/index.html +++ b/docs/posts/configuration/index.html @@ -156,6 +156,32 @@ wouldn’t want to have laying about in the config files.

variable(s) can be found in that module’s “Required ENV Variables” section of the documentation. See OpsGenie for an example.

+

Grid Layout

+ +

WTF uses the Grid layout system from tview to position widgets +onscreen. It’s not immediately obvious how this works, so here’s an +explanation:

+ +

Think of your terminal screen as a matrix of letter positions, say 100 chrs wide and 58 chrs tall.

+ +

Columns breaks up the width of the screen into chunks, each chunk a specified number of characters wide. use

+ +

[10, 10, 10, 10, 10, 10, 10, 10, 10, 10]

+ +

Ten columns that are ten characters wide

+ +

Rows break up the height of the screen into chunks, each chunk a specified number of characters tall. If we wanted to have five rows:

+ +

[10, 10, 10, 10, 18]

+ +

The co-ordinate system starts at top-left and defines how wide and tall a widget is. If we wanted to put a 2-col, 2-row widget in the bottom of the screen, we’d position it at:

+ +
  top: 4     // top starts in the 4th row
+  left: 9    // left starts in the 9th column
+  height: 2  // span down rows 4 & 5 (18 characters in size, total)
+  width: 2   // span across cols 9 & 10 (20 characters in size, total)
+
+

Attributes

From f1ca3514eecf238a7990980ce625416a9bf68c38 Mon Sep 17 00:00:00 2001 From: Chris Cummer Date: Mon, 4 Jun 2018 21:04:45 -0700 Subject: [PATCH 021/140] Simplify the module titles in the documentation --- _site/content/posts/modules/bamboohr.md | 2 +- _site/content/posts/modules/clocks.md | 2 +- _site/content/posts/modules/cmdrunner.md | 4 +-- .../modules/cryptocurrencies/cryptolive.md | 2 +- _site/content/posts/modules/gcal.md | 2 +- _site/content/posts/modules/git.md | 2 +- _site/content/posts/modules/github.md | 2 +- _site/content/posts/modules/ipinfo.md | 2 +- _site/content/posts/modules/jira.md | 2 +- _site/content/posts/modules/newrelic.md | 2 +- _site/content/posts/modules/opsgenie.md | 2 +- _site/content/posts/modules/power.md | 2 +- _site/content/posts/modules/prettyweather.md | 2 +- _site/content/posts/modules/security.md | 2 +- _site/content/posts/modules/textfile.md | 2 +- _site/content/posts/modules/todo.md | 2 +- _site/content/posts/modules/weather.md | 2 +- docs/index.xml | 34 +++++++++---------- docs/posts/index.html | 34 +++++++++---------- docs/posts/index.xml | 34 +++++++++---------- docs/posts/modules/bamboohr/index.html | 6 ++-- docs/posts/modules/clocks/index.html | 6 ++-- docs/posts/modules/cmdrunner/index.html | 6 ++-- .../cryptocurrencies/cryptolive/index.html | 6 ++-- docs/posts/modules/gcal/index.html | 6 ++-- docs/posts/modules/git/index.html | 6 ++-- docs/posts/modules/github/index.html | 6 ++-- docs/posts/modules/ipinfo/index.html | 6 ++-- docs/posts/modules/jira/index.html | 6 ++-- docs/posts/modules/newrelic/index.html | 6 ++-- docs/posts/modules/opsgenie/index.html | 6 ++-- docs/posts/modules/power/index.html | 6 ++-- docs/posts/modules/prettyweather/index.html | 6 ++-- docs/posts/modules/security/index.html | 6 ++-- docs/posts/modules/textfile/index.html | 6 ++-- docs/posts/modules/todo/index.html | 6 ++-- docs/posts/modules/weather/index.html | 6 ++-- 37 files changed, 120 insertions(+), 120 deletions(-) diff --git a/_site/content/posts/modules/bamboohr.md b/_site/content/posts/modules/bamboohr.md index 6186e6f9..2ca3e35f 100644 --- a/_site/content/posts/modules/bamboohr.md +++ b/_site/content/posts/modules/bamboohr.md @@ -1,5 +1,5 @@ --- -title: "Modules: Bamboohr" +title: "BambooHR" date: 2018-05-07T20:17:37-07:00 draft: false --- diff --git a/_site/content/posts/modules/clocks.md b/_site/content/posts/modules/clocks.md index 512a13ce..3d99e249 100644 --- a/_site/content/posts/modules/clocks.md +++ b/_site/content/posts/modules/clocks.md @@ -1,5 +1,5 @@ --- -title: "Modules: Clocks" +title: "Clocks" date: 2018-05-07T19:47:31-07:00 draft: false --- diff --git a/_site/content/posts/modules/cmdrunner.md b/_site/content/posts/modules/cmdrunner.md index 8975d2c3..856984bf 100644 --- a/_site/content/posts/modules/cmdrunner.md +++ b/_site/content/posts/modules/cmdrunner.md @@ -1,5 +1,5 @@ --- -title: "Modules: CmdRunner" +title: "CmdRunner" date: 2018-05-17T17:17:10-07:00 draft: false --- @@ -38,7 +38,7 @@ cmdrunner: ### Attributes `args`
-The arguments to the command, with each item as an element in an array. +The arguments to the command, with each item as an element in an array. Example: for `curl -I cisco.com`, the arguments array would be `["-I", "cisco.com"]`. `cmd`
diff --git a/_site/content/posts/modules/cryptocurrencies/cryptolive.md b/_site/content/posts/modules/cryptocurrencies/cryptolive.md index 9a0601ff..9ea88626 100644 --- a/_site/content/posts/modules/cryptocurrencies/cryptolive.md +++ b/_site/content/posts/modules/cryptocurrencies/cryptolive.md @@ -1,5 +1,5 @@ --- -title: "Cryptolive" +title: "CryptoLive" date: 2018-06-03T20:06:40-07:00 draft: false --- diff --git a/_site/content/posts/modules/gcal.md b/_site/content/posts/modules/gcal.md index 3376f814..ef6a70dd 100644 --- a/_site/content/posts/modules/gcal.md +++ b/_site/content/posts/modules/gcal.md @@ -1,5 +1,5 @@ --- -title: "Modules: Google Calendar" +title: "Google Calendar" date: 2018-05-10T08:25:33-07:00 draft: false --- diff --git a/_site/content/posts/modules/git.md b/_site/content/posts/modules/git.md index ba0958ea..e0a6a1f2 100644 --- a/_site/content/posts/modules/git.md +++ b/_site/content/posts/modules/git.md @@ -1,5 +1,5 @@ --- -title: "Modules: Git" +title: "Git" date: 2018-05-09T14:20:48-07:00 draft: false --- diff --git a/_site/content/posts/modules/github.md b/_site/content/posts/modules/github.md index 2dd3e6ca..1b201e30 100644 --- a/_site/content/posts/modules/github.md +++ b/_site/content/posts/modules/github.md @@ -1,5 +1,5 @@ --- -title: "Modules: Github" +title: "Github" date: 2018-05-09T19:20:20-07:00 draft: false --- diff --git a/_site/content/posts/modules/ipinfo.md b/_site/content/posts/modules/ipinfo.md index f1c40c79..b6e2663a 100644 --- a/_site/content/posts/modules/ipinfo.md +++ b/_site/content/posts/modules/ipinfo.md @@ -1,5 +1,5 @@ --- -title: "Module: IPInfo" +title: "IPInfo" date: 2018-06-01T23:18:48-07:00 draft: false --- diff --git a/_site/content/posts/modules/jira.md b/_site/content/posts/modules/jira.md index 0f40d4b3..08479c62 100644 --- a/_site/content/posts/modules/jira.md +++ b/_site/content/posts/modules/jira.md @@ -1,5 +1,5 @@ --- -title: "Modules: Jira" +title: "Jira" date: 2018-05-10T10:44:35-07:00 draft: false --- diff --git a/_site/content/posts/modules/newrelic.md b/_site/content/posts/modules/newrelic.md index b8ca07d5..e7eb1fbc 100644 --- a/_site/content/posts/modules/newrelic.md +++ b/_site/content/posts/modules/newrelic.md @@ -1,5 +1,5 @@ --- -title: "Modules: New Relic" +title: "New Relic" date: 2018-05-09T09:01:14-07:00 draft: false --- diff --git a/_site/content/posts/modules/opsgenie.md b/_site/content/posts/modules/opsgenie.md index ab2cc912..5d34d4be 100644 --- a/_site/content/posts/modules/opsgenie.md +++ b/_site/content/posts/modules/opsgenie.md @@ -1,5 +1,5 @@ --- -title: "Modules: OpsGenie" +title: "OpsGenie" date: 2018-05-08T20:53:40-07:00 draft: false --- diff --git a/_site/content/posts/modules/power.md b/_site/content/posts/modules/power.md index b3bd4fdb..7ecc728d 100644 --- a/_site/content/posts/modules/power.md +++ b/_site/content/posts/modules/power.md @@ -1,5 +1,5 @@ --- -title: "Modules: Power" +title: "Power" date: 2018-05-26T19:26:23-07:00 draft: false --- diff --git a/_site/content/posts/modules/prettyweather.md b/_site/content/posts/modules/prettyweather.md index 3a11fe8f..39a08e4b 100644 --- a/_site/content/posts/modules/prettyweather.md +++ b/_site/content/posts/modules/prettyweather.md @@ -1,5 +1,5 @@ --- -title: "Prettyweather" +title: "Pretty Weather" date: 2018-06-02T05:32:04-07:00 draft: false --- diff --git a/_site/content/posts/modules/security.md b/_site/content/posts/modules/security.md index 2f4a308e..c9800121 100644 --- a/_site/content/posts/modules/security.md +++ b/_site/content/posts/modules/security.md @@ -1,5 +1,5 @@ --- -title: "Modules: Security" +title: "Security" date: 2018-05-08T20:33:28-07:00 draft: false --- diff --git a/_site/content/posts/modules/textfile.md b/_site/content/posts/modules/textfile.md index 1697523f..9db3bd4d 100644 --- a/_site/content/posts/modules/textfile.md +++ b/_site/content/posts/modules/textfile.md @@ -1,5 +1,5 @@ --- -title: "Modules: Textfile" +title: "Textfile" date: 2018-05-09T11:13:11-07:00 draft: false --- diff --git a/_site/content/posts/modules/todo.md b/_site/content/posts/modules/todo.md index 248f956c..b738b67d 100644 --- a/_site/content/posts/modules/todo.md +++ b/_site/content/posts/modules/todo.md @@ -1,5 +1,5 @@ --- -title: "Modules: Todo" +title: "Todo" date: 2018-05-10T12:41:50-07:00 draft: false --- diff --git a/_site/content/posts/modules/weather.md b/_site/content/posts/modules/weather.md index b8b745b3..c7cb5052 100644 --- a/_site/content/posts/modules/weather.md +++ b/_site/content/posts/modules/weather.md @@ -1,5 +1,5 @@ --- -title: "Modules: Weather" +title: "Weather" date: 2018-05-09T11:44:13-07:00 draft: false --- diff --git a/docs/index.xml b/docs/index.xml index 055e707f..1596a7db 100644 --- a/docs/index.xml +++ b/docs/index.xml @@ -30,7 +30,7 @@ summary enabled Determines whether or not this module is executed and if its dat - Cryptolive + CryptoLive https://wtfutil.com/posts/modules/cryptocurrencies/cryptolive/ Sun, 03 Jun 2018 20:06:40 -0700 @@ -48,7 +48,7 @@ position Defines where in the grid this module&rsquo;s widget will be displa - Prettyweather + Pretty Weather https://wtfutil.com/posts/modules/prettyweather/ Sat, 02 Jun 2018 05:32:04 -0700 @@ -64,7 +64,7 @@ position Defines where in the grid this module&rsquo;s widget will be displa - Module: IPInfo + IPInfo https://wtfutil.com/posts/modules/ipinfo/ Fri, 01 Jun 2018 23:18:48 -0700 @@ -79,7 +79,7 @@ position Defines where in the grid this module&rsquo;s widget will be displa - Modules: Power + Power https://wtfutil.com/posts/modules/power/ Sat, 26 May 2018 19:26:23 -0700 @@ -130,7 +130,7 @@ https://github.com/senorprogrammer/wtf/releases expand it, and cd into the resul - Modules: CmdRunner + CmdRunner https://wtfutil.com/posts/modules/cmdrunner/ Thu, 17 May 2018 17:17:10 -0700 @@ -153,7 +153,7 @@ wtf:colors:background:&#34;red&#34;border:Focusable:&#34;darkslatebl - Modules: Todo + Todo https://wtfutil.com/posts/modules/todo/ Thu, 10 May 2018 12:41:50 -0700 @@ -167,7 +167,7 @@ Key: j Action: Select the next item in the list. - Modules: Jira + Jira https://wtfutil.com/posts/modules/jira/ Thu, 10 May 2018 10:44:35 -0700 @@ -182,7 +182,7 @@ email The email address associated with your Jira account. - Modules: Google Calendar + Google Calendar https://wtfutil.com/posts/modules/gcal/ Thu, 10 May 2018 08:25:33 -0700 @@ -195,7 +195,7 @@ Keyboard Commands None. - Modules: Github + Github https://wtfutil.com/posts/modules/github/ Wed, 09 May 2018 19:20:20 -0700 @@ -210,7 +210,7 @@ Key: l Action: Show the next git repository. - Modules: Git + Git https://wtfutil.com/posts/modules/git/ Wed, 09 May 2018 14:20:48 -0700 @@ -225,7 +225,7 @@ Key: h Action: Show the previous git repository. - Modules: Weather + Weather https://wtfutil.com/posts/modules/weather/ Wed, 09 May 2018 11:44:13 -0700 @@ -240,7 +240,7 @@ Key: → Action: Show the next weather location. - Modules: Textfile + Textfile https://wtfutil.com/posts/modules/textfile/ Wed, 09 May 2018 11:13:11 -0700 @@ -254,7 +254,7 @@ filePath The path to the file to be displayed in the widget. - Modules: New Relic + New Relic https://wtfutil.com/posts/modules/newrelic/ Wed, 09 May 2018 09:01:14 -0700 @@ -267,7 +267,7 @@ deployCount The number of past deploys to display on screen. - Modules: OpsGenie + OpsGenie https://wtfutil.com/posts/modules/opsgenie/ Tue, 08 May 2018 20:53:40 -0700 @@ -281,7 +281,7 @@ position Where in the grid this module&rsquo;s widget will be displayed. - Modules: Security + Security https://wtfutil.com/posts/modules/security/ Tue, 08 May 2018 20:33:28 -0700 @@ -291,7 +291,7 @@ Wifi Network The name of the current network Whether or not the network uses enc - Modules: Bamboohr + BambooHR https://wtfutil.com/posts/modules/bamboohr/ Mon, 07 May 2018 20:17:37 -0700 @@ -305,7 +305,7 @@ position Defines where in the grid this module&rsquo;s widget will be displa - Modules: Clocks + Clocks https://wtfutil.com/posts/modules/clocks/ Mon, 07 May 2018 19:47:31 -0700 diff --git a/docs/posts/index.html b/docs/posts/index.html index 1156073f..15386a6a 100644 --- a/docs/posts/index.html +++ b/docs/posts/index.html @@ -107,28 +107,28 @@
  • - Cryptolive + CryptoLive
  • - Prettyweather + Pretty Weather
  • - Module: IPInfo + IPInfo
  • - Modules: Power + Power @@ -156,7 +156,7 @@
  • - Modules: CmdRunner + CmdRunner @@ -170,84 +170,84 @@
  • - Modules: Todo + Todo
  • - Modules: Jira + Jira
  • - Modules: Google Calendar + Google Calendar
  • - Modules: Github + Github
  • - Modules: Git + Git
  • - Modules: Weather + Weather
  • - Modules: Textfile + Textfile
  • - Modules: New Relic + New Relic
  • - Modules: OpsGenie + OpsGenie
  • - Modules: Security + Security
  • - Modules: Bamboohr + BambooHR
  • - Modules: Clocks + Clocks diff --git a/docs/posts/index.xml b/docs/posts/index.xml index 2f87ce31..49b15fc1 100644 --- a/docs/posts/index.xml +++ b/docs/posts/index.xml @@ -30,7 +30,7 @@ summary enabled Determines whether or not this module is executed and if its dat - Cryptolive + CryptoLive https://wtfutil.com/posts/modules/cryptocurrencies/cryptolive/ Sun, 03 Jun 2018 20:06:40 -0700 @@ -48,7 +48,7 @@ position Defines where in the grid this module&rsquo;s widget will be displa - Prettyweather + Pretty Weather https://wtfutil.com/posts/modules/prettyweather/ Sat, 02 Jun 2018 05:32:04 -0700 @@ -64,7 +64,7 @@ position Defines where in the grid this module&rsquo;s widget will be displa - Module: IPInfo + IPInfo https://wtfutil.com/posts/modules/ipinfo/ Fri, 01 Jun 2018 23:18:48 -0700 @@ -79,7 +79,7 @@ position Defines where in the grid this module&rsquo;s widget will be displa - Modules: Power + Power https://wtfutil.com/posts/modules/power/ Sat, 26 May 2018 19:26:23 -0700 @@ -130,7 +130,7 @@ https://github.com/senorprogrammer/wtf/releases expand it, and cd into the resul - Modules: CmdRunner + CmdRunner https://wtfutil.com/posts/modules/cmdrunner/ Thu, 17 May 2018 17:17:10 -0700 @@ -153,7 +153,7 @@ wtf:colors:background:&#34;red&#34;border:Focusable:&#34;darkslatebl - Modules: Todo + Todo https://wtfutil.com/posts/modules/todo/ Thu, 10 May 2018 12:41:50 -0700 @@ -167,7 +167,7 @@ Key: j Action: Select the next item in the list. - Modules: Jira + Jira https://wtfutil.com/posts/modules/jira/ Thu, 10 May 2018 10:44:35 -0700 @@ -182,7 +182,7 @@ email The email address associated with your Jira account. - Modules: Google Calendar + Google Calendar https://wtfutil.com/posts/modules/gcal/ Thu, 10 May 2018 08:25:33 -0700 @@ -195,7 +195,7 @@ Keyboard Commands None. - Modules: Github + Github https://wtfutil.com/posts/modules/github/ Wed, 09 May 2018 19:20:20 -0700 @@ -210,7 +210,7 @@ Key: l Action: Show the next git repository. - Modules: Git + Git https://wtfutil.com/posts/modules/git/ Wed, 09 May 2018 14:20:48 -0700 @@ -225,7 +225,7 @@ Key: h Action: Show the previous git repository. - Modules: Weather + Weather https://wtfutil.com/posts/modules/weather/ Wed, 09 May 2018 11:44:13 -0700 @@ -240,7 +240,7 @@ Key: → Action: Show the next weather location. - Modules: Textfile + Textfile https://wtfutil.com/posts/modules/textfile/ Wed, 09 May 2018 11:13:11 -0700 @@ -254,7 +254,7 @@ filePath The path to the file to be displayed in the widget. - Modules: New Relic + New Relic https://wtfutil.com/posts/modules/newrelic/ Wed, 09 May 2018 09:01:14 -0700 @@ -267,7 +267,7 @@ deployCount The number of past deploys to display on screen. - Modules: OpsGenie + OpsGenie https://wtfutil.com/posts/modules/opsgenie/ Tue, 08 May 2018 20:53:40 -0700 @@ -281,7 +281,7 @@ position Where in the grid this module&rsquo;s widget will be displayed. - Modules: Security + Security https://wtfutil.com/posts/modules/security/ Tue, 08 May 2018 20:33:28 -0700 @@ -291,7 +291,7 @@ Wifi Network The name of the current network Whether or not the network uses enc - Modules: Bamboohr + BambooHR https://wtfutil.com/posts/modules/bamboohr/ Mon, 07 May 2018 20:17:37 -0700 @@ -305,7 +305,7 @@ position Defines where in the grid this module&rsquo;s widget will be displa - Modules: Clocks + Clocks https://wtfutil.com/posts/modules/clocks/ Mon, 07 May 2018 19:47:31 -0700 diff --git a/docs/posts/modules/bamboohr/index.html b/docs/posts/modules/bamboohr/index.html index 1ec6ed0c..1cb3123d 100644 --- a/docs/posts/modules/bamboohr/index.html +++ b/docs/posts/modules/bamboohr/index.html @@ -10,8 +10,8 @@ -Modules: Bamboohr | WTF - A Terminal Dashboard - +BambooHR | WTF - A Terminal Dashboard + @@ -95,7 +95,7 @@
    -

    Modules: Bamboohr

    +

    BambooHR

  • - Cryptolive + CryptoLive
  • - Prettyweather + Pretty Weather
  • - Module: IPInfo + IPInfo
  • - Modules: Power + Power @@ -156,7 +156,7 @@
  • - Modules: CmdRunner + CmdRunner @@ -170,84 +170,84 @@
  • - Modules: Todo + Todo
  • - Modules: Jira + Jira
  • - Modules: Google Calendar + Google Calendar
  • - Modules: Github + Github
  • - Modules: Git + Git
  • - Modules: Weather + Weather
  • - Modules: Textfile + Textfile
  • - Modules: New Relic + New Relic
  • - Modules: OpsGenie + OpsGenie
  • - Modules: Security + Security
  • - Modules: Bamboohr + BambooHR
  • - Modules: Clocks + Clocks diff --git a/docs/posts/index.xml b/docs/posts/index.xml index 2f87ce31..49b15fc1 100644 --- a/docs/posts/index.xml +++ b/docs/posts/index.xml @@ -30,7 +30,7 @@ summary enabled Determines whether or not this module is executed and if its dat - Cryptolive + CryptoLive https://wtfutil.com/posts/modules/cryptocurrencies/cryptolive/ Sun, 03 Jun 2018 20:06:40 -0700 @@ -48,7 +48,7 @@ position Defines where in the grid this module&rsquo;s widget will be displa - Prettyweather + Pretty Weather https://wtfutil.com/posts/modules/prettyweather/ Sat, 02 Jun 2018 05:32:04 -0700 @@ -64,7 +64,7 @@ position Defines where in the grid this module&rsquo;s widget will be displa - Module: IPInfo + IPInfo https://wtfutil.com/posts/modules/ipinfo/ Fri, 01 Jun 2018 23:18:48 -0700 @@ -79,7 +79,7 @@ position Defines where in the grid this module&rsquo;s widget will be displa - Modules: Power + Power https://wtfutil.com/posts/modules/power/ Sat, 26 May 2018 19:26:23 -0700 @@ -130,7 +130,7 @@ https://github.com/senorprogrammer/wtf/releases expand it, and cd into the resul - Modules: CmdRunner + CmdRunner https://wtfutil.com/posts/modules/cmdrunner/ Thu, 17 May 2018 17:17:10 -0700 @@ -153,7 +153,7 @@ wtf:colors:background:&#34;red&#34;border:Focusable:&#34;darkslatebl - Modules: Todo + Todo https://wtfutil.com/posts/modules/todo/ Thu, 10 May 2018 12:41:50 -0700 @@ -167,7 +167,7 @@ Key: j Action: Select the next item in the list. - Modules: Jira + Jira https://wtfutil.com/posts/modules/jira/ Thu, 10 May 2018 10:44:35 -0700 @@ -182,7 +182,7 @@ email The email address associated with your Jira account. - Modules: Google Calendar + Google Calendar https://wtfutil.com/posts/modules/gcal/ Thu, 10 May 2018 08:25:33 -0700 @@ -195,7 +195,7 @@ Keyboard Commands None. - Modules: Github + Github https://wtfutil.com/posts/modules/github/ Wed, 09 May 2018 19:20:20 -0700 @@ -210,7 +210,7 @@ Key: l Action: Show the next git repository. - Modules: Git + Git https://wtfutil.com/posts/modules/git/ Wed, 09 May 2018 14:20:48 -0700 @@ -225,7 +225,7 @@ Key: h Action: Show the previous git repository. - Modules: Weather + Weather https://wtfutil.com/posts/modules/weather/ Wed, 09 May 2018 11:44:13 -0700 @@ -240,7 +240,7 @@ Key: → Action: Show the next weather location. - Modules: Textfile + Textfile https://wtfutil.com/posts/modules/textfile/ Wed, 09 May 2018 11:13:11 -0700 @@ -254,7 +254,7 @@ filePath The path to the file to be displayed in the widget. - Modules: New Relic + New Relic https://wtfutil.com/posts/modules/newrelic/ Wed, 09 May 2018 09:01:14 -0700 @@ -267,7 +267,7 @@ deployCount The number of past deploys to display on screen. - Modules: OpsGenie + OpsGenie https://wtfutil.com/posts/modules/opsgenie/ Tue, 08 May 2018 20:53:40 -0700 @@ -281,7 +281,7 @@ position Where in the grid this module&rsquo;s widget will be displayed. - Modules: Security + Security https://wtfutil.com/posts/modules/security/ Tue, 08 May 2018 20:33:28 -0700 @@ -291,7 +291,7 @@ Wifi Network The name of the current network Whether or not the network uses enc - Modules: Bamboohr + BambooHR https://wtfutil.com/posts/modules/bamboohr/ Mon, 07 May 2018 20:17:37 -0700 @@ -305,7 +305,7 @@ position Defines where in the grid this module&rsquo;s widget will be displa - Modules: Clocks + Clocks https://wtfutil.com/posts/modules/clocks/ Mon, 07 May 2018 19:47:31 -0700 diff --git a/docs/posts/modules/bamboohr/index.html b/docs/posts/modules/bamboohr/index.html index 1ec6ed0c..1cb3123d 100644 --- a/docs/posts/modules/bamboohr/index.html +++ b/docs/posts/modules/bamboohr/index.html @@ -10,8 +10,8 @@ -Modules: Bamboohr | WTF - A Terminal Dashboard - +BambooHR | WTF - A Terminal Dashboard + @@ -95,7 +95,7 @@
    -

    Modules: Bamboohr

    +

    BambooHR

  • + + diff --git a/docs/404.html b/docs/404.html index 262aef29..a41fa335 100644 --- a/docs/404.html +++ b/docs/404.html @@ -65,12 +65,14 @@ + + diff --git a/docs/categories/index.html b/docs/categories/index.html index 8803ffb8..1e98fb7b 100644 --- a/docs/categories/index.html +++ b/docs/categories/index.html @@ -67,12 +67,14 @@ + + diff --git a/docs/imgs/modules/circleci.png b/docs/imgs/modules/circleci.png new file mode 100644 index 0000000000000000000000000000000000000000..96eccfadb188eec9c604b0735d24d9668cb37d41 GIT binary patch literal 62031 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 HFz9~)E0>}H literal 0 HcmV?d00001 diff --git a/docs/index.html b/docs/index.html index fb5764ed..8e536b3a 100644 --- a/docs/index.html +++ b/docs/index.html @@ -66,12 +66,14 @@ + + diff --git a/docs/index.xml b/docs/index.xml index 288b8b9e..0259bfcb 100644 --- a/docs/index.xml +++ b/docs/index.xml @@ -6,17 +6,31 @@ Recent content on WTF - A Terminal Dashboard Hugo -- gohugo.io en-us - Sun, 10 Jun 2018 18:26:26 -0400 + Sun, 10 Jun 2018 19:26:08 -0400 + + CircleCI + https://wtfutil.com/posts/modules/circleci/ + Sun, 10 Jun 2018 19:26:08 -0400 + + https://wtfutil.com/posts/modules/circleci/ + Added in v0.0.7. +Displays build information for your CircleCI account. +Source Code wtf/circleci/ Required ENV Variables Key: WTF_CIRCLE_API_KEY Value: Your CircleCI API token. +Keyboard Commands None. +Configuration circleci:enabled:trueposition:top:4left:1height:1width:2refreshInterval:900 Attributes enabled Determines whether or not this module is executed and if its data displayed onscreen. Values: true, false. +position Defines where in the grid this module&rsquo;s widget will be displayed. refreshInterval How often, in seconds, this module will update its data. + + Google Spreadsheets - https://wtfutil.com/posts/modules/gspreadsheets/ + https://wtfutil.com/posts/modules/gspreadsheet/ Sun, 10 Jun 2018 18:26:26 -0400 - https://wtfutil.com/posts/modules/gspreadsheets/ + https://wtfutil.com/posts/modules/gspreadsheet/ Added in v0.0.7. Display information wtf/gspreadsheets/ Required ENV Variables None. diff --git a/docs/posts/configuration/attributes/index.html b/docs/posts/configuration/attributes/index.html index bd308fdf..69f954ac 100644 --- a/docs/posts/configuration/attributes/index.html +++ b/docs/posts/configuration/attributes/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/configuration/index.html b/docs/posts/configuration/index.html index 067aab24..ded17263 100644 --- a/docs/posts/configuration/index.html +++ b/docs/posts/configuration/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/configuration/iterm2/index.html b/docs/posts/configuration/iterm2/index.html index ba679394..9f554d43 100644 --- a/docs/posts/configuration/iterm2/index.html +++ b/docs/posts/configuration/iterm2/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/glossary/index.html b/docs/posts/glossary/index.html index b88135ae..6ed76f0b 100644 --- a/docs/posts/glossary/index.html +++ b/docs/posts/glossary/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/index.html b/docs/posts/index.html index 09edccfc..ddb5c845 100644 --- a/docs/posts/index.html +++ b/docs/posts/index.html @@ -67,12 +67,14 @@ + + @@ -100,7 +102,14 @@
    • - Google Spreadsheets + CircleCI + + + + +
    • + + Google Spreadsheets diff --git a/docs/posts/index.xml b/docs/posts/index.xml index 62da9b8d..9a86c641 100644 --- a/docs/posts/index.xml +++ b/docs/posts/index.xml @@ -6,17 +6,31 @@ Recent content in Posts on WTF - A Terminal Dashboard Hugo -- gohugo.io en-us - Sun, 10 Jun 2018 18:26:26 -0400 + Sun, 10 Jun 2018 19:26:08 -0400 + + CircleCI + https://wtfutil.com/posts/modules/circleci/ + Sun, 10 Jun 2018 19:26:08 -0400 + + https://wtfutil.com/posts/modules/circleci/ + Added in v0.0.7. +Displays build information for your CircleCI account. +Source Code wtf/circleci/ Required ENV Variables Key: WTF_CIRCLE_API_KEY Value: Your CircleCI API token. +Keyboard Commands None. +Configuration circleci:enabled:trueposition:top:4left:1height:1width:2refreshInterval:900 Attributes enabled Determines whether or not this module is executed and if its data displayed onscreen. Values: true, false. +position Defines where in the grid this module&rsquo;s widget will be displayed. refreshInterval How often, in seconds, this module will update its data. + + Google Spreadsheets - https://wtfutil.com/posts/modules/gspreadsheets/ + https://wtfutil.com/posts/modules/gspreadsheet/ Sun, 10 Jun 2018 18:26:26 -0400 - https://wtfutil.com/posts/modules/gspreadsheets/ + https://wtfutil.com/posts/modules/gspreadsheet/ Added in v0.0.7. Display information wtf/gspreadsheets/ Required ENV Variables None. diff --git a/docs/posts/installation/index.html b/docs/posts/installation/index.html index 57c8acd7..74bc87db 100644 --- a/docs/posts/installation/index.html +++ b/docs/posts/installation/index.html @@ -65,12 +65,14 @@
    • + + diff --git a/docs/posts/modules/bamboohr/index.html b/docs/posts/modules/bamboohr/index.html index e3b3ac7c..a93f5425 100644 --- a/docs/posts/modules/bamboohr/index.html +++ b/docs/posts/modules/bamboohr/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/circleci/index.html b/docs/posts/modules/circleci/index.html new file mode 100644 index 00000000..f2dd6ca0 --- /dev/null +++ b/docs/posts/modules/circleci/index.html @@ -0,0 +1,169 @@ + + + + + + + + + + + + +CircleCI | WTF - A Terminal Dashboard + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +

      CircleCI

      + +
      + +
      + + + +

      Added in v0.0.7.

      + +

      Displays build information for your CircleCI account.

      + +

      circleci screenshot

      + +

      Source Code

      +
      wtf/circleci/
      +

      Required ENV Variables

      + +

      Key: WTF_CIRCLE_API_KEY
      +Value: Your CircleCI API +token.

      + +

      Keyboard Commands

      + +

      None.

      + +

      Configuration

      +
      circleci:
      +  enabled: true
      +  position:
      +    top: 4
      +    left: 1
      +    height: 1
      +    width: 2
      +  refreshInterval: 900
      +

      Attributes

      + +

      enabled
      +Determines whether or not this module is executed and if its data displayed onscreen.
      +Values: true, false.

      + +

      position
      +Defines where in the grid this module’s widget will be displayed.

      + +

      refreshInterval
      +How often, in seconds, this module will update its data.
      +Values: A positive integer, 0..n.

      + +
      + + +
      + + + + diff --git a/docs/posts/modules/clocks/index.html b/docs/posts/modules/clocks/index.html index 71a519c8..8440038e 100644 --- a/docs/posts/modules/clocks/index.html +++ b/docs/posts/modules/clocks/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/cmdrunner/index.html b/docs/posts/modules/cmdrunner/index.html index edca5f69..4ea15884 100644 --- a/docs/posts/modules/cmdrunner/index.html +++ b/docs/posts/modules/cmdrunner/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/cryptocurrencies/bittrex/index.html b/docs/posts/modules/cryptocurrencies/bittrex/index.html index 18730b2b..354041a2 100644 --- a/docs/posts/modules/cryptocurrencies/bittrex/index.html +++ b/docs/posts/modules/cryptocurrencies/bittrex/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/cryptocurrencies/cryptolive/index.html b/docs/posts/modules/cryptocurrencies/cryptolive/index.html index f84dea13..6a61168a 100644 --- a/docs/posts/modules/cryptocurrencies/cryptolive/index.html +++ b/docs/posts/modules/cryptocurrencies/cryptolive/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/gcal/index.html b/docs/posts/modules/gcal/index.html index 79d7ae93..6289bfaf 100644 --- a/docs/posts/modules/gcal/index.html +++ b/docs/posts/modules/gcal/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/git/index.html b/docs/posts/modules/git/index.html index 0ab526af..def87518 100644 --- a/docs/posts/modules/git/index.html +++ b/docs/posts/modules/git/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/github/index.html b/docs/posts/modules/github/index.html index 55afa1e3..b912baef 100644 --- a/docs/posts/modules/github/index.html +++ b/docs/posts/modules/github/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/gspreadsheet/index.html b/docs/posts/modules/gspreadsheet/index.html new file mode 100644 index 00000000..4baf7c3a --- /dev/null +++ b/docs/posts/modules/gspreadsheet/index.html @@ -0,0 +1,186 @@ + + + + + + + + + + + + +Google Spreadsheets | WTF - A Terminal Dashboard + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +

      Google Spreadsheets

      + +
      + +
      + + + +

      Added in v0.0.7.

      + +

      Display information

      +
      wtf/gspreadsheets/
      +

      Required ENV Variables

      + +

      None.

      + +

      Keyboard Commands

      + +

      None.

      + +

      Configuration

      +
      gspreadsheets:
      +  colors:
      +    values: "green"
      +  cells:
      +    names:
      +    - "Cell 1 name"
      +    - "Cell 2 name"
      +    addresses:
      +    - "A1"
      +    - "A2"
      +  enabled: true
      +  position:
      +    top: 0
      +    left: 0
      +    width: 1
      +    height: 1
      +  refreshInterval: "300"
      +  secretFile: "~/.wtf/gspreadsheets/client_secret.json"
      +  sheetId: "id_of_google_spreadsheet"
      +

      Attributes

      + +

      colors.values
      +The color to display the cell values in.
      +Values: Any X11 color name.

      + +

      cells.names

      + +

      cells.addresses

      + +

      enabled
      +Whether or not this module is executed and if its data displayed onscreen.
      +Values: true, false.

      + +

      position
      +Where in the grid this module’s widget will be displayed.

      + +

      refreshInterval
      +How often, in seconds, this module will update its data.
      +Values: A positive integer, 0..n.

      + +

      secretFile
      +Your Google client secret JSON file.
      +Values: A string representing a file path to the JSON secret file.

      + +
      + + +
      + + + + diff --git a/docs/posts/modules/index.html b/docs/posts/modules/index.html index 5ffb2199..af454f60 100644 --- a/docs/posts/modules/index.html +++ b/docs/posts/modules/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/ipinfo/index.html b/docs/posts/modules/ipinfo/index.html index 5f3994cb..b5ffd710 100644 --- a/docs/posts/modules/ipinfo/index.html +++ b/docs/posts/modules/ipinfo/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/jira/index.html b/docs/posts/modules/jira/index.html index 21d14850..13d8e003 100644 --- a/docs/posts/modules/jira/index.html +++ b/docs/posts/modules/jira/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/newrelic/index.html b/docs/posts/modules/newrelic/index.html index db3a032b..4ffc2f24 100644 --- a/docs/posts/modules/newrelic/index.html +++ b/docs/posts/modules/newrelic/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/opsgenie/index.html b/docs/posts/modules/opsgenie/index.html index ff57d7cb..4c55ed2a 100644 --- a/docs/posts/modules/opsgenie/index.html +++ b/docs/posts/modules/opsgenie/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/power/index.html b/docs/posts/modules/power/index.html index e42e346c..155b011c 100644 --- a/docs/posts/modules/power/index.html +++ b/docs/posts/modules/power/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/prettyweather/index.html b/docs/posts/modules/prettyweather/index.html index a0c4d36b..871f71ce 100644 --- a/docs/posts/modules/prettyweather/index.html +++ b/docs/posts/modules/prettyweather/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/security/index.html b/docs/posts/modules/security/index.html index 98c131b0..489decf5 100644 --- a/docs/posts/modules/security/index.html +++ b/docs/posts/modules/security/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/textfile/index.html b/docs/posts/modules/textfile/index.html index a8e53ab4..4aa7b9e4 100644 --- a/docs/posts/modules/textfile/index.html +++ b/docs/posts/modules/textfile/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/todo/index.html b/docs/posts/modules/todo/index.html index 6c105daa..640728af 100644 --- a/docs/posts/modules/todo/index.html +++ b/docs/posts/modules/todo/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/modules/weather/index.html b/docs/posts/modules/weather/index.html index 7021ceb2..db3e41c0 100644 --- a/docs/posts/modules/weather/index.html +++ b/docs/posts/modules/weather/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/posts/overview/index.html b/docs/posts/overview/index.html index a3d75261..67e5695a 100644 --- a/docs/posts/overview/index.html +++ b/docs/posts/overview/index.html @@ -65,12 +65,14 @@ + + diff --git a/docs/sitemap.xml b/docs/sitemap.xml index e7166e26..6a767e8e 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -3,7 +3,12 @@ xmlns:xhtml="http://www.w3.org/1999/xhtml"> - https://wtfutil.com/posts/modules/gspreadsheets/ + https://wtfutil.com/posts/modules/circleci/ + 2018-06-10T19:26:08-04:00 + + + + https://wtfutil.com/posts/modules/gspreadsheet/ 2018-06-10T18:26:26-04:00 @@ -139,7 +144,7 @@ https://wtfutil.com/posts/ - 2018-06-10T18:26:26-04:00 + 2018-06-10T19:26:08-04:00 0 @@ -150,7 +155,7 @@ https://wtfutil.com/ - 2018-06-10T18:26:26-04:00 + 2018-06-10T19:26:08-04:00 0 diff --git a/docs/tags/index.html b/docs/tags/index.html index 9681fff7..184370f4 100644 --- a/docs/tags/index.html +++ b/docs/tags/index.html @@ -67,12 +67,14 @@ + + From 1d1e280282a73d997be62f0efa61000b6b67e172 Mon Sep 17 00:00:00 2001 From: Chris Cummer Date: Sun, 10 Jun 2018 19:44:56 -0400 Subject: [PATCH 137/140] Add documentation for IP-API modules --- _site/content/posts/modules/ipapi.md | 60 +++++++++ docs/index.xml | 17 ++- docs/posts/index.html | 7 ++ docs/posts/index.xml | 17 ++- docs/posts/modules/ipapi/index.html | 177 +++++++++++++++++++++++++++ docs/sitemap.xml | 9 +- 6 files changed, 283 insertions(+), 4 deletions(-) create mode 100644 _site/content/posts/modules/ipapi.md create mode 100644 docs/posts/modules/ipapi/index.html diff --git a/_site/content/posts/modules/ipapi.md b/_site/content/posts/modules/ipapi.md new file mode 100644 index 00000000..e93c3410 --- /dev/null +++ b/_site/content/posts/modules/ipapi.md @@ -0,0 +1,60 @@ +--- +title: "IP API" +date: 2018-06-10T19:41:52-04:00 +draft: false +--- + +Displays your current IP address information, from [IP-APIcom](http://ip-api.com). + +**Note:** IP-API.com has a free-plan rate limit of 120 requests per +minute. + +## Source Code + +```bash +wtf/ipapi/ +``` + +## Required ENV Variables + +None. + +## Keyboard Commands + +None. + +## Configuration + +```yaml +ipinfo: + colors: + name: red + value: white + enabled: true + position: + top: 1 + left: 2 + height: 1 + width: 1 + refreshInterval: 150 +``` +### Attributes + +`colors.name`
      +The default colour for the row names.
      +Values: Any X11 color name. + +`colors.value`
      +The default colour for the row values.
      +Values: Any X11 color name. + +`enabled`
      +Determines whether or not this module is executed and if its data displayed onscreen.
      +Values: `true`, `false`. + +`position`
      +Defines where in the grid this module's widget will be displayed.
      + +`refreshInterval`
      +How often, in seconds, this module will update its data.
      +Values: A positive integer, `0..n`. diff --git a/docs/index.xml b/docs/index.xml index 0259bfcb..0da6f5b2 100644 --- a/docs/index.xml +++ b/docs/index.xml @@ -6,11 +6,26 @@ Recent content on WTF - A Terminal Dashboard Hugo -- gohugo.io en-us - Sun, 10 Jun 2018 19:26:08 -0400 + Sun, 10 Jun 2018 19:41:52 -0400 + + IP API + https://wtfutil.com/posts/modules/ipapi/ + Sun, 10 Jun 2018 19:41:52 -0400 + + https://wtfutil.com/posts/modules/ipapi/ + Displays your current IP address information, from IP-APIcom. +Note: IP-API.com has a free-plan rate limit of 120 requests per minute. +Source Code wtf/ipapi/ Required ENV Variables None. +Keyboard Commands None. +Configuration ipinfo:colors:name:redvalue:whiteenabled:trueposition:top:1left:2height:1width:1refreshInterval:150 Attributes colors.name The default colour for the row names. Values: Any X11 color name. +colors.value The default colour for the row values. Values: Any X11 color name. +enabled Determines whether or not this module is executed and if its data displayed onscreen. + + CircleCI https://wtfutil.com/posts/modules/circleci/ diff --git a/docs/posts/index.html b/docs/posts/index.html index ddb5c845..80f562b5 100644 --- a/docs/posts/index.html +++ b/docs/posts/index.html @@ -101,6 +101,13 @@

      Posts

      • + + IP API + + + + +
      • CircleCI diff --git a/docs/posts/index.xml b/docs/posts/index.xml index 9a86c641..f5d9073c 100644 --- a/docs/posts/index.xml +++ b/docs/posts/index.xml @@ -6,11 +6,26 @@ Recent content in Posts on WTF - A Terminal Dashboard Hugo -- gohugo.io en-us - Sun, 10 Jun 2018 19:26:08 -0400 + Sun, 10 Jun 2018 19:41:52 -0400 + + IP API + https://wtfutil.com/posts/modules/ipapi/ + Sun, 10 Jun 2018 19:41:52 -0400 + + https://wtfutil.com/posts/modules/ipapi/ + Displays your current IP address information, from IP-APIcom. +Note: IP-API.com has a free-plan rate limit of 120 requests per minute. +Source Code wtf/ipapi/ Required ENV Variables None. +Keyboard Commands None. +Configuration ipinfo:colors:name:redvalue:whiteenabled:trueposition:top:1left:2height:1width:1refreshInterval:150 Attributes colors.name The default colour for the row names. Values: Any X11 color name. +colors.value The default colour for the row values. Values: Any X11 color name. +enabled Determines whether or not this module is executed and if its data displayed onscreen. + + CircleCI https://wtfutil.com/posts/modules/circleci/ diff --git a/docs/posts/modules/ipapi/index.html b/docs/posts/modules/ipapi/index.html new file mode 100644 index 00000000..d8fca0a5 --- /dev/null +++ b/docs/posts/modules/ipapi/index.html @@ -0,0 +1,177 @@ + + + + + + + + + + + + +IP API | WTF - A Terminal Dashboard + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        +
        +

        IP API

        + +
        + +
        + + + +

        Displays your current IP address information, from IP-APIcom.

        + +

        Note: IP-API.com has a free-plan rate limit of 120 requests per +minute.

        + +

        Source Code

        +
        wtf/ipapi/
        +

        Required ENV Variables

        + +

        None.

        + +

        Keyboard Commands

        + +

        None.

        + +

        Configuration

        +
        ipinfo:
        +  colors:
        +    name: red
        +    value: white
        +  enabled: true
        +  position:
        +    top: 1
        +    left: 2
        +    height: 1
        +    width: 1
        +  refreshInterval: 150
        +

        Attributes

        + +

        colors.name
        +The default colour for the row names.
        +Values: Any X11 color name.

        + +

        colors.value
        +The default colour for the row values.
        +Values: Any X11 color name.

        + +

        enabled
        +Determines whether or not this module is executed and if its data displayed onscreen.
        +Values: true, false.

        + +

        position
        +Defines where in the grid this module’s widget will be displayed.

        + +

        refreshInterval
        +How often, in seconds, this module will update its data.
        +Values: A positive integer, 0..n.

        + +
        + + +
        + + + + diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 6a767e8e..c1512d5f 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -2,6 +2,11 @@ + + https://wtfutil.com/posts/modules/ipapi/ + 2018-06-10T19:41:52-04:00 + + https://wtfutil.com/posts/modules/circleci/ 2018-06-10T19:26:08-04:00 @@ -144,7 +149,7 @@ https://wtfutil.com/posts/ - 2018-06-10T19:26:08-04:00 + 2018-06-10T19:41:52-04:00 0 @@ -155,7 +160,7 @@ https://wtfutil.com/ - 2018-06-10T19:26:08-04:00 + 2018-06-10T19:41:52-04:00 0 From 00e5014d886b84d33d40c66aa7322e2e3dd43381 Mon Sep 17 00:00:00 2001 From: Chris Cummer Date: Sun, 10 Jun 2018 19:46:10 -0400 Subject: [PATCH 138/140] Add sidebar link for IP-API --- _site/content/posts/modules/ipapi.md | 2 +- _site/themes/hyde-hyde/layouts/partials/sidebar.html | 1 + docs/404.html | 1 + docs/categories/index.html | 1 + docs/index.html | 1 + docs/index.xml | 2 +- docs/posts/configuration/attributes/index.html | 1 + docs/posts/configuration/index.html | 1 + docs/posts/configuration/iterm2/index.html | 1 + docs/posts/glossary/index.html | 1 + docs/posts/index.html | 3 ++- docs/posts/index.xml | 2 +- docs/posts/installation/index.html | 1 + docs/posts/modules/bamboohr/index.html | 1 + docs/posts/modules/circleci/index.html | 1 + docs/posts/modules/clocks/index.html | 1 + docs/posts/modules/cmdrunner/index.html | 1 + docs/posts/modules/cryptocurrencies/bittrex/index.html | 1 + docs/posts/modules/cryptocurrencies/cryptolive/index.html | 1 + docs/posts/modules/gcal/index.html | 1 + docs/posts/modules/git/index.html | 1 + docs/posts/modules/github/index.html | 1 + docs/posts/modules/gspreadsheet/index.html | 1 + docs/posts/modules/index.html | 1 + docs/posts/modules/ipapi/index.html | 7 ++++--- docs/posts/modules/ipinfo/index.html | 1 + docs/posts/modules/jira/index.html | 1 + docs/posts/modules/newrelic/index.html | 1 + docs/posts/modules/opsgenie/index.html | 1 + docs/posts/modules/power/index.html | 1 + docs/posts/modules/prettyweather/index.html | 1 + docs/posts/modules/security/index.html | 1 + docs/posts/modules/textfile/index.html | 1 + docs/posts/modules/todo/index.html | 1 + docs/posts/modules/weather/index.html | 1 + docs/posts/overview/index.html | 1 + docs/tags/index.html | 1 + 37 files changed, 41 insertions(+), 7 deletions(-) diff --git a/_site/content/posts/modules/ipapi.md b/_site/content/posts/modules/ipapi.md index e93c3410..39182853 100644 --- a/_site/content/posts/modules/ipapi.md +++ b/_site/content/posts/modules/ipapi.md @@ -1,5 +1,5 @@ --- -title: "IP API" +title: "IP-API" date: 2018-06-10T19:41:52-04:00 draft: false --- diff --git a/_site/themes/hyde-hyde/layouts/partials/sidebar.html b/_site/themes/hyde-hyde/layouts/partials/sidebar.html index b8c698a8..9db8a4a9 100644 --- a/_site/themes/hyde-hyde/layouts/partials/sidebar.html +++ b/_site/themes/hyde-hyde/layouts/partials/sidebar.html @@ -32,6 +32,7 @@
      • + diff --git a/docs/404.html b/docs/404.html index a41fa335..e19cb9c0 100644 --- a/docs/404.html +++ b/docs/404.html @@ -73,6 +73,7 @@ + diff --git a/docs/categories/index.html b/docs/categories/index.html index 1e98fb7b..f4593c08 100644 --- a/docs/categories/index.html +++ b/docs/categories/index.html @@ -75,6 +75,7 @@ + diff --git a/docs/index.html b/docs/index.html index 8e536b3a..e046f569 100644 --- a/docs/index.html +++ b/docs/index.html @@ -74,6 +74,7 @@ + diff --git a/docs/index.xml b/docs/index.xml index 0da6f5b2..93293c31 100644 --- a/docs/index.xml +++ b/docs/index.xml @@ -12,7 +12,7 @@ - IP API + IP-API https://wtfutil.com/posts/modules/ipapi/ Sun, 10 Jun 2018 19:41:52 -0400 diff --git a/docs/posts/configuration/attributes/index.html b/docs/posts/configuration/attributes/index.html index 69f954ac..628e04e5 100644 --- a/docs/posts/configuration/attributes/index.html +++ b/docs/posts/configuration/attributes/index.html @@ -73,6 +73,7 @@ + diff --git a/docs/posts/configuration/index.html b/docs/posts/configuration/index.html index ded17263..ee1cb00f 100644 --- a/docs/posts/configuration/index.html +++ b/docs/posts/configuration/index.html @@ -73,6 +73,7 @@ + diff --git a/docs/posts/configuration/iterm2/index.html b/docs/posts/configuration/iterm2/index.html index 9f554d43..719ea690 100644 --- a/docs/posts/configuration/iterm2/index.html +++ b/docs/posts/configuration/iterm2/index.html @@ -73,6 +73,7 @@ + diff --git a/docs/posts/glossary/index.html b/docs/posts/glossary/index.html index 6ed76f0b..da0b1301 100644 --- a/docs/posts/glossary/index.html +++ b/docs/posts/glossary/index.html @@ -73,6 +73,7 @@ + diff --git a/docs/posts/index.html b/docs/posts/index.html index 80f562b5..4bd3b2d9 100644 --- a/docs/posts/index.html +++ b/docs/posts/index.html @@ -75,6 +75,7 @@ + @@ -102,7 +103,7 @@
        • - IP API + IP-API diff --git a/docs/posts/index.xml b/docs/posts/index.xml index f5d9073c..50b3850b 100644 --- a/docs/posts/index.xml +++ b/docs/posts/index.xml @@ -12,7 +12,7 @@ - IP API + IP-API https://wtfutil.com/posts/modules/ipapi/ Sun, 10 Jun 2018 19:41:52 -0400 diff --git a/docs/posts/installation/index.html b/docs/posts/installation/index.html index 74bc87db..5a04af98 100644 --- a/docs/posts/installation/index.html +++ b/docs/posts/installation/index.html @@ -73,6 +73,7 @@
        • + diff --git a/docs/posts/modules/bamboohr/index.html b/docs/posts/modules/bamboohr/index.html index a93f5425..8d0a4040 100644 --- a/docs/posts/modules/bamboohr/index.html +++ b/docs/posts/modules/bamboohr/index.html @@ -73,6 +73,7 @@ + diff --git a/docs/posts/modules/circleci/index.html b/docs/posts/modules/circleci/index.html index f2dd6ca0..0f7c29ec 100644 --- a/docs/posts/modules/circleci/index.html +++ b/docs/posts/modules/circleci/index.html @@ -73,6 +73,7 @@ + diff --git a/docs/posts/modules/clocks/index.html b/docs/posts/modules/clocks/index.html index 8440038e..ed003c8e 100644 --- a/docs/posts/modules/clocks/index.html +++ b/docs/posts/modules/clocks/index.html @@ -73,6 +73,7 @@ + diff --git a/docs/posts/modules/cmdrunner/index.html b/docs/posts/modules/cmdrunner/index.html index 4ea15884..fce2a66b 100644 --- a/docs/posts/modules/cmdrunner/index.html +++ b/docs/posts/modules/cmdrunner/index.html @@ -73,6 +73,7 @@ + diff --git a/docs/posts/modules/cryptocurrencies/bittrex/index.html b/docs/posts/modules/cryptocurrencies/bittrex/index.html index 354041a2..d500939c 100644 --- a/docs/posts/modules/cryptocurrencies/bittrex/index.html +++ b/docs/posts/modules/cryptocurrencies/bittrex/index.html @@ -73,6 +73,7 @@ + diff --git a/docs/posts/modules/cryptocurrencies/cryptolive/index.html b/docs/posts/modules/cryptocurrencies/cryptolive/index.html index 6a61168a..55033842 100644 --- a/docs/posts/modules/cryptocurrencies/cryptolive/index.html +++ b/docs/posts/modules/cryptocurrencies/cryptolive/index.html @@ -73,6 +73,7 @@ + diff --git a/docs/posts/modules/gcal/index.html b/docs/posts/modules/gcal/index.html index 6289bfaf..e50ddb96 100644 --- a/docs/posts/modules/gcal/index.html +++ b/docs/posts/modules/gcal/index.html @@ -73,6 +73,7 @@ + diff --git a/docs/posts/modules/git/index.html b/docs/posts/modules/git/index.html index def87518..b9c4c3b0 100644 --- a/docs/posts/modules/git/index.html +++ b/docs/posts/modules/git/index.html @@ -73,6 +73,7 @@ + diff --git a/docs/posts/modules/github/index.html b/docs/posts/modules/github/index.html index b912baef..65374300 100644 --- a/docs/posts/modules/github/index.html +++ b/docs/posts/modules/github/index.html @@ -73,6 +73,7 @@ + diff --git a/docs/posts/modules/gspreadsheet/index.html b/docs/posts/modules/gspreadsheet/index.html index 4baf7c3a..e1f4f6c3 100644 --- a/docs/posts/modules/gspreadsheet/index.html +++ b/docs/posts/modules/gspreadsheet/index.html @@ -73,6 +73,7 @@ + diff --git a/docs/posts/modules/index.html b/docs/posts/modules/index.html index af454f60..80d1d57b 100644 --- a/docs/posts/modules/index.html +++ b/docs/posts/modules/index.html @@ -73,6 +73,7 @@ + diff --git a/docs/posts/modules/ipapi/index.html b/docs/posts/modules/ipapi/index.html index d8fca0a5..1f75dfce 100644 --- a/docs/posts/modules/ipapi/index.html +++ b/docs/posts/modules/ipapi/index.html @@ -10,8 +10,8 @@ -IP API | WTF - A Terminal Dashboard - +IP-API | WTF - A Terminal Dashboard + @@ -73,6 +73,7 @@ + @@ -97,7 +98,7 @@
          -

          IP API

          +

          IP-API