diff options
| -rw-r--r-- | HoloBar/Character.swift | 1 | ||||
| -rw-r--r-- | HoloBar/CharacterFetcher.swift | 31 | ||||
| -rw-r--r-- | HoloBar/HoloBarApp.swift | 10 |
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) + } } } } |