[core/mock] Introduce AvatarGenerator

This commit is contained in:
Karlatemp 2022-11-22 12:53:24 +08:00
parent 0e4d5efd38
commit 0ddf1e85fc
No known key found for this signature in database
GPG Key ID: BA173CA2B9956C59
8 changed files with 57 additions and 4 deletions

View File

@ -24,6 +24,7 @@ import net.mamoe.mirai.mock.contact.*
import net.mamoe.mirai.mock.database.MessageDatabase import net.mamoe.mirai.mock.database.MessageDatabase
import net.mamoe.mirai.mock.resserver.TmpResourceServer import net.mamoe.mirai.mock.resserver.TmpResourceServer
import net.mamoe.mirai.mock.userprofile.UserProfileService import net.mamoe.mirai.mock.userprofile.UserProfileService
import net.mamoe.mirai.mock.utils.AvatarGenerator
import net.mamoe.mirai.mock.utils.NameGenerator import net.mamoe.mirai.mock.utils.NameGenerator
import net.mamoe.mirai.utils.ExternalResource import net.mamoe.mirai.utils.ExternalResource
import net.mamoe.mirai.utils.cast import net.mamoe.mirai.utils.cast
@ -86,6 +87,9 @@ public interface MockBot : Bot, MockContactOrBot, MockUserOrBot {
public val msgDatabase: MessageDatabase public val msgDatabase: MessageDatabase
public val userProfileService: UserProfileService public val userProfileService: UserProfileService
/** @since 2.14.0 */
public val avatarGenerator: AvatarGenerator
/// Mock Contact API /// Mock Contact API
@MockBotDSL @MockBotDSL

View File

@ -16,6 +16,7 @@ import net.mamoe.mirai.mock.internal.MockBotFactoryImpl
import net.mamoe.mirai.mock.internal.MockMiraiImpl import net.mamoe.mirai.mock.internal.MockMiraiImpl
import net.mamoe.mirai.mock.resserver.TmpResourceServer import net.mamoe.mirai.mock.resserver.TmpResourceServer
import net.mamoe.mirai.mock.userprofile.UserProfileService import net.mamoe.mirai.mock.userprofile.UserProfileService
import net.mamoe.mirai.mock.utils.AvatarGenerator
import net.mamoe.mirai.mock.utils.NameGenerator import net.mamoe.mirai.mock.utils.NameGenerator
import net.mamoe.mirai.utils.BotConfiguration import net.mamoe.mirai.utils.BotConfiguration
@ -36,6 +37,8 @@ public interface MockBotFactory : BotFactory {
public fun userProfileService(service: UserProfileService): BotBuilder public fun userProfileService(service: UserProfileService): BotBuilder
public fun avatarGenerator(avatarGenerator: AvatarGenerator): BotBuilder
public fun create(): MockBot public fun create(): MockBot
public fun createNoInstanceRegister(): MockBot public fun createNoInstanceRegister(): MockBot

View File

@ -10,12 +10,15 @@
package net.mamoe.mirai.mock.internal package net.mamoe.mirai.mock.internal
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.message.data.Image
import net.mamoe.mirai.mock.MockBot import net.mamoe.mirai.mock.MockBot
import net.mamoe.mirai.mock.MockBotFactory import net.mamoe.mirai.mock.MockBotFactory
import net.mamoe.mirai.mock.database.MessageDatabase import net.mamoe.mirai.mock.database.MessageDatabase
import net.mamoe.mirai.mock.resserver.TmpResourceServer import net.mamoe.mirai.mock.resserver.TmpResourceServer
import net.mamoe.mirai.mock.userprofile.UserProfileService import net.mamoe.mirai.mock.userprofile.UserProfileService
import net.mamoe.mirai.mock.utils.AvatarGenerator
import net.mamoe.mirai.mock.utils.NameGenerator import net.mamoe.mirai.mock.utils.NameGenerator
import net.mamoe.mirai.mock.utils.randomImageContent
import net.mamoe.mirai.utils.BotConfiguration import net.mamoe.mirai.utils.BotConfiguration
import net.mamoe.mirai.utils.lateinitMutableProperty import net.mamoe.mirai.utils.lateinitMutableProperty
import kotlin.math.absoluteValue import kotlin.math.absoluteValue
@ -39,6 +42,11 @@ internal class MockBotFactoryImpl : MockBotFactory {
var userProfileService: UserProfileService by lateinitMutableProperty { var userProfileService: UserProfileService by lateinitMutableProperty {
UserProfileService.getInstance() UserProfileService.getInstance()
} }
var avatarGenerator: AvatarGenerator by lateinitMutableProperty {
object : AvatarGenerator {
override fun generateRandomAvatar(): ByteArray = Image.randomImageContent()
}
}
override fun id(value: Long): MockBotFactory.BotBuilder = apply { override fun id(value: Long): MockBotFactory.BotBuilder = apply {
this.id = value this.id = value
@ -68,6 +76,10 @@ internal class MockBotFactoryImpl : MockBotFactory {
userProfileService = service userProfileService = service
} }
override fun avatarGenerator(avatarGenerator: AvatarGenerator): MockBotFactory.BotBuilder = apply {
this.avatarGenerator = avatarGenerator
}
override fun createNoInstanceRegister(): MockBot { override fun createNoInstanceRegister(): MockBot {
return MockBotImpl( return MockBotImpl(
configuration_, configuration_,
@ -77,6 +89,7 @@ internal class MockBotFactoryImpl : MockBotFactory {
tmpResourceServer_, tmpResourceServer_,
msgDb, msgDb,
userProfileService, userProfileService,
avatarGenerator,
) )
} }

View File

@ -43,6 +43,7 @@ import net.mamoe.mirai.mock.internal.contactbase.ContactDatabase
import net.mamoe.mirai.mock.internal.serverfs.TmpResourceServerImpl import net.mamoe.mirai.mock.internal.serverfs.TmpResourceServerImpl
import net.mamoe.mirai.mock.resserver.TmpResourceServer import net.mamoe.mirai.mock.resserver.TmpResourceServer
import net.mamoe.mirai.mock.userprofile.UserProfileService import net.mamoe.mirai.mock.userprofile.UserProfileService
import net.mamoe.mirai.mock.utils.AvatarGenerator
import net.mamoe.mirai.mock.utils.NameGenerator import net.mamoe.mirai.mock.utils.NameGenerator
import net.mamoe.mirai.mock.utils.simpleMemberInfo import net.mamoe.mirai.mock.utils.simpleMemberInfo
import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.*
@ -60,6 +61,7 @@ internal class MockBotImpl(
override val tmpResourceServer: TmpResourceServer, override val tmpResourceServer: TmpResourceServer,
override val msgDatabase: MessageDatabase, override val msgDatabase: MessageDatabase,
override val userProfileService: UserProfileService, override val userProfileService: UserProfileService,
override val avatarGenerator: AvatarGenerator,
) : MockBot, Bot, ContactOrBot { ) : MockBot, Bot, ContactOrBot {
@JvmField @JvmField
internal val contactDatabase = ContactDatabase(this) internal val contactDatabase = ContactDatabase(this)

View File

@ -229,7 +229,7 @@ internal class MockGroupImpl(
override val mockApi: MockGroup.MockApi = object : MockGroup.MockApi { override val mockApi: MockGroup.MockApi = object : MockGroup.MockApi {
override var avatarUrl: String by lateinitMutableProperty { override var avatarUrl: String by lateinitMutableProperty {
runBlocking { MockImage.random(bot).getUrl(bot) } runBlocking { MockImage.randomForGroup(bot, id).getUrl(bot) }
} }
} }

View File

@ -24,7 +24,6 @@ import net.mamoe.mirai.mock.MockBot
import net.mamoe.mirai.mock.contact.MockGroup import net.mamoe.mirai.mock.contact.MockGroup
import net.mamoe.mirai.mock.utils.mock import net.mamoe.mirai.mock.utils.mock
import net.mamoe.mirai.mock.utils.plusHttpSubpath import net.mamoe.mirai.mock.utils.plusHttpSubpath
import net.mamoe.mirai.mock.utils.randomImageContent
import net.mamoe.mirai.utils.ExternalResource import net.mamoe.mirai.utils.ExternalResource
import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource
import net.mamoe.mirai.utils.cast import net.mamoe.mirai.utils.cast
@ -110,7 +109,17 @@ internal class MockImage(
companion object { companion object {
// create a mockImage with random content // create a mockImage with random content
internal suspend fun random(bot: MockBot): MockImage { internal suspend fun random(bot: MockBot): MockImage {
val text = Image.randomImageContent() val text = bot.avatarGenerator.generateRandomAvatar()
return bot.uploadMockImage(text.toExternalResource().toAutoCloseable()).cast()
}
internal suspend fun randomForPerson(bot: MockBot, id: Long): MockImage {
val text = bot.avatarGenerator.generateAvatarForPerson(id)
return bot.uploadMockImage(text.toExternalResource().toAutoCloseable()).cast()
}
internal suspend fun randomForGroup(bot: MockBot, id: Long): MockImage {
val text = bot.avatarGenerator.generateAvatarForGroup(id)
return bot.uploadMockImage(text.toExternalResource().toAutoCloseable()).cast() return bot.uploadMockImage(text.toExternalResource().toAutoCloseable()).cast()
} }
} }

View File

@ -25,7 +25,7 @@ internal class ContactInfo(
@JvmField var nick: String, @JvmField var nick: String,
) { ) {
var avatarUrl: String by lateinitMutableProperty { var avatarUrl: String by lateinitMutableProperty {
runBlocking { MockImage.random(declaredBot).getUrl(declaredBot) } runBlocking { MockImage.randomForPerson(declaredBot, id).getUrl(declaredBot) }
} }
fun changeAvatarUrl(newAvatar: String) { fun changeAvatarUrl(newAvatar: String) {

View File

@ -0,0 +1,22 @@
/*
* Copyright 2019-2022 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/dev/LICENSE
*/
package net.mamoe.mirai.mock.utils
/**
* 头像生成器
*
* @since 2.14.0
*/
public interface AvatarGenerator {
public fun generateAvatarForPerson(id: Long): ByteArray = generateRandomAvatar()
public fun generateAvatarForGroup(id: Long): ByteArray = generateRandomAvatar()
public fun generateRandomAvatar(): ByteArray
}