add chart

This commit is contained in:
idk
2022-12-06 23:18:16 +00:00
parent b655c6096f
commit 55d66c1d17
5 changed files with 61 additions and 16 deletions

3
go.mod
View File

@ -4,6 +4,7 @@ go 1.19
require (
github.com/eyedeekay/onramp v0.0.0-20220829050101-64cb1842d0f0
github.com/wcharczuk/go-chart/v2 v2.1.0
gitlab.com/golang-commonmark/markdown v0.0.0-20211110145824-bf3e522c626a
)
@ -11,11 +12,13 @@ require (
github.com/cretz/bine v0.2.0 // indirect
github.com/eyedeekay/i2pkeys v0.0.0-20220804220722-1048b5ce6ba7 // indirect
github.com/eyedeekay/sam3 v0.33.3 // indirect
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
gitlab.com/golang-commonmark/html v0.0.0-20191124015941-a22733972181 // indirect
gitlab.com/golang-commonmark/linkify v0.0.0-20191026162114-a0c2df6c8f82 // indirect
gitlab.com/golang-commonmark/mdurl v0.0.0-20191124015652-932350d1cb84 // indirect
gitlab.com/golang-commonmark/puny v0.0.0-20191124015043-9f83538fa04f // indirect
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect
golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 // indirect
golang.org/x/net v0.0.0-20220805013720-a33c5aa5df48 // indirect
golang.org/x/sys v0.0.0-20220804214406-8e32c043e418 // indirect
golang.org/x/text v0.3.7 // indirect

6
go.sum
View File

@ -22,6 +22,8 @@ github.com/getlantern/netx v0.0.0-20190110220209-9912de6f94fd/go.mod h1:wKdY0ikO
github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA=
github.com/getlantern/ops v0.0.0-20200403153110-8476b16edcd6/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/renameio v1.0.0/go.mod h1:t/HQoYBZSsWSNK35C6CO/TpPLDVWvxOHboWUAweKUpk=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
@ -40,6 +42,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I=
github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
gitlab.com/golang-commonmark/html v0.0.0-20191124015941-a22733972181 h1:K+bMSIx9A7mLES1rtG+qKduLIXq40DAzYHtb0XuCukA=
@ -60,6 +64,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c=
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM=
golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=

17
main.go
View File

@ -83,18 +83,15 @@ func Help() {
fmt.Println("Not implemented yet")
}
func Serve(host, port string) error {
func Serve(host, port string, s *server.NewsServer) error {
ln, err := net.Listen("tcp", net.JoinHostPort(host, port))
if err != nil {
return err
}
defer ln.Close()
s := server.Serve(*dir, *statsfile)
defer s.Stats.Save()
return http.Serve(ln, s)
}
func ServeI2P() error {
func ServeI2P(s *server.NewsServer) error {
garlic := &onramp.Garlic{}
defer garlic.Close()
ln, err := garlic.Listen()
@ -102,8 +99,6 @@ func ServeI2P() error {
return err
}
defer ln.Close()
s := server.Serve(*dir, *statsfile)
defer s.Stats.Save()
return http.Serve(ln, s)
}
@ -113,14 +108,15 @@ func main() {
validatePort(port)
switch command {
case "serve":
s := server.Serve(*dir, *statsfile)
go func() {
if err := Serve(*host, *port); err != nil {
if err := Serve(*host, *port, s); err != nil {
panic(err)
}
}()
if *i2p {
go func() {
if err := ServeI2P(); err != nil {
if err := ServeI2P(s); err != nil {
panic(err)
}
}()
@ -130,13 +126,14 @@ func main() {
go func() {
for sig := range c {
log.Println("captured: ", sig)
s.Stats.Save()
os.Exit(0)
}
}()
i := 0
for {
time.Sleep(time.Minute)
log.Printf("Running for %s minutes.", i)
log.Printf("Running for %d minutes.", i)
i++
}
case "build":

View File

@ -29,13 +29,16 @@ func (n *NewsServer) ServeHTTP(rw http.ResponseWriter, rq *http.Request) {
rw.WriteHeader(404)
return
}
if err := ServeFile(file, rw); err != nil {
if err := n.ServeFile(file, rq, rw); err != nil {
log.Println("ServeHTTP:", err.Error())
rw.WriteHeader(404)
}
}
func fileCheck(file string) error {
if filepath.Ext(file) == ".svg" {
return nil
}
if _, err := os.Stat(file); err != nil {
return fmt.Errorf("fileCheck: %s", err)
}
@ -76,6 +79,8 @@ func openDirectory(wd string) string {
readme += fmt.Sprintf("%s\n", filepath.Base(wd))
readme += fmt.Sprintf("%s\n", head(len(filepath.Base(wd))))
readme += fmt.Sprintf("%s\n", "")
readme += fmt.Sprintf("%s\n", "![language stats](langstats.svg)")
readme += fmt.Sprintf("%s\n", "")
readme += fmt.Sprintf("%s\n", "**Directory Listing:**")
readme += fmt.Sprintf("%s\n", "")
for _, file := range files {
@ -109,18 +114,20 @@ func head(num int) string {
return r
}
func ServeFile(file string, rw http.ResponseWriter) error {
//if err := fileCheck(file); err != nil {
// return fmt.Errorf("ServeFile: %s", err)
//}
func (n *NewsServer) ServeFile(file string, rq *http.Request, rw http.ResponseWriter) error {
ftype, err := fileType(file)
if err != nil {
return fmt.Errorf("ServeFile: %s", err)
}
if ftype == "application/x-i2p-su3-news" {
// Log stats here
n.Stats.Increment(rq)
}
rw.Header().Add("Content-Type", ftype)
if ftype == "image/svg+xml" {
n.Stats.Graph(rw)
return nil
}
f, _ := os.Stat(file)
if f.IsDir() {
bytes := hTML(openDirectory(file))

View File

@ -3,7 +3,10 @@ package newsstats
import (
"encoding/json"
"io/ioutil"
"log"
"net/http"
"github.com/wcharczuk/go-chart/v2"
)
type NewsStats struct {
@ -11,7 +14,36 @@ type NewsStats struct {
StateFile string
}
func (n *NewsStats) Increment(rq http.Request) {
func (n *NewsStats) Graph(rw http.ResponseWriter) {
bars := []chart.Value{
{Value: float64(0), Label: "baseline"},
}
log.Println("Graphing")
for k, v := range n.DownloadLangs {
log.Printf("Label: %s Value: %d", k, v)
bars = append(bars, chart.Value{Value: float64(v), Label: k})
}
graph := chart.BarChart{
Title: "Downloads by language",
Background: chart.Style{
Padding: chart.Box{
Top: 40,
Left: 10,
Right: 10,
},
},
Height: 256,
BarWidth: 20,
Bars: bars,
}
err := graph.Render(chart.SVG, rw)
if err != nil {
log.Println("Graph: error", err)
}
}
func (n *NewsStats) Increment(rq *http.Request) {
q := rq.URL.Query()
lang := q.Get("lang")
if lang != "" {