feat: add more feature

This commit is contained in:
2024-10-31 21:32:42 +08:00
parent 2c0ca2f739
commit fac2d5491a
5 files changed
+153 -45

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
[versions] [versions]
kotlinVersion = "2.0.20" kotlinVersion = "2.0.20"
ronebotVersion = "2.2.1" ronebotVersion = "2.2.3"
shadowVersion = "8.3.0" shadowVersion = "8.3.0"
okhttpVersion = "5.0.0-alpha.14" okhttpVersion = "5.0.0-alpha.14"
exposedVersion = "0.53.0" exposedVersion = "0.53.0"
+47 -44
View File
@@ -14,6 +14,8 @@ import cn.rtast.fancybot.commands.misc.ScanQRCodeCommand
import cn.rtast.fancybot.commands.misc.ShortLinkCommand.Companion.makeShortLink import cn.rtast.fancybot.commands.misc.ShortLinkCommand.Companion.makeShortLink
import cn.rtast.fancybot.commands.parse.* import cn.rtast.fancybot.commands.parse.*
import cn.rtast.fancybot.commands.reply.ImageBedCommand import cn.rtast.fancybot.commands.reply.ImageBedCommand
import cn.rtast.fancybot.commands.reply.InvertImageCommand
import cn.rtast.fancybot.commands.reply.RandomRGBCommand
import cn.rtast.fancybot.commands.reply.SpeedUpGIFCommand import cn.rtast.fancybot.commands.reply.SpeedUpGIFCommand
import cn.rtast.fancybot.entity.nailong.NaiLongDetectPayload import cn.rtast.fancybot.entity.nailong.NaiLongDetectPayload
import cn.rtast.fancybot.entity.nailong.NaiLongDetectResponse import cn.rtast.fancybot.entity.nailong.NaiLongDetectResponse
@@ -119,53 +121,54 @@ class FancyBot : OneBotListener {
} }
if (message.message.any { it.type == ArrayMessageType.reply }) { if (message.message.any { it.type == ArrayMessageType.reply }) {
val command = message.message.reversed().find { it.type == ArrayMessageType.text }!!.data.text!! val command = message.text.trim()
val replyId = message.message.find { it.type == ArrayMessageType.reply }!!.data.id!! val replyId = message.message.find { it.type == ArrayMessageType.reply }!!.data.id!!
val getMsg = message.action.getMessage(replyId.toString().toLong()) val getMsg = message.action.getMessage(replyId.toString().toLong())
val plainTextContent = getMsg.message val plainTextContent = getMsg.text
.filter { it.type == ArrayMessageType.text } when (command) {
.joinToString { it.data.text!! } "/倒放", "/df" -> ReverseGIFCommand.reverse(message, getMsg)
if (command.contains("/倒放") || command.contains("/df")) ReverseGIFCommand.reverse(message, getMsg) "/图来", "/图链" -> ImageURLCommand.callback(message, getMsg)
if (command.contains("/图") || command.contains("/图链")) ImageURLCommand.callback(message, getMsg) "/图" -> ImageBedCommand.execute(getMsg, message)
if (command.contains("/图床")) ImageBedCommand.execute(getMsg, message) "/reaction" -> ReactionCommand.reaction(message.action, message.groupId, getMsg.messageId)
if (command.contains("/reaction")) ReactionCommand.reaction( "/sl", "/short" -> message.reply(plainTextContent.trim().makeShortLink())
message.action, "/rc", "/随机颜色" -> RandomRGBCommand.random(message, getMsg)
message.groupId, "/颜色反转", "/iv" -> InvertImageCommand.invert(message, getMsg)
getMsg.messageId "/ascii", "/asc" -> {
) val url = AsciiArtCommand.getImageUrl(getMsg)
if (command.contains("/sl") || command.contains("/short")) message.reply( val image = AsciiArtCommand.generateAsciiArt(url)
plainTextContent.trim().makeShortLink() message.reply(image)
) }
if (command.contains("/ascii") || command.contains("/asc")) {
val url = AsciiArtCommand.getImageUrl(getMsg) "/pb", "/pastebin" -> {
val image = AsciiArtCommand.generateAsciiArt(url) val pastebinUrl = PastebinCommand.createPastebin(plainTextContent)
message.reply(image) message.reply(pastebinUrl)
} }
if (command.contains("/pb") || command.contains("/pastebin")) {
val pastebinUrl = PastebinCommand.createPastebin(plainTextContent) "/加速" -> {
message.reply(pastebinUrl) val multiply = command.split("加速").last().toFloat()
} SpeedUpGIFCommand.speedUp(message, getMsg, multiply)
if (command.contains("/加速")) { }
val multiply = command.split("加速").last().toFloat()
SpeedUpGIFCommand.speedUp(message, getMsg, multiply) "/黑白", "/灰度" -> {
} val msg = MessageChain.Builder()
if (command.contains("/黑白")) { getMsg.message.filter { it.type == ArrayMessageType.image || it.type == ArrayMessageType.mface }
val msg = MessageChain.Builder() .forEach {
getMsg.message.filter { it.type == ArrayMessageType.image || it.type == ArrayMessageType.mface } val imgUrl = it.data.file!!
.forEach { val decoder = GifDecoder()
val imgUrl = it.data.file!! val imageStream = withContext(Dispatchers.IO) { imgUrl.toURL().openStream() }
val decoder = GifDecoder() decoder.read(imageStream)
val imageStream = withContext(Dispatchers.IO) { imgUrl.toURL().openStream() } if (decoder.frameCount == 0) {
decoder.read(imageStream) msg.addImage(
if (decoder.frameCount == 0) { imageStream.readBytes().toBufferedImage().toByteArray().encodeToBase64(), true
msg.addImage(imageStream.readBytes().toBufferedImage().toByteArray().encodeToBase64(), true) )
} else { } else {
val frames = (0 until decoder.frameCount).map { decoder.getFrame(it).toGrayscale() } val frames = (0 until decoder.frameCount).map { decoder.getFrame(it).toGrayscale() }
val base64 = decoder.makeGif(frames).encodeToBase64() val base64 = decoder.makeGif(frames).encodeToBase64()
msg.addImage(base64, true) msg.addImage(base64, true)
}
} }
} message.reply(msg.build())
message.reply(msg.build()) }
} }
} }
@@ -0,0 +1,31 @@
/*
* Copyright © 2024 RTAkland
* Author: RTAkland
* Date: 2024/10/31
*/
package cn.rtast.fancybot.commands.reply
import cn.rtast.fancybot.util.misc.invertColor
import cn.rtast.fancybot.util.misc.toBufferedImage
import cn.rtast.fancybot.util.misc.toByteArray
import cn.rtast.fancybot.util.misc.toURL
import cn.rtast.fancybot.util.str.encodeToBase64
import cn.rtast.rob.entity.GetMessage
import cn.rtast.rob.entity.GroupMessage
import cn.rtast.rob.entity.images
import cn.rtast.rob.util.ob.MessageChain
object InvertImageCommand {
suspend fun invert(message: GroupMessage, getMsg: GetMessage.Message) {
val msg = MessageChain.Builder()
getMsg.images.forEach {
val img = it.file.toURL().readBytes().toBufferedImage()
.invertColor().toByteArray().encodeToBase64()
msg.addImage(img, true)
}
message.reply(msg.build())
}
}
@@ -0,0 +1,33 @@
/*
* Copyright © 2024 RTAkland
* Author: RTAkland
* Date: 2024/10/31
*/
package cn.rtast.fancybot.commands.reply
import cn.rtast.fancybot.util.misc.randomColor
import cn.rtast.fancybot.util.misc.toBufferedImage
import cn.rtast.fancybot.util.misc.toByteArray
import cn.rtast.fancybot.util.misc.toURL
import cn.rtast.fancybot.util.str.encodeToBase64
import cn.rtast.rob.entity.GetMessage
import cn.rtast.rob.entity.GroupMessage
import cn.rtast.rob.entity.images
import cn.rtast.rob.util.ob.MessageChain
object RandomRGBCommand {
suspend fun random(message: GroupMessage, getMsg: GetMessage.Message) {
val msg = MessageChain.Builder()
getMsg.images.forEach {
msg.addImage(
it.file.toURL().readBytes().toBufferedImage()
.randomColor().toByteArray().encodeToBase64(),
true
)
}
message.reply(msg.build())
}
}
@@ -16,6 +16,7 @@ import java.awt.image.BufferedImage
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import javax.imageio.ImageIO import javax.imageio.ImageIO
import kotlin.random.Random
private fun BufferedImage.getScaledWidth(maxWidth: Double, maxHeight: Double): Pair<Int, Int> { private fun BufferedImage.getScaledWidth(maxWidth: Double, maxHeight: Double): Pair<Int, Int> {
@@ -146,3 +147,43 @@ fun BufferedImage.toGrayscale(): BufferedImage {
} }
return grayscaleImage return grayscaleImage
} }
fun BufferedImage.invertColor(): BufferedImage {
val width = this.width
val height = this.height
for (x in 0 until width) {
for (y in 0 until height) {
val rgba = this.getRGB(x, y)
val a = rgba shr 24 and 0xff
val r = 255 - (rgba shr 16 and 0xff)
val g = 255 - (rgba shr 8 and 0xff)
val b = 255 - (rgba and 0xff)
val invertedColor = (a shl 24) or (r shl 16) or (g shl 8) or b
this.setRGB(x, y, invertedColor)
}
}
return this
}
fun BufferedImage.randomColor(): BufferedImage {
val width = this.width
val height = this.height
for (x in 0 until width) {
for (y in 0 until height) {
val rgba = this.getRGB(x, y)
val a = (rgba shr 24) and 0xff
val r = (rgba shr 16) and 0xff
val g = (rgba shr 8) and 0xff
val b = rgba and 0xff
if (a < 255 || (r == 255 && g == 255 && b == 255) || (r == 0 && g == 0 && b == 0)) {
continue
}
val newR = Random.nextInt(256)
val newG = Random.nextInt(256)
val newB = Random.nextInt(256)
val randomColor = (a shl 24) or (newR shl 16) or (newG shl 8) or newB
this.setRGB(x, y, randomColor)
}
}
return this
}