func lookup(ctx *bot.Context) { // Only perform extra prefix removal if we weren't addressed directly key := ToKey(ctx.Text(), !ctx.Addressed) var fact *factoids.Factoid if fact = fc.GetPseudoRand(key); fact == nil && ctx.Cmd == client.ACTION { // Support sp0rkle's habit of stripping off it's own nick // but only for actions, not privmsgs. if strings.HasSuffix(key, ctx.Me()) { key = strings.TrimSpace(key[:len(key)-len(ctx.Me())]) fact = fc.GetPseudoRand(key) } } if fact == nil { return } // Chance is used to limit the rate of factoid replies for things // people say a lot, like smilies, or 'lol', or 'i love the peen'. chance := fact.Chance if key == "" { // This is doing a "random" lookup, triggered by someone typing in // something entirely composed of the chars stripped by ToKey(). // To avoid making this too spammy, forcibly limit the chance to 40%. chance = 0.4 } if rand.Float64() < chance { // Store this as the last seen factoid LastSeen(ctx.Target(), fact.Id) // Update the Accessed field // TODO(fluffle): fd should take care of updating Accessed internally fact.Access(ctx.Storable()) // And store the new factoid data if err := fc.Update(bson.M{"_id": fact.Id}, fact); err != nil { ctx.ReplyN("I failed to update '%s' (%s): %s ", fact.Key, fact.Id, err) } recurse(fact, map[string]bool{key: true}) switch fact.Type { case factoids.F_ACTION: ctx.Do("%s", fact.Value) default: ctx.Reply("%s", fact.Value) } } }