overlord_event_system/async_handler/
referrals.rs

1use crate::{
2    async_handler::handler::OverlordAsyncEventHandler, event::OverlordEvent,
3    game_config_helpers::GameConfigLookup, state::OverlordState,
4};
5
6use essences::currency::CurrencySource;
7use event_system::system::EventHandleResult;
8
9impl OverlordAsyncEventHandler {
10    pub fn handle_claim_referral_lvlup_reward(
11        &self,
12        level: i64,
13        mut state: OverlordState,
14    ) -> EventHandleResult<OverlordEvent, OverlordState> {
15        let game_config = self.game_config.get();
16
17        if level - 1 != state.character_state.character.patron_level {
18            tracing::error!(
19                "Tried leveling patron_level = {}, for more than 1 value, requested_level = {}",
20                state.character_state.character.patron_level,
21                level
22            );
23            return EventHandleResult::fail(state);
24        }
25
26        let Ok(patron_level_info) = game_config.require_patron_level_info(level) else {
27            tracing::error!(
28                "Tried finding patron_level = {}, in config while leveling up, but there is None",
29                level
30            );
31            return EventHandleResult::fail(state);
32        };
33
34        if patron_level_info.required_experience > state.character_state.character.patron_experience
35        {
36            tracing::error!(
37                "Tried leveling up patron_level = {}, when there is not enough experience",
38                level
39            );
40            return EventHandleResult::fail(state);
41        }
42
43        state.character_state.character.patron_level = level;
44
45        let events = vec![Self::currency_increase(
46            &patron_level_info.lvlup_reward,
47            CurrencySource::ReferralLvlUp,
48        )];
49
50        EventHandleResult::ok_events(state, events)
51    }
52
53    pub fn handle_claim_referral_daily_reward(
54        &self,
55        mut state: OverlordState,
56    ) -> EventHandleResult<OverlordEvent, OverlordState> {
57        let game_config = self.game_config.get();
58
59        if state.referral_daily_reward_claimed.is_some()
60            && state.referral_daily_reward_claimed.unwrap()
61        {
62            tracing::error!("Tried claiming referral daily reward, but its already claimed");
63            return EventHandleResult::fail(state);
64        }
65
66        let Ok(patron_level_info) =
67            game_config.require_patron_level_info(state.character_state.character.patron_level)
68        else {
69            tracing::error!(
70                "Tried finding patron_level = {}, in config while claiming daily reward, but there is None",
71                state.character_state.character.patron_level
72            );
73            return EventHandleResult::fail(state);
74        };
75
76        let currency_event = Self::currency_increase(
77            &patron_level_info.daily_reward,
78            CurrencySource::ReferralDailyReward,
79        );
80
81        state.referral_daily_reward_claimed = Some(true);
82
83        let events = vec![currency_event];
84
85        EventHandleResult::ok_events(state, events)
86    }
87
88    pub fn handle_referral_daily_reward_status_update(
89        &self,
90        referral_daily_reward_status: bool,
91        mut state: OverlordState,
92    ) -> EventHandleResult<OverlordEvent, OverlordState> {
93        state.referral_daily_reward_claimed = Some(referral_daily_reward_status);
94
95        EventHandleResult::ok(state)
96    }
97}