mirror of
https://github.com/openclaw/openclaw.git
synced 2026-02-19 18:39:20 -05:00
Merged via /review-pr -> /prepare-pr -> /merge-pr.
Prepared head SHA: 7705a7741e
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky
43 lines
1.6 KiB
Swift
43 lines
1.6 KiB
Swift
import CoreLocation
|
|
import Foundation
|
|
import OpenClawKit
|
|
|
|
/// Monitors significant location changes and pushes `location.update`
|
|
/// events to the gateway so the severance hook can determine whether
|
|
/// the user is at their configured work location.
|
|
@MainActor
|
|
enum SignificantLocationMonitor {
|
|
static func startIfNeeded(
|
|
locationService: any LocationServicing,
|
|
locationMode: OpenClawLocationMode,
|
|
gateway: GatewayNodeSession,
|
|
beforeSend: (@MainActor @Sendable () async -> Void)? = nil
|
|
) {
|
|
guard locationMode == .always else { return }
|
|
let status = locationService.authorizationStatus()
|
|
guard status == .authorizedAlways else { return }
|
|
locationService.startMonitoringSignificantLocationChanges { location in
|
|
struct Payload: Codable {
|
|
var lat: Double
|
|
var lon: Double
|
|
var accuracyMeters: Double
|
|
var source: String?
|
|
}
|
|
let payload = Payload(
|
|
lat: location.coordinate.latitude,
|
|
lon: location.coordinate.longitude,
|
|
accuracyMeters: location.horizontalAccuracy,
|
|
source: "ios-significant-location")
|
|
guard let data = try? JSONEncoder().encode(payload),
|
|
let json = String(data: data, encoding: .utf8)
|
|
else { return }
|
|
Task { @MainActor in
|
|
if let beforeSend {
|
|
await beforeSend()
|
|
}
|
|
await gateway.sendEvent(event: "location.update", payloadJSON: json)
|
|
}
|
|
}
|
|
}
|
|
}
|