Skip to content

Commit

Permalink
feat: poi for MiraiBackupService
Browse files Browse the repository at this point in the history
  • Loading branch information
cssxsh committed May 1, 2023
1 parent d617f68 commit e706167
Showing 1 changed file with 114 additions and 37 deletions.
151 changes: 114 additions & 37 deletions src/main/kotlin/xyz/cssxsh/mirai/admin/MiraiBackupService.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package xyz.cssxsh.mirai.admin

import io.ktor.utils.io.core.*
import io.ktor.utils.io.streams.*
import net.mamoe.mirai.*
import net.mamoe.mirai.console.util.ContactUtils.render
import net.mamoe.mirai.contact.*
import org.apache.poi.ss.usermodel.*
import xyz.cssxsh.mirai.admin.poi.*
import xyz.cssxsh.mirai.spi.*
import java.io.*
import java.util.zip.*
Expand All @@ -13,37 +15,84 @@ internal object MiraiBackupService : BackupService {
override val level: Int = 0
override val id: String = "default-backup"

private fun ZipOutputStream.writeEntry(name: String, block: BytePacketBuilder.() -> Unit) {
putNextEntry(ZipEntry(name))
writePacket(block)
closeEntry()
}

override fun group() {
val backup = File("backup/group.${System.currentTimeMillis()}.zip")
backup.parentFile.mkdirs()
backup.outputStream().buffered().use { buffered ->
val output = ZipOutputStream(buffered)

output.writeEntry("readme.txt") {
append("csv 文件可以用 excel 或 wps 打开,或者你可以直接当成普通的文本文件编辑")
}

for (bot in Bot.instances) {
for (group in bot.groups) {
output.writeEntry("${bot.id}.${group.id}.group.csv") {
append("group, uid, name").append('\n')
val workbook = workbook {
for (group in bot.groups) {
val iso = creationHelper.createDataFormat().getFormat("yyyy/MM/ddThh:mm:dd")
sheet(group.render()) {
createFreezePane(0, 1, 0, 1)
defaultColumnWidth = 20

for (member in group.members) {
append(group.id.toString())
.append(", ")
.append(member.id.toString())
.append(", ")
.append(member.nameCardOrNick)
.append('\n')
val header =
listOf("QQ", "NAME", "PERMISSION", "SPECIAL_TITLE", "TEMPERATURE", "JOIN", "LAST_SPEAK")
row(0) {
header.forEachIndexed { index, name ->
cell(index) {
setCellValue(name)
style {
font {
alignment = HorizontalAlignment.CENTER
}
}
}
}
}
var line = 1
for (member in group.members) {
row(line++) {
var col = 0
// QQ
cell(col++) {
setCellValue("${member.id}")
}
// NAME
cell(col++) {
setCellValue(member.nameCardOrNick)
}
// PERMISSION
cell(col++) {
setCellValue(member.permission.name)
}
// SPECIAL_TITLE
cell(col++) {
setCellValue(member.specialTitle)
}
// TEMPERATURE
cell(col++) {
setCellValue(member.active.temperature.toDouble())
}
// JOIN_AT
cell(col++) {
style {
dataFormat = iso
}
setCellValue(member.joinAt)
}
// LAST_SPEAK_AT
cell(col) {
style {
dataFormat = iso
}
setCellValue(member.lastSpeakAt)
}
}
}
}
}
}
output.putNextEntry(ZipEntry("${bot.id}.group.xlsx"))
try {
workbook.write(output)
} finally {
output.closeEntry()
workbook.close()
}
}
output.close()
}
Expand All @@ -55,26 +104,54 @@ internal object MiraiBackupService : BackupService {
backup.outputStream().buffered().use { buffered ->
val output = ZipOutputStream(buffered)

output.writeEntry("readme.txt") {
append("csv 文件可以用 excel 或 wps 打开,或者你可以直接当成普通的文本文件编辑")
}

for (bot in Bot.instances) {
val workbook = workbook {
val header = listOf("QQ", "NAME", "REMARK")
for (friendGroup in bot.friendGroups.asCollection()) {
sheet(friendGroup.name) {
createFreezePane(0, 1, 0, 1)
defaultColumnWidth = 20

output.writeEntry("${bot.id}.friend.csv") {
append("bot, uid, name, group").append('\n')

for (friend in bot.friends) {
append(bot.id.toString())
.append(", ")
.append(friend.id.toString())
.append(", ")
.append(friend.remarkOrNick)
.append(", ")
.append(friend.runCatching { friendGroup.name }.getOrElse { "我的好友" })
.append('\n')
row(0) {
header.forEachIndexed { index, name ->
cell(index) {
setCellValue(name)
style {
font {
alignment = HorizontalAlignment.CENTER
}
}
}
}
}
var line = 1
for (friend in friendGroup.friends) {
row(line++) {
var col = 0
// QQ
cell(col++) {
setCellValue("${friend.id}")
}
// NAME
cell(col++) {
setCellValue(friend.remarkOrNick)
}
// REMARK
cell(col) {
setCellValue(friend.remark)
}
}
}
}
}
}
output.putNextEntry(ZipEntry("${bot.id}.friend.xlsx"))
try {
workbook.write(output)
} finally {
output.closeEntry()
workbook.close()
}
}
output.close()
}
Expand Down

0 comments on commit e706167

Please sign in to comment.