diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml index 0c57cf2..2d483a3 100644 --- a/.gitea/workflows/deploy.yaml +++ b/.gitea/workflows/deploy.yaml @@ -27,6 +27,9 @@ jobs: POSTGRES_USER: ${{ vars.POSTGRES_USER }} POSTGRES_DATABASE_NAME: ${{ vars.POSTGRES_DATABASE_NAME }} POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }} + WEATHER_API_KEY: ${{ secrets.WEATHER_API_KEY }} + DOGPICS_API_KEY: ${{ secrets.DOGPICS_API_KEY }} + CATPICS_API_KEY: ${{ secrets.CATPICS_API_KEY }} - name: Seed SSH key for deploy run: echo "${{ secrets.DEPLOY_KEY }}" | tr -d '\r' > ~/.ssh/id_rsa && chmod 0600 ~/.ssh/id_rsa - name: Deploy diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml index c2adfc3..2a5e674 100644 --- a/.idea/sqldialects.xml +++ b/.idea/sqldialects.xml @@ -3,6 +3,8 @@ + + \ No newline at end of file diff --git a/config/production.badgey.json b/config/production.badgey.json index 0307f04..9a52fb2 100644 --- a/config/production.badgey.json +++ b/config/production.badgey.json @@ -16,7 +16,7 @@ "weather": { "source_uri": "https://api.weatherapi.com/v1", "cache_mode": "NoCache", - "api_key": "70aacb9af931438a957215406211210" + "api_key": "#{WEATHER_API_KEY}#" }, "frog_tips": { "source_uri": "https://frog.tips/api/1/tips/", @@ -27,13 +27,13 @@ "source_uri": "https://api.thedogapi.com/v1/images/search?limit=100&order=RAND", "cache_name": "dog_pics", "cache_mode": "Cache", - "api_key": "live_RRrRUsdmRIpKUefuwOwuAV1nab7Gt8GqyvIqPGCgLAbpLHGdyStbGj9Xc67inYMt" + "api_key": "#{DOGPICS_API_KEY}#" }, "cat_pics": { "source_uri": "https://api.thecatapi.com/v1/images/search?limit=100&order=RAND", "cache_name": "cat_pics", "cache_mode": "Cache", - "api_key": "live_nvupPQbrXjHy8jsZJ1stp72fzsRLR8jQby8IR3l9yMngqAU9gcTEV8RA0OOiK8zP" + "api_key": "#{CATPICS_API_KEY}#" }, "dad_jokes": { "source_uri": "https://icanhazdadjoke.com/search?limit=30", diff --git a/migrations/2023-11-20-091909_add constant values to each rank track for XP generation control/down.sql b/migrations/2023-11-20-091909_add constant values to each rank track for XP generation control/down.sql new file mode 100644 index 0000000..55befb6 --- /dev/null +++ b/migrations/2023-11-20-091909_add constant values to each rank track for XP generation control/down.sql @@ -0,0 +1,4 @@ +ALTER TABLE tracks + DROP COLUMN IF EXISTS xp_level_constant, + DROP COLUMN IF EXISTS xp_award_range_min, + DROP COLUMN IF EXISTS xp_award_range_max; \ No newline at end of file diff --git a/migrations/2023-11-20-091909_add constant values to each rank track for XP generation control/up.sql b/migrations/2023-11-20-091909_add constant values to each rank track for XP generation control/up.sql new file mode 100644 index 0000000..2fb2e98 --- /dev/null +++ b/migrations/2023-11-20-091909_add constant values to each rank track for XP generation control/up.sql @@ -0,0 +1,4 @@ +ALTER TABLE tracks + ADD COLUMN xp_level_constant FLOAT NOT NULL DEFAULT 0.25, + ADD COLUMN xp_award_range_min INT NOT NULL DEFAULT 1, + ADD COLUMN xp_award_range_max INT NOT NULL DEFAULT 30; \ No newline at end of file diff --git a/src/badgey/commands/ranks.rs b/src/badgey/commands/ranks.rs index 27e7ded..44401e1 100644 --- a/src/badgey/commands/ranks.rs +++ b/src/badgey/commands/ranks.rs @@ -102,7 +102,7 @@ async fn rank(ctx: ManifoldContext<'_>) -> ManifoldResult<()> { let current_rank = Rank::get_rank_for_level(db, &xp.user_current_level, &xp.rank_track).unwrap_or(Rank::new()); - let next_level_xp = xp.get_xp_to_next_level(); + let next_level_xp = xp.get_xp_to_next_level(&db); let next_rank_xp = xp.get_xp_to_next_rank(&db).unwrap_or(0); let mut response = format!("You're currently {}. You need {} more XP to get to the next level", RoleId::from(current_rank.role_id as u64).mention(), next_level_xp); diff --git a/src/badgey/events.rs b/src/badgey/events.rs index ca9a02c..a0d0600 100644 --- a/src/badgey/events.rs +++ b/src/badgey/events.rs @@ -67,7 +67,7 @@ impl BadgeyHandler { if valid { xp.last_given_xp = Some(chrono::Utc::now().timestamp()); xp.xp_value += &xp_reward; - let calculated_level = xp.get_level_from_xp(); + let calculated_level = xp.get_level_from_xp(&db, None); if xp.freeze_rank.is_some() { xp.user_current_level = calculated_level.clone(); diff --git a/src/badgey/models/xp.rs b/src/badgey/models/xp.rs index 143f568..a2d64a9 100644 --- a/src/badgey/models/xp.rs +++ b/src/badgey/models/xp.rs @@ -34,11 +34,14 @@ pub struct Rank { pub rank_name: String, } -#[derive(Queryable, Selectable, Identifiable, Debug, Clone)] +#[derive(Queryable, Selectable, Identifiable, Debug, Clone, Default)] #[diesel(primary_key(track_id))] pub struct Track { pub track_id: i64, pub track_name: String, + pub xp_level_constant: f64, + pub xp_award_range_min: i32, + pub xp_award_range_max: i32, } impl Xp { @@ -76,22 +79,28 @@ impl Xp { .map_err(|e| ManifoldError::from(e)) } - pub fn get_level_from_xp(&self) -> i64 { - (0.125 * f64::sqrt(self.xp_value.clone() as f64)) as i64 + pub fn get_level_from_xp(&self, conn: &Db, constant: Option<&f64>) -> i64 { + let c = match constant { + Some(c) => *c, + None => Track::get_track_by_id(conn, &self.rank_track).unwrap_or_default().xp_level_constant + }; + (c * f64::sqrt(self.xp_value.clone() as f64)) as i64 } - pub fn get_xp_to_next_level(&self) -> i64 { - let current_level = self.get_level_from_xp(); + pub fn get_xp_to_next_level(&self, conn: &Db) -> i64 { + let constant = Track::get_track_by_id(conn, &self.rank_track).unwrap_or_default().xp_level_constant; + let current_level = self.get_level_from_xp(conn, Some(&constant)); let target_level = current_level + 1; - (target_level as f32 / 0.125).powi(2) as i64 - &self.xp_value + (target_level as f64 / constant).powi(2) as i64 - &self.xp_value } pub fn get_xp_to_next_rank(&self, conn: &Db) -> ManifoldResult { - let current_level = self.get_level_from_xp(); + let constant = Track::get_track_by_id(conn, &self.rank_track)?.xp_level_constant; + let current_level = self.get_level_from_xp(conn, Some(&constant)); let target_level = Rank::get_next_rank_for_level(conn, ¤t_level, &self.rank_track)?.required_level; - Ok((target_level as f32 / 0.125).powi(2) as i64 - &self.xp_value) + Ok((target_level as f64 / constant).powi(2) as i64 - &self.xp_value) } pub fn check_timeout(value: &Option, timeout: &i64) -> ManifoldResult<()> { diff --git a/src/badgey/schema.rs b/src/badgey/schema.rs index 21ba434..d8f7644 100644 --- a/src/badgey/schema.rs +++ b/src/badgey/schema.rs @@ -27,6 +27,9 @@ diesel::table! { track_id -> Int8, #[max_length = 128] track_name -> Varchar, + xp_level_constant -> Float8, + xp_award_range_min -> Int4, + xp_award_range_max -> Int4, } }