func New(b bot.Bot, whoisPlugin *whois.Plugin, isupportPlugin *isupport.Plugin, tempbanPlugin *tempban.Plugin, nickservPlugin *nickserv.Plugin) *Plugin { if whoisPlugin == nil { panic("whoisPlugin must not be nil") } if isupportPlugin == nil { panic("isupportPlugin must not be nil") } if tempbanPlugin == nil { panic("tempbanPlugin must not be nil") } if nickservPlugin == nil { panic("nickservPlugin must not be nil") } plugin := &Plugin{ bot: b, whois: whoisPlugin, isupport: isupportPlugin, tempban: tempbanPlugin, nickserv: nickservPlugin, lastCheckNicks: map[string]time.Time{}, Admins: []string{}, } b.Conn().HandleFunc("join", plugin.OnJoin) b.Commands().Add("listbans", bot.Command{ Hidden: true, Pub: true, Help: "(only admins) Lists bans the bot set in a channel.", Handler: func(e *bot.Event) { if !plugin.isAdmin(e.Line.Src) { return } channel := e.Args if len(channel) < 1 { b.Privmsg(e.Target, "Need a channel to query.") return } bans := tempbanPlugin.Bans(channel) if len(bans) == 0 { b.Privmsg(e.Target, fmt.Sprintf("No bans set for \x02%v\x02.", channel)) } else { for i, ban := range bans { b.Privmsg(e.Target, fmt.Sprintf("%4v. \x02%-41v\x02 (\x02%v\x02, expires \x02%v\x02)", i+1, ban.Hostmask, ban.Reason, humanize.Time(ban.ExpirationTime))) } } }, }) b.Commands().Add("globalban", bot.Command{ Hidden: true, Pub: true, Help: "(only admins) Globally bans a specific nickname or hostmask with given duration and reason.", Handler: func(e *bot.Event) { if !plugin.isAdmin(e.Line.Src) { return } split := strings.SplitN(e.Args, " ", 3) if len(split) < 3 { b.Privmsg(e.Target, "Need a nickname or hostmask, duration and reason to ban, in this order.") return } nick, durationStr, reason := split[0], split[1], split[2] reason = fmt.Sprintf("Manual global ban: %v", reason) duration, err := time.ParseDuration(durationStr) var banmask string if !strings.Contains(nick, "@") && !strings.Contains(nick, "!") { if err != nil { b.Privmsg(e.Target, fmt.Sprintf("Failed to parse duration: %v", err)) return } // Generate the ban mask from WHOIS information info, err := whoisPlugin.WhoIs(nick) if err != nil { b.Privmsg(e.Target, fmt.Sprintf("Can't get information about this nick: %v", err)) return } banmask = fmt.Sprintf("%v!%v@%v", "*", "*", info.Host) } else { banmask = nick nick = "" } b.Privmsg(e.Target, fmt.Sprintf("Banning \x02%v\x02 until \x02%v\x02 with reason \x02%v\x02.", banmask, humanize.Time(time.Now().Add(duration)), reason)) plugin.banGlobal(plugin.generateBan(nick, banmask, reason, duration)) }, }) b.Commands().Add("globalunban", bot.Command{ Hidden: true, Pub: true, Help: "(only admins) Globally unbans a specific nickname or hostmask.", Handler: func(e *bot.Event) { if !plugin.isAdmin(e.Line.Src) { return } if len(e.Args) <= 0 { b.Privmsg(e.Target, "Need a nickname or hostmask.") return } nick := e.Args var banmask string if !strings.Contains(nick, "@") && !strings.Contains(nick, "!") { // Generate the ban mask from WHOIS information info, err := whoisPlugin.WhoIs(nick) if err != nil { b.Privmsg(e.Target, fmt.Sprintf("Can't get information about this nick: %v", err)) return } banmask = fmt.Sprintf("%v!%v@%v", "*", "*", info.Host) } else { banmask = nick } b.Privmsg(e.Target, fmt.Sprintf("Unbanning \x02%v\x02.", banmask)) plugin.unbanGlobal(banmask) }, }) return plugin }