package main import ( "log" "strings" "time" irc "github.com/fluffle/goirc/client" ) type Commander interface { irc.Handler Timeout(string) bool WithArgs(int) bool Help() string } type Command struct { lastCmd map[string]time.Time } var commands = make(map[string]Commander) func Register(cmd string, f Commander) { commands[cmd] = f } const timeOut = time.Second func (v *Command) Timeout(nick string) bool { defer func() { v.lastCmd[nick] = time.Now() }() if v.lastCmd == nil { v.lastCmd = make(map[string]time.Time) } if last, ok := v.lastCmd[nick]; ok { if to := time.Since(last); to < timeOut { log.Println(nick, "timeout", to) return true } } return false } func (_ Command) WithArgs(n int) bool { return n == 1 } func Dispatch(conn *irc.Conn, line *irc.Line) { if f := strings.Fields(line.Text()); len(f) > 0 { cmd := strings.ToLower(f[0]) if c, ok := commands[cmd]; ok { if line.Public() && c.Timeout(line.Nick) { log.Println("timeout", line.Nick) conn.Kick(*room, line.Nick, "timeout") return } if c.WithArgs(len(f)) { log.Println(line.Nick, f) c.Handle(conn, line) } } } }