def refresh_container_friends(self, container_user):
        ''' gets container friends via REST API and saves to data store
        '''
        #container_user.friend_ids = self.get_friend_ids_v08(container_user.container_user_id)
        logging.info('in load container friends, id is %s' % container_user.container_user_id)
        friends = self.get_friends_v08(container_user.container_user_id)
        logging.info('friends: %s' % friends)
        user_friends = set(container_user.friend_ids)
        simple_users = {}
        friend_keys = set()

        for friend in friends['Friends']:
            domain = 'myspace.com'
            user_id = str(friend['userId'])
            user_key = domain + ":" + user_id;
            user = Container_user.get_by_key_name(user_key)
            if user == None:
                logging.debug('user not found at friend %s' % friend)
                logging.debug('user not found at userid %s' % user_id)
                #raise Exception('no user? wtf?')
                user = Container_user(key_name = user_key,
                                      display_name = self.make_safe(friend['name']),
                                        container_user_id = user_id,
                                        domain = domain,
                                        profile_url = db.Link(friend['webUri']),
                                        profile_image_url = db.Link(friend['largeImage']),
                                        character = None)
            else:
                if user.character:
                    friend_keys.add(user.character.key())
                    
            user.ip_address = "1.2.3.4"
            if friend.has_key('hasAppInstalled'):
                user.has_app = friend['hasAppInstalled']
            else:
                user.has_app = False
            user.friend_ids = []
            user.put()
            user_friends.add(user.container_user_id)
            
            simple_user = {}
            simple_user['user_id'] = user.container_user_id
            simple_user['domain'] = user.domain
            simple_user['display_name'] = user.display_name
            simple_user['has_app'] = user.has_app
            simple_users[user.container_user_id] = simple_user
             
        container_user.friend_ids = list(user_friends)
        container_user.friend_count = len(user_friends)
        container_user.put()
        
        if container_user.character:
            container_user.character.friend_count = len(friend_keys)
            container_user.character.friend_keys = list(friend_keys)
            container_user.character.put()
        
        # todo: popuplate character friends
        logging.debug('exit container friends')
        return simple_users #for json serialization
    def record_sent_invites(self, container_user, invitees, brick_description):
        if not brick_description or brick_description == 'null':
            raise  RuntimeError('no brick_description supplied for record_sent_invites')
        for index in invitees:
#            q = Brick.all().filter('brick_description', brick_description)
#            brick = q.fetch(1) #todo: change to get()?
#            logging.info('brick desc %s' % brick_description)
#            logging.info('brick! %s' % brick)
            key = '%s_%s_%s_%s' % (container_user.domain, container_user.container_user_id, invitees[index], brick_description)
            invite = Player_invite.get_by_key_name(key)
            if invite:
                invite.is_active = True #re-use invite, player sent another from same brick
            else:
                invitee_user_key = '%s:%s' % (container_user.domain, invitees[index])
                invitee_user = Container_user.get_by_key_name(invitee_user_key)
                invitee_character = None
                if invitee_user and invitee_user.character:
                    invitee_character = invitee_user.character
            
                invite = Player_invite(key_name = key,
                                       inviter_container_user = container_user,
                                       inviter_character = container_user.character,  
                                       domain = container_user.domain, 
                                       invitee_container_user_id = invitees[index],
                                       invitee_container_user = invitee_user,
                                       invitee_character = invitee_character,
                                       inviter_brick_description = brick_description,
                                       invitee_bricks = [],
                                       invite_time = datetime.utcnow(),
                                       is_active = True,
                                       invite_successful = None)
            invite.put()
 def get_character_users(self, character):
     ''' find container users of the character
     '''
     query = Container_user.all()
     query.filter('character', character)
     users = query.fetch(1000)
     return users
    def save_container_friends(self, container_user, friends):
        ''' takes a list of friends and saves to data store
            the friend list is gathered by the browser and sent via ajax
        '''
        saved = 0
        failed = 0
        if not container_user.character:
            return saved, failed

        user_friend_ids = set(
        )  # set(container_user.friend_ids) don't save existing friends
        character_keys = set()

        #    has_app = db.BooleanProperty()
        #    friend_ids = db.StringListProperty()
        #    character = db.ReferenceProperty(reference_class=Character)

        for friend in friends.itervalues():
            domain = container_user.domain
            user_id = friend['id']
            try:
                profile_image_url = db.Link(friend['thumbnailUrl'])
            except Exception, e:
                logging.debug(
                    'bad thumbnail url (or no image) for friend: %s' % friend)
                logging.debug(e)
                profile_image_url = 'http://static.ak.fbcdn.net/rsrc.php/zBPOE/hash/k9bm7yii.gif'  #use facebook no-pic image
                failed += 1
                continue

            user_key = domain + ":" + user_id
            user = Container_user.get_by_key_name(user_key)
            #            if not user:
            #                user = Container_user(key_name = user_key,
            #                                        container_user_id = user_id,
            #                                        domain = domain,
            #                                        character = None,
            #                                        display_name = friend['displayName'],
            #                                        profile_image_url = profile_image_url)
            #            else: #update existing fields:
            if user:
                user.display_name = friend['displayName']
                user.profile_image_url = profile_image_url
                if user.character:
                    character_keys.add(
                        user.character.key()
                    )  #this friend has a character.  Add it to the character's friend list
                if 'profileUrl' in friend:
                    user.profile_url = db.Link(friend['profileUrl'])
                user.ip_address = "1.2.3.4"
                if friend.has_key('hasAppInstalled'):
                    user.has_app = friend['hasAppInstalled']
                else:
                    user.has_app = False
                user.friend_ids = []
                user.put()
                user_friend_ids.add(user.container_user_id)
                saved += 1
    def save_container_friends(self, container_user, friends):
        ''' takes a list of friends and saves to data store
            the friend list is gathered by the browser and sent via ajax
        '''
        saved = 0
        failed = 0
        if not container_user.character:
            return saved, failed
        
        user_friend_ids = set() # set(container_user.friend_ids) don't save existing friends
        character_keys = set()

#    has_app = db.BooleanProperty()
#    friend_ids = db.StringListProperty()
#    character = db.ReferenceProperty(reference_class=Character)

        for friend in friends.itervalues():
            domain = container_user.domain
            user_id = friend['id']
            try:
                profile_image_url = db.Link(friend['thumbnailUrl'])
            except Exception, e:
                logging.debug('bad thumbnail url (or no image) for friend: %s' % friend)
                logging.debug(e)
                profile_image_url = 'http://static.ak.fbcdn.net/rsrc.php/zBPOE/hash/k9bm7yii.gif' #use facebook no-pic image
                failed += 1
                continue
                
            user_key = domain + ":" + user_id;
            user = Container_user.get_by_key_name(user_key)
#            if not user:
#                user = Container_user(key_name = user_key,
#                                        container_user_id = user_id,
#                                        domain = domain,
#                                        character = None,
#                                        display_name = friend['displayName'],
#                                        profile_image_url = profile_image_url)
#            else: #update existing fields:
            if user:
                user.display_name = friend['displayName']
                user.profile_image_url = profile_image_url
                if user.character:
                    character_keys.add(user.character.key()) #this friend has a character.  Add it to the character's friend list
                if 'profileUrl' in friend:
                    user.profile_url = db.Link(friend['profileUrl'])
                user.ip_address = "1.2.3.4"
                if friend.has_key('hasAppInstalled'):
                    user.has_app = friend['hasAppInstalled']
                else:
                    user.has_app = False
                user.friend_ids = []
                user.put()
                user_friend_ids.add(user.container_user_id)
                saved += 1
Пример #6
0
            elif domain == 'facebook.com':
                viewer_info = self.get_facebook_viewer_info(container_user_id)
                logging.info('facebook profile: %s' % viewer_info)
            elif domain == 'mock':
                viewer_info = self.get_mock_viewer_info(container_user_id)
                domain = viewer_info['domain']
                logging.info('mock profile: %s' % viewer_info)
            else:
                logging.info('unknown domain - can\'t set viewer info')
        except Exception, e:
            logging.info('wtf excep')
            logging.exception(e)
        logging.info('looking up container user')
        logging.debug('trying debug log')
        container_user_key = domain + ":" + container_user_id
        container_user = Container_user.get_by_key_name(container_user_key)

        if container_user:
            #container user already associated with pyramid user
            logging.info('found container user, checking for changes')

            if viewer_info:
                if 'display_name' in viewer_info and container_user.display_name != viewer_info[
                        'display_name']:
                    container_user.display_name = viewer_info['display_name']
                if 'profile_image_url' in viewer_info and container_user.profile_image_url != viewer_info[
                        'profile_image_url']:
                    container_user.profile_image_url = viewer_info[
                        'profile_image_url']
                if 'profile_url' in viewer_info and container_user.profile_url != viewer_info[
                        'profile_url']:
     elif domain == 'facebook.com' :
         viewer_info = self.get_facebook_viewer_info(container_user_id)
         logging.info('facebook profile: %s' % viewer_info)
     elif domain == 'mock' :
         viewer_info = self.get_mock_viewer_info(container_user_id)
         domain = viewer_info['domain']
         logging.info('mock profile: %s' % viewer_info)
     else:                
         logging.info('unknown domain - can\'t set viewer info')
 except Exception, e:
     logging.info('wtf excep')
     logging.exception(e)
 logging.info('looking up container user')
 logging.debug('trying debug log')
 container_user_key = domain + ":" + container_user_id
 container_user = Container_user.get_by_key_name(container_user_key)
 
 if container_user:
     #container user already associated with pyramid user
     logging.info('found container user, checking for changes')
     
     if viewer_info:
         if 'display_name' in viewer_info and container_user.display_name != viewer_info['display_name']:
             container_user.display_name = viewer_info['display_name']
         if 'profile_image_url' in viewer_info and container_user.profile_image_url != viewer_info['profile_image_url']:
             container_user.profile_image_url = viewer_info['profile_image_url']
         if 'profile_url' in viewer_info and container_user.profile_url != viewer_info['profile_url']:
             container_user.profile_url = viewer_info['profile_url']
 else:
     #associate container user with pyramid user
     logging.info('no container user found, creating one')
    def refresh_container_friends(self, container_user):
        ''' gets container friends via REST API and saves to data store
        '''
        #container_user.friend_ids = self.get_friend_ids_v08(container_user.container_user_id)
        logging.info('in load container friends, id is %s' %
                     container_user.container_user_id)
        friends = self.get_friends_v08(container_user.container_user_id)
        logging.info('friends: %s' % friends)
        user_friends = set(container_user.friend_ids)
        simple_users = {}
        friend_keys = set()

        for friend in friends['Friends']:
            domain = 'myspace.com'
            user_id = str(friend['userId'])
            user_key = domain + ":" + user_id
            user = Container_user.get_by_key_name(user_key)
            if user == None:
                logging.debug('user not found at friend %s' % friend)
                logging.debug('user not found at userid %s' % user_id)
                #raise Exception('no user? wtf?')
                user = Container_user(
                    key_name=user_key,
                    display_name=self.make_safe(friend['name']),
                    container_user_id=user_id,
                    domain=domain,
                    profile_url=db.Link(friend['webUri']),
                    profile_image_url=db.Link(friend['largeImage']),
                    character=None)
            else:
                if user.character:
                    friend_keys.add(user.character.key())

            user.ip_address = "1.2.3.4"
            if friend.has_key('hasAppInstalled'):
                user.has_app = friend['hasAppInstalled']
            else:
                user.has_app = False
            user.friend_ids = []
            user.put()
            user_friends.add(user.container_user_id)

            simple_user = {}
            simple_user['user_id'] = user.container_user_id
            simple_user['domain'] = user.domain
            simple_user['display_name'] = user.display_name
            simple_user['has_app'] = user.has_app
            simple_users[user.container_user_id] = simple_user

        container_user.friend_ids = list(user_friends)
        container_user.friend_count = len(user_friends)
        container_user.put()

        if container_user.character:
            container_user.character.friend_count = len(friend_keys)
            container_user.character.friend_keys = list(friend_keys)
            container_user.character.put()

        # todo: popuplate character friends
        logging.debug('exit container friends')
        return simple_users  #for json serialization
def offerpal_reward(request, caller_context, container_user, container):

    logging.info('offerpal deposit request: %s' % request)
    accountController = AccountController()

    required_fields = ('id', 'snuid', 'currency', 'verifier')
    for field in required_fields:
        if field not in request.GET:
            return HttpResponse(status=400, content='Missing required field: %s' % field)
    offerpal_secret_keys = {'orkut.com' : '1174959640013506'}
    offerpal_id = request.GET['id']
    snuid = request.GET['snuid']
    amount = int(request.GET['currency'])
    verifier = request.GET['verifier']
    affl = None
    if 'affl' in request.GET:
        affl = request.GET['affl'] #optional tracking id
    error = None
    if 'error' in request.GET:
        error = request.GET['error']
    base_string = '%s:%s:%d:%s' % (offerpal_id, snuid, amount, offerpal_secret_keys[container])
    match_string = md5.new(base_string).hexdigest()
    success = False
    found_user = None

    deposit = None
    try:
        deposit = Offerpal_deposit.get_by_key_name(offerpal_id)
    except:
        pass
    if deposit and deposit.success:
        logging.info('duplicate request %s' % deposit.offerpal_id)
        response = HttpResponse('Duplicate request, already received id: %s' % offerpal_id)
        response.status_code = 403 # 403 tells offerpal not to try again
        return response
    
    if match_string != verifier:
        logging.info('base: %s match: %s verifier: %s' % (base_string, match_string, verifier))
        verified = False
        response = HttpResponse('Authorization Failed.')
        response.status_code = 401
    else:
        verified = True
        domain = container             
        container_user_key = domain + ":" + snuid;
        container_user = Container_user.get_by_key_name(container_user_key)
        if container_user == None:
            response = HttpResponse('User Not Found')
            logging.info('could not look up user %s' % container_user_key)
            found_user = False
            response.status_code = 403 # 403 tells offerpal not to try again
            #todo: log this! send email?
        else:
            # log increase, message container_user, notification to container_user
            response = HttpResponse('offerpal reward for %s user.  Reward: %d.' % (container, amount), 'text/html')
            success = True
            found_user = True

    offerpal_deposit = Offerpal_deposit(key_name = offerpal_id,
                                            offerpal_id = offerpal_id, 
                                            snuid = snuid,
                                            currency_type = 'gold',
                                            deposit_amount = amount,
                                            verifier = verifier,
                                            verified = verified,
                                            found_user = found_user,
                                            affl = affl,
                                            error = error,
                                            response_code = response.status_code,
                                            success = success)
    offerpal_deposit.put()
    gold_account = Account(parent=offerpal_deposit,
                           key_name=offerpal_id,
                           currency_type='gold', 
                           negative_balance_allowed=False, 
                           balance=amount)
    gold_account.put()
    offerpal_deposit.account = gold_account
    offerpal_deposit.put()
    
    transfer = accountController.transfer_currency_in_txn(offerpal_deposit.account, container_user.character.gold_account, amount)
    if transfer:
        try:
            message = Message(message_type=5,
                              recipient=container_user.character, 
                              body="Your Offerpal deposit has posted! You have been credited with %d gold pieces" % amount,
                              pop_message_box = True)
            
            message.put() # notify depositor
            accountController.roll_forward_account_transfer(transfer)

        except Exception, e:
            logging.exception(e)
            logging.warning('failed to roll forward transfer of Offerpal deposit')