|
@@ -1,36 +1,49 @@
|
|
|
-const rulesets = ['osu', 'taiko', 'catch', 'mania'];
|
|
|
-let selected_ruleset = parseInt(localStorage.getItem('selected_ruleset') || '0', 10);
|
|
|
-let logged_user_id = localStorage.getItem('user_id');
|
|
|
-let last_match_id = localStorage.getItem('last_match_id');
|
|
|
-let token = localStorage.getItem('token');
|
|
|
-
|
|
|
-function finish_authentication() {
|
|
|
- const token_val = document.querySelector('#token').value;
|
|
|
- if (token_val != '{{ token }}') {
|
|
|
- token = token_val;
|
|
|
- localStorage.setItem('token', token);
|
|
|
- }
|
|
|
+const domain_name = 'kiwec.net'; // TODO set this in build step?
|
|
|
|
|
|
- const id = document.querySelector('#authenticated_osu_id').value;
|
|
|
- if (id != '{{ user_id }}') {
|
|
|
- logged_user_id = id;
|
|
|
- localStorage.setItem('user_id', logged_user_id);
|
|
|
- }
|
|
|
+// Migrate from old authentication method
|
|
|
+const legacy_token = localStorage.getItem('token');
|
|
|
+if (legacy_token != null) {
|
|
|
+ const last_match_id = localStorage.getItem('last_match_id') || '';
|
|
|
|
|
|
- update_header_profile();
|
|
|
-}
|
|
|
-finish_authentication();
|
|
|
+ localStorage.removeItem('token');
|
|
|
+ localStorage.removeItem('user_id');
|
|
|
+ localStorage.removeItem('last_match_id');
|
|
|
|
|
|
-function update_selected_ruleset(name) {
|
|
|
- if (name == 'std') name = 'osu';
|
|
|
- if (name == 'fruits') name = 'catch';
|
|
|
- if (!rulesets.includes(name)) name = 'osu';
|
|
|
+ document.cookie = `login_to=${location.href}; path=/; domain=${domain_name}; secure; SameSite=Strict; Max-Age=30000`;
|
|
|
+ document.location = '/auth_migrate?token=' + legacy_token + '&last_match_id=' + last_match_id;
|
|
|
+}
|
|
|
|
|
|
- localStorage.setItem('selected_ruleset', rulesets.indexOf(name));
|
|
|
- selected_ruleset = rulesets.indexOf(name);
|
|
|
+// Grab info from cookies
|
|
|
+let logged_user_id = null;
|
|
|
+let last_match_id = null;
|
|
|
+const cookies = document.cookies.split(';');
|
|
|
+for (const cookie of cookies) {
|
|
|
+ const foo = cookie.trim().split('=');
|
|
|
+ const key = foo[0];
|
|
|
+ let value = foo[1];
|
|
|
+ if (value.substr(0, 2) == 's:') {
|
|
|
+ value = value.slice(2, value.lastIndexOf('.'));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (key == 'user') {
|
|
|
+ logged_user_id = parseInt(value, 10);
|
|
|
+ } else if (key == 'last_match') {
|
|
|
+ last_match_id = parseInt(value, 10);
|
|
|
+ } else if (key == 'login_to' && value != '') {
|
|
|
+ document.cookie = `login_to=; path=/; domain=${domain_name}; secure; SameSite=Strict; Max-Age=0`;
|
|
|
+ document.location = value;
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- document.querySelector('#toggle-rulesets-dropdown-btn img').src = `/images/mode-${rulesets[selected_ruleset]}.png`;
|
|
|
+// Get current ruleset from hostname (eg. 'mania.kiwec.net')
|
|
|
+const rulesets = ['osu', 'taiko', 'catch', 'mania'];
|
|
|
+const subdomain = location.hostname.split('.')[0];
|
|
|
+let selected_ruleset = rulesets.indexOf(name);
|
|
|
+if (selected_ruleset == -1) {
|
|
|
+ console.warn('No ruleset found for subdomain "' + subdomain + '"! Defaulting to standard.');
|
|
|
+ selected_ruleset = 0;
|
|
|
}
|
|
|
+document.querySelector('#toggle-rulesets-dropdown-btn img').src = `/images/mode-${rulesets[selected_ruleset]}.png`;
|
|
|
|
|
|
function update_header_highlights() {
|
|
|
const header_links = document.querySelectorAll('header a');
|
|
@@ -45,16 +58,15 @@ function update_header_highlights() {
|
|
|
|
|
|
function update_header_profile() {
|
|
|
const a = document.querySelector('.login-btn');
|
|
|
- if (token) {
|
|
|
- a.href = `/u/${logged_user_id}/${rulesets[selected_ruleset]}/`;
|
|
|
+ if (logged_user_id) {
|
|
|
+ a.href = `/u/${logged_user_id}/`;
|
|
|
a.querySelector('img').src = `https://s.ppy.sh/a/${logged_user_id}`;
|
|
|
} else {
|
|
|
- a.href = '/osu_login';
|
|
|
+ a.href = '/me/';
|
|
|
a.querySelector('img').src = `/images/login.png`;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
// Returns the color of a given star rating, matching osu!web's color scheme.
|
|
|
function stars_to_color(sr) {
|
|
|
if (sr <= 0.1) {
|
|
@@ -93,27 +105,15 @@ document.addEventListener('click', (event) => {
|
|
|
document.querySelectorAll('.choose-ruleset').forEach((btn) => {
|
|
|
btn.addEventListener('click', function(event) {
|
|
|
event.preventDefault();
|
|
|
- update_selected_ruleset(rulesets[parseInt(this.dataset.ruleset, 10)]);
|
|
|
|
|
|
- const url = location.pathname;
|
|
|
- const new_url = url.replaceAll(/\/(osu|taiko|catch|mania)/g, '/' + rulesets[selected_ruleset]);
|
|
|
-
|
|
|
- if (url == new_url) {
|
|
|
- location.reload();
|
|
|
- } else {
|
|
|
- window.history.pushState({}, '', new_url);
|
|
|
- route(new_url);
|
|
|
- }
|
|
|
+ const subdomains = location.hostname.split('.');
|
|
|
+ subdomains[0] = this.dataset.ruleset;
|
|
|
+ location.hostname = subdomains.join('.');
|
|
|
});
|
|
|
});
|
|
|
|
|
|
|
|
|
function click_listener(evt) {
|
|
|
- if (this.pathname == '/osu_login') {
|
|
|
- localStorage.setItem('redirect_to', location.pathname);
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
// Intercept clicks that don't lead to an external domain
|
|
|
if (this.host == location.host && this.target != '_blank') {
|
|
|
evt.preventDefault();
|
|
@@ -277,7 +277,7 @@ function render_closed_lobby(lobby, user_has_lobby_open) {
|
|
|
window.history.pushState({}, '', `/reopen-lobby/${lobby.match_id}`);
|
|
|
route(`/reopen-lobby/${lobby.match_id}`);
|
|
|
} else {
|
|
|
- localStorage.setItem('redirect_to', `/reopen-lobby/${lobby.match_id}`);
|
|
|
+ document.cookie = `login_to=${location.origin}/reopen-lobby/${lobby.match_id}; path=/; domain=${domain_name}; secure; SameSite=Strict; Max-Age=30000`;
|
|
|
document.location = '/osu_login';
|
|
|
}
|
|
|
});
|
|
@@ -316,6 +316,7 @@ function render_open_lobby(lobby) {
|
|
|
evt.stopPropagation();
|
|
|
|
|
|
if (!token) {
|
|
|
+ document.cookie = `login_to=${location.origin}/lobbies/; path=/; domain=${domain_name}; secure; SameSite=Strict; Max-Age=30000`;
|
|
|
document.location = '/osu_login';
|
|
|
return;
|
|
|
}
|
|
@@ -356,7 +357,7 @@ async function render_lobbies() {
|
|
|
const template = document.querySelector('#lobbies-template').content.cloneNode(true);
|
|
|
|
|
|
document.querySelector('main').appendChild(document.querySelector('#loading-template').content.cloneNode(true));
|
|
|
- const json = await get(`/api/lobbies/${rulesets[selected_ruleset]}/`);
|
|
|
+ const json = await get(`/api/lobbies/`);
|
|
|
document.querySelector('main .loading-placeholder').remove();
|
|
|
|
|
|
if (json.open.length == 0) {
|
|
@@ -395,7 +396,7 @@ async function render_lobbies() {
|
|
|
window.history.pushState({}, '', '/create-lobby/');
|
|
|
route('/create-lobby/');
|
|
|
} else {
|
|
|
- localStorage.setItem('redirect_to', '/create-lobby/');
|
|
|
+ document.cookie = `login_to=${location.origin}/create-lobby/; path=/; domain=${domain_name}; secure; SameSite=Strict; Max-Age=30000`;
|
|
|
document.location = '/osu_login';
|
|
|
}
|
|
|
});
|
|
@@ -421,12 +422,12 @@ function get_country_flag_html(country_code) {
|
|
|
return twemoji.parse(emoji);
|
|
|
}
|
|
|
|
|
|
-async function render_leaderboard(ruleset, page_num) {
|
|
|
+async function render_leaderboard(page_num) {
|
|
|
document.title = 'Leaderboard - o!RL';
|
|
|
const template = document.querySelector('#leaderboard-template').content.cloneNode(true);
|
|
|
|
|
|
document.querySelector('main').appendChild(document.querySelector('#loading-template').content.cloneNode(true));
|
|
|
- const json = await get(`/api/leaderboard/${ruleset}/${page_num}`);
|
|
|
+ const json = await get(`/api/leaderboard/${page_num}`);
|
|
|
document.querySelector('main .loading-placeholder').remove();
|
|
|
|
|
|
const lboard = template.querySelector('.leaderboard tbody');
|
|
@@ -441,7 +442,7 @@ async function render_leaderboard(ruleset, page_num) {
|
|
|
}
|
|
|
|
|
|
const pagi_div = template.querySelector('.pagination');
|
|
|
- render_pagination(pagi_div, json.page, json.max_pages, (num) => `/leaderboard/${ruleset}/page-${num}/`);
|
|
|
+ render_pagination(pagi_div, json.page, json.max_pages, (num) => `/leaderboard/page-${num}/`);
|
|
|
|
|
|
document.querySelector('main').appendChild(template);
|
|
|
}
|
|
@@ -474,15 +475,11 @@ async function render_user(user_id, page_num) {
|
|
|
'The One': 'the-one',
|
|
|
};
|
|
|
|
|
|
- const ruleset = rulesets[selected_ruleset];
|
|
|
const template = document.querySelector('#user-template').content.cloneNode(true);
|
|
|
template.querySelector('.heading-left img').src = `https://s.ppy.sh/a/${json.user_id}`;
|
|
|
template.querySelector('.heading-right h1').innerHTML = get_country_flag_html(json.country_code) + ' ' + json.username;
|
|
|
template.querySelector('.heading-right h1').classList.add(division_to_class[user_info.text]);
|
|
|
template.querySelector('.heading-right .subheading').href = `https://osu.ppy.sh/users/${json.user_id}`;
|
|
|
- template.querySelectorAll('.user-modes a').forEach((div) => {
|
|
|
- div.href = `/u/${json.user_id}/${div.querySelector('img').getAttribute('ruleset')}`;
|
|
|
- });
|
|
|
|
|
|
const blocks = template.querySelectorAll('.user-focus-block');
|
|
|
if (user_info.is_ranked) {
|
|
@@ -497,7 +494,7 @@ async function render_user(user_id, page_num) {
|
|
|
document.querySelector('main').appendChild(template);
|
|
|
|
|
|
document.querySelector('main').appendChild(document.querySelector('#loading-template').content.cloneNode(true));
|
|
|
- const matches_json = await get(`/api/user/${user_id}/${ruleset}/matches/${page_num}`);
|
|
|
+ const matches_json = await get(`/api/user/${user_id}/matches/${page_num}`);
|
|
|
document.querySelector('main .loading-placeholder').remove();
|
|
|
|
|
|
const tbody = document.querySelector('.match-history tbody');
|
|
@@ -518,7 +515,7 @@ async function render_user(user_id, page_num) {
|
|
|
}
|
|
|
|
|
|
const pagi_div = document.querySelector('.pagination');
|
|
|
- render_pagination(pagi_div, matches_json.page, matches_json.max_pages, (num) => `/u/${user_id}/${ruleset}/page-${num}/`);
|
|
|
+ render_pagination(pagi_div, matches_json.page, matches_json.max_pages, (num) => `/u/${user_id}/page-${num}/`);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -526,12 +523,6 @@ async function route(new_url) {
|
|
|
console.info('Loading ' + new_url);
|
|
|
update_header_highlights();
|
|
|
update_header_profile();
|
|
|
- update_selected_ruleset(rulesets[selected_ruleset]);
|
|
|
-
|
|
|
- if (new_url == '/osu_login') {
|
|
|
- document.location = '/osu_login';
|
|
|
- return;
|
|
|
- }
|
|
|
|
|
|
let m;
|
|
|
if (m = new_url.match(/\/create-lobby\//)) {
|
|
@@ -687,7 +678,6 @@ async function route(new_url) {
|
|
|
document.querySelector('.lobby-creation-success').hidden = false;
|
|
|
|
|
|
last_match_id = json_res.lobby.tournament_id;
|
|
|
- localStorage.setItem('last_match_id', last_match_id);
|
|
|
} catch (err) {
|
|
|
document.querySelector('.lobby-creation-error .error-msg').innerText = err.message;
|
|
|
document.querySelector('.lobby-creation-spinner').hidden = true;
|
|
@@ -711,7 +701,7 @@ async function route(new_url) {
|
|
|
window.history.pushState({}, '', `/reopen-lobby/${last_match_id}`);
|
|
|
route(`/reopen-lobby/${last_match_id}`);
|
|
|
} else {
|
|
|
- localStorage.setItem('redirect_to', `/reopen-lobby/${last_match_id}`);
|
|
|
+ document.cookie = `login_to=${location.origin}/reopen-lobby/${last_match_id}; path=/; domain=${domain_name}; secure; SameSite=Strict; Max-Age=30000`;
|
|
|
document.location = '/osu_login';
|
|
|
}
|
|
|
});
|
|
@@ -734,7 +724,6 @@ async function route(new_url) {
|
|
|
evt.stopPropagation();
|
|
|
|
|
|
const lobby_settings = {
|
|
|
- ruleset: selected_ruleset,
|
|
|
title: document.querySelector('input[name="title"]').value,
|
|
|
map_selection_algo: document.querySelector('main input[name="map-selection-type"]:checked').value,
|
|
|
map_pool: document.querySelector('main input[name="map-pool"]:checked').value,
|
|
@@ -820,7 +809,6 @@ async function route(new_url) {
|
|
|
document.querySelector('.lobby-creation-success').hidden = false;
|
|
|
|
|
|
last_match_id = json_res.lobby.tournament_id;
|
|
|
- localStorage.setItem('last_match_id', last_match_id);
|
|
|
} catch (err) {
|
|
|
document.querySelector('.lobby-creation-error .error-msg').innerText = err.message;
|
|
|
document.querySelector('.lobby-creation-spinner').hidden = true;
|
|
@@ -853,47 +841,23 @@ async function route(new_url) {
|
|
|
} else if (m = new_url.match(/\/lobbies\//)) {
|
|
|
document.querySelector('main').innerHTML = '';
|
|
|
await render_lobbies();
|
|
|
- } else if (m = new_url.match(/\/leaderboard\/(\w+)\/(page-(\d+)\/)?/)) {
|
|
|
- const ruleset = m[1];
|
|
|
- update_selected_ruleset(ruleset);
|
|
|
-
|
|
|
- const page_num = m[3] || 1;
|
|
|
+ } else if (m = new_url.match(/\/leaderboard\/(page-(\d+)\/)?/)) {
|
|
|
+ const page_num = m[2] || 1;
|
|
|
document.querySelector('main').innerHTML = '';
|
|
|
- await render_leaderboard(ruleset, page_num);
|
|
|
- } else if (m = new_url.match(/\/u\/(\d+)\/(\w+)\/page-(\d+)\/?/)) {
|
|
|
- const ruleset = m[2];
|
|
|
- update_selected_ruleset(ruleset);
|
|
|
-
|
|
|
+ await render_leaderboard(page_num);
|
|
|
+ } else if (m = new_url.match(/\/u\/(\d+)\/page-(\d+)\/?/)) {
|
|
|
const user_id = m[1];
|
|
|
- const page_num = m[3] || 1;
|
|
|
+ const page_num = m[2] || 1;
|
|
|
document.querySelector('main').innerHTML = '';
|
|
|
await render_user(user_id, page_num);
|
|
|
- } else if (m = new_url.match(/\/u\/(\d+)\/(\w+)\/?/)) {
|
|
|
- const ruleset = m[2];
|
|
|
- update_selected_ruleset(ruleset);
|
|
|
-
|
|
|
+ } else if (m = new_url.match(/\/u\/(\d+)\/?/)) {
|
|
|
const user_id = m[1];
|
|
|
document.querySelector('main').innerHTML = '';
|
|
|
await render_user(user_id, 1);
|
|
|
- } else if (m = new_url.match(/\/leaderboard\/(page-(\d+)\/)?/)) {
|
|
|
- const page_num = m[2] || 1;
|
|
|
- new_url = `/leaderboard/${rulesets[selected_ruleset]}/page-${page_num}/`;
|
|
|
- window.history.replaceState({}, 'osu! ranked lobbies', new_url);
|
|
|
- route(new_url);
|
|
|
- } else if (m = new_url.match(/\/u\/(\d+)\/?/)) {
|
|
|
- new_url = `/u/${m[1]}/${rulesets[selected_ruleset]}/`;
|
|
|
- window.history.replaceState({}, 'osu! ranked lobbies', new_url);
|
|
|
- route(new_url);
|
|
|
} else {
|
|
|
const main = document.querySelector('main');
|
|
|
if (main.innerHTML.indexOf('{{ error }}') != -1) {
|
|
|
main.innerHTML = 'Page not found.';
|
|
|
- } else if (main.innerHTML.indexOf('Logged in successfully.') != -1) {
|
|
|
- const redirect_to = localStorage.getItem('redirect_to');
|
|
|
- localStorage.removeItem('redirect_to');
|
|
|
- document.querySelector('main').innerHTML = '';
|
|
|
- route(redirect_to);
|
|
|
- return;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -913,4 +877,5 @@ async function route(new_url) {
|
|
|
|
|
|
|
|
|
// Load pages and hijack browser browsing
|
|
|
+update_header_profile();
|
|
|
route(location.pathname);
|