package impossible import ( "encoding/json" "fmt" "io/ioutil" "math/rand" "net/http" "net/url" "regexp" "strings" "time" "github.com/rs/zerolog/log" "github.com/velour/catbase/bot" "github.com/velour/catbase/bot/msg" "github.com/velour/catbase/config" ) type Impossible struct { b bot.Bot c *config.Config title string content []string updated time.Time testing bool } func New(b bot.Bot) *Impossible { i := &Impossible{ b: b, c: b.Config(), title: "", content: []string{}, updated: getTodaysMidnight().Add(time.Hour * -24), testing: false, } b.Register(i, bot.Help, i.help) b.Register(i, bot.Message, i.message) return i } func newTesting(b bot.Bot) *Impossible { i := &Impossible{ b: b, c: b.Config(), title: "", content: []string{}, updated: getTodaysMidnight().Add(time.Hour * -24), testing: true, } b.Register(i, bot.Help, i.help) b.Register(i, bot.Message, i.message) return i } func (p *Impossible) help(c bot.Connector, kind bot.Kind, message msg.Message, args ...interface{}) bool { p.b.Send(c, bot.Message, message.Channel, "You don't need to do anything. I'll take care of it. But guess what I'm thinking.") return true } func (p *Impossible) message(c bot.Connector, kind bot.Kind, message msg.Message, args ...interface{}) bool { messaged := false if p.updated.Before(time.Now()) { if p.title != "" { p.b.Send(c, bot.Message, message.Channel, fmt.Sprintf("The last impossible wikipedia article was: \"%s\"", p.title)) messaged = true } for !p.refreshImpossible() { } if p.testing { p.b.Send(c, bot.Message, message.Channel, p.title) messaged = true } } lowercase := strings.ToLower(message.Body) if lowercase == "hint" || lowercase == "clue" { messaged = true p.b.Send(c, bot.Message, message.Channel, p.content[rand.Intn(len(p.content))]) } else if strings.Contains(lowercase, strings.ToLower(p.title)) { messaged = true p.b.Send(c, bot.Message, message.Channel, fmt.Sprintf("You guessed the last impossible wikipedia article: \"%s\"", p.title)) for !p.refreshImpossible() { } } return messaged } func (p *Impossible) refreshImpossible() bool { p.updated = getTodaysMidnight() resp, err := http.Get("https://en.wikipedia.org/wiki/Special:Random") if err != nil { log.Fatal().Err(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) titleRegex := regexp.MustCompile(`id="firstHeading"[^>]*(?P