def rewind_swipered(user): '''反悔一次滑动记录''' # 获取今天的反悔次数 rewind_times = rds.get(keys.REWIND_KEY % user.id, 0) # 检查今天返回是否达到了反悔上限 if rewind_times >= cfg.DAILY_REWIND: raise stat.RewindLimit # 找到最近的一次滑动记录 latest_swiped = Swiped.objects.filter(uid=user.id).latest('stime') # 检查反悔的记录是否是五分钟之内的 now = datetime.datetime.now() if (now - latest_swiped.stime).total_seconds() >= cfg.REWIND_TIMEOUT: raise stat.RewindTimeout # 检查上一次滑动是否有可能匹配了好友关系 if latest_swiped.stype in ['like', 'superlike']: # 删除好友关系 Friend.break_off(user.id, latest_swiped.sid) # 如果上一次是超级喜欢 将自身的uid从对方的优先推荐队列里面删除 if latest_swiped.stype == 'superlike': rds.zrem(keys.SUPERLIKED_KEY % latest_swiped.sid, user.id) # 删除滑动记录 latest_swiped.delete() # 更新当天的滑动词数,同时设置过期时间到下一个凌晨 next_zero = datetime.datetime(now.year, now.month, now.day) + datetime.timedelta(1) remain_seconds = (next_zero - now).total_seconds() rds.set(keys.REWIND_KEY % user.id, rewind_times + 1, int(remain_seconds))
def like_someone(user, sid): '''喜欢某人''' Swiped.swipe(user.id, sid, 'like') # 添加滑动记录 # 检查对方是否喜欢过自己 if Swiped.is_liked(sid, user.id): # 如果对方喜欢过自己,匹配成好友 Friend.make_friends(user.id, sid) # 如果对方超级喜欢过你,将对方从你的超级喜欢列表中删除 rds.zrem(keys.SUPERLIKED_KEY % user.id, sid) return True else: return False
def superlike_someone(user, sid): ''' 自己超级喜欢过对方,则一定会出现在对方的推荐列表里面 ''' Swiped.swipe(user.id, sid, 'superlike') rds.sadd(keys.SUPERLIKED_KEY % sid, {user.id: time.time()}) # 把自己的id写入到对方的优先推荐队列 # 检查对方是否喜欢过自己,如果喜欢过自己匹配成好友关系 if Swiped.is_liked(sid, user.id): Friend.make_friends(user.id, sid) # 如果对方超级喜欢过你,把对方从你的超级喜欢列表中删除 rds.zrem(keys.SUPERLIKED_KEY % user.id, sid) return True else: return False
def superlike_someone(user, sid): '''超级喜欢 自己超级喜欢过对方,则一定会出现在对方的推荐列表中 ''' # 使用有序集合存储[注意与列表,集合之间的区别] # 将自己的ID写入对方的优先推荐队列 Swiper.swiper(user.id, sid, 'superlike') rds.zadd(keys.SUPERLIKED_KEY % sid, user.id, time.time()) # 检查对方是否喜欢自己(对方喜欢自己,需要注意先后) if Swiper.is_liked(sid, user.id): # 如果对方超级喜欢自己,则匹配成好友 Friend.make_friends(user.id, sid) rds.zrem(keys.SUPERLIKED_KEY % user.id, sid) return True else: return False
def rewind_swiped(user): ''' 1.获取反悔次数 ---存储位置 2.返回一次滑动记录 --- 找到最近一次的滑动记录;[返回的记录只能为5min之内] 3.每天允许反悔3次 --- 需要对当天返回次数进行记录;并作出检查确定哪一次是最近一次; 4.返回记录只能是5min以内 --- 找到最近的滑动记录,检查反悔记录是否为5mins以内,判断当前时间与滑动时的时间操作; 5.检查上一次滑动是否匹配为好友,如果是,则需要先删除好友记录; 6.如果上一次是超级喜欢,将自身uid从对方的右滑推荐队列中删除 7.删除滑动记录; --- 需要更新滑动记录 ''' # 获取今天的反悔次数 # 默认0次反悔次数,参数最好写入配置文件; rewind_times = rds.get(keys.REWWIND_KEY % user.id, 0) # 检查是否达到限制次数 if rewind_times >= cfg.DAILY_REWIND: raise stat.RewindLimit # 根据时间找到最近的一次的滑动记录:filter的内容无顺序; # 取最近的一次滑动的方法:last(),latest()对比区别 latest_swiped = Swiper.objects.filter(uid=user.id).latest('stime') # 检查返回记录在五分钟以内:当前时间与滑动时间的差值 now = datetime.datetime.now() if (now - latest_swiped.stime).total_seconds() >= cfg.REWIND_TIMEOUT: raise stat.RewindTimeout # 检查上一次滑动是否匹配成好友 if latest_swiped.stype in ['like', 'superlike']: # 如果是好友,删除好友关系 Friend.break_off(user.id, latest_swiped.sid) # 如果上一次超级喜欢,将自身uid从对方的优先推荐队列中删除 if latest_swiped.stype == 'superlike': rds.zrem(keys.SUPERLIKED_KEY % latest_swiped.sid, user.id) # 如果反悔的话,需要还原用户的滑动积分 score = -cfg.SWIPE_SCORE[latest_swiped.stype] # 查找反悔的滑动积分 rds.zincrby(keys.HOT_RANK_KEY, score, latest_swiped.sid) # 删除滑动记录 latest_swiped.delete() # 更新当天的滑动次数 rds.set(keys.REWWIND_KEY % user.id, rewind_times + 1) # 更新过期过期时间(次日零点过期),需要计算过期时间,由于date在月末临界点,不够安全,采用timedelta() next_zero = datetime.datetime(now.year, now.month, now.day) + datetime.timedelta() remain_seconds = next_zero - now rds.set(keys.REWWIND_KEY % user.id, rewind_times + 1, remain_seconds)
def superlike_someone(user, sid): ''' 超级喜欢某人 自己超级喜欢过对方,则一定会出现在对方的推荐列表中 ''' Swiped.swipe(user.id, sid, 'superlike') # 添加滑动记录 # 将自己的 ID 写入到对方的优先推荐队列 rds.zadd(keys.SUPERLIKED_KEY % sid, {user.id: time.time()}) # 检查对方是否喜欢过自己 if Swiped.is_liked(sid, user.id): # 如果对方喜欢过自己,匹配成好友 Friend.make_friends(user.id, sid) # 如果对方超级喜欢过你,将对方从你的超级喜欢列表中删除 rds.zrem(keys.SUPERLIKED_KEY % user.id, sid) return True else: return False
def rewind_swiped(user): '''反悔一次滑动纪录''' # 获取今天的反悔次数 rewind_times = rds.get(keys.REWIND_KEY % user.id, 0) # 检查今天反悔是否达到限制次数 if rewind_times >= cfg.DAILY_REWIND: raise stat.RewindLimit # 找到最近一次的滑动记录 latest_swiped = Swiped.objects.filter(uid=user.id).latest('stime') # 检查反悔的记录是否是五分钟之内的 now = datetime.datetime.now() if (now - latest_swiped.stime).total_seconds() >= cfg.REWIND_TIMEOUT: raise stat.RewindTimeout # 检查上一次滑动是否有可能匹配成了好友 if latest_swiped.stype in ['like', 'superlike']: # 删除好友关系 Friend.break_off(user.id, latest_swiped.sid) # 如果上一次是超级喜欢,将自身uid从对方的优先推荐队列中删除 if latest_swiped.stype == 'superlike': rds.zrem(keys.SUPERLIKED_KEY % latest_swiped.sid, user.id) # 还原用户的滑动积分 score = -cfg.SWIPE_SCORE[latest_swiped.stype] rds.zincrby(keys.HOT_RANK_KEY, score, latest_swiped.sid) # 删除滑动记录 latest_swiped.delete() # 更新当天的滑动次数, 同时设置过期时间到下一个凌晨 next_zero = datetime.datetime(now.year, now.month, now.day) + datetime.timedelta(1) remain_seconds = (next_zero - now).total_seconds() rds.set(keys.REWIND_KEY % user.id, rewind_times + 1, int(remain_seconds))
def dislike_someone(user, sid): '''不喜欢某人''' Swiper.swiper(user.id, sid, 'dislike') # 如果对方超级喜欢过你,将对方从你的超级喜欢列表中删除 rds.zrem(keys.SUPERLIKED_KEY % user.id, sid)
def dislike_someone(user, sid): '''不喜欢某人''' Swiped.swipe(user.id, sid, 'dislike') #添加滑动记录 # 无论对方是否超级喜欢过你,都直接删除掉 rds.zrem(keys.SUPERLIKED_KEY % user.id, sid)