Skip to content

Commit c036485

Browse files
committed
Better Discord RPC
1 parent 3cfca9f commit c036485

File tree

1 file changed

+75
-9
lines changed

1 file changed

+75
-9
lines changed

Diff for: PlayTools/DiscordActivity/DiscordIPC.swift

+75-9
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@ class DiscordIPC {
2020
} else {
2121
ipc = SwordRPC(appId: custom.applicationID)
2222
}
23-
let activity = createActivity(from: custom)
24-
ipc.connect()
25-
ipc.setPresence(activity)
23+
Task.init(priority: .background) {
24+
let activity = await createActivity(from: custom)
25+
ipc.connect()
26+
ipc.setPresence(activity)
27+
}
2628
}
2729
}
2830

29-
func createActivity(from custom: DiscordActivity) -> RichPresence {
31+
func createActivity(from custom: DiscordActivity) async -> RichPresence {
3032
var activity = RichPresence()
3133

3234
if custom.details.isEmpty {
@@ -48,10 +50,10 @@ class DiscordIPC {
4850
activity.assets.largeText = poweredStr
4951
}
5052

51-
let logo = "https://github.com/PlayCover/playcover-website/raw/master/src/assets/images/play-cover.png"
53+
let logo = "https://raw.githubusercontent.com/PlayCover/PlaySite/master/src/assets/square-logo.png"
5254
if custom.image.isEmpty {
5355
let bundleID = Bundle.main.infoDictionary?["CFBundleIdentifier"] as? String ?? ""
54-
if let appImage = loadImage(bundleID: bundleID) {
56+
if let appImage = await loadImage(bundleID: bundleID) {
5557
activity.assets.largeImage = appImage
5658
activity.assets.largeText = nil
5759
activity.assets.smallImage = logo
@@ -73,8 +75,72 @@ class DiscordIPC {
7375
return activity
7476
}
7577

76-
// TODO : load App icon image from appstore
77-
func loadImage(bundleID: String) -> String? {
78-
return nil
78+
func loadImage(bundleID: String) async -> String? {
79+
let lookup = "http://itunes.apple.com/lookup?bundleId=\(bundleID)"
80+
guard let url = URL(string: lookup) else { return nil }
81+
82+
do {
83+
let (data, _) = try await URLSession.shared.data(for: URLRequest(url: url))
84+
let decoder = JSONDecoder()
85+
let jsonResult: ITunesResponse = try decoder.decode(ITunesResponse.self, from: data)
86+
if jsonResult.resultCount > 0 {
87+
return jsonResult.results[0].artworkUrl512
88+
} else {
89+
return nil
90+
}
91+
} catch {
92+
return nil
93+
}
7994
}
8095
}
96+
97+
struct ITunesResult: Decodable {
98+
var isGameCenterEnabled: Bool
99+
var supportedDevices: [String]
100+
var features: [String]
101+
var advisories: [String]
102+
var screenshotUrls: [String]
103+
var ipadScreenshotUrls: [String]
104+
var appletvScreenshotUrls: [String]
105+
var artworkUrl60: String
106+
var artworkUrl512: String
107+
var artworkUrl100: String
108+
var artistViewUrl: String
109+
var kind: String
110+
var isVppDeviceBasedLicensingEnabled: Bool
111+
var currentVersionReleaseDate: String
112+
var releaseNotes: String
113+
var description: String
114+
var trackId: Int
115+
var trackName: String
116+
var bundleId: String
117+
var sellerName: String
118+
var genreIds: [String]
119+
var primaryGenreName: String
120+
var primaryGenreId: Int
121+
var currency: String
122+
var formattedPrice: String
123+
var contentAdvisoryRating: String
124+
var averageUserRatingForCurrentVersion: Float
125+
var userRatingCountForCurrentVersion: Int
126+
var trackViewUrl: String
127+
var trackContentRating: String
128+
var averageUserRating: Float
129+
var minimumOsVersion: String
130+
var trackCensoredName: String
131+
var languageCodesISO2A: [String]
132+
var fileSizeBytes: String
133+
var releaseDate: String
134+
var artistId: Int
135+
var artistName: String
136+
var genres: [String]
137+
var price: Float
138+
var version: String
139+
var wrapperType: String
140+
var userRatingCount: Int
141+
}
142+
143+
struct ITunesResponse: Decodable {
144+
var resultCount: Int
145+
var results: [ITunesResult]
146+
}

0 commit comments

Comments
 (0)