diff --git a/server.go b/server.go index 271aab3..e2d429e 100644 --- a/server.go +++ b/server.go @@ -37,17 +37,17 @@ type Server struct { AddClient chan *Client DelClient chan *Client - host string - info string - software string - version string - created string - motd string - clients map[string]*Client - subscriptions map[string][]string - ports map[int]bool - config *conf.ConfigFile - configPath string + host string + info string + software string + version string + created string + motd string + clients map[string]*Client + channels map[string]map[string]string + ports map[int]bool + config *conf.ConfigFile + configPath string } func init() { @@ -62,7 +62,7 @@ func NewServer(configPath, software, version string) *Server { srv.DelClient = make(chan *Client, 1024) srv.clients = make(map[string]*Client) - srv.subscriptions = make(map[string][]string) + srv.channels = make(map[string]map[string]string) srv.configPath = configPath srv.loadConfig() loglevel, _ := srv.config.GetInt("system", "loglevel") @@ -176,12 +176,12 @@ func (srv *Server) sendMsg(msg *irc.Message) { } func (srv *Server) sendMsgToChannel(msg *irc.Message) { - subj := msg.Args[0] - if _, exists := srv.subscriptions[subj]; !exists { + cname := msg.Args[0] + if _, exists := srv.channels[cname]; !exists { return } - subs := srv.subscriptions[subj] - for _, sub := range subs { + subs := srv.channels[cname] + for sub, _ := range subs { if _, exists := srv.clients[sub]; !exists { continue } @@ -205,7 +205,12 @@ func (srv *Server) sendReply(tar, cmd, args, trail string) { return } cl := srv.clients[tar] - cl.Receive(irc.M(srv.host, cmd, tar+" "+args, trail)) + if args != "" { + args = tar + args + } else { + args = tar + } + cl.Receive(irc.M(srv.host, cmd, args, trail)) } func (srv *Server) clientLogon(cl *Client) { @@ -230,6 +235,29 @@ func (srv *Server) clientMotd(cl *Client) { srv.sendReply(cl.Name(), RPL_ENDOFMOTD, "", "End of MOTD command") } +func (srv *Server) channelBroadcast(ch string, msg *irc.Message) { + for nick, _ := range srv.channels[ch] { + if msg.Pre == nick { + continue + } + srv.clients[nick].Receive(msg) + } +} + +func (srv *Server) channelJoin(nick, ch string) { + if _, exists := srv.channels[ch]; !exists { + srv.channels[ch] = make(map[string]string) + } + if _, exists := srv.channels[ch][nick]; exists { + return + } + srv.channels[ch][nick] = "" + srv.channelBroadcast(ch, irc.M(nick, "JOIN", ch, "")) +} + +func (srv *Server) channelPart(nick, ch string) { +} + type SrvCommandHook struct { HookFn func(srv *Server, msg *irc.Message) MinArgs int @@ -239,8 +267,8 @@ type SrvCommandHook struct { var srvCommandHooks = map[string]SrvCommandHook{ "PRIVMSG": {srvHandleCmdPrivmsg, 1, false, false}, - "JOIN": {srvHandleCmdPrivmsg, 1, false, false}, - "PART": {srvHandleCmdPrivmsg, 1, false, false}, + "JOIN": {srvHandleCmdJoin, 1, false, false}, + "PART": {srvHandleCmdPart, 1, false, false}, "QUIT": {srvHandleCmdQuit, 0, false, false}, "MODE": {srvHandleCmdMode, 1, false, false}, "LIST": {srvHandleCmdList, 0, false, false}, @@ -271,9 +299,12 @@ func srvHandleCmdPrivmsg(srv *Server, msg *irc.Message) { } func srvHandleCmdJoin(srv *Server, msg *irc.Message) { + srv.channelJoin(msg.Pre, msg.Args[0]) + } func srvHandleCmdPart(srv *Server, msg *irc.Message) { + srv.channelPart(msg.Pre, msg.Args[0]) } func srvHandleCmdOper(srv *Server, msg *irc.Message) { @@ -307,7 +338,6 @@ func srvHandleCmdWho(srv *Server, msg *irc.Message) { } func srvHandleCmdWhois(srv *Server, msg *irc.Message) { - println("in whois") srv.sendReply(msg.Pre, RPL_WHOISUSER, "nick user host *", "real name") }