tts-room/src/server/server.go

93 lines
1.8 KiB
Go

package server
import (
"fmt"
"log"
"net/http"
)
type Server struct {
sessions []*session
}
func NewServer() *Server {
return &Server{}
}
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
switch r.URL.Path {
case "/ws":
if err := s.WS(w, r); err != nil {
log.Println("[ws]", err)
}
default:
http.FileServer(http.Dir("./src/public")).ServeHTTP(w, r)
}
}
func (s *Server) WS(w http.ResponseWriter, r *http.Request) error {
sess, err := newSession(w, r, nil)
if err != nil {
return err
}
defer sess.Close()
sess.cb = func(m message) error {
for i := range s.sessions {
if s.sessions[i].id != sess.id && s.sessions[i].room == sess.room {
select {
case s.sessions[i].scatterc <- m:
case <-s.sessions[i].ctx.Done():
}
}
}
return nil
}
func() {
s.sessions = append(s.sessions, sess)
n := 0
for i := range s.sessions {
if s.sessions[i].room == sess.room {
n += 1
}
}
for i := range s.sessions {
if s.sessions[i].room == sess.room {
if s.sessions[i].id == sess.id {
s.sessions[i].scatterc <- message{QuietText: fmt.Sprintf("you have joined %v people", n-1)}
} else {
s.sessions[i].scatterc <- message{QuietText: fmt.Sprintf("there is now %v people", n)}
}
}
}
}()
defer func() {
n := 0
for i := range s.sessions {
if s.sessions[i].room == sess.room {
n += 1
}
}
n -= 1
for i := range s.sessions {
if s.sessions[i].room == sess.room {
if s.sessions[i].id == sess.id {
} else {
s.sessions[i].scatterc <- message{QuietText: fmt.Sprintf("there is now %v people", n)}
}
}
}
for i := range s.sessions {
if s.sessions[i].id == sess.id {
s.sessions = append(s.sessions[:i], s.sessions[i+1:]...)
return
}
}
}()
return sess.Run()
}