@@ -20,13 +20,15 @@ class DiscordIPC {
20
20
} else {
21
21
ipc = SwordRPC ( appId: custom. applicationID)
22
22
}
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
+ }
26
28
}
27
29
}
28
30
29
- func createActivity( from custom: DiscordActivity ) -> RichPresence {
31
+ func createActivity( from custom: DiscordActivity ) async -> RichPresence {
30
32
var activity = RichPresence ( )
31
33
32
34
if custom. details. isEmpty {
@@ -48,10 +50,10 @@ class DiscordIPC {
48
50
activity. assets. largeText = poweredStr
49
51
}
50
52
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 "
52
54
if custom. image. isEmpty {
53
55
let bundleID = Bundle . main. infoDictionary ? [ " CFBundleIdentifier " ] as? String ?? " "
54
- if let appImage = loadImage ( bundleID: bundleID) {
56
+ if let appImage = await loadImage ( bundleID: bundleID) {
55
57
activity. assets. largeImage = appImage
56
58
activity. assets. largeText = nil
57
59
activity. assets. smallImage = logo
@@ -73,8 +75,72 @@ class DiscordIPC {
73
75
return activity
74
76
}
75
77
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
+ }
79
94
}
80
95
}
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