Skip to content

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
  • Loading branch information
WangShuo committed Apr 1, 2021
2 parents 5ad7948 + 522082d commit 9150cb5
Show file tree
Hide file tree
Showing 17 changed files with 605 additions and 45 deletions.
27 changes: 19 additions & 8 deletions src/main/kotlin/top/wsure/warframe/WorldState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,10 @@ import net.mamoe.mirai.console.util.ConsoleExperimentalApi
import net.mamoe.mirai.event.events.MessageEvent
import net.mamoe.mirai.event.globalEventChannel
import net.mamoe.mirai.utils.info
import top.wsure.warframe.cache.CacheValue
import top.wsure.warframe.cache.ExpirableCache
import top.wsure.warframe.command.ChatCommandEditor
import top.wsure.warframe.command.WFHelp
import top.wsure.warframe.cache.ConstantObject
import top.wsure.warframe.command.*
import top.wsure.warframe.data.WorldStateData
import top.wsure.warframe.task.TaskSchedule
import top.wsure.warframe.utils.CommandUtils
import top.wsure.warframe.utils.ScheduleUtils
import java.util.*
Expand All @@ -42,21 +41,33 @@ object WorldState : KotlinPlugin(
logger.info{"os.version:${System.getProperty("os.version")}"}

WorldState.launch {

WorldStateData.commandList = CommandUtils.getRemoteCommand(WorldStateData.host)

WorldStateData.taskList = CommandUtils.getRemoteTask(WorldStateData.host)

WorldStateData.reload()

CommandUtils.initTaskQueue(WorldStateData.taskList)

CommandUtils.registerAll(WorldStateData.commandList)

CommandUtils.executeTask(WorldStateData.taskList)

WFHelp(WorldState,WorldStateData.helpKey).register()

EditMaster.register()

EditTask.register()

ChatCommandEditor.register()

AbstractPermitteeId.AnyContact.permit(WorldState.parentPermission)
SendToAllGroup.register()

val cache = ExpirableCache(WorldStateData.cache)
AbstractPermitteeId.AnyContact.permit(WorldState.parentPermission)

cache.put("aa","bb",6000L)
ScheduleUtils.loopEvent(TaskSchedule.process, Date(),30*60*1000L,ConstantObject.TASK_HOLDER)

ScheduleUtils.loopEvent({ println(cache.keys.toString())}, Date(),500L)
}

globalEventChannel().subscribeAlways<MessageEvent> {
Expand Down
5 changes: 4 additions & 1 deletion src/main/kotlin/top/wsure/warframe/cache/CacheValue.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package top.wsure.warframe.cache

import kotlinx.serialization.Polymorphic
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json

/**
* FileName: CacheValue
Expand All @@ -9,4 +12,4 @@ import kotlinx.serialization.Serializable
* Description:
*/
@Serializable
data class CacheValue<K,V :java.io.Serializable>(val key:K,val value:V,val timeout:Long)
data class CacheValue<K>(val key:K,var value:String, val timeout:Long)
18 changes: 18 additions & 0 deletions src/main/kotlin/top/wsure/warframe/cache/ConstantObject.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package top.wsure.warframe.cache

import java.util.*
import kotlin.collections.HashMap

/**
* FileName: TaskCache
* Author: wsure
* Date: 2021/3/31 10:31 上午
* Description:
*/
object ConstantObject {
val taskMap: MutableMap<String, Pair<Timer,TimerTask>> = HashMap()

const val TASK_HOLDER = "updateTaskLoop"

const val INITIATIVE_NOTIFY = "INITIATIVE_NOTIFY_ALL_GROUP"
}
33 changes: 22 additions & 11 deletions src/main/kotlin/top/wsure/warframe/cache/ExpirableCache.kt
Original file line number Diff line number Diff line change
@@ -1,20 +1,27 @@
package top.wsure.warframe.cache

import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import net.mamoe.mirai.console.data.SerializerAwareValue
import top.wsure.warframe.data.WorldStateData
import java.util.concurrent.ConcurrentMap
import java.util.concurrent.TimeUnit
import java.util.stream.Collectors

/**
* FileName: ExpirableCache
* Author: wsure
* Date: 2021/3/29 5:16 下午
* Description:
*/
class ExpirableCache<K, V:java.io.Serializable>(
private val delegate: ConcurrentMap<K, CacheValue<K, V>>
) : ConcurrentMap<K, CacheValue<K, V>> by delegate {

class ExpirableCache<K>(
private val delegate: ConcurrentMap<K, CacheValue<K>>
) : ConcurrentMap<K, CacheValue<K>> by delegate {
companion object{
val CACHE_MAP = CacheHolder.holder
}
private object CacheHolder {
val holder = ExpirableCache(WorldStateData.cache)
}
override val size: Int
get() {
recycle()
Expand All @@ -26,21 +33,25 @@ class ExpirableCache<K, V:java.io.Serializable>(
return delegate.keys
}

fun put(k: K, v: V, wait: Long?) {
fun put(k: K, v: Any?, wait: Long?) {
val timeout = if (wait == null) 0 else (wait + System.currentTimeMillis())
delegate[k] = CacheValue(k, v, timeout)
delegate[k] = CacheValue(k, Json.encodeToString(v), timeout)
}

override fun remove(key: K): CacheValue<K, V>? {
override fun remove(key: K): CacheValue<K>? {
recycle()
return delegate.remove(key)
}

override fun get(key: K): CacheValue<K, V>? {
override fun get(key: K): CacheValue<K>? {
recycle()
return delegate[key]
}

inline fun <reified T> getData(key:K):T? {
return get(key)?.value?.let { Json{ ignoreUnknownKeys = true }.decodeFromString<T>(it) }
}

private fun recycle() {
val now = System.currentTimeMillis()
delegate.values.stream()
Expand Down
46 changes: 46 additions & 0 deletions src/main/kotlin/top/wsure/warframe/command/EditMaster.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package top.wsure.warframe.command

import net.mamoe.mirai.console.command.CommandSender
import net.mamoe.mirai.console.command.CompositeCommand
import net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
import net.mamoe.mirai.contact.User
import net.mamoe.mirai.message.data.PlainText
import top.wsure.warframe.WorldState
import top.wsure.warframe.data.WorldStateData
import top.wsure.warframe.utils.PromiseUtils

object EditMaster : CompositeCommand(
WorldState,
"master",
"主人", "骂死他",
description = "bot-master-tools插件设置"
) {
@ExperimentalCommandDescriptors
@ConsoleExperimentalApi
override val prefixOptional = true

@SubCommand("list", "show", "列表")
@Description("master列表")
suspend fun CommandSender.list() {
sendMessage(PlainText(WorldStateData.masters.joinToString("\n")))
}

@SubCommand("add", "", "plus","增加","添加")
@Description("+ master")
suspend fun CommandSender.add(user: User) {
if (PromiseUtils.isMaster(this.user)) {
val isSuccess = WorldStateData.masters.add(user.id)
sendMessage(PlainText("添加${user.id}${if (isSuccess) "成功" else "失败"}"))
}
}

@SubCommand("del", "remove", "rm","delete","","","删除","去除","移除")
@Description("- master")
suspend fun CommandSender.del(user: User) {
if (PromiseUtils.isMaster(this.user)) {
val isSuccess = WorldStateData.masters.remove(user.id)
sendMessage(PlainText("删除${user.id}${if (isSuccess) "成功" else "失败"}"))
}
}
}
119 changes: 119 additions & 0 deletions src/main/kotlin/top/wsure/warframe/command/EditTask.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package top.wsure.warframe.command

import net.mamoe.mirai.Bot
import net.mamoe.mirai.console.command.CommandSender
import net.mamoe.mirai.console.command.CompositeCommand
import net.mamoe.mirai.console.command.ConsoleCommandSender
import net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors
import net.mamoe.mirai.console.command.isConsole
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
import net.mamoe.mirai.message.data.PlainText
import top.wsure.warframe.WorldState
import top.wsure.warframe.data.RemoteTask
import top.wsure.warframe.data.TaskEnum
import top.wsure.warframe.data.WorldStateData
import top.wsure.warframe.utils.PromiseUtils

/**
* FileName: EditTask
* Author: wsure
* Date: 2021/4/1 8:39 下午
* Description:
*/
object EditTask : CompositeCommand(
WorldState,
"task",
"任务", "定时任务",
description = "定时任务设置"
) {
@ExperimentalCommandDescriptors
@ConsoleExperimentalApi
override val prefixOptional = true


@SubCommand("list", "show", "列表")
@Description("task list")
suspend fun CommandSender.list() {
if(isConsole()){
sendMessage(PlainText(WorldStateData.taskList.filter { it.type == TaskEnum.NOTIFY_GROUP }.joinToString("\n") { task ->
"${task.name} - 间隔${(task.period / 60 / 1000).toDouble()}分钟"
}))
} else {
val groupId = PromiseUtils.getGroupId(this)
if (groupId != null) {
var groupSetting = WorldStateData.groupTaskSetting[groupId]
if (groupSetting == null) {
groupSetting = HashMap()
WorldStateData.groupTaskSetting[groupId] = groupSetting
}
sendMessage(PlainText(getGroupTaskSetting(groupSetting)))
}
}
}

@SubCommand("add", "", "plus", "增加", "添加", "enable", "open", "", "启用", "使用")
@Description("+task")
suspend fun CommandSender.add(task: String) {
if(isConsole()){
setAllGroupTaskList(task,this,true)
} else {
setGroupTaskList(task, this,true)
}
}

@SubCommand("del", "remove", "rm", "delete", "", "", "删除", "去除", "移除", "", "关闭", "禁用", "停用", "disable", "close")
@Description("-task")
suspend fun CommandSender.del(task: String) {
if(isConsole()){
setAllGroupTaskList(task,this,false)
} else {
setGroupTaskList(task, this,false)
}
}

suspend fun setGroupTaskList(
task: String,
sender: CommandSender,
enabled:Boolean
) {
val remoteTask = WorldStateData.taskList.find { it.name == task }
val groupId = PromiseUtils.getGroupId(sender)
if (remoteTask != null && groupId != null) {
var groupSetting = WorldStateData.groupTaskSetting[groupId]
if (groupSetting == null) {
groupSetting = HashMap()
WorldStateData.groupTaskSetting[groupId] = groupSetting
}
setOperator(sender,groupId, remoteTask,enabled)
}
}

suspend fun setOperator(sender: CommandSender,groupId: Long, task: RemoteTask,enabled:Boolean){
if (PromiseUtils.isManage(sender)) {
WorldStateData.groupTaskSetting[groupId]?.set(task.name, enabled)
sender.sendMessage(PlainText("${groupId} ${if (enabled) "启用" else "禁用" } ${task.name} 成功"))
}
}

suspend fun setAllGroupTaskList(
task: String,
sender: CommandSender,
enabled:Boolean
) {
val remoteTask = WorldStateData.taskList.find { it.name == task }
if (remoteTask != null) {
val groups = Bot.instances.map { it.groups }.flatten().distinct()
groups.forEach {
setOperator(sender,it.id , remoteTask,enabled)
}
}
}

fun getGroupTaskSetting(groupSetting: MutableMap<String, Boolean>): String {
return WorldStateData.taskList.filter { it.type == TaskEnum.NOTIFY_GROUP }.joinToString("\n") { task ->
"${task.name} - 间隔${(task.period / 60 / 1000).toDouble()}分钟 - 状态: ${
if (groupSetting.getOrDefault(task.name, false)) "开启" else "关闭"
} "
}
}
}
35 changes: 35 additions & 0 deletions src/main/kotlin/top/wsure/warframe/command/SendToAllGroup.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package top.wsure.warframe.command

import net.mamoe.mirai.console.MiraiConsole
import net.mamoe.mirai.console.command.CommandSender
import net.mamoe.mirai.console.command.RawCommand
import net.mamoe.mirai.console.command.descriptor.ExperimentalCommandDescriptors
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.utils.MiraiLogger
import top.wsure.warframe.WorldState
import top.wsure.warframe.cache.ConstantObject.INITIATIVE_NOTIFY
import top.wsure.warframe.utils.NotifyUtils.Companion.notifyAllGroup
import top.wsure.warframe.utils.PromiseUtils.Companion.isMaster

@ConsoleExperimentalApi
object SendToAllGroup : RawCommand(
WorldState,
"发送全部群",
"sendToAllGroup"
) {
private val logger: MiraiLogger = MiraiConsole.createLogger(this.javaClass.canonicalName)

@ExperimentalCommandDescriptors
override val prefixOptional = true

override suspend fun CommandSender.onCommand(args: MessageChain) {
if (isMaster(this.user)) {
val msg = args.joinToString(" ") { it.contentToString() }
logger.info("发送全部群 :${msg}")
sendMessage("发送全部群 完成,耗时:${notifyAllGroup(this.bot, args,INITIATIVE_NOTIFY)}ms")
logger.info("发送全部群 :完成")
}
}

}
12 changes: 12 additions & 0 deletions src/main/kotlin/top/wsure/warframe/data/RemoteQueue.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package top.wsure.warframe.data

import kotlinx.serialization.Serializable

/**
* FileName: RemoteQueue
* Author: wsure
* Date: 2021/3/30 10:23 上午
* Description:
*/
@Serializable
data class RemoteQueue(val key:String,val timeout:Long) : java.io.Serializable
4 changes: 2 additions & 2 deletions src/main/kotlin/top/wsure/warframe/data/RemoteTask.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ data class RemoteTask(
)

enum class TaskEnum{
NOTIFY,
UPDATE,
NOTIFY_GROUP,
NOTIFY_MASTER,
REFRESH,
PULL,
}
Loading

0 comments on commit 9150cb5

Please sign in to comment.