def battleAddUser(battle_id, user_id): if rs.exists("battle:" + str(battle_id)) != 1: return -1 if rs.hget("battle:%s" % battle_id, "uid") != str(loggedUserUid()): return -2 rs.sadd('battle:%s:invited' % battle_id, user_id) create_battle_notification(loggedUserUid(), user_id, battle_id, NTFY_BATTLE_INVITE) return followBattleByUser(battle_id, user_id)
def battleAcceptUser(battle_id, user_id, admin=False): if rs.exists("battle:" + str(battle_id)) != 1: return -1 uid = loggedUserUid() if rs.hget("battle:%s" % battle_id, "uid") != str(uid) and not admin: return -2 rs.zadd('battle:%s:users' % battle_id, user_id, 1) rs.sadd('battle:%s:accepted' % battle_id, user_id) rs.zadd('user:%s:battles' % user_id, battle_id, rs.zscore("battles_ids", battle_id)) if uid != user_id: create_battle_notification(loggedUserUid(), user_id, battle_id, NTFY_BATTLE_ACCEPT) return rs.scard('battle:%s:accepted' % battle_id)
def delete_battle(battle_id, admin=0): if rs.exists("battle:%s" % battle_id) == 1 and (admin == 1 or str( loggedUserUid()) == rs.hget("battle:%s" % battle_id, 'uid')): uid = rs.hget("battle:%s" % battle_id, 'uid') rs.zrem("user_battles:" + uid, battle_id) rs.zrem("battles_ids", battle_id) battle = json.loads(rs.hget("battle:%s" % battle_id, 'data')) rs.zrem("battles:%s" % battle['type'], battle_id) rs.zrem("privacy:%s" % battle['privacy'], battle_id) tanks = rs.smembers("battle:%s:tanks" % battle_id) for tank_id in tanks: rs.srem("tank:%s:battles" % tank_id, battle_id) users = rs.zrange('battle:%s:users' % battle_id, 0, -1) from warg.views.battle_followers import unFollowBattleByUser from warg.views.notifications import create_battle_notification, NTFY_BATTLE_KICK for user_id in users: unFollowBattleByUser(battle_id, int(user_id)) if user_id != uid: create_battle_notification(uid, user_id, battle_id, NTFY_BATTLE_KICK) rs.delete("battle:%s:tanks" % battle_id) from warg.views.jobs.battle_reminder import remove_battle_reminders remove_battle_reminders(battle_id) rs.delete("battle:%s:reminders" % battle_id) rs.delete("battle:%s" % battle_id) rs.sadd("whoosh:battles:deleted", battle_id) return 1 return 0
def getUserFollowing(user_id): if rs.exists("users:" + str(user_id)) != 1: return [] offset = request.args.get("offset", 0) count = request.args.get("count", 20) rows = rs.sort('user:'******':following', start=offset, num=count, desc=True, get='users:*') lua = """local r1 = redis.call('sort', 'user:'******':following', 'LIMIT', KEYS[3], KEYS[4], 'GET', 'users:*', 'GET', '#', 'GET', '#', 'GET', '#'); for i = 1, table.getn(r1) do if i % 4 == 1 then r1[i+1] = redis.call('sismember', 'user:'******':followers', KEYS[2]) r1[i+2] = redis.call('sismember', 'users:virtual', r1[i+2]) r1[i+3] = redis.call('sismember', 'users_online', r1[i+3]) end end return r1;""" rows = rs.eval(lua, 4, user_id, loggedUserUid(), offset, count) users = [] for i in range(0, len(rows) - 1): if i % 4 != 0 or rows[i] is None: continue u = json.loads(rows[i]) u['is_follow'] = rows[i + 1] u['is_online'] = rows[i + 3] u['virtual'] = rows[i + 2] users.append(u) return users
def create_clan(): uid = loggedUserUid() if uid == 0: return -2 try: data = json.loads(request.stream.read()) except: return -3 gdata = {} fulldata = True for k in clan_model: if data.get(k, None) is None: fulldata = False break else: gdata[k] = data[k] if not fulldata: return "Few data" user_clan_id = rs.get("user:%s:clan" % uid) if user_clan_id == str(data["clan_id"]): return data["clan_id"] if int(user_clan_id or 0) > 0: clan_del_user(user_clan_id, uid) rs.hmset("clan:%s" % data["clan_id"], { 'data': json.dumps(data), 'id': data["clan_id"] }) clan_add_user(data["clan_id"], uid) return data["clan_id"]
def group_follow(group_id): if rs.exists("group:%s" % group_id) != 1: return -1 uid = loggedUserUid() if uid == 0: return -2 return group_add_user(group_id, uid)
def get_group_users(group_id): #if rs.exists("group:%s" % group_id) != 1: # return [] offset = request.args.get("offset", 0) count = request.args.get("count", 20) lua = """local r1 = redis.call('sort', 'group:'..tostring(KEYS[1])..':users', 'DESC', 'LIMIT', KEYS[3], KEYS[4], 'GET', 'users:*', 'GET', '#', 'GET', '#', 'GET', '#'); for i = 1, table.getn(r1) do if i % 4 == 1 then r1[i+1] = redis.call('sismember', 'user:'******':followers', KEYS[2]) r1[i+2] = redis.call('sismember', 'users:virtual', r1[i+2]) r1[i+3] = redis.call('sismember', 'users_online', r1[i+3]) end end return r1;""" rows = rs.eval(lua, 4, group_id, loggedUserUid(), offset, count) users = [] for i in range(0, len(rows) - 1): if i % 4 != 0 or rows[i] is None: continue u = json.loads(rows[i]) u['is_follow'] = rows[i + 1] u['is_online'] = rows[i + 3] u['virtual'] = rows[i + 2] users.append(u) return users
def create_group(): uid = loggedUserUid() if uid == 0: return -2 try: data = json.loads(request.stream.read()) except: return -3 gdata = {} fulldata = True for k in group_model: if data.get(k, None) is None: fulldata = False break else: gdata[k] = data[k] if not fulldata: return "Few data" gid = rs.incr('group_counter') gdata['id'] = gid gdata['create_date'] = int(calendar.timegm(datetime.utcnow().timetuple())) rs.hmset("group:%s" % gid, {'data': json.dumps(gdata), 'id': gid, 'uid': uid}) group_add_user(gid, uid) rs.sadd("whoosh:groups:added", gid) return gid
def get_battle_unread(battle_id): if rs.exists("battle:" + str(battle_id)) != 1: return -1 uid = loggedUserUid() if rs.hget("battle:%s" % battle_id, "uid") != str(uid): return -2 if rs.exists("battle:%s:unread" % battle_id) != 1: return [] offset = int(request.args.get("offset", 0)) count = int(request.args.get("count", 10)) rows = [] lua = """local r1 = redis.call('ZREVRANGE', KEYS[1], KEYS[2], KEYS[3]); for i = 1, table.getn(r1) do local chid = r1[i] r1[i] = {} r1[i][1] = redis.call('hget', chid, 'id') r1[i][2] = redis.call('hget', chid, 'text') r1[i][3] = redis.call('zscore', KEYS[1], chid) local uid = redis.call('hget', chid, 'rid') r1[i][4] = redis.call('get', 'users:' .. tostring(uid)) r1[i][5] = redis.call('sismember', 'users_online', uid) end return r1;""" ids = rs.eval(lua, 3, "battle:%s:unread" % battle_id, offset, offset + count - 1) for cmid in ids: cmnt = { 'id': int(cmid[0]), 'text': cmid[1], 'create_date': int(cmid[2]) } cmnt['user'] = json.loads(cmid[3]) cmnt['user']['is_online'] = cmid[4] rows.append(cmnt) return rows
def read_message(sid, mid): uid = loggedUserUid() if uid == 0: return -2 chid = "chat:message:%s:%s:%s" % (sid, uid, mid) if rs.exists(chid) != 1: return -1 if rs.hget(chid, "is_read") == "true": return 0 rs.hset(chid, "is_read", 'true') rs.zrem("chat:user:%s:unread" % uid, chid) battle_id = rs.hget(chid, "battle_id") if battle_id is not None: rs.zrem("battle:%s:unread" % battle_id, chid) rs.delete(chid) unread = get_unread._original() ntfs = rs.scard("chat:user:%s:ntfy" % uid) message = {"type": "unread", "content": {"count": len(unread)}} if ntfs > 0 and len(unread) > 0: message["content"]["message"] = unread[0] send_message_to_user(uid, json.dumps(message)) send_message_to_user( sid, json.dumps({ "type": "read_chat", "content": { "mid": mid, "rid": int(uid) } })) return 1
def followUser(user_id): if rs.exists("users:" + str(user_id)) != 1: return -1 uid = loggedUserUid() if uid == 0: return -2 return followUserByUser(user_id, str(uid))
def battleDelUser(battle_id, user_id): if rs.exists("battle:" + str(battle_id)) != 1: return -1 uid = loggedUserUid() if rs.hget("battle:%s" % battle_id, "uid") != str(uid): return -2 create_battle_notification(uid, user_id, battle_id, NTFY_BATTLE_KICK) return unFollowBattleByUser(battle_id, user_id)
def get_clan_battles(clan_id): uid = loggedUserUid() if uid == 0: return [] if rs.sismember("clan:%s:users" % clan_id, uid) == 0: return [] from warg.views.battle import get_battles_by_set return get_battles_by_set("clan:%s:battles" % clan_id)
def get_group_battles(group_id): uid = loggedUserUid() if uid == 0: return [] #if rs.sismember("group:%s:users" % group_id, uid) == 0: # return [] from warg.views.battle import get_battles_by_set return get_battles_by_set("group:%s:battles" % group_id)
def create_battle(): uid = loggedUserUid() if uid == 0: return -2 try: data = json.loads(request.stream.read()) except: return -3 return do_create_battle(uid, data)
def group_unfollow(group_id): if rs.exists("group:%s" % group_id) != 1: return -1 uid = loggedUserUid() if uid == 0: return -2 #user can't leave own group if rs.hget("group:%s" % group_id, "uid") == str(uid): return -3 return group_del_user(group_id, uid)
def delete_group(group_id, admin=0): if rs.exists("group:%s" % group_id) == 1 and (admin == 1 or str(loggedUserUid()) == rs.hget("group:%s" % group_id, 'uid')): users = rs.smembers("group:%s:users" % group_id) for user_id in users: rs.srem("user:%s:groups" % user_id, group_id) rs.delete("group:%s:users" % group_id) rs.delete("group:%s" % group_id) return 1 else: return 0
def create_user_memo(user_id=0): uid = loggedUserUid() if uid == 0: return -2 try: data = json.loads(request.stream.read()) except: return -3 rs.set("user:%s:memo:%s" % (user_id, uid), data) return 1
def unfollowUser(user_id): if rs.exists("users:" + str(user_id)) != 1: return -1 uid = loggedUserUid() if uid == 0: return -2 rs.srem('user:%s:following' % uid, user_id) rs.srem('user:%s:followers' % user_id, uid) rs.sdiffstore('user:%s:follownig_looks' % uid, 'user:%s:follownig_looks' % uid, 'user_looks:' + str(user_id)) return rs.scard('user:%s:followers' % user_id)
def battleRejectUser(battle_id, user_id): if rs.exists("battle:" + str(battle_id)) != 1: return -1 uid = loggedUserUid() if rs.hget("battle:%s" % battle_id, "uid") != str(uid): return -2 if uid == user_id: return -3 rs.zadd('battle:%s:users' % battle_id, user_id, 0) rs.srem('battle:%s:accepted' % battle_id, user_id) create_battle_notification(uid, user_id, battle_id, NTFY_BATTLE_REJECT) return rs.scard('battle:%s:accepted' % battle_id)
def battleAddExternalUser(battle_id, account_id): if rs.exists("battle:" + str(battle_id)) != 1: return -1 if rs.hget("battle:%s" % battle_id, "uid") != str(loggedUserUid()): return -2 access_token = request.args.get("access_token", None) if access_token is None: return json.dumps("No access token") wotuid = 'wot_user:%s' % account_id if rs.exists(wotuid) != 1: from warg.views.users import insert_wot_user, account_info data = account_info(access_token, account_id) if data['status'] == 'ok': uid = insert_wot_user(data['data'][str(account_id)], 1) else: return json.dumps("Error: " + data['error']['message']) else: uid = rs.hget(wotuid, 'uid') create_battle_notification(loggedUserUid(), int(uid), battle_id, NTFY_BATTLE_INVITE) rs.sadd('battle:%s:invited' % battle_id, uid) return followBattleByUser(battle_id, uid)
def unfollowBattle(battle_id): if rs.exists("battle:" + str(battle_id)) != 1: return -1 uid = loggedUserUid() if uid == 0: return -2 if rs.hget("battle:%s" % battle_id, "uid") == str(uid): return -3 if rs.sismember('battle:%s:invited' % battle_id, uid): create_battle_notification(uid, 0, battle_id, NTFY_INVITE_REJECT) else: create_battle_notification(uid, 0, battle_id, NTFY_BATTLE_UFLLOW) return unFollowBattleByUser(battle_id, uid)
def update_battle(battle_id): uid = loggedUserUid() if uid == 0: return -2 if str(uid) != rs.hget("battle:%s" % battle_id, 'uid'): return -1 try: data = json.loads(request.stream.read()) except: return -3 battle = json.loads(rs.hget("battle:%s" % battle_id, 'data')) battle_old = battle.copy() fulldata = True for k in battle_model: if data.get(k, None) is None: fulldata = False break else: battle[k] = data[k] if not fulldata: return "Few data" if data['type'] not in battle_types: return "Wrong battle type" if battle_old['type'] != data['type']: rs.zrem("battles:%s" % battle_old['type'], battle_id) if battle_old['privacy'] != data['privacy']: rs.zrem("privacy:%s" % battle_old['privacy'], battle_id) tanks = rs.smembers("battle:%s:tanks" % battle_id) for tank_id in tanks: rs.srem("tank:%s:battles" % tank_id, battle_id) rs.delete("battle:%s:tanks" % battle_id) from warg.views.jobs.battle_reminder import remove_battle_reminders remove_battle_reminders(battle_id) rs.delete("battle:%s:reminders" % battle_id) process_battle_db(battle_id, uid, battle, data.get("reminders", default_reminders)) users = rs.zrange('battle:%s:users' % battle_id, 0, -1) for user_id in users: rs.zadd('user:%s:battles' % user_id, battle_id, battle['battle_date']) #from uhelp.views.full_text import storeLookInIndex #storeLookInIndex(look, None, True) rs.sadd("whoosh:battles:updated", battle_id) return battle_id
def update_group(group_id): uid = loggedUserUid() if uid == 0: return -2 if str(uid) != rs.hget("group:%s" % group_id, 'uid'): return -1 try: data = json.loads(request.stream.read()) except: return -3 group = json.loads(rs.hget("group:%s" % group_id, 'data')) for k in group_model: group[k] = data[k] rs.hset("group:%s" % group_id, "data", json.dumps(group)) rs.sadd("whoosh:groups:updated", group_id) return group_id
def battleFollowUser(battle_id): if rs.exists("battle:" + str(battle_id)) != 1: return -1 uid = loggedUserUid() if uid == 0: return -2 if rs.sismember('battle:%s:invited' % battle_id, uid): create_battle_notification(uid, 0, battle_id, NTFY_INVITE_ACCEPT) rs.srem('battle:%s:invited' % battle_id, uid) rs.zadd('battle:%s:users' % battle_id, uid, 1) rs.sadd('battle:%s:accepted' % battle_id, uid) rs.zadd('user:%s:battles' % uid, battle_id, rs.zscore("battles_ids", battle_id)) return 1 else: create_battle_notification(uid, 0, battle_id, NTFY_BATTLE_FOLLOW) return followBattleByUser(battle_id, uid)
def create_group_battle(group_id): uid = loggedUserUid() if uid == 0: return -2 if rs.sismember("group:%s:users" % group_id, uid) == 0: return -1 try: data = json.loads(request.stream.read()) except: return -3 data["privacy"] = "PRIVATE" from warg.views.battle import do_create_battle battle_id = do_create_battle(uid, data) if int(battle_id) > 0: zscore = rs.zscore("battles_ids", battle_id) rs.zadd("group:%s:battles" % group_id, battle_id, zscore) return battle_id
def followExternalUser(account_id): uid = loggedUserUid() if uid == 0: return -2 access_token = request.args.get("access_token", None) if access_token is None: return json.dumps("No access token") wotuid = 'wot_user:%s' % account_id if rs.exists(wotuid) != 1: from warg.views.users import insert_wot_user, account_info data = account_info(access_token, account_id) if data['status'] == 'ok': user_id = insert_wot_user(data['data'][str(account_id)], 1) else: return json.dumps("Error: " + data['error']['message']) else: user_id = rs.hget(wotuid, 'uid') return followUserByUser(user_id, str(uid))
def get_dialogs(): uid = loggedUserUid() if uid == 0: return [] if rs.exists("chat:user:%s:dialogs" % uid) != 1: return [] offset = int(request.args.get("offset", 0)) count = int(request.args.get("count", 10)) rows = [] lua = """local r1 = redis.call('ZREVRANGE', KEYS[1], KEYS[2], KEYS[3]); for i = 1, table.getn(r1) do local dialog = r1[i] local chid = redis.call('ZREVRANGE', dialog, 0, 0)[1]; r1[i] = {} r1[i][1] = redis.call('hget', chid, 'id') r1[i][2] = redis.call('hget', chid, 'text') r1[i][3] = redis.call('zscore', dialog, chid) local uid = redis.call('hget', chid, 'sid') r1[i][4] = redis.call('get', 'users:' .. tostring(uid)) local uid = redis.call('hget', chid, 'rid') r1[i][5] = redis.call('get', 'users:' .. tostring(uid)) r1[i][6] = redis.call('sismember', 'users_online', uid) r1[i][7] = redis.call('hget', chid, 'is_read') end return r1;""" ids = rs.eval(lua, 3, "chat:user:%s:dialogs" % uid, offset, offset + count - 1) #ids = rs.sort('look:' + str(look_id) + ':comments', start=offset, num=count, get='#') for cmid in ids: is_read = False if cmid[6] == 'False' else json.loads(cmid[6]) cmnt = { 'id': int(cmid[0]), 'text': cmid[1], 'create_date': int(cmid[2]), 'is_read': is_read } cmnt['user'] = json.loads(cmid[3]) cmnt['user']['is_online'] = cmid[5] cmnt['companion'] = json.loads( cmid[3]) if uid != cmnt['user']['id'] else json.loads(cmid[4]) rows.append(cmnt) return rows
def get_allowed_battles(): uid = loggedUserUid() if uid == 0: return [] lua = """local r1 = redis.call('sort', 'user:'******':followers', 'GET', 'user:*->battles'); for i = 1, table.getn(r1) do redis.call('zadd', KEYS[1], redis.call('hget', 'battle:'..tostring(r1[i]), 'battle_date'), r1[i]); end redis.call('zinterstore', KEYS[1], 2, KEYS[1], 'privacy:PRIVATE', 'AGGREGATE', 'MIN'); redis.call('zunionstore', KEYS[1], 4, KEYS[1], 'user:'******':battles','privacy:ALL', 'user_battles:'..tostring(KEYS[2]), 'AGGREGATE', 'MIN'); return 1;""" tmp = hashlib.md5(str(mktime(datetime.now().timetuple()))).hexdigest( ) + "allowed_battle_" + str(uid) #rs.sort('user:%s:followers' % uid, get=["user:*->battles"], store=tmp) #rs.zinterstore(tmp, tmp, "privacy:PRIVATE", aggregate="MIN") #rs.zinterstore(tmp, tmp, 'user:%s:battles' % uid, "privacy:ALL", "user_battles:%s" % uid, aggregate="MIN") rs.eval(lua, 2, tmp, uid) res = get_battles_by_set(tmp) rs.delete(tmp) return res
def get_battles_arr_by_set(key, by2=None, offset=0, count=20): #start_time = time.time() uid = loggedUserUid() battles = [] lua = """local r1 = redis.call('ZRANGEBYSCORE', KEYS[1], KEYS[2], '+inf', 'LIMIT', KEYS[4], KEYS[5]); for i = 1, table.getn(r1) do local bid = r1[i]; r1[i] = {} r1[i][1] = redis.call('HGET', 'battle:'..bid, 'data'); local uid = redis.call('HGET', 'battle:'..bid, 'uid'); r1[i][2] = redis.call('get', 'users:' .. uid); r1[i][3] = redis.call('sismember', 'users_online', uid); -- r1[i+3] = redis.call('smembers', 'battle:' .. tostring(r1[i+3]) .. ':tanks') r1[i][4] = redis.call('sismember', 'battle:' .. bid .. ':accepted', KEYS[3]) r1[i][5] = redis.call('zrank', 'battle:' .. bid .. ':users', KEYS[3]) r1[i][6] = redis.call('scard', 'battle:' .. bid .. ':accepted') r1[i][7] = redis.call('zcard', 'battle:' .. bid .. ':users') r1[i][8] = redis.call('sismember', 'battle:' .. bid .. ':invited', KEYS[3]) r1[i][9] = redis.call('smembers', 'battle:' .. bid .. ':reminders') end return r1;""" # # str(by2) if by2 is not None else rows = rs.eval(lua, 5, key, int(calendar.timegm(datetime.utcnow().timetuple())), uid, offset, count) for b in rows: l = json.loads(b[0]) l['user'] = json.loads(b[1]) l['user']['is_online'] = b[2] l['tanks'] = [] # rows[i + 3] l['reminders'] = b[8] l['is_accepted'] = b[3] l['is_invited'] = b[7] l['is_follow'] = 1 if b[4] >= 0 else 0 l['accepted'] = b[5] l['followers'] = b[6] battles.append(l) #print time.time() - start_time, "seconds" return battles