Compare commits

..

No commits in common. "main" and "v2.0.0" have entirely different histories.
main ... v2.0.0

8 changed files with 103 additions and 296 deletions

View file

@ -1,4 +1,4 @@
steps:
pipeline:
vendor:
image: golang:1.18
commands:
@ -8,9 +8,6 @@ steps:
image: golang:1.18
commands:
- make
- mkdir release
- tar -c -z -f release/build-amd64.tar.gz build/linux-amd64/
- tar -c -z -f release/build-arm64.tar.gz build/linux-arm64/
release:
image: plugins/gitea-release
@ -19,6 +16,6 @@ steps:
from_secret: gitnet_api_key
base_url: https://gitnet.fr
note:
files: release/*
files: build/*
when:
event: [tag]

View file

@ -1,16 +1,13 @@
all: linux-amd64 linux-arm64
.ONESHELL:
linux-amd64:
all:
for i in blocks/*; do
GOARCH=amd64 GOOS=linux go build -ldflags '-s -w' -v -o "build/linux-amd64/$$(basename "$$i")" "$$i/main.go"
done
.ONESHELL:
linux-arm64:
for i in blocks/*; do
GOARCH=arm64 GOOS=linux go build -ldflags '-s -w' -v -o "build/linux-arm64/$$(basename "$$i")" "$$i/main.go"
go build -ldflags '-s -w' -v -o "build/$$(basename "$$i")" "$$i/main.go"
done
clean:
rm -fr build/* 2>/dev/null || true
rm build/* 2>/dev/null || true
.ONESHELL:
run-code-quality-analysis:
export SONAR_TOKEN="$$SONAR_TOKEN_DEBLAN_I3_BLOCKS_GO"
sonar-scanner -Dsonar.projectKey=deblan-i3-blocks-go -Dsonar.sources=. -Dsonar.host.url="$$SONAR_SERVER"

167
README.md
View file

@ -5,7 +5,7 @@ Blocks compatible with [i3blocks](https://github.com/vivien/i3blocks).
## Requirements
* `go` for compilation
* `sudo` and `wg-quick` for `wireguard` block
* `sudo` for `wireguard` block
* `tmux` for `app` and `date` blocks
* `df` for `du` block
* `xdg-open` for `du` block
@ -27,204 +27,81 @@ make
## Usage
Each binary has a help, eg `./app -h`.
### App
Add the shortcut `<name>` and run `<command>` when clicked.
```
[app_otp]
command=/path/to/app -block=app_otp -name=🔐 -bg-color='#363636' -fg-color='#ffc337' -cmd=otpclient
format=json
markup=pango
interval=1000
[app_flameshot]
command=/path/to/app -block=app_flameshot -name=F -bg-color='#bf007e' -fg-color='#fff' -cmd="flameshot gui --delay 500"
format=json
markup=pango
interval=1000
[app_ksnip]
command=/path/to/app -block=app_youtube -name=Y -bg-color='#c74a42' -fg-color='#fff' -cmd="xdg-open https://www.youtube.com/"
format=json
markup=pango
interval=1000
app <block_name> <name> <command> <background_color> <foreground_color>
```
### Date
Show the time using the given format.
Show the time using given format and run `gnome-calendar` when clicked.
```
[time]
command=/home/simon/www/repo/i3-blocks-go/build/date -format="%H:%M:%S %d/%m/%Y"
format=json
markup=pango
interval=persist
date -format="%H:%M:%S %d/%m/%Y"
```
### Disk usage
Show mount point usage and warns with limits and colors.
```
[du_root]
command=/path/to/du -block=du_root -mount-point=/ -name=root -limit-warning=70 -limit-danger=90
format=json
markup=pango
interval=30
[du_home]
command=/path/to/du -block=du_home -mount-point=/home -name=home -limit-warning=90 -limit-danger=95
format=json
markup=pango
interval=30
du -block=<block_name> -name=<name> -mount-point=<mount_point> -limit-warning=<limit_warning> -limit-danger=<limit_danger>
```
### IP
Show the IP of the given iface.
```
[ip_wg0_ip4]
command=/path/to/ip -iface=wg0 -version=ip4 -name=VPN
format=json
markup=pango
interval=3
[ip_eth0_ip4]
command=/path/to/ip -iface=eth0 -version=ip4 -name=Foo
format=json
markup=pango
interval=3
[ip_eth0_ip6]
command=/path/to/ip -iface=eth0 -version=ip4 -name=Bar
format=json
markup=pango
interval=3
ip -iface=<iface> -version=<ip4|ip6> -name=<name>
```
### IP (wan)
Show the public IP.
```
[ip_wan]
command=/path/to/ip_wan
format=json
markup=pango
interval=100
ip_wan
```
### Prusa telemetry
Show the telemetry using Prusa Printer API.
```
[prusa]
command=/path/to/prusa_telemetry -api=http://1.2.3.4/api/telemetry
format=json
markup=pango
interval=60
prusa_telemetry -api=http://1.2.3.4/api/telemetry
```
### Process
Show a message when the given process is running (use `preg -f`).
```
[ps]
command=/path/to/ps -process=foo -message="Foo is running"
format=json
markup=pango
interval=3
ps -process=<process> -message=<message>
```
### Feed indicator
Show indicator of RSS.
```
[rss_foo]
command=/path/to/rss -block=rss_foo -feed="https://foo.example.com/feed.xml" -website="https://foo.example.com/" -empty-color="#CCCCCC" -non-empty-color="#B3FF6C"
align=left
interval=30
format=json
markup=pango
[rss_bar]
command=/path/to/rss -block=rss_bar -feed="https://bar.example.com/atom.xml" -website="https://bar.example.com/" -empty-color="#aabfc1" -non-empty-color="#00d8f0"
align=left
interval=30
format=json
markup=pango
rss -block=<block_name> -feed=<feed_url> -website=<feed_reader_url> -empty-color=<color> -non-empty-color=<color>
```
### Spotify status
Show current song played (spotify).
```
[spotify]
command=/path/to/spotify
format=json
markup=pango
interval=3
spotify
```
### Volume
Show volume.
```
[volume]
command=/path/to/volume -channel=Master
format=json
markup=pango
interval=1
volume -channel=<channel>
```
### Weather
Show the weather of the given location ([https://fr.wttr.in/](https://fr.wttr.in/)).
```
[weather]
command=/path/to/weather -loc=Paris -lang=fr
format=json
markup=pango
interval=1800
```
### Wireguard toggler
Toggler for wireguard.
```
[wireguard_wg0]
command=/path/to/wireguard -iface=wg0 -name=Foo
format=json
markup=pango
interval=2
[wireguard_wg1]
command=/path/to/wireguard -iface=wg1 -name=Bar
format=json
markup=pango
interval=2
wireguard -iface=<iface> -name=<name>
```
### Workspace Apps (task bar)
Add blocks that represent opened apps and create a task bar.
Add a blocks that represent opened apps to create a task bar.
```
[workspace_apps]
command=/path/to/workspace_apps -x=$relative_x
format=json
markup=pango
interval=1
workspace_apps 0 $BLOCK_BUTTON
workspace_apps 1 $BLOCK_BUTTON
workspace_apps 2 $BLOCK_BUTTON
workspace_apps 3 $BLOCK_BUTTON
workspace_apps 4 $BLOCK_BUTTON
workspace_apps 5 $BLOCK_BUTTON
workspace_apps 6 $BLOCK_BUTTON
workspace_apps 7 $BLOCK_BUTTON
```

View file

@ -6,26 +6,41 @@ import (
"github.com/enescakir/emoji"
"github.com/itchyny/timefmt-go"
r "gitnet.fr/deblan/i3-blocks-go/rendering"
"os"
"os/exec"
"sync"
"time"
)
func runCalendar(wg *sync.WaitGroup) {
defer wg.Done()
command := exec.Command("tmux", "new", "-d", "gnome-calendar")
command.Run()
}
func main() {
argFormat := flag.String("format", "%H:%M:%S %m-%d-%Y", "time format")
flag.Parse()
symbol := string(emoji.Calendar)
for {
now := time.Now()
date := timefmt.Format(now, *argFormat)
now := time.Now()
options := r.NewBlockOptions()
options.FullText = r.TextWithRightPadding(fmt.Sprintf("%s %s", symbol, date), r.FB{
Foreground: r.Color("white"),
Background: r.Color("black4"),
})
var wg sync.WaitGroup
block := r.Block("date", options)
fmt.Println(block)
time.Sleep(time.Millisecond * 500)
if os.Getenv("BLOCK_BUTTON") == "1" {
wg.Add(1)
go runCalendar(&wg)
}
symbol := string(emoji.Calendar)
date := timefmt.Format(now, *argFormat)
options := r.NewBlockOptions()
options.FullText = r.TextWithRightPadding(fmt.Sprintf("%s %s", symbol, date), r.FB{
Foreground: r.Color("white"),
Background: r.Color("black4"),
})
block := r.Block("date", options)
fmt.Println(block)
wg.Wait()
}

View file

@ -2,16 +2,10 @@ package main
import (
"fmt"
sos"
"os/"
"strings"
r "gitnet.fr/deblan/i3-blocks-gsrrindg
r "gitnet.fr/deblan/i3-blocks-gsrrindg
r "gitnet.fr/deblan/i3-blocks-gsrrindg
r "gitnet.fr/deblan/i3-blocks-gsrrindg
r "gitnet.fr/deblan/i3-blocks-gsrrindg
r "gitnet.fr/deblan/i3-blocks-go/rendering"
"os"
"os/exec"
"strings"
)
func GetMetadata(metadata string) string {
@ -26,15 +20,11 @@ func GetMetadata(metadata string) string {
}
func GetTitle() string {
data := GetMetadata("xesam:title")
return strings.Trim(string(data), "\n")
return GetMetadata("xesam:title")
}
func GetArtist() string {
data := GetMetadata("xesam:artist")
return strings.Trim(string(data), "\n")
return GetMetadata("xesam:artist")
}
func GetStatus() string {
@ -51,8 +41,6 @@ func main() {
if status == "Not available" {
return
} else if status == "Stopped" {
return
} else if status == "Paused" {
stmt = r.TextWithPadding(r.FontAwesome("\uf04c"), r.FB{
Background: r.Color("black3"),

View file

@ -1,58 +0,0 @@
package main
import (
"flag"
"fmt"
r "gitnet.fr/deblan/i3-blocks-go/rendering"
"io"
"net/http"
"os"
"os/exec"
"strings"
"sync"
)
func openBrowser(wg *sync.WaitGroup, url string) {
defer wg.Done()
command := exec.Command("tmux", "new", "-d", "xdg-open", url)
command.Run()
}
func main() {
var wg sync.WaitGroup
argLocation := flag.String("loc", "", "location")
argLang := flag.String("lang", "fr", "lang")
flag.Parse()
url := fmt.Sprintf("https://%s.wttr.in/%s?format=%%l+%%c+%%t+%%m", *argLang, *argLocation)
if os.Getenv("BLOCK_BUTTON") == "1" {
url2 := fmt.Sprintf("https://%s.wttr.in/%s", *argLang, *argLocation)
wg.Add(1)
go openBrowser(&wg, url2)
}
resp, err := http.Get(url)
if err != nil {
return
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
content := string(body)
fb := r.FB{
Foreground: r.Color("white1"),
Background: r.Color("black2"),
}
content = strings.ReplaceAll(content, " ", " ")
options := r.NewBlockOptions()
options.FullText = r.TextWithPadding(content, fb)
block := r.Block("meteo", options)
fmt.Println(block)
wg.Wait()
}

View file

@ -4,8 +4,7 @@ import (
"encoding/json"
"fmt"
r "gitnet.fr/deblan/i3-blocks-go/rendering"
// "os"
"flag"
"os"
"os/exec"
"strconv"
"strings"
@ -118,55 +117,50 @@ func main() {
tree := GetTree()
nodes := GetVisibleNodes(tree, workspaces)
argX := flag.String("x", "", "")
flag.Parse()
appNumber, _ := strconv.Atoi(os.Args[1])
blockButton := ""
x := 0
minX := 0
if *argX != "" {
x, _ = strconv.Atoi(*argX)
for k, v := range os.Args {
if k == 2 {
blockButton = v
}
}
options := r.NewBlockOptions()
for key, app := range nodes {
if key == appNumber {
foreground := "#9cb7d1"
background := "#222222"
for _, app := range nodes {
foreground := "#9cb7d1"
background := "#222222"
if app.Urgent {
foreground = "#ffffff"
background = "#07c0d4"
} else if app.Focused {
foreground = "#07c0d4"
background = "#333333"
} else if app.Output == "__i3" {
foreground = "#bababa"
}
title := strings.ToUpper(app.WindowProperties.Title)
fb := r.FB{
Foreground: foreground,
Background: background,
}
if len(title) > 30 {
title = fmt.Sprintf("%s…", title[0:29])
title := strings.ToUpper(app.WindowProperties.Title)
if len(title) > 25 {
title = fmt.Sprintf("%s…", title[0:22])
}
options := r.NewBlockOptions()
options.FullText = r.TextWithPadding(title, fb)
block := r.Block(fmt.Sprintf("workspace_apps_%d", appNumber), options)
fmt.Println(block)
if blockButton == "1" {
Focus(app.Window)
}
}
size := (len(title) + 4) * 6
maxX := minX + size
isClicked := (x > minX && x < maxX)
minX = maxX
if app.Urgent {
foreground = "#ffffff"
background = "#07c0d4"
} else if (app.Focused && x == 0) || isClicked {
foreground = "#07c0d4"
background = "#333333"
} else if app.Output == "__i3" {
foreground = "#bababa"
}
if isClicked {
Focus(app.Window)
}
fb := r.FB{
Foreground: foreground,
Background: background,
}
options.FullText = fmt.Sprintf("%s%s", options.FullText, r.TextWithPadding(title, fb))
}
block := r.Block("workspace_apps", options)
fmt.Println(block)
}

View file

@ -1,9 +1,7 @@
package rendering
import (
// "bytes"
"encoding/json"
// "strconv"
"strings"
)
@ -33,7 +31,6 @@ func Block(name string, options BlockOptions) string {
block = strings.ReplaceAll(block, `\u003c`, "<")
block = strings.ReplaceAll(block, `\u003e`, ">")
block = strings.ReplaceAll(block, `\u0026`, "et")
return block
}