forked from Cliffbreak/tsviewer
I tried so hard
This commit is contained in:
parent
872dd200e1
commit
9e2d7e9acc
21 changed files with 144 additions and 26 deletions
|
@ -9,7 +9,7 @@ import (
|
||||||
func InfoAPIHandler(s Service) http.HandlerFunc {
|
func InfoAPIHandler(s Service) http.HandlerFunc {
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
response.Handler(w, r, response.HandlerFunc(func() (int, error) {
|
response.Handler(w, r, response.HandlerFunc(func() (int, error) {
|
||||||
s, err := s.Info()
|
s, err := s.ServerInfo()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return http.StatusNotFound, err
|
return http.StatusNotFound, err
|
||||||
}
|
}
|
|
@ -3,7 +3,7 @@ package server
|
||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
type Service interface {
|
type Service interface {
|
||||||
Info() (*Server, error)
|
ServerInfo() (*Server, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Server struct {
|
type Server struct {
|
|
@ -1,12 +0,0 @@
|
||||||
package index
|
|
||||||
|
|
||||||
import (
|
|
||||||
"html/template"
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
func IndexGUIHandler(t template.Template) http.HandlerFunc {
|
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
t.Lookup("index.html").Execute(w, nil)
|
|
||||||
})
|
|
||||||
}
|
|
32
features/web/index/handler.go
Normal file
32
features/web/index/handler.go
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
package index
|
||||||
|
|
||||||
|
import (
|
||||||
|
"html/template"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"git.cliffbreak.de/Cliffbreak/tsviewer/features/web/weberror"
|
||||||
|
)
|
||||||
|
|
||||||
|
func IndexGUIHandler(s Service, t template.Template) http.HandlerFunc {
|
||||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
server, err := s.ServerInfo()
|
||||||
|
if err != nil {
|
||||||
|
weberror.NewPage(err, http.StatusNotFound).Send(w, t)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
channels, err := s.Channels()
|
||||||
|
if err != nil {
|
||||||
|
weberror.NewPage(err, http.StatusNotFound).Send(w, t)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
clients, err := s.Clients()
|
||||||
|
if err != nil {
|
||||||
|
weberror.NewPage(err, http.StatusNotFound).Send(w, t)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
NewPage(*server, channels, clients).Send(w, t)
|
||||||
|
})
|
||||||
|
}
|
34
features/web/index/page.go
Normal file
34
features/web/index/page.go
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
package index
|
||||||
|
|
||||||
|
import (
|
||||||
|
"html/template"
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"git.cliffbreak.de/Cliffbreak/tsviewer/features/api/channel"
|
||||||
|
"git.cliffbreak.de/Cliffbreak/tsviewer/features/api/client"
|
||||||
|
"git.cliffbreak.de/Cliffbreak/tsviewer/features/api/server"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Service interface {
|
||||||
|
ServerInfo() (*server.Server, error)
|
||||||
|
Clients() ([]*client.Client, error)
|
||||||
|
Channels() ([]*channel.Channel, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type IndexPage struct {
|
||||||
|
Server server.Server
|
||||||
|
Channels []*channel.Channel
|
||||||
|
Clients []*client.Client
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPage(server server.Server, channels []*channel.Channel, clients []*client.Client) *IndexPage {
|
||||||
|
return &IndexPage{
|
||||||
|
Server: server,
|
||||||
|
Channels: channels,
|
||||||
|
Clients: clients,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (page IndexPage) Send(w io.Writer, t template.Template) {
|
||||||
|
t.Lookup("index.html").Execute(w, page)
|
||||||
|
}
|
|
@ -6,10 +6,10 @@ import (
|
||||||
"github.com/go-chi/chi"
|
"github.com/go-chi/chi"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GUIRoutes(t template.Template) *chi.Mux {
|
func GUIRoutes(s Service, t template.Template) *chi.Mux {
|
||||||
router := chi.NewRouter()
|
router := chi.NewRouter()
|
||||||
|
|
||||||
router.Get("/", IndexGUIHandler(t))
|
router.Get("/", IndexGUIHandler(s, t))
|
||||||
|
|
||||||
return router
|
return router
|
||||||
}
|
}
|
22
features/web/weberror/page.go
Normal file
22
features/web/weberror/page.go
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
package weberror
|
||||||
|
|
||||||
|
import (
|
||||||
|
"html/template"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ErrorPage struct {
|
||||||
|
Error error
|
||||||
|
StatusCode int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPage(err error, statusCode int) *ErrorPage {
|
||||||
|
return &ErrorPage{
|
||||||
|
Error: err,
|
||||||
|
StatusCode: statusCode,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (page ErrorPage) Send(w io.Writer, t template.Template) {
|
||||||
|
t.Lookup("error.html").Execute(w, page)
|
||||||
|
}
|
13
main.go
13
main.go
|
@ -7,10 +7,10 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.cliffbreak.de/Cliffbreak/tsviewer/config"
|
"git.cliffbreak.de/Cliffbreak/tsviewer/config"
|
||||||
"git.cliffbreak.de/Cliffbreak/tsviewer/features/channel"
|
"git.cliffbreak.de/Cliffbreak/tsviewer/features/api/channel"
|
||||||
"git.cliffbreak.de/Cliffbreak/tsviewer/features/client"
|
"git.cliffbreak.de/Cliffbreak/tsviewer/features/api/client"
|
||||||
"git.cliffbreak.de/Cliffbreak/tsviewer/features/index"
|
"git.cliffbreak.de/Cliffbreak/tsviewer/features/api/server"
|
||||||
"git.cliffbreak.de/Cliffbreak/tsviewer/features/server"
|
"git.cliffbreak.de/Cliffbreak/tsviewer/features/web/index"
|
||||||
"git.cliffbreak.de/Cliffbreak/tsviewer/gui"
|
"git.cliffbreak.de/Cliffbreak/tsviewer/gui"
|
||||||
"git.cliffbreak.de/Cliffbreak/tsviewer/service"
|
"git.cliffbreak.de/Cliffbreak/tsviewer/service"
|
||||||
"github.com/go-chi/chi"
|
"github.com/go-chi/chi"
|
||||||
|
@ -34,7 +34,7 @@ func Routes(s service.Service, t template.Template) *chi.Mux {
|
||||||
})
|
})
|
||||||
|
|
||||||
router.Route("/", func(r chi.Router) {
|
router.Route("/", func(r chi.Router) {
|
||||||
r.Mount("/", index.GUIRoutes(t))
|
r.Mount("/", index.GUIRoutes(s, t))
|
||||||
})
|
})
|
||||||
|
|
||||||
return router
|
return router
|
||||||
|
@ -58,6 +58,9 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
router := Routes(*service, *templates)
|
router := Routes(*service, *templates)
|
||||||
|
router.Get("/static/*", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
http.StripPrefix("/static", http.FileServer(http.Dir("./static"))).ServeHTTP(w, r)
|
||||||
|
})
|
||||||
|
|
||||||
log.Fatal("Handler: ", http.ListenAndServe(":8080", router))
|
log.Fatal("Handler: ", http.ListenAndServe(":8080", router))
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ package service
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"git.cliffbreak.de/Cliffbreak/tsviewer/features/channel"
|
"git.cliffbreak.de/Cliffbreak/tsviewer/features/api/channel"
|
||||||
"github.com/multiplay/go-ts3"
|
"github.com/multiplay/go-ts3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ package service
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"git.cliffbreak.de/Cliffbreak/tsviewer/features/client"
|
"git.cliffbreak.de/Cliffbreak/tsviewer/features/api/client"
|
||||||
"github.com/multiplay/go-ts3"
|
"github.com/multiplay/go-ts3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,10 +3,10 @@ package service
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.cliffbreak.de/Cliffbreak/tsviewer/features/server"
|
"git.cliffbreak.de/Cliffbreak/tsviewer/features/api/server"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s Service) Info() (*server.Server, error) {
|
func (s Service) ServerInfo() (*server.Server, error) {
|
||||||
serverInfo, err := s.TSClient.Server.Info()
|
serverInfo, err := s.TSClient.Server.Info()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
15
static/styles.css
Normal file
15
static/styles.css
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
*{
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2{
|
||||||
|
}
|
||||||
|
|
||||||
|
small{
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.client{
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
11
templates/error.html
Normal file
11
templates/error.html
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Error</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Oops, an error occurred!</h1>
|
||||||
|
<p1>Error {{.StatusCode}}</p1>
|
||||||
|
<p1>{{.Error}}</p1>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -3,10 +3,23 @@
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<title>TS3 Viewer</title>
|
<title>TS3 Viewer</title>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="static/styles.css">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<h1>Index page!</h1>
|
<h2>{{.Server.Name}}</h2>
|
||||||
|
<!-- <small>{{.Server.Version}}</small> -->
|
||||||
|
{{$clients := .Clients}}
|
||||||
|
{{range .Channels}}
|
||||||
|
<p class="channel">{{.Name}}</p>
|
||||||
|
{{$channelId := .ID}}
|
||||||
|
{{range $clients}}
|
||||||
|
{{if eq $channelId .ChannelID}}
|
||||||
|
<p class="client">{{.Nickname}}</p>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
Loading…
Reference in a new issue