diff --git a/pom.xml b/pom.xml
index 14992b5..6baa0d8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -77,10 +77,6 @@
org.jetbrains.kotlinx
kotlinx-coroutines-reactor
-
-
-
-
com.mysql
@@ -110,6 +106,16 @@
hutool-http
5.8.27
+
+
+ com.baomidou
+ mybatis-plus-spring-boot3-starter
+ 3.5.7
+
+
+ org.projectlombok
+ lombok
+
diff --git a/src/main/kotlin/info/alinadace/miraibot/MiraiBotApplication.kt b/src/main/kotlin/info/alinadace/miraibot/MiraiBotApplication.kt
index d4b7de9..9843f38 100644
--- a/src/main/kotlin/info/alinadace/miraibot/MiraiBotApplication.kt
+++ b/src/main/kotlin/info/alinadace/miraibot/MiraiBotApplication.kt
@@ -2,8 +2,10 @@ package info.alinadace.miraibot
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
+import org.springframework.scheduling.annotation.EnableScheduling
@SpringBootApplication
+@EnableScheduling
class MiraiBotApplication
fun main(args: Array) {
diff --git a/src/main/kotlin/info/alinadace/miraibot/service/drink_water/DisableService.kt b/src/main/kotlin/info/alinadace/miraibot/service/drink_water/DisableService.kt
new file mode 100644
index 0000000..13343c5
--- /dev/null
+++ b/src/main/kotlin/info/alinadace/miraibot/service/drink_water/DisableService.kt
@@ -0,0 +1,68 @@
+package info.alinadace.miraibot.service.drink_water
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
+import info.alinadace.miraibot.annotation.BotFunction
+import info.alinadace.miraibot.service.Service
+import info.alinadace.miraibot.service.drink_water.domain.DrinkWaterUser
+import info.alinadace.miraibot.service.drink_water.mapper.DrinkWaterMapper
+import jakarta.annotation.Resource
+import net.mamoe.mirai.event.events.FriendMessageEvent
+import net.mamoe.mirai.message.data.MessageSource
+import net.mamoe.mirai.message.data.PlainText
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+/**
+ * 定时喝水提醒关闭服务
+ * @author Kane
+ * @since 2024/9/18 13:27
+ */
+@BotFunction(FriendMessageEvent::class)
+class DisableService : Service {
+
+ companion object {
+ val log: Logger = LoggerFactory.getLogger(this::class.java)
+ }
+
+
+ @Resource
+ lateinit var drinkWaterMapper: DrinkWaterMapper
+
+ /**
+ * 服务入口
+ */
+ override fun entrance(event: FriendMessageEvent): Boolean {
+ val chain = event.message
+ val filter = chain.filter { it !is MessageSource }
+ if (filter.size == 1 && filter[0] is PlainText) {
+ if (filter[0].contentToString() == "关闭喝水提醒") {
+ return true
+ }
+ }
+ return false
+ }
+
+ /**
+ * 服务行为
+ */
+ override suspend fun active(event: FriendMessageEvent) {
+ log.info("服务关闭请求 - DrinkWater - target:{}", event.sender.id)
+ val one = drinkWaterMapper.selectOne(
+ LambdaQueryWrapper()
+ .eq(DrinkWaterUser::botId, event.sender.id)
+ )
+ if (one == null) {
+ event.subject.sendMessage("服务已关闭 - DrinkWater")
+ log.info("服务已关闭 - DrinkWater - target:{} - 无记录", event.sender.id)
+ return
+ }
+ if (one.enable == DrinkWaterUser.ENABLE) {
+ one.enable = DrinkWaterUser.DISABLE
+ val updateById = drinkWaterMapper.updateById(one)
+ event.subject.sendMessage("服务已关闭 - DrinkWater")
+ log.info("服务已关闭 - DrinkWater - target:{} - 记录更新 - {}", event.sender.id, updateById)
+ return
+ }
+ event.subject.sendMessage("服务已关闭 - DrinkWater")
+ }
+}
diff --git a/src/main/kotlin/info/alinadace/miraibot/service/drink_water/EnableService.kt b/src/main/kotlin/info/alinadace/miraibot/service/drink_water/EnableService.kt
new file mode 100644
index 0000000..0773d1a
--- /dev/null
+++ b/src/main/kotlin/info/alinadace/miraibot/service/drink_water/EnableService.kt
@@ -0,0 +1,73 @@
+package info.alinadace.miraibot.service.drink_water
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
+import info.alinadace.miraibot.annotation.BotFunction
+import info.alinadace.miraibot.service.Service
+import info.alinadace.miraibot.service.drink_water.domain.DrinkWaterUser
+import info.alinadace.miraibot.service.drink_water.mapper.DrinkWaterMapper
+import jakarta.annotation.Resource
+import net.mamoe.mirai.event.events.FriendMessageEvent
+import net.mamoe.mirai.message.data.MessageSource
+import net.mamoe.mirai.message.data.PlainText
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+/**
+ * 定时喝水提醒开启服务
+ * @author Kane
+ * @since 2024/9/18 13:27
+ */
+@BotFunction(FriendMessageEvent::class)
+class EnableService : Service {
+
+ companion object {
+ val log: Logger = LoggerFactory.getLogger(this::class.java)
+ }
+
+ @Resource
+ lateinit var drinkWaterMapper: DrinkWaterMapper
+
+ /**
+ * 服务入口
+ */
+ override fun entrance(event: FriendMessageEvent): Boolean {
+ val chain = event.message
+ val filter = chain.filter { it !is MessageSource }
+ if (filter.size == 1 && filter[0] is PlainText) {
+ if (filter[0].contentToString() == "开启喝水提醒") {
+ return true
+ }
+ }
+ return false
+ }
+
+ /**
+ * 服务行为
+ */
+ override suspend fun active(event: FriendMessageEvent) {
+ log.info("服务开启请求 - DrinkWater - target:{}", event.sender.id)
+ val one = drinkWaterMapper.selectOne(
+ LambdaQueryWrapper()
+ .eq(DrinkWaterUser::botId, event.sender.id)
+ )
+ if (one == null) {
+ val let = DrinkWaterUser().apply {
+ botId = event.sender.id
+ enable = DrinkWaterUser.ENABLE
+ }.let {
+ drinkWaterMapper.insert(it)
+ }
+ event.subject.sendMessage("服务已开启 - DrinkWater")
+ log.info("服务开启请求 - DrinkWater - target:{} - 记录创建 - {}", event.sender.id, let)
+ return
+ }
+ if (one.enable == DrinkWaterUser.DISABLE) {
+ one.enable = DrinkWaterUser.ENABLE
+ val updateById = drinkWaterMapper.updateById(one)
+ event.subject.sendMessage("服务已开启 - DrinkWater")
+ log.info("服务开启请求 - DrinkWater - target:{} - 记录更新 - {}", event.sender.id, updateById)
+ return
+ }
+ event.subject.sendMessage("服务已开启 - DrinkWater")
+ }
+}
diff --git a/src/main/kotlin/info/alinadace/miraibot/service/drink_water/domain/DrinkWaterUser.kt b/src/main/kotlin/info/alinadace/miraibot/service/drink_water/domain/DrinkWaterUser.kt
new file mode 100644
index 0000000..2f2b788
--- /dev/null
+++ b/src/main/kotlin/info/alinadace/miraibot/service/drink_water/domain/DrinkWaterUser.kt
@@ -0,0 +1,15 @@
+package info.alinadace.miraibot.service.drink_water.domain
+
+/**
+ * 喝水提醒用户
+ */
+class DrinkWaterUser {
+ var id: Long = 0
+ var botId: Long = 0
+ var enable: Byte? = null
+
+ companion object {
+ const val ENABLE: Byte = 1
+ const val DISABLE: Byte = 0
+ }
+}
diff --git a/src/main/kotlin/info/alinadace/miraibot/service/drink_water/mapper/DrinkWaterMapper.kt b/src/main/kotlin/info/alinadace/miraibot/service/drink_water/mapper/DrinkWaterMapper.kt
new file mode 100644
index 0000000..c8b2021
--- /dev/null
+++ b/src/main/kotlin/info/alinadace/miraibot/service/drink_water/mapper/DrinkWaterMapper.kt
@@ -0,0 +1,12 @@
+package info.alinadace.miraibot.service.drink_water.mapper
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper
+import info.alinadace.miraibot.service.drink_water.domain.DrinkWaterUser
+
+/**
+ * 喝水提醒用户Mapper
+ * @author Kane
+ * @since 2024/9/18 13:39
+ */
+interface DrinkWaterMapper : BaseMapper {
+}
diff --git a/src/main/kotlin/info/alinadace/miraibot/service/drink_water/task/ReminderService.kt b/src/main/kotlin/info/alinadace/miraibot/service/drink_water/task/ReminderService.kt
new file mode 100644
index 0000000..3fd2605
--- /dev/null
+++ b/src/main/kotlin/info/alinadace/miraibot/service/drink_water/task/ReminderService.kt
@@ -0,0 +1,45 @@
+package info.alinadace.miraibot.service.drink_water.task
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
+import info.alinadace.miraibot.service.drink_water.domain.DrinkWaterUser
+import info.alinadace.miraibot.service.drink_water.mapper.DrinkWaterMapper
+import net.mamoe.mirai.Bot
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import org.springframework.scheduling.annotation.Scheduled
+import org.springframework.stereotype.Service
+
+/**
+ * 定时喝水提醒服务
+ * @author Kane
+ * @since 2024/9/18 13:59
+ */
+@Service
+class ReminderService {
+
+ companion object {
+ val log: Logger = LoggerFactory.getLogger(this::class.java)
+ }
+
+ lateinit var bot: Bot
+
+ lateinit var drinkWaterMapper: DrinkWaterMapper
+
+ @Scheduled(cron = "0 0 0,8-23/2 * * *")
+ suspend fun reminder() {
+ log.info("定时喝水提醒服务 - 开始")
+ val list = drinkWaterMapper.selectList(
+ LambdaQueryWrapper()
+ .eq(DrinkWaterUser::enable, DrinkWaterUser.ENABLE)
+ )
+ list.forEach {
+ if (it.botId == 0L) {
+ return@forEach
+ }
+ bot.getFriend(it.botId)?.sendMessage("请喝水")
+ log.info("定时喝水提醒服务 - 发送消息 - {}", it.botId)
+ }
+ log.info("定时喝水提醒服务 - 结束")
+ }
+
+}
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 1d668d9..5ae4f87 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -1,2 +1,12 @@
bot:
id: 3437522130
+spring:
+ data:
+ redis:
+ host: 101.35.164.171
+ password: wTE32JjsieQ2JTOwsg9X
+ datasource:
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/mirai?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
+ username: root
+ password: nobuts001
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index e69de29..ca10654 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -0,0 +1,12 @@
+bot:
+ id: 3437522130
+spring:
+ data:
+ redis:
+ host: 10.0.4.16
+ password: wTE32JjsieQ2JTOwsg9X
+ datasource:
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://10.0.4.16:3306/mirai?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
+ username: root
+ password: FydsaZsFm5w26We6
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 841f5f2..e68e04c 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -8,3 +8,4 @@ bot:
admin: 1075576561
server:
port: 25684 # 无用随机端口
+