def hongbao(): """ 定期统计用户发送口令, 获取红包的情况 规则: 用户向派派发送口令, 获得红包 :return: """ from datetime import datetime from bson import ObjectId import re redis = _redis_client() # 获得已发红包的用户 processed_users = set(json.loads(redis.get('viae/viae.provisional.hongbao/processed_users') or '[]')) # 获得红包处理进度的时间戳 utc_tz = timezone('UTC') processed_since = redis.get('viae/viae.provisional.hongbao/processed_ts') logger.info('Processing from %s' % processed_since) processed_since = datetime.strptime(processed_since, '%Y-%m-%d %H:%M:%S').replace(tzinfo=utc_tz) dummy_id = ObjectId.from_datetime(processed_since) # 找到哪些用户发送过红包口令 pattern = re.compile(u'(体验旅行派APP领现金红包|新用户口令|领新用户红包|从微信过来领红包|下单送北京大房免费住)', re.IGNORECASE) sender_list = mongo_hedy.Message.distinct('senderId', {'_id': {'$gt': dummy_id}, 'receiverId': 10000, 'contents': pattern}) # 这些用户必须不在已发送红包的列表中, 并且为两天内注册的 final_senders = {} user_dummy_id = ObjectId.from_datetime(processed_since - timedelta(days=7)) for s in filter(lambda v: v not in processed_users, sender_list): u = mongo_yunkai.UserInfo.find_one({'userId': s, '_id': {'$gt': user_dummy_id}}, {'userId': 1, 'nickName': 1}) if not u: continue final_senders[u['userId']] = u if final_senders: # 准备报表 sections = [] for uid, user in sorted(final_senders.items(), key=lambda v: v[0]): messages = mongo_hedy.Message.find({'senderId': uid, 'receiverId': 10000}, {'contents': 1}) c = '\n'.join([tmp['contents'] for tmp in messages]) sections.append(u'%d: %s\n%s\n\n' % (uid, user['nickName'], c)) processed_users.add(uid) email_contents = ''.join(sections).strip() from viae.job import send_email_to_group, send_email logger.info('Sending hongbao stats') send_email_to_group(groups='MARKETPLACE', subject=u'红包申请统计', body=email_contents) # 默认7天过期 expire = 7 * 24 * 3600 redis.set('viae/viae.provisional.hongbao/processed_users', json.dumps(list(processed_users)), expire) redis.set('viae/viae.provisional.hongbao/processed_ts', (datetime.utcnow() - timedelta(minutes=20)).replace(tzinfo=utc_tz).strftime('%Y-%m-%d %H:%M:%S'), expire)
def send_sms(self, targets, message): """ 发送短信 :param targets: 目标手机号. 可以是表示手机号的字符串, 或多个这样的手机号, 表示同时发送给多个手机 :param message: 需要发送的内容. :return: 如果发送成功, 返回短信网关的任务ID. 否则返回None. """ logger.info('target: %s, message: %s' % (targets, message)) logger.error('target: %s, message: %s' % (targets, message))
def on_create_user(user_id, source=None, channel=None, promotionCode=None): logger.info( 'User created: %d, source: %s, channel: %s, promotionCode: %s' % (user_id, source, channel, promotionCode)) # 处理邀请码 promotion_code = (promotionCode or '').strip() if promotion_code: process_promotion_code(user_id, promotion_code) # 将派派添加为好友 url = urljoin(settings.API_SERVER_BASE_URL, '/app/users/%d/contacts' % user_id) requests.post(url, json={'userId': 10000}) from datetime import datetime, timedelta import copy from viae.database import mongo_main # 添加优惠券 coupon_template = { 'className': 'com.lvxingpai.model.marketplace.misc.BasicCoupon', 'threshold': 0, 'userId': user_id, 'title': '', 'desc': '', 'discount': 0, 'expire': datetime.now() + timedelta(days=90), 'available': True } c = copy.deepcopy(coupon_template) c['title'] = u'现金券' c['desc'] = u'全场通用' c['discount'] = 1000 coupons = [c] if channel == 'baidu': discounts = [(300, 15), (600, 30), (1000, 50), (1500, 75), (3000, 160), (5000, 260), (8000, 400), (10000, 500), (30000, 1500)] else: discounts = [(300, 15), (600, 30), (800, 40), (1000, 50), (1500, 75), (2000, 100)] for entry in discounts: c = copy.deepcopy(coupon_template) c['title'] = u'代金券' c['threshold'] = entry[0] * 100 c['discount'] = entry[1] * 100 coupons.append(c) db = mongo_main for c in coupons: db.Coupon.save(c) total = sum([c['discount'] for c in coupons]) / 100 payload = {'title': u'嘘寒问暖,不如送你巨款!%d元现金已到账~点击去查看' % total} send_complex_message.__call__(10000, user_id, 21, json.dumps(payload))
def process_promotion_code(user_id, promotion_code): """ 根据promotion_code信息, 统计有哪些人邀请了哪些人 :param user_id: 被邀请用户的id :param promotion_code: 被邀请用户填写的邀请码 :return: """ from viae.database import mongo_yunkai # 找到referrer logger.info('Promotion code: %s' % promotion_code) r = mongo_yunkai.UserInfo.find_one({'promotionCode': promotion_code.upper()}, {'userId': 1}) if not r: # 尝试通过用户名来查找referrer r = mongo_yunkai.UserInfo.find_one({'nickName': promotion_code}, {'userId': 1}) if r: referrer_id = r['userId'] logger.info('Invited by user: %d' % referrer_id) mongo_yunkai.UserInfo.update({'userId': user_id}, {'$set': {'referrer': referrer_id}})
def on_user_login(user_id, source): logger.info('User %d logged in from %s' % (user_id, source)) if source != 'braavos': send_plain_text_message.delay(10000, user_id, u'欢迎亲爱的来到旅行派~ 我是派派,你的贴心执事管家。' u'亲爱的有什么问题都可以问派派,如果被商家欺负了也可以来找派派投诉,' u'派派去踢坏蛋的屁股!')