This commit is contained in:
Simon Vieille 2022-08-28 14:59:15 +02:00
commit 8fc099e249
Signed by: deblan
GPG Key ID: 579388D585F70417
15 changed files with 474 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/build/*
!/build/.gitkeep

8
Makefile Normal file
View File

@ -0,0 +1,8 @@
.ONESHELL:
all:
for i in blocks/*; do
go build -ldflags '-s -w' -v -o "build/$$(basename "$$i")" "$$i/main.go"
done
clean:
rm build/* 2>/dev/null || true

93
blocks/acpi/main.go Normal file
View File

@ -0,0 +1,93 @@
package main
import (
"fmt"
"github.com/enescakir/emoji"
"github.com/xellio/tools/acpi"
r "gitnet.fr/deblan/i3-blocks-go/rendering"
// "net"
// "os"
// "regexp"
// "strings"
)
func main() {
datas, err := acpi.Battery()
if err != nil {
return
}
// value := r.TextWithPadding(ip, r.FB{})
//
// block := r.Block(fmt.Sprintf("ip_%s_%s", argIface, argVersion), r.BlockOptions{
// FullText: fmt.Sprintf("%s%s", label, value),
// })
//fmt.Println(block)
for _, data := range datas {
status := data.Status
level := data.Level
if status == "Unknown" {
return
}
if status == "Full" {
return
}
if status == "Discharging" {
fmt.Println(CreateDischargingBlock(level))
return
}
if status == "Charging" {
fmt.Println(CreateChargingBlock(level))
return
}
}
}
func CreateChargingBlock(level int) string {
value := fmt.Sprintf("%d%%", level)
symbol := r.Emoji(emoji.UpArrow)
options := r.NewBlockOptions()
options.FullText = r.TextWithPadding(fmt.Sprintf("%s %s", value, symbol), CreateFB(level))
block := r.Block("battery", options)
return block
}
func CreateDischargingBlock(level int) string {
value := fmt.Sprintf("%d%%", level)
symbol := r.Emoji(emoji.DownArrow)
block := r.Block("battery", r.BlockOptions{
FullText: r.TextWithPadding(fmt.Sprintf("%s %s", value, symbol), CreateFB(level)),
})
return block
}
func CreateFB(level int) r.FB {
if level < 20 {
return r.FB{
Foreground: r.Color("black1"),
Background: r.Color("red"),
}
}
if level < 50 {
return r.FB{
Foreground: r.Color("white"),
Background: r.Color("orange"),
}
}
return r.FB{
Foreground: r.Color("white"),
Background: r.Color("green"),
}
}

31
blocks/date/main.go Normal file
View File

@ -0,0 +1,31 @@
package main
import (
"fmt"
"github.com/enescakir/emoji"
"github.com/itchyny/timefmt-go"
r "gitnet.fr/deblan/i3-blocks-go/rendering"
"os"
"time"
)
func main() {
argFormat := os.Args[1]
now := time.Now()
if os.Getenv("BLOCK_BUTTON") == "1" {
}
symbol := r.Emoji(emoji.Calendar)
date := timefmt.Format(now, argFormat)
options := r.NewBlockOptions()
options.FullText = r.TextWithPadding(fmt.Sprintf("%s %s", symbol, date), r.FB{
Foreground: r.Color("white"),
Background: r.Color("black4"),
})
block := r.Block("date", options)
fmt.Println(block)
}

84
blocks/ip/main.go Normal file
View File

@ -0,0 +1,84 @@
package main
import (
"fmt"
"github.com/atotto/clipboard"
r "gitnet.fr/deblan/i3-blocks-go/rendering"
"net"
"os"
"regexp"
"strings"
)
func main() {
argIface := os.Args[1]
argVersion := os.Args[2]
argName := os.Args[3]
if argIface == "" {
argIface = "eth0"
}
if argVersion == "" {
argVersion = "ip4"
}
if argName == "" {
argName = argIface
}
var (
iface *net.Interface
addrs []net.Addr
// ip net.IP
)
iface, err := net.InterfaceByName(argIface)
if err != nil {
return
}
addrs, err = iface.Addrs()
var ip string
for _, addr := range addrs {
if ip == "" {
a := addr.String()
if argVersion == "ip4" && !strings.Contains(a, ":") {
ip = a
} else if argVersion == "ip6" && strings.Contains(a, ":") && !strings.Contains(a, "fe80") {
ip = a
}
}
}
if ip == "" {
return
}
reg := regexp.MustCompile(`/\d+$`)
ip = reg.ReplaceAllString(ip, "")
if os.Getenv("BLOCK_BUTTON") == "1" {
clipboard.WriteAll(ip)
}
label := r.TextWithPadding(
argName,
r.FB{
Foreground: r.Color("grey"),
Background: r.Color("black2"),
},
)
value := r.TextWithPadding(ip, r.FB{})
options := r.NewBlockOptions()
options.FullText = fmt.Sprintf("%s%s", label, value)
block := r.Block(fmt.Sprintf("ip_%s_%s", argIface, argVersion), options)
fmt.Println(block)
}

42
blocks/ip_wan/main.go Normal file
View File

@ -0,0 +1,42 @@
package main
import (
"fmt"
"github.com/atotto/clipboard"
r "gitnet.fr/deblan/i3-blocks-go/rendering"
"io"
"net/http"
"os"
)
func main() {
resp, err := http.Get("https://api.ipify.org/")
if err != nil {
return
}
defer resp.Body.Close()
ip, _ := io.ReadAll(resp.Body)
label := r.TextWithPadding(
"wan",
r.FB{
Foreground: r.Color("grey"),
Background: r.Color("black2"),
},
)
if os.Getenv("BLOCK_BUTTON") == "1" {
clipboard.WriteAll(string(ip))
}
value := r.TextWithPadding(string(ip), r.FB{})
options := r.NewBlockOptions()
options.FullText = fmt.Sprintf("%s%s", label, value)
block := r.Block("ip_wan", options)
fmt.Println(block)
}

61
blocks/wireguard/main.go Normal file
View File

@ -0,0 +1,61 @@
package main
import (
"fmt"
r "gitnet.fr/deblan/i3-blocks-go/rendering"
"net"
"os"
"os/exec"
"strings"
)
func main() {
argIface := os.Args[1]
argName := os.Args[2]
var (
iface *net.Interface
addrs []net.Addr
)
var ip string
iface, err := net.InterfaceByName(argIface)
if err == nil {
addrs, _ = iface.Addrs()
for _, addr := range addrs {
if ip == "" {
a := addr.String()
if !strings.Contains(a, ":") {
ip = a
}
}
}
}
var fb r.FB
var command *exec.Cmd
if ip == "" {
fb.Foreground = r.Color("grey1")
fb.Background = r.Color("black3")
command = exec.Command("sudo", "wg-quick", "up", argIface)
} else {
fb.Foreground = r.Color("black2")
fb.Background = r.Color("green")
command = exec.Command("sudo", "wg-quick", "down", argIface)
}
if os.Getenv("BLOCK_BUTTON") == "1" {
command.Run()
}
options := r.NewBlockOptions()
options.FullText = r.TextWithPadding(argName, fb)
block := r.Block(fmt.Sprintf("wireguard_%s", argIface), options)
fmt.Println(block)
}

0
build/.gitkeep Normal file
View File

14
go.mod Normal file
View File

@ -0,0 +1,14 @@
module gitnet.fr/deblan/i3-blocks-go
go 1.18
require (
github.com/enescakir/emoji v1.0.0
github.com/xellio/tools v0.0.0-20180807142225-794d9ef78e7d
)
require (
github.com/atotto/clipboard v0.1.4 // indirect
github.com/itchyny/timefmt-go v0.1.3 // indirect
github.com/stretchr/testify v1.8.0 // indirect
)

22
go.sum Normal file
View File

@ -0,0 +1,22 @@
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/enescakir/emoji v1.0.0 h1:W+HsNql8swfCQFtioDGDHCHri8nudlK1n5p2rHCJoog=
github.com/enescakir/emoji v1.0.0/go.mod h1:Bt1EKuLnKDTYpLALApstIkAjdDrS/8IAgTkKp+WKFD0=
github.com/itchyny/timefmt-go v0.1.3 h1:7M3LGVDsqcd0VZH2U+x393obrzZisp7C0uEe921iRkU=
github.com/itchyny/timefmt-go v0.1.3/go.mod h1:0osSSCQSASBJMsIZnhAaF1C2fCBTJZXrnj37mG8/c+A=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/xellio/tools v0.0.0-20180807142225-794d9ef78e7d h1:x1Cs1sxEVV51gmJnpMBQIs9Bh7BXnYQK3mf0soZSX/I=
github.com/xellio/tools v0.0.0-20180807142225-794d9ef78e7d/go.mod h1:AQ/vBUioO/A/ghK3n+MCBSdTaJ1yge9zvG2uvmLGn10=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

12
main.go Normal file
View File

@ -0,0 +1,12 @@
package main
import (
"fmt"
r "gitnet.fr/deblan/i3-blocks-go/rendering"
)
func main() {
render := r.Block("Hello", r.BlockOptions{})
fmt.Println(render)
}

36
rendering/block.go Normal file
View File

@ -0,0 +1,36 @@
package rendering
import (
"encoding/json"
"strings"
)
type BlockOptions struct {
FullText string `json:"full_text"`
Align string `json:"align"`
Name string `json:"name"`
Urgent bool `json:"urgent"`
Separator bool `json:"separator"`
SeparatorBlockWidth int `json:"separator_block_width"`
}
func NewBlockOptions() BlockOptions {
return BlockOptions{
Align: "left",
Urgent: false,
Separator: false,
SeparatorBlockWidth: 0,
}
}
func Block(name string, options BlockOptions) string {
options.Name = name
json, _ := json.Marshal(options)
block := string(json)
block = strings.ReplaceAll(block, `\u003c`, "<")
block = strings.ReplaceAll(block, `\u003e`, ">")
return block
}

25
rendering/color.go Normal file
View File

@ -0,0 +1,25 @@
package rendering
func Color(name string) string {
colors := make(map[string]string)
colors["grey1"] = "#CCCCCC"
colors["grey2"] = "#DDDDDD"
colors["white"] = "#E9F1FF"
colors["red"] = "#FF474A"
colors["orange"] = "#FF6836"
colors["green"] = "#B3FF6C"
colors["black1"] = "#000000"
colors["black2"] = "#333333"
colors["black3"] = "#222222"
colors["black4"] = "#444444"
colors["default_background"] = colors["black1"]
colors["default_foreground"] = colors["grey2"]
if color, exists := colors[name]; exists {
return color
}
return colors["white"]
}

10
rendering/emoji.go Normal file
View File

@ -0,0 +1,10 @@
package rendering
import (
"fmt"
"github.com/enescakir/emoji"
)
func Emoji(e emoji.Emoji) string {
return fmt.Sprintf("<span font='FontAwesome'>%s</span>", e)
}

34
rendering/text.go Normal file
View File

@ -0,0 +1,34 @@
package rendering
import (
"fmt"
)
type FB struct {
Foreground string
Background string
}
func Text(text string, fb FB) string {
if fb.Foreground == "" {
fb.Foreground = Color("default_foreground")
}
if fb.Background == "" {
fb.Background = Color("default_background")
}
return fmt.Sprintf("<span background='%s' foreground='%s'>%s</span>", fb.Background, fb.Foreground, text)
}
func TextWithPadding(text string, fb FB) string {
return Text(fmt.Sprintf(" %s ", text), fb)
}
func TextWithLeftPadding(text string, fb FB) string {
return Text(fmt.Sprintf(" %s", text), fb)
}
func TextWithRightPadding(text string, fb FB) string {
return Text(fmt.Sprintf("%s ", text), fb)
}