Beispiel #1
0
    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))
Beispiel #2
0
    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)
Beispiel #3
0
    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)
Beispiel #4
0
    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()
Beispiel #5
0
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
Beispiel #6
0
    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()
Beispiel #7
0
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}
Beispiel #8
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))
Beispiel #9
0
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])
Beispiel #10
0
    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))
Beispiel #11
0
    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()
Beispiel #12
0
    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()
Beispiel #13
0
    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)
Beispiel #14
0
    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)
            )
Beispiel #15
0
    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]))
            )
Beispiel #16
0
 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)
     )
Beispiel #17
0
    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)
        )
Beispiel #18
0
    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))
Beispiel #19
0
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)
Beispiel #20
0
    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)
        )
Beispiel #21
0
    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()
Beispiel #22
0
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)
Beispiel #23
0
    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()
Beispiel #24
0
    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
        )
Beispiel #26
0
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)
Beispiel #27
0
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)
Beispiel #28
0
    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()
Beispiel #29
0
    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)
Beispiel #30
0
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()
Beispiel #31
0
    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)
Beispiel #32
0
    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))
Beispiel #33
0
    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)
Beispiel #34
0
    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)
Beispiel #35
0
    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()
Beispiel #36
0
    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()
Beispiel #37
0
    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)
Beispiel #38
0
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
Beispiel #39
0
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()
Beispiel #40
0
    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)
        )
Beispiel #41
0
    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()
Beispiel #42
0
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}
Beispiel #43
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()
Beispiel #44
0
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()
Beispiel #45
0
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()
Beispiel #46
0
    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
Beispiel #47
0
    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