dispatch/server/server.go

94 lines
1.7 KiB
Go
Raw Normal View History

package server
import (
"log"
"net/http"
"strconv"
"sync"
2015-12-11 03:35:48 +00:00
"github.com/khlieng/dispatch/Godeps/_workspace/src/github.com/gorilla/websocket"
2015-12-11 03:35:48 +00:00
"github.com/khlieng/dispatch/irc"
"github.com/khlieng/dispatch/storage"
)
var (
channelStore *storage.ChannelStore
sessions map[string]*Session
sessionLock sync.Mutex
2015-05-01 22:20:22 +00:00
upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
return true
},
2015-05-01 22:20:22 +00:00
}
)
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)
}
}
2015-05-01 22:20:22 +00:00
func upgradeWS(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
2015-06-16 22:46:58 +00:00
newWSHandler(conn).run()
2015-05-01 22:20:22 +00:00
}
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() {
2015-06-05 22:34:13 +00:00
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)
2015-06-16 21:20:53 +00:00
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...)
}
}
}