diff --git a/mirai-console/tools/intellij-plugin/src/wizard/KotlinStdlibVersion.kt b/mirai-console/tools/intellij-plugin/src/wizard/KotlinStdlibVersion.kt new file mode 100644 index 000000000..bfd472daa --- /dev/null +++ b/mirai-console/tools/intellij-plugin/src/wizard/KotlinStdlibVersion.kt @@ -0,0 +1,118 @@ +/* + * Copyright 2019-2022 Mamoe Technologies and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/dev/LICENSE + */ + + +package net.mamoe.mirai.console.intellij.wizard + +import org.jetbrains.kotlin.tools.projectWizard.Versions +import org.jsoup.Jsoup +import org.jsoup.nodes.Document +import java.io.IOException + +typealias KotlinStdlibVersion = String + +object KotlinStdlibVersionFetcher { + @Throws(IOException::class) + fun getKotlinStdlibVersion(miraiVersion: MiraiVersion): KotlinStdlibVersion { + fun download(url: String): Document { + return Jsoup.connect(url) + .followRedirects(true) + .ignoreContentType(true) + .ignoreHttpErrors(true) + .get() + } + + val path = "net/mamoe/mirai-core/$miraiVersion/mirai-core-$miraiVersion.pom" + return kotlin.runCatching { + download("https://maven.aliyun.com/repository/central/$path") + }.recoverCatching { + download("https://repo.maven.apache.org/maven2/$path") + }.map { document -> + val xml = document.toString() + + Regex("""<artifactid>\s*kotlin-stdlib-[A-Za-z0-9-]+\s*</artifactid>\s*<version>\s*(.*?)\s*</version>""") + .findAll(xml) + .mapNotNull { + it.groupValues.getOrNull(1) + } + .firstOrNull() ?: Versions.KOTLIN.text + }.getOrThrow() + } +} + +/* + +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <!-- This module was also published with a richer model, Gradle metadata, --> + <!-- which should be used instead. Do not delete the following line which --> + <!-- is to indicate to Gradle or any Gradle module metadata file consumer --> + <!-- that they should prefer consuming it instead. --> + <!-- do_not_remove: published-with-gradle-metadata --> + <modelVersion>4.0.0</modelVersion> + <groupId>net.mamoe</groupId> + <artifactId>mirai-core</artifactId> + <version>2.12.2</version> + <packaging>pom</packaging> + <licenses> + <license> + <name>GNU AGPLv3</name> + <url>https://github.com/mamoe/mirai/blob/master/LICENSE</url> + </license> + </licenses> + <developers> + <developer> + <id>mamoe</id> + <name>Mamoe Technologies</name> + <email>support@mamoe.net</email> + </developer> + </developers> + <scm> + <connection>scm:https://github.com/mamoe/mirai.git</connection> + <developerConnection>scm:git://github.com/mamoe/mirai.git</developerConnection> + <url>https://github.com/mamoe/mirai</url> + </scm> + <dependencies> + <dependency> + <groupId>net.mamoe</groupId> + <artifactId>mirai-core-api</artifactId> + <version>2.12.2</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.jetbrains.kotlinx</groupId> + <artifactId>kotlinx-serialization-core-jvm</artifactId> + <version>1.3.2</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.jetbrains.kotlinx</groupId> + <artifactId>kotlinx-serialization-json-jvm</artifactId> + <version>1.3.2</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.jetbrains.kotlinx</groupId> + <artifactId>kotlinx-coroutines-core-jvm</artifactId> + <version>1.6.1</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.jetbrains.kotlin</groupId> + <artifactId>kotlin-stdlib-jdk8</artifactId> + <version>1.6.21</version> + <scope>runtime</scope> + </dependency> + </dependencies> + <description>Mirai Protocol implementation for QQ Android</description> + <name>mirai-core</name> + <url>https://github.com/mamoe/mirai</url> +</project> + + */ diff --git a/mirai-console/tools/intellij-plugin/src/wizard/MiraiModuleBuilder.kt b/mirai-console/tools/intellij-plugin/src/wizard/MiraiModuleBuilder.kt index dd0aaef5d..562e4a62a 100644 --- a/mirai-console/tools/intellij-plugin/src/wizard/MiraiModuleBuilder.kt +++ b/mirai-console/tools/intellij-plugin/src/wizard/MiraiModuleBuilder.kt @@ -77,7 +77,7 @@ class MiraiModuleBuilder : StarterModuleBuilder() { val projectCoordinates = projectCoordinates val pluginCoordinates = pluginCoordinates return mapOf<String, Any>( - "KOTLIN_VERSION" to KotlinVersion.CURRENT.toString(), + "KOTLIN_VERSION" to kotlinVersion, "MIRAI_VERSION" to miraiVersion, "GROUP_ID" to projectCoordinates.groupId, "VERSION" to projectCoordinates.version, diff --git a/mirai-console/tools/intellij-plugin/src/wizard/MiraiProjectModel.kt b/mirai-console/tools/intellij-plugin/src/wizard/MiraiProjectModel.kt index efe2762bd..a147a6423 100644 --- a/mirai-console/tools/intellij-plugin/src/wizard/MiraiProjectModel.kt +++ b/mirai-console/tools/intellij-plugin/src/wizard/MiraiProjectModel.kt @@ -34,6 +34,7 @@ class MiraiProjectModel( val projectCoordinates: ProjectCoordinates, val pluginCoordinates: PluginCoordinates, val miraiVersion: String, + val kotlinVersion: String, val buildSystemType: BuildSystemType, val languageType: LanguageType, diff --git a/mirai-console/tools/intellij-plugin/src/wizard/MiraiProjectWizardInitialStep.kt b/mirai-console/tools/intellij-plugin/src/wizard/MiraiProjectWizardInitialStep.kt index be9994c5e..4d83f7d16 100644 --- a/mirai-console/tools/intellij-plugin/src/wizard/MiraiProjectWizardInitialStep.kt +++ b/mirai-console/tools/intellij-plugin/src/wizard/MiraiProjectWizardInitialStep.kt @@ -26,6 +26,7 @@ import com.intellij.ui.dsl.builder.* import net.mamoe.mirai.console.intellij.wizard.MiraiProjectWizardBundle.message import org.jetbrains.concurrency.Promise import org.jetbrains.concurrency.runAsync +import org.jetbrains.kotlin.tools.projectWizard.Versions private val log = logger<MiraiProjectWizardInitialStep>() @@ -49,6 +50,8 @@ class MiraiProjectWizardInitialStep(contextProvider: StarterContextProvider) : S var miraiVersionKind by miraiVersionKindProperty var miraiVersion by miraiVersionProperty + var kotlinStdlibVersion = Versions.KOTLIN.text + private lateinit var miraiVersionCell: Cell<ComboBox<String>> override fun addFieldsAfter(layout: Panel) { @@ -117,6 +120,18 @@ class MiraiProjectWizardInitialStep(contextProvider: StarterContextProvider) : S .enabled(false) .bindItem(miraiVersionProperty) + miraiVersionProperty.afterChange { + kotlinStdlibVersion = "Loading" + runAsync { + KotlinStdlibVersionFetcher.getKotlinStdlibVersion(miraiVersion) + }.onError { + log.error(it) + kotlinStdlibVersion = Versions.KOTLIN.text + }.onProcessed { + kotlinStdlibVersion = it + } + } + miraiVersionKindProperty.afterChange { if (!miraiVersionCell.component.isEnabled) return@afterChange @@ -156,6 +171,7 @@ class MiraiProjectWizardInitialStep(contextProvider: StarterContextProvider) : S dependsOn = pluginDependencies.trim() ), miraiVersion = miraiVersion, + kotlinVersion = kotlinStdlibVersion, buildSystemType = when (val projectType = projectTypeProperty.get()) { MiraiModuleBuilder.GRADLE_KTS_PROJECT -> BuildSystemType.GradleKt MiraiModuleBuilder.GRADLE_GROOVY_PROJECT -> BuildSystemType.GradleGroovy @@ -171,7 +187,7 @@ class MiraiProjectWizardInitialStep(contextProvider: StarterContextProvider) : S } override fun validate(): Boolean { - if (miraiVersion == message("label.mirai.version.loading")) { + if (miraiVersion == message("label.mirai.version.loading") || kotlinStdlibVersion == "Loading") { JBPopupFactory.getInstance() .createHtmlTextBalloonBuilder( message("error.please.wait.for.mirai.version"), @@ -186,7 +202,6 @@ class MiraiProjectWizardInitialStep(contextProvider: StarterContextProvider) : S ) return false } - return super.validate() }