Allow for different size minecraft avatars, and fix caching

This commit is contained in:
Trever Fischer
2012-04-17 00:21:58 -04:00
parent 2aeb6fc9cc
commit 90d47a30b1
3 changed files with 22 additions and 7 deletions

View File

@@ -5,11 +5,24 @@ register = template.Library()
@register.tag
def avatar(parser, token):
return AvatarNode(token.split_contents()[1])
contents = token.split_contents()
if len(contents) > 2:
sizevar = contents[2]
else:
sizevar = None
return AvatarNode(contents[1], sizevar)
class AvatarNode(template.Node):
def __init__(self, uservar):
def __init__(self, uservar, sizevar):
self.__user = template.Variable(uservar)
if sizevar:
self.__size = template.Variable(sizevar)
else:
self.__size = None
def render(self, context):
return '<img src="%s"/>'%(reverse('minecraft.views.avatar', kwargs={'username': self.__user.resolve(context)}),)
if self.__size:
size = self.__size.resolve(context)
else:
size = 64
return '<img src="%s"/>'%(reverse('minecraft.views.avatar', kwargs={'username': self.__user.resolve(context), 'size': size}),)

View File

@@ -1,6 +1,7 @@
from django.conf.urls.defaults import patterns, include, url
urlpatterns = patterns('minecraft',
url(r'^avatar/(?P<size>[0-9]+)/(?P<username>.*).png$', 'views.avatar'),
url(r'^avatar/(?P<username>.*).png$', 'views.avatar'),
url(r'^rules/(?P<server>.*):(?P<port>[0-9]+)$', 'views.rules'),
url(r'^rules/(?P<server>.*)$', 'views.rules', kwargs={'port':25565})

View File

@@ -11,8 +11,9 @@ from httplib import HTTPException
import models
import os
def avatar(request, username):
avatar = cache.get('minecraft-avatar-%s'%(username))
def avatar(request, username, size=64):
avatar = cache.get('minecraft-avatar-%s-%s'%(username, size))
size = int(size)
if avatar is None:
try:
skinStream = urlopen("http://minecraft.net/skin/%s.png"%(username))
@@ -21,11 +22,11 @@ def avatar(request, username):
imgStream = StringIO(skinStream.read())
img = Image.open(imgStream)
img = img.crop((8, 8, 16,16))
img = img.resize((64, 64), Image.NEAREST)
img = img.resize((size, size), Image.NEAREST)
buf = StringIO()
img.save(buf, "PNG")
avatar = buf.getvalue()
cache.set('minecraft-avatar-%s', avatar, 86400)
cache.set('minecraft-avatar-%s-%s'%(username, size), avatar, 86400)
return HttpResponse(avatar, content_type="image/png")
def rules(request, server, port):