Verbessere TTR-Wert-Import: Füge parallele Abrufe für aktuelle und frühere Ranglisten hinzu und verbessere die Zuordnung von QTTR-Daten.
This commit is contained in:
@@ -148,17 +148,23 @@ async function loginWithBrowser(email, password) {
|
|||||||
} finally { await browser.close() }
|
} finally { await browser.close() }
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function fetchClubRankings(connection) {
|
export async function fetchClubRankings(connection, currentRanking = 'yes') {
|
||||||
let cookie
|
let cookie
|
||||||
try { cookie = await loginDirect(connection.email, connection.password) } catch (error) {
|
try { cookie = await loginDirect(connection.email, connection.password) } catch (error) {
|
||||||
if (error.message !== 'CAPTCHA_REQUIRED') throw error
|
if (error.message !== 'CAPTCHA_REQUIRED') throw error
|
||||||
cookie = await loginWithBrowser(connection.email, connection.password)
|
cookie = await loginWithBrowser(connection.email, connection.password)
|
||||||
}
|
}
|
||||||
const url = new URL('/rankings/andro-rangliste', BASE_URL)
|
const url = new URL('/rankings/andro-rangliste', BASE_URL)
|
||||||
url.search = new URLSearchParams({ 'all-players': 'on', clubnr: connection.clubId, fednickname: connection.association, 'current-ranking': 'yes', 'results-per-page': '100', page: '0', _data: 'routes/$' })
|
url.search = new URLSearchParams({ 'all-players': 'on', clubnr: connection.clubId, fednickname: connection.association, 'current-ranking': currentRanking, 'results-per-page': '100', page: '0', _data: 'routes/$' })
|
||||||
|
console.info('[mytischtennis] Ranking request URL:', url.toString())
|
||||||
const response = await fetch(url, { headers: { ...HEADERS, cookie, accept: 'application/json', referer: `${BASE_URL}/` } })
|
const response = await fetch(url, { headers: { ...HEADERS, cookie, accept: 'application/json', referer: `${BASE_URL}/` } })
|
||||||
if (!response.ok) throw new Error(`Ranglisten-Abruf fehlgeschlagen (HTTP ${response.status}).`)
|
if (!response.ok) throw new Error(`Ranglisten-Abruf fehlgeschlagen (HTTP ${response.status}).`)
|
||||||
const entries = findEntries(await response.json())
|
const entries = findEntries(await response.json())
|
||||||
if (!entries) throw new Error('myTischtennis hat keine Ranglisten-Daten geliefert.')
|
if (!entries) throw new Error('myTischtennis hat keine Ranglisten-Daten geliefert.')
|
||||||
|
console.info('[mytischtennis] Ranking response:', {
|
||||||
|
currentRanking,
|
||||||
|
entryCount: entries.length,
|
||||||
|
entryKeys: Object.keys(entries[0] || {})
|
||||||
|
})
|
||||||
return entries
|
return entries
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -215,19 +215,29 @@ export async function importQttrValues(options = {}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function importAuthenticatedTtrValues(connection) {
|
async function importAuthenticatedTtrValues(connection) {
|
||||||
const entries = await fetchClubRankings(connection)
|
const [ttrEntries, qttrEntries] = await Promise.all([
|
||||||
const rows = entries.map((entry, index) => ({
|
fetchClubRankings(connection, 'yes'),
|
||||||
|
fetchClubRankings(connection, 'no')
|
||||||
|
])
|
||||||
|
const qttrByPlayer = new Map(qttrEntries.map(entry => [
|
||||||
|
String(entry.personId || `${entry.firstname || ''}|${entry.lastname || ''}`).toLowerCase(), entry
|
||||||
|
]))
|
||||||
|
const rows = ttrEntries.map((entry, index) => {
|
||||||
|
const key = String(entry.personId || `${entry.firstname || ''}|${entry.lastname || ''}`).toLowerCase()
|
||||||
|
const qttrEntry = qttrByPlayer.get(key)
|
||||||
|
return ({
|
||||||
rank: toNumberOrNull(entry.rank ?? entry.ranking ?? index + 1),
|
rank: toNumberOrNull(entry.rank ?? entry.ranking ?? index + 1),
|
||||||
playerNumber: toNumberOrNull(entry.playernr ?? entry.player_number ?? entry.nuid),
|
playerNumber: toNumberOrNull(entry.playernr ?? entry.player_number ?? entry.nuid),
|
||||||
gender: normalizeGender(entry.gender),
|
gender: normalizeGender(entry.gender),
|
||||||
playerName: `${entry.firstname ?? entry.first_name ?? ''} ${entry.lastname ?? entry.last_name ?? ''}`.trim() || entry.name || null,
|
playerName: `${entry.firstname ?? entry.first_name ?? ''} ${entry.lastname ?? entry.last_name ?? ''}`.trim() || entry.name || null,
|
||||||
clubName: entry.clubname ?? entry.club_name ?? 'Harheimer TC',
|
clubName: entry.clubname ?? entry.club_name ?? 'Harheimer TC',
|
||||||
currentQttr: toNumberOrNull(entry.qttr ?? entry.q_ttr ?? entry.ttr),
|
currentQttr: toNumberOrNull(qttrEntry?.fedRank ?? qttrEntry?.qttr ?? entry.qttr),
|
||||||
currentTtr: toNumberOrNull(entry.ttr ?? entry.current_ttr),
|
currentTtr: toNumberOrNull(entry.fedRank ?? entry.ttr ?? entry.current_ttr),
|
||||||
previousQttr: null,
|
previousQttr: null,
|
||||||
valuesByHeader: entry,
|
valuesByHeader: entry,
|
||||||
rawCells: []
|
rawCells: []
|
||||||
})).filter(row => row.playerName && row.currentQttr != null)
|
})
|
||||||
|
}).filter(row => row.playerName && (row.currentTtr != null || row.currentQttr != null))
|
||||||
|
|
||||||
if (!rows.length) throw new Error('Keine verwertbaren TTR-Werte in der myTischtennis-Rangliste gefunden.')
|
if (!rows.length) throw new Error('Keine verwertbaren TTR-Werte in der myTischtennis-Rangliste gefunden.')
|
||||||
const importedAt = new Date().toISOString()
|
const importedAt = new Date().toISOString()
|
||||||
|
|||||||
Reference in New Issue
Block a user