Skip to content

Commit

Permalink
add more cases
Browse files Browse the repository at this point in the history
  • Loading branch information
llsc12 committed Mar 14, 2024
1 parent f7475d8 commit 957a184
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 35 deletions.
46 changes: 38 additions & 8 deletions XRPC/AXScrape.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,33 +19,63 @@ class AXScrape: ObservableObject {
self.scrape()
})
}
@Published var xcodeState: XcodeState? = nil

@Published var presenceState: PresenceState = .xcodeNoWindowsOpen

func scrape() {
guard UIElement.isProcessTrusted(withPrompt: false) else { return }

guard let xcodeApp = Application.allForBundleID(xcodeBundleId).first else { self.xcodeState = nil; return }
guard let xcodeApp = Application.allForBundleID(xcodeBundleId).first else { self.presenceState = .xcodeNotRunning; return }

let windows = try? xcodeApp.windows()

let mainWindow: UIElement? = try? xcodeApp.attribute(.mainWindow)

let focusedWindow: UIElement? = try? xcodeApp.attribute(.focusedWindow)
let focusedWindowTitle: String? = try? focusedWindow?.attribute(.title)

if mainWindow == nil && (windows?.isEmpty ?? false) {
// no windows open
self.presenceState = .xcodeNoWindowsOpen
}

let focusedWindow: UIElement? = try? xcodeApp.attribute(.mainWindow)
if focusedWindowTitle?.contains("Welcome") ?? false {
self.presenceState = .isOnWelcome
return
}

let windowTitle: String? = try? focusedWindow?.attribute(.title)
let windowTitle: String? = try? mainWindow?.attribute(.title)
let workspace: String? = windowTitle == nil ? nil : windowTitle!.components(separatedBy: "").first
let isEditing: Bool = windowTitle?.contains("— Edited") ?? false
let docFilePath: String? = try? focusedWindow?.attribute(.document)
let docFilePath: String? = try? mainWindow?.attribute(.document)
let doc: URL? = docFilePath == nil ? nil : URL(fileURLWithPath: docFilePath!.replacingOccurrences(of: "file://", with: ""))

let currentSessionDate: Date? = {
switch presenceState {
case .working(let xcodeState):
return xcodeState.sessionDate
default: return nil
}
}()

let xcState = XcodeState(
workspace: workspace,
editorFile: doc,
isEditingFile: isEditing,
sessionDate: self.xcodeState?.sessionDate ?? .now /// preserve xcode last date or make new date, used for timings
sessionDate: currentSessionDate ?? .now /// preserve xcode last date or make new date, used for timings
)
self.xcodeState = xcState

self.presenceState = .working(xcState)
}
}

enum PresenceState {
case xcodeNotRunning
case xcodeNoWindowsOpen // when xcode has no windows and is doing nothing
case working(XcodeState) // when user is working
case isOnWelcome
}

struct XcodeState: Equatable {
var workspace: String?
var editorFile: URL?
Expand Down
9 changes: 5 additions & 4 deletions XRPC/MenuBarView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,13 @@ struct MenuBarView: View {
HStack {
Text("Xcode")
Spacer()
if ax.xcodeState != nil {
Image(systemName: "checkmark.circle.fill")
.foregroundStyle(.green)
} else {
switch ax.presenceState {
case .xcodeNotRunning:
Image(systemName: "xmark.circle.fill")
.foregroundStyle(.red)
default:
Image(systemName: "checkmark.circle.fill")
.foregroundStyle(.green)
}
}
}
Expand Down
63 changes: 40 additions & 23 deletions XRPC/RPC.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class RPC: ObservableObject, SwordRPCDelegate {
var c = Set<AnyCancellable>()
init() {
scraper.objectWillChange.sink { _ in
self.setPresence(self.scraper.xcodeState)
self.setPresence(self.scraper.presenceState)
}.store(in: &c)
}

Expand Down Expand Up @@ -62,33 +62,50 @@ class RPC: ObservableObject, SwordRPCDelegate {
}


func setPresence(_ state: XcodeState?) {
if state == nil { rpcDisconnect() } else { rpcConnect() }
guard let state else { return }
var presence = RichPresence()
if let ws = state.workspace {
presence.details = "In \(ws)"
func setPresence(_ state: PresenceState) {
switch state {
case .xcodeNotRunning: rpcDisconnect() /// disconnect to allow other rpcs to connect
case .xcodeNoWindowsOpen: rpcDisconnect() /// disconnect since user isnt doing anything
default: rpcConnect() /// user is doing something, connect if not already connected
}

if state.isIdle {
presence.state = "Idling in Xcode"
} else {
if let filename = state.fileName {
if state.isEditingFile {
presence.state = "Editing \(filename)"
} else {
presence.state = "Viewing \(filename)"
var presence = RichPresence()
switch state {
case .xcodeNotRunning: break
case .xcodeNoWindowsOpen: break
case .working(let xcodeState):
if let ws = xcodeState.workspace {
presence.details = "In \(ws)"
}

if xcodeState.isIdle {
presence.state = "Idling in Xcode"
} else {
if let filename = xcodeState.fileName {
if xcodeState.isEditingFile {
presence.state = "Editing \(filename)"
} else {
presence.state = "Viewing \(filename)"
}
}
}

let date = xcodeState.sessionDate ?? .now
presence.timestamps.start = date
presence.timestamps.end = nil

presence.assets.largeImage = xcodeState.fileExtension ?? "xcode"
presence.assets.largeText = presence.state
case .isOnWelcome:
presence.details = "In Welcome window"
presence.state = "Choosing a project"

presence.timestamps.start = nil
presence.timestamps.end = nil

presence.assets.largeImage = "xcode"
presence.assets.largeText = "Welcome to Xcode"
}

let date = state.sessionDate ?? .now
presence.timestamps.start = date
presence.timestamps.end = nil

presence.assets.largeImage = state.fileExtension ?? "xcode"
presence.assets.largeText = presence.state

rpc.setPresence(presence)
}
}

0 comments on commit 957a184

Please sign in to comment.