Пример #1
0
def rewind_last_swiped(user_id):
    ''' 撤销最后⼀次滑动,每天允许反悔三次,反悔时间距上一次滑动时间不超过5分钟'''
    now = datetime.datetime.now()
    rewind_key = keys.REWIND_TIMES_K % (now.date(), user_id)
    # 1检查今天的反悔次数是否超过三次
    rewind_times = rds.get(rewind_key, 0)
    if rewind_times > config.REWIND_TIMES:
        raise errors.RewindLimit()

    # 2找到最后一次滑动
    last_swpied = Swiped.objects.filter(user_id=user_id).latest('stime')

    # 3检查最后一次滑动时间距离现在是否在5分钟内
    past_time = (now - last_swpied.stime).total_seconds()
    if past_time > config.REWIND_TIMEOUT:
        raise errors.RewindTimeout()

    with atomic():
        # 4删除好友关系(只要上一次滑动类型是喜欢或超级喜欢,都有可能匹配为好友)
        if last_swpied.stype in ['like', 'superlike']:
            Friend.remove_relation(user_id, last_swpied.sid)
            # 5如果最后一次滑动是超级喜欢删除自己在对方的优先推荐列表
            if last_swpied.stype == 'superlike':
                rds.lrem(keys.PRIOR_RCMD_LIST % last_swpied.sid, value=user_id)

        # 6删除滑动记录
        last_swpied.delete()
        # 今日反悔次数加一
        rds.set(rewind_key, rewind_times + 1, 86500)  # 缓存过期时间为一天零100秒
        '''撤回最后一次滑动所改变的对方的积分,'''
        rds.zincrby(keys.HOT_RANK, last_swpied.sid,
                    -config.RANK_SCORE[last_swpied.stype])
Пример #2
0
def like_someone(user_id, sid):
    '''添加滑动记录'''
    Swiped.swpied(user_id, sid, 'like')
    '''在自己的优先推荐列表里删除对方id'''
    rds.lrem(keys.PRIOR_RCMD_LIST % user_id, value=sid)
    '''喜欢对方,给对方的增加分数'''
    rds.zincrby(keys.HOT_RANK, sid, config.RANK_SCORE['like'])
    '''检查对方是否上滑(superlike)或右滑(like)过你'''
    liked = Swiped.is_liked(user_id, sid)
    if liked is True:
        '''如果对方也喜欢过你,将你们匹配为好友'''
        Friend.make_friends(user_id, sid)
        return True
    else:
        return False
Пример #3
0
def like_someone(uid, sid):
    '''喜欢的人'''
    # 1.添加滑动记录
    Slide.slide(uid=uid, sid=sid, slide_type='like')

    # 2.强制删除优先推荐队列里的id
    rds.lrem(keys.FIRST_RCMD_Q % uid, count=0, value=sid)

    # 给被滑动者添加积分
    rds.zincrby(keys.HOT_RANK, config.SLIDE_SCORE['like'], sid)

    # 3.检查对方是否喜欢自己,如果喜欢那么建立好友关系
    is_like = Slide.is_liked(uid=sid, sid=uid)
    if is_like is True:
        Friend.make_friend(uid, sid)
        return True
    else:
        return False
Пример #4
0
def superlike_someone(user_id, sid):
    '''超级喜欢某人'''
    '''添加滑动记录'''
    Swiped.swpied(user_id, sid, 'superlike')
    '''在自己的优先推荐列表里删除对方id'''
    rds.lrem(keys.PRIOR_RCMD_LIST % user_id, value=sid)
    '''超级喜欢对方,给对方的增加积分'''
    rds.zincrby(keys.HOT_RANK, sid, config.RANK_SCORE['superlike'])
    '''检查对方是否上滑(superlike)或右滑(like)过你'''
    liked = Swiped.is_liked(user_id, sid)
    if liked is True:  # 对方喜欢你
        '''如果对方也喜欢过你,将你们匹配为好友'''
        Friend.make_friends(user_id, sid)
        return True

    elif liked is False:  # 对方不喜欢你
        return False

    else:  # 对方没有滑过你,将你的id给到对方的优先推荐列表
        rds.rpush(keys.PRIOR_RCMD_LIST % sid, user_id)
        return False
Пример #5
0
def rewind_slide(uid):
    '''反悔(每天3次,5分钟内)'''
    now_time = datetime.datetime.now()
    today = now_time.date()
    rewind_key = keys.REWIND_K % (today, uid)

    # 检查是否已经3次
    rewind_num = rds.get(rewind_key, 0)
    if rewind_num >= config.REWIND_TIMES:
        raise errors.RewindLimit

    # 检查最后一次滑动是否在5分钟内
    last_slide = Slide.objects.filter(uid=uid).latest('slide_time')

    if now_time > last_slide.slide_time + datetime.timedelta(
            minutes=config.REWIND_TIMEOUT):
        raise errors.RewindTimeout

    # 将多次数据修改在事务中执行
    with atomic():

        # 检查是否是好友
        if last_slide.slide_type in ['like', 'superlike']:
            Friend.broken(uid, last_slide.sid)

            if last_slide.slide_type == 'superlike':
                # 从对方的推荐列表里删除我的id
                rds.lrem(keys.FIRST_RCMD_Q % last_slide.sid,
                         count=0,
                         value=uid)

        # 撤回被滑动者的积分
        score = config.SLIDE_SCORE[last_slide.slide_type]
        rds.zincrby(keys.HOT_RANK, -score, last_slide.sid)

        # 删除最后一次滑动
        last_slide.delete()

        # 设置缓存,反悔次数加一
        rds.set(rewind_key, rewind_num + 1, 86400)
Пример #6
0
def superlike_someone(uid, sid):
    '''超级喜欢'''
    # 1.添加滑动记录
    Slide.slide(uid=uid, sid=sid, slide_type='superlike')

    # 2.强制删除优先推荐队列里的id
    rds.lrem(keys.FIRST_RCMD_Q % uid, count=0, value=sid)

    # 给被滑动者添加积分
    rds.zincrby(keys.HOT_RANK, config.SLIDE_SCORE['superlike'], sid)

    # 3.检查对方是否喜欢自己,如果喜欢那么建立好友关系
    is_like = Slide.is_liked(uid=sid, sid=uid)
    if is_like is True:
        Friend.make_friend(uid, sid)
        return True
    elif is_like is False:
        return False
    else:
        # 对方没有滑到自己,将自己添加到对方的优先推荐队列
        rds.lpush(keys.FIRST_RCMD_Q % sid, uid)
        return False
Пример #7
0
def friends(request):
    fid_list = Friend.find_friends(request.uid)
    user_list = User.objects.filter(id__in=fid_list)

    data = [user.to_dict() for user in user_list]
    return render_json(data=data)