重制cpp索引,增加更新索引命令 /jcr update

This commit is contained in:
2022-08-22 17:12:49 +08:00
parent d45b7f8276
commit 866ce352a2
7 changed files with 113 additions and 14254 deletions

View File

@ -3,11 +3,11 @@ plugins {
kotlin("jvm") version kotlinVersion
kotlin("plugin.serialization") version kotlinVersion
id("net.mamoe.mirai-console") version "2.10.0"
id("net.mamoe.mirai-console") version "2.12.2"
}
group = "top.jie65535"
version = "0.1.0"
version = "0.2.0"
repositories {
maven("https://maven.aliyun.com/repository/public") // 阿里云国内代理仓库

72
src/main/kotlin/Data.kt Normal file
View File

@ -0,0 +1,72 @@
package top.jie65535.jcr
import kotlinx.coroutines.runInterruptible
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import okhttp3.OkHttpClient
import okhttp3.Request
@OptIn(kotlinx.serialization.ExperimentalSerializationApi::class)
object Data {
/**
* 数据
*/
lateinit var indexes: Array<Index>
private val Json = Json {
ignoreUnknownKeys = true
}
/**
* 初始化数据
*/
fun initData() {
val linkMap = JCppReferencePlugin.resolveDataFile("linkmap.json")
indexes = if (linkMap.exists()) {
Json.decodeFromString(linkMap.readText())
} else {
val resource = this::class.java.getResource("/linkmap.json")
if (resource == null) {
JCppReferencePlugin.logger.error("索引资源不存在!请更新索引")
arrayOf()
} else {
Json.decodeFromString(resource.readText())
}
}
}
private val httpClient by lazy { OkHttpClient() }
/**
* 更新数据
*/
suspend fun updateData() {
val call = httpClient.newCall(Request.Builder()
.url("https://cdn.jsdelivr.net/npm/@gytx/cppreference-index/dist/generated.json")
.build())
JCppReferencePlugin.logger.info("正在下载索引")
runInterruptible {
val response = call.execute()
if (response.isSuccessful) {
val json = response.body!!.string()
indexes = Json.decodeFromString(json)
// 保存到文件
JCppReferencePlugin.resolveDataFile("linkmap.json")
.writeText(json)
JCppReferencePlugin.logger.info("索引更新完成")
} else {
JCppReferencePlugin.logger.error("下载失败 HTTP Code: ${response.code}")
}
}
}
/**
* 获取索引
*/
fun getIndex(word: String): Index? {
return indexes.filter { it.name.contains(word) }
.sortedWith { a, b -> a.name.length - b.name.length }
.firstOrNull()
}
}

10
src/main/kotlin/Index.kt Normal file
View File

@ -0,0 +1,10 @@
package top.jie65535.jcr
import kotlinx.serialization.Serializable
@Serializable
class Index(
val type: String,
val name: String,
val link: String,
)

View File

@ -1,9 +1,11 @@
package top.jie65535.jcr
import net.mamoe.mirai.console.command.CommandManager.INSTANCE.register
import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription
import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
import net.mamoe.mirai.event.GlobalEventChannel
import net.mamoe.mirai.event.subscribeMessages
import net.mamoe.mirai.message.data.MessageSource.Key.quote
import net.mamoe.mirai.utils.info
import java.io.BufferedReader
import java.io.InputStreamReader
@ -12,7 +14,7 @@ object JCppReferencePlugin : KotlinPlugin(
JvmPluginDescription(
id = "top.jie65535.mirai-console-jcr-plugin",
name = "J Cpp Reference Plugin",
version = "0.1.0"
version = "0.2.0"
) {
author("jie65535")
info("cppreference.com 帮助插件")
@ -40,30 +42,30 @@ object JCppReferencePlugin : KotlinPlugin(
}
private val indexC by lazy { loadMap("/devhelp-index-c.txt") }
private val indexCpp by lazy { loadMap("/devhelp-index-cpp.txt") }
// private val indexCpp by lazy { loadMap("/devhelp-index-cpp.txt") }
override fun onEnable() {
logger.info { "Plugin loaded" }
PluginCommands.register()
Data.initData()
val eventChannel = GlobalEventChannel.parentScope(this)
eventChannel.subscribeMessages {
startsWith("c ") {
val keyword = it.trim()
startsWith("c ") { keyword ->
if (keyword.isEmpty()) return@startsWith
logger.info("check c \"$keyword\"")
val link = indexC[keyword]
if (link != null) {
subject.sendMessage(cppreferencePrefix + link)
subject.sendMessage(message.quote() + cppreferencePrefix + link)
}
}
startsWith("cpp ") {
val keyword = it.trim()
startsWith("cpp ") { keyword ->
if (keyword.isEmpty()) return@startsWith
logger.info("check cpp \"$keyword\"")
val link = indexCpp[keyword]
if (link != null) {
subject.sendMessage(cppreferencePrefix + link)
val index = Data.getIndex(keyword)
if (index != null) {
subject.sendMessage(message.quote() + cppreferencePrefix + index.link)
}
}
}

View File

@ -0,0 +1,16 @@
package top.jie65535.jcr
import net.mamoe.mirai.console.command.CommandSender
import net.mamoe.mirai.console.command.CompositeCommand
object PluginCommands : CompositeCommand(
JCppReferencePlugin, "jcr",
description = "J CppReference Commands"
) {
@SubCommand
@Description("更新索引")
suspend fun CommandSender.update() {
Data.updateData()
sendMessage("OK")
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long