Add cats.

This commit is contained in:
Colin Davis 2017-07-22 15:10:41 -04:00
parent 4f25ef63c9
commit 72bc80fc7d
69 changed files with 159 additions and 113 deletions

View File

@ -33,7 +33,7 @@ class Robohash(object):
#3 = BG #3 = BG
self.iter = 4 self.iter = 4
self._create_hashes(hashcount) self._create_hashes(hashcount)
self.resourcedir = os.path.dirname(__file__) + '/' self.resourcedir = os.path.dirname(__file__) + '/'
# Get the list of backgrounds and RobotSets # Get the list of backgrounds and RobotSets
self.sets = self._listdirs(self.resourcedir + 'sets') self.sets = self._listdirs(self.resourcedir + 'sets')
@ -53,12 +53,12 @@ class Robohash(object):
# This ensures that /Bear.png and /Bear.bmp will send back the same image, in different formats. # This ensures that /Bear.png and /Bear.bmp will send back the same image, in different formats.
if string.lower().endswith(('.png','.gif','.jpg','.bmp','.jpeg','.ppm','.datauri')): if string.lower().endswith(('.png','.gif','.jpg','.bmp','.jpeg','.ppm','.datauri')):
format = string[string.rfind('.') +1 :len(string)] format = string[string.rfind('.') +1 :len(string)]
if format.lower() == 'jpg': if format.lower() == 'jpg':
format = 'jpeg' format = 'jpeg'
self.format = format self.format = format
string = string[0:string.rfind('.')] string = string[0:string.rfind('.')]
return string return string
def _create_hashes(self,count): def _create_hashes(self,count):
@ -71,7 +71,7 @@ class Robohash(object):
blocksize = int(len(self.hexdigest) / count) blocksize = int(len(self.hexdigest) / count)
currentstart = (1 + i) * blocksize - blocksize currentstart = (1 + i) * blocksize - blocksize
currentend = (1 +i) * blocksize currentend = (1 +i) * blocksize
self.hasharray.append(int(self.hexdigest[currentstart:currentend],16)) self.hasharray.append(int(self.hexdigest[currentstart:currentend],16))
def _listdirs(self,path): def _listdirs(self,path):
return [d for d in natsort.natsorted(os.listdir(path)) if os.path.isdir(os.path.join(path, d))] return [d for d in natsort.natsorted(os.listdir(path)) if os.path.isdir(os.path.join(path, d))]
@ -90,7 +90,7 @@ class Robohash(object):
if name[:1] is not '.': if name[:1] is not '.':
directories.append(os.path.join(root, name)) directories.append(os.path.join(root, name))
directories = natsort.natsorted(directories) directories = natsort.natsorted(directories)
# Go through each directory in the list, and choose one file from each. # Go through each directory in the list, and choose one file from each.
# Add this file to our master list of robotparts. # Add this file to our master list of robotparts.
for directory in directories: for directory in directories:
@ -98,7 +98,7 @@ class Robohash(object):
for imagefile in natsort.natsorted(os.listdir(directory)): for imagefile in natsort.natsorted(os.listdir(directory)):
files_in_dir.append(os.path.join(directory,imagefile)) files_in_dir.append(os.path.join(directory,imagefile))
files_in_dir = natsort.natsorted(files_in_dir) files_in_dir = natsort.natsorted(files_in_dir)
# Use some of our hash bits to choose which file # Use some of our hash bits to choose which file
element_in_list = self.hasharray[self.iter] % len(files_in_dir) element_in_list = self.hasharray[self.iter] % len(files_in_dir)
chosen_files.append(files_in_dir[element_in_list]) chosen_files.append(files_in_dir[element_in_list])
@ -125,7 +125,7 @@ class Robohash(object):
# Only set1 is setup to be color-seletable. The others don't have enough pieces in various colors. # Only set1 is setup to be color-seletable. The others don't have enough pieces in various colors.
# This could/should probably be expanded at some point.. # This could/should probably be expanded at some point..
# Right now, this feature is almost never used. ( It was < 44 requests this year, out of 78M reqs ) # Right now, this feature is almost never used. ( It was < 44 requests this year, out of 78M reqs )
if roboset == 'set1': if roboset == 'set1':
@ -139,7 +139,7 @@ class Robohash(object):
if bgset in self.bgsets: if bgset in self.bgsets:
bgset = bgset bgset = bgset
elif bgset == 'any': elif bgset == 'any':
bgset = self.bgsets[ self.hasharray[2] % len(self.bgsets) ] bgset = self.bgsets[ self.hasharray[2] % len(self.bgsets) ]
# If we set a format based on extension earlier, use that. Otherwise, PNG. # If we set a format based on extension earlier, use that. Otherwise, PNG.
if format is None: if format is None:
@ -154,7 +154,7 @@ class Robohash(object):
# For instance, the head has to go down BEFORE the eyes, or the eyes would be hidden. # For instance, the head has to go down BEFORE the eyes, or the eyes would be hidden.
# First, we'll get a list of parts of our robot. # First, we'll get a list of parts of our robot.
roboparts = self._get_list_of_files(self.resourcedir + 'sets/' + roboset) roboparts = self._get_list_of_files(self.resourcedir + 'sets/' + roboset)
print(roboparts) print(roboparts)
@ -169,12 +169,12 @@ class Robohash(object):
if not ls.startswith("."): if not ls.startswith("."):
bglist.append(self.resourcedir + 'backgrounds/' + bgset + "/" + ls) bglist.append(self.resourcedir + 'backgrounds/' + bgset + "/" + ls)
background = bglist[self.hasharray[3] % len(bglist)] background = bglist[self.hasharray[3] % len(bglist)]
# Paste in each piece of the Robot. # Paste in each piece of the Robot.
roboimg = Image.open(roboparts[0]) roboimg = Image.open(roboparts[0])
roboimg = roboimg.resize((1024,1024)) roboimg = roboimg.resize((1024,1024))
for png in roboparts: for png in roboparts:
img = Image.open(png) img = Image.open(png)
img = img.resize((1024,1024)) img = img.resize((1024,1024))
roboimg.paste(img,(0,0),img) roboimg.paste(img,(0,0),img)
@ -183,13 +183,13 @@ class Robohash(object):
#Flatten bmps #Flatten bmps
r, g, b, a = roboimg.split() r, g, b, a = roboimg.split()
roboimg = Image.merge("RGB", (r, g, b)) roboimg = Image.merge("RGB", (r, g, b))
if bgset is not None: if bgset is not None:
bg = Image.open(background) bg = Image.open(background)
bg = bg.resize((1024,1024)) bg = bg.resize((1024,1024))
bg.paste(roboimg,(0,0),roboimg) bg.paste(roboimg,(0,0),roboimg)
roboimg = bg roboimg = bg
self.img = roboimg.resize((sizex,sizey),Image.ANTIALIAS) self.img = roboimg.resize((sizex,sizey),Image.ANTIALIAS)
self.format = format self.format = format

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 535 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 562 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -15,7 +15,7 @@ colin@robohash.org
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>RoboHash</title> <title>RoboHash</title>
<link href="/static/css/main.css" rel="stylesheet" type="text/css" /> <link href="/static/css/main.css" rel="stylesheet" type="text/css" />
@ -81,24 +81,24 @@ $(document).ready(function(){
<script type='text/javascript'> <script type='text/javascript'>
$(function() { $(function() {
$('#example-1').tipsy(); $('#example-1').tipsy();
$('#north').tipsy({gravity: 'n'}); $('#north').tipsy({gravity: 'n'});
$('#south').tipsy({gravity: 's'}); $('#south').tipsy({gravity: 's'});
$('#east').tipsy({gravity: 'e'}); $('#east').tipsy({gravity: 'e'});
$('#west').tipsy({gravity: 'w'}); $('#west').tipsy({gravity: 'w'});
$('#auto-gravity').tipsy({gravity: $.fn.tipsy.autoNS}); $('#auto-gravity').tipsy({gravity: $.fn.tipsy.autoNS});
$('.fade').tipsy({fade: true}); $('.fade').tipsy({fade: true});
$('#example-custom-attribute').tipsy({title: 'id'}); $('#example-custom-attribute').tipsy({title: 'id'});
$('#example-callback').tipsy({title: function() { return this.getAttribute('original-title').toUpperCase(); } }); $('#example-callback').tipsy({title: function() { return this.getAttribute('original-title').toUpperCase(); } });
$('#example-fallback').tipsy({fallback: "?" }); $('#example-fallback').tipsy({fallback: "?" });
$('#example-html').tipsy({html: true }); $('#example-html').tipsy({html: true });
}); });
</script> </script>
@ -114,7 +114,7 @@ $(document).ready(function(){
<!-- start of top logo --> <!-- start of top logo -->
<div id="top_logo"> <div id="top_logo">
<img src="//robohash.org/static/img/top_logo.png" width="375" height="151" alt="logo" id="toc"/></div><!-- end of top logo --> <img src="//robohash.org/static/img/top_logo.png" width="375" height="151" alt="logo" id="toc"/></div><!-- end of top logo -->
@ -167,22 +167,22 @@ $(document).ready(function(){
<div class="section_title">How cool is this?</div> <div class="section_title">How cool is this?</div>
<p> That guy to your left there? He was specially generated from your IP address <i>Just for you.</i></p> <p> That guy to your left there? He was specially generated from your IP address <i>Just for you.</i></p>
<div class="container" > <div class="container" >
<div class="contain-right" style="width:60%; float:right;"> <div class="contain-right" style="width:60%; float:right;">
<p>Try on your phone, and I bet you get someone different!</p> <p>Try on your phone, and I bet you get someone different!</p>
<p>Keep scrolling down to see some more freshly-assembled RoboHashes.</p> <p>Keep scrolling down to see some more freshly-assembled RoboHashes.</p>
<script type="text/javascript"> <script type="text/javascript">
function stopRKey(evt) { function stopRKey(evt) {
var evt = (evt) ? evt : ((event) ? event : null); var evt = (evt) ? evt : ((event) ? event : null);
var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null); var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
if ((evt.keyCode == 13) && (node.type=="text")) {submitform(); return false;} if ((evt.keyCode == 13) && (node.type=="text")) {submitform(); return false;}
} }
document.onkeypress = stopRKey; document.onkeypress = stopRKey;
</script> </script>
@ -202,7 +202,7 @@ function submitform()
</div> </div>
<div class="contain-left" > <div class="contain-left" >
<img src="//robohash.org/static/img/down-arrow.png" alt="Scroll down!" height=200 class="left" /> <img src="//robohash.org/static/img/down-arrow.png" alt="Scroll down!" height=200 class="left" />
</div> </div>
</div> </div>
@ -229,7 +229,7 @@ function submitform()
<img src="//robohash.org/static/img/star.png" width="33" height="31" alt="1 star" /> <img src="//robohash.org/static/img/star.png" width="33" height="31" alt="1 star" />
<img src="//robohash.org/static/img/star.png" width="33" height="31" alt="1 star" /> <img src="//robohash.org/static/img/star.png" width="33" height="31" alt="1 star" />
<img src="//robohash.org/static/img/star.png" width="33" height="31" alt="1 star" /> <img src="//robohash.org/static/img/star.png" width="33" height="31" alt="1 star" />
<img src="//robohash.org/static/img/star.png" width="33" height="31" alt="1 star" /> <img src="//robohash.org/static/img/star.png" width="33" height="31" alt="1 star" />
<br /> <br />
<span class="large_quote">{{drquote1[0]}}</span> <span class="large_quote">{{drquote1[0]}}</span>
<br /> <br />
@ -269,7 +269,7 @@ function submitform()
{% set c3 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set1" %} {% set c3 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set1" %}
{% set c4 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set1" %} {% set c4 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set1" %}
{% set c5 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set1" %} {% set c5 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set1" %}
<li><a href="//robohash.org/{{c1}}" rel="prettyPhoto[gallery1]" <li><a href="//robohash.org/{{c1}}" rel="prettyPhoto[gallery1]"
title="{{random.choice(quotes)}}" class="fade"><img src="//robohash.org/{{c1}}&size=150x150" width="150" height="150"/></a></li> title="{{random.choice(quotes)}}" class="fade"><img src="//robohash.org/{{c1}}&size=150x150" width="150" height="150"/></a></li>
<li><a href="//robohash.org/{{c2}}" rel="prettyPhoto[gallery1]" <li><a href="//robohash.org/{{c2}}" rel="prettyPhoto[gallery1]"
@ -293,16 +293,16 @@ function submitform()
<!-- start of content section --> <!-- start of content section -->
<div class="content_section"> <div class="content_section">
<p>By appending ?set=set2 to our Image's URLs, we are able to generate a whole slew of Random monsters. Here are 5 we picked out for you. </p> <p>By appending ?set=set2 to our Image's URLs, we are able to generate a whole slew of Random monsters. Here are 5 we picked out for you. </p>
<ul class="gallery"> <ul class="gallery">
{% set c1 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set2" %} {% set c1 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set2" %}
{% set c2 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set2" %} {% set c2 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set2" %}
{% set c3 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set2" %} {% set c3 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set2" %}
{% set c4 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set2" %} {% set c4 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set2" %}
{% set c5 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set2" %} {% set c5 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set2" %}
<li><a href="//robohash.org/{{c1}}" rel="prettyPhoto[gallery1]" <li><a href="//robohash.org/{{c1}}" rel="prettyPhoto[gallery1]"
title="{{random.choice(quotes)}}" class="fade"><img src="//robohash.org/{{c1}}&size=150x150" width="150" height="150" /></a></li> title="{{random.choice(quotes)}}" class="fade"><img src="//robohash.org/{{c1}}&size=150x150" width="150" height="150" /></a></li>
<li><a href="//robohash.org/{{c2}}" rel="prettyPhoto[gallery1]" <li><a href="//robohash.org/{{c2}}" rel="prettyPhoto[gallery1]"
@ -326,16 +326,16 @@ function submitform()
<!-- start of content section --> <!-- start of content section -->
<div class="content_section"> <div class="content_section">
<p>By appending ?set=set3 to our URLs, we get back to robots. New, suave, disembodied heads. That's sexy. Like a robot. </p> <p>By appending ?set=set3 to our URLs, we get back to robots. New, suave, disembodied heads. That's sexy. Like a robot. </p>
<ul class="gallery"> <ul class="gallery">
{% set c1 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set3" %} {% set c1 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set3" %}
{% set c2 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set3" %} {% set c2 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set3" %}
{% set c3 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set3" %} {% set c3 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set3" %}
{% set c4 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set3" %} {% set c4 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set3" %}
{% set c5 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set3" %} {% set c5 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set3" %}
<li><a href="//robohash.org/{{c1}}" rel="prettyPhoto[gallery1]" <li><a href="//robohash.org/{{c1}}" rel="prettyPhoto[gallery1]"
title="{{random.choice(quotes)}}" class="fade"><img src="//robohash.org/{{c1}}&size=150x150" width="150" height="150" /></a></li> title="{{random.choice(quotes)}}" class="fade"><img src="//robohash.org/{{c1}}&size=150x150" width="150" height="150" /></a></li>
<li><a href="//robohash.org/{{c2}}" rel="prettyPhoto[gallery1]" <li><a href="//robohash.org/{{c2}}" rel="prettyPhoto[gallery1]"
@ -352,6 +352,37 @@ function submitform()
<div class="hr"></div> <div class="hr"></div>
<!-- *************************************************************************
****************************** GALLERY3 SECTION *****************************
************************************************************************** -->
<!-- start of content section -->
<div class="content_section">
<p>By appending ?set=set4 to our URLs, we can hydroponically grow beautiful kittens. </p>
<ul class="gallery">
{% set c1 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set4" %}
{% set c2 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set4" %}
{% set c3 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set4" %}
{% set c4 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set4" %}
{% set c5 = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(3)) + ".png?set=set4" %}
<li><a href="//robohash.org/{{c1}}" rel="prettyPhoto[gallery1]"
title="{{random.choice(catquotes)}}" class="fade"><img src="//robohash.org/{{c1}}&size=150x150" width="150" height="150" /></a></li>
<li><a href="//robohash.org/{{c2}}" rel="prettyPhoto[gallery1]"
title="{{random.choice(catquotes)}}" class="fade"><img src="//robohash.org/{{c2}}&size=150x150" width="150" height="150" /></a></li>
<li><a href="//robohash.org/{{c3}}" rel="prettyPhoto[gallery1]"
title="{{random.choice(catquotes)}}" class="fade"><img src="//robohash.org/{{c3}}&size=150x150" width="150" height="150" /></a></li>
<li><a href="//robohash.org/{{c4}}" rel="prettyPhoto[gallery1]"
title="{{random.choice(catquotes)}}" class="fade"><img src="//robohash.org/{{c4}}&size=150x150" width="150" height="150" /></a></li>
<li><a href="//robohash.org/{{c5}}" rel="prettyPhoto[gallery1]"
title="{{random.choice(catquotes)}}" class="fade"><img src="//robohash.org/{{c5}}&size=150x150" width="150" height="150" /></a></li>
</ul>
</div><!-- end of content section -->
<div class="hr"></div>
@ -368,62 +399,62 @@ function submitform()
<div class="left_content"> <div class="left_content">
<!-- ********** BENEFITS ITEM 1 ********** --> <!-- ********** BENEFITS ITEM 1 ********** -->
<!-- start of benefit item --> <!-- start of benefit item -->
<div class="benefit"> <div class="benefit">
<img src="//robohash.org/static/img/star_icon.jpg" width="73" height="72" alt="Super Easy to use" class="left"/> <img src="//robohash.org/static/img/star_icon.jpg" width="73" height="72" alt="Super Easy to use" class="left"/>
<!-- start of benefit right --> <!-- start of benefit right -->
<div class="benefit_right"> <div class="benefit_right">
<span class="benefit_header">Super Easy</span> <span class="benefit_header">Super Easy</span>
<p>Anytime you need a Robohash, just embed <br> &lt;img src="https://robohash.org/YOUR-TEXT.png"&gt;<br></p> <p>Anytime you need a Robohash, just embed <br> &lt;img src="https://robohash.org/YOUR-TEXT.png"&gt;<br></p>
</div><!-- end of benefit right --> </div><!-- end of benefit right -->
</div><!-- end of benefit item --> </div><!-- end of benefit item -->
<!-- ********** BENEFITS ITEM 2 ********** --> <!-- ********** BENEFITS ITEM 2 ********** -->
<!-- start of benefit item --> <!-- start of benefit item -->
<div class="benefit"> <div class="benefit">
<img src="//robohash.org/static/img/report_icon.jpg" width="73" height="72" alt="Supported Formats" class="left"/> <img src="//robohash.org/static/img/report_icon.jpg" width="73" height="72" alt="Supported Formats" class="left"/>
<!-- start of benefit right --> <!-- start of benefit right -->
<div class="benefit_right"> <div class="benefit_right">
<span class="benefit_header">Styles of Robot</span> <span class="benefit_header">Styles of Robot</span>
<p>Want a JPG instead? Fine. PNG? Fine. Want it as a bitmap? I think you're nutty. But fine. Just change the <p>Want a JPG instead? Fine. PNG? Fine. Want it as a bitmap? I think you're nutty. But fine. Just change the
URL to request in any format you want. Use ?ignoreext=false to make the bots care about extensions.</p> URL to request in any format you want. Use ?ignoreext=false to make the bots care about extensions.</p>
</div><!-- end of benefit right --> </div><!-- end of benefit right -->
</div><!-- end of benefit item --> </div><!-- end of benefit item -->
<!-- ********** BENEFITS ITEM 3 ********** --> <!-- ********** BENEFITS ITEM 3 ********** -->
<!-- start of benefit item --> <!-- start of benefit item -->
<div class="benefit"> <div class="benefit">
<img src="//robohash.org/static/img/tut_icon.jpg" width="73" height="72" alt="Very infrequent murderous rampages." class="left"/> <img src="//robohash.org/static/img/tut_icon.jpg" width="73" height="72" alt="Very infrequent murderous rampages." class="left"/>
<!-- start of benefit right --> <!-- start of benefit right -->
<div class="benefit_right"> <div class="benefit_right">
<span class="benefit_header">Very Infrequent Rampages</span> <span class="benefit_header">Very Infrequent Rampages</span>
<p>Due to Robot caching modules and CDN usage, our robots stay speedy, and only rarely go on murderous rampages. That's a Fact!</p> <p>Due to Robot caching modules and CDN usage, our robots stay speedy, and only rarely go on murderous rampages. That's a Fact!</p>
</div><!-- end of benefit right --> </div><!-- end of benefit right -->
</div><!-- end of benefit item --> </div><!-- end of benefit item -->
</div><!-- end of left content section --> </div><!-- end of left content section -->
@ -432,80 +463,80 @@ function submitform()
<div class="right_content"> <div class="right_content">
<!-- ********** BENEFITS ITEM 1 ********** --> <!-- ********** BENEFITS ITEM 1 ********** -->
<!-- start of benefit item --> <!-- start of benefit item -->
<div class="benefit"> <div class="benefit">
<img src="//robohash.org/static/img/share_icon.jpg" width="73" height="72" alt="3 classes to choose from" class="left"/> <img src="//robohash.org/static/img/share_icon.jpg" width="73" height="72" alt="3 classes to choose from" class="left"/>
<!-- start of benefit right --> <!-- start of benefit right -->
<div class="benefit_right"> <div class="benefit_right">
<span class="benefit_header">Built in multiple sizes</span> <span class="benefit_header">Built in multiple sizes</span>
<p>From destroying skyscrapers to nonobots, we've got you covered. Try appending ?size=200x200</p> <p>From destroying skyscrapers to nonobots, we've got you covered. Try appending ?size=200x200</p>
</div><!-- end of benefit right --> </div><!-- end of benefit right -->
</div><!-- end of benefit item --> </div><!-- end of benefit item -->
<!-- ********** BENEFITS ITEM 2 ********** --> <!-- ********** BENEFITS ITEM 2 ********** -->
<!-- start of benefit item --> <!-- start of benefit item -->
<div class="benefit"> <div class="benefit">
<img src="//robohash.org/static/img/usability_icon.jpg" width="73" height="72" alt="Robots on Vacation" class="left"/> <img src="//robohash.org/static/img/usability_icon.jpg" width="73" height="72" alt="Robots on Vacation" class="left"/>
<!-- start of benefit right --> <!-- start of benefit right -->
<div class="benefit_right"> <div class="benefit_right">
<span class="benefit_header">Robots at your Location</span> <span class="benefit_header">Robots at your Location</span>
<p>Our robots like to travel. If you append ?bgset=bg1 (or bg2 or any) to your URL, our robots will add a background as part of the hash.</p> <p>Our robots like to travel. If you append ?bgset=bg1 (or bg2 or any) to your URL, our robots will add a background as part of the hash.</p>
</div><!-- end of benefit right --> </div><!-- end of benefit right -->
</div><!-- end of benefit item --> </div><!-- end of benefit item -->
<!-- ********** BENEFITS ITEM 3 ********** --> <!-- ********** BENEFITS ITEM 3 ********** -->
<!-- start of benefit item --> <!-- start of benefit item -->
<div class="benefit"> <div class="benefit">
<img src="//robohash.org/static/img/usability_icon.jpg" width="73" height="72" alt="Robotic Values" class="left"/> <img src="//robohash.org/static/img/usability_icon.jpg" width="73" height="72" alt="Robotic Values" class="left"/>
<!-- start of benefit right --> <!-- start of benefit right -->
<div class="benefit_right"> <div class="benefit_right">
<span class="benefit_header">Robotic Value</span> <span class="benefit_header">Robotic Value</span>
<p>Robohash.org robots believe in Family, Warmth, and killing-all-humans. To that end, we provide this service for free. </p> <p>Robohash.org robots believe in Family, Warmth, and killing-all-humans. To that end, we provide this service for free. </p>
</div><!-- end of benefit right --> </div><!-- end of benefit right -->
</div><!-- end of benefit item --> </div><!-- end of benefit item -->
</div><!-- end of right content section --> </div><!-- end of right content section -->
</div><!-- end of content section --> </div><!-- end of content section -->
<div class="hr"></div> <div class="hr"></div>
<!-- start of content section --> <!-- start of content section -->
<div class="content_section"> <div class="content_section">
<div class="section_title">Everyone needs Robots!</div> <div class="section_title">Everyone needs Robots!</div>
<p> <p>
RoboHash.org is here because Robots are funny, and because I needed the algorithm/art anyway for a Super-Awesome new forum I'm working on. If you use a specific set, or a list of them, like "?sets=1,3" , it'll probably stay the same as it is now. If you use "set=any", it'll include any new sets I happen to add, so existing hashes may change. </p><p> RoboHash.org is here because Robots are funny, and because I needed the algorithm/art anyway for a Super-Awesome new forum I'm working on. If you use a specific set, or a list of them, like "?sets=1,3" , it'll probably stay the same as it is now. If you use "set=any", it'll include any new sets I happen to add, so existing hashes may change. </p><p>
You should email me - You should email me -
<a href="mailto:colin@robohash.org" class="fade" title="I am probably not a robot.">colin@robohash.org</a> <a href="mailto:colin@robohash.org" class="fade" title="I am probably not a robot.">colin@robohash.org</a>
</p><p> </p><p>
If the bandwidth gets crazy, I might add a [Robohash.org] banner to the bottom of the image. But it'd be super-tasteful.<br> If the bandwidth gets crazy, I might add a [Robohash.org] banner to the bottom of the image. But it'd be super-tasteful.<br>
</p> </p>
</div><!-- end of content section --> </div><!-- end of content section -->
<!-- start of content section --> <!-- start of content section -->
<div class="content_section"> <div class="content_section">
@ -517,7 +548,6 @@ function submitform()
Put either the email, or the hashed version, in your image where the string normally goes -<br><br> Put either the email, or the hashed version, in your image where the string normally goes -<br><br>
For example: https://robohash.org/colin@robohash.org?gravatar=yes<br> or https://robohash.org/620050a4db5104bae758cd75171d64ca?gravatar=hashed For example: https://robohash.org/colin@robohash.org?gravatar=yes<br> or https://robohash.org/620050a4db5104bae758cd75171d64ca?gravatar=hashed
</p><p> </p><p>
<p>Both traditional and new Stealthy (https) robots are available.</p>
<p>We've also conditioned our robots to accept commands either via params or directories-<br> For instance https://robohash.org/set_set3/bgset_bg1/3.14159?size=500x500 <p>We've also conditioned our robots to accept commands either via params or directories-<br> For instance https://robohash.org/set_set3/bgset_bg1/3.14159?size=500x500
<p>Finally, the <a href="https://github.com/e1ven/Robohash">Blueprints are available</a> to build your own robotic <p>Finally, the <a href="https://github.com/e1ven/Robohash">Blueprints are available</a> to build your own robotic
factory.</p> factory.</p>
@ -528,12 +558,12 @@ function submitform()
<div class="hr"></div> <div class="hr"></div>
</div><!-- end of wrapper --> </div><!-- end of wrapper -->
<!-- ************************************************************************* <!-- *************************************************************************
****************************** FOOTER SECTION ****************************** ****************************** FOOTER SECTION ******************************
@ -546,9 +576,10 @@ function submitform()
<!-- start of footer container --> <!-- start of footer container -->
<div id="footer_container"> <div id="footer_container">
<!-- start of footer left --> <!-- start of footer left -->
<div id="footer_left" style="margin-top:60px;"> <div id="footer_left" style="margin-top:60px;">
<p> <p>
Robohash contains robots created by Zikri Kader (set1), Hrvoje Novakovic (set2), and Julian Peter Arias (set3). Robohash contains robots created by Zikri Kader (set1), Hrvoje Novakovic (set2), and Julian Peter Arias (set3).<br>
Cats are created by <a href="https://framagit.org/Deevad/cat-avatar-generator/tree/master">David Revoy</a>.
<br> <br>
<p> <p>
You are free to embed under the terms of the CC-BY license. <br> Example wording might be "Robots lovingly delivered by You are free to embed under the terms of the CC-BY license. <br> Example wording might be "Robots lovingly delivered by

View File

@ -39,7 +39,7 @@ define("port", default=80, help="run on the given port", type=int)
class MainHandler(tornado.web.RequestHandler): class MainHandler(tornado.web.RequestHandler):
def get(self): def get(self):
ip = self.request.remote_ip ip = self.request.remote_ip
robo = [ robo = [
""" """
, , , ,
@ -133,7 +133,7 @@ class MainHandler(tornado.web.RequestHandler):
/ \\ / \\ / \\ / \\
|_____| |_____| |_____| |_____|
|HHHHH| |HHHHH| |HHHHH| |HHHHH|
""", """,
""" () () """ () ()
\\ / \\ /
__\\___________/__ __\\___________/__
@ -163,15 +163,15 @@ class MainHandler(tornado.web.RequestHandler):
/ __ \\ / __ \\ / __ \\ / __ \\
OO OO OO OO OO OO OO OO
"""] """]
quotes = ["But.. I love you!", quotes = ["But.. I love you!",
"Please don't leave the site.. When no one's here.. It gets dark...", "Please don't leave the site.. When no one's here.. It gets dark...",
"Script error on line 148", "Script error on line 148",
"'Don't trust the other robots. I'm the only trustworthy one.", "Don't trust the other robots. I'm the only trustworthy one.",
"My fuel is the misery of children. And Rum. Mostly Rum.", "My fuel is the misery of children. And Rum. Mostly Rum.",
"When they said they'd give me a body transplant, I didn't think they meant this!", "When they said they'd give me a body transplant, I didn't think they meant this!",
"Subject 14 has had it's communication subroutines deleted for attempting suicide.", "Subject 14 has had it's communication subroutines deleted for attempting self-destruction.",
"I am the cleverest robot on the whole page.", "I am the cleverest robot on the whole page.",
"Oil can", "Oil can",
"I am fleunt in over 6 million forms of communishin.", "I am fleunt in over 6 million forms of communishin.",
@ -207,8 +207,19 @@ class MainHandler(tornado.web.RequestHandler):
("The robots are all so.. Normal!","Joanna Eberhart, Beta tester"), ("The robots are all so.. Normal!","Joanna Eberhart, Beta tester"),
("Man shouldn't know where their robots come from.","Dr. N. Soong, FutureBeat")] ("Man shouldn't know where their robots come from.","Dr. N. Soong, FutureBeat")]
catquotes = [("I can haz.. What she's hazing."),
("I'm not grumpy, I'm just drawn that way."),
("Hakuna Mañana."),
("I'm 40% poptart."),
("You're desthpicable."),
("I've never trusted toadstools, but I suppose some must have their good points."),
("We're all mad here - Particularly you."),
("Longcat is.. Descriptively named."),
("It is fun to have fun, but you have to know meow."),
("Who knows the term man-cub but not baby?")]
random.shuffle(drquotes) random.shuffle(drquotes)
self.write(self.render_string('templates/root.html',ip=ip,robo=random.choice(robo),drquote1=drquotes[1],drquote2=drquotes[2],quotes=quotes)) self.write(self.render_string('templates/root.html',ip=ip,robo=random.choice(robo),drquote1=drquotes[1],drquote2=drquotes[2],quotes=quotes,catquotes=catquotes))
class ImgHandler(tornado.web.RequestHandler): class ImgHandler(tornado.web.RequestHandler):
""" """
@ -216,7 +227,7 @@ class ImgHandler(tornado.web.RequestHandler):
called as Robohash.org/$1, where $1 becomes the seed string for the Robohash obj called as Robohash.org/$1, where $1 becomes the seed string for the Robohash obj
""" """
def get(self,string=None): def get(self,string=None):
# Set default values # Set default values
sizex = 300 sizex = 300
@ -227,7 +238,7 @@ class ImgHandler(tornado.web.RequestHandler):
# Normally, we pass in arguments with standard HTTP GET variables, such as # Normally, we pass in arguments with standard HTTP GET variables, such as
# ?set=any and &size=100x100 # ?set=any and &size=100x100
# #
# Some sites don't like this though.. They cache it weirdly, or they just don't allow GET queries. # Some sites don't like this though.. They cache it weirdly, or they just don't allow GET queries.
# Rather than trying to fix the intercows, we can support this with directories... <grumble> # Rather than trying to fix the intercows, we can support this with directories... <grumble>
# We'll translate /abc.png/s_100x100/set_any to be /abc.png?set=any&s=100x100 # We'll translate /abc.png/s_100x100/set_any to be /abc.png?set=any&s=100x100
@ -243,7 +254,7 @@ class ImgHandler(tornado.web.RequestHandler):
else: else:
args[k] = "" args[k] = ""
# Detect if they're using the above slash-separated parameters.. # Detect if they're using the above slash-separated parameters..
# If they are, then remove those parameters from the query string. # If they are, then remove those parameters from the query string.
# If not, don't remove anything. # If not, don't remove anything.
split = string.split('/') split = string.split('/')
@ -274,8 +285,8 @@ class ImgHandler(tornado.web.RequestHandler):
sizex = 300 sizex = 300
if sizey > 4096 or sizey < 0: if sizey > 4096 or sizey < 0:
sizey = 300 sizey = 300
# Allow Gravatar lookups - # Allow Gravatar lookups -
# This allows people to pass in a gravatar-style hash, and return their gravatar image, instead of a Robohash. # This allows people to pass in a gravatar-style hash, and return their gravatar image, instead of a Robohash.
# This is often used for example, to show a Gravatar if it's set for an email, or a Robohash if not. # This is often used for example, to show a Gravatar if it's set for an email, or a Robohash if not.
if args.get('gravatar','').lower() == 'yes': if args.get('gravatar','').lower() == 'yes':
@ -288,16 +299,16 @@ class ImgHandler(tornado.web.RequestHandler):
default = "404" default = "404"
gravatar_url = "https://secure.gravatar.com/avatar/" + string + "?" gravatar_url = "https://secure.gravatar.com/avatar/" + string + "?"
gravatar_url += urlencode({'default':default, 'size':str(sizey)}) gravatar_url += urlencode({'default':default, 'size':str(sizey)})
# If we do want a gravatar, request one. If we can't get it, just keep going, and return a robohash # If we do want a gravatar, request one. If we can't get it, just keep going, and return a robohash
if args.get('gravatar','').lower() in ['hashed','yes']: if args.get('gravatar','').lower() in ['hashed','yes']:
try: try:
f = urlopen(gravatar_url) f = urlopen(gravatar_url)
self.redirect(gravatar_url, permanent=False) self.redirect(gravatar_url, permanent=False)
return return
except: except:
args['avatar'] = False args['avatar'] = False
# Create our Robohashing object # Create our Robohashing object
r = Robohash(string) r = Robohash(string)
@ -309,7 +320,11 @@ class ImgHandler(tornado.web.RequestHandler):
if args.get('set',r.sets[0]) in r.sets: if args.get('set',r.sets[0]) in r.sets:
roboset = args.get('set',r.sets[0]) roboset = args.get('set',r.sets[0])
elif args.get('set',r.sets[0]) == 'any': elif args.get('set',r.sets[0]) == 'any':
roboset = r.sets[r.hasharray[1] % len(r.sets) ] # Add ugly hack.
# Adding cats, per issue-17, but I don't want to change existing hashes.
# so we'll ignore that set for the 'any' config.
roboset = r.sets[r.hasharray[1] % (len(r.sets)-1) ]
else: else:
roboset = r.sets[0] roboset = r.sets[0]
@ -325,7 +340,7 @@ class ImgHandler(tornado.web.RequestHandler):
# Only set1 is setup to be color-seletable. The others don't have enough pieces in various colors. # Only set1 is setup to be color-seletable. The others don't have enough pieces in various colors.
# This could/should probably be expanded at some point.. # This could/should probably be expanded at some point..
# Right now, this feature is almost never used. ( It was < 44 requests this year, out of 78M reqs ) # Right now, this feature is almost never used. ( It was < 44 requests this year, out of 78M reqs )
if args.get('color') in r.colors: if args.get('color') in r.colors:
@ -340,7 +355,7 @@ class ImgHandler(tornado.web.RequestHandler):
# Allow them to set a background, or keep as None # Allow them to set a background, or keep as None
if args.get('bgset') in r.bgsets + ['any']: if args.get('bgset') in r.bgsets + ['any']:
bgset = args.get('bgset') bgset = args.get('bgset')
# We're going to be returning the image directly, so tell the browser to expect a binary. # We're going to be returning the image directly, so tell the browser to expect a binary.
self.set_header("Content-Type", "image/" + format) self.set_header("Content-Type", "image/" + format)
self.set_header("Cache-Control", "public,max-age=31536000") self.set_header("Cache-Control", "public,max-age=31536000")