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 # 无用随机端口 +