def post(self, user_name, gid, share_to, location, text, type, files, *args, **kwargs): primary_account = GDevRdsInts.send_cmd(*get_group_primary(gid)) if primary_account is None: return {'status': 1} ts = float('%0.2f' % time.time()) share_id = ':'.join(('share', str(ts), gid, user_name)) GDevRdsInts.send_cmd(*add_self_share(user_name, ts, share_id)) GDevRdsInts.send_cmd(*save_share_info( share_id, user_name, gid, share_to, location, text, type, files)) accounts = GDevRdsInts.send_cmd(*get_group_followers(gid)) logger.debug('share, accounts={0}'.format(accounts)) # accounts is set object accounts.add(primary_account) sn = GDevRdsInts.send_cmd(*get_sn_of_gid(gid)) accounts.add(sn) logger.debug('share, accounts={0}'.format(accounts)) for acc in accounts: GDevRdsInts.send_cmd(*add_share(acc, share_id, ts)) if acc == user_name: continue elif acc[:3] == 'wx#': continue GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', push_pack(user_name, 'share', 2, ':'.join((share_id, text, type, files)), account=acc))) return {'share_id': share_id}
def get(self, username, gid, userinfo='', *args, **kwargs): sn = GDevRdsInts.send_cmd(*get_sn_of_gid(gid)) logger.debug('username = %r, gid = %r, sn = %r, userinfo = %r', username, gid, sn, userinfo) GDevRdsInts.send_cmd(*hdel_wechat_gid(username, gid)) GDevRdsInts.send_multi_cmd( *combine_redis_cmds(unfollow_group(gid, sn, username))) accounts = GDevRdsInts.send_cmd(*get_group_followers(gid)) logger.debug('share, accounts={0}'.format(accounts)) # accounts is set object primary_account = GDevRdsInts.send_cmd(*get_group_primary(gid)) accounts.add(primary_account) sn = GDevRdsInts.send_cmd(*get_sn_of_gid(gid)) accounts.add(sn) logger.debug('share, accounts={0}'.format(accounts)) for acc in accounts: if acc[:3] == 'wx#': continue GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', # sourcer, cb, from, description push_pack(username, 'unfollow', 2, ':'.join((username, gid)), account=acc))) return 'success'
def get(self, user_name, sn, lon, lat, radius, name, action, *args, **kwargs): primary = GDevRdsInts.send_cmd(*get_dev_primary(sn)) if user_name != primary: return {'status': 1} gid = GDevRdsInts.send_cmd(*get_gid_of_sn(sn)) payload = ujson.dumps({ 'lon': lon, 'lat': lat, 'rad': radius, 'name': name, 'creator': user_name, 'action': action }) GDevRdsInts.send_multi_cmd(*combine_redis_cmds( set_user_group_msglist(sn, gid, 'geo_fence', payload))) GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', push_pack(user_name, 'set_geo_fence', 2, payload, account=sn))) if action == 'add': GDevRdsInts.send_cmd( *save_geo_fence(sn, user_name, lon, lat, radius, name)) elif action == 'del': GDevRdsInts.send_cmd(*del_geo_fence(sn, lon, lat, radius)) return {'status': 0}
def post(self, user_name, sn, payload, *args, **kwargs): logger.debug(u'event report -- acc={0}, sn={1}, payload={2}'.format( user_name, sn, bs2unicode(payload))) payload = ujson.loads(payload) reason = payload.get('reason') if reason == 'geo_fence_alert': attr = payload.get('attr') ts = payload.get('ts') longitude = attr.get('lon') latitude = attr.get('lat') radius = attr.get('rad') _ = GDevRdsInts.send_cmd( *get_geo_fence(user_name, longitude, latitude, radius)) creator, name = _.split(':') GMQDispRdsInts.send_multi_cmd(*combine_redis_cmds([ shortcut_mq( 'cloud_push', push_pack(user_name, 'geo_fence_alertqqq', 2, payload, account=creator)) ])) sample_freq = 600 next_latency = 3600 return { 'state': 0, 'next_latency': next_latency, 'sample_freq': sample_freq }
def post(self, user_name, share_id, *args, **kwargs): gid = '' sl = share_id.split(':') author = '' if len(sl) == 4: _, _, gid, author = sl elif len(sl) == 3: _, _, author = sl logger.debug(u'delete share, gid={0}, author={1}, acc={2}'.format( gid, author, user_name)) if not self.can_delete(gid, author, user_name): return {'status': 1} share_info = GDevRdsInts.send_cmd(*retrieve_share_info(share_id)) if share_info is None: return {'status': 2} files = share_info.get('files') if files: fns = json.loads(files) logger.debug( u'delete share, share_id={0}, gid={1}, fns={2}'.format( share_id, gid, fns)) for k, v in fns.items(): urllib2.urlopen(BEIQI_FILE_DELETE_URL.format(file=bs2utf8(v))) comment_id_list = GDevRdsInts.send_cmd(*get_comment(share_id)) if comment_id_list is not None: for comment_id in comment_id_list: fn = GDevRdsInts.send_cmd( *get_comment_file(share_id, comment_id)) urllib2.urlopen(BEIQI_FILE_DELETE_URL.format(file=fn)) GDevRdsInts.send_cmd(*del_comment_info(share_id, comment_id)) GDevRdsInts.send_multi_cmd(*combine_redis_cmds( del_share(user_name, share_id), del_comment(share_id), del_share_info(share_id))) if gid: sn = GDevRdsInts.send_cmd(*get_sn_of_gid(gid)) accounts = GDevRdsInts.send_cmd(*get_group_followers(gid)) primary_account = GDevRdsInts.send_cmd(*get_group_primary(gid)) accounts.add(primary_account) accounts.add(sn) logger.debug(u'accounts={0}'.format(accounts)) for user in accounts: if user_name == user: continue GDevRdsInts.send_cmd(*del_share(user, share_id)) GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', push_pack( user_name, 'delete_share', 2, share_id, account=user))) return {'status': 0}
def get(self, user_name, file_type, fn, ref, thumb_fn="", thumb_ref="", text="", *args, **kwargs): des = bs2utf8(':'.join([urllib2.quote(bs2utf8(v)) for v in (user_name, file_type, fn, ref, thumb_fn, thumb_ref,text)])) GMQDispRdsInts.send_cmd(* shortcut_mq('chat_msg', push_pack(user_name, 'msg', 2, desc=des) ) )
def wechat_msg_bcast(author, file_type, fn, ref, thumb_fn="", thumb_ref="", text=""): logger.debug('wechat_msg_bcast author={0}, type={1}, fn={2}, ref={3}, thumb_fn={4}, thumb_ref={5}, text={6}'.format(author, file_type, fn, ref, thumb_fn, thumb_ref, text)) des = bs2utf8(':'.join([urllib2.quote(bs2utf8(v)) for v in (author, file_type, fn, ref, thumb_fn, thumb_ref, text)])) GMQDispRdsInts.send_cmd( *shortcut_mq( 'chat_msg', push_pack(author, 'msg', 2, des) ) )
def get(self, user_name, sn, action, *args, **kwargs): primary = GDevRdsInts.send_cmd(*get_dev_primary(sn)) if not primary: return {'state': 1} logger.debug('dev ctrl sn: {0}, action: {1}, acc: {2}'.format( sn, action, user_name)) GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', push_pack(user_name, 'dev_ctrl', 2, action, account=sn))) return {'state': 0}
def get(self, user_name, dev_sn, name, ref, *args, **kwargs): version = "1" logic = "play" type = "audio" payload = ':'.join([ bs2utf8(urllib.quote_plus(v)) for v in (version, logic, type, name, ref) ]) GMQDispRdsInts.send_cmd(*shortcut_mq( 'dev_msg', push_pack(user_name, 'msg', 2, payload, account=dev_sn)))
def get(self, user_name, receiver, app, payload, *args, **kwargs): now = str(time.time()) payload = '$'.join((user_name, payload)) result = GDevRdsInts.send_cmd( *set_app_data(receiver, app, now, payload)) logger.debug(u'result = %r', result) GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', push_pack(user_name, 'set_app_data', 2, payload, account=receiver))) return {'status': 0}
def get(self, user_name, applicant, gid, allowed, msg='', *args, **kwargs): primary = GDevRdsInts.send_cmd(*get_group_primary(gid)) if not primary: return {'status': 1} if primary != user_name: return {'status': 2} sn = GDevRdsInts.send_cmd(*get_sn_of_gid(gid)) if allowed: GDevRdsInts.send_multi_cmd( *combine_redis_cmds(follow_group(gid, sn, applicant))) if applicant[:3] == 'wx#': # applicant from wechat logger.debug(u'wechat user follow: ', applicant) GDevRdsInts.send_cmd(*hset_wechat_gid(applicant, gid)) token = gen_wechat_access_token(GAccRdsInts) customerServiceUrl = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=' + token payload = \ { "touser": applicant[3:], "msgtype": "text", "text": { "content": "恭喜你设备添加成功。可以给平板发送照片了!" } } resp = HttpRpcClient().fetch_async(url=customerServiceUrl, body=ujson.dumps( payload, ensure_ascii=False)) logger.debug('wechat resp.code = %r, body = %r', resp.code, resp.body) return {'status': 0} payload = ujson.dumps({ 'reviewer': user_name, 'allowed': allowed, 'msg': msg, 'gid': gid }) logger.debug(u'follow review, applicant=%r, payload=%r' % (applicant, payload)) # 把关注验证结果放到申请人的消息列表里 GDevRdsInts.send_multi_cmd(*combine_redis_cmds( set_user_group_msglist(applicant, gid, 'follow_review', payload))) GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', push_pack( user_name, 'follow_review', 2, payload, account=applicant))) return {'status': 0}
def msg_2_ios(author, type, files, text=''): gid_list = get_user_gids(author, dev_filter) logger.debug('msg_2_ios:: gid_list=%r, author=%r', gid_list, author) share_to = '' location = '' resp = {} accounts = set([]) ts = float('%0.2f' % time.time()) for gid in gid_list: primary_account = dev_filter.send_cmd(*get_group_primary(gid)) if primary_account is None: return json.dumps({'status': 1}) share_id = ':'.join(('share', str(ts), gid, author)) dev_filter.send_cmd(*add_self_share(author, ts, share_id)) dev_filter.send_cmd(*save_share_info(share_id, author, gid, share_to, location, text, type, files, come_from='wechat')) accounts.update(dev_filter.send_cmd(*get_group_followers(gid))) accounts.add(primary_account) accounts.add(dev_filter.send_cmd(*get_sn_of_gid(gid))) resp[gid] = {'share_id': share_id} send_accounts = filter(lambda u: u != author and should_send_ios(u, type), accounts) logger.debug('msg_2_ios, send_accounts={0}'.format(send_accounts)) for acc in send_accounts: dev_filter.send_cmd(*add_share(acc, share_id, ts)) mq_hub.send_cmd(*shortcut_mq( 'cloud_push', # sourcer, cb, from, description push_pack(author, 'share', 2, ':'.join((share_id, text, type, files)), account=acc))) return resp
def post(self, user_name, receivers, duplicate_to, topic, text, type, files, *args, **kwargs): ts = float('%0.2f' % time.time()) letter_id = ':'.join(('letter', str(ts), user_name, receivers)) GDevRdsInts.send_cmd( *save_letter_info(letter_id, ':'.join((topic, text, type, files)))) GDevRdsInts.send_cmd(*add_letter_outbox(user_name, letter_id, ts)) receivers = ujson.loads(receivers) logger.debug('receivers={0}'.format(receivers)) acc_noexist_list = [] for acc in receivers: acc = bs2utf8(acc) account_exist = GAccRdsInts.send_cmd(*exist_account(acc)) if not account_exist: # not in redis, check mysql sql = "select * from {db} where user_name='{user_name}'".format( db='ssp_user_login', user_name=acc) res = DBBeiqiSspInst.query(sql) if len(res) == 0: # not in mysql, so we check if it's a sn if not is_email(acc): primary = GDevRdsInts.send_cmd(*get_dev_primary(acc)) if not primary: # no primary, illegal logger.debug('acc={0} not exist'.format(acc)) acc_noexist_list.append(acc) continue else: # exist in mysql, so we cache it in redis pwd = res[0].get('password').encode('utf8') GAccRdsInts.send_cmd(*set_account_pwd(acc, pwd)) GDevRdsInts.send_cmd(*add_letter_inbox(acc, letter_id, ts)) GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', # sourcer, cb, from, description push_pack(user_name, 'letter', 2, ':'.join((letter_id, topic, text, type, files)), account=acc))) return acc_noexist_list
def get(self, user_name, sn, *args, **kwargs): sql = "SELECT 1 FROM {db} WHERE sn = '{sn}'".format( db=DB_TBL_DEVICE_INFO, sn=sn) ret_list = DBBeiqiSspInst.query(sql) if len(ret_list) == 0: return {'status': 1} primary = GDevRdsInts.send_cmd(*get_dev_primary(sn)) if primary is None: return {'status': 1} logger.debug('check dev args: pid: {0}, acc: {1}'.format( sn, user_name)) GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', push_pack(user_name, 'check_dev_args', 2, '', account=sn))) return {'status': 0}
def get(self, user_name, sn, f, d, payload, *args, **kwargs): logger.debug('cmd_rpt_v1 sn: {0}, d: {1}, f: {2}'.format(sn, d, f)) primary = GDevRdsInts.send_cmd(*get_dev_primary(sn)) logger.debug('cmd rpt primary: {0}'.format(primary)) if not primary: logger.debug('cmd rpt sn={0} no primary'.format(sn)) self.set_status(400) return if f != primary: followers = GDevRdsInts.send_cmd(*get_dev_followers(sn)) if f not in followers: logger.debug( 'cmd rpt primary = {0}, f = {1}, sn = {2}, followers = {3]' .format(primary, f, sn, followers)) self.set_status(400) return m = FEEDBACK_PATTERN.search(d) if not m: self.set_status(400) return user_cmd, cmd_ord, error_state = [ m.groupdict().get(k) for k in REPORT_KEYS ] if payload: description = payload else: description = errno_map.get(error_state) or 'fb_dft' logger.debug('cmd rpt desc: {0}'.format(description)) GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', push_pack(sn, '{0}:{1}:{2}'.format(error_state, 'cmd_report', int(cmd_ord, 16)), 0, description, account=f))) return ''
def add_device(username, code, user_info=None): primary = GDevRdsInts.send_cmd(*get_group_primary(code)) if not primary: return {'status': 3} if username == primary: return {'status': 9} following = GDevRdsInts.send_cmd(*test_user_follow_group(username, code)) if following: return {'status': 8} payload = ujson.dumps({'applicant': username, 'pid': code, 'msg': '', 'file': '', 'time': str(time.time())}) # put follow request into primary msglist GDevRdsInts.send_multi_cmd(*combine_redis_cmds(set_user_group_msglist(primary, code, 'follow', payload))) # set user info if user_info is None: user_info = get_userinfo(username) nickname = bs2utf8(user_info.get('nickname')) user_info = ujson.dumps(user_info) GDevRdsInts.send_cmd(*set_user_info(username, user_info)) GDevRdsInts.send_cmd(*set_user_nickname(username, nickname)) GMQDispRdsInts.send_cmd( *shortcut_mq('gen_mysql', mysql_pack(DB_TBL_USER_INFO, {'nickname': nickname}, action=2, ref_kvs={'username': username} ) ) ) logger.debug('set user info, username={0}, user_info={1}'.format(username, user_info)) GMQDispRdsInts.send_cmd( # sourcer, cb, from, description *shortcut_mq('cloud_push', push_pack(username, 'follow', 2, payload, account=primary)) ) logger.debug('follow, acc={0}, followee={1}, msg={2}, file={3}'.format(username, code, '', '')) return {'status': 1}
def get(self, user_name, master, gid, reply, *args, **kwargs): primary = GDevRdsInts.send_cmd(*get_group_primary(gid)) if primary != master: return {'status': 1} if reply == 'Y': sn = GDevRdsInts.send_cmd(*get_sn_of_gid(gid)) GDevRdsInts.send_multi_cmd( *combine_redis_cmds(follow_group(gid, sn, user_name))) GDevRdsInts.send_cmd(*del_invite_follow(gid, master, user_name)) GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', push_pack(user_name, 'reply_invite_follow', 2, 'reply={0}'.format(reply), account=master))) return {'status': 0}
def post(self, user_name, sn, payload, *args, **kwargs): logger.debug('change dev args: sn: {0}, payload: {1}, acc: {2}'.format( sn, payload, user_name)) if not user_name or not sn or not payload: self.set_status(400) return sql = "SELECT 1 FROM {db} WHERE sn = '{sn}'".format( db=DB_TBL_DEVICE_INFO, sn=sn) ret_list = DBBeiqiSspInst.query(sql) if len(ret_list) == 0: return {'status': 1} primary = GDevRdsInts.send_cmd(*get_dev_primary(sn)) if primary is None: return {'status': 1} GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', push_pack(user_name, 'change_dev_args', 2, payload, account=sn))) logger.debug('cloud_push doing') return {'state': 0}
def get(self, user_name, guest, gid, msg, file, *args, **kwargs): primary = GDevRdsInts.send_cmd(*get_group_primary(gid)) if primary != user_name: return {'status': 1} account_exist = GAccRdsInts.send_cmd(*exist_account(guest)) if not account_exist: sql = "select * from {db} where user_name='{user_name}'".format( db='ssp_user_login', user_name=guest) res = self.settings.get('mysql_db').query(sql) if len(res) == 0: return {'status': 2} else: # exist in mysql, so we cache it in redis pwd = res[0].get('password').encode('utf8') GAccRdsInts.send_cmd(*set_account_pwd(guest, pwd)) sn = GDevRdsInts.send_cmd(*get_sn_of_gid(gid)) GDevRdsInts.send_cmd(*follow_group(gid, sn, guest)) payload = ujson.dumps({ 'master': user_name, 'gid': gid, 'msg': msg, 'file': file, 'action': 'invite_follow' }) GDevRdsInts.send_multi_cmd(*combine_redis_cmds( set_user_group_msglist(guest, gid, 'invite_follow', payload))) logger.debug('invite follow, guest={0}, gid={1}, payload={2}'.format( guest, gid, payload)) GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', push_pack(user_name, 'invite_follow', 2, payload, account=guest))) return {'status': 0}
def post(self, user_name, share_id, reply_to='', comment_id='', text='', type='', file='', *args, **kwargs): share_info = GDevRdsInts.send_cmd(*retrieve_share_info(share_id)) if share_info is None: return {'status': 1} comment_id_list = GDevRdsInts.send_cmd(*get_comment(share_id)) if comment_id != '' and comment_id not in comment_id_list: logger.debug('comment, comment_id={0}'.format(comment_id)) return {'status': 2} now = str(time.time()) new_comment_id = ':'.join(('comment', now, user_name)) GDevRdsInts.send_multi_cmd(*combine_redis_cmds( add_comment(share_id, new_comment_id), save_comment_info(share_id, new_comment_id, reply_to, comment_id, text, type, file))) accounts = [reply_to] if reply_to is not None else [] accounts += [share_id.split(':')[-1]] like_list = GDevRdsInts.send_cmd(*get_like(share_id)) accounts += like_list for acc in accounts: if acc[:3] == 'wx#': files = json.loads(share_info.get('files')) fn, ref = files.popitem() fn = bs2utf8(fn) ref = bs2utf8(ref) logger.debug('files = %r, fn = %r, ref = %r', files, fn, ref) tk = gen_file_tk(acc, fn, 0, 0) if fn[-4:] == '.jpg': pic_url = BEIQI_FILE_DOWN_URL + urllib.urlencode({ 'tk': tk, 'r': ref }) url = "" if not file: url = WECHAT_COMMENT_PAGE_URL + urllib.urlencode( {'text': text}) token = gen_wechat_access_token(GAccRdsInts) customerServiceUrl = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=' + token nickname = GDevRdsInts.send_cmd(*get_user_nickname(user_name)) payload = { "touser": acc[3:], "msgtype": "news", "news": { "articles": [{ "title": nickname + "评论了你的回复", "description": text, "url": url, "picurl": pic_url }] } } logger.debug('pic_url = %r', pic_url) resp = HttpRpcClient().fetch_async(url=customerServiceUrl, body=ujson.dumps( payload, ensure_ascii=False)) logger.debug('custom service send. resp = %r, payload = %r', resp.body, payload) else: GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', # sourcer, cb, from, description push_pack(user_name, 'comment', 2, ':'.join((user_name, share_id, reply_to, comment_id, text, type, file)), account=acc))) return {'comment_id': new_comment_id}
def post(self, user_name, code, msg='', file='', *args, **kwargs): if len(code) == 6: primary = GDevRdsInts.send_cmd(*get_group_primary(code)) if not primary: return {'status': 3} if user_name == primary: return {'status': 9} following = GDevRdsInts.send_cmd( *test_user_follow_group(user_name, code)) if following: return {'status': 8} payload = ujson.dumps({ 'applicant': user_name, 'pid': code, 'msg': msg, 'file': file, 'time': str(time.time()) }) # put follow request into primary msglist GMQDispRdsInts.send_multi_cmd(*combine_redis_cmds( set_user_group_msglist(primary, code, 'follow', payload))) GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', push_pack(user_name, 'follow', 2, payload, account=primary))) logger.debug( 'follow, acc={0}, followee={1}, msg={2}, file={3}'.format( user_name, code, msg, file)) return {'status': 1} elif len(code) == 9: # 识别码, 绑定 sn = GDevRdsInts.send_cmd(*get_ic_sn(code)) if not sn: return {'status': 4} gid = GDevRdsInts.send_cmd(*get_gid_of_sn(sn)) primary = GDevRdsInts.send_cmd(*get_dev_primary(sn)) if primary: return {'status': 5} real_ic = GDevRdsInts.send_cmd(*get_sn_ic(sn)) if real_ic != code: return {'status': 6} mobile = user_name.split('@') mobile = mobile[0] if len(mobile) > 1 else '' logger.debug('bind, acc={0}, sn={1}, code={2}'.format( user_name, sn, code)) GMQDispRdsInts.send_multi_cmd(*combine_redis_cmds( # sourcer, cb, from, description shortcut_mq( 'cloud_push', push_pack(user_name, 'bind', 2, ':'.join((user_name, sn)), account=sn)), shortcut_mq( 'gen_mysql', mysql_pack(DB_TBL_DEVICE_INFO, { 'primary': user_name, 'status': 'binded', 'mobile': mobile }, action=2, ref_kvs={'sn': sn})))) logger.debug('bind push sent') GDevRdsInts.send_multi_cmd( *combine_redis_cmds(bind_group_primary(gid, sn, user_name), del_ic_sn(code), del_sn_ic(sn))) return {'status': 2} else: return {'status': 7}
def post(self, user_name, gid, *args, **kwargs): primary = GDevRdsInts.send_cmd(*get_group_primary(gid)) if not primary: return {'status': 3} followers = GDevRdsInts.send_cmd(*get_group_followers(gid)) sn = GDevRdsInts.send_cmd(*get_sn_of_gid(gid)) if primary != user_name and user_name not in followers: return {'status': 4} # 账号:增加设备和主账号,减少wx账号和操作者账号 followers.add(primary) followers.add(sn) followers = filter(lambda u: u[:3] != 'wx#' and u != user_name, followers) if primary == user_name: for follow in followers: GDevRdsInts.send_multi_cmd( *combine_redis_cmds(unfollow_group(gid, sn, follow))) if follow[:3] == 'wx#': GDevRdsInts.send_cmd(*hdel_wechat_gid(follow, gid)) logger.debug(u'del wechat follow=%r, gid=%r', follow, gid) else: GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', # sourcer, cb, from, description push_pack( user_name, 'del_device', 2, '', account=follow))) # clean up data GDevRdsInts.send_multi_cmd( *combine_redis_cmds(unbind_group_primary(gid, sn, primary))) old_gid = GDevRdsInts.send_cmd(*get_old_gid(gid)) if old_gid: logger.debug('gid={0}, old_gid={1}'.format(gid, old_gid)) # gid belonged to nice_gid, keep binding with sn GMQDispRdsInts.send_cmd(*shortcut_mq( 'gen_mysql', mysql_pack(DB_TBL_DEVICE_INFO, { 'primary': '', 'status': 'unbound', 'mobile': '' }, action=2, ref_kvs={'sn': sn}))) else: GMQDispRdsInts.send_cmd(*shortcut_mq( 'gen_mysql', mysql_pack(DB_TBL_DEVICE_INFO, { 'primary': '', 'status': 'unbound', 'mobile': '' }, action=2, ref_kvs={'sn': sn}))) GDevRdsInts.send_cmd(*del_all_self_share(sn)) all_letters_in = GDevRdsInts.send_cmd(*get_letter_inbox(sn, 0, -1)) for letter_id in all_letters_in: GDevRdsInts.send_multi_cmd( *combine_redis_cmds(del_letter_info(letter_id), del_letter_inbox(sn, letter_id))) logger.debug('sn={0}'.format(sn)) return {'status': 1} elif user_name in followers: GDevRdsInts.send_multi_cmd( *combine_redis_cmds(unfollow_group(gid, sn, user_name))) if user_name[:3] == 'wx#': GDevRdsInts.send_cmd(*hdel_wechat_gid(user_name, gid)) logger.debug('send apns followers:%s' % followers) for user in followers: GMQDispRdsInts.send_cmd(*shortcut_mq( 'cloud_push', # sourcer, cb, from, description push_pack(user_name, 'unfollow', 2, ':'.join((user_name, gid)), account=user))) return {'status': 2}