Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions migrations/20250722002114_unrated_levels.down.sql
Original file line number Diff line number Diff line change
@@ -1,3 +1,38 @@
CREATE OR REPLACE FUNCTION record_score(progress FLOAT, demon FLOAT, list_size FLOAT, requirement FLOAT) RETURNS FLOAT AS
$record_score$
SELECT CASE
WHEN progress = 100 THEN
CASE
WHEN demon BETWEEN 56 AND 150 THEN
1.039035131 * ((185.7 * EXP((-0.02715 * demon))) + 14.84)
WHEN demon BETWEEN 36 AND 55 THEN
1.0371139743 * ((212.61 * POWER(1.036, 1 - demon)) + 25.071)
WHEN demon BETWEEN 21 AND 35 THEN
(((250 - 83.389) * POWER(1.0099685, 2 - demon) - 31.152)) * 1.0371139743
WHEN demon BETWEEN 4 AND 20 THEN
((326.1 * EXP((-0.0871 * demon))) + 51.09) * 1.037117142
WHEN demon BETWEEN 1 AND 3 THEN
(-18.2899079915 * demon) + 368.2899079915
END
WHEN progress < requirement THEN
0.0
ELSE
CASE
WHEN demon BETWEEN 56 AND 150 THEN
1.039035131 * ((185.7 * EXP((-0.02715 * demon))) + 14.84) * (EXP(LN(5) * (progress - requirement) / (100 - requirement))) / 10
WHEN demon BETWEEN 36 AND 55 THEN
(1.0371139743 * ((212.61 * POWER(1.036, 1 - demon)) + 25.071)) * (EXP(LN(5) * (progress - requirement) / (100 - requirement))) / 10
WHEN demon BETWEEN 21 AND 35 THEN
(((250 - 83.389) * POWER(1.0099685, 2 - demon) - 31.152)) * 1.0371139743 * (EXP(LN(5) * (progress - requirement) / (100 - requirement))) / 10
WHEN demon BETWEEN 4 AND 20 THEN
(((326.1 * EXP((-0.0871 * demon))) + 51.09) * 1.037117142) * (EXP(LN(5) * (progress - requirement) / (100 - requirement))) / 10
WHEN demon BETWEEN 1 AND 3 THEN
((-18.2899079915 * demon) + 368.2899079915) * (EXP(LN(5) * (progress - requirement) / (100 - requirement))) / 10
END
END;
$record_score$
LANGUAGE SQL IMMUTABLE;

DROP VIEW score_giving;

CREATE VIEW score_giving AS
Expand Down Expand Up @@ -186,6 +221,9 @@ SELECT recompute_player_scores();
SELECT recompute_nation_scores();
SELECT recompute_subdivision_scores();

ALTER TABLE players ALTER COLUMN score SET NOT NULL;
ALTER TABLE players ALTER COLUMN score SET DEFAULT 0.0;

ALTER TABLE demons DROP COLUMN rated_position;
DROP FUNCTION recompute_rated_positions();

Expand Down
61 changes: 52 additions & 9 deletions migrations/20250722002114_unrated_levels.up.sql
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
ALTER TABLE demons ADD COLUMN rated BOOLEAN NOT NULL DEFAULT TRUE;
ALTER TABLE players ADD COLUMN ratedplus_score DOUBLE PRECISION NOT NULL DEFAULT 0.0;
ALTER TABLE players ALTER COLUMN score DROP NOT NULL;
ALTER TABLE players ALTER COLUMN score DROP DEFAULT;
ALTER TABLE players ADD COLUMN ratedplus_score DOUBLE PRECISION DEFAULT NULL;
ALTER TABLE nationalities ADD COLUMN ratedplus_score DOUBLE PRECISION NOT NULL DEFAULT 0.0;
ALTER TABLE subdivisions ADD COLUMN ratedplus_score DOUBLE PRECISION NOT NULL DEFAULT 0.0;

Expand Down Expand Up @@ -27,22 +29,63 @@ $$ LANGUAGE plpgsql;
SELECT recompute_rated_positions();

-- stats viewer stuff
CREATE OR REPLACE FUNCTION record_score(progress FLOAT, demon FLOAT, list_size FLOAT, requirement FLOAT) RETURNS FLOAT AS
$record_score$
SELECT CASE
WHEN demon > 150 THEN 0.0
WHEN demon > 75 AND progress < 100 THEN 0.0
WHEN progress = 100 THEN
CASE
WHEN demon BETWEEN 56 AND 150 THEN
1.039035131 * ((185.7 * EXP((-0.02715 * demon))) + 14.84)
WHEN demon BETWEEN 36 AND 55 THEN
1.0371139743 * ((212.61 * POWER(1.036, 1 - demon)) + 25.071)
WHEN demon BETWEEN 21 AND 35 THEN
(((250 - 83.389) * POWER(1.0099685, 2 - demon) - 31.152)) * 1.0371139743
WHEN demon BETWEEN 4 AND 20 THEN
((326.1 * EXP((-0.0871 * demon))) + 51.09) * 1.037117142
WHEN demon BETWEEN 1 AND 3 THEN
(-18.2899079915 * demon) + 368.2899079915
ELSE
0.0
END
WHEN progress < requirement THEN
0.0
ELSE
CASE
WHEN demon BETWEEN 56 AND 150 THEN
1.039035131 * ((185.7 * EXP((-0.02715 * demon))) + 14.84) * (EXP(LN(5) * (progress - requirement) / (100 - requirement))) / 10
WHEN demon BETWEEN 36 AND 55 THEN
(1.0371139743 * ((212.61 * POWER(1.036, 1 - demon)) + 25.071)) * (EXP(LN(5) * (progress - requirement) / (100 - requirement))) / 10
WHEN demon BETWEEN 21 AND 35 THEN
(((250 - 83.389) * POWER(1.0099685, 2 - demon) - 31.152)) * 1.0371139743 * (EXP(LN(5) * (progress - requirement) / (100 - requirement))) / 10
WHEN demon BETWEEN 4 AND 20 THEN
(((326.1 * EXP((-0.0871 * demon))) + 51.09) * 1.037117142) * (EXP(LN(5) * (progress - requirement) / (100 - requirement))) / 10
WHEN demon BETWEEN 1 AND 3 THEN
((-18.2899079915 * demon) + 368.2899079915) * (EXP(LN(5) * (progress - requirement) / (100 - requirement))) / 10
ELSE
0.0
END
END;
$record_score$
LANGUAGE SQL IMMUTABLE;

DROP VIEW score_giving;

CREATE VIEW score_giving AS
SELECT records.progress, demons.position, demons.requirement, records.player, FALSE AS rated_list
FROM records
INNER JOIN demons
ON demons.id = records.demon
WHERE records.status_ = 'APPROVED' AND (demons.position <= 75 OR records.progress = 100)
WHERE records.status_ = 'APPROVED'

UNION

SELECT records.progress, demons.rated_position, demons.requirement, records.player, TRUE AS rated_list
FROM records
INNER JOIN demons
ON demons.id = records.demon
WHERE demons.rated = TRUE AND records.status_ = 'APPROVED' AND (demons.rated_position <= 75 OR records.progress = 100)
WHERE demons.rated = TRUE AND records.status_ = 'APPROVED'

UNION

Expand All @@ -65,7 +108,7 @@ $$ LANGUAGE SQL;

CREATE OR REPLACE FUNCTION recompute_player_scores() RETURNS void AS $$
UPDATE players
SET score = COALESCE(q.score, 0), ratedplus_score = COALESCE(q.ratedplus_score, 0)
SET score = q.score, ratedplus_score = q.ratedplus_score
FROM players p
LEFT JOIN (
SELECT player,
Expand Down Expand Up @@ -159,18 +202,18 @@ DROP MATERIALIZED VIEW player_ranks;

CREATE MATERIALIZED VIEW player_ranks AS
SELECT
CASE WHEN score != 0 THEN RANK() OVER (ORDER BY score DESC) END AS rank,
CASE WHEN ratedplus_score != 0 THEN RANK() OVER (ORDER BY ratedplus_score DESC) END AS ratedplus_rank,
CASE WHEN score > 0 THEN RANK() OVER (ORDER BY score DESC NULLS LAST) END AS rank,
CASE WHEN ratedplus_score > 0 THEN RANK() OVER (ORDER BY ratedplus_score DESC NULLS LAST) END AS ratedplus_rank,
id
FROM players
WHERE (ratedplus_score != 0 OR score != 0) AND NOT banned;
WHERE (ratedplus_score IS NOT NULL OR score IS NOT NULL) AND NOT banned;

CREATE UNIQUE INDEX player_ranks_id_idx ON player_ranks(id);

CREATE VIEW ranked_players AS
SELECT
ROW_NUMBER() OVER(ORDER BY rank, id) AS index,
ROW_NUMBER() OVER (ORDER BY ratedplus_rank, id) AS ratedplus_index,
ROW_NUMBER() OVER(ORDER BY players.score DESC NULLS LAST, id) AS index,
ROW_NUMBER() OVER (ORDER BY players.ratedplus_score DESC NULLS LAST, id) AS ratedplus_index,
rank,
ratedplus_rank,
id, name, players.score, players.ratedplus_score,
Expand Down
39 changes: 39 additions & 0 deletions migrations/20251114014715_record_dates.down.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
ALTER TABLE record_modifications DROP COLUMN date;

CREATE OR REPLACE FUNCTION audit_record_modification() RETURNS trigger AS $record_modification_trigger$
DECLARE
progress_change SMALLINT;
video_change VARCHAR(200);
status_change RECORD_STATUS;
player_change INT;
demon_change INTEGER;
BEGIN
if (OLD.progress <> NEW.progress) THEN
progress_change = OLD.progress;
END IF;

IF (OLD.video <> NEW.video) THEN
video_change = OLD.video;
END IF;

IF (OLD.status_ <> NEW.status_) THEN
status_change = OLD.status_;
END IF;

IF (OLD.player <> NEW.player) THEN
player_change = OLD.player;
END IF;

IF (OLD.demon <> NEW.demon) THEN
demon_change = OLD.demon;
END IF;

INSERT INTO record_modifications (userid, id, progress, video, status_, player, demon)
(SELECT id, NEW.id, progress_change, video_change, status_change, player_change, demon_change
FROM active_user LIMIT 1);

RETURN NEW;
END;
$record_modification_trigger$ LANGUAGE plpgsql;

ALTER TABLE records DROP COLUMN date;
50 changes: 50 additions & 0 deletions migrations/20251114014715_record_dates.up.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
ALTER TABLE records ADD COLUMN date TIMESTAMP WITHOUT TIME ZONE DEFAULT (NOW() AT TIME ZONE 'utc') NOT NULL;

UPDATE records
SET date = record_additions.time
FROM record_additions
WHERE records.id = record_additions.id;

-- audit logs
ALTER TABLE record_modifications ADD COLUMN date TIMESTAMP WITHOUT TIME ZONE;

CREATE OR REPLACE FUNCTION audit_record_modification() RETURNS trigger AS $record_modification_trigger$
DECLARE
progress_change SMALLINT;
video_change VARCHAR(200);
status_change RECORD_STATUS;
player_change INT;
demon_change INTEGER;
date_change TIMESTAMP WITHOUT TIME ZONE;
BEGIN
if (OLD.progress <> NEW.progress) THEN
progress_change = OLD.progress;
END IF;

IF (OLD.video <> NEW.video) THEN
video_change = OLD.video;
END IF;

IF (OLD.status_ <> NEW.status_) THEN
status_change = OLD.status_;
END IF;

IF (OLD.player <> NEW.player) THEN
player_change = OLD.player;
END IF;

IF (OLD.demon <> NEW.demon) THEN
demon_change = OLD.demon;
END IF;

IF (OLD.date <> NEW.date) THEN
date_change = OLD.date;
END IF;

INSERT INTO record_modifications (userid, id, progress, video, status_, player, demon, date)
(SELECT id, NEW.id, progress_change, video_change, status_change, player_change, demon_change, date_change
FROM active_user LIMIT 1);

RETURN NEW;
END;
$record_modification_trigger$ LANGUAGE plpgsql;
57 changes: 57 additions & 0 deletions migrations/20260208165810_edit_level_id.down.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
ALTER TABLE demon_modifications DROP COLUMN level_id;

CREATE OR REPLACE FUNCTION audit_demon_modification() RETURNS trigger AS $demon_modification_trigger$
DECLARE
name_change CITEXT;
position_change SMALLINT;
rated_position_change SMALLINT;
requirement_change SMALLINT;
video_change VARCHAR(200);
thumbnail_change TEXT;
verifier_change INT;
publisher_change INT;
rated_change BOOLEAN;
BEGIN
IF (OLD.name <> NEW.name) THEN
name_change = OLD.name;
END IF;

IF (OLD.position <> NEW.position) THEN
position_change = OLD.position;
END IF;

IF (OLD.rated_position IS DISTINCT FROM NEW.rated_position) THEN
rated_position_change = OLD.rated_position;
END IF;

IF (OLD.requirement <> NEW.requirement) THEN
requirement_change = OLD.requirement;
END IF;

IF (OLD.video <> NEW.video) THEN
video_change = OLD.video;
END IF;

IF (OLD.thumbnail <> NEW.thumbnail) THEN
thumbnail_change = OLD.thumbnail;
END IF;

IF (OLD.verifier <> NEW.verifier) THEN
verifier_change = OLD.verifier;
END IF;

IF (OLD.publisher <> NEW.publisher) THEN
publisher_change = OLD.publisher;
END IF;

IF (OLD.rated <> NEW.rated) THEN
rated_change = OLD.rated;
END IF;

INSERT INTO demon_modifications (userid, name, position, rated_position, requirement, video, verifier, publisher, thumbnail, rated, id)
(SELECT id, name_change, position_change, rated_position_change, requirement_change, video_change, verifier_change, publisher_change, thumbnail_change, rated_change, NEW.id
FROM active_user LIMIT 1);

RETURN NEW;
END;
$demon_modification_trigger$ LANGUAGE plpgsql;
62 changes: 62 additions & 0 deletions migrations/20260208165810_edit_level_id.up.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
ALTER TABLE demon_modifications ADD COLUMN level_id BIGINT NULL DEFAULT NULL;

CREATE OR REPLACE FUNCTION audit_demon_modification() RETURNS trigger AS $demon_modification_trigger$
DECLARE
name_change CITEXT;
position_change SMALLINT;
rated_position_change SMALLINT;
requirement_change SMALLINT;
video_change VARCHAR(200);
thumbnail_change TEXT;
verifier_change INT;
publisher_change INT;
rated_change BOOLEAN;
level_id_change BIGINT;
BEGIN
IF (OLD.name <> NEW.name) THEN
name_change = OLD.name;
END IF;

IF (OLD.position <> NEW.position) THEN
position_change = OLD.position;
END IF;

IF (OLD.rated_position IS DISTINCT FROM NEW.rated_position) THEN
rated_position_change = OLD.rated_position;
END IF;

IF (OLD.requirement <> NEW.requirement) THEN
requirement_change = OLD.requirement;
END IF;

IF (OLD.video <> NEW.video) THEN
video_change = OLD.video;
END IF;

IF (OLD.thumbnail <> NEW.thumbnail) THEN
thumbnail_change = OLD.thumbnail;
END IF;

IF (OLD.verifier <> NEW.verifier) THEN
verifier_change = OLD.verifier;
END IF;

IF (OLD.publisher <> NEW.publisher) THEN
publisher_change = OLD.publisher;
END IF;

IF (OLD.rated <> NEW.rated) THEN
rated_change = OLD.rated;
END IF;

IF (OLD.level_id <> NEW.level_id) THEN
level_id_change = OLD.level_id;
END IF;

INSERT INTO demon_modifications (userid, name, position, rated_position, requirement, video, verifier, publisher, thumbnail, rated, level_id, id)
(SELECT id, name_change, position_change, rated_position_change, requirement_change, video_change, verifier_change, publisher_change, thumbnail_change, rated_change, level_id_change, NEW.id
FROM active_user LIMIT 1);

RETURN NEW;
END;
$demon_modification_trigger$ LANGUAGE plpgsql;
2 changes: 1 addition & 1 deletion pointercrate-core-pages/static/css/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ html[data-theme="dark"] {
/* --color-consider-accent */

--color-text-accent: #dce6e3;
--color-text: #c9c6bf;
--color-text: #e2dfd8;

--color-bg: #121720;
--color-bg-surface: #252d3c;
Expand Down
2 changes: 1 addition & 1 deletion pointercrate-demonlist-api/src/pages.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
use pointercrate_core_macros::{localized, themed};
use rocket::{response::Redirect, State};

use chrono::{DateTime, Datelike, FixedOffset, NaiveDate, Utc};

Check warning on line 6 in pointercrate-demonlist-api/src/pages.rs

View workflow job for this annotation

GitHub Actions / container-job

unused import: `Datelike`

Check warning on line 6 in pointercrate-demonlist-api/src/pages.rs

View workflow job for this annotation

GitHub Actions / container-job

unused import: `Datelike`

Check warning on line 6 in pointercrate-demonlist-api/src/pages.rs

View workflow job for this annotation

GitHub Actions / container-job

unused import: `Datelike`

Check warning on line 6 in pointercrate-demonlist-api/src/pages.rs

View workflow job for this annotation

GitHub Actions / container-job

unused import: `Datelike`
use pointercrate_core::{audit::AuditLogEntryType, pool::PointercratePool, theme::Theme};
use pointercrate_core_api::{
error::Result,
Expand Down Expand Up @@ -179,7 +179,7 @@
demonlist: current_list(&list.0, &mut connection).await?,
list: list.0,
movements: modifications,
integration: gd.load_level_for_demon(&full_demon.demon).await,
integration: gd.load_level_for_demon(&full_demon.demon, &mut connection).await,
data: full_demon,
},
)))
Expand Down
Loading
Loading