mirai/mirai-demos/mirai-demo-1/src/main/java/demo1/Main.kt

162 lines
6.3 KiB
Kotlin
Raw Normal View History

2019-10-19 23:19:45 +08:00
@file:Suppress("EXPERIMENTAL_UNSIGNED_LITERALS", "EXPERIMENTAL_API_USAGE")
2019-09-27 22:44:00 +08:00
package demo1
import kotlinx.coroutines.*
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-09-27 22:44:00 +08:00
import net.mamoe.mirai.contact.Group
2019-10-19 23:19:45 +08:00
import net.mamoe.mirai.contact.QQ
2019-10-09 16:42:37 +08:00
import net.mamoe.mirai.event.events.FriendMessageEvent
import net.mamoe.mirai.event.events.GroupMessageEvent
2019-10-02 19:13:09 +08:00
import net.mamoe.mirai.event.subscribeAll
import net.mamoe.mirai.event.subscribeAlways
import net.mamoe.mirai.event.subscribeUntilFalse
2019-10-03 13:56:01 +08:00
import net.mamoe.mirai.login
2019-10-09 20:22:53 +08:00
import net.mamoe.mirai.message.Image
2019-10-19 23:19:45 +08:00
import net.mamoe.mirai.message.ImageId
2019-10-09 20:22:53 +08:00
import net.mamoe.mirai.message.PlainText
2019-10-22 20:08:08 +08:00
import net.mamoe.mirai.network.protocol.tim.packet.OutgoingRawPacket
2019-10-13 20:19:54 +08:00
import net.mamoe.mirai.network.protocol.tim.packet.login.LoginResult
2019-10-19 23:19:45 +08:00
import net.mamoe.mirai.network.protocol.tim.packet.uploadImage
import net.mamoe.mirai.network.session
import net.mamoe.mirai.qqAccount
import net.mamoe.mirai.utils.*
2019-10-22 20:08:08 +08:00
import net.mamoe.mirai.utils.io.toUHexString
import java.io.File
2019-10-19 23:19:45 +08:00
import javax.imageio.ImageIO
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
@Suppress("UNUSED_VARIABLE")
suspend fun main() = coroutineScope {
val bot = Bot(readTestAccount() ?: BotAccount(//填写你的账号
2019-10-19 23:19:45 +08:00
account = 1994701121u,
2019-10-19 11:59:08 +08:00
password = "123456"
), PlatformLogger())
2019-09-27 22:44:00 +08:00
2019-10-13 20:19:54 +08:00
bot.login {
randomDeviceName = false
2019-10-13 20:19:54 +08:00
}.let {
if (it != LoginResult.SUCCESS) {
MiraiLogger.logError("Login failed: " + it.name)
2019-10-16 22:33:02 +08:00
bot.close()
2019-10-03 19:32:58 +08:00
}
2019-09-27 22:44:00 +08:00
}
2019-10-21 01:21:24 +08:00
subscribeAlways<GroupMessageEvent> {
if (it.message eq "复读" && it.group.groupId == 580266363u) {
it.reply(it.message)
}
}
2019-10-09 17:40:39 +08:00
//提供泛型以监听事件
2019-10-19 11:59:08 +08:00
subscribeAlways<FriendMessageEvent> {
2019-10-13 20:19:54 +08:00
//获取第一个纯文本消息, 获取不到会抛出 NoSuchElementException
2019-10-19 11:59:08 +08:00
//val firstText = it.message.first<PlainText>()
val firstText = it.message.firstOrNull<PlainText>()
2019-09-27 22:44:00 +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-21 01:21:24 +08:00
"发群消息" in it.message -> Group(bot, 580266363u).sendMessage(it.message.toString().substringAfter("发群消息"))
2019-10-19 23:19:45 +08:00
"直接发送包" in it.message -> {
val d = ("01 " + 1994701021u.toByteArray().toUHexString() + " 3E 03 3F A2 00 00 02 BB 00 0A 00 01 00 01 00 5E 4F 53 52 6F 6F 74 3A 43 3A 5C 55 73 65 72 73 5C 48 69 6D 31 38 5C 44 6F 63 75 6D 65 6E 74 73 5C 54 65 6E 63 65 6E 74 20 46 69 6C 65 73 5C 31 30 34 30 34 30 30 32 39 30 5C 49 6D 61 67 65 5C 43 32 43 5C 7B 47 47 42 7E 49 31 5A 4D 43 28 25 49 4D 5A 5F 47 55 51 36 35 5D 51 2E 6A 70 67 00 00 04 7D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 35 02")
.hexToBytes()
2019-10-22 20:08:08 +08:00
it.bot.network.socket.sendPacket(OutgoingRawPacket(0x01_BDu, it.bot.qqAccount, "00 00 00 01 2E 01 00 00 69 35".hexToBytes(), it.bot.network.session.sessionKey, d))
2019-10-19 23:19:45 +08:00
}
2019-10-14 14:19:45 +08:00
2019-10-21 01:21:24 +08:00
"上传好友图片" in it.message -> withTimeoutOrNull(5000) {
2019-10-20 19:30:17 +08:00
val id = QQ(bot, 1040400290u)
2019-10-21 01:41:33 +08:00
.uploadImage(withContext(Dispatchers.IO) { ImageIO.read(File("C:\\Users\\Him18\\Desktop\\${it.message.toString().substringAfter("上传好友图片")}").inputStream()) }.toMiraiImage("gif"))
2019-10-19 23:19:45 +08:00
it.reply(id.value)
delay(1000)
it.reply(Image(id))
2019-09-27 22:44:00 +08:00
}
2019-10-21 01:21:24 +08:00
"上传群图片" in it.message -> withTimeoutOrNull(5000) {
2019-10-21 01:41:33 +08:00
val image = withContext(Dispatchers.IO) { ImageIO.read(File("C:\\Users\\Him18\\Desktop\\${it.message.toString().substringAfter("上传群图片")}").inputStream()) }.toMiraiImage("gif")
2019-10-20 19:30:17 +08:00
Group(bot, 580266363u).uploadImage(image)
2019-10-20 22:01:50 +08:00
it.reply(image.groupImageId.value)
2019-10-20 19:30:17 +08:00
delay(1000)
2019-10-20 22:01:50 +08:00
Group(bot, 580266363u).sendMessage(Image(image.groupImageId))
2019-10-20 21:27:59 +08:00
}
"发群图片" in it.message -> {
2019-10-21 01:21:24 +08:00
Group(bot, 580266363u).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-19 23:19:45 +08:00
it.message eq "发图片群2" -> Group(bot, 580266363u).sendMessage(Image(ImageId("{7AA4B3AA-8C3C-0F45-2D9B-7F302A0ACEAA}.jpg")))
2019-09-27 22:44:00 +08:00
2019-10-13 20:19:54 +08:00
/* it.event eq "发图片" -> sendFriendMessage(it.sender, PlainText("test") + UnsolvedImage(File("C:\\Users\\Him18\\Desktop\\faceImage_1559564477775.jpg")).also { image ->
2019-09-30 03:08:29 +08:00
image.upload(session, it.sender).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-09-27 22:44:00 +08:00
}
}
2019-10-15 19:02:57 +08:00
//通过 KClass 扩展方式监听事件(不推荐)
2019-10-02 19:13:09 +08:00
GroupMessageEvent::class.subscribeAlways {
2019-09-27 22:44:00 +08:00
when {
2019-09-28 00:11:59 +08:00
it.message.contains("复读") -> it.reply(it.message)
2019-09-27 22:44:00 +08:00
}
}
2019-10-09 17:40:39 +08:00
//DSL 监听
2019-10-15 19:02:57 +08:00
subscribeAll<FriendMessageEvent> {
2019-10-09 17:40:39 +08:00
always {
//获取第一个纯文本消息
2019-10-18 18:42:45 +08:00
val firstText = it.message.firstOrNull<PlainText>()
2019-10-09 17:40:39 +08:00
}
}
2019-10-13 20:19:54 +08:00
2019-10-15 19:02:57 +08:00
demo2()
bot.network.awaitDisconnection()//等到直到断开连接
2019-10-02 19:13:09 +08:00
}
/**
* 实现功能:
* 对机器人说 "记笔记", 机器人记录之后的所有消息.
* 对机器人说 "停止", 机器人停止
*/
suspend fun demo2() {
2019-10-09 17:40:39 +08:00
subscribeAlways<FriendMessageEvent> { event ->
2019-10-02 19:13:09 +08:00
if (event.message eq "记笔记") {
2019-10-16 22:33:02 +08:00
subscribeUntilFalse<FriendMessageEvent> {
2019-10-02 19:13:09 +08:00
it.reply("你发送了 ${it.message}")
it.message eq "停止"
}
}
}
2019-09-27 22:44:00 +08:00
}