Add Zukitchi widget with animated terminal pet and update README for new features
This commit is contained in:
parent
dfbc6066c9
commit
7a846ee660
@ -11,6 +11,9 @@ ArinDash is a customizable terminal dashboard (TUI) written in Go, powered by [`
|
||||
- **HTTP Prober**: Check the availability and status codes of your favorite websites.
|
||||
- **Network Device Monitoring**: Track which devices are online in your local network.
|
||||
- **WiFi QR Code**: Display a QR code for easy WiFi connection sharing.
|
||||
- **NINA Warnings**: Stay informed about emergency warnings in Germany via the NINA-Service.
|
||||
- **News**: Get the latest news headlines from various sources via News API.
|
||||
- **Zukitchi**: A cute animated terminal pet/sprite to keep you company.
|
||||
- **Interactive TUI**: Built with `termdash` for a responsive and visually appealing terminal interface.
|
||||
|
||||
## Prerequisites
|
||||
@ -45,6 +48,8 @@ ArinDash uses a `config.toml` file for its settings. A template is provided as `
|
||||
- **Pi-hole**: Set your host and API password.
|
||||
- **WiFi**: Configure your SSID and password for the QR code widget.
|
||||
- **Weather**: Provide your OpenWeatherMap API key and Location ID. You can find your Location ID in the `city.list.json.gz` from [OpenWeatherMap bulk data](http://bulk.openweathermap.org/sample/).
|
||||
- **NINA Warnings**: Set your `gebietsCode` for the area you want to monitor.
|
||||
- **News**: Provide your News API key and preferred sources.
|
||||
|
||||
3. Customize widgets:
|
||||
- **Websites**: Copy `websites_template.json` to `websites.json` and update it with the URLs and icons you want to monitor.
|
||||
@ -60,6 +65,7 @@ go run main.go
|
||||
|
||||
### Controls
|
||||
- **Esc / Ctrl+C**: Exit the application.
|
||||
- **Left / Right Arrow Keys**: Navigate through news articles (in the News widget).
|
||||
|
||||
## Project Structure
|
||||
|
||||
|
||||
5
main.go
5
main.go
@ -46,6 +46,7 @@ func initWidgets(ctx context.Context, term *tcell.Terminal) {
|
||||
widgets.New("PiHoleBlocked", widgets.PiholeBlocked()),
|
||||
widgets.New("NinaWarnings", widgets.NinaWarnings()),
|
||||
widgets.New("News", widgets.News()),
|
||||
widgets.New("Zukitchi", widgets.Zukitchi()),
|
||||
)
|
||||
}
|
||||
|
||||
@ -168,9 +169,11 @@ func layout() []container.Option {
|
||||
|
||||
grid.ColWidthPerc(35,
|
||||
grid.RowHeightFixed(20,
|
||||
grid.Widget(widgets.Get["empty"],
|
||||
grid.Widget(widgets.Get["Zukitchi"],
|
||||
container.Border(linestyle.Light),
|
||||
container.BorderColor(cell.ColorWhite),
|
||||
container.PaddingTop(1),
|
||||
container.PaddingLeft(1),
|
||||
),
|
||||
),
|
||||
grid.RowHeightFixed(24,
|
||||
|
||||
60
widgets/zukitchi.go
Normal file
60
widgets/zukitchi.go
Normal file
@ -0,0 +1,60 @@
|
||||
package widgets
|
||||
|
||||
import (
|
||||
"ArinDash/util"
|
||||
"ArinDash/widgets/zukitchi"
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/mum4k/termdash/cell"
|
||||
"github.com/mum4k/termdash/terminal/terminalapi"
|
||||
"github.com/mum4k/termdash/widgetapi"
|
||||
"github.com/mum4k/termdash/widgets/text"
|
||||
)
|
||||
|
||||
type ZukitchiOptions struct {
|
||||
}
|
||||
|
||||
func Zukitchi() ZukitchiOptions {
|
||||
widgetOptions["ZukitchiOptions"] = createZukitchi
|
||||
return ZukitchiOptions{}
|
||||
|
||||
}
|
||||
|
||||
var mood = make([]string, 0)
|
||||
var frames = 1
|
||||
var frame = 0
|
||||
var lastFrame = time.Now()
|
||||
|
||||
func createZukitchi(ctx context.Context, _ terminalapi.Terminal, _ interface{}) widgetapi.Widget {
|
||||
widget := util.PanicOnErrorWithResult(text.New())
|
||||
changeMood("sleep")
|
||||
go util.Periodic(ctx, util.RedrawInterval, func() error {
|
||||
return draw(widget)
|
||||
})
|
||||
|
||||
return widget
|
||||
}
|
||||
|
||||
func changeMood(moodToChangeTo string) {
|
||||
switch moodToChangeTo {
|
||||
case "sleep":
|
||||
mood = zukitchi.Sleep(0)
|
||||
break
|
||||
}
|
||||
frames = len(mood)
|
||||
frame = 0
|
||||
}
|
||||
|
||||
func draw(widget *text.Text) error {
|
||||
if time.Since(lastFrame) < 1*time.Second {
|
||||
return nil
|
||||
}
|
||||
widget.Reset()
|
||||
if err := widget.Write(mood[frame], text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
||||
return err
|
||||
}
|
||||
frame = (frame + 1) % frames
|
||||
lastFrame = time.Now()
|
||||
return nil
|
||||
}
|
||||
79
widgets/zukitchi/assets.go
Normal file
79
widgets/zukitchi/assets.go
Normal file
@ -0,0 +1,79 @@
|
||||
package zukitchi
|
||||
|
||||
import "strings"
|
||||
|
||||
func Sleep(position int) []string {
|
||||
return compileFrames(position, sleep0, sleep1)
|
||||
}
|
||||
|
||||
func compileFrames(position int, idle ...string) []string {
|
||||
var result = make([]string, len(idle))
|
||||
for i, frame := range idle {
|
||||
result[i] = cutFirstAndListLineAndMove(frame, position)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func cutFirstAndListLineAndMove(frame string, position int) string {
|
||||
position = position + 17
|
||||
if position < 0 {
|
||||
position = 0
|
||||
}
|
||||
if position > 35 {
|
||||
position = 35
|
||||
}
|
||||
lines := strings.Split(frame, "\n")
|
||||
result := make([]string, 0, len(lines))
|
||||
for _, line := range lines {
|
||||
result = append(result, strings.Repeat(" ", position)+line)
|
||||
}
|
||||
return strings.Join(result[1:len(result)-1], "\n")
|
||||
}
|
||||
|
||||
//<editor-fold desc="Sprites">
|
||||
|
||||
// j
|
||||
// k ▄
|
||||
// i ▀
|
||||
// l █
|
||||
|
||||
const sleep0 = `
|
||||
▄▄▄ ▄▄▄
|
||||
█ █ █ █
|
||||
▀▄▄▄████▄▄ ▄▄███▄▄▄▀
|
||||
██▀ ▀▀▄▄▄▄▄▄▄▄███ ▀█▀
|
||||
██ ▄ ███▄ ▄████▄ ▄▀
|
||||
██▀▀█▀▀████▀▀█▀▀██▄
|
||||
█▀▀█████▄███████▄▄█▄▄
|
||||
▄▄▀▀▀▀█▀▀ █ ▀▀▀▄
|
||||
█ █ █ █
|
||||
█ ▄▀▀▀▄▄▄▄█████▀▀▀▀▀█████▄ █
|
||||
█ █▄▄▄▄█▀▀▀▀▀▀██████ ▀▀▀█ █
|
||||
█ ██████ ██████ █ █
|
||||
█ █▀▀▀▀███████ ███▄▄█ █
|
||||
█ ▀▄▄▄▄███▀▀▀▀▀▀▀▀▀▀██████ █
|
||||
█ ▀▀▀▀▀ █
|
||||
█ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ █
|
||||
▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀
|
||||
`
|
||||
const sleep1 = `
|
||||
▄▄▄ ▄▄▄
|
||||
█ █ █ █
|
||||
▀▄▄▄█████▀▄▄ ▄▄▄▀████▄▄▄▀
|
||||
██▄ ███▀▀▀████▀ █▀
|
||||
██▄█▄████▄██████▄█
|
||||
███████████████████
|
||||
▄█▄▀ ▀▀█▄▄
|
||||
▄▄▀▀ █ █ ▀▀▀▀▄
|
||||
█ ▄█▄▄▄▄█████▀▀▀▀▀███▄ █
|
||||
█ ▄▀ ▄█▀▀▀▀▀▀██████ ▀██▄ █
|
||||
█ █▄████ ██████ ██ █ █
|
||||
█ ███▀▀███████ ██▄▀▀█ █
|
||||
█ █▀ ▄██▀▀▀▀▀▀▀▀▀▀▄███ █ █
|
||||
█ ▀▄▄▀ ▀███ █
|
||||
█ ▄▄▄▄▄▄▄▄▄▄▄▄▄ ▀ █
|
||||
█ ▄▄▀▀▀ ▀ █ █ ▀ ▀▀▄▄ █
|
||||
▀▀▀ ▀▀▀▀
|
||||
`
|
||||
|
||||
//</editor-fold>
|
||||
1
widgets/zukitchi/main.go
Normal file
1
widgets/zukitchi/main.go
Normal file
@ -0,0 +1 @@
|
||||
package zukitchi
|
||||
Loading…
x
Reference in New Issue
Block a user