forked from openrs2/openrs2
parent
db1ecf3c00
commit
8f4d28393e
@ -0,0 +1,57 @@ |
||||
package org.openrs2.archive.key |
||||
|
||||
import kotlinx.coroutines.Dispatchers |
||||
import kotlinx.coroutines.future.await |
||||
import kotlinx.coroutines.withContext |
||||
import org.openrs2.crypto.XteaKey |
||||
import org.openrs2.http.checkStatusCode |
||||
import java.net.URI |
||||
import java.net.http.HttpClient |
||||
import java.net.http.HttpRequest |
||||
import java.net.http.HttpResponse |
||||
import java.time.Duration |
||||
import javax.inject.Inject |
||||
import javax.inject.Singleton |
||||
|
||||
@Singleton |
||||
public class HdosKeyDownloader @Inject constructor( |
||||
private val client: HttpClient |
||||
) : KeyDownloader(KeySource.HDOS) { |
||||
override suspend fun getMissingUrls(seenUrls: Set<String>): Set<String> { |
||||
return setOf(ENDPOINT) |
||||
} |
||||
|
||||
override suspend fun download(url: String): Sequence<XteaKey> { |
||||
val request = HttpRequest.newBuilder(URI(url)) |
||||
.GET() |
||||
.timeout(Duration.ofSeconds(30)) |
||||
.build() |
||||
|
||||
val response = client.sendAsync(request, HttpResponse.BodyHandlers.ofInputStream()).await() |
||||
response.checkStatusCode() |
||||
|
||||
return withContext(Dispatchers.IO) { |
||||
response.body().use { input -> |
||||
input.bufferedReader().use { reader -> |
||||
val keys = mutableSetOf<XteaKey>() |
||||
|
||||
for (line in reader.lineSequence()) { |
||||
val parts = line.split(',') |
||||
if (parts.size < 3) { |
||||
continue |
||||
} |
||||
|
||||
val key = XteaKey.fromHexOrNull(parts[2]) ?: continue |
||||
keys += key |
||||
} |
||||
|
||||
keys.asSequence() |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
private companion object { |
||||
private const val ENDPOINT = "https://api.hdos.dev/keys/get" |
||||
} |
||||
} |
@ -0,0 +1,2 @@ |
||||
-- @formatter:off |
||||
ALTER TYPE key_source ADD VALUE 'hdos'; |
Loading…
Reference in new issue