diff --git a/.github/workflows/deployment-ci.yml b/.github/workflows/deployment-ci.yml index ab61425fda68..dbc2accb0501 100644 --- a/.github/workflows/deployment-ci.yml +++ b/.github/workflows/deployment-ci.yml @@ -31,6 +31,9 @@ jobs: with: java-version: 8 + - name: Set SHORT_SHA environment variable to short commit hash + run: echo "SHORT_SHA=$(git rev-parse --short ${{ github.sha }})" >> $GITHUB_ENV + - name: Build with Gradle uses: gradle/gradle-build-action@v2 with: @@ -65,6 +68,9 @@ jobs: with: java-version: 8 + - name: Set SHORT_SHA environment variable to short commit hash + run: echo "SHORT_SHA=$(git rev-parse --short ${{ github.sha }})" >> $GITHUB_ENV + - name: Build with Gradle uses: gradle/gradle-build-action@v2 with: diff --git a/buildSrc/src/main/kotlin/Projects.kt b/buildSrc/src/main/kotlin/Projects.kt index b0ca1077170a..2d54101ab39a 100644 --- a/buildSrc/src/main/kotlin/Projects.kt +++ b/buildSrc/src/main/kotlin/Projects.kt @@ -1,6 +1,3 @@ -import org.gradle.kotlin.dsl.DependencyHandlerScope -import org.gradle.kotlin.dsl.project - /** * whether the process has been invoked by JitPack */ @@ -23,6 +20,11 @@ object Library { } + val commitHash get() = System.getenv("GITHUB_SHA") ?: "unknown" + + // this environment variable isn't available out of the box, we set it ourselves + val shortCommitHash get() = System.getenv("SHORT_SHA") ?: "unknown" + const val description = "Idiomatic Kotlin Wrapper for The Discord API" const val projectUrl = "https://github.com/kordlib/kord" diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 224e2c809cc4..7e6e78d98c15 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -1,7 +1,16 @@ +buildscript { + repositories { + mavenCentral() + } +} + plugins { `kord-module` `kord-sampled-module` `kord-publishing` + + // see https://github.com/gmazzo/gradle-buildconfig-plugin + id("com.github.gmazzo.buildconfig") version "3.0.3" } dependencies { @@ -11,3 +20,26 @@ dependencies { testImplementation(libs.bundles.test.implementation) testRuntimeOnly(libs.bundles.test.runtime) } + +/* +This will generate a file named "BuildConfigGenerated.kt" that looks like: + +package dev.kord.common + +internal const val BUILD_CONFIG_GENERATED_LIBRARY_VERSION: String = "" +internal const val BUILD_CONFIG_GENERATED_COMMIT_HASH: String = "" +internal const val BUILD_CONFIG_GENERATED_SHORT_COMMIT_HASH: String = "" +*/ +buildConfig { + packageName("dev.kord.common") + className("BuildConfigGenerated") + + useKotlinOutput { + topLevelConstants = true + internalVisibility = true + } + + buildConfigField("String", "BUILD_CONFIG_GENERATED_LIBRARY_VERSION", "\"${Library.version}\"") + buildConfigField("String", "BUILD_CONFIG_GENERATED_COMMIT_HASH", "\"${Library.commitHash}\"") + buildConfigField("String", "BUILD_CONFIG_GENERATED_SHORT_COMMIT_HASH", "\"${Library.shortCommitHash}\"") +} diff --git a/common/src/main/kotlin/KordConstants.kt b/common/src/main/kotlin/KordConstants.kt index 1225606e8a8d..02659dc904ed 100644 --- a/common/src/main/kotlin/KordConstants.kt +++ b/common/src/main/kotlin/KordConstants.kt @@ -1,7 +1,30 @@ +// No const vals, they are inlined, so recompiling would be required when values change. +@file:Suppress("MayBeConstant") + package dev.kord.common +import dev.kord.common.annotation.KordExperimental + +@KordExperimental public object KordConstants { + /** Kord's version. */ + @KordExperimental + public val KORD_VERSION: String = BUILD_CONFIG_GENERATED_LIBRARY_VERSION + + /** The hash of the commit from which this Kord version was built. */ + @KordExperimental + public val KORD_COMMIT_HASH: String = BUILD_CONFIG_GENERATED_COMMIT_HASH + + /** Short variant of [KORD_COMMIT_HASH]. */ + @KordExperimental + public val KORD_SHORT_COMMIT_HASH: String = BUILD_CONFIG_GENERATED_SHORT_COMMIT_HASH + + /** URL for Kord's GitHub repository. */ + @KordExperimental + public val KORD_GITHUB_URL: String = "https://github.com/kordlib/kord" + /** Kord's value for the [User Agent header](https://discord.com/developers/docs/reference#user-agent). */ - public const val USER_AGENT: String = "DiscordBot (https://github.com/kordlib/kord, 0.8.0-M12)" + @KordExperimental + public val USER_AGENT: String = "DiscordBot ($KORD_GITHUB_URL, $KORD_VERSION)" } diff --git a/core/src/main/kotlin/builder/kord/KordBuilder.kt b/core/src/main/kotlin/builder/kord/KordBuilder.kt index b1fa60ea42ef..1d73450fc667 100644 --- a/core/src/main/kotlin/builder/kord/KordBuilder.kt +++ b/core/src/main/kotlin/builder/kord/KordBuilder.kt @@ -2,6 +2,7 @@ package dev.kord.core.builder.kord import dev.kord.cache.api.DataCache import dev.kord.common.KordConstants +import dev.kord.common.annotation.KordExperimental import dev.kord.common.entity.Snowflake import dev.kord.common.ratelimit.BucketRateLimiter import dev.kord.core.ClientResources @@ -195,6 +196,7 @@ public class KordBuilder(public val token: String) { */ private suspend fun HttpClient.getGatewayInfo(): BotGatewayResponse { val response = get("${Route.baseUrl}${Route.GatewayBotGet.path}") { + @OptIn(KordExperimental::class) header(UserAgent, KordConstants.USER_AGENT) header(Authorization, "Bot $token") } diff --git a/rest/src/main/kotlin/service/RestService.kt b/rest/src/main/kotlin/service/RestService.kt index 5905f8b30006..1a68da2e7bda 100644 --- a/rest/src/main/kotlin/service/RestService.kt +++ b/rest/src/main/kotlin/service/RestService.kt @@ -1,6 +1,7 @@ package dev.kord.rest.service import dev.kord.common.KordConstants +import dev.kord.common.annotation.KordExperimental import dev.kord.rest.request.RequestBuilder import dev.kord.rest.request.RequestHandler import dev.kord.rest.route.Route @@ -19,6 +20,7 @@ public abstract class RestService(@PublishedApi internal val requestHandler: Req val request = RequestBuilder(route) .apply(builder) .apply { + @OptIn(KordExperimental::class) unencodedHeader(UserAgent, KordConstants.USER_AGENT) if (route.requiresAuthorizationHeader) { unencodedHeader(Authorization, "Bot ${requestHandler.token}")