Visual_Novel_iOS/crush/Crush/Src/Models/AIRole.swift

442 lines
17 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// AIRole.swift
// Crush
//
// Created by Leon on 2025/7/29.
//
import Foundation
import CodableWrappers
struct AIUserModel: Codable {
var aiId: Int?
var nickname: String?
var sex: Sex?
var headImg: String?
var birthday: Int?
var roleCode: String?
var role: String?
var characterCode: String?
var character: String?
var tagCode: String?
var tag: String?
var introduction: String?
/// 1
var permission: Int?
var imageUrl: String?
var aiUserExt: AIUserExt?
var userId: Int?
/// (使
var userDialogueStyle:String?
/// (使
var userProfile: String?
}
struct AIUserExt: Codable {
var profile: String?
var dialogueStyle: String?
/// tina 😊
var dialoguePrologue: String?
var dialogueTimbre: String?
/// "TB0008",code
var dialogueTimbreCode: String?
/// "1",
var dialogueSpeechRate: String?
/// "1",
var dialoguePitch:String?
///
var timbreDict: TimbreDict?
/// IS0001
var imageStyleCode: String?
var imageStyle: String?
var imageStyleUrl: String?
var imageDesc: String?
var imageReferenceUrl: String?
var imageStyleDict: ImageStylePic?
}
/// AIMy Role list
struct AIRoleInfo: Codable {
var aiId: Int?
/// AIID
var idCard: String?
/// aiid
var userId: Int?
var nickname: String?
var sex: Sex?
var headImg: String?
var likedNum: Int?
///
var birthday: Int?
var roleName: String?
var characterName: String?
var tagName: String?
var introduction: String?
/// 1: 2
var permission: Int?
///
var homeImageUrl: String?
///
var liked: Bool?
}
/*
{
"aiUserExt" : {
"dialogueTimbreCode" : "TB0008",
"timbreDict" : {
"description" : "",
"id" : 8,
"supportEmotions" : null,
"url" : "https:\/\/hhb.crushlevel.ai\/static\/sound\/TB0008.mp3",
"type" : 2,
"isDelete" : 0,
"code" : "TB0008",
"createTime" : null,
"language" : null,
"voiceText" : "",
"voiceType" : "S_HRJc9fqD1",
"name" : ""
},
"imageReferenceUrl" : null,
"dialoguePrologue" : "tina 😊",
"dialoguePitch" : "1",
"dialogueStyle" : "",
"dialogueSpeechRate" : "1",
"imageStyleCode" : "IS0001",
"imageDesc" : "beautiful high school girl, elegant rich family daughter, medium academic performance, refined but slightly rebellious look, layered personality, fashionable school uniform with subtle luxury accessories, natural makeup, confident yet thoughtful expression, long silky hair, warm afternoon sunlight, cinematic composition, highly detailed, 8k, ultra realistic, anime-inspired style",
"imageStyleDict" : {
"prompt" : "https:\/\/public-pictures.epal.gg\/app\/images\/chatRoom\/gift\/ordinary\/Luv_ya.png",
"sort" : 0,
"url" : "https:\/\/public-pictures.epal.gg\/app\/images\/chatRoom\/gift\/ordinary\/Luv_ya.png",
"id" : 1,
"code" : "IS0001",
"isDelete" : 0,
"createTime" : null,
"name" : ""
},
"profile" : "Tina200079\\n\\n仿仿线穿\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n仿\\n\\n\\n\\n\\n\\n\\n\\n"
},
"roleCode" : "R00002",
"characterCode" : "C00001",
"sex" : 1,
"introduction" : "Tina200079 ",
"permission" : 1,
"aiId" : 439257063882753,
"imageUrl" : "https:\/\/hhb.crushlevel.ai\/dev\/role\/17547265798639410.jpg",
"tag" : "",
"birthday" : 963072000000,
"tagCode" : "T00001",
"role" : "",
"character" : "",
"nickname" : "Tina",
"headImg" : "https:\/\/hhb.crushlevel.ai\/dev\/role\/17547265798639410.jpg"
}
*/
struct AIUserContentGenResponse: Codable {
var content: String?
}
///
struct AIUserImageTaskCreateResponse: Codable {
var batchNo: String?
}
struct AIRoleStatisticsResponse: Codable {
var aiId: Int?
var likedNum: Int?
var chatNum: Int?
var conversationNum: Int?
var coinNum: Int?
}
class AIRoleGiftReceivedList: Codable{
var id:Int?
var name: String?
var icon: String?
var getNum: Int?
}
// MARK: - AI & AI & AI
enum AIGenerateState: String, Codable {
case pending = "PENDING"
case nsfw = "NSFW"
case completed = "COMPLETED"
case failed = "FAILED"
}
enum AIImageGenerateType: String, Codable{
/// AI
case CREATE_AI_IMAGE
/// AI
case EDIT_AI_IMAGE
case ALBUM
case BACKGROUND
}
///
class AIUserImageQuery: Codable {
var imageUrl: String?
/// PENDING NSFW COMPLETED FAILED
var status: AIGenerateState = .pending
// MARK: Custom
var unlockPrice: Int?
}
struct AICreateResponse: Codable{
var aiId:Int?
}
// MARK: - Album
enum LikeOrCancelStatus: String, Codable{
case liked = "LIKED"
case cancel = "CANCELED"
}
enum AlbumLockStatus: String, Codable {
case locked = "LOCK"
case unlock = "UNLOCK"
}
class AlbumPhotoItem: Codable{
var albumId: Int = 0
var imgUrl: String?
var unlockPrice: Int = 0
var width: String?
var height: String?
var likedCount: Int?
var likedStatus: LikeOrCancelStatus?
var isDefault: Bool?
var lockStatus: AlbumLockStatus?
var img1: String?
var img2: String?
var img3: String?
var imgOrder: Int?
/// imgUrlimg1
func getImgUrl() -> String{
if let url = imgUrl, url.count > 0{
return url
}
if let url = img1, url.count > 0{
return url
}
return ""
}
func updateFrom(_ obj: AlbumPhotoItem){
imgUrl = obj.imgUrl
img1 = obj.img1
width = obj.width
height = obj.height
unlockPrice = obj.unlockPrice
lockStatus = obj.lockStatus
likedCount = obj.likedCount
likedStatus = obj.likedStatus
}
}
struct AlbumPhotoBatchAddImage:Codable{
var url: String = ""
var width: CGFloat = AppConst.gAIPhotoWidth
var height: CGFloat = AppConst.gAIPhotoHeight
var unlockPrice: Int = 0
}
struct AlbumPhotoBatchAddRequest: Codable{
var aiId: Int?
var images: [AlbumPhotoBatchAddImage]?
}
// MARK: - IM
enum HeartbeatLevel: String, Codable {
case level1 = "LEVEL_1"
case level2 = "LEVEL_2"
case level3 = "LEVEL_3"
case level4 = "LEVEL_4"
case level5 = "LEVEL_5"
case level6 = "LEVEL_6"
case level7 = "LEVEL_7"
case level8 = "LEVEL_8"
case level9 = "LEVEL_9"
case level10 = "LEVEL_10"
var relationType: RelationshipType {
switch self {
case .level1,.level2:
return .meet
case .level3,.level4:
return .friend
case .level5,.level6:
return .flirting
case .level7, .level8:
return .couple
case .level9,.level10:
return .married
}
}
var localizedText: String {
switch self {
case .level1:
return "Lv.1"
case .level2:
return "Lv.2"
case .level3:
return "Lv.3"
case .level4:
return "Lv.4"
case .level5:
return "Lv.5"
case .level6:
return "Lv.6"
case .level7:
return "Lv.7"
case .level8:
return "Lv.8"
case .level9:
return "Lv.9"
case .level10:
return "Lv.10"
}
}
///
var intValue: Int {
switch self {
case .level1: return 1
case .level2: return 2
case .level3: return 3
case .level4: return 4
case .level5: return 5
case .level6: return 6
case .level7: return 7
case .level8: return 8
case .level9: return 9
case .level10: return 10
}
}
///
func isGreaterOrEqual(to other: HeartbeatLevel) -> Bool {
return self.intValue >= other.intValue
}
}
struct AIUserHeartBeatRelation: Codable{
/// AI
var aiHeadImg: String?
///
var userHeadImg: String?
/// LEVEL1...
var heartbeatLevel: HeartbeatLevel?
/// 1~10
var heartbeatLevelNum: Int?
/// 25.199999
var heartbeatVal: CGFloat?
var heartbeatLevelName: String?
///
var dayCount: Int?
/// x%) eg: 0.989999999
var heartbeatScore: Double?
///
var subtractHeartbeatVal: Double?
// {
// #warning("test")
// return 1.1
// }
/// false
var isShow : Bool?
///
var price: Int?
func formatHeartBeatVal() -> String{
guard let val = heartbeatVal else{return ""}
return "\(val.formatted(decimal: 1, usesGroupingSeparator: false))"
}
static func unitOfHeartBeatVal() -> String{
return ""
}
func getHeartbeatWavePercent() -> CGFloat{
let heartPercent = CGFloat(heartbeatLevelNum ?? 1) / 10.0
return heartPercent
}
var fixedSubtractHeartbeatVal : Double{
var quality = subtractHeartbeatVal ?? 0.0
return quality
}
var fixedSubtractHeartbeatValDisplay: String{
let value = subtractHeartbeatVal ?? 0.0
return "\(value.formatted(decimal: 1, usesGroupingSeparator: false))"
}
}
/// IM
class IMAIUserInfo:Codable{
var aiId: Int?
var userId: Int?
var nickname: String?
var sex: Sex?
var headImg: String?
var birthday: Int?
var roleName: String?
///
var characterName: String?
var tagName: String?
var introduction: String?
var backgroundImg: String?
///
var likedNum: Int?
///
var dialoguePrologue: String?
/// -
var dialoguePrologueVoice: String?
var aiUserHeartbeatRelation: AIUserHeartBeatRelation?
var chatBubble: ChatBubble?
/// 1 0
var isAutoPlayVoice: Int?
///
// var memberType: String?
var isMember: Bool?
var isDefaultBackground: Bool = false
/// - [-50, 100] 1002.0-500.50
var dialogueSpeechRate: String?
/// - [-50, 100] 1002.0-500.50
var dialoguePitch: String?
/// 使
var voiceType: String?
///
var liked: Bool?
///
var isDelChatted: Bool?
///
var isHaveChatted: Bool?
}
struct AIAlbumUnlockImages: Codable{
var img1: String?
var img2: String?
var img3: String?
}