コード例 #1
0
def user_setting(uid):
    rds = g.rds
    appid = request.appid
    obj = request.get_json(force=True, silent=True, cache=False)
    if obj is None:
        logging.debug("json decode err:%s", e)
        raise ResponseMeta(400, "json decode error")

    if 'name' in obj:
        User.set_user_name(rds, appid, uid, obj['name'])
    elif 'forbidden' in obj:
        #聊天室禁言
        fb = 1 if obj['forbidden'] else 0
        User.set_user_forbidden(rds, appid, uid, fb)
        content = "%d,%d,%d"%(appid, uid, fb)
        publish_message(rds, "speak_forbidden", content)
    elif 'do_not_disturb' in obj:
        contact_id = obj['do_not_disturb']['peer_uid']
        on = obj['do_not_disturb']['on']
        User.set_user_do_not_disturb(g.rds, appid, uid,
                                        contact_id, on)
    elif 'mute' in obj:
        User.set_mute(rds, appid, uid, obj["mute"])
    else:
        raise ResponseMeta(400, "invalid param")

    return ""
コード例 #2
0
def unbind_device_token():
    rds = g.rds
    appid = request.appid
    uid = request.uid
    obj = request.get_json(force=True, silent=True, cache=False)
    if obj is None:
        logging.debug("json decode err:%s", e)
        raise ResponseMeta(400, "json decode error")

    device_token = obj.get("apns_device_token", "")
    pushkit_device_token = obj.get("pushkit_device_token", "")
    ng_device_token = obj.get("ng_device_token", "")
    xg_device_token = obj.get("xg_device_token", "")
    xm_device_token = obj.get("xm_device_token", "")
    hw_device_token = obj.get("hw_device_token", "")
    gcm_device_token = obj.get("gcm_device_token", "")
    jp_device_token = obj.get("jp_device_token", "")

    if not device_token and not pushkit_device_token \
       and not ng_device_token and not xg_device_token \
       and not xm_device_token and not hw_device_token \
       and not gcm_device_token and not jp_device_token:
        raise ResponseMeta(400, "invalid param")

    User.reset_user_device_token(rds, appid, uid, device_token,
                                 pushkit_device_token, ng_device_token,
                                 xg_device_token, xm_device_token,
                                 hw_device_token, gcm_device_token,
                                 jp_device_token)

    return make_json_response({"success": True}, 200)
コード例 #3
0
ファイル: group.py プロジェクト: a30f49/gobelieve_api
def group_member_setting(gid, memberid):
    appid = request.appid
    uid = memberid

    group = Group.get_group(g._db, gid)
    if not group:
        raise ResponseMeta(400, "group non exists")

    obj = json.loads(request.data)
    if obj.has_key('do_not_disturb'):
        User.set_group_do_not_disturb(g.rds, appid, uid, gid,
                                      obj['do_not_disturb'])
    elif obj.has_key('nickname'):
        Group.update_nickname(g._db, gid, uid, obj['nickname'])
        v = {
            "group_id": gid,
            "group_name": group['name'],
            "timestamp": int(time.time()),
            "nickname": obj['nickname'],
            "member_id": uid
        }
        op = {"update_member_nickname": v}
        send_group_notification(appid, gid, op, None)
    elif obj.has_key('mute'):
        mute = 1 if obj['mute'] else 0
        Group.update_mute(g._db, gid, uid, mute)
        content = "%d,%d,%d" % (gid, memberid, mute)
        publish_message(g.rds, "group_member_mute", content)
    else:
        raise ResponseMeta(400, "no action")

    resp = {"success": True}
    return make_response(200, resp)
コード例 #4
0
def create_group():
    appid = request.appid
    obj = request.get_json(force=True, silent=True, cache=False)
    if obj is None:
        logging.debug("json decode err:%s", e)
        raise ResponseMeta(400, "json decode error")

    master = obj["master"]
    name = obj["name"]
    is_super = obj["super"] if "super" in obj else False
    members = obj["members"]

    if hasattr(request, 'uid') and request.uid != master:
        raise ResponseMeta(400, "master must be self")

    gid = 0
    if config.EXTERNAL_GROUP_ID:
        gid = obj['group_id'] if 'group_id' in obj else 0

    #支持members参数为对象数组
    #[{uid:"", name:"", avatar:"可选"}, ...]
    memberIDs = [m['uid'] if type(m) == dict else m for m in members]

    if gid > 0:
        gid = Group.create_group_ext(g._db, gid, appid, master, name, is_super,
                                     memberIDs)
    else:
        gid = Group.create_group(g._db, appid, master, name, is_super,
                                 memberIDs)

    s = 1 if is_super else 0

    content = {
        "group_id": gid,
        "app_id": appid,
        "super": s,
        "name": Group.GROUP_EVENT_CREATE
    }
    Group.publish_create_event(g.rds, appid, gid, is_super)

    for mem in memberIDs:
        content = {
            "group_id": gid,
            "member_id": mem,
            "name": Group.GROUP_EVENT_MEMBER_ADD
        }
        Group.publish_member_add_event(g.rds, gid, mem)

    v = {
        "group_id": gid,
        "master": master,
        "name": name,
        "members": members,
        "timestamp": int(time.time())
    }
    op = {"create": v}
    send_group_notification(appid, gid, op, members)

    resp = {"data": {"group_id": gid}}
    return make_response(200, resp)
コード例 #5
0
def delete_group_member(gid):
    appid = request.appid
    obj = request.get_json(force=True, silent=True, cache=False)
    if obj is None:
        logging.debug("json decode err:%s", e)
        raise ResponseMeta(400, "json decode error")

    members = obj
    if len(members) == 0:
        raise ResponseMeta(400, "no memebers to delete")

    group = Group.get_group(g._db, gid)
    if not group:
        raise ResponseMeta(400, "group non exists")

    for m in members:
        if type(m) == int:
            member = {"uid": m}
        else:
            member = m

        remove_group_member(appid, gid, group['name'], member)

    resp = {"success": True}
    return make_response(200, resp)
コード例 #6
0
def grant_auth_token():
    rds = g.rds
    appid = request.appid
    obj = request.get_json(force=True, silent=True, cache=False)
    if obj is None:
        logging.debug("json decode err:%s", e)
        raise ResponseMeta(400, "json decode error")

    uid = obj.get('uid')
    if type(uid) != int:
        raise ResponseMeta(400, "invalid param")

    name = obj.get('user_name', "")
    token = User.get_user_access_token(rds, appid, uid)
    if not token:
        token = create_access_token()
        User.add_user_count(rds, appid, uid)

    User.save_user_access_token(rds, appid, uid, name, token)

    u = "%s_%s"%(appid, uid)
    realm = "com.beetle.face"
    key = hmac(u, realm, token)
    User.set_turn_realm_key(rds, realm, u, key)
        
    data = {"data":{"token":token}}
    return make_response(200, data)
コード例 #7
0
def group_member_setting(gid, memberid):
    appid = request.appid
    uid = request.uid

    if uid != memberid:
        raise ResponseMeta(400, "setting other is forbidden")

    obj = json.loads(request.data)
    if obj.has_key('quiet'):
        User.set_group_do_not_disturb(g.rds, appid, uid, gid, obj['quiet'])
    elif obj.has_key('do_not_disturb'):
        User.set_group_do_not_disturb(g.rds, appid, uid, gid, obj['do_not_disturb'])
    elif obj.has_key('nickname'):
        Group.update_nickname(g._db, gid, uid, obj['nickname'])
        v = {
            "group_id":gid,
            "timestamp":int(time.time()),
            "nickname":obj['nickname'],
            "member_id":uid
        }
        op = {"update_member_nickname":v}
        send_group_notification(appid, gid, op, None)        
    else:
        raise ResponseMeta(400, "no action")

    resp = {"success":True}
    return make_response(200, resp)
コード例 #8
0
def post_peer_messages():
    appid = request.appid
    if appid in config.DISABLED_APP_IDS:
        raise ResponseMeta(400, "disabled appid")
    obj = request.get_json(force=True, silent=True, cache=False)
    if obj is None:
        logging.debug("json decode err:%s", e)
        raise ResponseMeta(400, "json decode error")

    resp = rpc.post_peer_message(appid, obj["sender"], obj["receiver"],
                                 obj["content"])
    if resp.status_code == 200:
        return flask.make_response("", 200)
    else:
        return flask.make_response(resp.content, resp.status_code)
コード例 #9
0
def customer_register():
    rds = g.rds
    db = g._db
    obj = json.loads(request.data)
    appid = obj.get("appid", 0)
    uid = obj.get("customer_id", "")
    name = obj.get("name", "")
    avatar = obj.get("avatar", "")

    if not appid:
        raise ResponseMeta(400, "invalid param")

    store_id = App.get_store_id(db, appid)
    if not store_id:
        raise ResponseMeta(400, "app do not support customer")

    if not uid:
        client_id = Customer.generate_client_id(rds)
    else:
        client_id = Customer.get_client_id(rds, appid, uid)
        if not client_id:
            client_id = Customer.generate_client_id(rds)
            Customer.set_client_id(rds, appid, uid, client_id)

    token = User.get_user_access_token(rds, appid, client_id)
    if not token:
        token = create_access_token()
        User.add_user_count(rds, appid, client_id)

    User.save_user(rds, appid, client_id, name, avatar, token)
    User.save_token(rds, appid, client_id, token)

    if obj.has_key("platform_id") and obj.has_key("device_id"):
        platform_id = obj['platform_id']
        device_id = obj['device_id']
        s = init_message_queue(appid, client_id, platform_id, device_id)
        if s:
            logging.error("init message queue success")
        else:
            logging.error("init message queue fail")

    resp = {
        "token": token,
        "store_id": store_id,
        "client_id": client_id,
    }
    data = {"data": resp}
    return make_response(200, data)
コード例 #10
0
ファイル: group.py プロジェクト: a30f49/gobelieve_api
def upgrade_group(gid):
    """从普通群升级为超级群"""
    appid = request.appid
    group = Group.get_group(g._db, gid)

    members = Group.get_group_members(g._db, gid)

    if not group:
        raise ResponseMeta(400, "group non exists")

    Group.update_group_super(g._db, gid, 1)

    content = "%d,%d,%d" % (gid, appid, 1)
    publish_message(g.rds, "group_upgrade", content)

    v = {
        "group_id": gid,
        "group_name": group['name'],
        "timestamp": int(time.time()),
        "super": 1
    }
    op = {"upgrade": v}
    send_group_notification(appid, gid, op, None)

    resp = {"success": True}
    return make_response(200, resp)
コード例 #11
0
def update_group(gid):
    appid = request.appid
    obj = json.loads(request.data)

    if obj.has_key('name'):
        name = obj["name"]
        Group.update_group_name(g._db, gid, name)
         
        v = {
            "group_id":gid,
            "timestamp":int(time.time()),
            "name":name
        }
        op = {"update_name":v}
        send_group_notification(appid, gid, op, None)
    elif obj.has_key('notice'):
        notice = obj["notice"]
        Group.update_group_notice(g._db, gid, notice)
        v = {
            "group_id":gid,
            "timestamp":int(time.time()),
            "name":notice
        }
        op = {"update_notice":v}
        send_group_notification(appid, gid, op, None)
    else:
        raise ResponseMeta(400, "patch nothing")
    
    resp = {"success":True}
    return make_response(200, resp)
コード例 #12
0
ファイル: push.py プロジェクト: richmonkey/kefu_api
def unbind_device_token():
    rds = g.imrds
    appid = config.APP_ID
    uid = request.uid
    obj = json.loads(request.data)
    device_token = obj["apns_device_token"] if obj.has_key(
        "apns_device_token") else ""
    ng_device_token = obj["ng_device_token"] if obj.has_key(
        "ng_device_token") else ""
    xg_device_token = obj["xg_device_token"] if obj.has_key(
        "xg_device_token") else ""
    xm_device_token = obj["xm_device_token"] if obj.has_key(
        "xm_device_token") else ""
    hw_device_token = obj["hw_device_token"] if obj.has_key(
        "hw_device_token") else ""
    gcm_device_token = obj["gcm_device_token"] if obj.has_key(
        "gcm_device_token") else ""
    jp_device_token = obj["jp_device_token"] if obj.has_key(
        "jp_device_token") else ""

    if not device_token and not ng_device_token and not xg_device_token \
       and not xm_device_token and not hw_device_token \
       and not gcm_device_token and not jp_device_token:
        raise ResponseMeta(400, "invalid param")

    User.reset_user_device_token(rds, appid, uid, device_token,
                                 ng_device_token, xg_device_token,
                                 xm_device_token, hw_device_token,
                                 gcm_device_token, jp_device_token)

    return make_json_response({"success": True}, 200)
コード例 #13
0
ファイル: message.py プロジェクト: zhongxuan123/gobelieve_api
def get_offline_message():
    rds = g.rds
    appid = request.appid
    customer_id = request.args.get("customer_id", "")
    uid = int(request.args.get("uid", 0))
    if not uid and  hasattr(request, 'uid'):
        uid = request.uid

    if not uid and customer_id:
        uid = Customer.get_client_id(rds, appid, customer_id)

    if not uid:
        raise ResponseMeta(400, "invalid uid")

    platform_id = int(request.args.get("platform_id", 0))
    device_id = request.args.get("device_id", "")

    params = {
        "appid": appid,
        "uid": uid,
        "device_id":device_id,
        "platform_id":platform_id,
    }

    #获取离线消息数目
    count = get_offline_count(appid, uid, platform_id, device_id)
    new = 1 if count > 0 else 0
    data = {"data":{"count":count, "new":new}}
    return make_response(200, data)
コード例 #14
0
ファイル: push.py プロジェクト: a30f49/gobelieve_api
def unbind_device_token():
    rds = g.rds
    appid = request.appid
    uid = request.uid
    obj = json.loads(request.data)

    device_token = obj.get("apns_device_token", "")
    pushkit_device_token = obj.get("pushkit_device_token", "")
    ng_device_token = obj.get("ng_device_token", "")
    xg_device_token = obj.get("xg_device_token", "")
    xm_device_token = obj.get("xm_device_token", "")
    hw_device_token = obj.get("hw_device_token", "")
    gcm_device_token = obj.get("gcm_device_token", "")
    jp_device_token = obj.get("jp_device_token", "")

    if not device_token and not pushkit_device_token \
       and not ng_device_token and not xg_device_token \
       and not xm_device_token and not hw_device_token \
       and not gcm_device_token and not jp_device_token:
        raise ResponseMeta(400, "invalid param")


    User.reset_user_device_token(rds, appid, uid,
                                 device_token, pushkit_device_token,
                                 ng_device_token, xg_device_token, 
                                 xm_device_token, hw_device_token,
                                 gcm_device_token, jp_device_token)

    return make_json_response({"success":True}, 200)
コード例 #15
0
def post_group_notification():
    appid = request.appid
    if appid in config.DISABLED_APP_IDS:
        raise ResponseMeta(400, "disabled appid")
    obj = request.get_json(force=True, silent=True, cache=False)
    if obj is None:
        logging.debug("json decode err:%s", e)
        raise ResponseMeta(400, "json decode error")

    group_id = obj["group_id"]
    content = obj["content"]
    resp = rpc.post_group_notification_s(appid, group_id, content, [])
    if resp.status_code == 200:
        return flask.make_response("", 200)
    else:
        return flask.make_response(resp.content, resp.status_code)
コード例 #16
0
ファイル: group.py プロジェクト: a30f49/gobelieve_api
def add_group_member(gid):
    appid = request.appid
    obj = json.loads(request.data)
    inviter = None
    if type(obj) is dict:
        if 'members' in obj:
            members = obj['members']
            inviter = obj.get('inviter')
        else:
            members = [obj]
    else:
        members = obj

    if len(members) == 0:
        return ""

    group = Group.get_group(g._db, gid)
    if not group:
        raise ResponseMeta(400, "group non exists")

    # 支持members参数为对象数组
    memberIDs = map(lambda m: m['uid'] if type(m) == dict else m, members)

    g._db.begin()
    for member_id in memberIDs:
        try:
            Group.add_group_member(g._db, gid, member_id)
            User.reset_group_synckey(g.rds, appid, member_id, gid)
        except pymysql.err.IntegrityError, e:
            # 可能是重新加入群
            # 1062 duplicate member
            if e[0] != 1062:
                raise
コード例 #17
0
def grant_auth_token():
    rds = g.rds
    appid = request.appid
    try:
        obj = json.loads(request.data)
    except ValueError, e:
        logging.debug("json decode err:%s", e)
        raise ResponseMeta(400, "json decode error")
コード例 #18
0
ファイル: customer.py プロジェクト: richmonkey/gobelieve_api
def customer_register():
    rds = g.rds
    db = g._db
    obj = request.get_json(force=True, silent=True, cache=False)
    if obj is None:
        logging.debug("json decode err")
        raise ResponseMeta(400, "json decode error")

    appid = obj.get("appid", 0)
    uid = obj.get("customer_id", "")
    name = obj.get("name", "")
    avatar = obj.get("avatar", "")

    if not appid:
        raise ResponseMeta(400, "invalid param")
    
    store_id = App.get_store_id(db, appid)
    if not store_id:
        raise ResponseMeta(400, "app do not support customer")

    if not uid:
        client_id = Customer.generate_client_id(rds)
    else:
        client_id = Customer.get_client_id(rds, appid, uid)
        if not client_id:
            client_id = Customer.generate_client_id(rds)
            Customer.set_client_id(rds, appid, uid, client_id)

    token = User.get_user_access_token(rds, appid, client_id)
    if not token:
        token = create_access_token()
        User.add_user_count(rds, appid, client_id)

    User.save_user(rds, appid, client_id, name, avatar, token)
    User.save_token(rds, appid, client_id, token)
        
    resp = {
        "token":token,
        "store_id":store_id,
        "client_id":client_id,
    }
    data = {"data":resp}
    return make_response(200, data)
コード例 #19
0
def leave_group(gid, memberid):
    appid = request.appid
    #群组管理员或者成员本身有权限退出群
    if memberid != request.uid:
        raise ResponseMeta(400, "no authority")

    remove_group_member(appid, gid, {"uid":memberid})

    resp = {"success":True}
    return make_response(200, resp)
コード例 #20
0
def get_one_supporter():
    rds = g.rds
    db = g._db

    appid = request.appid
    uid = request.uid

    store_id = request.args.get('store_id', 0)
    store_id = int(store_id)

    if not store_id:
        raise ResponseMeta(400, 'require store_id param')

    sellers = Seller.get_sellers(db, store_id)
    if not sellers:
        raise ResponseMeta(400, 'store no supporter')

    seller = None
    #获取上次对话的客服id
    last_store_id, last_seller_id = User.get_seller(rds, appid, uid)
    if store_id == last_store_id and last_seller_id > 0:
        for s in sellers:
            if s['id'] == last_seller_id:
                status = Supporter.get_user_status(rds, s['id'])
                s['status'] = status
                seller = s
                break

    if not seller:
        seller = get_new_seller(rds, sellers)
        User.set_seller(rds, appid, uid, store_id, seller['id'])

    name = ""
    if seller.has_key('name') and seller['name']:
        name = seller['name'].split('@')[0]

    resp = {
        "seller_id": seller['id'],
        "name": name,
        "status": seller["status"]
    }
    return make_json_response({"data": resp}, 200)
コード例 #21
0
ファイル: group.py プロジェクト: a30f49/gobelieve_api
def delete_group_member(gid):
    appid = request.appid
    members = json.loads(request.data)
    if len(members) == 0:
        raise ResponseMeta(400, "no memebers to delete")

    group = Group.get_group(g._db, gid)
    if not group:
        raise ResponseMeta(400, "group non exists")

    for m in members:
        if type(m) == int:
            member = {"uid": m}
        else:
            member = m

        remove_group_member(appid, gid, group['name'], member)

    resp = {"success": True}
    return make_response(200, resp)
コード例 #22
0
ファイル: message.py プロジェクト: zhongxuan123/gobelieve_api
def dequeue_message():
    appid = request.appid
    uid = request.uid

    obj = json.loads(request.data)
    msgid = obj["msgid"] if obj.has_key("msgid") else 0
    if not msgid:
        raise ResponseMeta(400, "invalid msgid")

    r = rpc.dequeue_message(appid, uid, msgid)
    logging.debug("dequue message:%s", r)
    return make_response(200, {"data":{"success":True}})
コード例 #23
0
def delete_group_member(gid):
    appid = request.appid

    #群组管理员有权限删除群成员
    master = Group.get_group_master(g._db, gid)
    if master != request.uid:
        raise ResponseMeta(400, "no authority")

    members = json.loads(request.data)
    if len(members) == 0:
        raise ResponseMeta(400, "no memebers to delete")

    for m in members:
        if type(m) == int:
            member = {"uid": m}
        else:
            member = m

        remove_group_member(appid, gid, member)

    resp = {"success": True}
    return make_response(200, resp)
コード例 #24
0
def post_group_message():
    appid = request.appid
    obj = request.get_json(force=True, silent=True, cache=False)
    if obj is None:
        logging.debug("json decode err:%s", e)
        raise ResponseMeta(400, "json decode error")

    res = rpc.post_group_message(appid, obj["sender"], obj["receiver"],
                                 obj["content"])
    if res.status_code == 200:
        return flask.make_response("", 200)
    else:
        return flask.make_response(res.content, res.status_code)
コード例 #25
0
def post_notification():
    appid = request.appid
    obj = request.get_json(force=True, silent=True, cache=False)
    if obj is None:
        logging.debug("json decode err:%s", e)
        raise ResponseMeta(400, "json decode error")

    uid = obj["receiver"]
    content = obj["content"]
    resp = rpc.post_peer_notification(appid, uid, content)
    if resp.status_code == 200:
        return flask.make_response("", 200)
    else:
        return flask.make_response(resp.content, resp.status_code)
コード例 #26
0
ファイル: group.py プロジェクト: a30f49/gobelieve_api
def leave_group_member(gid, memberid):
    appid = request.appid
    group = Group.get_group(g._db, gid)
    if not group:
        raise ResponseMeta(400, "group non exists")

    name = User.get_user_name(g.rds, appid, memberid)
    m = {"uid": memberid}
    if name:
        m['name'] = name
    remove_group_member(appid, gid, group['name'], m)

    resp = {"success": True}
    return make_response(200, resp)
コード例 #27
0
def update_group(gid):
    appid = request.appid
    obj = request.get_json(force=True, silent=True, cache=False)
    if obj is None:
        logging.debug("json decode err:%s", e)
        raise ResponseMeta(400, "json decode error")

    name = obj["name"]
    Group.update_group_name(g._db, gid, name)

    v = {"group_id": gid, "timestamp": int(time.time()), "name": name}
    op = {"update_name": v}
    send_group_notification(appid, gid, op, None)

    return ""
コード例 #28
0
def set_user_name(uid):
    rds = g.rds
    appid = request.appid
    obj = json.loads(request.data)
    name = obj["name"] if obj.has_key("name") else ""
    if name:
        User.set_user_name(rds, appid, uid, name)
    elif obj.has_key('forbidden'):
        #聊天室禁言
        fb = 1 if obj['forbidden'] else 0
        User.set_user_forbidden(rds, appid, uid, fb)
        content = "%d,%d,%d"%(appid, uid, fb)
        publish_message(rds, "speak_forbidden", content)
    else:
        raise ResponseMeta(400, "invalid param")

    return ""
コード例 #29
0
def create_group():
    appid = request.appid
    obj = json.loads(request.data)
    master = obj["master"]
    name = obj["name"]
    is_super = obj["super"] if "super" in obj else False
    members = obj["members"]

    if hasattr(request, 'uid') and request.uid != master:
        raise ResponseMeta(400, "master must be self")

    #支持members参数为对象数组
    #[{uid:"", name:"", avatar:"可选"}, ...]
    memberIDs = [m['uid'] if type(m) == dict else m for m in members]

    gid = Group.create_group(g._db, appid, master, name, is_super, memberIDs)

    s = 1 if is_super else 0
    content = {
        "group_id": gid,
        "app_id": appid,
        "super": s,
        "name": Group.GROUP_EVENT_CREATE
    }
    publish_message(g.rds, content)

    for mem in memberIDs:
        content = {
            "group_id": gid,
            "member_id": mem,
            "name": Group.GROUP_EVENT_MEMBER_ADD
        }
        publish_message(g.rds, content)

    v = {
        "group_id": gid,
        "master": master,
        "name": name,
        "members": members,
        "timestamp": int(time.time())
    }
    op = {"create": v}
    send_group_notification(appid, gid, op, members)

    resp = {"data": {"group_id": gid}}
    return make_response(200, resp)
コード例 #30
0
ファイル: group.py プロジェクト: a30f49/gobelieve_api
def create_group():
    appid = request.appid
    obj = json.loads(request.data)
    master = obj["master"]
    name = obj["name"]
    is_super = obj["super"] if obj.has_key("super") else False
    members = obj["members"]

    if hasattr(request, 'uid') and request.uid != master:
        raise ResponseMeta(400, "master must be self")

    gid = 0
    if config.EXTERNAL_GROUP_ID:
        gid = obj['group_id'] if obj.has_key('group_id') else 0

    #支持members参数为对象数组
    #[{uid:"", name:"", avatar:"可选"}, ...]
    memberIDs = map(lambda m: m['uid'] if type(m) == dict else m, members)

    if gid > 0:
        gid = Group.create_group_ext(g._db, gid, appid, master, name, is_super,
                                     memberIDs)
    else:
        gid = Group.create_group(g._db, appid, master, name, is_super,
                                 memberIDs)

    s = 1 if is_super else 0
    content = "%d,%d,%d" % (gid, appid, s)
    publish_message(g.rds, "group_create", content)

    for mem in memberIDs:
        content = "%d,%d" % (gid, mem)
        publish_message(g.rds, "group_member_add", content)

    v = {
        "group_id": gid,
        "master": master,
        "name": name,
        "members": members,
        "timestamp": int(time.time())
    }
    op = {"create": v}
    send_group_notification(appid, gid, op, members)

    resp = {"data": {"group_id": gid}}
    return make_response(200, resp)