dispatch/server/websocket_handler.go

272 lines
5.4 KiB
Go
Raw Normal View History

package server
2015-01-17 01:37:21 +00:00
import (
2016-01-11 20:04:57 +00:00
"crypto/tls"
2015-01-17 01:37:21 +00:00
"encoding/json"
"log"
2016-01-14 04:56:53 +00:00
"net"
2015-01-17 01:37:21 +00:00
2016-03-01 00:51:26 +00:00
"github.com/gorilla/websocket"
"github.com/spf13/viper"
2015-05-01 22:20:22 +00:00
2015-12-11 03:35:48 +00:00
"github.com/khlieng/dispatch/irc"
"github.com/khlieng/dispatch/storage"
2015-01-17 01:37:21 +00:00
)
2015-06-16 22:46:58 +00:00
type wsHandler struct {
ws *wsConn
session *Session
addr string
2015-06-16 22:46:58 +00:00
handlers map[string]func([]byte)
}
2015-06-05 22:34:13 +00:00
func newWSHandler(conn *websocket.Conn, session *Session) *wsHandler {
2015-06-16 22:46:58 +00:00
h := &wsHandler{
ws: newWSConn(conn),
session: session,
addr: conn.RemoteAddr().String(),
2015-06-16 22:46:58 +00:00
}
h.init()
h.initHandlers()
2015-06-16 22:46:58 +00:00
return h
}
2015-01-17 01:37:21 +00:00
2015-06-16 22:46:58 +00:00
func (h *wsHandler) run() {
defer h.ws.close()
go h.ws.send()
go h.ws.recv()
2015-01-17 01:37:21 +00:00
for {
2015-06-16 22:46:58 +00:00
req, ok := <-h.ws.in
2015-06-05 22:34:13 +00:00
if !ok {
2015-06-16 22:46:58 +00:00
if h.session != nil {
h.session.deleteWS(h.addr)
2015-01-17 01:37:21 +00:00
}
return
}
2015-06-16 22:46:58 +00:00
h.dispatchRequest(req)
}
}
2015-01-17 01:37:21 +00:00
2015-06-16 22:46:58 +00:00
func (h *wsHandler) dispatchRequest(req WSRequest) {
if handler, ok := h.handlers[req.Type]; ok {
handler(req.Data)
}
}
2015-01-17 01:37:21 +00:00
func (h *wsHandler) init() {
h.session.setWS(h.addr, h.ws)
2015-01-17 01:37:21 +00:00
log.Println(h.addr, "[Session] User ID:", h.session.user.ID, "|",
h.session.numIRC(), "IRC connections |",
h.session.numWS(), "WebSocket connections")
2015-01-17 01:37:21 +00:00
channels := h.session.user.GetChannels()
2015-01-17 01:37:21 +00:00
for _, channel := range channels {
h.session.sendJSON("users", Userlist{
Server: channel.Server,
Channel: channel.Name,
Users: channelStore.GetUsers(channel.Server, channel.Name),
})
2015-06-16 22:46:58 +00:00
}
}
2015-01-17 01:37:21 +00:00
2015-06-16 22:46:58 +00:00
func (h *wsHandler) connect(b []byte) {
var data Connect
json.Unmarshal(b, &data)
2015-01-17 01:37:21 +00:00
2016-01-14 04:56:53 +00:00
host, port, err := net.SplitHostPort(data.Server)
if err != nil {
host = data.Server
}
if _, ok := h.session.getIRC(host); !ok {
log.Println(h.addr, "[IRC] Add server", data.Server)
2015-01-17 01:37:21 +00:00
2015-06-16 22:46:58 +00:00
i := irc.NewClient(data.Nick, data.Username)
i.TLS = data.TLS
i.Realname = data.Realname
i.HandleNickInUse = createNickInUseHandler(i, h.session)
if data.Password == "" &&
viper.GetString("defaults.password") != "" &&
data.Server == viper.GetString("defaults.address") {
i.Password = viper.GetString("defaults.password")
} else {
i.Password = data.Password
}
2016-01-11 23:32:40 +00:00
if cert := h.session.user.GetCertificate(); cert != nil {
2016-01-11 20:04:57 +00:00
i.TLSConfig = &tls.Config{
Certificates: []tls.Certificate{*cert},
InsecureSkipVerify: !viper.GetBool("verify_client_certificates"),
2016-01-11 20:04:57 +00:00
}
}
2016-01-14 04:56:53 +00:00
h.session.setIRC(host, i)
2015-06-16 22:46:58 +00:00
i.Connect(data.Server)
go newIRCHandler(i, h.session).run()
2016-01-17 22:33:52 +00:00
go h.session.user.AddServer(storage.Server{
2015-06-16 22:46:58 +00:00
Name: data.Name,
2016-01-14 04:56:53 +00:00
Host: host,
Port: port,
2015-06-16 22:46:58 +00:00
TLS: data.TLS,
Password: data.Password,
Nick: data.Nick,
Username: data.Username,
Realname: data.Realname,
})
} else {
log.Println(h.addr, "[IRC]", data.Server, "already added")
2015-06-16 22:46:58 +00:00
}
}
2015-06-16 22:46:58 +00:00
func (h *wsHandler) join(b []byte) {
var data Join
json.Unmarshal(b, &data)
2015-01-17 01:37:21 +00:00
2015-06-16 22:46:58 +00:00
if i, ok := h.session.getIRC(data.Server); ok {
i.Join(data.Channels...)
}
}
2015-01-17 01:37:21 +00:00
2015-06-16 22:46:58 +00:00
func (h *wsHandler) part(b []byte) {
var data Part
json.Unmarshal(b, &data)
2015-02-04 01:43:49 +00:00
2015-06-16 22:46:58 +00:00
if i, ok := h.session.getIRC(data.Server); ok {
i.Part(data.Channels...)
}
}
2015-02-04 01:43:49 +00:00
2015-06-16 22:46:58 +00:00
func (h *wsHandler) quit(b []byte) {
var data Quit
json.Unmarshal(b, &data)
2015-02-04 01:43:49 +00:00
2015-06-16 22:46:58 +00:00
if i, ok := h.session.getIRC(data.Server); ok {
log.Println(h.addr, "[IRC] Remove server", data.Server)
2015-06-16 22:46:58 +00:00
i.Quit()
h.session.deleteIRC(data.Server)
channelStore.RemoveUserAll(i.GetNick(), data.Server)
2016-01-17 22:33:52 +00:00
go h.session.user.RemoveServer(data.Server)
2015-06-16 22:46:58 +00:00
}
}
2015-06-16 22:46:58 +00:00
func (h *wsHandler) chat(b []byte) {
var data Chat
json.Unmarshal(b, &data)
2015-06-16 22:46:58 +00:00
if i, ok := h.session.getIRC(data.Server); ok {
i.Privmsg(data.To, data.Message)
}
}
2015-06-16 22:46:58 +00:00
func (h *wsHandler) nick(b []byte) {
var data Nick
json.Unmarshal(b, &data)
2015-06-16 22:46:58 +00:00
if i, ok := h.session.getIRC(data.Server); ok {
i.Nick(data.New)
2016-01-17 22:33:52 +00:00
go h.session.user.SetNick(data.New, data.Server)
2015-06-16 22:46:58 +00:00
}
}
2015-06-16 22:46:58 +00:00
func (h *wsHandler) invite(b []byte) {
var data Invite
json.Unmarshal(b, &data)
2015-06-16 22:46:58 +00:00
if i, ok := h.session.getIRC(data.Server); ok {
i.Invite(data.User, data.Channel)
}
}
2015-06-16 22:46:58 +00:00
func (h *wsHandler) kick(b []byte) {
var data Invite
json.Unmarshal(b, &data)
2015-06-16 22:46:58 +00:00
if i, ok := h.session.getIRC(data.Server); ok {
i.Kick(data.Channel, data.User)
}
}
2015-06-16 22:46:58 +00:00
func (h *wsHandler) whois(b []byte) {
var data Whois
json.Unmarshal(b, &data)
2015-02-21 12:06:05 +00:00
2015-06-16 22:46:58 +00:00
if i, ok := h.session.getIRC(data.Server); ok {
i.Whois(data.User)
}
}
2015-02-21 12:06:05 +00:00
2015-06-16 22:46:58 +00:00
func (h *wsHandler) away(b []byte) {
var data Away
json.Unmarshal(b, &data)
2015-02-21 12:06:05 +00:00
2015-06-16 22:46:58 +00:00
if i, ok := h.session.getIRC(data.Server); ok {
i.Away(data.Message)
}
}
2016-01-27 19:48:47 +00:00
func (h *wsHandler) raw(b []byte) {
var data Raw
json.Unmarshal(b, &data)
if i, ok := h.session.getIRC(data.Server); ok {
i.Write(data.Message)
}
}
2015-06-16 22:46:58 +00:00
func (h *wsHandler) search(b []byte) {
go func() {
var data SearchRequest
json.Unmarshal(b, &data)
2015-06-16 22:46:58 +00:00
results, err := h.session.user.SearchMessages(data.Server, data.Channel, data.Phrase)
if err != nil {
log.Println(err)
return
}
2015-06-16 22:46:58 +00:00
h.session.sendJSON("search", SearchResult{
Server: data.Server,
Channel: data.Channel,
Results: results,
})
}()
}
2016-01-11 20:04:57 +00:00
func (h *wsHandler) cert(b []byte) {
var data ClientCert
json.Unmarshal(b, &data)
err := h.session.user.SetCertificate(data.Cert, data.Key)
if err != nil {
h.session.sendJSON("cert_fail", Error{Message: err.Error()})
return
}
h.session.sendJSON("cert_success", nil)
}
2015-06-16 22:46:58 +00:00
func (h *wsHandler) initHandlers() {
h.handlers = map[string]func([]byte){
"connect": h.connect,
"join": h.join,
"part": h.part,
"quit": h.quit,
"chat": h.chat,
"nick": h.nick,
"invite": h.invite,
"kick": h.kick,
"whois": h.whois,
"away": h.away,
2016-01-27 19:48:47 +00:00
"raw": h.raw,
2015-06-16 22:46:58 +00:00
"search": h.search,
2016-01-11 20:04:57 +00:00
"cert": h.cert,
2015-01-17 01:37:21 +00:00
}
}