mirror of
https://github.com/spiffcode/hostile-takeover.git
synced 2026-02-18 07:34:35 -07:00
57 lines
1.9 KiB
Python
57 lines
1.9 KiB
Python
import models
|
|
import datetime
|
|
import basehandler
|
|
|
|
from google.appengine.ext import webapp
|
|
from google.appengine.api import images
|
|
from google.appengine.api import urlfetch
|
|
|
|
MAX_AGE_SECONDS = 60 * 60 * 24 * 7 * 52
|
|
|
|
class AvatarHandler(basehandler.BaseHandler):
|
|
def get(self):
|
|
hash = self.request.get('h')
|
|
if hash == '':
|
|
self.response.set_status(400, 'need hash parameter')
|
|
return
|
|
obj = models.AvatarModel.get(models.avatarmodel_key(hash))
|
|
if not obj:
|
|
self.response.set_status(400, 'avatar not found')
|
|
return
|
|
size = self.request.get('s')
|
|
if size == '' or size == '64':
|
|
self.set_caching_headers(MAX_AGE_SECONDS, public=True)
|
|
self.response.headers['Content-Type'] = 'image/jpeg'
|
|
self.response.out.write(obj.content)
|
|
return
|
|
self.response.set_status(400, 'size %s not supported' % size)
|
|
|
|
def prepare_avatar(avatar_data):
|
|
# Want 64x64 avatar. For now letterbox a square at full res and scale.
|
|
try:
|
|
img = images.Image(image_data=avatar_data)
|
|
x_left = 0.0
|
|
y_top = 0.0
|
|
x_right = float(img.width)
|
|
y_bottom = float(img.height)
|
|
if img.width > img.height:
|
|
x_left = float(img.width - img.height) / 2
|
|
x_right -= x_left
|
|
else:
|
|
y_top = float(img.height - img.width) / 2
|
|
y_bottom -= y_top
|
|
img.crop(x_left / img.width, y_top / img.height, x_right / img.width, y_bottom / img.height)
|
|
img.resize(64, 64)
|
|
return img.execute_transforms(output_encoding=images.JPEG)
|
|
except:
|
|
return None
|
|
|
|
def save_avatar(hash, avatar_data):
|
|
q = models.AvatarModel.all(keys_only=True)
|
|
q.filter("hash = ", hash)
|
|
r = q.fetch(1)
|
|
if len(r) == 0:
|
|
avatar_key = models.avatarmodel_key(hash)
|
|
kwds = dict(hash=hash, content=avatar_data)
|
|
models.AvatarModel.get_or_insert(avatar_key.name(), **kwds)
|