aboutsummaryrefslogtreecommitdiff
path: root/HoloBar
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-02-12 04:09:02 -0800
committerFuwn <[email protected]>2025-02-12 04:09:02 -0800
commitf671f7fbcf0f688bb4abfa45e7479f66a20dff90 (patch)
tree5e613a697e844928dfb9c5801bd4737232f614f8 /HoloBar
parentchore(Make): Use Make for task management (diff)
downloadholobar-f671f7fbcf0f688bb4abfa45e7479f66a20dff90.tar.xz
holobar-f671f7fbcf0f688bb4abfa45e7479f66a20dff90.zip
feat: Include talent icons
Diffstat (limited to 'HoloBar')
-rw-r--r--HoloBar/Character.swift1
-rw-r--r--HoloBar/CharacterFetcher.swift31
-rw-r--r--HoloBar/HoloBarApp.swift10
3 files changed, 36 insertions, 6 deletions
diff --git a/HoloBar/Character.swift b/HoloBar/Character.swift
index 23132a2..39a705d 100644
--- a/HoloBar/Character.swift
+++ b/HoloBar/Character.swift
@@ -4,4 +4,5 @@ struct Character: Identifiable {
let id = UUID()
let name: String
let profileURL: URL
+ let avatarURL: URL
}
diff --git a/HoloBar/CharacterFetcher.swift b/HoloBar/CharacterFetcher.swift
index f2de7fc..05e8c62 100644
--- a/HoloBar/CharacterFetcher.swift
+++ b/HoloBar/CharacterFetcher.swift
@@ -43,11 +43,20 @@ class CharacterFetcher: ObservableObject {
{
let name = try nameElement.text()
- fetchedCharacters.append(Character(name: name, profileURL: profileURL))
+ fetchedCharacters
+ .append(
+ Character(
+ name: name,
+ profileURL: profileURL,
+ avatarURL: profileURL // Avatar URLs are fetched in ``fetchAffiliations``
+ )
+ )
}
}
} catch {
- fetchedCharacters.append(Character(name: "Error parsing HTML", profileURL: URL(string: "#")!))
+ let blankURL = URL(string: "#")!
+
+ fetchedCharacters.append(Character(name: "Error parsing HTML", profileURL: blankURL, avatarURL: blankURL))
}
return fetchedCharacters
@@ -60,10 +69,14 @@ class CharacterFetcher: ObservableObject {
for character in characters {
group.enter()
- let task = URLSession.shared.dataTask(with: character.profileURL) { data, _, error in
+ let task = URLSession.shared.dataTask(with: character.profileURL) {
+ data,
+ _,
+ error in
defer { group.leave() }
- guard let data = data, error == nil,
+ guard let data = data,
+ error == nil,
let html = String(data: data, encoding: .utf8) else { return }
do {
@@ -72,7 +85,15 @@ class CharacterFetcher: ObservableObject {
if let affiliationElement = try? document.select("#affiliation a").first(),
let affiliation = try? affiliationElement.text()
{
- updatedCharacters.append(Character(name: "\(character.name) (\(affiliation))", profileURL: character.profileURL))
+ updatedCharacters
+ .append(
+ Character(
+ name: "\(character.name) (\(affiliation))",
+ profileURL: character.profileURL,
+ avatarURL: (try? document.select("#left img").first()?.attr("data-src"))
+ .flatMap { URL(string: $0) } ?? character.avatarURL
+ )
+ )
} else {
updatedCharacters.append(character)
}
diff --git a/HoloBar/HoloBarApp.swift b/HoloBar/HoloBarApp.swift
index a3b45e7..eb28f7f 100644
--- a/HoloBar/HoloBarApp.swift
+++ b/HoloBar/HoloBarApp.swift
@@ -11,8 +11,16 @@ struct HoloBarApp: App {
Text("Loading …")
} else {
ForEach(fetcher.characters) { character in
- Button(character.name) {
+ Button(action: {
NSWorkspace.shared.open(character.profileURL)
+ }) {
+ HStack {
+ AsyncImage(url: character.avatarURL, content: { $0 }, placeholder: {
+ Image(systemName: "person.crop.circle")
+ })
+
+ Text(character.name)
+ }
}
}
}