Files
FancyBot/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt
T

171 lines
6.7 KiB
Kotlin
Raw Normal View History

2024-08-27 18:44:32 +08:00
/*
* Copyright © 2024 RTAkland
* Author: RTAkland
* Date: 2024/8/26
*/
package cn.rtast.fancybot
2024-09-20 13:30:52 +08:00
import cn.rtast.fancybot.commands.parse.AsciiArtCommand
2024-09-13 12:44:10 +08:00
import cn.rtast.fancybot.commands.parse.BVParseCommand
2024-09-21 14:12:08 +08:00
import cn.rtast.fancybot.commands.parse.CalculateCommand
2024-09-13 12:44:10 +08:00
import cn.rtast.fancybot.commands.parse.GitHubParseCommand
import cn.rtast.fancybot.commands.parse.ImageURLCommand
import cn.rtast.fancybot.commands.parse.ReverseGIFCommand
2024-09-12 13:06:13 +08:00
import cn.rtast.fancybot.entity.bili.CardShare
2024-08-30 15:05:51 +08:00
import cn.rtast.fancybot.entity.enums.WSType
import cn.rtast.fancybot.util.initDatabase
2024-09-12 13:06:13 +08:00
import cn.rtast.fancybot.util.str.fromJson
2024-08-27 18:44:32 +08:00
import cn.rtast.rob.ROneBotFactory
2024-09-25 12:51:34 +08:00
import cn.rtast.rob.entity.*
2024-09-06 10:58:55 +08:00
import cn.rtast.rob.enums.ArrayMessageType
2024-09-02 11:30:58 +08:00
import cn.rtast.rob.util.ob.MessageChain
import cn.rtast.rob.util.ob.OneBotListener
2024-09-20 22:23:43 +08:00
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
2024-09-19 15:11:40 +08:00
import java.io.File
2024-09-20 22:23:43 +08:00
import java.net.URI
2024-08-27 18:44:32 +08:00
class FancyBot : OneBotListener {
2024-09-02 11:30:58 +08:00
2024-09-20 22:23:43 +08:00
private val coroutineScope = CoroutineScope(Dispatchers.IO)
2024-09-22 20:51:39 +08:00
override suspend fun onWebsocketOpenEvent() {
this.broadcastMessage("FancyBot启动成功了呢~")
}
2024-09-07 18:07:56 +08:00
override suspend fun onGroupMessage(message: GroupMessage, json: String) {
2024-09-03 12:32:52 +08:00
val sender = message.sender.nickname
val senderId = message.sender.userId
val msg = message.rawMessage
val groupId = message.groupId
2024-09-19 18:15:42 +08:00
val messageId = message.messageId
println("$sender($senderId: $groupId >>> $messageId): $msg")
2024-09-18 13:06:23 +08:00
2024-09-24 14:56:51 +08:00
if (message.rawMessage.contains("原神")) {
message.reply("你原神牛魔呢")
}
2024-09-23 17:18:25 +08:00
if (message.rawMessage.toList().any { it in arrayListOf('*', '-', '/', '+', '=') }) {
2024-09-21 16:03:28 +08:00
val calculateResult = CalculateCommand.parse(message.rawMessage)
calculateResult?.let { message.reply(calculateResult) }
}
2024-09-21 13:36:21 +08:00
2024-09-24 00:48:23 +08:00
ReverseGIFCommand.callback(message)
AsciiArtCommand.callback(message)
if (message.message.any { it.type == ArrayMessageType.reply }) { // Image url parse
val command = message.message.reversed().find { it.type == ArrayMessageType.text }!!.data.text!!
val replyId = message.message.find { it.type == ArrayMessageType.reply }!!.data.id!!
if (command.contains("图来") || command.contains("图链")) {
val getMsg = this.getMessage(replyId.toString().toLong())
ImageURLCommand.callback(message, getMsg)
}
}
2024-09-20 22:23:43 +08:00
coroutineScope.launch {
message.message.forEach {
if (it.type == ArrayMessageType.image) {
val filename = it.data.file!!.split("=").last() + ".png"
URI(it.data.file!!).toURL().openConnection().inputStream.use { input ->
File("./files/images/$filename").outputStream().use { output ->
output.write(input.readBytes())
}
}
}
}
}
2024-09-15 22:50:19 +08:00
if (message.rawMessage.startsWith("https://github.com/") || message.rawMessage.startsWith("git@github.com:")) {
GitHubParseCommand.parse(this, message)
}
2024-09-12 15:43:44 +08:00
if (message.rawMessage.startsWith("BV") ||
message.rawMessage.startsWith("https://www.bilibili.com") ||
2024-09-12 13:06:13 +08:00
message.rawMessage.contains("https://b23.tv/") ||
message.message.find { it.type == ArrayMessageType.json } != null
) {
// parse bilibili video with a link, bvid or b23.tv link
val bvid = if (message.rawMessage.startsWith("BV")) {
message.rawMessage
} else if (message.rawMessage.split(" ").last().startsWith("https://b23.tv/")) {
val shortUrl = message.rawMessage.split(" ").last()
2024-09-12 13:06:13 +08:00
BVParseCommand.getShortUrlBVID(shortUrl)
} else if (message.message.find { it.type == ArrayMessageType.json } != null) {
val card = message.message.find { it.type == ArrayMessageType.json }!!
.data.data!!.toString().fromJson<CardShare>()
val shortUrl = if (card.meta.detail == null) {
if (!card.meta.news?.tag!!.contains("哔哩哔哩")) return
card.meta.news.jumpUrl
} else {
if (!card.meta.detail.title.contains("哔哩哔哩")) return
card.meta.detail.qqDocUrl
}
2024-09-12 13:06:13 +08:00
BVParseCommand.getShortUrlBVID(shortUrl)
} else {
2024-09-24 00:48:23 +08:00
message.rawMessage.split("?").first()
.split("/")
.last { it.isNotEmpty() && it.isNotBlank() }
}
BVParseCommand.parse(this, bvid, message)
2024-09-06 10:58:55 +08:00
}
2024-08-27 18:44:32 +08:00
}
2024-09-07 18:07:56 +08:00
override suspend fun onGroupMessageRevoke(message: GroupRevokeMessage) {
2024-09-18 13:06:23 +08:00
if (!configManager.enableAntiRevoke) return
2024-09-02 11:30:58 +08:00
val msg = MessageChain.Builder()
.addText("用户: ${message.userId} 被: ${message.operatorId} 撤回了一条消息")
.addNewLine()
.addText("使用/revoke ${message.messageId} 来获取被撤回的消息")
.build()
this.sendGroupMessage(message.groupId, msg)
}
2024-09-07 18:07:56 +08:00
override suspend fun onWebsocketErrorEvent(ex: Exception) {
2024-09-02 11:30:58 +08:00
ex.printStackTrace()
}
override suspend fun onAddFriendRequest(event: AddFriendRequest) {
event.approve()
}
2024-09-19 15:11:40 +08:00
override suspend fun onGroupFileUpload(event: FileEvent) {
event.saveTo("./files")
}
2024-09-20 22:03:56 +08:00
override suspend fun onLeaveEvent(groupId: Long, userId: Long, operator: Long, time: Long) {
val msg = MessageChain.Builder()
2024-09-25 16:01:15 +08:00
.addText("有人坐飞船离开了本星系~")
2024-09-20 22:03:56 +08:00
.addNewLine()
.addText("QQ: $userId | 操作者: ${if (operator == 0L) "主动退出" else operator}")
.addNewLine()
.addText("下次再见吧~~~")
.build()
this.sendGroupMessage(groupId, msg)
}
2024-08-29 14:36:06 +08:00
}
2024-09-19 15:11:40 +08:00
fun initFilesDir() {
2024-09-20 22:23:43 +08:00
File("./files/images").also { it.mkdirs() }
2024-09-19 15:11:40 +08:00
}
suspend fun main() {
2024-08-27 18:44:32 +08:00
val fancyBot = FancyBot()
2024-08-30 15:05:51 +08:00
val workType = configManager.wsType
val accessToken = configManager.accessToken
val rob = if (workType == WSType.Client) {
val address = configManager.wsAddress
ROneBotFactory.createClient(address, accessToken, fancyBot)
2024-09-22 21:45:26 +08:00
.also { it.addListeningGroups(*configManager.listeningGroups.toLongArray()) }
2024-08-30 15:05:51 +08:00
} else {
val port = configManager.wsPort
ROneBotFactory.createServer(port, accessToken, fancyBot)
2024-09-22 21:45:26 +08:00
.also { it.addListeningGroups(*configManager.listeningGroups.toLongArray()) }
2024-08-30 15:05:51 +08:00
}
initDatabase()
2024-09-19 15:11:40 +08:00
initFilesDir()
2024-09-03 21:38:50 +08:00
val commandManager = rob.commandManager
2024-09-03 14:37:00 +08:00
commands.forEach { commandManager.register(it) }
items.forEach { itemManager.register(it) }
2024-08-27 18:44:32 +08:00
}