Skip to content
This repository was archived by the owner on Sep 15, 2020. It is now read-only.

Commit c5ca7d5

Browse files
Merge remote-tracking branch 'origin/master'
2 parents 516cab8 + df5e8f7 commit c5ca7d5

File tree

10 files changed

+257
-43
lines changed

10 files changed

+257
-43
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ plugins {
1010
}
1111

1212
group = "net.mamoe"
13-
version = "1.0.0"
13+
version = "1.1.0"
1414

1515
// See https://github.com/JetBrains/gradle-intellij-plugin/
1616
intellij {

src/main/java/net/mamoe/mirai/intellij/CreateConfig.kt

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,40 +26,42 @@ object CreateConfig {
2626

2727
private suspend fun getNewestCoreVersion(): String {
2828
return withContext(Dispatchers.IO) {
29-
Jsoup.connect("https://bintray.com/package/generalTab?pkgPath=/him188moe/mirai/mirai-core").get().body().getElementById(
30-
"versions"
31-
).getElementsByClass("tr")[0].getElementsByClass("td")[0].getElementsByTag("a")[0].text()
32-
}
29+
Jsoup.connect("https://bintray.com/package/generalTab?pkgPath=/him188moe/mirai/mirai-core").get().body()
30+
.getElementById(
31+
"versions"
32+
).getElementsByClass("tr")[0].getElementsByClass("td")[0].getElementsByTag("a")[0].text()
33+
}.also { cacheCoreVersion = it }
3334
}
3435

3536
private suspend fun getNewestConsoleVersion(): String {
3637
return withContext(Dispatchers.IO) {
37-
Jsoup.connect("https://bintray.com/package/generalTab?pkgPath=/him188moe/mirai/mirai-console").get().body().getElementById(
38-
"versions"
39-
).getElementsByClass("tr")[0].getElementsByClass("td")[0].getElementsByTag("a")[0].text()
40-
}
38+
Jsoup.connect("https://bintray.com/package/generalTab?pkgPath=/him188moe/mirai/mirai-console").get().body()
39+
.getElementById(
40+
"versions"
41+
).getElementsByClass("tr")[0].getElementsByClass("td")[0].getElementsByTag("a")[0].text()
42+
}.also { cacheConsoleVersion = it }
4143
}
4244

4345

4446
private var nextCoreVersionCheck = 0L
4547
private var nextConsoleVersionCheck = 0L
4648

47-
private var cacheConsoleVersion:String? = null
48-
private var cacheCoreVersion:String? = null
49+
private var cacheConsoleVersion: String? = null
50+
private var cacheCoreVersion: String? = null
4951

50-
fun refreshVersion(){
52+
fun refreshVersion() {
5153
nextCoreVersionCheck = 0L
5254
nextConsoleVersionCheck = 0L
5355
}
5456

55-
fun consoleVersion():Deferred<String> = GlobalScope.async {
56-
if (cacheConsoleVersion != null && nextConsoleVersionCheck < System.currentTimeMillis()) {
57+
fun consoleVersion(): Deferred<String> = GlobalScope.async {
58+
if (cacheConsoleVersion != null && nextConsoleVersionCheck > System.currentTimeMillis()) {
5759
return@async cacheConsoleVersion!!
5860
}
5961
repeat(3) {
6062
try {
6163
return@async getNewestConsoleVersion().also {
62-
nextConsoleVersionCheck = System.currentTimeMillis() + 1000*60*10
64+
nextConsoleVersionCheck = System.currentTimeMillis() + 1000 * 60 * 10
6365
}
6466
} catch (e: Exception) {
6567

@@ -71,13 +73,13 @@ object CreateConfig {
7173

7274

7375
fun coreVersion(): Deferred<String> = GlobalScope.async {
74-
if (cacheCoreVersion != null && nextCoreVersionCheck < System.currentTimeMillis()) {
76+
if (cacheCoreVersion != null && nextCoreVersionCheck > System.currentTimeMillis()) {
7577
return@async cacheCoreVersion!!
7678
}
7779
repeat(3) {
7880
try {
7981
return@async getNewestCoreVersion().also {
80-
nextCoreVersionCheck = System.currentTimeMillis() + 1000*60*10
82+
nextCoreVersionCheck = System.currentTimeMillis() + 1000 * 60 * 10
8183
}
8284
} catch (e: Exception) {
8385

src/main/java/net/mamoe/mirai/intellij/builder/ContentBuilder.kt

Lines changed: 132 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,21 @@ fun MiraiPluginModuleBuilder.createRoot(): VirtualFile? {
3232
fun MiraiPluginModuleBuilder.createDic(
3333
root: VirtualFile
3434
) {
35-
val sourceDirectory = VfsUtil.createDirectories(root.path + "/src/main/kotlin")
35+
val sourceDirectory: VirtualFile
36+
val testDirectory: VirtualFile
37+
when (CreateConfig.language) {
38+
CreateConfig.LANGUAGE_KOTLIN -> {
39+
sourceDirectory = VfsUtil.createDirectories(root.path + "/src/main/kotlin")
40+
testDirectory = VfsUtil.createDirectories(root.path + "/src/test/kotlin")
41+
}
42+
CreateConfig.LANGUAGE_JAVA -> {
43+
sourceDirectory = VfsUtil.createDirectories(root.path + "/src/main/java")
44+
testDirectory = VfsUtil.createDirectories(root.path + "/src/test/java")
45+
}
46+
else -> error("internal error: illegal language: ${CreateConfig.language}")
47+
}
3648
VfsUtil.createDirectories(root.path + "/src/main/resources")
37-
VfsUtil.createDirectories(root.path + "/src/test/kotlin")
3849
VfsUtil.createDirectories(root.path + "/src/test/resources")
39-
//val resourceDirectory = VfsUtil.createDirectories(root.path + "/src/main/resources")
40-
//val testSourceDirectory = VfsUtil.createDirectories(root.path + "/src/test/kotlin")
41-
//val testResourceDirectory = VfsUtil.createDirectories(root.path + "/src/test/resources")
4250

4351
val buildToolFiles: List<String> = when (CreateConfig.buildTool) {
4452
CreateConfig.BUILD_GRADLE_KOTLIN -> Template.gradleCommon + Template.gradleKotlinDsl
@@ -57,7 +65,7 @@ fun MiraiPluginModuleBuilder.createDic(
5765
@Suppress("EXPERIMENTAL_API_USAGE")
5866
fun String.replaceTemplateVariables(): String {
5967
return runBlocking {
60-
this@replaceTemplateVariables.replace("<GROUP>", CreateConfig.groupId)
68+
this@replaceTemplateVariables.replace("<GROUP>", CreateConfig.groupId)
6169
.replace("<PROJECT_NAME>", CreateConfig.artifactId)
6270
.replace("<VERSION>", CreateConfig.version)
6371
.replace("<MIRAI_CONSOLE_VERSION>", consoleVersion().await())
@@ -82,6 +90,10 @@ fun MiraiPluginModuleBuilder.createDic(
8290
pluginBaseClassName
8391
).replace("PACKAGE", packageName)
8492
)
93+
testDirectory.writeChild(
94+
"mirai/RunMirai.kt",
95+
Template.testConsoleRunnerKotlin
96+
)
8597
}
8698
CreateConfig.LANGUAGE_JAVA -> {
8799
sourceDirectory.writeChild(
@@ -91,6 +103,10 @@ fun MiraiPluginModuleBuilder.createDic(
91103
pluginBaseClassName
92104
).replace("PACKAGE", packageName)
93105
)
106+
testDirectory.writeChild(
107+
"mirai/RunMirai.java",
108+
Template.testConsoleRunnerJava
109+
)
94110
}
95111
}
96112

@@ -100,7 +116,10 @@ fun MiraiPluginModuleBuilder.createDic(
100116
.replace("AUTHOR", CreateConfig.author)
101117
.replace("MAIN", CreateConfig.mainClassQualifiedName)
102118
.replace("INFO", CreateConfig.info)
103-
.replace("DEPENDS", CreateConfig.depends.takeIf { it.isNotEmpty() }?.joinToString { "\n -$it" } ?: "[]")
119+
.replace(
120+
"DEPENDS",
121+
CreateConfig.depends.filter { it.isNotBlank() }.takeIf { it.isNotEmpty() }?.joinToString { "\n -$it" }
122+
?: "[]")
104123
)
105124
}
106125

@@ -162,6 +181,30 @@ object Template {
162181
}
163182
""".trimIndent().let { it.replace("\\\$\\{", "\${") } // bug also
164183

184+
185+
@Language("kotlin")
186+
val testConsoleRunnerKotlin: String = """
187+
package mirai
188+
189+
import kotlinx.coroutines.runBlocking
190+
import net.mamoe.mirai.console.command.CommandManager
191+
import net.mamoe.mirai.console.pure.MiraiConsolePureLoader
192+
193+
object RunMirai {
194+
195+
// 执行 gradle task: runMiraiConsole 来自动编译, shadow, 复制, 并启动 pure console.
196+
197+
@JvmStatic
198+
fun main(args: Array<String>) {
199+
// 默认在 /test 目录下运行
200+
201+
MiraiConsolePureLoader.load(args[0], args[1]) // 启动 console
202+
203+
runBlocking { CommandManager.join() } // 阻止主线程退出
204+
}
205+
}
206+
""".trimIndent()
207+
165208
@Language("java")
166209
val pluginBaseJava: String = """
167210
package PACKAGE;
@@ -171,8 +214,65 @@ object Template {
171214
class ExamplePluginMain extends PluginBase {
172215
173216
public void onLoad(){
174-
//start your code here
175-
//欢迎使用Kotlin
217+
bot.getFriends().forEach(friend -> {
218+
System.out.println(friend.getId() + ":" + friend.getNick());
219+
return Unit.INSTANCE; // kotlin 的所有函数都有返回值. Unit 为最基本的返回值. 请在这里永远返回 Unit
220+
});
221+
222+
Events.subscribeAlways(GroupMessage.class, (GroupMessage event) -> {
223+
224+
if (event.getMessage().contains("reply")) {
225+
// 引用回复
226+
final QuoteReplyToSend quote = MessageUtils.quote(event.getMessage(), event.getSender());
227+
event.getGroup().sendMessage(quote.plus("引用回复"));
228+
229+
} else if (event.getMessage().contains("at")) {
230+
// at
231+
event.getGroup().sendMessage(new At(event.getSender()));
232+
233+
} else if (event.getMessage().contains("permission")) {
234+
// 成员权限
235+
event.getGroup().sendMessage(event.getPermission().toString());
236+
237+
} else if (event.getMessage().contains("mixed")) {
238+
// 复合消息, 通过 .plus 连接两个消息
239+
event.getGroup().sendMessage(
240+
MessageUtils.newImage("{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.png") // 演示图片, 可能已过期
241+
.plus("Hello") // 文本消息
242+
.plus(new At(event.getSender())) // at 群成员
243+
.plus(AtAll.INSTANCE) // at 全体成员
244+
);
245+
246+
} else if (event.getMessage().contains("recall1")) {
247+
event.getGroup().sendMessage("你看不到这条消息").recall();
248+
// 发送消息马上就撤回. 因速度太快, 客户端将看不到这个消息.
249+
250+
} else if (event.getMessage().contains("recall2")) {
251+
final Job job = event.getGroup().sendMessage("3秒后撤回").recallIn(3000);
252+
253+
// job.cancel(new CancellationException()); // 可取消这个任务
254+
255+
} else if (event.getMessage().contains("上传图片")) {
256+
File file = new File("myImage.jpg");
257+
if (file.exists()) {
258+
final Image image = event.getGroup().uploadImage(new File("myImage.jpg"));
259+
// 上传一个图片并得到 Image 类型的 Message
260+
261+
final String imageId = image.getImageId(); // 可以拿到 ID
262+
final Image fromId = MessageUtils.newImage(imageId); // ID 转换得到 Image
263+
264+
event.getGroup().sendMessage(image); // 发送图片
265+
}
266+
267+
} else if (event.getMessage().contains("friend")) {
268+
final Future<MessageReceipt<? extends Contact>> future = event.getSender().sendMessageAsync("Async send"); // 异步发送
269+
try {
270+
future.get();
271+
} catch (InterruptedException | ExecutionException e) {
272+
e.printStackTrace();
273+
}
274+
}
275+
});
176276
}
177277
178278
public void onEnable(){
@@ -182,6 +282,29 @@ object Template {
182282
}
183283
""".trimIndent()
184284

285+
@Language("java")
286+
val testConsoleRunnerJava: String = """
287+
package mirai;
288+
289+
import kotlinx.coroutines.BuildersKt;
290+
import kotlinx.coroutines.GlobalScope;
291+
import net.mamoe.mirai.console.command.CommandManager;
292+
import net.mamoe.mirai.console.pure.MiraiConsolePureLoader;
293+
294+
public class RunMirai {
295+
296+
// 执行 gradle task: runMiraiConsole 来自动编译, shadow, 复制, 并启动 pure console.
297+
298+
public static void main(String[] args) throws InterruptedException {
299+
// 默认在 /test 目录下运行
300+
301+
MiraiConsolePureLoader.load(args[0], args[1]); // 启动 console
302+
303+
// 阻止主线程退出
304+
BuildersKt.runBlocking(GlobalScope.INSTANCE.getCoroutineContext(), (coroutineScope, continuation) -> CommandManager.INSTANCE.join(continuation));
305+
}
306+
}
307+
""".trimIndent()
185308

186309
@Language("yaml")
187310
val pluginYml: String = """

src/main/java/net/mamoe/mirai/intellij/ui/PMSetupStep.form

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<grid row="0" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
2222
</constraints>
2323
<properties>
24-
<text value="管理设置"/>
24+
<text value="构建设置"/>
2525
</properties>
2626
</component>
2727
<component id="f1b7a" class="javax.swing.JTextField" binding="artifactIdField">
@@ -80,8 +80,8 @@
8080
</constraints>
8181
<properties>
8282
<model>
83-
<item value="Groovy DSL"/>
8483
<item value="Kotlin DSL"/>
84+
<item value="Groovy DSL"/>
8585
</model>
8686
</properties>
8787
</component>
@@ -93,7 +93,7 @@
9393
<text value="如何选择"/>
9494
</properties>
9595
</component>
96-
<component id="c4618" class="javax.swing.JComboBox" binding="pmField">
96+
<component id="c4618" class="javax.swing.JComboBox" binding="pmField">
9797
<constraints>
9898
<grid row="3" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
9999
</constraints>

src/main/java/net/mamoe/mirai/intellij/ui/PluginSetup.form

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,8 +253,8 @@
253253
</constraints>
254254
<properties>
255255
<model>
256-
<item value="Java"/>
257256
<item value="Kotlin"/>
257+
<item value="Java"/>
258258
</model>
259259
</properties>
260260
</component>

src/main/java/net/mamoe/mirai/intellij/ui/PluginSetupStep.kt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import kotlinx.coroutines.GlobalScope
66
import kotlinx.coroutines.launch
77
import net.mamoe.mirai.intellij.CreateConfig
88
import javax.swing.*
9-
import javax.xml.bind.JAXBElement
109

1110
class PluginSetupStep : ModuleWizardStep() {
1211
private lateinit var pluginNameField: JTextField
@@ -16,6 +15,7 @@ class PluginSetupStep : ModuleWizardStep() {
1615
private lateinit var authorsField: JTextField
1716
private lateinit var websiteField: JTextField
1817
private lateinit var dependField: JTextField
18+
1919
//private lateinit var buildToolField: JComboBox<String>
2020
//private lateinit var languageField: JComboBox<String>
2121
private lateinit var consoleVersionField: JTextField
@@ -40,19 +40,17 @@ class PluginSetupStep : ModuleWizardStep() {
4040
}
4141
CreateConfig.mainClassQualifiedName = mainClassField.text
4242
CreateConfig.version = pluginVersionField.text
43-
if (!CreateConfig.version.toLowerCase().startsWith("v")) {
44-
CreateConfig.version = "V" + CreateConfig.version
45-
}
43+
CreateConfig.version = CreateConfig.version
4644
CreateConfig.pluginName = pluginNameField.text
47-
CreateConfig.language = languageField.selectedItem?.toString()?:"Java"
48-
// CreateConfig.language = languageField.selectedItem?.toString().orEmpty()
49-
//CreateConfig.buildTool = buildToolField.selectedItem?.toString().orEmpty()
45+
CreateConfig.language = languageField.selectedItem?.toString() ?: "Java"
46+
// CreateConfig.language = languageField.selectedItem?.toString().orEmpty()
47+
//CreateConfig.buildTool = buildToolField.selectedItem?.toString().orEmpty()
5048
println("I received")
5149
}
5250

5351
@Throws(ConfigurationException::class)
5452
override fun validate(): Boolean {
55-
if(consoleVersionField.text == "获取中..." || coreVersionField.text == "获取中..."){
53+
if (consoleVersionField.text == "获取中..." || coreVersionField.text == "获取中...") {
5654
throw ConfigurationException("正在获取最新的Core/Console版本", "信息获取中")
5755
}
5856
if (pluginNameField.text.isBlank()) {

src/main/resources/template/gradle-groovy-dsl/build.gradle

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
plugins {
2-
id 'org.jetbrains.kotlin.jvm' version '1.3.61'
2+
id 'org.jetbrains.kotlin.jvm' version '1.4-M1'
33
id 'java'
4+
id 'com.github.johnrengelman.shadow' version '5.2.0'
45
}
56

67
group = '<GROUP>'
78
version = '<VERSION>'
89

910
repositories {
11+
maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }
1012
maven { url 'https://mirrors.huaweicloud.com/repository/maven' }
13+
mavenCentral()
1114
jcenter()
1215
}
1316

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,19 @@
1+
pluginManagement {
2+
resolutionStrategy {
3+
eachPlugin {
4+
switch (requested.id.id) {
5+
case "com.github.johnrengelman.shadow": useModule("com.github.jengelman.gradle.plugins:shadow:${requested.version}")
6+
}
7+
}
8+
}
9+
10+
repositories {
11+
maven { url "https://dl.bintray.com/kotlin/kotlin-eap" }
12+
maven { url 'https://mirrors.huaweicloud.com/repository/maven' }
13+
mavenCentral()
14+
jcenter()
15+
}
16+
}
17+
118
rootProject.name = '<PROJECT_NAME>'
219

0 commit comments

Comments
 (0)