Improve botsnack plugin.

- More fun phrases depending on hunger level
- Simulated hunger (yay math)
- Better abuse prevention
master
Casey Link 2011-09-08 13:34:58 -05:00
parent 8c3114d244
commit a758b8ab69
1 changed files with 95 additions and 11 deletions

View File

@ -1,25 +1,109 @@
#!/usr/bin/python2
"""
botsnack.py - .botsnack module
botsnack.py - .botsnack module (aka simulated hunger 1.0)
author: mutantmonkey <mutantmonkey@gmail.com>
author: Casey Link <unnamedrambler@gmail.com>
This module simulates bot hunger and provides a mechanism
for users to feed the bot.
To prevent abuse when the bot gets very, very full, it explodes
and enters a random cooldown period for 3-10 minutes. When in this
cooldown period all calls to botsnack are ignored.
"""
import random
import random, math, time
# the rate that affects how much eating a snack nourishes the bot
# smaller number = less nourishment = more snacks can be eaten (before fullness)
# larger number = more nourishment = less snacks can be eaten
r_eat = 0.05
# the rate that affects how fast the bot becomes hungry over time
# smaller number = the bot gets hungry slower
# larger number = the bot gets hungry faster
r_hunger = 0.005
def increase_hunger(current_hunger, x):
# more hungry === value closer to 0
return current_hunger * math.exp(-r_hunger * x)
def decrease_hunger(current_hunger, food_value):
# less hungry === closer to 100
if current_hunger > 50: # exponential growth
return min(100, current_hunger * math.exp(r_eat*food_value))
else: # linear increase
return current_hunger + food_value
def botsnack(phenny, input):
messages = ["Om nom nom", "Delicious, thanks!"]
response = random.choice(messages)
botsnack.snacks += 1
now = time.time()
# 0. Handle cooldown.
# Check if the cooldown period has elapsed, if not, then
# ignore this invocation. Else reset to the default state
if botsnack.coolingdown:
if now - botsnack.coolingstarted > botsnack.coolingperiod:
print "cooling down over, reseting"
botsnack.coolingdown = False
botsnack.hunger = 50.0
botsnack.last_tick = now
else:
print "cooling down! %s < %s" %(now - botsnack.coolingstarted, botsnack.coolingperiod)
return # ignore!
# 1. Time has has passed, so the bot has gotten
# hungry. Lets increase his/her hunger proportionate
# to the amount of time that has passeed.
delta = now - botsnack.last_tick
old_hunger = botsnack.hunger
botsnack.hunger = increase_hunger(old_hunger, delta)
print "hunger was %s, increased to %s" %(old_hunger, botsnack.hunger)
botsnack.last_tick = now
# 2. Eat some food. Send resposne
old_hunger = botsnack.hunger
botsnack.hunger = decrease_hunger(old_hunger, random.uniform(1,5))
print "hunger was %s, decreased to %s" %(old_hunger, botsnack.hunger)
if botsnack.hunger > 95: # special case to prevent abuse
phenny.say("Too much food!")
phenny.do("explodes")
botsnack.coolingperiod = random.uniform(3,10)*60
botsnack.coolingstarted = now
botsnack.coolingdown = True
return
if botsnack.hunger > 90:
messages = ["I don't think this will fit...", "Ugh, no more please", "Seriously, I can't eat anymore!", "/me shudders but downs the snack anyways"]
elif botsnack.hunger > 70:
messages = ["Thanks, but that's enough", "I suppose I could have one more", "If you insist"]
elif botsnack.hunger > 50:
messages = ["Om nom nom", "Delicious, thanks!", "Yummy!", "Wow! That's delicious"]
elif botsnack.hunger > 30:
messages = ["That really hit the spot!", "/me smacks lips", "Mmmmm!"]
elif botsnack.hunger > 10:
messages = ["Awww yea, that was tasty", "/me munches rudely", "Do you have any more?"]
elif botsnack.hunger > 1:
messages = ["/me noms furiously", "I really needed that!", "I'll take another!"]
else:
messages = ["I'M STARVING. GIVE ME MORE!", "/me gnaws ravenously on the snack with a starved look"]
msg = random.choice(messages)
if msg.startswith("/me "):
phenny.do(msg.partition("/me ")[2])
else:
phenny.say(msg)
if botsnack.snacks % 7 == 0:
phenny.say("Too much food!")
phenny.do("explodes")
else:
phenny.say(response)
botsnack.commands = ['botsnack']
botsnack.priority = 'low'
botsnack.snacks = 0
botsnack.hunger = 50.0
botsnack.last_tick = time.time()
botsnack.coolingdown = False
if __name__ == '__main__':
print __doc__.strip()