首先添加依赖
plugins {
kotlin("jvm") version "1.9.22"
id("org.jetbrains.kotlin.plugin.serialization") version "1.9.22"
}
implementation("net.java.dev.jna:jna:5.15.0")
implementation("net.java.dev.jna:jna-platform:5.15.0")
implementation("com.squareup.okhttp3:okhttp:4.12.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.2")
class HolidayManager {
// 荣耀云日历规则
private val holidayRulesUrl =
"https://configserver-drcn.platform.hihonorcloud.com/servicesupport/updateserver/data/com.hihonor.configplatform_calendar_holidayInfo"
private val cacheFile = File("holiday${LocalDate.now().year}.json")
val rules: Holiday
init {
val holidayJson = if (cacheFile.exists()) {
cacheFile.readText()
} else {
OkHttpClient.Builder()
.proxy(queryRegProxy())
.build()
.newCall(Request.Builder().url(holidayRulesUrl).build())
.execute().use { it.body.string() }.also {
cacheFile.writeText(it)
}
}
rules = Json.decodeFromString<Holiday>(holidayJson)
}
// 牛魔规则第一天是0
fun LocalDate.isWork(): Boolean {
val day = this.dayOfYear - 1
if (day in rules.freeday) return false
if (day in rules.workday) return true
return this.dayOfWeek !in listOf(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY)
}
fun LocalDate.nextWork(): LocalDate {
var target = this.plusDays(1)
while (!target.isWork()) {
target = target.plusDays(1)
}
return target
}
private fun queryRegProxy(): Proxy {
val key = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"
val proxy = Advapi32Util.registryGetStringValue(WinReg.HKEY_CURRENT_USER, key, "ProxyServer")
val host = proxy.substringBefore(':')
val port = proxy.substringAfter(':').toInt()
return Proxy(Proxy.Type.HTTP, InetSocketAddress(host, port))
}
@Serializable
data class Holiday(
val year: Int,
val version: String,
val workday: List<Int>,
val freeday: List<Int>
)
}