mtg-playerinfo 1.2.2 → 1.3.0
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/.github/workflows/update-test-data.yml +2 -2
- package/README.md +5 -4
- package/cli.js +5 -3
- package/package.json +1 -1
- package/scripts/update-test-data.js +2 -1
- package/src/fetchers/untapped.js +54 -0
- package/src/index.js +7 -4
- package/test/data/melee.html +50 -35
- package/test/data/topdeck.html +2 -2
- package/test/data/topdeck.json +1 -1
- package/test/data/unityLeague.html +94 -24
- package/test/data/untapped.json +104 -0
- package/test/edgeCases.test.js +128 -0
- package/test/meleeEdgeCases.test.js +53 -0
- package/test/mtgEloEdgeCases.test.js +92 -0
- package/test/{integration/playerInfoManager.test.js → playerInfoManager.test.js} +2 -2
- package/test/unityLeagueEdgeCases.test.js +123 -0
- package/test/untapped.test.js +58 -0
- package/test/verboseLogging.test.js +215 -0
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
[](https://coveralls.io/github/bkimminich/mtg-playerinfo?branch=main)
|
|
8
8
|
[](https://standardjs.com)
|
|
9
9
|
|
|
10
|
-
A simple NPM module and CLI tool to pull Magic: The Gathering player data from various sources (Unity League, MTG Elo Project, Melee, and
|
|
10
|
+
A simple NPM module and CLI tool to pull Magic: The Gathering player data from various sources (Unity League, MTG Elo Project, Melee, Topdeck, and Untapped.gg).
|
|
11
11
|
|
|
12
12
|
## Installation
|
|
13
13
|
|
|
@@ -18,13 +18,13 @@ npm i -g mtg-playerinfo
|
|
|
18
18
|
## CLI Usage
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
|
-
mtg-playerinfo --unity-id 16215 --mtgelo-id 3irvwtmk --melee-user k0shiii --topdeck-handle k0shiii
|
|
21
|
+
mtg-playerinfo --unity-id 16215 --mtgelo-id 3irvwtmk --melee-user k0shiii --topdeck-handle k0shiii --untapped-id 7de50700-c3f6-48e4-a38d-2add5b0d9b71/76DCDWCZS5FX5PIEEMUVY6GV74
|
|
22
22
|
```
|
|
23
23
|
|
|
24
24
|
or without previous installation
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
|
-
npx mtg-playerinfo --unity-id 16215 --mtgelo-id 3irvwtmk --melee-user k0shiii --topdeck-handle k0shiii
|
|
27
|
+
npx mtg-playerinfo --unity-id 16215 --mtgelo-id 3irvwtmk --melee-user k0shiii --topdeck-handle k0shiii --untapped-id 7de50700-c3f6-48e4-a38d-2add5b0d9b71/76DCDWCZS5FX5PIEEMUVY6GV74
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
## Output Format
|
|
@@ -33,7 +33,7 @@ The tool returns a JSON object representing the player and their combined metada
|
|
|
33
33
|
|
|
34
34
|
### General meta-data and merging priority
|
|
35
35
|
|
|
36
|
-
General meta-data fields like `name`, `photo`, `age`, `country`, and `hometown` are extracted from the first source that provides them and placed in the `general` section. Merging follows a "first-come, first-served" approach based on the order of sources provided in the command line or processed by the manager. In the [CLI usage example](#cli-usage) above, the source priority is `Unity League` > `MTG Elo Project` > `Melee` > `Topdeck`.
|
|
36
|
+
General meta-data fields like `name`, `photo`, `age`, `country`, and `hometown` are extracted from the first source that provides them and placed in the `general` section. Merging follows a "first-come, first-served" approach based on the order of sources provided in the command line or processed by the manager. In the [CLI usage example](#cli-usage) above, the source priority is `Unity League` > `MTG Elo Project` > `Melee` > `Topdeck` > `Untapped.gg`.
|
|
37
37
|
|
|
38
38
|
> If you notice any inconsistencies or unexpected fields values, you can run the tool with the `-v` or `--verbose` flag to see the full list of extracted fields and if they were promoted to the `general` section or deviated from a previous source.
|
|
39
39
|
|
|
@@ -120,6 +120,7 @@ The following sites are currently supported based on HTML scraping and/or API ca
|
|
|
120
120
|
| MTG Elo Project | ✅Scraping |
|
|
121
121
|
| Topdeck | ✅Scraping / ✅API |
|
|
122
122
|
| Melee | ✅Scraping / 🚧API ([#1](https://github.com/bkimminich/mtg-playerinfo/issues/1)) |
|
|
123
|
+
| Untapped.gg | ✅API |
|
|
123
124
|
|
|
124
125
|
_Note: Some sites may have anti-bot protections that can lead to "Maximum number of redirects exceeded" or "403 Forbidden" errors depending on the execution environment._
|
|
125
126
|
|
package/cli.js
CHANGED
|
@@ -12,10 +12,11 @@ program
|
|
|
12
12
|
.option('--mtgelo-id <id>', 'MTG Elo Project Player ID')
|
|
13
13
|
.option('--melee-user <username>', 'Melee Username')
|
|
14
14
|
.option('--topdeck-handle <handle>', 'Topdeck Handle')
|
|
15
|
+
.option('--untapped-id <id>', 'Untapped.gg Player ID (format: userId/playerCode)')
|
|
15
16
|
.option('-v, --verbose', 'Print consistency check information to console')
|
|
16
17
|
.action(async (options) => {
|
|
17
|
-
if (!options.unityId && !options.mtgeloId && !options.meleeUser && !options.topdeckHandle) {
|
|
18
|
-
console.error('Error: Please provide at least one search option (unity-id, mtgelo-id, melee-user, or
|
|
18
|
+
if (!options.unityId && !options.mtgeloId && !options.meleeUser && !options.topdeckHandle && !options.untappedId) {
|
|
19
|
+
console.error('Error: Please provide at least one search option (unity-id, mtgelo-id, melee-user, topdeck-handle, or untapped-id).')
|
|
19
20
|
process.exit(1)
|
|
20
21
|
}
|
|
21
22
|
|
|
@@ -25,7 +26,8 @@ program
|
|
|
25
26
|
'--unity-id': 'unity',
|
|
26
27
|
'--mtgelo-id': 'mtgelo',
|
|
27
28
|
'--melee-user': 'melee',
|
|
28
|
-
'--topdeck-handle': 'topdeck'
|
|
29
|
+
'--topdeck-handle': 'topdeck',
|
|
30
|
+
'--untapped-id': 'untapped'
|
|
29
31
|
}
|
|
30
32
|
|
|
31
33
|
process.argv.forEach(arg => {
|
package/package.json
CHANGED
|
@@ -7,7 +7,8 @@ const targets = [
|
|
|
7
7
|
{ id: '3irvwtmk', url: 'https://mtgeloproject.net/profile/3irvwtmk', file: 'mtgElo.html' },
|
|
8
8
|
{ id: 'k0shiii', url: 'https://melee.gg/Profile/Index/k0shiii', file: 'melee.html' },
|
|
9
9
|
{ id: 'k0shiii', url: 'https://topdeck.gg/profile/@k0shiii', file: 'topdeck.html' },
|
|
10
|
-
{ id: 'm4VSTJShiXR1PCSCWaM9TBY0rcg1', url: 'https://topdeck.gg/profile/m4VSTJShiXR1PCSCWaM9TBY0rcg1/stats', file: 'topdeck.json' }
|
|
10
|
+
{ id: 'm4VSTJShiXR1PCSCWaM9TBY0rcg1', url: 'https://topdeck.gg/profile/m4VSTJShiXR1PCSCWaM9TBY0rcg1/stats', file: 'topdeck.json' },
|
|
11
|
+
{ id: '7de50700-c3f6-48e4-a38d-2add5b0d9b71/76DCDWCZS5FX5PIEEMUVY6GV74', url: 'https://api.mtga.untapped.gg/api/v1/games/users/7de50700-c3f6-48e4-a38d-2add5b0d9b71/players/76DCDWCZS5FX5PIEEMUVY6GV74/?card_set=ECL', file: 'untapped.json' }
|
|
11
12
|
]
|
|
12
13
|
|
|
13
14
|
async function updateTestData () {
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const { request } = require('../utils/httpClient')
|
|
2
|
+
|
|
3
|
+
class UntappedFetcher {
|
|
4
|
+
async fetchById (id) {
|
|
5
|
+
// Split the two-part ID
|
|
6
|
+
const parts = id.split('/')
|
|
7
|
+
if (parts.length !== 2) {
|
|
8
|
+
console.error('Untapped ID must be in format "userId/playerCode"')
|
|
9
|
+
return null
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const userId = parts[0]
|
|
13
|
+
const playerCode = parts[1]
|
|
14
|
+
const url = `https://mtga.untapped.gg/profile/${userId}/${playerCode}`
|
|
15
|
+
const apiUrl = `https://api.mtga.untapped.gg/api/v1/games/users/${userId}/players/${playerCode}/?card_set=ECL`
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
const { data } = await request(apiUrl)
|
|
19
|
+
const matches = typeof data === 'string' ? JSON.parse(data) : data
|
|
20
|
+
|
|
21
|
+
if (!Array.isArray(matches) || matches.length === 0) {
|
|
22
|
+
console.warn(`No matches found for Untapped player ${id}`)
|
|
23
|
+
return null
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const mostRecentMatch = matches.reduce((latest, current) => {
|
|
27
|
+
return (current.match_start > latest.match_start) ? current : latest
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
return this.parseMatch(mostRecentMatch, url)
|
|
31
|
+
} catch (error) {
|
|
32
|
+
console.error(`Error fetching Untapped profile ${id}:`, error.message)
|
|
33
|
+
return null
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
parseMatch (match, url) {
|
|
38
|
+
const data = {
|
|
39
|
+
source: 'Untapped.gg',
|
|
40
|
+
url,
|
|
41
|
+
mtga_rank: null
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (match.friendly_ranking_class_after && match.friendly_ranking_tier_after !== null && match.friendly_ranking_tier_after !== undefined) {
|
|
45
|
+
data.mtga_rank = `${match.friendly_ranking_class_after} ${match.friendly_ranking_tier_after}`
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return data
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
module.exports = UntappedFetcher
|
|
53
|
+
|
|
54
|
+
|
package/src/index.js
CHANGED
|
@@ -2,6 +2,7 @@ const UnityLeagueFetcher = require('./fetchers/unityLeague')
|
|
|
2
2
|
const MtgEloFetcher = require('./fetchers/mtgElo')
|
|
3
3
|
const MeleeFetcher = require('./fetchers/melee')
|
|
4
4
|
const TopdeckFetcher = require('./fetchers/topdeck')
|
|
5
|
+
const UntappedFetcher = require('./fetchers/untapped')
|
|
5
6
|
|
|
6
7
|
class PlayerInfoManager {
|
|
7
8
|
constructor () {
|
|
@@ -9,7 +10,8 @@ class PlayerInfoManager {
|
|
|
9
10
|
unity: new UnityLeagueFetcher(),
|
|
10
11
|
mtgelo: new MtgEloFetcher(),
|
|
11
12
|
melee: new MeleeFetcher(),
|
|
12
|
-
topdeck: new TopdeckFetcher()
|
|
13
|
+
topdeck: new TopdeckFetcher(),
|
|
14
|
+
untapped: new UntappedFetcher()
|
|
13
15
|
}
|
|
14
16
|
}
|
|
15
17
|
|
|
@@ -18,11 +20,12 @@ class PlayerInfoManager {
|
|
|
18
20
|
unity: { option: 'unityId', fetcher: this.fetchers.unity },
|
|
19
21
|
mtgelo: { option: 'mtgeloId', fetcher: this.fetchers.mtgelo },
|
|
20
22
|
melee: { option: 'meleeUser', fetcher: this.fetchers.melee },
|
|
21
|
-
topdeck: { option: 'topdeckHandle', fetcher: this.fetchers.topdeck }
|
|
23
|
+
topdeck: { option: 'topdeckHandle', fetcher: this.fetchers.topdeck },
|
|
24
|
+
untapped: { option: 'untappedId', fetcher: this.fetchers.untapped }
|
|
22
25
|
}
|
|
23
26
|
|
|
24
27
|
// Default order if no priority specified
|
|
25
|
-
const defaultOrder = ['unity', 'mtgelo', 'melee', 'topdeck']
|
|
28
|
+
const defaultOrder = ['unity', 'mtgelo', 'melee', 'topdeck', 'untapped']
|
|
26
29
|
const order = priorityOrder.length > 0 ? priorityOrder : defaultOrder
|
|
27
30
|
|
|
28
31
|
const results = []
|
|
@@ -57,7 +60,7 @@ class PlayerInfoManager {
|
|
|
57
60
|
if (seenUrls.has(res.url)) return
|
|
58
61
|
seenUrls.add(res.url)
|
|
59
62
|
|
|
60
|
-
const generalProps = ['name', 'photo', 'age', 'bio', 'team', 'country', 'hometown', 'pronouns', 'facebook', 'twitch', 'youtube']
|
|
63
|
+
const generalProps = ['name', 'photo', 'age', 'bio', 'team', 'country', 'hometown', 'pronouns', 'facebook', 'twitch', 'youtube', 'mtga_rank']
|
|
61
64
|
generalProps.forEach(prop => {
|
|
62
65
|
if (res[prop]) {
|
|
63
66
|
if (!player.general[prop]) {
|
package/test/data/melee.html
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<title>Profile k0shiii | Melee</title>
|
|
8
8
|
<impact-site-verification value="4c243f18-8267-493f-a951-c8659ec151bc"></impact-site-verification>
|
|
9
9
|
<meta content="@MeleePlatform" property="twitter:site"></meta>
|
|
10
|
-
<meta content="0.3.
|
|
10
|
+
<meta content="0.3.63.85" name="version"></meta>
|
|
11
11
|
<meta content="https://cdn.melee.gg/images/blankbrandimage.png" property="og:image"></meta>
|
|
12
12
|
<meta content="Melee.gg Logo" property="twitter:image:alt"></meta>
|
|
13
13
|
<meta content="https://melee.gg/" property="og:url"></meta>
|
|
@@ -36,9 +36,9 @@
|
|
|
36
36
|
<meta name="author" content="Keyrune Incorporated"/>
|
|
37
37
|
<meta property="og:site_name" content="Melee.gg"/>
|
|
38
38
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
|
|
39
|
-
<link href="https://cdn.melee.gg/content/site.dependencies.min.css?v=0.3.
|
|
39
|
+
<link href="https://cdn.melee.gg/content/site.dependencies.min.css?v=0.3.63.85" rel="stylesheet"/>
|
|
40
40
|
|
|
41
|
-
<link href="/Content/site.min.css?v=0.3.
|
|
41
|
+
<link href="/Content/site.min.css?v=0.3.63.85&lg=en" rel="stylesheet"/>
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
|
|
@@ -47,7 +47,14 @@
|
|
|
47
47
|
}}
|
|
48
48
|
</script>
|
|
49
49
|
|
|
50
|
-
<script id="data-tables-control-template" type="x-tmpl-mustache">
|
|
50
|
+
<script id="data-tables-control-template" type="x-tmpl-mustache">
|
|
51
|
+
{{#quickLookup}}
|
|
52
|
+
<div class="data-tables-quick-filter-input-wrapper">
|
|
53
|
+
<input id="{{tableId}}-quick-filter-input" class="form-control data-tables-quick-filter-input" placeholder="Quick search..." aria-quicksearch="{{tableId}}"/>
|
|
54
|
+
</div>
|
|
55
|
+
{{/quickLookup}}
|
|
56
|
+
|
|
57
|
+
<div class="data-tables-filter-input-wrapper">
|
|
51
58
|
<input id="{{tableId}}-filter-input" class="form-control data-tables-filter-input" placeholder="Search results..." aria-controls="{{tableId}}"/>
|
|
52
59
|
</div>
|
|
53
60
|
{{#useFilters}}
|
|
@@ -572,36 +579,36 @@
|
|
|
572
579
|
</div>
|
|
573
580
|
</script>
|
|
574
581
|
|
|
575
|
-
<script src="https://cdn.melee.gg/scripts/site.min.js?v=0.3.
|
|
576
|
-
<script src="https://cdn.melee.gg/scripts/font-awesome.min.js?v=0.3.
|
|
577
|
-
<script src="/Scripts/flattsware.core.min.js?v=0.3.
|
|
578
|
-
<script src="/Scripts/flattsware.filters.min.js?v=0.3.
|
|
579
|
-
<script src="/Scripts/flattsware.enums.min.js?v=0.3.
|
|
580
|
-
<script src="/Scripts/flattsware.standings.min.js?v=0.3.
|
|
581
|
-
<script src="/Scripts/flattsware.datatables.min.js?v=0.3.
|
|
582
|
-
<script src="/Scripts/flattsware.datetime.min.js?v=0.3.
|
|
583
|
-
<script src="/Scripts/flattsware.encode.min.js?v=0.3.
|
|
584
|
-
<script src="/Scripts/flattsware.regex.min.js?v=0.3.
|
|
585
|
-
<script src="/Scripts/flattsware.notify.min.js?v=0.3.
|
|
586
|
-
<script src="/Scripts/flattsware.spinner.min.js?v=0.3.
|
|
587
|
-
<script src="/Scripts/flattsware.forms.min.js?v=0.3.
|
|
588
|
-
<script src="/Scripts/flattsware.decklist.min.js?v=0.3.
|
|
589
|
-
<script src="/Scripts/flattsware.idle.min.js?v=0.3.
|
|
590
|
-
<script src="/Scripts/flattsware.hovercard.min.js?v=0.3.
|
|
591
|
-
<script src="/Scripts/flattsware.chart.min.js?v=0.3.
|
|
592
|
-
<script src="/Scripts/flattsware.formats.min.js?v=0.3.
|
|
593
|
-
<script src="/Scripts/flattsware.star-rating.min.js?v=0.3.
|
|
594
|
-
<script src="/Scripts/flattsware.progress.min.js?v=0.3.
|
|
595
|
-
<script src="/Scripts/flattsware.location.min.js?v=0.3.
|
|
596
|
-
<script src="/Scripts/flattsware.players.min.js?v=0.3.
|
|
597
|
-
<script src="/signalr/hubs?v=0.3.
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
<script src="/Scripts/wp-banners.min.js?v=0.3.
|
|
582
|
+
<script src="https://cdn.melee.gg/scripts/site.min.js?v=0.3.63.85"></script>
|
|
583
|
+
<script src="https://cdn.melee.gg/scripts/font-awesome.min.js?v=0.3.63.85"></script>
|
|
584
|
+
<script src="/Scripts/flattsware.core.min.js?v=0.3.63.85&lg=en"></script>
|
|
585
|
+
<script src="/Scripts/flattsware.filters.min.js?v=0.3.63.85&lg=en"></script>
|
|
586
|
+
<script src="/Scripts/flattsware.enums.min.js?v=0.3.63.85&lg=en"></script>
|
|
587
|
+
<script src="/Scripts/flattsware.standings.min.js?v=0.3.63.85&lg=en"></script>
|
|
588
|
+
<script src="/Scripts/flattsware.datatables.min.js?v=0.3.63.85&lg=en"></script>
|
|
589
|
+
<script src="/Scripts/flattsware.datetime.min.js?v=0.3.63.85&lg=en"></script>
|
|
590
|
+
<script src="/Scripts/flattsware.encode.min.js?v=0.3.63.85&lg=en"></script>
|
|
591
|
+
<script src="/Scripts/flattsware.regex.min.js?v=0.3.63.85&lg=en"></script>
|
|
592
|
+
<script src="/Scripts/flattsware.notify.min.js?v=0.3.63.85&lg=en"></script>
|
|
593
|
+
<script src="/Scripts/flattsware.spinner.min.js?v=0.3.63.85&lg=en"></script>
|
|
594
|
+
<script src="/Scripts/flattsware.forms.min.js?v=0.3.63.85&lg=en"></script>
|
|
595
|
+
<script src="/Scripts/flattsware.decklist.min.js?v=0.3.63.85&lg=en"></script>
|
|
596
|
+
<script src="/Scripts/flattsware.idle.min.js?v=0.3.63.85&lg=en"></script>
|
|
597
|
+
<script src="/Scripts/flattsware.hovercard.min.js?v=0.3.63.85&lg=en"></script>
|
|
598
|
+
<script src="/Scripts/flattsware.chart.min.js?v=0.3.63.85&lg=en"></script>
|
|
599
|
+
<script src="/Scripts/flattsware.formats.min.js?v=0.3.63.85&lg=en"></script>
|
|
600
|
+
<script src="/Scripts/flattsware.star-rating.min.js?v=0.3.63.85&lg=en"></script>
|
|
601
|
+
<script src="/Scripts/flattsware.progress.min.js?v=0.3.63.85&lg=en"></script>
|
|
602
|
+
<script src="/Scripts/flattsware.location.min.js?v=0.3.63.85&lg=en"></script>
|
|
603
|
+
<script src="/Scripts/flattsware.players.min.js?v=0.3.63.85&lg=en"></script>
|
|
604
|
+
<script src="/signalr/hubs?v=0.3.63.85"></script>
|
|
605
|
+
|
|
606
|
+
|
|
607
|
+
|
|
608
|
+
|
|
609
|
+
<script src="/Scripts/wp-banners.min.js?v=0.3.63.85&lg=en"></script>
|
|
603
610
|
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-162951615-1"></script>
|
|
604
|
-
<script src="/Scripts/google-analytics.min.js?v=0.3.
|
|
611
|
+
<script src="/Scripts/google-analytics.min.js?v=0.3.63.85&lg=en"></script>
|
|
605
612
|
|
|
606
613
|
<!-- Datadog RUM (CDN async) -->
|
|
607
614
|
<script>
|
|
@@ -1461,7 +1468,9 @@
|
|
|
1461
1468
|
<a class="mega-menu-dropdown-link" href="/Organization/Index"><i class="fas fa-caret-right"></i><span class="ml-3">All Organizers</span></a>
|
|
1462
1469
|
<a class="mega-menu-dropdown-link" href="/Profile/Organizations"><i class="fas fa-caret-right"></i><span class="ml-3">Your Organizations</span></a>
|
|
1463
1470
|
<a class="mega-menu-dropdown-link" href="/Organization/Dashboard"><i class="fas fa-caret-right"></i><span class="ml-3">Your Organizer Dashboard</span></a>
|
|
1464
|
-
<a class="mega-menu-dropdown-link
|
|
1471
|
+
<a class="mega-menu-dropdown-link tournament-create-modal" href="#">
|
|
1472
|
+
<i class="fas fa-caret-right"></i><span class="ml-3">Create a Tournament</span>
|
|
1473
|
+
</a>
|
|
1465
1474
|
<a class="mega-menu-dropdown-link" href="/TournamentHub/Edit"><i class="fas fa-caret-right"></i><span class="ml-3">Create a Tournament Hub</span></a>
|
|
1466
1475
|
</div>
|
|
1467
1476
|
</div>
|
|
@@ -1781,7 +1790,7 @@ $(() => {
|
|
|
1781
1790
|
<div class="footer-corp">
|
|
1782
1791
|
<img width="40" height="54" src="/images/keyrune-logo.png"/>
|
|
1783
1792
|
<span>
|
|
1784
|
-
All original content on this page is © 2019-2026 Keyrune Incorporated, its licensors, or its partners and may not be used or reproduced without explicit permission. All trademarks are the property of their respective owners. v0.3.
|
|
1793
|
+
All original content on this page is © 2019-2026 Keyrune Incorporated, its licensors, or its partners and may not be used or reproduced without explicit permission. All trademarks are the property of their respective owners. v0.3.63.85
|
|
1785
1794
|
</span>
|
|
1786
1795
|
</div>
|
|
1787
1796
|
|
|
@@ -1800,6 +1809,12 @@ $(() => {
|
|
|
1800
1809
|
</div>
|
|
1801
1810
|
</div>
|
|
1802
1811
|
|
|
1812
|
+
<script>
|
|
1813
|
+
$(document).on('click', '.add-organization-modal, .tournament-create-modal', (e) => {
|
|
1814
|
+
e.preventDefault();
|
|
1815
|
+
window.location.href = '/Account/SignIn';
|
|
1816
|
+
});
|
|
1817
|
+
</script>
|
|
1803
1818
|
|
|
1804
1819
|
</footer>
|
|
1805
1820
|
|
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=1770910785740"></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;"></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#30535f5e4451534470445f405455535b1e5757">Contact Us</a></li><li><a class="widget-link" href="/cdn-cgi/l/email-protection#3d505859545c7d49524d59585e56135a5a">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";
|
package/test/data/topdeck.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"gameFormats":{"Magic: The Gathering: Modern":[{"id":"modern-championship-buden-brawl-open-2025-copy","name":"Modern Championship @ Buden Brawl Open 2025","date":"2025-03-29T09:00:00.000Z","record":"4-2-0","placement":"16th","placementNumber":16,"size":54,"game":"Magic: The Gathering","bracketLink":"https://topdeck.gg/bracket/modern-championship-buden-brawl-open-2025-copy","topCut":8,"rawFormat":"Modern"}],"Magic: The Gathering: EDH":[{"id":"the-invasion-2025-cedh-championship","name":"The Invasion 2025 - cEDH Championship","date":"2025-10-04T06:00:00.000Z","record":"0-4-1","placement":"118th","placementNumber":118,"size":124,"game":"Magic: The Gathering","bracketLink":"https://topdeck.gg/bracket/the-invasion-2025-cedh-championship","topCut":40,"rawFormat":"EDH"}]},"topFinishes":{"Magic: The Gathering: Modern":{"firstPlaceFinishes":0,"top2":0,"top4":0,"top8":0,"top10":0,"top16":0},"Magic: The Gathering: EDH":{"firstPlaceFinishes":0,"top2":0,"top4":0,"top8":0,"top10":0,"top16":0}},"yearlyStats":{"2025":{"Magic: The Gathering: Modern":{"totalTournaments":1,"topCutEligible":1,"wins":4,"losses":2,"draws":0,"firstPlaceFinishes":0,"top2":0,"top4":0,"top8":0,"top10":0,"top16":0},"Magic: The Gathering: EDH":{"totalTournaments":1,"topCutEligible":1,"wins":0,"losses":4,"draws":1,"firstPlaceFinishes":0,"top2":0,"top4":0,"top8":0,"top10":0,"top16":0},"overall":{"totalTournaments":2,"topCutEligible":2,"wins":4,"losses":6,"draws":1,"firstPlaceFinishes":0,"top2":0,"top4":0,"top8":0,"top10":0,"top16":0}}},"tdcsData":null,"leaguesData":null}
|
|
1
|
+
{"gameFormats":{"Magic: The Gathering: Modern":[{"id":"modern-championship-buden-brawl-open-2025-copy","name":"Modern Championship @ Buden Brawl Open 2025","date":"2025-03-29T09:00:00.000Z","record":"4-2-0","placement":"16th","placementNumber":16,"size":54,"game":"Magic: The Gathering","bracketLink":"https://topdeck.gg/bracket/modern-championship-buden-brawl-open-2025-copy","topCut":8,"rawFormat":"Modern"}],"Magic: The Gathering: EDH":[{"id":"the-invasion-2025-cedh-championship","name":"The Invasion 2025 - cEDH Championship","date":"2025-10-04T06:00:00.000Z","record":"0-4-1","placement":"118th","placementNumber":118,"size":124,"game":"Magic: The Gathering","bracketLink":"https://topdeck.gg/bracket/the-invasion-2025-cedh-championship","topCut":40,"rawFormat":"EDH"}]},"topFinishes":{"Magic: The Gathering: Modern":{"firstPlaceFinishes":0,"top2":0,"top4":0,"top8":0,"top10":0,"top16":0},"Magic: The Gathering: EDH":{"firstPlaceFinishes":0,"top2":0,"top4":0,"top8":0,"top10":0,"top16":0}},"yearlyStats":{"2025":{"Magic: The Gathering: Modern":{"totalTournaments":1,"topCutEligible":1,"wins":4,"losses":2,"draws":0,"firstPlaceFinishes":0,"top2":0,"top4":0,"top8":0,"top10":0,"top16":0},"Magic: The Gathering: EDH":{"totalTournaments":1,"topCutEligible":1,"wins":0,"losses":4,"draws":1,"firstPlaceFinishes":0,"top2":0,"top4":0,"top8":0,"top10":0,"top16":0},"overall":{"totalTournaments":2,"topCutEligible":2,"wins":4,"losses":6,"draws":1,"firstPlaceFinishes":0,"top2":0,"top4":0,"top8":0,"top10":0,"top16":0}}},"tdcsData":null,"leaguesData":null}
|
|
@@ -164,12 +164,12 @@
|
|
|
164
164
|
<tbody>
|
|
165
165
|
<tr>
|
|
166
166
|
|
|
167
|
-
<td>
|
|
167
|
+
<td>62nd</td>
|
|
168
168
|
|
|
169
169
|
|
|
170
|
-
<td>
|
|
170
|
+
<td>503rd</td>
|
|
171
171
|
|
|
172
|
-
<td>
|
|
172
|
+
<td>325</td>
|
|
173
173
|
</tr>
|
|
174
174
|
</tbody>
|
|
175
175
|
</table>
|
|
@@ -207,12 +207,12 @@
|
|
|
207
207
|
<tbody>
|
|
208
208
|
<tr>
|
|
209
209
|
|
|
210
|
-
<td>
|
|
210
|
+
<td>62nd</td>
|
|
211
211
|
|
|
212
212
|
|
|
213
|
-
<td>
|
|
213
|
+
<td>503rd</td>
|
|
214
214
|
|
|
215
|
-
<td>
|
|
215
|
+
<td>325</td>
|
|
216
216
|
</tr>
|
|
217
217
|
</tbody>
|
|
218
218
|
</table>
|
|
@@ -306,9 +306,9 @@
|
|
|
306
306
|
|
|
307
307
|
<td>78</td>
|
|
308
308
|
|
|
309
|
-
<td>
|
|
309
|
+
<td>211</td>
|
|
310
310
|
|
|
311
|
-
<td>
|
|
311
|
+
<td>325</td>
|
|
312
312
|
|
|
313
313
|
</tr>
|
|
314
314
|
|
|
@@ -320,10 +320,10 @@
|
|
|
320
320
|
|
|
321
321
|
<td>1</td>
|
|
322
322
|
|
|
323
|
-
<td>21</td>
|
|
324
|
-
|
|
325
323
|
<td>23</td>
|
|
326
324
|
|
|
325
|
+
<td>25</td>
|
|
326
|
+
|
|
327
327
|
</tr>
|
|
328
328
|
|
|
329
329
|
</tbody>
|
|
@@ -375,22 +375,22 @@
|
|
|
375
375
|
<tr>
|
|
376
376
|
|
|
377
377
|
|
|
378
|
-
<td>
|
|
379
|
-
<td>
|
|
380
|
-
<td>
|
|
381
|
-
<td>
|
|
382
|
-
<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>
|
|
383
383
|
|
|
384
384
|
</tr>
|
|
385
385
|
|
|
386
386
|
<tr>
|
|
387
387
|
|
|
388
388
|
|
|
389
|
-
<td>
|
|
390
|
-
<td>
|
|
391
|
-
<td>
|
|
392
|
-
<td>
|
|
393
|
-
<td>
|
|
389
|
+
<td>Standard</td>
|
|
390
|
+
<td>30 - 28 - 3</td>
|
|
391
|
+
<td>50.8%</td>
|
|
392
|
+
<td>51.7%</td>
|
|
393
|
+
<td>4.9%</td>
|
|
394
394
|
|
|
395
395
|
</tr>
|
|
396
396
|
|
|
@@ -409,10 +409,10 @@
|
|
|
409
409
|
|
|
410
410
|
|
|
411
411
|
<td><b>Overall</b></td>
|
|
412
|
-
<td><b>
|
|
413
|
-
<td><b>
|
|
414
|
-
<td><b>
|
|
415
|
-
<td><b>5.
|
|
412
|
+
<td><b>50 - 45 - 5</b></td>
|
|
413
|
+
<td><b>51.7%</b></td>
|
|
414
|
+
<td><b>52.6%</b></td>
|
|
415
|
+
<td><b>5.0%</b></td>
|
|
416
416
|
|
|
417
417
|
</tr>
|
|
418
418
|
|
|
@@ -446,6 +446,76 @@
|
|
|
446
446
|
</thead>
|
|
447
447
|
<tbody>
|
|
448
448
|
|
|
449
|
+
<tr>
|
|
450
|
+
<td>2nd</td>
|
|
451
|
+
<td>
|
|
452
|
+
<div class="d-flex flex-column-reverse flex-lg-row">
|
|
453
|
+
<div style="min-width: 150px;" >Wed, 11.02.2026</div>
|
|
454
|
+
<a href="/events/29679/">Pauper @ Mulligan</a>
|
|
455
|
+
</div>
|
|
456
|
+
</td>
|
|
457
|
+
<td>
|
|
458
|
+
<span data-bs-toggle="tooltip"
|
|
459
|
+
data-bs-placement="left"
|
|
460
|
+
data-bs-html="true"
|
|
461
|
+
data-bs-title="
|
|
462
|
+
<ul>
|
|
463
|
+
<li>Match points: 6</li>
|
|
464
|
+
<li>Participation: 3</li>
|
|
465
|
+
</ul>
|
|
466
|
+
<span>Multiplied by 1x: 9 total</span>
|
|
467
|
+
">
|
|
468
|
+
9
|
|
469
|
+
</span>
|
|
470
|
+
</td>
|
|
471
|
+
<td class="text-nowrap">2 - 1 - 0</td>
|
|
472
|
+
<td>
|
|
473
|
+
<div class="d-flex flex-column flex-lg-row">
|
|
474
|
+
<div style="min-width: 150px;">
|
|
475
|
+
|
|
476
|
+
<img src="/static/types/text_icons/regular.svg" alt="Regular" style="height: 24px;" title="Regular" itemprop="image">
|
|
477
|
+
|
|
478
|
+
</div>
|
|
479
|
+
<div>Pauper</div>
|
|
480
|
+
</div>
|
|
481
|
+
</td>
|
|
482
|
+
</tr>
|
|
483
|
+
|
|
484
|
+
<tr>
|
|
485
|
+
<td>3rd</td>
|
|
486
|
+
<td>
|
|
487
|
+
<div class="d-flex flex-column-reverse flex-lg-row">
|
|
488
|
+
<div style="min-width: 150px;" >Mon, 09.02.2026</div>
|
|
489
|
+
<a href="/events/21168/">Standard @ Mulligan</a>
|
|
490
|
+
</div>
|
|
491
|
+
</td>
|
|
492
|
+
<td>
|
|
493
|
+
<span data-bs-toggle="tooltip"
|
|
494
|
+
data-bs-placement="left"
|
|
495
|
+
data-bs-html="true"
|
|
496
|
+
data-bs-title="
|
|
497
|
+
<ul>
|
|
498
|
+
<li>Match points: 9</li>
|
|
499
|
+
<li>Participation: 3</li>
|
|
500
|
+
</ul>
|
|
501
|
+
<span>Multiplied by 1x: 12 total</span>
|
|
502
|
+
">
|
|
503
|
+
12
|
|
504
|
+
</span>
|
|
505
|
+
</td>
|
|
506
|
+
<td class="text-nowrap">3 - 1 - 0</td>
|
|
507
|
+
<td>
|
|
508
|
+
<div class="d-flex flex-column flex-lg-row">
|
|
509
|
+
<div style="min-width: 150px;">
|
|
510
|
+
|
|
511
|
+
<img src="/static/types/text_icons/regular.svg" alt="Regular" style="height: 24px;" title="Regular" itemprop="image">
|
|
512
|
+
|
|
513
|
+
</div>
|
|
514
|
+
<div>Standard</div>
|
|
515
|
+
</div>
|
|
516
|
+
</td>
|
|
517
|
+
</tr>
|
|
518
|
+
|
|
449
519
|
<tr>
|
|
450
520
|
<td>7th</td>
|
|
451
521
|
<td>
|