Compare commits

...

2 Commits

Author SHA1 Message Date
Nico 1c2309e9bf complete error box function 2021-01-29 19:03:19 +00:00
Nico b9e7aa782b a day's hacking. it doesn't work. 2021-01-27 20:34:09 +00:00
2 changed files with 67 additions and 24 deletions

4
go.mod
View File

@ -5,9 +5,9 @@ go 1.15
require (
git.sr.ht/~adnano/go-gemini v0.1.13
github.com/fogleman/gg v1.3.0
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
github.com/shermp/go-fbink-v2 v1.20.2
github.com/shermp/go-fbink-v2/v2 v2.21.0
github.com/shermp/go-kobo-input v0.0.0-20180928074949-be0734a2dcc6
golang.org/x/image v0.0.0-20201208152932-35266b937fa6 // indirect
golang.org/x/image v0.0.0-20201208152932-35266b937fa6
)

87
main.go
View File

@ -1,24 +1,25 @@
package main
import (
// "github.com/fogleman/gg"
"github.com/fogleman/gg"
"github.com/shermp/go-fbink-v2/gofbink"
"github.com/shermp/go-kobo-input/koboin"
"image"
"git.sr.ht/~adnano/go-gemini"
"git.sr.ht/~adnano/go-gemini/tofu"
"crypto/x509"
// "time"
// "bytes"
"errors"
"net/url"
"golang.org/x/image/font"
"bufio"
"io/ioutil"
"fmt"
"fmt"
"time"
"os"
"log"
"bytes"
"github.com/golang/freetype/truetype"
)
var (
@ -27,15 +28,37 @@ var (
scanner *bufio.Scanner
)
var height int = 1080
var width int = 1440 // TODO get from device instead of hardcoding
// Visual options
const (
width int = 1080
height int = 1440 // TODO get from device instead of hardcoding
linewidth float64 = 10
)
// drawOSK renders the onscreen keyboard to an image.
func drawOSK(keymap []string) *image.RGBA {
var im image.RGBA
return &im
var f *truetype.Font
var face font.Face
// drawErrorBox prints the given error on screen, and only proceeds after touch input.
func drawErrorBox(e error, fb *gofbink.FBInk, t *koboin.TouchDevice, opts *gofbink.FBInkConfig) {
boxheight := height/4
boxwidth := width/2
i := image.NewRGBA(image.Rect(0,0, boxwidth, boxheight))
dc := gg.NewContextForRGBA(i)
if face != nil {
dc.SetFontFace(face)
}
dc.SetLineWidth(linewidth)
dc.DrawRectangle(0,0, float64(boxwidth),float64(boxheight))
dc.SetRGB(1,1,1)
dc.FillPreserve()
dc.SetRGB(0,0,0)
dc.Stroke()
dc.SetRGB(0,0,0)
dc.DrawStringWrapped("Error:\n" + e.Error(), float64(boxwidth/2), float64(boxheight/2), 0.5, 0.5, float64(boxwidth), 1.0, gg.AlignCenter)
dc.Fill()
fb.PrintRBGA(int16(width/2-(boxwidth/2)), int16(height/2-(boxheight/2)), i, opts)
t.GetInput()
}
func trustCertificate(hostname string, cert *x509.Certificate) error {
@ -112,20 +135,25 @@ func main() {
return
}
defer t.Close()
// Logging setup
var logFile, err= os.Create("/mnt/onboard/gemini.log")
var logFile, err = os.Create("/mnt/onboard/gemini.log")
if err != nil {
drawErrorBox(err, fb, t, &fbinkOpts)
}
var logger *log.Logger = log.New(logFile, "gemini", log.LstdFlags )
defer logFile.Close()
path := "/mnt/onboard/.adds/gemini/known-hosts" // TODO don't hardcode
// Reload or create known hosts file
if _, err := os.Stat(path); os.IsNotExist(err) {
os.Create(path)
fb.Println("Created hosts file")
}
// Load known hosts file
err = hosts.Load(path)
if err != nil {
fb.Println(err)
drawErrorBox(err, fb, t, &fbinkOpts)
logger.Fatal(err)
}
@ -135,15 +163,29 @@ func main() {
logger.Fatal(err)
}
// Load Fonts, Create font face
b, err := ioutil.ReadFile("/mnt/onboard/.adds/gemini/NotoSerif.ttf")
if err != nil {
logger.Println(err)
return
}
f, err := truetype.Parse(b)
if err != nil {
logger.Println(err)
return
}
face = truetype.NewFace(f, &truetype.Options{Size:32})
url := "gemini://gemini.circumlunar.space"
req, err := gemini.NewRequest(url)
if err != nil {
fb.Println(err)
drawErrorBox(err, fb, t, &fbinkOpts)
logger.Fatal(err)
}
resp, err := do(req, nil)
if err != nil {
fb.Println(err)
drawErrorBox(err, fb, t, &fbinkOpts)
logger.Fatal(err)
}
defer resp.Body.Close()
@ -152,23 +194,24 @@ func main() {
if resp.Status.Class() == gemini.StatusClassSuccess {
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fb.Println(err)
drawErrorBox(err, fb, t, &fbinkOpts)
logger.Fatal(err)
}
fb.Println(string(body))
} else {
fb.Println(fmt.Sprintf("%d %s\n", resp.Status, resp.Meta))
}
for {
x, y, err := t.GetInput()
if err != nil {
continue
}
if x < 100 && y < 100 {
fb.Println("Exiting...")
fb.Println("Exiting...")
break
}
}
hostsfile.Close()
}
}