2015-05-01 20:59:46 +00:00
|
|
|
package server
|
2015-01-17 01:37:21 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"sync"
|
|
|
|
|
2015-06-05 22:34:13 +00:00
|
|
|
"github.com/khlieng/name_pending/irc"
|
2015-01-21 21:59:08 +00:00
|
|
|
"github.com/khlieng/name_pending/storage"
|
2015-01-17 01:37:21 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type Session struct {
|
2015-06-05 22:34:13 +00:00
|
|
|
irc map[string]*irc.Client
|
2015-01-17 01:37:21 +00:00
|
|
|
ircLock sync.Mutex
|
|
|
|
|
2015-06-05 22:34:13 +00:00
|
|
|
ws map[string]*conn
|
2015-01-17 01:37:21 +00:00
|
|
|
wsLock sync.Mutex
|
|
|
|
out chan []byte
|
|
|
|
|
2015-04-29 21:54:44 +00:00
|
|
|
user *storage.User
|
2015-01-17 01:37:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewSession() *Session {
|
|
|
|
return &Session{
|
2015-06-05 22:34:13 +00:00
|
|
|
irc: make(map[string]*irc.Client),
|
|
|
|
ws: make(map[string]*conn),
|
2015-01-17 01:37:21 +00:00
|
|
|
out: make(chan []byte, 32),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-06-05 22:34:13 +00:00
|
|
|
func (s *Session) getIRC(server string) (*irc.Client, bool) {
|
2015-01-17 01:37:21 +00:00
|
|
|
s.ircLock.Lock()
|
2015-06-05 22:34:13 +00:00
|
|
|
i, ok := s.irc[server]
|
2015-02-09 00:00:30 +00:00
|
|
|
s.ircLock.Unlock()
|
|
|
|
|
2015-06-05 22:34:13 +00:00
|
|
|
return i, ok
|
2015-01-17 01:37:21 +00:00
|
|
|
}
|
|
|
|
|
2015-06-05 22:34:13 +00:00
|
|
|
func (s *Session) setIRC(server string, i *irc.Client) {
|
2015-01-17 01:37:21 +00:00
|
|
|
s.ircLock.Lock()
|
2015-06-05 22:34:13 +00:00
|
|
|
s.irc[server] = i
|
2015-01-17 01:37:21 +00:00
|
|
|
s.ircLock.Unlock()
|
|
|
|
}
|
|
|
|
|
2015-02-09 00:00:30 +00:00
|
|
|
func (s *Session) deleteIRC(server string) {
|
|
|
|
s.ircLock.Lock()
|
|
|
|
delete(s.irc, server)
|
|
|
|
s.ircLock.Unlock()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Session) numIRC() int {
|
|
|
|
s.ircLock.Lock()
|
|
|
|
n := len(s.irc)
|
|
|
|
s.ircLock.Unlock()
|
|
|
|
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
2015-06-05 22:34:13 +00:00
|
|
|
func (s *Session) setWS(addr string, w *conn) {
|
2015-01-17 01:37:21 +00:00
|
|
|
s.wsLock.Lock()
|
2015-06-04 00:06:17 +00:00
|
|
|
s.ws[addr] = w
|
2015-01-17 01:37:21 +00:00
|
|
|
s.wsLock.Unlock()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Session) deleteWS(addr string) {
|
|
|
|
s.wsLock.Lock()
|
|
|
|
delete(s.ws, addr)
|
|
|
|
s.wsLock.Unlock()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Session) sendJSON(t string, v interface{}) {
|
|
|
|
data, _ := json.Marshal(v)
|
|
|
|
raw := json.RawMessage(data)
|
|
|
|
res, _ := json.Marshal(WSResponse{Type: t, Response: &raw})
|
|
|
|
|
|
|
|
s.out <- res
|
|
|
|
}
|
|
|
|
|
2015-01-29 23:38:51 +00:00
|
|
|
func (s *Session) sendError(err error, server string) {
|
|
|
|
s.sendJSON("error", Error{
|
|
|
|
Server: server,
|
|
|
|
Message: err.Error(),
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2015-01-17 01:37:21 +00:00
|
|
|
func (s *Session) write() {
|
|
|
|
for res := range s.out {
|
|
|
|
s.wsLock.Lock()
|
|
|
|
for _, ws := range s.ws {
|
2015-06-05 22:34:13 +00:00
|
|
|
ws.out <- res
|
2015-01-17 01:37:21 +00:00
|
|
|
}
|
|
|
|
s.wsLock.Unlock()
|
|
|
|
}
|
|
|
|
}
|