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)
示例#3
0
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
示例#4
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
示例#5
0
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"]
示例#6
0
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)
示例#7
0
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
示例#8
0
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
示例#10
0
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
示例#11
0
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)
示例#13
0
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)
示例#14
0
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)
示例#15
0
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)
示例#16
0
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)
示例#17
0
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
示例#18
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
示例#19
0
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)
示例#23
0
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
示例#24
0
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)
示例#26
0
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
示例#27
0
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))
示例#28
0
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
示例#29
0
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
示例#30
0
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