97 lines
1.8 KiB
Go
97 lines
1.8 KiB
Go
package server
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
"strconv"
|
|
"sync"
|
|
|
|
"github.com/khlieng/dispatch/Godeps/_workspace/src/github.com/gorilla/websocket"
|
|
|
|
"github.com/khlieng/dispatch/irc"
|
|
"github.com/khlieng/dispatch/storage"
|
|
)
|
|
|
|
var (
|
|
channelStore *storage.ChannelStore
|
|
sessions map[string]*Session
|
|
sessionLock sync.Mutex
|
|
|
|
upgrader = websocket.Upgrader{
|
|
ReadBufferSize: 1024,
|
|
WriteBufferSize: 1024,
|
|
CheckOrigin: func(r *http.Request) bool {
|
|
return true
|
|
},
|
|
}
|
|
)
|
|
|
|
func Run(port int) {
|
|
defer storage.Close()
|
|
|
|
channelStore = storage.NewChannelStore()
|
|
sessions = make(map[string]*Session)
|
|
|
|
reconnect()
|
|
|
|
log.Println("Listening on port", port)
|
|
log.Fatal(http.ListenAndServe(":"+strconv.Itoa(port), handler{}))
|
|
}
|
|
|
|
type handler struct{}
|
|
|
|
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != "GET" {
|
|
return
|
|
}
|
|
|
|
if r.URL.Path == "/ws" {
|
|
upgradeWS(w, r)
|
|
} else {
|
|
serveFiles(w, r)
|
|
}
|
|
}
|
|
|
|
func upgradeWS(w http.ResponseWriter, r *http.Request) {
|
|
conn, err := upgrader.Upgrade(w, r, nil)
|
|
if err != nil {
|
|
log.Println(err)
|
|
return
|
|
}
|
|
|
|
uuid := r.URL.Query().Get("uuid")
|
|
if uuid != "" {
|
|
newWSHandler(conn, uuid).run()
|
|
}
|
|
}
|
|
|
|
func reconnect() {
|
|
for _, user := range storage.LoadUsers() {
|
|
session := NewSession()
|
|
session.user = user
|
|
sessions[user.UUID] = session
|
|
go session.write()
|
|
|
|
channels := user.GetChannels()
|
|
|
|
for _, server := range user.GetServers() {
|
|
i := irc.NewClient(server.Nick, server.Username)
|
|
i.TLS = server.TLS
|
|
i.Password = server.Password
|
|
i.Realname = server.Realname
|
|
|
|
i.Connect(server.Address)
|
|
session.setIRC(i.Host, i)
|
|
go newIRCHandler(i, session).run()
|
|
|
|
var joining []string
|
|
for _, channel := range channels {
|
|
if channel.Server == server.Address {
|
|
joining = append(joining, channel.Name)
|
|
}
|
|
}
|
|
i.Join(joining...)
|
|
}
|
|
}
|
|
}
|