DiscordKit feat: impl getGatewayURL
This commit is contained in:
36
Sources/DiscordKit/ApiClient.swift
Normal file
36
Sources/DiscordKit/ApiClient.swift
Normal file
@@ -0,0 +1,36 @@
|
||||
import Foundation
|
||||
#if canImport(FoundationNetowrking)
|
||||
import FoundationNetworking
|
||||
#endif
|
||||
|
||||
struct ApiClient {
|
||||
static let apiUrl: URL = URL(string: "https://discord.com/api/v10")!
|
||||
let token: String
|
||||
|
||||
private func authReq(_ request: consuming URLRequest) async throws -> (Data, URLResponse) {
|
||||
request.setValue("Bot \(token)", forHTTPHeaderField: "Authorization")
|
||||
request.setValue("DiscordKit (https:\\candy123.moe, v0.0.1)", forHTTPHeaderField: "User-Agent")
|
||||
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
||||
let (data, res) = try await URLSession.shared.data(for: request)
|
||||
guard let res = res as? HTTPURLResponse else { throw ApiError.invalidResponse }
|
||||
guard res.statusCode >= 200 && res.statusCode <= 299 else { throw ApiError.badStatus("Status code not 2xx: \(res.statusCode)") }
|
||||
|
||||
return (data, res)
|
||||
}
|
||||
|
||||
func getGatewayURL() async throws -> URL {
|
||||
var req = URLRequest(url: ApiClient.apiUrl.appending(path: "/gateway/bot"))
|
||||
req.httpMethod = "GET"
|
||||
let (data, _) = try await authReq(req)
|
||||
|
||||
let json = JSONDecoder()
|
||||
let decoded = try json.decode(GetGatewayResponse.self, from: data)
|
||||
return decoded.url
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
enum ApiError: Error {
|
||||
case invalidResponse
|
||||
case badStatus(_ message: String)
|
||||
}
|
||||
Reference in New Issue
Block a user