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 ""
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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
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")
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)
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)
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)
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)
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}})
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)
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)
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)
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)
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 ""
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 ""
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)
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)