mirror of
https://github.com/go-i2p/newsgo.git
synced 2025-06-08 10:31:53 -04:00
add chart
This commit is contained in:
3
go.mod
3
go.mod
@ -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
6
go.sum
@ -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
17
main.go
@ -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":
|
||||
|
@ -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", "")
|
||||
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))
|
||||
|
@ -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 != "" {
|
||||
|
Reference in New Issue
Block a user