Skip to content

Commit a298af4

Browse files
committed
update code
1 parent 43144dd commit a298af4

File tree

7 files changed

+249
-11
lines changed

7 files changed

+249
-11
lines changed

CHANGELOG.MD

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
- 增加喝水小助手
88
- 增加虚度光阴小助手
99

10-
1.0.2-SNAPSHOT (UNDER DEVELOPMENT)
10+
1.0.2-SNAPSHOT
1111
- 增加聊天记录存储功能
1212
- 先上线积累数据,龙王功能放到下个版本
1313

14-
1.0.3-SNAPSHOT (UNDER WAY)
14+
1.0.3-SNAPSHOT (UNDER DEVELOPMENT)
1515
- 增加龙王功能
1616
- 增加涩图功能(公交车)
1717
- 增加 NSFW 功能

izumi_config.template.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,11 @@ enabledTimers: [
3030

3131
# db filename
3232
dbFilename: izumi.sqlite
33+
34+
# ColorImage 服务需要的配置
35+
colorImageKey: 11223344
36+
37+
# SOCKS5 代理配置
38+
useProxy: true
39+
proxyIp: 127.0.0.1
40+
proxyPort: 9050

src/main/kotlin/me/lightless/izumi/Constant.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ object Constant {
66
const val PIPELINE_PACKAGE_NAME = "me.lightless.izumi.plugin.pipeline.impl"
77
const val TIMER_PACKAGE_NAME = "me.lightless.izumi.plugin.timer.impl"
88

9+
const val COLOR_IMAGE_API = "https://api.lolicon.app/setu/?size1200=true"
910
}

src/main/kotlin/me/lightless/izumi/config/BotConfig.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,12 @@ class BotConfig {
2323
// DB 的文件路径,未来需要支持更多的数据库类型
2424
// 目前仅支持 SQLite
2525
lateinit var dbFilename: String
26+
27+
// ColorImage 需要的配置
28+
lateinit var colorImageKey: String
29+
30+
// socks5 代理配置
31+
var useProxy by Delegates.notNull<Boolean>()
32+
lateinit var proxyIp: String
33+
var proxyPort by Delegates.notNull<Int>()
2634
}

src/main/kotlin/me/lightless/izumi/plugin/command/ICommand.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ interface ICommand {
1010
val logger: Logger
1111
val command: List<String>
1212

13-
suspend fun handler(cmd: String, groupMessage: GroupMessageEvent)
13+
suspend fun handler(cmd: String, event: GroupMessageEvent)
1414

1515
fun checkRole(qq: Long): Boolean
1616

Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
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("\nColorImageKey配置错误, 请联系 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("\nR18 开关已打开,请谨慎看图!")
134+
})
135+
}
136+
in listOf("off", "disable", "false") -> {
137+
this.r18switch = false
138+
event.group.sendMessage(buildMessageChain {
139+
add(At(event.sender))
140+
add("\nR18 开关已关闭!")
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("\nNSFW 开关已开启!")
165+
})
166+
}
167+
in listOf("off", "disable", "false") -> {
168+
this.r18switch = false
169+
event.group.sendMessage(buildMessageChain {
170+
add(At(event.sender))
171+
add("\nNSFW 开关已关闭, 请谨慎看图!")
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 查看:\nhttps://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+
}

src/main/kotlin/me/lightless/izumi/plugin/timer/impl/Ryuo.kt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,3 @@ class Ryuo : ITimer {
8787
}
8888
}
8989
}
90-
91-
//fun main() {
92-
// val today = LocalDate.now(DateTimeZone.forOffsetHours(8))
93-
// println(today.toString())
94-
//
95-
// val yesterday = today.minusDays(1)
96-
// println(yesterday.toString())
97-
//}

0 commit comments

Comments
 (0)