mirai/mirai-demos/mirai-demo-1/src/main/java/demo/subscribe/SubscribeSamples.kt

267 lines
8.4 KiB
Kotlin
Raw Normal View History

2019-10-19 23:19:45 +08:00
@file:Suppress("EXPERIMENTAL_UNSIGNED_LITERALS", "EXPERIMENTAL_API_USAGE")
2019-10-27 03:36:26 +08:00
package demo.subscribe
2019-09-27 22:44:00 +08:00
2019-10-24 15:02:57 +08:00
import kotlinx.coroutines.delay
import kotlinx.coroutines.withTimeoutOrNull
2019-09-27 22:44:00 +08:00
import net.mamoe.mirai.Bot
2019-10-22 20:08:08 +08:00
import net.mamoe.mirai.BotAccount
2019-11-25 14:05:09 +08:00
import net.mamoe.mirai.alsoLogin
2019-10-28 14:27:29 +08:00
import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.contact.sendMessage
2019-10-27 03:36:26 +08:00
import net.mamoe.mirai.event.*
import net.mamoe.mirai.message.*
2019-12-17 11:04:04 +08:00
import net.mamoe.mirai.network.protocol.timpc.packet.action.uploadImage
import net.mamoe.mirai.network.protocol.timpc.packet.event.FriendMessage
import net.mamoe.mirai.network.protocol.timpc.packet.event.GroupMessage
2019-11-01 20:03:43 +08:00
import net.mamoe.mirai.utils.suspendToExternalImage
import java.io.File
private fun readTestAccount(): BotAccount? {
val file = File("testAccount.txt")
if (!file.exists() || !file.canRead()) {
return null
}
val lines = file.readLines()
return try {
2019-10-19 23:19:45 +08:00
BotAccount(lines[0].toUInt(), lines[1])
} catch (e: IndexOutOfBoundsException) {
null
}
}
2019-09-27 22:44:00 +08:00
2019-10-30 23:00:29 +08:00
@Suppress("UNUSED_VARIABLE")
suspend fun main() {
val bot = Bot(
readTestAccount() ?: BotAccount(//填写你的账号
id = 1994701121u,
password = "123456"
)
2019-11-25 14:05:09 +08:00
).alsoLogin {
// 覆盖默认的配置
2019-10-30 23:00:29 +08:00
randomDeviceName = false
2019-11-01 09:44:12 +08:00
}
2019-10-30 23:00:29 +08:00
bot.messageDSL()
directlySubscribe(bot)
//DSL 监听
2019-11-08 19:21:29 +08:00
subscribeAll<FriendMessage> {
2019-10-30 23:00:29 +08:00
always {
//获取第一个纯文本消息
val firstText = it.message.firstOrNull<PlainText>()
}
}
demo2()
bot.network.awaitDisconnection()//等到直到断开连接
}
2019-10-27 03:36:26 +08:00
/**
* 使用 dsl 监听消息事件
*
* @see subscribeFriendMessages
* @see subscribeMessages
* @see subscribeGroupMessages
*
* @see MessageSubscribersBuilder
*/
suspend fun Bot.messageDSL() {
2019-10-28 14:27:29 +08:00
// 监听这个 bot 的来自所有群和好友的消息
this.subscribeMessages {
// 当接收到消息 == "你好" 时就回复 "你好!"
2019-10-27 17:27:57 +08:00
"你好" reply "你好!"
2019-10-27 03:36:26 +08:00
2019-11-16 02:30:15 +08:00
// 当消息 == "查看 subject" 时, 执行 lambda
2019-10-28 14:27:29 +08:00
case("查看 subject") {
if (subject is QQ) {
reply("消息主体为 QQ, 你在跟发私聊消息")
} else {
reply("消息主体为 Group, 你在群里发消息")
}
// 在回复的时候, 一般使用 subject 来作为回复对象.
// 因为当群消息时, subject 为这个群.
// 当好友消息时, subject 为这个好友.
2019-11-08 19:52:11 +08:00
// 所有在 MessagePacket(也就是此时的 this 指代的对象) 中实现的扩展方法, 如刚刚的 "reply", 都是以 subject 作为目标
2019-10-28 14:27:29 +08:00
}
// 当消息里面包含这个类型的消息时
2019-10-27 03:36:26 +08:00
has<Image> {
2019-11-08 19:52:11 +08:00
// this: MessagePacket
2019-10-27 03:36:26 +08:00
// message: MessageChain
// sender: QQ
// it: String (MessageChain.toString)
2019-11-28 12:44:47 +08:00
message[Image].download()
2019-11-08 19:21:29 +08:00
if (this is GroupMessage) {
2019-10-27 03:36:26 +08:00
//如果是群消息
// group: Group
this.group.sendMessage("你在一个群里")
2019-11-16 13:05:56 +08:00
// 等同于 reply("你在一个群里")
2019-10-27 03:36:26 +08:00
}
2019-09-27 22:44:00 +08:00
2019-10-28 14:27:29 +08:00
reply("图片, ID= ${message[Image].id}")//获取第一个 Image 类型的消息
2019-10-27 03:36:26 +08:00
reply(message)
}
2019-10-28 14:27:29 +08:00
"123" containsReply "你的消息里面包含 123"
// 当收到 "我的qq" 就执行 lambda 并回复 lambda 的返回值 String
2019-11-28 12:44:47 +08:00
"我的qq" reply { sender.id }
2019-10-27 03:36:26 +08:00
2019-10-28 14:27:29 +08:00
// 如果是这个 QQ 号发送的消息(可以是好友消息也可以是群消息)
2019-12-04 12:53:30 +08:00
sentBy(123456789) {
2019-10-27 03:36:26 +08:00
}
2019-10-28 14:27:29 +08:00
// 当消息前缀为 "我是" 时
startsWith("我是", removePrefix = true) {
// it: 删除了消息前缀 "我是" 后的消息
// 如一条消息为 "我是张三", 则此时的 it 为 "张三".
reply("你是$it")
}
// 当消息中包含 "复读" 时
2019-10-27 03:36:26 +08:00
contains("复读") {
reply(message)
}
2019-10-28 14:27:29 +08:00
// 自定义的 filter, filter 中 it 为转为 String 的消息.
// 也可以用任何能在处理时使用的变量, 如 subject, sender, message
content({ it.length == 3 }) {
reply("你发送了长度为 3 的消息")
}
2019-10-27 03:36:26 +08:00
case("上传好友图片") {
2019-10-28 14:27:29 +08:00
val filename = it.substringAfter("上传好友图片")
File("C:\\Users\\Him18\\Desktop\\$filename").sendAsImageTo(subject)
2019-10-27 03:36:26 +08:00
}
2019-09-27 22:44:00 +08:00
2019-10-27 03:36:26 +08:00
case("上传群图片") {
2019-10-28 14:27:29 +08:00
val filename = it.substringAfter("上传好友图片")
File("C:\\Users\\Him18\\Desktop\\$filename").sendAsImageTo(subject)
2019-10-21 01:21:24 +08:00
}
}
2019-10-27 03:36:26 +08:00
subscribeMessages {
case("你好") {
2019-11-08 19:52:11 +08:00
// this: MessagePacket
2019-10-27 03:36:26 +08:00
// message: MessageChain
// sender: QQ
// it: String (来自 MessageChain.toString)
// group: Group (如果是群消息)
reply("你好")
}
}
subscribeFriendMessages {
contains("A") {
2019-11-08 19:52:11 +08:00
// this: FriendMessage
2019-10-27 03:36:26 +08:00
// message: MessageChain
// sender: QQ
// it: String (来自 MessageChain.toString)
reply("B")
}
}
subscribeGroupMessages {
2019-11-08 19:52:11 +08:00
// this: FriendMessage
2019-10-27 03:36:26 +08:00
// message: MessageChain
// sender: QQ
// it: String (来自 MessageChain.toString)
// group: Group
}
}
/**
* 监听单个事件
*/
@Suppress("UNUSED_VARIABLE")
suspend fun directlySubscribe(bot: Bot) {
// 手动处理消息
2019-10-24 15:02:57 +08:00
// 使用 Bot 的扩展方法监听, 将在处理事件时得到一个 this: Bot.
2019-10-27 03:36:26 +08:00
// 这样可以调用 Bot 内的一些扩展方法如 UInt.qq():QQ
2019-11-08 19:21:29 +08:00
bot.subscribeAlways<FriendMessage> {
2019-10-24 15:02:57 +08:00
// this: Bot
// it: FriendMessageEvent
// 获取第一个纯文本消息, 获取不到会抛出 NoSuchElementException
// val firstText = it.message.first<PlainText>()
2019-10-27 03:36:26 +08:00
2019-10-19 11:59:08 +08:00
val firstText = it.message.firstOrNull<PlainText>()
2019-09-27 22:44:00 +08:00
2019-10-24 15:02:57 +08:00
// 获取第一个图片
2019-10-13 20:19:54 +08:00
val firstImage = it.message.firstOrNull<Image>()
2019-09-27 22:44:00 +08:00
when {
2019-09-28 00:17:52 +08:00
it.message eq "你好" -> it.reply("你好!")
2019-09-27 22:44:00 +08:00
2019-09-28 00:11:59 +08:00
"复读" in it.message -> it.sender.sendMessage(it.message)
2019-09-27 22:44:00 +08:00
2019-10-24 15:02:57 +08:00
"发群消息" in it.message -> 580266363u.group().sendMessage(it.message.toString().substringAfter("发群消息"))
2019-10-19 23:19:45 +08:00
2019-10-21 01:21:24 +08:00
"上传群图片" in it.message -> withTimeoutOrNull(5000) {
2019-10-26 15:54:02 +08:00
val filename = it.message.toString().substringAfter("上传群图片")
2019-10-24 15:02:57 +08:00
val image = File(
2019-10-26 15:54:02 +08:00
"C:\\Users\\Him18\\Desktop\\$filename"
2019-11-01 20:03:43 +08:00
).suspendToExternalImage()
2019-10-26 15:54:02 +08:00
920503456u.group().uploadImage(image)
2019-10-20 22:01:50 +08:00
it.reply(image.groupImageId.value)
2019-10-26 15:54:02 +08:00
delay(100)
920503456u.group().sendMessage(Image(image.groupImageId))
2019-10-20 21:27:59 +08:00
}
"发群图片" in it.message -> {
2019-10-26 15:54:02 +08:00
920503456u.group().sendMessage(Image(ImageId(it.message.toString().substringAfter("发群图片"))))
2019-10-20 21:27:59 +08:00
}
"发好友图片" in it.message -> {
it.reply(Image(ImageId(it.message.toString().substringAfter("发好友图片"))))
2019-10-20 19:30:17 +08:00
}
2019-10-13 20:19:54 +08:00
/*it.event eq "发图片群" -> sendGroupMessage(Group(session.bot, 580266363), PlainText("test") + UnsolvedImage(File("C:\\Users\\Him18\\Desktop\\faceImage_1559564477775.jpg")).also { image ->
2019-09-30 03:08:29 +08:00
image.upload(session, Group(session.bot, 580266363)).of()
2019-09-27 22:44:00 +08:00
})*/
2019-10-24 15:02:57 +08:00
it.message eq "发图片群2" -> 580266363u.group().sendMessage(Image(ImageId("{7AA4B3AA-8C3C-0F45-2D9B-7F302A0ACEAA}.jpg")))
2019-09-27 22:44:00 +08:00
2019-10-27 03:36:26 +08:00
/* it.event eq "发图片" -> sendFriendMessage(it.sentBy, PlainText("test") + UnsolvedImage(File("C:\\Users\\Him18\\Desktop\\faceImage_1559564477775.jpg")).also { image ->
image.upload(session, it.sentBy).of()
2019-09-27 22:44:00 +08:00
})*/
2019-10-19 23:19:45 +08:00
it.message eq "发图片2" -> it.reply(PlainText("test") + Image(ImageId("{7AA4B3AA-8C3C-0F45-2D9B-7F302A0ACEAA}.jpg")))
2019-10-24 15:02:57 +08:00
else -> {
}
2019-09-27 22:44:00 +08:00
}
}
2019-10-27 03:36:26 +08:00
}
2019-10-02 19:13:09 +08:00
/**
* 实现功能:
* 对机器人说 "记笔记", 机器人记录之后的所有消息.
* 对机器人说 "停止", 机器人停止
*/
suspend fun demo2() {
2019-11-08 19:21:29 +08:00
subscribeAlways<FriendMessage> { event ->
2019-10-02 19:13:09 +08:00
if (event.message eq "记笔记") {
2019-11-08 19:21:29 +08:00
subscribeUntilFalse<FriendMessage> {
2019-10-02 19:13:09 +08:00
it.reply("你发送了 ${it.message}")
it.message eq "停止"
}
}
}
2019-09-27 22:44:00 +08:00
}