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])
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
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
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
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)
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
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)