Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions mac_app/Maperick/Maperick/Models/ConnectionState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,35 +6,70 @@ import SwiftUI
class ConnectionState {
let monitor = NetworkMonitor()
let history = HistoryReader()
let statsStore = StatsStore()

var totalUniqueIPsEverSeen: Int = 0
var topHistoricalServers: [AllTimeServerStats] = []

// Stats for UI
var dailyStats: [DailyStats] = []
var weeklySummaries: [PeriodSummary] = []
var monthlySummaries: [PeriodSummary] = []
var allTimeSummary: AllTimeSummary?
var thisWeekSummary: (uniqueIPs: Int, totalConnections: Int) = (0, 0)

private var historyTimer: Timer?
private var statsTimer: Timer?

init() {
refreshHistoricalData()
refreshStats()
startMonitoring()

historyTimer = Timer.scheduledTimer(withTimeInterval: 30.0, repeats: true) { [weak self] _ in
Task { @MainActor in
self?.refreshHistoricalData()
}
}

// Refresh stats display every 60 seconds (data is written every 5s via poll)
statsTimer = Timer.scheduledTimer(withTimeInterval: 60.0, repeats: true) { [weak self] _ in
Task { @MainActor in
self?.refreshStats()
}
}
}

func refreshHistoricalData() {
totalUniqueIPsEverSeen = history.getTotalUniqueIPs()
topHistoricalServers = history.getTopServers(limit: 5)
}

func refreshStats() {
dailyStats = statsStore.getDailyStats(days: 30)
weeklySummaries = statsStore.getWeeklySummaries(weeks: 8)
monthlySummaries = statsStore.getMonthlySummaries(months: 6)
allTimeSummary = statsStore.getAllTimeSummary()
thisWeekSummary = statsStore.getThisWeekSummary()
}

/// Called after each network poll to record stats
func recordPollStats() {
statsStore.recordPoll(servers: monitor.servers, totalConnections: monitor.totalConnections)
}

func startMonitoring() {
monitor.onPollComplete = { [weak self] in
self?.recordPollStats()
}
monitor.start()
}

func stopMonitoring() {
monitor.stop()
historyTimer?.invalidate()
historyTimer = nil
statsTimer?.invalidate()
statsTimer = nil
}
}
6 changes: 6 additions & 0 deletions mac_app/Maperick/Maperick/Models/NetworkStats.swift
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ class NetworkMonitor {
/// Process filter — when set, only show connections from this process on the globe
var processFilter: String? = nil

/// Called after each poll completes — used by ConnectionState to record stats
var onPollComplete: (() -> Void)?

private var timer: Timer?
private var geoIPService: GeoIPService?
private var userLocation: (latitude: Double, longitude: Double)?
Expand Down Expand Up @@ -261,6 +264,9 @@ class NetworkMonitor {
} else {
self.globeScene.updateConnections(servers: sortedServers)
}

// Notify ConnectionState to record stats
self.onPollComplete?()
}
}
}
Expand Down
Loading
Loading