diff --git a/modules/coffee.go b/modules/coffee.go index deb2caa..51698e7 100644 --- a/modules/coffee.go +++ b/modules/coffee.go @@ -7,16 +7,30 @@ package modules import ( + "fmt" "strings" + "sync" "time" "code.dnix.de/an/xlog" "github.com/sorcix/irc" + "github.com/sorcix/irc/ctcp" +) + +type Receivers struct { + names map[string]bool + running bool + mux sync.Mutex +} + +var ( + r Receivers ) func init() { MsgHandlers["coffee"] = coffeeHandleMessage + r.names = make(map[string]bool) xlog.Info("Coffee module initialized") } @@ -25,34 +39,73 @@ func coffeeHandleMessage(m *irc.Message) { if len(tok) < 1 { return } - switch tok[0] { + switch strings.ToLower(tok[0]) { case "!kaffee": switch len(tok) { case 1: - go coffeeMake(nil) + go r.addReceivers(nil) default: - go coffeeMake(tok[1:]) + go r.addReceivers(tok[1:]) } default: } } -func coffeeMake(rec []string) { - SayCh <- "*\nsetzt Kaffee auf." - time.Sleep(30 * time.Second) - SayCh <- "*\nstellt eine frische Kanne Kaffee in den Raum." - if rec != nil { +func (r *Receivers) addReceivers(newNames []string) { + r.mux.Lock() + if r.running { + if newNames != nil { + r.addNames(newNames) + } + } else { + if newNames != nil { + r.addNames(newNames) + } + go r.makeCoffee() + } + r.mux.Unlock() +} + +func (r *Receivers) makeCoffee() { + r.mux.Lock() + r.running = true + r.mux.Unlock() + printAction("setzt Kaffee auf.") + time.Sleep(time.Second * 30) + printAction("stellt eine frische Kanne Kaffee in den Raum.") + r.mux.Lock() + if len(r.names) != 0 { var users string - for i, v := range rec { - users += v - if i < len(rec)-2 { + var count int = 0 + for i, _ := range r.names { + count++ + users += i + if count < len(r.names)-1 { users += ", " - } else if i == len(rec)-2 { + } else if count == len(r.names)-1 { users += " und " } } - SayCh <- "*\ngibt " + users + " einen frischen, richtig schwarzen, richtig leckeren Kaffee." + printAction("gibt " + users + " einen frischen, richtig schwarzen, richtig leckeren Kaffee.") } + r.mux.Unlock() time.Sleep(10 * time.Second) SayCh <- "*\nProst! (c)" + + r.mux.Lock() + r.names = make(map[string]bool) + r.running = false + r.mux.Unlock() } + +func (r *Receivers) addNames(newNames []string) { + for _, v := range newNames { + r.names[v] = true + } +} + +func printAction(s string) { + msg := ctcp.Encode(ctcp.ACTION, fmt.Sprintf(s)) + SayCh <- fmt.Sprintf("%s\n%s", "*", msg) +} + diff --git a/modules/twitch.go b/modules/twitch.go index 0500135..a94bda3 100644 --- a/modules/twitch.go +++ b/modules/twitch.go @@ -147,7 +147,7 @@ func twitchHandleMessage(m *irc.Message) { if len(tok) < 1 { return } - switch tok[0] { + switch strings.ToLower(tok[0]) { case "!twitch": switch len(tok) { case 1: diff --git a/modules/weather.go b/modules/weather.go index 76c2ad9..dce2019 100644 --- a/modules/weather.go +++ b/modules/weather.go @@ -86,7 +86,7 @@ func weatherHandleMessage(m *irc.Message) { if len(tok) < 1 { return } - switch tok[0] { + switch strings.ToLower(tok[0]) { case "!weather", "!wetter": switch len(tok) { case 1: