def send_first_reward(self): standard_drop = get_drop(PURCHASE_FIRST_REWARD_PACKAGE_IDS) mail = Mail(self.char_id) mail.add(MAIL_PURCHASE_FIRST_TITLE, MAIL_PURCHASE_FIRST_CONTENT, attachment=json.dumps(standard_drop))
def send_reward_with_custom_price(self, goods_id, price): # 这里 price 是新台币,而且不一定是这个goods_id所对应的价格 # 所以这里按照比例给东西 p = PURCHASE[goods_id] xintaibi = p.rmb * 5 buy_div, buy_mod = divmod(price, xintaibi) for i in xrange(buy_div): self.send_reward(goods_id) if buy_mod: # 换算成对应的元宝 sycee = buy_mod * 2 # 任意金额也要双倍!!! buy_times = self.buy_times_of_this_goods(goods_id) if buy_times == 0: actual_sycee = sycee * 2 else: actual_sycee = sycee resource = Resource(self.char_id, "Purchase With Custom Price") resource.add(purchase_got=sycee, purchase_actual_got=actual_sycee) self.mongo_record.times[str(goods_id)] = buy_times + 1 self.mongo_record.save() self.send_notify() title = u'充值成功' content = u'获得了 {0} 元宝'.format(actual_sycee) mail = Mail(self.char_id) mail.add(title, content)
def trig(self, *args): if not self.is_valid(): return ac_record = ActivityConditionRecord(self.char_id, self.CONDITION_ID, self.activity_time) send_times = ac_record.send_times() if send_times >= 10: return condition = Q(char_id=self.char_id) & Q(purchase_at__gte=self.activity_time.nearest_open_date.timestamp) & Q(purchase_at__lte=self.activity_time.nearest_close_date.timestamp) logs = MongoPurchaseLog.objects.filter(condition) sycee_list = [log.sycee for log in logs if log.sycee >= self.CONDITION_VALUE] if len(sycee_list) > send_times: for i in range(len(sycee_list) - send_times): attachment = get_drop([self.activity_data.package]) mail = Mail(self.char_id) mail.add( self.activity_data.mail_title, self.activity_data.mail_content, attachment=json.dumps(attachment) ) ac_record.add_send(1)
def send_reward(self, goods_id): p = PURCHASE[goods_id] first = len(self.mongo_record.times) == 0 buy_times = self.mongo_record.times.get(str(goods_id), 0) is_first = buy_times == 0 if p.tp_obj.continued_days > 0: self.send_reward_yueka(goods_id, is_first) else: self.send_reward_sycee(goods_id, is_first) self.mongo_record.times[str(goods_id)] = buy_times + 1 self.mongo_record.save() self.send_notify() title = u'充值成功' content = u'获得了: {0}'.format(p.first_des if p.first_des else p.des) mail = Mail(self.char_id) mail.add(title, content) # 首冲奖励 if first: self.send_first_reward()
def activatecode_use(request): char_id = request._char_id code_id = request._proto.code_id data = {'char_id': char_id, 'code_id': code_id} try: res = api_activatecode_use(data) except APIFailure: raise SanguoException(errormsg.SERVER_FAULT, char_id, "ActivateCode Use", "APIFailure. api_activatecode_use") if res['ret'] != 0: raise SanguoException( res['ret'], char_id, "ActivateCode use", "api_activatecode_use ret = {0}".format(res['ret'])) # DONE package = res['data']['package'] drop = get_drop_from_raw_package(package) mail = Mail(char_id) mail.add(ACTIVATECODE_MAIL_TITLE, ACTIVATECODE_MAIL_CONTENT, arrow.utcnow().format('YYYY-MM-DD HH:mm:ss'), attachment=json.dumps(drop)) return None
def send_reward(self, goods_id): if goods_id == 1: # 不再有月卡 mail_message = "char {0} try to buy goods: {1}".format(self.char_id, goods_id) mail_admins(mail_message, mail_message, fail_silently=True) return p = PURCHASE[goods_id] first = len(self.mongo_record.times) == 0 buy_times = self.buy_times_of_this_goods(goods_id) is_first = buy_times == 0 # if p.tp_obj.continued_days > 0: # self.send_reward_yueka(goods_id, is_first) # else: # self.send_reward_sycee(goods_id, is_first) self.send_reward_sycee(goods_id, is_first) self.mongo_record.times[str(goods_id)] = buy_times + 1 self.mongo_record.save() self.send_notify() title = u'充值成功' content = u'获得了: {0}'.format(p.first_des if is_first else p.des) mail = Mail(self.char_id) mail.add(title, content) # 首冲奖励 if first: self.send_first_reward()
def send_mail(request): data = request.body data = json.loads(data) char_ids = data.get('char_id', None) if char_ids: cids = char_ids else: chars = MongoCharacter.objects.all() cids = [c.id for c in chars] mail_name = data['mail']['name'] mail_content = data['mail']['content'] mail_send_at = data['mail']['send_at'] attachment = data['mail'].get('attachment', '') if attachment: attachment = json.dumps( get_drop_from_raw_package(data['mail']['attachment']) ) for cid in cids: m = Mail(cid) m.add(mail_name, mail_content, create_at=mail_send_at, attachment=attachment) return {'ret': 0}
def send_addition_sycee_via_mail(self, sycee): # XXX 充值额外赠送通过邮件发送 drop = make_standard_drop_from_template() drop['sycee'] = sycee m = Mail(self.char_id) m.add(u"充值额外赠送", u"感谢您的充值,请领取额外赠送", attachment=json.dumps(drop))
def _vip_change(char_id, old_vip, new_vip, **kwargs): Prison(char_id).vip_changed(new_vip) m = Mail(char_id) m.add(name=MAIL_VIP_CHANGED_TITLE, content=MAIL_VIP_CHANGED_CONTENT.format(new_vip)) # 增加掠夺次数 plunder_times_change_value = VIP_FUNCTION[new_vip].plunder - VIP_FUNCTION[old_vip].plunder if plunder_times_change_value: plunder = Plunder(char_id) plunder.change_current_plunder_times(plunder_times_change_value, allow_overflow=True) vip_activies = [] if has_activity(22001): vip_activies.append(22001) if has_activity(40007): vip_activies.append(40007) if has_activity(40008): vip_activies.append(40008) if has_activity(50006): vip_activies.append(50006) if vip_activies: ActivityStatic(char_id).send_update_notify(activity_ids=vip_activies) ae = ActivityEntry(char_id, 50006) if ae and ae.is_valid(): ae.enable(new_vip) ActivityStatic(char_id).send_update_notify(activity_ids=[50006])
def cron_job(self): # 由系统的定时任务触发 # linux cronjob 每天定时执行 self.hang.used = 0 self.hang.save() if self.hang_doing: stage_id = self.hang_doing.stage_id if not self.hang_doing.finished: # 到结算点就终止 self.finish(set_hang=False) else: stage_id = max_star_stage_id(self.char_id) self.send_notify() remained = self.get_hang_remained() if remained and stage_id: stage = STAGES[stage_id] exp = remained / 15 * stage.normal_exp gold = remained / 15 * stage.normal_gold * 0.5 standard_drop = make_standard_drop_from_template() standard_drop['exp'] = int(exp) standard_drop['gold'] = int(gold) m = Mail(self.char_id) m.add( HANG_RESET_MAIL_TITLE, HANG_RESET_MAIL_CONTENT, arrow.utcnow().to( settings.TIME_ZONE).format('YYYY-MM-DD HH:mm:ss'), json.dumps(standard_drop))
def send_reward(self, goods_id): p = PURCHASE[goods_id] first = len(self.mongo_record.times) == 0 buy_times = self.mongo_record.times.get(str(goods_id), 0) is_first = buy_times == 0 if p.tp_obj.continued_days > 0: self.send_reward_yueka(goods_id, is_first) else: self.send_reward_sycee(goods_id, is_first) self.mongo_record.times[str(goods_id)] = buy_times + 1 self.mongo_record.save() self.send_notify() title = u'充值成功' content = u'获得了: {0}'.format(p.first_des if p.first_des else p.des) mail = Mail(self.char_id) mail.add(title, content) # 首冲奖励 if first: self.send_first_reward()
def send_reward(self, goods_id): if goods_id == 1: # 不再有月卡 mail_message = "char {0} try to buy goods: {1}".format(self.char_id, goods_id) mail_admins(mail_message, mail_message, fail_silently=True) return p = PURCHASE[goods_id] first = len(self.mongo_record.times) == 0 buy_times = self.buy_times_of_this_goods(goods_id) is_first = buy_times == 0 # if p.tp_obj.continued_days > 0: # self.send_reward_yueka(goods_id, is_first) # else: # self.send_reward_sycee(goods_id, is_first) self.send_reward_sycee(goods_id, is_first) self.mongo_record.times[str(goods_id)] = buy_times + 1 self.mongo_record.save() self.send_notify() title = u'充值成功' content = u'获得了: {0}'.format(p.first_des if is_first else p.des) mail = Mail(self.char_id) mail.add(title, content) # 首冲奖励 if first: self.send_first_reward()
def send_reward_with_custom_price(self, goods_id, price): # 这里 price 是新台币,而且不一定是这个goods_id所对应的价格 # 所以这里按照比例给东西 p = PURCHASE[goods_id] xintaibi = p.rmb * 5 buy_div, buy_mod = divmod(price, xintaibi) for i in xrange(buy_div): self.send_reward(goods_id) if buy_mod: # 换算成对应的元宝 sycee = buy_mod * 2 # 任意金额也要双倍!!! buy_times = self.buy_times_of_this_goods(goods_id) if buy_times == 0: actual_sycee = sycee * 2 else: actual_sycee = sycee resource = Resource(self.char_id, "Purchase With Custom Price") resource.add(purchase_got=sycee, purchase_actual_got=actual_sycee) self.mongo_record.times[str(goods_id)] = buy_times + 1 self.mongo_record.save() self.send_notify() title = u'充值成功' content = u'获得了 {0} 元宝'.format(actual_sycee) mail = Mail(self.char_id) mail.add(title, content)
def cron_job(self): # 由系统的定时任务触发 # linux cronjob 每天定时执行 self.hang.used = 0 self.hang.save() if self.hang_doing: stage_id = self.hang_doing.stage_id if not self.hang_doing.finished: # 到结算点就终止 self.finish(set_hang=False) else: stage_id = max_star_stage_id(self.char_id) self.send_notify() remained = self.get_hang_remained() if remained and stage_id: stage = STAGES[stage_id] exp = remained / 15 * stage.normal_exp gold = remained / 15 * stage.normal_gold * 0.5 standard_drop = make_standard_drop_from_template() standard_drop['exp'] = int(exp) standard_drop['gold'] = int(gold) m = Mail(self.char_id) m.add( HANG_RESET_MAIL_TITLE, HANG_RESET_MAIL_CONTENT, arrow.utcnow().to(settings.TIME_ZONE).format('YYYY-MM-DD HH:mm:ss'), json.dumps(standard_drop) )
def trig(self): if not self.is_valid(): return now = arrow.utcnow().to(settings.TIME_ZONE) if now.hour != 20: return date_str = now.format('YYYY-MM-DD') key = 'activity40006#{0}#{1}'.format( date_str, self.char_id ) try: MongoKeyRecord.objects.get(id=key) except DoesNotExist: kr = MongoKeyRecord(id=key) kr.value = 1 kr.save() m = Mail(self.char_id) m.add( self.activity_data.mail_title, self.activity_data.mail_content, attachment=json.dumps(get_drop([self.activity_data.package])) )
def send_mail(self): attachment = get_drop([self.activity_data.package]) mail = Mail(self.char_id) mail.add( self.activity_data.mail_title, self.activity_data.mail_content, attachment=json.dumps(attachment) )
def send_first_reward(self): standard_drop = get_drop(PURCHASE_FIRST_REWARD_PACKAGE_IDS) mail = Mail(self.char_id) mail.add( MAIL_PURCHASE_FIRST_TITLE, MAIL_PURCHASE_FIRST_CONTENT, attachment=json.dumps(standard_drop) )
def trig(self, extra_sycee): if not self.is_valid(): return attachment = make_standard_drop_from_template() attachment["sycee"] = extra_sycee mail = Mail(self.char_id) mail.add(self.activity_data.mail_title, self.activity_data.mail_content, attachment=json.dumps(attachment))
def _vip_change(char_id, old_vip, new_vip, **kwargs): Prison(char_id).vip_changed(new_vip) m = Mail(char_id) m.add(name=MAIL_VIP_CHANGED_TITLE, content=MAIL_VIP_CHANGED_CONTENT.format(new_vip)) # 增加掠夺次数 plunder_times_change_value = VIP_FUNCTION[new_vip].plunder - VIP_FUNCTION[old_vip].plunder if plunder_times_change_value: plunder = Plunder(char_id) plunder.change_current_plunder_times(plunder_times_change_value, allow_overflow=True)
def trig(self, extra_sycee): if not self.is_valid(): return attachment = make_standard_drop_from_template() attachment['sycee'] = extra_sycee mail = Mail(self.char_id) mail.add( self.activity_data.mail_title, self.activity_data.mail_content, attachment=json.dumps(attachment) )
def someone_refuse_me(self, from_id): from_id = int(from_id) if from_id in self.mf.pending: self.mf.pending.remove(from_id) self.mf.save() from_char_name = get_char_property(from_id, 'name') mail = Mail(self.char_id) mail.add(MAIL_FRIEND_REFUSE_TITLE, MAIL_FRIEND_REFUSE_CONTENT.format(from_char_name)) self.send_remove_friend_notify([from_id]) self.send_friends_amount_notify()
def _send_reward(rank, mongo_union): data = _get_reward_by_rank(rank) contribute_points = data.pop('union_contribute_points') u = Union(mongo_union.owner) u.add_contribute_points(contribute_points) members = u.member_list attachment = json.dumps(data) for mid in members: m = Mail(mid) m.add(MAIL_UNION_BATTLE_REWARD_TITLE, MAIL_UNION_BATTLE_REWARD_CONTENT, attachment=attachment)
def trig(self): ac_record = ActivityConditionRecord(self.char_id, self.CONDITION_ID, self.activity_time) if ac_record.in_send(): return value = self.get_current_value(self.char_id) if value < self.CONDITION_VALUE: return p = BasePurchaseAction(self.char_id) p.send_reward_yueka(purchase_notify=False) m = Mail(self.char_id) m.add("获得月卡", "您的累积充值已经达到了300元宝,获得了活动月卡奖励,300元宝的额外奖励已经放入您的帐号之中,请注意查收。从明天开始,接下来的30天,您将会每天获得100元宝。") ac_record.add_send()
def someone_refuse_me(self, from_id): from_id = int(from_id) if from_id in self.mf.pending: self.mf.pending.remove(from_id) self.mf.save() from_char_name = get_char_property(from_id, 'name') mail = Mail(self.char_id) mail.add( MAIL_FRIEND_REFUSE_TITLE, MAIL_FRIEND_REFUSE_CONTENT.format(from_char_name) ) self.send_remove_friend_notify([from_id]) self.send_friends_amount_notify()
def _send_reward(rank, mongo_union): data = _get_reward_by_rank(rank) contribute_points = data.pop('union_contribute_points') u = Union(mongo_union.owner) u.add_contribute_points(contribute_points) members = u.member_list attachment = json.dumps(data) for mid in members: m = Mail(mid) m.add( MAIL_UNION_BATTLE_REWARD_TITLE, MAIL_UNION_BATTLE_REWARD_CONTENT, attachment=attachment )
def send_mail(args): from core.character import get_char_ids_by_last_login from core.mail import Mail data = json.loads(args['data']) name = data['name'] content = data['content'] create_at = data['create_at'] attachment = data['attachment'] char_ids = data['char_ids'] if not char_ids: char_ids = get_char_ids_by_last_login(limit=14) for cid in char_ids: m = Mail(cid) m.add(name, content, create_at=create_at, attachment=attachment)
def send_mail(args): from core.character import get_char_ids_by_last_login from core.mail import Mail data = json.loads(args['data']) name = data['name'] content = data['content'] create_at = data['create_at'] attachment = data['attachment'] char_ids = data['char_ids'] if not char_ids: char_ids = get_char_ids_by_last_login(limit=14) for cid in char_ids: m = Mail(cid) m.add(name, content, create_at=create_at, attachment=attachment)
def trig(self, char_id): value = self.get_current_value(char_id) passed, not_passed = self.select_conditions(value) if not passed: return passed = self.get_passed_for_send_mail(passed) for p in passed: ac_record = ActivityConditionRecord(char_id, p, self.activity_time) if ac_record.in_send(): continue mail = Mail(char_id) mail.add(self.get_mail_title(p), self.get_mail_content(p), attachment=self.get_mail_attachment(p)) ac_record.add_send()
def trig(self, *args): if not self.is_valid(): return ac_record = ActivityConditionRecord(self.char_id, self.CONDITION_ID, self.activity_time) send_times = ac_record.send_times() if send_times > 0: return attachment = get_drop([self.activity_data.package]) mail = Mail(self.char_id) mail.add( self.activity_data.mail_title, self.activity_data.mail_content, attachment=json.dumps(attachment) ) ac_record.add_send(1)
def reset(): logger = Logger('reset_arena_day.log') amount = redis_client.zcard(REDIS_ARENA_KEY) logger.write("Reset Arena Day: Start. chars amount: {0}".format(amount)) arena_scores = redis_client.zrange(REDIS_ARENA_KEY, 0, -1, withscores=True) for char_id, score in arena_scores: attachment = _get_reward_by_score(score) if not attachment: continue char_id = int(char_id) mail = Mail(char_id) mail.add(MAIL_ARENA_DAY_REWARD_TITLE, MAIL_ARENA_DAY_REWARD_CONTENT, attachment=attachment) logger.write("Reset Arena Day: Complete") logger.close()
def trig(self, *args): ac_record = ActivityConditionRecord(self.char_id, self.CONDITION_ID, self.activity_time) send_times = ac_record.send_times() if send_times: return value = self.get_current_value(self.char_id) if value < self.CONDITION_VALUE: return attachment = get_drop([self.activity_data.package]) mail = Mail(self.char_id) mail.add( self.activity_data.mail_title, self.activity_data.mail_content, attachment=json.dumps(attachment) ) ac_record.add_send(1)
def trig(self): if not self.is_valid(): return now = arrow.utcnow().to(settings.TIME_ZONE) now_begin = arrow.Arrow(now.year, now.month, now.day).replace(tzinfo=now.tzinfo) condition = ( Q(char_id=self.char_id) & Q(purchase_at__gte=now_begin.timestamp) & Q(purchase_at__lte=now.timestamp) ) logs = MongoPurchaseLog.objects.filter(condition) if logs.count() == 0 or logs.count() > 1: # 没有充值,或者充值次数大于1,都返回 # 只有当天第一次充值的时候,才给额外的东西 return attachment = get_drop([self.activity_data.package]) mail = Mail(self.char_id) mail.add(self.activity_data.mail_title, self.activity_data.mail_content, attachment=json.dumps(attachment))
def trig(self, *args): ac_record = ActivityConditionRecord(self.char_id, self.CONDITION_ID, self.activity_time) send_times = ac_record.send_times() value = self.get_current_value(self.char_id) times, _ = divmod(value, self.CONDITION_VALUE) if times <= send_times: return for i in range(times - send_times): p = BasePurchaseAction(self.char_id) p.send_reward_yueka(purchase_notify=False, as_vip_exp=False) m = Mail(self.char_id) m.add( "获得月卡", "您的累积充值已经达到了300元宝,获得了活动月卡奖励,300元宝的额外奖励已经放入您的帐号之中,请注意查收。从明天开始,接下来的30天,您将会每天获得100元宝。" ) ac_record.add_send(times=times-send_times)
def boss_has_been_killed(self, boss_id): # 击杀boss后发送奖励 logs = self.get_battle_members_in_ordered(boss_id) member_ids = [log.char_id for log in logs] killer = self.char_id m = Mail(killer) drop = make_standard_drop_from_template() drop['union_coin'] = UNION_BOSS_KILLER_REWARD.coin m.add( UNION_BOSS_KILLER_REWARD.mail_title, UNION_BOSS_KILLER_REWARD.mail_content, attachment=json.dumps(drop) ) LOWEST_RANK = max(UNION_BOSS_REWARD.keys()) UNION_BOSS_REWARD_TUPLE = UNION_BOSS_REWARD.items() UNION_BOSS_REWARD_TUPLE.sort(key=lambda item: item[0]) for index, mid in enumerate(member_ids): rank = index + 1 if rank > LOWEST_RANK: break m = Mail(mid) for _rank, _reward in UNION_BOSS_REWARD_TUPLE: if _rank >= rank: drop = make_standard_drop_from_template() drop['union_coin'] = _reward.coin m.add( _reward.mail_title.format(rank), _reward.mail_content.format(rank), attachment=json.dumps(drop) ) break # 工会获得贡献度 self.union.add_contribute_points(UNION_BOSS[boss_id].contribute_points)
def test_open_mail_normal(self): m = Mail(self.char_id) mid = m.add('xxx', 'yyy', arrow.utcnow().timestamp) self.assertEqual(m.mail.mails[str(mid)].has_read, False) self._open(mid) m = Mail(self.char_id) self.assertEqual(m.count(), 1) self.assertEqual(m.mail.mails[str(mid)].has_read, True) app_test_helper._mongo_teardown_func()
def test_open_mail_normal(self): m = Mail(self.char_id) mid = m.add('xxx', 'yyy', timezone.utc_timestamp()) self.assertEqual(m.mail.mails[str(mid)].has_read, False) self._open(mid) m = Mail(self.char_id) self.assertEqual(m.count(), 1) self.assertEqual(m.mail.mails[str(mid)].has_read, True) app_test_helper._mongo_teardown_func()
def boss_has_been_killed(self, boss_id): # 击杀boss后发送奖励 logs = self.get_battle_members_in_ordered(boss_id) member_ids = [log.char_id for log in logs] killer = self.mongo_boss.opened[str(boss_id)].killer m = Mail(killer) drop = make_standard_drop_from_template() drop['union_coin'] = UNION_BOSS_KILLER_REWARD.coin m.add( UNION_BOSS_KILLER_REWARD.mail_title, UNION_BOSS_KILLER_REWARD.mail_content, attachment=json.dumps(drop) ) LOWEST_RANK = max(UNION_BOSS_REWARD.keys()) UNION_BOSS_REWARD_TUPLE = UNION_BOSS_REWARD.items().sort(key=lambda item: item[0]) for index, mid in enumerate(member_ids): rank = index + 1 if rank > LOWEST_RANK: break m = Mail(mid) for _rank, _reward in UNION_BOSS_REWARD_TUPLE: if _rank >= rank: drop = make_standard_drop_from_template() drop['union_coin'] = _reward.coin m.add( _reward.mail_title.format(rank), _reward.mail_content.format(rank), attachment=json.dumps(drop) ) break # 工会获得贡献度 self.union.add_contribute_points(UNION_BOSS[boss_id].contribute_points)
def activatecode_use(request): char_id = request._char_id code_id = request._proto.code_id data = { 'char_id': char_id, 'code_id': code_id } try: res = api_activatecode_use(data) except APIFailure: raise SanguoException( errormsg.SERVER_FAULT, char_id, "ActivateCode Use", "APIFailure. api_activatecode_use" ) if res['ret'] != 0: raise SanguoException( res['ret'], char_id, "ActivateCode use", "api_activatecode_use ret = {0}".format(res['ret']) ) # DONE package = res['data']['package'] drop = get_drop_from_raw_package(package) mail = Mail(char_id) mail.add( ACTIVATECODE_MAIL_TITLE, ACTIVATECODE_MAIL_CONTENT, arrow.utcnow().format('YYYY-MM-DD HH:mm:ss'), attachment=json.dumps(drop) ) return None
def main(signum): logger = Logger('reset_arena_day.log') arena_scores = ArenaScoreManager.get_all() amount = len(arena_scores) logger.write("Reset Arena Day: Start. chars amount: {0}".format(amount)) try: for char_id, score in arena_scores: attachment = _get_reward_by_score(score) if not attachment: continue char_id = int(char_id) mail = Mail(char_id) mail.add(MAIL_ARENA_DAY_REWARD_TITLE, MAIL_ARENA_DAY_REWARD_CONTENT, attachment=attachment) except: logger.error(traceback.format_exc()) else: logger.write("Reset Arena Day: Complete") finally: logger.close()
def trig(self, *args): if not self.is_valid(): return now = arrow.utcnow().to(settings.TIME_ZONE) now_begin = arrow.Arrow(now.year, now.month, now.day).replace(tzinfo=now.tzinfo) condition = Q(char_id=self.char_id) & Q(purchase_at__gte=now_begin.timestamp) & Q(purchase_at__lte=now.timestamp) logs = MongoPurchaseLog.objects.filter(condition) if logs.count() == 0 or logs.count() > 1: # 没有充值,或者充值次数大于1,都返回 # 只有当天第一次充值的时候,才给额外的东西 return attachment = get_drop([self.activity_data.package]) mail = Mail(self.char_id) mail.add( self.activity_data.mail_title, self.activity_data.mail_content, attachment=json.dumps(attachment) )
def trig(self, char_id): value = self.get_current_value(char_id) passed, not_passed = self.select_conditions(value) if not passed: return passed = self.get_passed_for_send_mail(passed) for p in passed: ac_record = ActivityConditionRecord(char_id, p, self.activity_time) if ac_record.in_send(): continue mail = Mail(char_id) mail.add( self.get_mail_title(p), self.get_mail_content(p), attachment=self.get_mail_attachment(p) ) ac_record.add_send()
def send_mail(request): data = request.body data = json.loads(data) sid = data.get('server_id', None) if sid: chars = MongoCharacter.objects.filter(server_id=sid) cids = [c.id for c in chars] else: cids = data.get('char_id', None) if not cids: return {'ret': 1} mail_name = data['mail']['name'] mail_content = data['mail']['content'] mail_send_at = data['mail']['send_at'] attachment = json.dumps(data['mail']['attachment']) for cid in cids: m = Mail(cid) m.add(mail_name, mail_content, mail_send_at, attachment) return {'ret': 0}
def reset(): amount = redis_client.zcard(REDIS_ARENA_KEY) logger = Logger("reset_arena_week.log") logger.write("Reset Arena Week: Start. chars amount: {0}".format(amount)) score_data = redis_client.zrevrange(REDIS_ARENA_KEY, 0, -1, withscores=True) data = [] for char_id, score in score_data: data.append((int(char_id), score, Char(int(char_id)).power)) data.sort(key=lambda item: (-item[1], -item[2])) # 发送奖励 for index, data in enumerate(data): rank = index + 1 char_id = data[0] achievement = Achievement(char_id) achievement.trig(10, rank) attachment = _get_reward_by_rank(data[1], rank) if not attachment: continue mail = Mail(char_id) mail.add(MAIL_ARENA_WEEK_REWARD_TITLE, MAIL_ARENA_WEEK_REWARD_CONTENT, attachment=attachment) logger.write("Reset Arena Week: Complete") logger.close()
def main(signum): logger = Logger('reset_arena_day.log') arena_scores = ArenaScoreManager.get_all() amount = len(arena_scores) logger.write("Reset Arena Day: Start. chars amount: {0}".format(amount)) try: for char_id, score in arena_scores: attachment = _get_reward_by_score(score) if not attachment: continue char_id = int(char_id) mail = Mail(char_id) mail.add(MAIL_ARENA_DAY_REWARD_TITLE, MAIL_ARENA_DAY_REWARD_CONTENT, attachment=attachment) except: logger.error(traceback.format_exc()) else: logger.write("Reset Arena Day: Complete") finally: logger.close()
def reset(signum): logger = Logger("reset_arena_week.log") logger.write("Start Arena Week") try: # 每周奖励 rank_data = get_rank_data(ARENA_WEEK_REWARD_LOWEST_RANK) rank_info_log = ["\n",] for index, data in enumerate(rank_data): rank = index + 1 char_id = data[0] score = data[1] _info_text = "Rank: {0}, Char: {1}, Score: {2}".format(rank, char_id, score) if score < ARENA_RANK_LINE: continue reward = _get_reward_by_rank(rank) if not reward: continue mail = Mail(char_id) mail.add( MAIL_ARENA_WEEK_REWARD_TITLE, MAIL_ARENA_WEEK_REWARD_CONTENT, attachment=json.dumps(reward)) _info_text = "{0}. Send Mail: True".format(_info_text) rank_info_log.append(_info_text) except: logger.error(traceback.format_exc()) else: logger.write("\n".join(rank_info_log)) logger.write("Done Arena Week") finally: logger.close() logger = Logger("reset_arena_week.log") logger.write("Start Arena Achievement") try: # 成就 rank_data = get_rank_data(None) for index, data in enumerate(rank_data): rank = index + 1 char_id = data[0] achievement = Achievement(char_id) achievement.trig(10, rank) except: logger.error(traceback.format_exc()) else: logger.write("Done Arena Achievement") finally: logger.close() logger = Logger("reset_arena_week.log") logger.write("Start Arena Activity 4001") try: # 开服比武奖励 _activity_anera_values = [] for _c in ACTIVITY_STATIC[4001].condition_objs: _activity_anera_values.append(_c.condition_value) LOWEST_RANK = max(_activity_anera_values) rank_data = get_rank_data(LOWEST_RANK) for index, data in enumerate(rank_data): char_id = data[0] ActivityStatic(char_id).trig(4001) except: logger.error(traceback.format_exc()) else: logger.write("Done Arena Activity 4001") finally: logger.close()
def cronjob_auto_transfer_union(cls): transfer_dict = {} now = arrow.utcnow() local_date = now.to(settings.TIME_ZONE).date() timestamp = now.timestamp - 3600 * 24 * 3 unions = MongoUnion._get_collection().find({}, {'owner': 1}) owner_union_id_dict = {doc['owner']: doc['_id'] for doc in unions} conditions = { '$and': [ {'_id': {'$in': owner_union_id_dict.keys()}}, {'last_checkin_timestamp': {'$lte': timestamp}} ] } member_docs = MongoUnionMember._get_collection().find( conditions, {'last_checkin_timestamp':1} ) for doc in member_docs: char_id = doc['_id'] union_id = owner_union_id_dict[char_id] last_checkin_date = arrow.get(doc['last_checkin_timestamp']).to(settings.TIME_ZONE).date() days = (local_date - last_checkin_date).days # 昨天签到了,今天检测的时候, days 就是1 # 但是从逻辑上看,应该是连续签到的, # 前天签到,昨天没有,今天检测的时候,days是2 # 逻辑看来是已经 一天 没有签到了 # 所以 days 在这里 -1 days -= 1 if days < 3: continue u = Union(char_id, union_id) if days >= 7: # transfer next_owner = u.find_next_owner() transfer_dict[union_id] = (char_id, next_owner) if next_owner: u.transfer(next_owner) m = Mail(char_id) m.add( MAIL_UNION_OWNER_TRANSFER_DONE_TITLE, MAIL_UNION_OWNER_TRANSFER_DONE_CONTENT.format(get_char_property(char_id, 'name')) ) else: members = u.member_list for mid in members: m = Mail(mid) m.add( MAIL_UNION_OWNER_TRANSFER_NOTIFY_TITLE, MAIL_UNION_OWNER_TRANSFER_NOTIFY_CONTENT.format(days) ) return transfer_dict
def cronjob_auto_transfer_union(cls): transfer_dict = {} now = arrow.utcnow() local_date = now.to(settings.TIME_ZONE).date() timestamp = now.timestamp - 3600 * 24 * 3 unions = MongoUnion._get_collection().find({}, {'owner': 1}) owner_union_id_dict = {doc['owner']: doc['_id'] for doc in unions} conditions = { '$and': [{ '_id': { '$in': owner_union_id_dict.keys() } }, { 'last_checkin_timestamp': { '$lte': timestamp } }] } member_docs = MongoUnionMember._get_collection().find( conditions, {'last_checkin_timestamp': 1}) for doc in member_docs: char_id = doc['_id'] union_id = owner_union_id_dict[char_id] last_checkin_date = arrow.get(doc['last_checkin_timestamp']).to( settings.TIME_ZONE).date() days = (local_date - last_checkin_date).days # 昨天签到了,今天检测的时候, days 就是1 # 但是从逻辑上看,应该是连续签到的, # 前天签到,昨天没有,今天检测的时候,days是2 # 逻辑看来是已经 一天 没有签到了 # 所以 days 在这里 -1 days -= 1 if days < 3: continue u = Union(char_id, union_id) if days >= 7: # transfer next_owner = u.find_next_owner() transfer_dict[union_id] = (char_id, next_owner) if next_owner: u.transfer(next_owner) m = Mail(char_id) m.add( MAIL_UNION_OWNER_TRANSFER_DONE_TITLE, MAIL_UNION_OWNER_TRANSFER_DONE_CONTENT.format( get_char_property(char_id, 'name'))) else: members = u.member_list for mid in members: m = Mail(mid) m.add( MAIL_UNION_OWNER_TRANSFER_NOTIFY_TITLE, MAIL_UNION_OWNER_TRANSFER_NOTIFY_CONTENT.format(days)) return transfer_dict