def handle_icon_push(self, user, request): """ This is called when is received. Save the icon image. """ validator = {'icon': str, 'iconid': str, 'version': lambda i: is_unsigned_int('version', i) } if not validate(validator, request): return None icon = request['icon'] iconid = request['iconid'] if iconid == 'user': if user.get('faceversion') != request['version']: # This is an outdated version of the icon.. return None if icon == '': # if we got an empty string, user removed the icon # giving None to save_face removes the picture delete_face(user) elif not save_face(user, icon): warning('Could not save face for %s: %d bytes\n' % (user.tag(), len(icon))) return None user.set('myfaceversion', request['version']) self.announce_user_change(user, what=(PROFILE_ICON_CHANGED, None)) elif iconid.startswith('c:'): cname = iconid[2:] if cname == DEFAULT_COMMUNITY_NAME: return None com = self.get_ordinary_community(cname) if com == None: return None if com.get('iconversion') != request['version']: # This is an outdated version of the icon.. return None if com.get('iconlocked'): return None if icon == '': delete_community_icon(com) elif not save_community_icon(com, icon): warning('Failed to update community icon: %s\n' % cname) return None com.set('myiconversion', request['version']) self.announce_community_change(com) return None
def set_community_icon(self, com, icon_fname): if icon_fname == None: delete_community_icon(com) else: icon = read_file_contents(icon_fname) if icon == None: warning('Can not set community icon from %s\n' % icon_fname) return False if not save_community_icon(com, icon): warning('Could not save community icon from %s\n' % icon_fname) return False # New icon version so other users will be notified. Random number # because this is a distributed system version = randint(0, 1 << 32 - 1) com.set('iconversion', version) com.set('myiconversion', version) self.announce_community_change(com) return True