Preparations for nats clustering
This commit is contained in:
parent
00cb057120
commit
3c30adab5c
|
@ -86,6 +86,10 @@ func handleCmdJoin(sv *Server, msg *irc.Message) {
|
||||||
}
|
}
|
||||||
sv.chUsers[chid][clid] = ""
|
sv.chUsers[chid][clid] = ""
|
||||||
sv.sendMsg(msg)
|
sv.sendMsg(msg)
|
||||||
|
// dont proceed further if message was sent by remote origin
|
||||||
|
if !sv.localOrigin(msg) {
|
||||||
|
return
|
||||||
|
}
|
||||||
sv.sendReply(msg.Pre, RPL_TOPIC, msg.Args[0], sv.chTopics[msg.Args[0]])
|
sv.sendReply(msg.Pre, RPL_TOPIC, msg.Args[0], sv.chTopics[msg.Args[0]])
|
||||||
sv.channelNames(msg.Pre, msg.Args[0])
|
sv.channelNames(msg.Pre, msg.Args[0])
|
||||||
m, isoper := sv.opers[clid]
|
m, isoper := sv.opers[clid]
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
// vim:ts=4:sts=4:sw=4:noet:tw=72
|
||||||
|
|
||||||
|
package ircd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/nats-io/nats"
|
||||||
|
)
|
||||||
|
|
||||||
|
type NatsConnector struct {
|
||||||
|
natsConn *nats.Conn
|
||||||
|
subscriptions map[string]*nats.Subscription
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewNatsConnector(servers *string) *NatsConnector {
|
||||||
|
opts := nats.DefaultOptions
|
||||||
|
opts.Servers = strings.Split(*servers, ",")
|
||||||
|
for i, s := range opts.Servers {
|
||||||
|
opts.Servers[i] = strings.Trim(s, " ")
|
||||||
|
}
|
||||||
|
//opts.Secure = *ssl
|
||||||
|
opts.Secure = false
|
||||||
|
conn, err := opts.Connect()
|
||||||
|
if err != nil {
|
||||||
|
// foo
|
||||||
|
}
|
||||||
|
subs := make(map[string]*nats.Subscription)
|
||||||
|
return &NatsConnector{natsConn: conn, subscriptions: subs}
|
||||||
|
}
|
27
server.go
27
server.go
|
@ -248,7 +248,6 @@ func (sv *Server) addClient(cl Client) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
sv.clients[clid] = cl
|
sv.clients[clid] = cl
|
||||||
sv.clients[clid] = cl
|
|
||||||
sv.sendLogon(cl.Name())
|
sv.sendLogon(cl.Name())
|
||||||
sv.connectionsCurrent = float64(len(sv.clients))
|
sv.connectionsCurrent = float64(len(sv.clients))
|
||||||
cl.Register(true)
|
cl.Register(true)
|
||||||
|
@ -305,8 +304,14 @@ func (sv *Server) recvMsg(msg *irc.Message) {
|
||||||
hook.HookFn(sv, msg)
|
hook.HookFn(sv, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Local delivery of an irc message to channel or client
|
// Forward an irc message to cluster and deliver locally
|
||||||
func (sv *Server) sendMsg(msg *irc.Message) {
|
func (sv *Server) sendMsg(msg *irc.Message) {
|
||||||
|
sv.deliverMsg(msg)
|
||||||
|
sv.forwardMsg(msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Local delivery of an irc message to channel or client
|
||||||
|
func (sv *Server) deliverMsg(msg *irc.Message) {
|
||||||
if strings.HasPrefix(msg.Args[0], "#") {
|
if strings.HasPrefix(msg.Args[0], "#") {
|
||||||
chid := strings.ToLower(msg.Args[0])
|
chid := strings.ToLower(msg.Args[0])
|
||||||
if _, exists := sv.chUsers[chid]; !exists {
|
if _, exists := sv.chUsers[chid]; !exists {
|
||||||
|
@ -332,13 +337,16 @@ func (sv *Server) sendMsg(msg *irc.Message) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Forward an irc message to cluster and deliver locally
|
// Forward to cluster
|
||||||
func (sv *Server) forwardMsg(msg *irc.Message) {
|
func (sv *Server) forwardMsg(msg *irc.Message) {
|
||||||
sv.sendMsg(msg)
|
if sv.localOrigin(msg) {
|
||||||
|
// TODO: forward to cluster
|
||||||
|
println("forward:", msg.String())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send irc reply to local client; drop, if server if client doesnt
|
// Send irc reply to local client and drop, if client doesnt
|
||||||
// exists locally
|
// exist locally
|
||||||
func (sv *Server) sendReply(nick, cmd, args, trail string) {
|
func (sv *Server) sendReply(nick, cmd, args, trail string) {
|
||||||
clid := strings.ToLower(nick)
|
clid := strings.ToLower(nick)
|
||||||
if _, exists := sv.clients[clid]; !exists {
|
if _, exists := sv.clients[clid]; !exists {
|
||||||
|
@ -353,6 +361,13 @@ func (sv *Server) sendReply(nick, cmd, args, trail string) {
|
||||||
cl.Receive(irc.M(sv.host, cmd, args, trail))
|
cl.Receive(irc.M(sv.host, cmd, args, trail))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if message's origin is local
|
||||||
|
func (sv *Server) localOrigin(msg *irc.Message) bool {
|
||||||
|
_, localClient := sv.clients[strings.ToLower(msg.Pre)]
|
||||||
|
localServer := (msg.Pre == sv.host)
|
||||||
|
return localClient || localServer
|
||||||
|
}
|
||||||
|
|
||||||
func (sv *Server) sendLogon(nick string) {
|
func (sv *Server) sendLogon(nick string) {
|
||||||
sv.sendReply(nick, RPL_WELCOME, "", "Willkommen!")
|
sv.sendReply(nick, RPL_WELCOME, "", "Willkommen!")
|
||||||
sv.sendReply(nick, RPL_YOURHOST, "",
|
sv.sendReply(nick, RPL_YOURHOST, "",
|
||||||
|
|
Loading…
Reference in New Issue