func Uid(hook string, msg *parser.Message, ircd *IRCd) { nickname, hopcount, nickTS := msg.Args[0], msg.Args[1], msg.Args[2] umode, username, hostname := msg.Args[3], msg.Args[4], msg.Args[5] ip, uid, name := msg.Args[6], msg.Args[7], msg.Args[8] _ = umode err := user.Import(uid, nickname, username, hostname, ip, hopcount, nickTS, name) if err != nil { // TODO: TS check - Kill remote or local? For now, we kill remote. ircd.ToServer <- &parser.Message{ Prefix: Config.SID, Command: parser.CMD_SQUIT, Args: []string{ uid, err.String(), }, DestIDs: []string{msg.SenderID}, } } for fwd := range server.Iter() { if fwd != msg.SenderID { log.Debug.Printf("Forwarding UID from %s to %s", msg.SenderID, fwd) fmsg := msg.Dup() fmsg.DestIDs = []string{fwd} } } }
func SQuit(hook string, msg *parser.Message, ircd *IRCd) { split, reason := msg.Args[0], msg.Args[1] if split == Config.SID { split = msg.SenderID } // Forward for sid := range server.Iter() { if sid != msg.SenderID { msg := msg.Dup() msg.DestIDs = []string{sid} ircd.ToServer <- msg } } if server.IsLocal(split) { ircd.ToServer <- &parser.Message{ Command: parser.CMD_ERROR, Args: []string{ "SQUIT: " + reason, }, } } sids := server.Unlink(split) peers := user.Netsplit(sids) notify := channel.Netsplit(Config.SID, peers) log.Debug.Printf("NET SPLIT: %s", split) log.Debug.Printf(" - SIDs: %v", sids) log.Debug.Printf(" - Peers: %v", peers) log.Debug.Printf(" - Notify: %v", notify) for uid, peers := range notify { if len(peers) > 0 { ircd.ToClient <- &parser.Message{ Prefix: uid, Command: parser.CMD_QUIT, Args: []string{ "*.net *.split", }, DestIDs: peers, } } } // Delete all of the peers if len(peers) > 0 { ircd.ToClient <- &parser.Message{ Command: parser.INT_DELUSER, DestIDs: peers, } } }
// Server PART func SPart(hook string, msg *parser.Message, ircd *IRCd) { chanlist, reason := strings.Split(msg.Args[0], ","), msg.Args[1] // Forward on to other servers for fwd := range server.Iter() { if fwd != msg.SenderID { log.Debug.Printf("Forwarding PART from %s to %s", msg.SenderID, fwd) fmsg := msg.Dup() fmsg.DestIDs = []string{fwd} } } for _, channame := range chanlist { channel, err := channel.Get(channame, false) if num, ok := err.(*parser.Numeric); ok { ircd.ToServer <- num.Error(msg.SenderID) return } chanusers, err := channel.Part(msg.Prefix) if num, ok := err.(*parser.Numeric); ok { ircd.ToServer <- num.Error(msg.SenderID) return } notify := []string{} for _, uid := range chanusers { if uid[:3] == Config.SID { notify = append(notify, uid) } } if len(notify) > 0 { ircd.ToClient <- &parser.Message{ Prefix: msg.Prefix, Command: parser.CMD_PART, Args: []string{ channel.Name(), reason, }, DestIDs: notify, } } } }
func Sid(hook string, msg *parser.Message, ircd *IRCd) { servname, hopcount, sid, desc := msg.Args[0], msg.Args[1], msg.Args[2], msg.Args[3] err := server.Link(msg.Prefix, sid, servname, hopcount, desc) if err != nil { ircd.ToServer <- &parser.Message{ Prefix: Config.SID, Command: parser.CMD_SQUIT, Args: []string{ sid, err.String(), }, DestIDs: []string{msg.SenderID}, } } for fwd := range server.Iter() { if fwd != msg.SenderID { log.Debug.Printf("Forwarding SID from %s to %s", msg.SenderID, fwd) fmsg := msg.Dup() fmsg.DestIDs = []string{fwd} } } }
// Server JOIN and SJOIN func SJoin(hook string, msg *parser.Message, ircd *IRCd) { chanTS, channame, mode := msg.Args[0], msg.Args[1], msg.Args[2] uids := []string{msg.Prefix} if len(msg.Prefix) == 3 { if len(msg.Args) == 3 { return } uids = strings.Split(msg.Args[3], " ") } _ = chanTS _ = mode // Forward on to other servers for fwd := range server.Iter() { if fwd != msg.SenderID { log.Debug.Printf("Forwarding SJOIN from %s to %s", msg.SenderID, fwd) fmsg := msg.Dup() fmsg.DestIDs = []string{fwd} } } for i, uid := range uids { uids[i] = uid[len(uid)-9:] } channel, err := channel.Get(channame, true) if num, ok := err.(*parser.Numeric); ok { ircd.ToServer <- num.Error(msg.SenderID) return } if len(uids) == 0 && len(msg.Prefix) == 9 { uids = []string{msg.Prefix} } chanusers, err := channel.Join(uids...) if num, ok := err.(*parser.Numeric); ok { ircd.ToServer <- num.Error(msg.SenderID) return } notify := []string{} for _, uid := range chanusers { if uid[:3] == Config.SID { notify = append(notify, uid) } } if len(notify) > 0 { for _, joiner := range uids { ircd.ToClient <- &parser.Message{ Prefix: joiner, Command: parser.CMD_JOIN, Args: []string{ channel.Name(), }, DestIDs: notify, } } } }