diff --git a/docs/error-reporting.md b/docs/error-reporting.md deleted file mode 100644 index 6c64c39..0000000 --- a/docs/error-reporting.md +++ /dev/null @@ -1,24 +0,0 @@ -# Error Reporting - -Automatically sends anonymized error reports to help improve the project. - -## Configuration - -In `src/config.jsonc`: - -```jsonc -{ - "errorReporting": { - "enabled": true // Set to false to disable - } -} -``` - -## Privacy - -- No sensitive data sent (emails, passwords, tokens, paths are redacted) -- Only genuine bugs reported (config errors filtered) -- Optional - can be disabled anytime - ---- -**[Back to Documentation](index.md)** \ No newline at end of file diff --git a/public/app.js b/public/app.js index 684778b..26c8fea 100644 --- a/public/app.js +++ b/public/app.js @@ -142,7 +142,7 @@ function initPointsChart() { labels: generateDateLabels(7), datasets: [{ label: 'Points', - data: generatePlaceholderData(7), + data: new Array(7).fill(0), // Real data loaded from API borderColor: '#58a6ff', backgroundColor: gradient, borderWidth: 2, @@ -203,16 +203,6 @@ function generateDateLabels(days) { return labels } -function generatePlaceholderData(count) { - const data = [] - let base = 150 - for (let i = 0; i < count; i++) { - base += Math.floor(Math.random() * 50) - 20 - data.push(Math.max(50, base)) - } - return data -} - function setChartPeriod(period, btn) { document.querySelectorAll('.period-btn').forEach((b) => { b.classList.remove('active') }) btn.classList.add('active') @@ -220,11 +210,58 @@ function setChartPeriod(period, btn) { const days = period === '7d' ? 7 : 30 if (pointsChart) { pointsChart.data.labels = generateDateLabels(days) - pointsChart.data.datasets[0].data = generatePlaceholderData(days) - pointsChart.update('none') + + // Fetch actual data from account history + fetch('/api/account-history') + .then(r => r.json()) + .then(history => { + const pointsData = extractPointsFromHistory(history, days) + pointsChart.data.datasets[0].data = pointsData + pointsChart.update('none') + }) + .catch(() => { + // Fallback to zeros if API fails + pointsChart.data.datasets[0].data = new Array(days).fill(0) + pointsChart.update('none') + }) } } +function extractPointsFromHistory(history, days) { + const dataByDate = {} + const today = new Date() + + // Initialize all days with 0 + for (let i = 0; i < days; i++) { + const d = new Date(today) + d.setDate(d.getDate() - i) + const key = d.toISOString().slice(0, 10) + dataByDate[key] = 0 + } + + // Fill with actual data + for (const email in history) { + const accountHistory = history[email] + for (const day in accountHistory) { + if (dataByDate.hasOwnProperty(day)) { + const dayData = accountHistory[day] + dataByDate[day] += dayData.pointsEarnedToday || 0 + } + } + } + + // Convert to array (reverse chronological) + const result = [] + for (let i = days - 1; i >= 0; i--) { + const d = new Date(today) + d.setDate(d.getDate() - i) + const key = d.toISOString().slice(0, 10) + result.push(dataByDate[key] || 0) + } + + return result +} + // Data Loading function loadInitialData() { fetch('/api/status').then((r) => { return r.json() }).then(updateBotStatus).catch(() => { }) @@ -298,7 +335,7 @@ function updateChartsWithRealData(histories) { var data = sortedDates.map((d) => { return last7Days[d] }) pointsChart.data.labels = labels.length > 0 ? labels : generateDateLabels(7) - pointsChart.data.datasets[0].data = data.length > 0 ? data : generatePlaceholderData(7) + pointsChart.data.datasets[0].data = data.length > 0 ? data : new Array(7).fill(0) pointsChart.update() } @@ -675,11 +712,95 @@ function exportLogs() { } function openConfig() { - showToast('Config editor coming soon', 'info') + showModal('Configuration Editor', ` +
⚠️ Advanced users only. Invalid JSON will break the bot.
+No history available yet
', [ + { cls: 'btn btn-sm btn-secondary', action: 'closeModal()', text: 'Close' } + ]) + return + } + + const rows = history.slice(0, 10).map(h => ` +