1+ package me.lightless.izumi.plugin.command.impl
2+
3+ import io.ktor.client.*
4+ import io.ktor.client.call.*
5+ import io.ktor.client.engine.*
6+ import io.ktor.client.engine.okhttp.*
7+ import io.ktor.client.features.*
8+ import io.ktor.client.request.*
9+ import io.ktor.client.statement.*
10+ import io.ktor.util.*
11+ import kotlinx.coroutines.Dispatchers
12+ import kotlinx.coroutines.withContext
13+ import me.lightless.izumi.ApplicationContext
14+ import me.lightless.izumi.Constant
15+ import me.lightless.izumi.plugin.command.ICommand
16+ import net.mamoe.mirai.event.events.GroupMessageEvent
17+ import net.mamoe.mirai.message.data.At
18+ import net.mamoe.mirai.message.data.buildMessageChain
19+ import org.slf4j.Logger
20+ import org.slf4j.LoggerFactory
21+ import java.awt.image.BufferedImage
22+ import java.io.InputStream
23+ import javax.imageio.ImageIO
24+
25+ @Suppress(" unused" )
26+ class ColorImage : ICommand {
27+ override val commandName: String
28+ get() = " color_image"
29+ override val logger: Logger
30+ get() = LoggerFactory .getLogger(javaClass)
31+ override val command: List <String >
32+ get() = listOf (" /chong" , " /c" , " /kkp" , " /bgs" , " /bugouse" , " /r18" , " /nsfw" )
33+
34+ private val r18Commands = listOf (" /r18" )
35+ private val nsfwCommands = listOf (" /nsfw" )
36+ private val showRawImageCommands = listOf (" /kkp" , " /bgs" , " /bugouse" )
37+
38+ private var r18switch = false
39+ private var nsfwSwitch = true
40+
41+ private var latestImageUrl: String? = null
42+ private var latestImagePixivId: Long? = null
43+
44+ override suspend fun handler (cmd : String , event : GroupMessageEvent ) {
45+ this .logger.debug(" $commandName called!" )
46+
47+ // 检查 key 的配置
48+ val colorImageKey = ApplicationContext .botConfig?.colorImageKey
49+ if (colorImageKey == null ) {
50+ this .logger.warn(" no `colorImageKey` in config file..." )
51+ event.group.sendMessage(buildMessageChain {
52+ add(At (event.sender))
53+ add(" \n ColorImageKey配置错误, 请联系 Bot 维护人员!" )
54+ })
55+ return
56+ }
57+
58+ // 解析命令参数
59+ val message = event.message.contentToString()
60+ val msgList = message.split(""" \s+""" .toRegex())
61+ val arg = msgList.getOrNull(1 )
62+
63+ // 处理开关
64+ if (cmd in r18Commands) {
65+ processR18(arg, event)
66+ return
67+ }
68+
69+ if (cmd in nsfwCommands) {
70+ processNSFW(arg, event)
71+ return
72+ }
73+
74+ // 用户是否要求高清图
75+ if (cmd in showRawImageCommands) {
76+ processShowRawImageRequest(event)
77+ return
78+ }
79+
80+ // 发图
81+
82+
83+ }
84+
85+ override fun checkRole (qq : Long ): Boolean {
86+ // 任何人都可以使用这个命令
87+ return true
88+ }
89+
90+ @KtorExperimentalAPI
91+ private fun getHttpClient (): HttpClient {
92+ val botConfig = ApplicationContext .botConfig
93+ val useProxy = botConfig?.useProxy
94+ if (useProxy == null ) {
95+ // 不是用代理,返回一个正常的client
96+ return HttpClient (OkHttp ) {
97+ CurlUserAgent ()
98+ }
99+ } else {
100+ // 代理的情况,从配置文件中读取代理
101+ val proxyIp = botConfig.proxyIp
102+ val proxyPort = botConfig.proxyPort
103+ val socksProxy = ProxyBuilder .socks(host = proxyIp, port = proxyPort)
104+ return HttpClient (OkHttp ) {
105+ CurlUserAgent ()
106+ engine {
107+ proxy = socksProxy
108+ }
109+ }
110+ }
111+ }
112+
113+ @KtorExperimentalAPI
114+ private suspend fun getImage (url : String ): BufferedImage ? {
115+ val client = getHttpClient()
116+ val response = client.use {
117+ it.get<HttpResponse >(url)
118+ }
119+
120+ val result = withContext(Dispatchers .IO ) {
121+ return @withContext ImageIO .read(response.receive<InputStream >())
122+ }
123+
124+ return null
125+ }
126+
127+ private suspend fun processR18 (arg : String? , event : GroupMessageEvent ) {
128+ when (arg) {
129+ in listOf (" on" , " enable" , " true" ) -> {
130+ this .r18switch = true
131+ event.group.sendMessage(buildMessageChain {
132+ add(At (event.sender))
133+ add(" \n R18 开关已打开,请谨慎看图!" )
134+ })
135+ }
136+ in listOf (" off" , " disable" , " false" ) -> {
137+ this .r18switch = false
138+ event.group.sendMessage(buildMessageChain {
139+ add(At (event.sender))
140+ add(" \n R18 开关已关闭!" )
141+ })
142+ }
143+ in listOf (" status" ) -> {
144+ event.group.sendMessage(buildMessageChain {
145+ add(At (event.sender))
146+ add(" \n 当前 R18 开关状态:${this @ColorImage.r18switch} " )
147+ })
148+ }
149+ else -> {
150+ event.group.sendMessage(buildMessageChain {
151+ add(At (event.sender))
152+ add(" \n ???你在说什么?" )
153+ })
154+ }
155+ }
156+ }
157+
158+ private suspend fun processNSFW (arg : String? , event : GroupMessageEvent ) {
159+ when (arg) {
160+ in listOf (" on" , " enable" , " true" ) -> {
161+ this .nsfwSwitch = true
162+ event.group.sendMessage(buildMessageChain {
163+ add(At (event.sender))
164+ add(" \n NSFW 开关已开启!" )
165+ })
166+ }
167+ in listOf (" off" , " disable" , " false" ) -> {
168+ this .r18switch = false
169+ event.group.sendMessage(buildMessageChain {
170+ add(At (event.sender))
171+ add(" \n NSFW 开关已关闭, 请谨慎看图!" )
172+ })
173+ }
174+ in listOf (" status" ) -> {
175+ event.group.sendMessage(buildMessageChain {
176+ add(At (event.sender))
177+ add(" \n 当前 NSFW 开关状态:${this @ColorImage.nsfwSwitch} " )
178+ })
179+ }
180+ else -> {
181+ event.group.sendMessage(buildMessageChain {
182+ add(At (event.sender))
183+ add(" \n ???你在说什么?" )
184+ })
185+ }
186+ }
187+ }
188+
189+ private fun buildURL (arg : String? , colorKey : String ): String {
190+ var url = " ${Constant .COLOR_IMAGE_API } &apikey=${colorKey} "
191+ url = if (this .r18switch) {
192+ " ${url} &r18=1"
193+ } else {
194+ " ${url} &r18=0"
195+ }
196+
197+ if (arg != null ) {
198+ url = " ${url} &keyword=$arg "
199+ }
200+
201+ return url
202+ }
203+
204+ private suspend fun processShowRawImageRequest (event : GroupMessageEvent ) {
205+ if (latestImageUrl == null ) {
206+ event.group.sendMessage(buildMessageChain {
207+ add(At (event.sender))
208+ add(" \n ???" )
209+ })
210+ } else {
211+ if (this .nsfwSwitch) {
212+ event.group.sendMessage(buildMessageChain {
213+ add(At (event.sender))
214+ add(" \n 由于 NSFW 开关已开启,暂时屏蔽涩图,请移步 pixiv 查看:\n https://www.pixiv.net/artworks/$latestImagePixivId " )
215+ })
216+ } else {
217+ // val image = getImage(latestImageUrl)
218+ // if (image != null) {
219+ // event.group.sendImage(image)
220+ // } else {
221+ // event.group.sendMessage(buildMessageChain {
222+ // add(At(event.sender))
223+ // add("\n出错了喵,换一张看吧...pixiv id: $latestImagePixivId")
224+ // })
225+ // }
226+ }
227+ }
228+ }
229+ }
0 commit comments