diff --git a/gradle.properties b/gradle.properties index 63ba1fe10..68ea555d2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ kotlin.code.style=official # config miraiVersion=0.24.1 miraiConsoleVersion=0.3.2 -miraiConsoleWrapperVersion=0.0.1 +miraiConsoleWrapperVersion=0.1.1 kotlin.incremental.multiplatform=true kotlin.parallel.tasks.in.project=true # kotlin diff --git a/mirai-console-wrapper/src/main/kotlin/net/mamoe/mirai/console/wrapper/ConsoleUpdator.kt b/mirai-console-wrapper/src/main/kotlin/net/mamoe/mirai/console/wrapper/ConsoleUpdator.kt index b38852936..599b013c2 100644 --- a/mirai-console-wrapper/src/main/kotlin/net/mamoe/mirai/console/wrapper/ConsoleUpdator.kt +++ b/mirai-console-wrapper/src/main/kotlin/net/mamoe/mirai/console/wrapper/ConsoleUpdator.kt @@ -68,10 +68,10 @@ object ConsoleUpdator{ ).asSequence() .map { it.value.drop(1).dropLast(1) } .maxBy { - it.split('.').foldRightIndexed(0) { index: Int, s: String, acc: Int -> - acc + 100.0.pow(2 - index).toInt() * (s.toIntOrNull() ?: 0) - } - }!! + it.split('.').foldRightIndexed(0) { index: Int, s: String, acc: Int -> + acc + 100.0.pow(2 - index).toInt() * (s.toIntOrNull() ?: 0) + } + }!! } catch (e: Exception) { println("Failed to fetch newest Console version, please seek for help") e.printStackTrace() diff --git a/mirai-console-wrapper/src/main/kotlin/net/mamoe/mirai/console/wrapper/Downloader.kt b/mirai-console-wrapper/src/main/kotlin/net/mamoe/mirai/console/wrapper/Downloader.kt index c28cfe738..f10b1e150 100644 --- a/mirai-console-wrapper/src/main/kotlin/net/mamoe/mirai/console/wrapper/Downloader.kt +++ b/mirai-console-wrapper/src/main/kotlin/net/mamoe/mirai/console/wrapper/Downloader.kt @@ -39,7 +39,15 @@ inline fun tryNTimesOrQuit(repeat: Int, errorHint: String, block: (Int) -> R suspend inline fun HttpClient.downloadRequest(url: String): ByteReadChannel { - return this.get(url).content + return with(this.get(url)){ + if(this.status.value == 404 || this.status.value == 403){ + error("File not found") + } + if(this.headers["status"] !=null && this.headers["status"] == "404"){ + error("File not found") + } + this.content + } } private val jcenterPath = "https://jcenter.bintray.com/{group}/{project}/{version}/:{project}-{version}.{extension}" @@ -77,7 +85,7 @@ suspend fun HttpClient.downloadMaven( ) }.getOrElse { downloadRequest( - aliyunPath.buildPath(groupName,projectName,version,extension) + jcenterPath.buildPath(groupName,projectName,version,extension) ) } } @@ -104,20 +112,13 @@ suspend fun HttpClient.downloadMavenPomAsString( version: String ):String{ return kotlin.runCatching { - Http.get( + this.get( aliyunPath.buildPath(groupName,projectName,version,"pom") ) }.getOrElse { - try { - Http.get( - aliyunPath.buildPath(groupName, projectName, version, "pom") - ) - }catch (e:Exception){ - if(e.message?.contains("404 Not Found") == true) { - return "" - } - throw e - } + this.get( + aliyunPath.buildPath(groupName, projectName, version, "pom") + ) } } diff --git a/mirai-console-wrapper/src/main/kotlin/net/mamoe/mirai/console/wrapper/WrapperMain.kt b/mirai-console-wrapper/src/main/kotlin/net/mamoe/mirai/console/wrapper/WrapperMain.kt index ee649b342..caee74998 100644 --- a/mirai-console-wrapper/src/main/kotlin/net/mamoe/mirai/console/wrapper/WrapperMain.kt +++ b/mirai-console-wrapper/src/main/kotlin/net/mamoe/mirai/console/wrapper/WrapperMain.kt @@ -9,17 +9,10 @@ @file:Suppress("EXPERIMENTAL_API_USAGE") package net.mamoe.mirai.console.wrapper -import io.ktor.client.HttpClient -import io.ktor.client.engine.cio.CIO -import io.ktor.client.request.get -import io.ktor.client.statement.HttpResponse -import io.ktor.utils.io.ByteReadChannel -import io.ktor.utils.io.jvm.javaio.copyTo import kotlinx.coroutines.* import java.io.File import java.net.URLClassLoader import java.util.* -import kotlin.system.exitProcess val contentPath by lazy { @@ -33,6 +26,12 @@ val contentPath by lazy { object WrapperMain { @JvmStatic fun main(args: Array) { + GlobalScope.launch{ + while (true) { + delay(1000*60*5) + System.gc() + } + } println("You are running Mirai-Console-Wrapper under " + System.getProperty("user.dir")) var type = WrapperProperties.determineConsoleType(WrapperProperties.content) diff --git a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/events/Events.java b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/events/Events.java new file mode 100644 index 000000000..287d1c3a9 --- /dev/null +++ b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/events/Events.java @@ -0,0 +1,66 @@ +/* + * Copyright 2020 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/master/LICENSE + */ + +package net.mamoe.mirai.console.events; + +import kotlinx.coroutines.GlobalScope; +import net.mamoe.mirai.event.Event; +import net.mamoe.mirai.event.Listener; +import net.mamoe.mirai.event.ListeningStatus; +import net.mamoe.mirai.event.internal.EventInternalJvmKt; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * 事件处理 + */ +public final class Events { + + /** + * 监听一个事件, 当 {@code onEvent} 返回 {@link ListeningStatus#STOPPED} 时停止监听. + * 机器人离线后不会停止监听. + * + * @param eventClass 事件类 + * @param onEvent 事件处理. 返回 {@link ListeningStatus#LISTENING} 时继续监听. + * @param 事件类型 + * @return 事件监听器. 可调用 {@link Listener#complete()} 或 {@link Listener#completeExceptionally(Throwable)} 让监听正常停止或异常停止. + */ + @NotNull + public static Listener subscribe(@NotNull Class eventClass, @NotNull Function onEvent) { + return EventInternalJvmKt._subscribeEventForJaptOnly(eventClass, GlobalScope.INSTANCE, onEvent); + } + + /** + * 监听一个事件, 直到手动停止. + * 机器人离线后不会停止监听. + * + * @param eventClass 事件类 + * @param onEvent 事件处理. 返回 {@link ListeningStatus#LISTENING} 时继续监听. + * @param 事件类型 + * @return 事件监听器. 可调用 {@link Listener#complete()} 或 {@link Listener#completeExceptionally(Throwable)} 让监听正常停止或异常停止. + */ + @NotNull + public static Listener subscribeAlways(@NotNull Class eventClass, @NotNull Consumer onEvent) { + return EventInternalJvmKt._subscribeEventForJaptOnly(eventClass, GlobalScope.INSTANCE, onEvent); + } + + /** + * 阻塞地广播一个事件. + * + * @param event 事件 + * @param 事件类型 + * @return {@code event} 本身 + */ + @NotNull + public static E broadcast(@NotNull E event) { + return EventsImplKt.broadcast(event); + } +} \ No newline at end of file diff --git a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/events/EventsImpl.kt b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/events/EventsImpl.kt new file mode 100644 index 000000000..baf44f72e --- /dev/null +++ b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/events/EventsImpl.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2020 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/master/LICENSE + */ + +package net.mamoe.mirai.console.events; + +import kotlinx.coroutines.runBlocking +import net.mamoe.mirai.event.Event +import net.mamoe.mirai.event.broadcast + +internal fun broadcast(e: E): E = runBlocking { e.broadcast() } \ No newline at end of file diff --git a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugins/PluginBase.kt b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugins/PluginBase.kt index c8bec6dc1..dc8c38066 100644 --- a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugins/PluginBase.kt +++ b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugins/PluginBase.kt @@ -83,7 +83,11 @@ abstract class PluginBase @JvmOverloads internal fun disable(throwable: CancellationException? = null) { this.coroutineContext[Job]!!.cancelChildren(throwable) - this.onDisable() + try { + this.onDisable() + }catch (e:Exception){ + logger.info(e) + } } internal var pluginName: String = "" diff --git a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugins/PluginManager.kt b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugins/PluginManager.kt index d8208139f..0359249b8 100644 --- a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugins/PluginManager.kt +++ b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/plugins/PluginManager.kt @@ -42,7 +42,11 @@ object PluginManager { fun onCommand(command: Command, sender: CommandSender, args: List) { nameToPluginBaseMap.values.forEach { - it.onCommand(command, sender, args) + try { + it.onCommand(command, sender, args) + }catch (e:Exception){ + logger.info(e) + } } } @@ -194,7 +198,27 @@ object PluginManager { } nameToPluginBaseMap.values.forEach { - it.enable() + try { + it.onLoad() + }catch (ignored:Exception){ + if(ignored is CancellationException) { + logger.info(ignored) + logger.info(it.pluginName + "Failed to load, disabling it") + it.disable(ignored) + } + } + } + + nameToPluginBaseMap.values.forEach { + try { + it.enable() + }catch (ignored:Exception){ + logger.info(ignored) + logger.info(it.pluginName + "Failed to enable, disabling it") + if(ignored is CancellationException) { + it.disable(ignored) + } + } } logger.info("""加载了${nameToPluginBaseMap.size}个插件""") @@ -213,9 +237,9 @@ object PluginManager { * 根据插件名字找Jar的文件 * null => 没找到 */ - fun getJarPath(pluginName: String): File? { + fun getJarFileByName(pluginName: String): File? { File(pluginsPath).listFiles()?.forEach { file -> - if (file != null && file.extension == "jar") { + if (file != null && file.extension == "jar") { val jar = JarFile(file) val pluginYml = jar.entries().asSequence().filter { it.name.toLowerCase().contains("plugin.yml") }.firstOrNull() @@ -240,7 +264,7 @@ object PluginManager { * null => 没找到 */ fun getFileInJarByName(pluginName: String, toFind: String): InputStream? { - val jarFile = getJarPath(pluginName) ?: return null + val jarFile = getJarFileByName(pluginName) ?: return null val jar = JarFile(jarFile) val toFindFile = jar.entries().asSequence().filter { it.name == toFind }.firstOrNull() ?: return null diff --git a/mirai-console/src/main/kotlin/net/mamoe/mirai/console/scheduler/SchedulerTask.kt b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/scheduler/SchedulerTask.kt new file mode 100644 index 000000000..ac145af57 --- /dev/null +++ b/mirai-console/src/main/kotlin/net/mamoe/mirai/console/scheduler/SchedulerTask.kt @@ -0,0 +1,69 @@ +package net.mamoe.mirai.console.scheduler + +import net.mamoe.mirai.console.plugins.PluginBase + +interface SchedulerTask{ + abstract fun onTick(i:Long) + abstract fun onRun() +} + +abstract class RepeatTask( + val intervalInMs: Int +):SchedulerTask{ + + override fun onTick(i: Long) { + if(i%intervalInMs == 0L){ + onRun() + } + } + + companion object{ + fun of( + intervalInMs: Int, runnable: () -> Unit + ):RepeatTask{ + return AnonymousRepeatTask( + intervalInMs, runnable + ) + } + } +} + +internal class AnonymousRepeatTask( + intervalInMs: Int, private val runnable: () -> Unit +): RepeatTask(intervalInMs){ + override fun onRun() { + runnable.invoke() + } +} + +fun T.repeatTask( + intervalInMs: Int, runnable: () -> Unit +):RepeatTask{ + return AnonymousRepeatTask( + intervalInMs, runnable + ) +} + + +fun repeatTask(){ + +} + +class X: PluginBase() { + override fun onLoad() { + //kotlin + this.repeatTask(5){ + + } + //java1 + RepeatTask.of(5){ + + } + //java2 + class Xtask:RepeatTask(5){ + override fun onRun() { + + } + } + } +} \ No newline at end of file