Skip to content

Instantly share code, notes, and snippets.

@jonmarkgo
Created February 21, 2012 02:50
Show Gist options
  • Save jonmarkgo/1873218 to your computer and use it in GitHub Desktop.
Save jonmarkgo/1873218 to your computer and use it in GitHub Desktop.
Twilio Cat Facts by Akiva Bamberger
application: cat-facts
version: 1
runtime: python
api_version: 1
handlers:
- url: /.*
script: index.py
class Numbers(db.Model):
number = db.StringProperty()
created = db.DateTimeProperty(auto_now_add=True)
last_touched = db.DateTimeProperty(auto_now=True)
count = db.IntegerProperty()
from random import choice
def catfacts():
facts = ["cat fact #1", ..., "cat fact #200"]
return choice(facts)
{% if condition1 %} X {% else %} Y {% endif %}
import datetime
import os
import re
from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.ext.webapp.util import run_wsgi_app
from twilio.rest import TwilioRestClient
from facts import catfacts
<html>
<head><title>cat facts for Your Phone!</title></head>
<body>
<h1>cat facts</h1>
<h2>Add your number to get a cat fact every 4 hours (for 24 hours of cat loving fun)!</h2>
<h2>
{% if error %}
You made a Meow-stake. Try again.
{% else %} {% if return %}
Added to cat-facts! Isn't that purrfect.
{% else %} {% if number %}
Already added! Thanks anyways.
{% endif %} {% endif %} {% endif %}
</h2>
<form method="post" action="/">
<label for="number">phone number:
<input type='text' name='number' />
</label>
<input type='submit' />
</form>
<img src="http://placekitten.com/g/200/200" />
<img src="http://placekitten.com/g/301/200" />
<img src="http://placekitten.com/g/101/200" />
<p>Random fact: </p>
<p>text STOP back to us and we'll unsubscribe you!</p>
<p>questions? comments? <a href="http://www.twitter.com/xoob">xoob</a></p>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-xxxxxxxx-x']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ?
'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</body>
</html>
import datetime
import os
import re
from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.ext.webapp.util import run_wsgi_app
from twilio.rest import TwilioRestClient
from facts import catfacts
MAX_COUNT = 6
def last_time():
return datetime.datetime.now() - datetime.timedelta(hours=4)
class Numbers(db.Model):
number = db.StringProperty()
created = db.DateTimeProperty(auto_now_add=True)
last_touched = db.DateTimeProperty(auto_now=True)
count = db.IntegerProperty()
class MainPage(webapp.RequestHandler):
def get(self):
template_values = { 'fact': catfacts() }
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))
def post(self):
number=self.request.get('number').strip().replace(" ", "").replace("-","")
template_values = { 'return': False, 'number': number, 'error': False }
if re.search(r'^\d+$',number) and len(number) == 10:
seenBefore = Numbers.gql("WHERE number=:1",number).get()
if not seenBefore:
newbie = Numbers(number=number, count=1)
newbie.put()
self.call_people(newbie)
template_values['return'] = True
else:
template_values['return'] = False
else:
template_values['error'] = True
template_values['fact'] = catfacts()
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))
def call_people(self, newbie):
self.work_it(newbie)
people = Numbers.gql("WHERE last_touched < :1", last_time()).fetch(5) for person in people: self.work_it(person) def call_person(self, person): SIZE = 155 fact = catfacts() account = "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4f" token = "72xxxxxxxxxxxxxxxxxxxxxxxxxxxx3a" client = TwilioRestClient(account, token) num_messages = len(fact) / SIZE + 1 if num_messages == 1: client.sms.messages.create(to="+1"+person.number, from_="+18053228518", body=fact ) else: for i in xrange(num_messages): client.sms.messages.create(to="+1"+person.number, from_="+18053228518", body="%d/%d: %s" % ((i+1), num_messages, fact[i*155:((i+1)*155)] )) person.count = person.count + 1 if person.count >= MAX_COUNT:
db.delete(person)
return
person.put()
application = webapp.WSGIApplication([('/', MainPage)], debug=False)
def main():
run_wsgi_app(application)
if __name__ == '__main__':
main()
class MainPage(webapp.RequestHandler):
def get(self):
template_values = { 'fact': catfacts() }
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))
def post(self):
number=self.request.get('number').strip().replace(" ", "").replace("-","")
template_values = { 'return': False, 'number': number, 'error': False }
if re.search(r'^\d+$',number) and len(number) == 10:
seenBefore = Numbers.gql("WHERE number=:1",number).get()
if not seenBefore:
newbie = Numbers(number=number, count=1)
newbie.put()
self.call_people(newbie)
template_values['return'] = True
else:
template_values['return'] = False
else:
template_values['error'] = True
template_values['fact'] = catfacts()
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))
def last_time():
return datetime.datetime.now() - datetime.timedelta(hours=4)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment