diff --git a/main.go b/main.go index 65e0678..242335f 100644 --- a/main.go +++ b/main.go @@ -44,6 +44,7 @@ func main() { b := bot.NewBot(config, c) // b.AddHandler(plugins.NewTestPlugin(b)) b.AddHandler("admin", plugins.NewAdminPlugin(b)) + b.AddHandler("first", plugins.NewFirstPlugin(b)) b.AddHandler("downtime", plugins.NewDowntimePlugin(b)) b.AddHandler("talker", plugins.NewTalkerPlugin(b)) b.AddHandler("dice", plugins.NewDicePlugin(b)) diff --git a/plugins/first.go b/plugins/first.go new file mode 100644 index 0000000..0ea7971 --- /dev/null +++ b/plugins/first.go @@ -0,0 +1,106 @@ +package plugins + +import ( + "bitbucket.org/phlyingpenguin/godeepintir/bot" + "fmt" + "labix.org/v2/mgo" + "labix.org/v2/mgo/bson" + "log" + "strings" + "time" +) + +// This is a first plugin to serve as an example and quick copy/paste for new plugins. + +type FirstPlugin struct { + First *FirstEntry + Bot *bot.Bot + Coll *mgo.Collection +} + +type FirstEntry struct { + Day time.Time + Time time.Time + Body string + Nick string +} + +// NewFirstPlugin creates a new FirstPlugin with the Plugin interface +func NewFirstPlugin(b *bot.Bot) *FirstPlugin { + coll := b.Db.C("first") + var firsts []FirstEntry + query := bson.M{"day": midnight(time.Now().UTC())} + coll.Find(query).All(&firsts) + + return &FirstPlugin{ + Bot: b, + Coll: coll, + First: &firsts[0], + } +} + +func midnight(t time.Time) time.Time { + y, m, d := t.Date() + return time.Date(y, m, d, 0, 0, 0, 0, time.UTC) +} + +func isToday(t time.Time) bool { + t0 := midnight(t) + return t0.Before(midnight(time.Now())) +} + +// Message responds to the bot hook on recieving messages. +// This function returns true if the plugin responds in a meaningful way to the users message. +// Otherwise, the function returns false and the bot continues execution of other plugins. +func (p *FirstPlugin) Message(message bot.Message) bool { + // This bot does not reply to anything + + if p.First == nil { + p.recordFirst(message) + } else { + if isToday(p.First.Time) { + p.recordFirst(message) + } + } + + r := strings.NewReplacer("'", "", "\"", "", ",", "", ".", "", ":", "", + "?", "", "!", "") + msg := strings.ToLower(message.Body) + if r.Replace(msg) == "whos on first" { + c := message.Channel + if p.First != nil { + p.Bot.SendMessage(c, fmt.Sprintf("%s had first at %s with the message: \"%s\"", + p.First.Nick, p.First.Time.Format(time.Kitchen), p.First.Body)) + } + } + + return false +} + +func (p *FirstPlugin) recordFirst(message bot.Message) { + log.Println("Recording first: ", message.User.Name, ":", message.Body) + p.First = &FirstEntry{ + Day: midnight(time.Now()), + Time: message.Time, + Body: message.Body, + Nick: message.User.Name, + } + p.Coll.Insert(p.First) +} + +// LoadData imports any configuration data into the plugin. This is not strictly necessary other +// than the fact that the Plugin interface demands it exist. This may be deprecated at a later +// date. +func (p *FirstPlugin) LoadData() { + // This bot has no data to load +} + +// Help responds to help requests. Every plugin must implement a help function. +func (p *FirstPlugin) Help(channel string, parts []string) { + p.Bot.SendMessage(channel, "Sorry, First does not do a goddamn thing.") +} + +// Empty event handler because this plugin does not do anything on event recv +func (p *FirstPlugin) Event(kind string, message bot.Message) bool { + return false +}