mtg-playerinfo 1.3.2 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/fetchers/melee.js +5 -11
- package/src/fetchers/topdeck.js +24 -0
- package/src/utils/socialMediaExtractor.js +50 -0
- package/test/data/topdeck.html +2 -2
- package/test/data/unityLeague.html +57 -33
- package/test/data/untapped.json +1 -1
- package/test/topdeck.test.js +3 -0
- package/test/untapped.test.js +3 -3
package/package.json
CHANGED
package/src/fetchers/melee.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const { request } = require('../utils/httpClient')
|
|
2
2
|
const cheerio = require('cheerio')
|
|
3
|
+
const { extractHandle, getPlatformName } = require('../utils/socialMediaExtractor')
|
|
3
4
|
|
|
4
5
|
class MeleeFetcher {
|
|
5
6
|
async fetchById (username) {
|
|
@@ -33,17 +34,10 @@ class MeleeFetcher {
|
|
|
33
34
|
$('.social-link').each((i, el) => {
|
|
34
35
|
const href = $(el).attr('href')
|
|
35
36
|
if (href) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if (handle) {
|
|
41
|
-
handle = decodeURIComponent(handle)
|
|
42
|
-
const label = platform.charAt(0).toLowerCase() + platform.slice(1)
|
|
43
|
-
data[label] = handle
|
|
44
|
-
}
|
|
45
|
-
} catch (e) {
|
|
46
|
-
console.log('Invalid URL in social link ' + href + ': ' + e.message)
|
|
37
|
+
const handle = extractHandle(href)
|
|
38
|
+
const platform = getPlatformName(href)
|
|
39
|
+
if (handle && platform) {
|
|
40
|
+
data[platform] = handle
|
|
47
41
|
}
|
|
48
42
|
}
|
|
49
43
|
})
|
package/src/fetchers/topdeck.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const httpClient = require('../utils/httpClient')
|
|
2
2
|
const cheerio = require('cheerio')
|
|
3
|
+
const { extractHandle } = require('../utils/socialMediaExtractor')
|
|
3
4
|
|
|
4
5
|
class TopdeckFetcher {
|
|
5
6
|
async fetchById (handle) {
|
|
@@ -75,6 +76,29 @@ class TopdeckFetcher {
|
|
|
75
76
|
photo: photo ? (photo.startsWith('http') ? photo : `https://topdeck.gg${photo}`) : null
|
|
76
77
|
}
|
|
77
78
|
|
|
79
|
+
const pronounsBadge = $('span.badge').filter((i, el) => {
|
|
80
|
+
return $(el).text().includes('/')
|
|
81
|
+
}).first().text().trim()
|
|
82
|
+
if (pronounsBadge) {
|
|
83
|
+
data.pronouns = pronounsBadge
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const twitterLink = $('a[href*="twitter.com"]').attr('href')
|
|
87
|
+
if (twitterLink) {
|
|
88
|
+
const handle = extractHandle(twitterLink)
|
|
89
|
+
if (handle) {
|
|
90
|
+
data.twitter = handle
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const youtubeLink = $('a[href*="youtube.com"]').attr('href')
|
|
95
|
+
if (youtubeLink) {
|
|
96
|
+
const handle = extractHandle(youtubeLink)
|
|
97
|
+
if (handle) {
|
|
98
|
+
data.youtube = handle
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
78
102
|
const statsMap = {
|
|
79
103
|
totalTournaments: 'tournaments',
|
|
80
104
|
overallRecord: 'record',
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts social media handle from a URL
|
|
3
|
+
* @param {string} url - The full social media URL
|
|
4
|
+
* @returns {string|null} - The handle (without the URL), or null if extraction fails
|
|
5
|
+
*/
|
|
6
|
+
function extractHandle (url) {
|
|
7
|
+
if (!url) {
|
|
8
|
+
return null
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
try {
|
|
12
|
+
const urlObj = new URL(url)
|
|
13
|
+
let handle = urlObj.pathname.split('/').filter(Boolean).pop()
|
|
14
|
+
if (handle) {
|
|
15
|
+
handle = decodeURIComponent(handle)
|
|
16
|
+
return handle
|
|
17
|
+
}
|
|
18
|
+
} catch (e) {
|
|
19
|
+
console.log('Invalid URL in social link ' + url + ': ' + e.message)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return null
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Extracts platform name from a URL hostname
|
|
27
|
+
* @param {string} url - The full social media URL
|
|
28
|
+
* @returns {string|null} - The platform name (e.g., 'twitter', 'youtube'), or null if extraction fails
|
|
29
|
+
*/
|
|
30
|
+
function getPlatformName (url) {
|
|
31
|
+
if (!url) {
|
|
32
|
+
return null
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
const urlObj = new URL(url)
|
|
37
|
+
const platform = urlObj.hostname.replace('www.', '').split('.')[0]
|
|
38
|
+
return platform.charAt(0).toLowerCase() + platform.slice(1)
|
|
39
|
+
} catch (e) {
|
|
40
|
+
console.log('Invalid URL: ' + url + ': ' + e.message)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return null
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
module.exports = {
|
|
47
|
+
extractHandle,
|
|
48
|
+
getPlatformName
|
|
49
|
+
}
|
|
50
|
+
|
package/test/data/topdeck.html
CHANGED
|
@@ -96,7 +96,7 @@ gtag('config', 'G-56527VG23P');
|
|
|
96
96
|
}).then((ret) => {
|
|
97
97
|
location.reload();
|
|
98
98
|
});
|
|
99
|
-
}</script><!-- Page content--><div class="offcanvas offcanvas-end w-100" id="viewDecklistOffcanvas" tabindex="-1" aria-labelledby="viewDecklistOffcanvasLabel" aria-hidden="true"><div class="offcanvas-header bg-primary"><h5 class="offcanvas-title" id="viewDecklistOffcanvasLabel">Decklist</h5><button class="btn-close btn-close-white" type="button" data-bs-dismiss="offcanvas" aria-label="Close"></button></div><div class="offcanvas-body bg-dark"><pre class="mb-3"><code class="language-json" id="decklistContent"></code></pre></div></div><script src="/js/supportedGames?t=
|
|
99
|
+
}</script><!-- Page content--><div class="offcanvas offcanvas-end w-100" id="viewDecklistOffcanvas" tabindex="-1" aria-labelledby="viewDecklistOffcanvasLabel" aria-hidden="true"><div class="offcanvas-header bg-primary"><h5 class="offcanvas-title" id="viewDecklistOffcanvasLabel">Decklist</h5><button class="btn-close btn-close-white" type="button" data-bs-dismiss="offcanvas" aria-label="Close"></button></div><div class="offcanvas-body bg-dark"><pre class="mb-3"><code class="language-json" id="decklistContent"></code></pre></div></div><script src="/js/supportedGames?t=1771373044194"></script><script>function viewTextDecklist(decklist, title, tournamentId = null, playerId = null, game = null) {
|
|
100
100
|
// Use dynamically served games list
|
|
101
101
|
const supportedGames = window.SUPPORTED_GAMES;
|
|
102
102
|
|
|
@@ -139,7 +139,7 @@ gtag('config', 'G-56527VG23P');
|
|
|
139
139
|
#viewDecklistOffcanvas {
|
|
140
140
|
width: 660px !important;
|
|
141
141
|
}
|
|
142
|
-
}</style><!-- Hero Section with Cover Photo--><div class="position-relative overflow-hidden"><div class="position-relative" style="height: 280px; background-image: url(https://imagedelivery.net/kN_u_RUfFF6xsGMKYWhO1g/aa6d70ad-de73-4c09-a4d7-1e64d5ed6d00/cover); background-size: cover; background-position: center;"><div class="position-absolute top-0 start-0 w-100 h-100 bg-dark" style="opacity: 0.2"></div></div><!-- Decorative wave divider--><div class="position-absolute bottom-0 w-100"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 100" preserveAspectRatio="none" style="height: 50px; width: 100%;"><path fill="#0a0e17" d="M0,32L60,42.7C120,53,240,75,360,74.7C480,75,600,53,720,42.7C840,32,960,32,1080,37.3C1200,43,1320,53,1380,58.7L1440,64L1440,100L1380,100C1320,100,1200,100,1080,100C960,100,840,100,720,100C600,100,480,100,360,100C240,100,120,100,60,100L0,100Z"></path></svg></div></div><!-- Profile Card--><div class="container position-relative"><div class="card bg-dark text-white shadow-lg border-0 rounded-4 mt-n5 position-relative" style="z-index: 2;"><div class="card-body py-4 px-md-4"><div class="row align-items-start"><!-- Avatar Column--><div class="col-lg-2 col-md-3 text-center text-md-start mb-4 mb-md-0"><div class="position-relative mx-auto" style="width: fit-content;"><img class="rounded-circle shadow-lg" src="https://imagedelivery.net/kN_u_RUfFF6xsGMKYWhO1g/2a7b8d12-5924-4a58-5f9c-c0bf55766800/square" alt="Profile Picture" style="width: 140px; height: 140px; object-fit: cover; margin-top: -70px; border: 4px solid #0a0e17; background-color: #0a0e17;"></div></div><!-- Player Info & About--><div class="col-lg-5 col-md-9 my-sm-auto mb-4"><h2 class="text-white fw-bold mb-1">Björn Kimminich</h2><div class="d-flex flex-wrap mt-2 gap-2"><a class="btn btn-social bs-outline bs-twitter bs-dark me-2" href="https://twitter.com/bkimminich" target="_blank"><i class="fa-brands fa-twitter"></i></a></div><div class="d-flex flex-wrap gap-2 mt-3" id="badgeContainer"></div></div><!-- Stats Card--><div class="col-lg-5 mx-auto"><div class="card bg-dark border-0 shadow-lg rounded-4 position-relative overflow-hidden"><!-- Decorative gradient background--><div class="position-absolute top-0 start-0 w-100 h-100" style="background: linear-gradient(45deg, rgba(90, 79, 158, 0.2), rgba(0, 0, 0, 0)); opacity: 0.7; z-index: 0;"></div><div class="card-body position-relative p-4" style="z-index: 1;"><h4 class="text-white fw-bold mb-4" id="statsTitle">Player Stats</h4><div class="row g-3"><div class="col-6"><div class="d-flex align-items-center"><i class="fa-solid fa-trophy text-warning fs-3 me-3"></i><div><h5 class="text-white mb-0 fw-bold" id="totalTournaments">0</h5><p class="text-light small mb-0">Tournaments</p></div></div></div><div class="col-6"><div class="d-flex align-items-center"><i class="fa-solid fa-chart-line text-success fs-3 me-3"></i><div><h5 class="text-white mb-0 fw-bold" id="overallRecord">0-0-0</h5><p class="text-light small mb-0">Record</p></div></div></div><div class="col-6"><div class="d-flex align-items-center"><i class="fa-solid fa-percentage text-info fs-3 me-3"></i><div><h5 class="text-white mb-0 fw-bold" id="overallWinRate">0%</h5><p class="text-light small mb-0">Win Rate</p></div></div></div><div class="col-6"><div class="d-flex align-items-center"><i class="fa-solid fa-bolt text-danger fs-3 me-3"></i><div><h5 class="text-white mb-0 fw-bold" id="conversionRate">0%</h5><p class="text-light small mb-0">Conversion</p></div></div></div></div></div></div></div></div></div></div><!-- Modern Pill Tabs--><div class="card bg-dark border-0 shadow-sm rounded-4 mt-4 p-3"><div class="card-body p-0"><ul class="nav nav-pills gap-2 mb-0" role="tablist"><li class="nav-item"><a class="nav-link active py-3 rounded-3" href="#history" data-bs-toggle="tab"><i class="fa-solid fa-trophy me-2"></i>Tournaments</a></li></ul></div></div><!-- Content tabs--><div class="tab-content mt-4 mb-5"><!-- Tournament History Tab--><div class="tab-pane fade show active" id="history"><div class="card bg-dark border-0 rounded-4 shadow-lg py-4 px-3 px-sm-4"><!-- Filters Section--><div class="d-flex flex-wrap gap-3 mb-4 align-items-center"><!-- Format Dropdown - Modern style--><div class="dropdown"><button class="btn btn-outline-secondary dropdown-toggle" id="formatDropdown" type="button" data-bs-toggle="dropdown" aria-expanded="false"><i class="fa-solid fa-layer-group me-2"></i><span id="formatDropdownLabel">All Formats</span></button><ul class="dropdown-menu border-0 shadow"><li><a class="dropdown-item" href="#" data-value="all">All Formats</a></li></ul></div><!-- Year Dropdown - Modern style--><div class="dropdown"><button class="btn btn-outline-secondary dropdown-toggle" id="yearDropdown" type="button" data-bs-toggle="dropdown" aria-expanded="false"><i class="fa-solid fa-calendar-alt me-2"></i><span id="yearDropdownLabel">All Years</span></button><ul class="dropdown-menu border-0 shadow"><li><a class="dropdown-item" href="#" data-value="all">All Years</a></li></ul></div></div><h3 class="card-title text-white fw-bold"><i class="fa-solid fa-history me-2 text-info"></i>Tournament History</h3><div class="tournament-list" id="tournamentList"></div></div></div></div></div></main><footer class="footer bg-black py-5"><div class="container pt-md-2 pt-lg-3"><div class="row pt-sm-2"><!-- Logo, description, and social column--><div class="col-md-4 col-lg-3 pb-2 pb-md-0 mb-4 mb-md-0"><a class="d-block mb-3 mb-md-4" href="/"><img class="img-fluid" src="/img/logo/TopDeckFullWhiteNS.png" alt="TopDeck.gg" style="max-width: 200px;"></a><p class="text-muted pb-2 pb-md-3 mb-3 fs-sm">Discover, organize, and compete in trading card game events. Connect with players worldwide and elevate your game.</p><div class="d-flex gap-1"><a class="btn-social bs-outline bs-light bs-facebook bs-lg me-2" href="https://discord.gg/RjS3mDf3wt" target="_blank"><i class="fa-brands fa-discord"></i></a><a class="btn-social bs-outline bs-light bs-youtube bs-lg me-2" href="https://www.youtube.com/@TopDeckGG_" target="_blank"><i class="fa-brands fa-youtube"></i></a></div></div><!-- Nested columns for links--><div class="col-md-8 col-lg-7 offset-lg-2"><div class="row row-cols-1 row-cols-sm-3"><!-- Company column--><div class="col mb-4 mb-md-0"><div class="widget widget-light"><h4 class="widget-title mb-3">Company</h4><ul><li><a class="widget-link" href="/subscribe">Run a Tournament</a></li><li><a class="widget-link" href="https://newsletter.topdeck.gg/">Newsletter</a></li><li><a class="widget-link" href="/docs/tournaments-v2">API Documentation</a></li><li><a class="widget-link" href="/championship-series-2026">Championship Series</a></li></ul></div></div><!-- Support column--><div class="col mb-4 mb-md-0"><div class="widget widget-light"><h4 class="widget-title mb-3">Support</h4><ul><li><a class="widget-link" href="/cdn-cgi/l/email-protection#
|
|
142
|
+
}</style><!-- Hero Section with Cover Photo--><div class="position-relative overflow-hidden"><div class="position-relative" style="height: 280px; background-image: url(https://imagedelivery.net/kN_u_RUfFF6xsGMKYWhO1g/aa6d70ad-de73-4c09-a4d7-1e64d5ed6d00/cover); background-size: cover; background-position: center;"><div class="position-absolute top-0 start-0 w-100 h-100 bg-dark" style="opacity: 0.2"></div></div><!-- Decorative wave divider--><div class="position-absolute bottom-0 w-100"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 100" preserveAspectRatio="none" style="height: 50px; width: 100%;"><path fill="#0a0e17" d="M0,32L60,42.7C120,53,240,75,360,74.7C480,75,600,53,720,42.7C840,32,960,32,1080,37.3C1200,43,1320,53,1380,58.7L1440,64L1440,100L1380,100C1320,100,1200,100,1080,100C960,100,840,100,720,100C600,100,480,100,360,100C240,100,120,100,60,100L0,100Z"></path></svg></div></div><!-- Profile Card--><div class="container position-relative"><div class="card bg-dark text-white shadow-lg border-0 rounded-4 mt-n5 position-relative" style="z-index: 2;"><div class="card-body py-4 px-md-4"><div class="row align-items-start"><!-- Avatar Column--><div class="col-lg-2 col-md-3 text-center text-md-start mb-4 mb-md-0"><div class="position-relative mx-auto" style="width: fit-content;"><img class="rounded-circle shadow-lg" src="https://imagedelivery.net/kN_u_RUfFF6xsGMKYWhO1g/2a7b8d12-5924-4a58-5f9c-c0bf55766800/square" alt="Profile Picture" style="width: 140px; height: 140px; object-fit: cover; margin-top: -70px; border: 4px solid #0a0e17; background-color: #0a0e17;"><span class="badge text-white position-absolute start-100 translate-middle-y" style="background-color: #5A4F9E; margin-left: -20px; margin-top: -30px; font-size: 0.8rem">He/Him</span></div></div><!-- Player Info & About--><div class="col-lg-5 col-md-9 my-sm-auto mb-4"><h2 class="text-white fw-bold mb-1">Björn Kimminich</h2><div class="d-flex flex-wrap mt-2 gap-2"><a class="btn btn-social bs-outline bs-twitter bs-dark me-2" href="https://twitter.com/bkimminich" target="_blank"><i class="fa-brands fa-twitter"></i></a><a class="btn btn-social bs-outline bs-youtube bs-dark" href="https://www.youtube.com/@Bj%C3%B6rnKimminich" target="_blank"><i class="fa-brands fa-youtube"></i></a></div><div class="d-flex flex-wrap gap-2 mt-3" id="badgeContainer"></div></div><!-- Stats Card--><div class="col-lg-5 mx-auto"><div class="card bg-dark border-0 shadow-lg rounded-4 position-relative overflow-hidden"><!-- Decorative gradient background--><div class="position-absolute top-0 start-0 w-100 h-100" style="background: linear-gradient(45deg, rgba(90, 79, 158, 0.2), rgba(0, 0, 0, 0)); opacity: 0.7; z-index: 0;"></div><div class="card-body position-relative p-4" style="z-index: 1;"><h4 class="text-white fw-bold mb-4" id="statsTitle">Player Stats</h4><div class="row g-3"><div class="col-6"><div class="d-flex align-items-center"><i class="fa-solid fa-trophy text-warning fs-3 me-3"></i><div><h5 class="text-white mb-0 fw-bold" id="totalTournaments">0</h5><p class="text-light small mb-0">Tournaments</p></div></div></div><div class="col-6"><div class="d-flex align-items-center"><i class="fa-solid fa-chart-line text-success fs-3 me-3"></i><div><h5 class="text-white mb-0 fw-bold" id="overallRecord">0-0-0</h5><p class="text-light small mb-0">Record</p></div></div></div><div class="col-6"><div class="d-flex align-items-center"><i class="fa-solid fa-percentage text-info fs-3 me-3"></i><div><h5 class="text-white mb-0 fw-bold" id="overallWinRate">0%</h5><p class="text-light small mb-0">Win Rate</p></div></div></div><div class="col-6"><div class="d-flex align-items-center"><i class="fa-solid fa-bolt text-danger fs-3 me-3"></i><div><h5 class="text-white mb-0 fw-bold" id="conversionRate">0%</h5><p class="text-light small mb-0">Conversion</p></div></div></div></div></div></div></div></div></div></div><!-- Modern Pill Tabs--><div class="card bg-dark border-0 shadow-sm rounded-4 mt-4 p-3"><div class="card-body p-0"><ul class="nav nav-pills gap-2 mb-0" role="tablist"><li class="nav-item"><a class="nav-link active py-3 rounded-3" href="#history" data-bs-toggle="tab"><i class="fa-solid fa-trophy me-2"></i>Tournaments</a></li></ul></div></div><!-- Content tabs--><div class="tab-content mt-4 mb-5"><!-- Tournament History Tab--><div class="tab-pane fade show active" id="history"><div class="card bg-dark border-0 rounded-4 shadow-lg py-4 px-3 px-sm-4"><!-- Filters Section--><div class="d-flex flex-wrap gap-3 mb-4 align-items-center"><!-- Format Dropdown - Modern style--><div class="dropdown"><button class="btn btn-outline-secondary dropdown-toggle" id="formatDropdown" type="button" data-bs-toggle="dropdown" aria-expanded="false"><i class="fa-solid fa-layer-group me-2"></i><span id="formatDropdownLabel">All Formats</span></button><ul class="dropdown-menu border-0 shadow"><li><a class="dropdown-item" href="#" data-value="all">All Formats</a></li></ul></div><!-- Year Dropdown - Modern style--><div class="dropdown"><button class="btn btn-outline-secondary dropdown-toggle" id="yearDropdown" type="button" data-bs-toggle="dropdown" aria-expanded="false"><i class="fa-solid fa-calendar-alt me-2"></i><span id="yearDropdownLabel">All Years</span></button><ul class="dropdown-menu border-0 shadow"><li><a class="dropdown-item" href="#" data-value="all">All Years</a></li></ul></div></div><h3 class="card-title text-white fw-bold"><i class="fa-solid fa-history me-2 text-info"></i>Tournament History</h3><div class="tournament-list" id="tournamentList"></div></div></div></div></div></main><footer class="footer bg-black py-5"><div class="container pt-md-2 pt-lg-3"><div class="row pt-sm-2"><!-- Logo, description, and social column--><div class="col-md-4 col-lg-3 pb-2 pb-md-0 mb-4 mb-md-0"><a class="d-block mb-3 mb-md-4" href="/"><img class="img-fluid" src="/img/logo/TopDeckFullWhiteNS.png" alt="TopDeck.gg" style="max-width: 200px;"></a><p class="text-muted pb-2 pb-md-3 mb-3 fs-sm">Discover, organize, and compete in trading card game events. Connect with players worldwide and elevate your game.</p><div class="d-flex gap-1"><a class="btn-social bs-outline bs-light bs-facebook bs-lg me-2" href="https://discord.gg/RjS3mDf3wt" target="_blank"><i class="fa-brands fa-discord"></i></a><a class="btn-social bs-outline bs-light bs-youtube bs-lg me-2" href="https://www.youtube.com/@TopDeckGG_" target="_blank"><i class="fa-brands fa-youtube"></i></a></div></div><!-- Nested columns for links--><div class="col-md-8 col-lg-7 offset-lg-2"><div class="row row-cols-1 row-cols-sm-3"><!-- Company column--><div class="col mb-4 mb-md-0"><div class="widget widget-light"><h4 class="widget-title mb-3">Company</h4><ul><li><a class="widget-link" href="/subscribe">Run a Tournament</a></li><li><a class="widget-link" href="https://newsletter.topdeck.gg/">Newsletter</a></li><li><a class="widget-link" href="/docs/tournaments-v2">API Documentation</a></li><li><a class="widget-link" href="/championship-series-2026">Championship Series</a></li></ul></div></div><!-- Support column--><div class="col mb-4 mb-md-0"><div class="widget widget-light"><h4 class="widget-title mb-3">Support</h4><ul><li><a class="widget-link" href="/cdn-cgi/l/email-protection#fd9e9293899c9e89bd89928d99989e96d39a9a">Contact Us</a></li><li><a class="widget-link" href="/cdn-cgi/l/email-protection#88e5edece1e9c8fce7f8ecedebe3a6efef">Media Inquiries</a></li><li><a class="widget-link" href="/privacy-policy" target="_blank">Privacy Policy</a></li><li><a class="widget-link" href="/terms-and-conditions" target="_blank">Terms & Conditions</a></li></ul></div></div><!-- Install App column--><div class="col"><h4 class="h6 fw-bold pb-2 mb-0 mb-lg-1">Install App</h4><a class="btn btn-outline-secondary d-inline-flex align-items-center px-3 py-2 mt-3 me-3 me-md-0" href="https://apple.co/3A4Z0FK" role="button" style="min-width: 160px;"><i class="fa-brands fa-apple fs-xl me-2"></i><span class="d-flex flex-column align-items-start"><small class="fs-xs text-white-50">Download on the</small><span class="fs-sm">App Store</span></span></a><a class="btn btn-outline-secondary d-inline-flex align-items-center px-3 py-2 mt-3 me-3 me-md-0" href="https://play.google.com/store/apps/details?id=com.topdeck.app" role="button" style="min-width: 160px;"><i class="fa-brands fa-google-play fs-xl me-2"></i><span class="d-flex flex-column align-items-start"><small class="fs-xs text-white-50">Get it on</small><span class="fs-sm">Google Play</span></span></a></div></div></div></div></div></footer><script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script><script>document.addEventListener('DOMContentLoaded', function () {
|
|
143
143
|
// Template variables for decklist viewing
|
|
144
144
|
const playerUsername = "@k0shiii";
|
|
145
145
|
const playerId = "m4VSTJShiXR1PCSCWaM9TBY0rcg1";
|
|
@@ -85,17 +85,6 @@
|
|
|
85
85
|
<main class="flex-shrink-0 pb-2">
|
|
86
86
|
<div class="container-sm py-3">
|
|
87
87
|
|
|
88
|
-
<br>
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
<div class="alert alert-success" role="alert">
|
|
92
|
-
|
|
93
|
-
Check out the new league system for 2026. New <em>multipliers</em> and support for <em>custom leagues</em>:
|
|
94
|
-
<a class="btn btn-success btn-sm" href="https://unityleague.gg/info" title="Title">League system</a>
|
|
95
|
-
<a class="btn btn-success btn-sm" href="https://unityleague.gg/info/organizer" title="Title">Organizer tutorial</a>
|
|
96
|
-
</div>
|
|
97
|
-
|
|
98
|
-
|
|
99
88
|
|
|
100
89
|
|
|
101
90
|
|
|
@@ -167,9 +156,9 @@
|
|
|
167
156
|
<td>62nd</td>
|
|
168
157
|
|
|
169
158
|
|
|
170
|
-
<td>
|
|
159
|
+
<td>506th</td>
|
|
171
160
|
|
|
172
|
-
<td>
|
|
161
|
+
<td>334</td>
|
|
173
162
|
</tr>
|
|
174
163
|
</tbody>
|
|
175
164
|
</table>
|
|
@@ -210,9 +199,9 @@
|
|
|
210
199
|
<td>62nd</td>
|
|
211
200
|
|
|
212
201
|
|
|
213
|
-
<td>
|
|
202
|
+
<td>506th</td>
|
|
214
203
|
|
|
215
|
-
<td>
|
|
204
|
+
<td>334</td>
|
|
216
205
|
</tr>
|
|
217
206
|
</tbody>
|
|
218
207
|
</table>
|
|
@@ -306,9 +295,9 @@
|
|
|
306
295
|
|
|
307
296
|
<td>78</td>
|
|
308
297
|
|
|
309
|
-
<td>
|
|
298
|
+
<td>220</td>
|
|
310
299
|
|
|
311
|
-
<td>
|
|
300
|
+
<td>334</td>
|
|
312
301
|
|
|
313
302
|
</tr>
|
|
314
303
|
|
|
@@ -320,9 +309,9 @@
|
|
|
320
309
|
|
|
321
310
|
<td>1</td>
|
|
322
311
|
|
|
323
|
-
<td>
|
|
312
|
+
<td>24</td>
|
|
324
313
|
|
|
325
|
-
<td>
|
|
314
|
+
<td>26</td>
|
|
326
315
|
|
|
327
316
|
</tr>
|
|
328
317
|
|
|
@@ -375,22 +364,22 @@
|
|
|
375
364
|
<tr>
|
|
376
365
|
|
|
377
366
|
|
|
378
|
-
<td>
|
|
379
|
-
<td>
|
|
380
|
-
<td>
|
|
381
|
-
<td>
|
|
382
|
-
<td>
|
|
367
|
+
<td>Standard</td>
|
|
368
|
+
<td>32 - 30 - 3</td>
|
|
369
|
+
<td>50.8%</td>
|
|
370
|
+
<td>51.6%</td>
|
|
371
|
+
<td>4.6%</td>
|
|
383
372
|
|
|
384
373
|
</tr>
|
|
385
374
|
|
|
386
375
|
<tr>
|
|
387
376
|
|
|
388
377
|
|
|
389
|
-
<td>
|
|
390
|
-
<td>
|
|
391
|
-
<td>
|
|
392
|
-
<td>
|
|
393
|
-
<td>
|
|
378
|
+
<td>Pauper</td>
|
|
379
|
+
<td>4 - 2 - 0</td>
|
|
380
|
+
<td>66.7%</td>
|
|
381
|
+
<td>66.7%</td>
|
|
382
|
+
<td>0.0%</td>
|
|
394
383
|
|
|
395
384
|
</tr>
|
|
396
385
|
|
|
@@ -409,10 +398,10 @@
|
|
|
409
398
|
|
|
410
399
|
|
|
411
400
|
<td><b>Overall</b></td>
|
|
412
|
-
<td><b>
|
|
413
|
-
<td><b>51.
|
|
414
|
-
<td><b>52.
|
|
415
|
-
<td><b>
|
|
401
|
+
<td><b>52 - 47 - 5</b></td>
|
|
402
|
+
<td><b>51.6%</b></td>
|
|
403
|
+
<td><b>52.5%</b></td>
|
|
404
|
+
<td><b>4.8%</b></td>
|
|
416
405
|
|
|
417
406
|
</tr>
|
|
418
407
|
|
|
@@ -446,6 +435,41 @@
|
|
|
446
435
|
</thead>
|
|
447
436
|
<tbody>
|
|
448
437
|
|
|
438
|
+
<tr>
|
|
439
|
+
<td>6th</td>
|
|
440
|
+
<td>
|
|
441
|
+
<div class="d-flex flex-column-reverse flex-lg-row">
|
|
442
|
+
<div style="min-width: 150px;" >Mon, 16.02.2026</div>
|
|
443
|
+
<a href="/events/21169/">Standard @ Mulligan</a>
|
|
444
|
+
</div>
|
|
445
|
+
</td>
|
|
446
|
+
<td>
|
|
447
|
+
<span data-bs-toggle="tooltip"
|
|
448
|
+
data-bs-placement="left"
|
|
449
|
+
data-bs-html="true"
|
|
450
|
+
data-bs-title="
|
|
451
|
+
<ul>
|
|
452
|
+
<li>Match points: 6</li>
|
|
453
|
+
<li>Participation: 3</li>
|
|
454
|
+
</ul>
|
|
455
|
+
<span>Multiplied by 1x: 9 total</span>
|
|
456
|
+
">
|
|
457
|
+
9
|
|
458
|
+
</span>
|
|
459
|
+
</td>
|
|
460
|
+
<td class="text-nowrap">2 - 2 - 0</td>
|
|
461
|
+
<td>
|
|
462
|
+
<div class="d-flex flex-column flex-lg-row">
|
|
463
|
+
<div style="min-width: 150px;">
|
|
464
|
+
|
|
465
|
+
<img src="/static/types/text_icons/regular.svg" alt="Regular" style="height: 24px;" title="Regular" itemprop="image">
|
|
466
|
+
|
|
467
|
+
</div>
|
|
468
|
+
<div>Standard</div>
|
|
469
|
+
</div>
|
|
470
|
+
</td>
|
|
471
|
+
</tr>
|
|
472
|
+
|
|
449
473
|
<tr>
|
|
450
474
|
<td>2nd</td>
|
|
451
475
|
<td>
|