From d7a052e3c882ad44a9083b258376d122b88adf3d Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Wed, 10 Jul 2024 21:11:08 +0800 Subject: [PATCH 1/6] GachaKit // Implementing UIGFv4 (structs). --- .../GachaKit/Sources/GachaKit/UIGFv4.swift | 485 ++++++++++++++++++ 1 file changed, 485 insertions(+) create mode 100644 Packages/GachaKit/Sources/GachaKit/UIGFv4.swift diff --git a/Packages/GachaKit/Sources/GachaKit/UIGFv4.swift b/Packages/GachaKit/Sources/GachaKit/UIGFv4.swift new file mode 100644 index 00000000..36b21736 --- /dev/null +++ b/Packages/GachaKit/Sources/GachaKit/UIGFv4.swift @@ -0,0 +1,485 @@ +// (c) 2023 and onwards Pizza Studio (GPL v3.0 License). +// ==================== +// This code is released under the GPL v3.0 License (SPDX-License-Identifier: GPL-3.0) + +import Foundation +import HBMihoyoAPI +import SwiftUI +import UniformTypeIdentifiers + +// MARK: - UIGFv4 + +// 穹披助手对 UIGF 仅从 v4 开始支援,因为之前版本的 UIGF 仅支援原神。 +// Ref: https://uigf.org/zh/standards/uigf.html + +public struct UIGFv4: Codable, Hashable, Sendable { + // MARK: Lifecycle + + public init( + info: Info, + giProfiles: [ProfileGI]? = [], + hsrProfiles: [ProfileHSR]? = [], + zzzProfiles: [ProfileZZZ]? = [] + ) { + self.info = info + self.giProfiles = giProfiles + self.hsrProfiles = hsrProfiles + self.zzzProfiles = zzzProfiles + } + + // MARK: Public + + public enum CodingKeys: String, CodingKey { + case giProfiles = "hk4e" + case hsrProfiles = "hkrpg" + case zzzProfiles = "nap" + case info + } + + public var giProfiles: [ProfileGI]? + public var hsrProfiles: [ProfileHSR]? + public var info: Info + public var zzzProfiles: [ProfileZZZ]? +} + +// MARK: UIGFv4.Info + +extension UIGFv4 { + public struct Info: Codable, Hashable, Sendable { + // MARK: Lifecycle + + public init(exportApp: String, exportAppVersion: String, exportTimestamp: String, version: String) { + self.exportApp = exportApp + self.exportAppVersion = exportAppVersion + self.exportTimestamp = exportTimestamp + self.version = version + } + + public init(from decoder: any Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.exportApp = try container.decode(String.self, forKey: .exportApp) + self.exportAppVersion = try container.decode(String.self, forKey: .exportAppVersion) + self.version = try container.decode(String.self, forKey: .version) + if let x = try? container.decode(String.self, forKey: .exportTimestamp) { + self.exportTimestamp = x + } else if let x = try? container.decode(Int.self, forKey: .exportTimestamp) { + self.exportTimestamp = x.description + } else if let x = try? container.decode(Double.self, forKey: .exportTimestamp) { + self.exportTimestamp = x.description + } else { + self.exportTimestamp = "YJSNPI" // 摆烂值,反正这里不解析。 + } + } + + // MARK: Public + + public enum CodingKeys: String, CodingKey { + case exportApp = "export_app" + case exportAppVersion = "export_app_version" + case exportTimestamp = "export_timestamp" + case version + } + + /// 导出档案的 App 名称 + public let exportApp: String + /// 导出档案的 App 版本 + public let exportAppVersion: String + /// 导出档案的时间戳,秒级 + public let exportTimestamp: String + /// 导出档案的 UIGF 版本号,格式为 'v{major}.{minor}',如 v4.0 + public let version: String + } +} + +// MARK: UIGFv4.ProfileGI + +extension UIGFv4 { + public struct ProfileGI: Codable, Hashable, Sendable { + // MARK: Lifecycle + + public init(lang: GachaLanguageCode, list: [GachaItemGI], timezone: Int?, uid: String) { + self.lang = lang + self.list = list + self.timezone = timezone ?? GachaItem.getServerTimeZoneDelta(uid) + self.uid = uid + } + + public init(from decoder: any Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.list = try container.decode([GachaItemGI].self, forKey: .list) + self.lang = try container.decode(GachaLanguageCode.self, forKey: .lang) + self.timezone = try container.decode(Int.self, forKey: .timezone) + + if let x = try? container.decode(String.self, forKey: .uid) { + self.uid = x + } else if let x = try? container.decode(Int.self, forKey: .uid) { + self.uid = x.description + } else { + throw DecodingError.typeMismatch( + String.self, + DecodingError.Context( + codingPath: decoder.codingPath, + debugDescription: "Type for UID shall be either String or Integer." + ) + ) + } + } + + // MARK: Public + + public struct GachaItemGI: Codable, Hashable, Sendable { + // MARK: Lifecycle + + public init( + count: String?, + gachaType: GachaTypeGI, + id: String, + itemID: String, + itemType: String?, + name: String?, + rankType: String?, + time: String, + uigfGachaType: UIGFGachaTypeGI + ) { + self.count = count + self.gachaType = gachaType + self.id = id + self.itemID = itemID + self.itemType = itemType + self.name = name + self.rankType = rankType + self.time = time + self.uigfGachaType = uigfGachaType + } + + // MARK: Public + + public enum CodingKeys: String, CodingKey { + case count + case gachaType = "gacha_type" + case id + case itemID = "item_id" + case itemType = "item_type" + case name + case rankType = "rank_type" + case time + case uigfGachaType = "uigf_gacha_type" + } + + /// 卡池类型,API返回 + public enum GachaTypeGI: String, Codable, Hashable, Sendable { + case beginnersWish = "100" + case standardWish = "200" + case characterEvent1 = "301" + case weaponEvent = "302" + case characterEvent2 = "400" + case chronicledWish = "500" + + // MARK: Public + + public var uigfGachaType: UIGFGachaTypeGI { + switch self { + case .beginnersWish: return .beginnersWish + case .standardWish: return .standardWish + case .characterEvent1, .characterEvent2: return .characterEvent + case .weaponEvent: return .weaponEvent + case .chronicledWish: return .chronicledWish + } + } + } + + /// UIGF 卡池类型,用于区分卡池类型不同,但卡池保底计算相同的物品 + public enum UIGFGachaTypeGI: String, Codable, Hashable, Sendable { + case beginnersWish = "100" + case standardWish = "200" + case characterEvent = "301" + case weaponEvent = "302" + case chronicledWish = "500" + } + + /// 物品个数,一般为1,API返回 + public var count: String? + /// 卡池类型,API返回 + public var gachaType: GachaTypeGI + /// 记录内部 ID, API返回 + public var id: String + /// 物品的内部 ID + public var itemID: String + /// 物品类型, API返回 + public var itemType: String? + /// 物品名称, API返回 + public var name: String? + /// 物品等级, API返回 + public var rankType: String? + /// 获取物品的本地时间,与 timezone 一起计算出物品的准确获取时间,API返回 + public var time: String + /// UIGF 卡池类型,用于区分卡池类型不同,但卡池保底计算相同的物品 + public var uigfGachaType: UIGFGachaTypeGI + } + + /// 语言代码 + public var lang: GachaLanguageCode? + public var list: [GachaItemGI] + /// 时区偏移 + public var timezone: Int + /// UID + public var uid: String + } +} + +// MARK: UIGFv4.ProfileHSR + +extension UIGFv4 { + public struct ProfileHSR: Codable, Hashable, Sendable { + // MARK: Lifecycle + + public init(lang: GachaLanguageCode, list: [GachaItemHSR], timezone: Int?, uid: String) { + self.lang = lang + self.list = list + self.timezone = timezone ?? GachaItem.getServerTimeZoneDelta(uid) + self.uid = uid + } + + public init(from decoder: any Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.list = try container.decode([GachaItemHSR].self, forKey: .list) + self.lang = try container.decode(GachaLanguageCode.self, forKey: .lang) + self.timezone = try container.decode(Int.self, forKey: .timezone) + + if let x = try? container.decode(String.self, forKey: .uid) { + self.uid = x + } else if let x = try? container.decode(Int.self, forKey: .uid) { + self.uid = x.description + } else { + throw DecodingError.typeMismatch( + String.self, + DecodingError.Context( + codingPath: decoder.codingPath, + debugDescription: "Type for UID shall be either String or Integer." + ) + ) + } + } + + // MARK: Public + + public struct GachaItemHSR: Codable, Hashable, Sendable { + // MARK: Lifecycle + + public init( + count: String?, + gachaID: String?, + gachaType: GachaTypeHSR, + id: String, + itemID: String, + itemType: String?, + name: String?, + rankType: String?, + time: String + ) { + self.count = count + self.gachaID = gachaID + self.gachaType = gachaType + self.id = id + self.itemID = itemID + self.itemType = itemType + self.name = name + self.rankType = rankType + self.time = time + } + + // MARK: Public + + public enum CodingKeys: String, CodingKey { + case count + case gachaID = "gacha_id" + case gachaType = "gacha_type" + case id + case itemID = "item_id" + case itemType = "item_type" + case name + case rankType = "rank_type" + case time + } + + /// 卡池类型 + public enum GachaTypeHSR: String, Codable, Hashable, Sendable { + case stellarWarp = "1" + case characterEventWarp = "11" + case lightConeEventWarp = "12" + case departureWarp = "2" + } + + /// 物品个数,一般为1,API返回 + public var count: String? + /// 卡池 Id + public var gachaID: String? + /// 卡池类型 + public var gachaType: GachaTypeHSR + /// 内部 Id + public var id: String + /// 物品的内部 ID + public var itemID: String + /// 物品类型, API返回 + public var itemType: String? + /// 物品名称, API返回 + public var name: String? + /// 物品等级, API返回 + public var rankType: String? + /// 获取物品的本地时间,与 timezone 一起计算出物品的准确获取时间,API返回 + public var time: String + } + + /// 语言代码 + public var lang: GachaLanguageCode? + public var list: [GachaItemHSR] + /// 时区偏移 + public var timezone: Int + /// UID + public var uid: String + } +} + +// MARK: UIGFv4.ProfileZZZ + +extension UIGFv4 { + public struct ProfileZZZ: Codable, Hashable, Sendable { + // MARK: Lifecycle + + public init(lang: GachaLanguageCode, list: [GachaItemZZZ], timezone: Int?, uid: String) { + self.lang = lang + self.list = list + self.timezone = timezone ?? GachaItem.getServerTimeZoneDelta(uid) + self.uid = uid + } + + public init(from decoder: any Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.list = try container.decode([GachaItemZZZ].self, forKey: .list) + self.lang = try container.decode(GachaLanguageCode.self, forKey: .lang) + self.timezone = try container.decode(Int.self, forKey: .timezone) + + if let x = try? container.decode(String.self, forKey: .uid) { + self.uid = x + } else if let x = try? container.decode(Int.self, forKey: .uid) { + self.uid = x.description + } else { + throw DecodingError.typeMismatch( + String.self, + DecodingError.Context( + codingPath: decoder.codingPath, + debugDescription: "Type for UID shall be either String or Integer." + ) + ) + } + } + + // MARK: Public + + public struct GachaItemZZZ: Codable, Hashable, Sendable { + // MARK: Lifecycle + + public init( + count: String?, + gachaID: String?, + gachaType: GachaTypeZZZ, + id: String, + itemID: String, + itemType: String?, + name: String?, + rankType: String?, + time: String + ) { + self.count = count + self.gachaID = gachaID + self.gachaType = gachaType + self.id = id + self.itemID = itemID + self.itemType = itemType + self.name = name + self.rankType = rankType + self.time = time + } + + // MARK: Public + + public enum CodingKeys: String, CodingKey { + case count + case gachaID = "gacha_id" + case gachaType = "gacha_type" + case id + case itemID = "item_id" + case itemType = "item_type" + case name + case rankType = "rank_type" + case time + } + + /// 卡池类型 + public enum GachaTypeZZZ: String, Codable, Hashable, Sendable, CaseIterable { + case standardBanner = "1" + case limitedBanner = "2" + case wEngineBanner = "3" + case bangbooBanner = "5" + + // MARK: Lifecycle + + public init?(altRawValue: String) { + let matched = Self.allCases.first { $0.alternativeRawValue == altRawValue } + guard let matched else { return nil } + self = matched + } + + public init(from decoder: any Decoder) throws { + let container = try decoder.singleValueContainer() + guard let x = try? container.decode(String.self), + let newSelf = GachaTypeZZZ(rawValue: x) ?? GachaTypeZZZ(altRawValue: x) + else { + throw DecodingError.typeMismatch( + GachaTypeZZZ.self, + DecodingError.Context( + codingPath: decoder.codingPath, + debugDescription: "Wrong type for GachaTypeZZZ." + ) + ) + } + self = newSelf + } + + // MARK: Public + + public var alternativeRawValue: String { + rawValue + "001" + } + } + + /// 物品个数,一般为1,API返回 + public var count: String? + /// 卡池 Id + public var gachaID: String? + /// 卡池类型 + public var gachaType: GachaTypeZZZ + /// 记录内部 ID, API返回 + public var id: String + /// 物品的内部 ID + public var itemID: String + /// 物品类型, API返回 + public var itemType: String? + /// 物品名称, API返回 + public var name: String? + /// 物品等级, API返回 + public var rankType: String? + /// 获取物品的本地时间,与 timezone 一起计算出物品的准确获取时间,API返回 + public var time: String + } + + /// 语言代码 + public var lang: GachaLanguageCode? + public var list: [GachaItemZZZ] + /// 时区偏移 + public var timezone: Int + /// UID + public var uid: String + } +} + From d18c4d9a6d31426487b646e67d3d771d18314c27 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Wed, 10 Jul 2024 21:11:14 +0800 Subject: [PATCH 2/6] GachaKit // Implementing UIGFv4 (extensions). --- .../GachaKit/Sources/GachaKit/UIGFv4.swift | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) diff --git a/Packages/GachaKit/Sources/GachaKit/UIGFv4.swift b/Packages/GachaKit/Sources/GachaKit/UIGFv4.swift index 36b21736..b4f3deed 100644 --- a/Packages/GachaKit/Sources/GachaKit/UIGFv4.swift +++ b/Packages/GachaKit/Sources/GachaKit/UIGFv4.swift @@ -483,3 +483,159 @@ extension UIGFv4 { } } +// MARK: - Extensions + +extension UIGFv4 { + public typealias DataEntry = ProfileHSR.GachaItemHSR // 注意这个地方是否与所属 App 一致。 + + public enum SupportedHoYoGames: String { + case genshinImpact = "GI" + case starRail = "HSR" + case zenlessZoneZero = "ZZZ" + } + + public init() { + self.info = .init() + self.giProfiles = [] + self.hsrProfiles = [] + self.zzzProfiles = [] + } + + public var defaultFileNameStem: String { + let dateFormatter = DateFormatter.forUIGFFileName + return "\(Self.initials)\(dateFormatter.string(from: info.maybeDateExported ?? Date()))" + } + + private static let initials = "UIGFv4_" + + public func getFileNameStem( + uid: String? = nil, + for game: SupportedHoYoGames? = .starRail + ) + -> String { + var stack = Self.initials + if let game { stack += "\(game.rawValue)_" } + if let uid { stack += "\(uid)_" } + return defaultFileNameStem.replacingOccurrences(of: Self.initials, with: stack) + } + + public var asDocument: Document { + .init(model: self) + } +} + +extension UIGFv4.Info { + // MARK: Lifecycle + + public init() { + self.exportApp = "PizzaHelper4HSR" + let shortVer = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String + self.exportAppVersion = shortVer ?? "1.14.514" + self.exportTimestamp = Int(Date.now.timeIntervalSince1970).description + self.version = "v4.0" + } + + public var maybeDateExported: Date? { + guard let exportTimestamp = Double(exportTimestamp) else { return nil } + return .init(timeIntervalSince1970: Double(exportTimestamp)) + } +} + +extension UIGFv4.DataEntry { + public func toGachaEntry( + uid: String, + lang: GachaLanguageCode?, + timeZoneDelta: Int + ) + -> GachaEntry { + let lang = lang ?? .enUS // UIGFv4 不強制要求 lang,但這會導致一些問題。 + let newItemType = GachaItem.ItemType(itemID: itemID) + let name = GachaMetaManager.shared.getLocalizedName( + id: itemID, type: newItemType, langOverride: lang + ) ?? name + let timeTyped: Date? = DateFormatter.forUIGFEntry(timeZoneDelta: timeZoneDelta).date(from: time) + return .init( + count: Int32(count ?? "1") ?? 1, // Default is 1. + gachaID: gachaID ?? "114_514_1919810", + gachaTypeRawValue: gachaType.rawValue, + id: id, + itemID: itemID, + itemTypeRawValue: newItemType.rawValue, // 披萨助手有内部专用的 Item Type Raw Value。 + langRawValue: lang.rawValue, + name: name ?? "#NAME:\(id)#", + rankRawValue: rankType ?? "3", + time: timeTyped ?? Date(), + timeRawValue: time, + uid: uid + ) + } +} + +extension GachaEntry { + public func toUIGFEntry( + langOverride: GachaLanguageCode? = nil, + timeZoneDeltaOverride: Int? = nil + ) + -> UIGFv4.DataEntry { + // 导出的时候按照 server 时区那样来导出, + // 这样可以直接沿用爬取伺服器数据时拿到的 time raw string, + // 借此做到对导出的 JSON 内容的最大程度的传真。 + let timeZoneDelta: Int = timeZoneDeltaOverride ?? GachaItem.getServerTimeZoneDelta(uid) + let langOverride = langOverride ?? Locale.gachaLangauge + let newItemType = GachaItem.ItemType(itemID: itemID) + let name = GachaMetaManager.shared.getLocalizedName( + id: itemID, type: newItemType, langOverride: langOverride + ) ?? name + // 每次导出 UIGF 资料时,都根据当前语言来重新生成 `item_type` 资料值。 + let itemTypeTranslated = newItemType.translatedRaw(for: langOverride) + return .init( + count: count.description, // Default is 1. + gachaID: gachaID, + gachaType: .init(rawValue: gachaTypeRawValue) ?? .departureWarp, + id: id, + itemID: itemID, + itemType: itemTypeTranslated, + name: name, + rankType: rankRawValue, + time: timeRawValue ?? time.asUIGFDate(timeZoneDelta: timeZoneDelta) + ) + } +} + +// MARK: - UIGFv4.Document + +extension UIGFv4 { + public struct Document: FileDocument { + // MARK: Lifecycle + + public init(configuration: ReadConfiguration) throws { + self.model = try JSONDecoder() + .decode( + UIGFv4.self, + from: configuration.file.regularFileContents! + ) + } + + public init(model: UIGFv4) { + self.model = model + } + + // MARK: Public + + public static var readableContentTypes: [UTType] = [.json] + + public let model: UIGFv4 + + public func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper { + let encoder = JSONEncoder() + encoder.outputFormatting = .prettyPrinted + let dateFormatter = DateFormatter() + dateFormatter.locale = .init(identifier: "en_US_POSIX") + dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" + encoder.dateEncodingStrategy = .formatted(dateFormatter) + encoder.keyEncodingStrategy = .convertToSnakeCase + let data = try encoder.encode(model) + return FileWrapper(regularFileWithContents: data) + } + } +} From 20bacb5313f7ecd290ede8d1834333528d7b16c9 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Thu, 11 Jul 2024 07:53:42 +0800 Subject: [PATCH 3/6] GachaKit // Implementing UIGFv4 (unit tests). --- .../Tests/GachaKitTests/GachaKitTests.swift | 56 + .../Tests/TestData/UIGFv4_Sample.json | 4705 +++++++++++++++++ 2 files changed, 4761 insertions(+) create mode 100644 Packages/GachaKit/Tests/TestData/UIGFv4_Sample.json diff --git a/Packages/GachaKit/Tests/GachaKitTests/GachaKitTests.swift b/Packages/GachaKit/Tests/GachaKitTests/GachaKitTests.swift index 64b81b59..283f06b2 100644 --- a/Packages/GachaKit/Tests/GachaKitTests/GachaKitTests.swift +++ b/Packages/GachaKit/Tests/GachaKitTests/GachaKitTests.swift @@ -15,6 +15,8 @@ private let testDataPath: String = packageRootPath + "/Tests/TestData/" // MARK: - GachaKitTests final class GachaKitTests: XCTestCase { + // MARK: - SRGFv1 + func testDecodingSRGF() throws { let filePath: String = testDataPath + "SRGFv1_Sample.json" let url = URL(fileURLWithPath: filePath) @@ -58,4 +60,58 @@ final class GachaKitTests: XCTestCase { }.sorted { $0.id < $1.id } XCTAssertEqual(rawList, newList) } + + // MARK: - UIGFv4 + + func testDecodingUIGFv4() throws { + let filePath: String = testDataPath + "UIGFv4_Sample.json" + let url = URL(fileURLWithPath: filePath) + let data = try Data(contentsOf: url) + let decoded = try JSONDecoder().decode(UIGFv4.self, from: data) + XCTAssertEqual(decoded.info.exportApp, "DodocoTales.StarRail") + guard let profile = decoded.hsrProfiles?.first else { + assertionFailure("No profile found.") + return + } + let x = profile.list.filter { + $0.gachaType == .characterEventWarp + && $0.rankType == "5" + && GachaItem.ItemType(itemID: $0.itemID) == .characters + } + XCTAssertEqual(x.count, 3) + print(x.compactMap(\.name).joined(separator: "\n")) + let y = profile.list.filter { + $0.gachaType == .lightConeEventWarp + && $0.rankType == "5" + && GachaItem.ItemType(itemID: $0.itemID) == .lightCones + } + XCTAssertEqual(y.count, 0) + print(y.compactMap(\.name).joined(separator: "\n")) + } + + func testListConsistencyUIGFv4() throws { + let filePath: String = testDataPath + "UIGFv4_Sample.json" + let url = URL(fileURLWithPath: filePath) + let data = try Data(contentsOf: url) + let decoded = try JSONDecoder().decode(UIGFv4.self, from: data) + guard let profile = decoded.hsrProfiles?.first else { + assertionFailure("No profile found.") + return + } + let gachaLang = profile.lang ?? .enUS + let rawList = profile.list.sorted { $0.id < $1.id }.map { oldValue in + var newValue = oldValue + let newType = GachaItem.ItemType(itemID: oldValue.itemID) + newValue.itemType = newType.translatedRaw(for: gachaLang) + return newValue + } + let timeZone = profile.timezone + let gachaEntries = rawList.map { + $0.toGachaEntry(uid: "114514810", lang: gachaLang, timeZoneDelta: timeZone) + } + let newList = gachaEntries.map { + $0.toUIGFEntry(langOverride: gachaLang, timeZoneDeltaOverride: timeZone) + }.sorted { $0.id < $1.id } + XCTAssertEqual(rawList, newList) + } } diff --git a/Packages/GachaKit/Tests/TestData/UIGFv4_Sample.json b/Packages/GachaKit/Tests/TestData/UIGFv4_Sample.json new file mode 100644 index 00000000..c684ae52 --- /dev/null +++ b/Packages/GachaKit/Tests/TestData/UIGFv4_Sample.json @@ -0,0 +1,4705 @@ +{ + "info": { + "export_time": "2024-07-10 23:08:39", + "export_timestamp": 1720652919, + "export_app": "DodocoTales.StarRail", + "export_app_version": "114.5.14.1919810", + "version": "v4.0" + }, + "hkrpg": [ + { + "uid": "114514810", + "lang": "zh-cn", + "timezone": 8, + "list": [ + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "1009", + "count": "1", + "time": "2023-04-26 12:56:38", + "name": "艾丝妲", + "item_type": "角色", + "rank_type": "4", + "id": "1682482200042199753" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20020", + "count": "1", + "time": "2023-04-26 12:57:31", + "name": "睿见", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200043041353" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20009", + "count": "1", + "time": "2023-04-26 12:57:31", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200043041453" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "21018", + "count": "1", + "time": "2023-04-26 12:57:31", + "name": "舞!舞!舞!", + "item_type": "光锥", + "rank_type": "4", + "id": "1682482200043041553" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20004", + "count": "1", + "time": "2023-04-26 12:57:31", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200043041653" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20005", + "count": "1", + "time": "2023-04-26 12:57:31", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200043041753" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20014", + "count": "1", + "time": "2023-04-26 12:57:31", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200043041853" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20017", + "count": "1", + "time": "2023-04-26 12:57:31", + "name": "开疆", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200043041953" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20008", + "count": "1", + "time": "2023-04-26 12:57:31", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200043042053" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20000", + "count": "1", + "time": "2023-04-26 12:57:31", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200043042153" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20014", + "count": "1", + "time": "2023-04-26 12:57:31", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200043042253" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20016", + "count": "1", + "time": "2023-04-26 12:59:19", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200044628653" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "1009", + "count": "1", + "time": "2023-04-26 12:59:19", + "name": "艾丝妲", + "item_type": "角色", + "rank_type": "4", + "id": "1682482200044628753" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20011", + "count": "1", + "time": "2023-04-26 12:59:19", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200044628853" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20017", + "count": "1", + "time": "2023-04-26 12:59:19", + "name": "开疆", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200044628953" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20017", + "count": "1", + "time": "2023-04-26 12:59:19", + "name": "开疆", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200044629053" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20011", + "count": "1", + "time": "2023-04-26 12:59:19", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200044629153" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20018", + "count": "1", + "time": "2023-04-26 12:59:19", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200044629253" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20006", + "count": "1", + "time": "2023-04-26 12:59:19", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200044629353" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20015", + "count": "1", + "time": "2023-04-26 12:59:19", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200044629453" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20012", + "count": "1", + "time": "2023-04-26 12:59:19", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1682482200044629553" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "21010", + "count": "1", + "time": "2023-04-26 15:18:40", + "name": "论剑", + "item_type": "光锥", + "rank_type": "4", + "id": "1682493000008646453" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20012", + "count": "1", + "time": "2023-04-26 15:18:40", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1682493000008646553" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20010", + "count": "1", + "time": "2023-04-26 15:18:40", + "name": "戍御", + "item_type": "光锥", + "rank_type": "3", + "id": "1682493000008646653" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20018", + "count": "1", + "time": "2023-04-26 15:18:40", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1682493000008646753" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20008", + "count": "1", + "time": "2023-04-26 15:18:40", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1682493000008646853" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20018", + "count": "1", + "time": "2023-04-26 15:18:40", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1682493000008646953" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20012", + "count": "1", + "time": "2023-04-26 15:18:40", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1682493000008647053" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20018", + "count": "1", + "time": "2023-04-26 15:18:40", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1682493000008647153" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20016", + "count": "1", + "time": "2023-04-26 15:18:40", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1682493000008647253" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20010", + "count": "1", + "time": "2023-04-26 15:18:40", + "name": "戍御", + "item_type": "光锥", + "rank_type": "3", + "id": "1682493000008647353" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20003", + "count": "1", + "time": "2023-04-26 18:38:44", + "name": "琥珀", + "item_type": "光锥", + "rank_type": "3", + "id": "1682503800017658253" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "1013", + "count": "1", + "time": "2023-04-26 23:00:15", + "name": "黑塔", + "item_type": "角色", + "rank_type": "4", + "id": "1682521800000138453" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20018", + "count": "1", + "time": "2023-04-26 23:00:15", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1682521800000138553" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "1001", + "count": "1", + "time": "2023-04-26 23:00:15", + "name": "三月七", + "item_type": "角色", + "rank_type": "4", + "id": "1682521800000138653" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20017", + "count": "1", + "time": "2023-04-26 23:00:15", + "name": "开疆", + "item_type": "光锥", + "rank_type": "3", + "id": "1682521800000138753" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20018", + "count": "1", + "time": "2023-04-26 23:00:15", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1682521800000138853" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20010", + "count": "1", + "time": "2023-04-26 23:00:15", + "name": "戍御", + "item_type": "光锥", + "rank_type": "3", + "id": "1682521800000138953" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20006", + "count": "1", + "time": "2023-04-26 23:00:15", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1682521800000139053" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20000", + "count": "1", + "time": "2023-04-26 23:00:15", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1682521800000139153" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20016", + "count": "1", + "time": "2023-04-26 23:00:15", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1682521800000139253" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20004", + "count": "1", + "time": "2023-04-26 23:00:15", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1682521800000139353" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20002", + "count": "1", + "time": "2023-04-27 20:49:54", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1682597400014032253" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "21009", + "count": "1", + "time": "2023-04-27 20:49:54", + "name": "朗道的选择", + "item_type": "光锥", + "rank_type": "4", + "id": "1682597400014032353" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "21020", + "count": "1", + "time": "2023-04-27 20:49:54", + "name": "天才们的休憩", + "item_type": "光锥", + "rank_type": "4", + "id": "1682597400014032453" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20006", + "count": "1", + "time": "2023-04-27 20:49:54", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1682597400014032553" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20018", + "count": "1", + "time": "2023-04-27 20:49:54", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1682597400014032653" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20009", + "count": "1", + "time": "2023-04-27 20:49:54", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1682597400014032753" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20006", + "count": "1", + "time": "2023-04-27 20:49:54", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1682597400014032853" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "20002", + "count": "1", + "time": "2023-04-27 20:49:54", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1682597400014032953" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "1009", + "count": "1", + "time": "2023-04-27 20:49:54", + "name": "艾丝妲", + "item_type": "角色", + "rank_type": "4", + "id": "1682597400014033053" + }, + { + "gacha_id": "4001", + "gacha_type": "2", + "item_id": "1211", + "count": "1", + "time": "2023-04-27 20:49:54", + "name": "白露", + "item_type": "角色", + "rank_type": "5", + "id": "1682597400014033153" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20004", + "count": "1", + "time": "2023-04-27 22:36:15", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1682604600013370753" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20007", + "count": "1", + "time": "2023-04-27 22:36:15", + "name": "离弦", + "item_type": "光锥", + "rank_type": "3", + "id": "1682604600013370853" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20007", + "count": "1", + "time": "2023-04-27 22:36:15", + "name": "离弦", + "item_type": "光锥", + "rank_type": "3", + "id": "1682604600013370953" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20001", + "count": "1", + "time": "2023-04-27 22:36:15", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1682604600013371053" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "1106", + "count": "1", + "time": "2023-04-27 22:36:15", + "name": "佩拉", + "item_type": "角色", + "rank_type": "4", + "id": "1682604600013371153" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20018", + "count": "1", + "time": "2023-04-27 22:36:15", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1682604600013371253" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20003", + "count": "1", + "time": "2023-04-27 22:36:15", + "name": "琥珀", + "item_type": "光锥", + "rank_type": "3", + "id": "1682604600013371353" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20013", + "count": "1", + "time": "2023-04-27 22:36:15", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1682604600013371453" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20010", + "count": "1", + "time": "2023-04-27 22:36:15", + "name": "戍御", + "item_type": "光锥", + "rank_type": "3", + "id": "1682604600013371553" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20013", + "count": "1", + "time": "2023-04-27 22:36:15", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1682604600013371653" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20011", + "count": "1", + "time": "2023-04-28 00:05:36", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1682611800001924953" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20001", + "count": "1", + "time": "2023-04-28 00:05:36", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1682611800001925053" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20004", + "count": "1", + "time": "2023-04-28 00:05:36", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1682611800001925153" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "1206", + "count": "1", + "time": "2023-04-28 00:05:36", + "name": "素裳", + "item_type": "角色", + "rank_type": "4", + "id": "1682611800001925253" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20014", + "count": "1", + "time": "2023-04-28 00:05:36", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1682611800001925353" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20013", + "count": "1", + "time": "2023-04-28 00:05:36", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1682611800001925453" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20002", + "count": "1", + "time": "2023-04-28 00:05:36", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1682611800001925553" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20006", + "count": "1", + "time": "2023-04-28 00:05:36", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1682611800001925653" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20014", + "count": "1", + "time": "2023-04-28 00:05:36", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1682611800001925753" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20012", + "count": "1", + "time": "2023-04-28 00:05:36", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1682611800001925853" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20002", + "count": "1", + "time": "2023-04-29 20:52:07", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1682770200012258553" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20004", + "count": "1", + "time": "2023-04-29 20:52:07", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1682770200012258653" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-04-29 20:52:07", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1682770200012258753" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20018", + "count": "1", + "time": "2023-04-29 20:52:07", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1682770200012258853" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20008", + "count": "1", + "time": "2023-04-29 20:52:07", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1682770200012258953" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20010", + "count": "1", + "time": "2023-04-29 20:52:07", + "name": "戍御", + "item_type": "光锥", + "rank_type": "3", + "id": "1682770200012259053" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20008", + "count": "1", + "time": "2023-04-29 20:52:07", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1682770200012259153" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20001", + "count": "1", + "time": "2023-04-29 20:52:07", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1682770200012259253" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "1109", + "count": "1", + "time": "2023-04-29 20:52:07", + "name": "虎克", + "item_type": "角色", + "rank_type": "4", + "id": "1682770200012259353" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20015", + "count": "1", + "time": "2023-04-29 20:52:07", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1682770200012259453" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20009", + "count": "1", + "time": "2023-04-29 22:04:30", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400001236253" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20005", + "count": "1", + "time": "2023-04-29 22:04:30", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400001236353" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20003", + "count": "1", + "time": "2023-04-29 22:04:30", + "name": "琥珀", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400001236453" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "21001", + "count": "1", + "time": "2023-04-29 22:04:30", + "name": "晚安与睡颜", + "item_type": "光锥", + "rank_type": "4", + "id": "1682777400001236553" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20005", + "count": "1", + "time": "2023-04-29 22:04:30", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400001236653" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20011", + "count": "1", + "time": "2023-04-29 22:04:30", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400001236753" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20000", + "count": "1", + "time": "2023-04-29 22:04:30", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400001236853" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20015", + "count": "1", + "time": "2023-04-29 22:04:30", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400001236953" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20009", + "count": "1", + "time": "2023-04-29 22:04:30", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400001237053" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20013", + "count": "1", + "time": "2023-04-29 22:04:30", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400001237153" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20001", + "count": "1", + "time": "2023-04-29 22:39:20", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400010721253" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20001", + "count": "1", + "time": "2023-04-29 22:39:20", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400010721353" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "1105", + "count": "1", + "time": "2023-04-29 22:39:20", + "name": "娜塔莎", + "item_type": "角色", + "rank_type": "4", + "id": "1682777400010721453" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20012", + "count": "1", + "time": "2023-04-29 22:39:20", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400010721553" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20007", + "count": "1", + "time": "2023-04-29 22:39:20", + "name": "离弦", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400010721653" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20004", + "count": "1", + "time": "2023-04-29 22:39:20", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400010721753" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20012", + "count": "1", + "time": "2023-04-29 22:39:20", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400010721853" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20000", + "count": "1", + "time": "2023-04-29 22:39:20", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400010721953" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20016", + "count": "1", + "time": "2023-04-29 22:39:20", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1682777400010722053" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "23000", + "count": "1", + "time": "2023-04-29 22:39:20", + "name": "银河铁道之夜", + "item_type": "光锥", + "rank_type": "5", + "id": "1682777400010722153" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20006", + "count": "1", + "time": "2023-04-29 23:40:01", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000010976353" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20004", + "count": "1", + "time": "2023-04-29 23:40:01", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000010976453" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20020", + "count": "1", + "time": "2023-04-29 23:40:01", + "name": "睿见", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000010976553" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20010", + "count": "1", + "time": "2023-04-29 23:40:01", + "name": "戍御", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000010976653" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20006", + "count": "1", + "time": "2023-04-29 23:40:01", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000010976753" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-04-29 23:40:01", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000010976853" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20011", + "count": "1", + "time": "2023-04-29 23:40:01", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000010976953" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20011", + "count": "1", + "time": "2023-04-29 23:40:01", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000010977053" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "1109", + "count": "1", + "time": "2023-04-29 23:40:01", + "name": "虎克", + "item_type": "角色", + "rank_type": "4", + "id": "1682781000010977153" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20009", + "count": "1", + "time": "2023-04-29 23:40:01", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000010977253" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20000", + "count": "1", + "time": "2023-04-29 23:40:36", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011135453" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20006", + "count": "1", + "time": "2023-04-29 23:40:36", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011135553" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20002", + "count": "1", + "time": "2023-04-29 23:40:36", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011135653" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20008", + "count": "1", + "time": "2023-04-29 23:40:36", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011135753" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20012", + "count": "1", + "time": "2023-04-29 23:40:36", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011135853" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20003", + "count": "1", + "time": "2023-04-29 23:40:36", + "name": "琥珀", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011135953" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-04-29 23:40:36", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011136053" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "1105", + "count": "1", + "time": "2023-04-29 23:40:36", + "name": "娜塔莎", + "item_type": "角色", + "rank_type": "4", + "id": "1682781000011136153" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20004", + "count": "1", + "time": "2023-04-29 23:40:36", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011136253" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20007", + "count": "1", + "time": "2023-04-29 23:40:36", + "name": "离弦", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011136353" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20000", + "count": "1", + "time": "2023-04-29 23:40:49", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011177753" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20003", + "count": "1", + "time": "2023-04-29 23:40:49", + "name": "琥珀", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011177853" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "1104", + "count": "1", + "time": "2023-04-29 23:40:49", + "name": "杰帕德", + "item_type": "角色", + "rank_type": "5", + "id": "1682781000011177953" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20016", + "count": "1", + "time": "2023-04-29 23:40:49", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011178053" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20000", + "count": "1", + "time": "2023-04-29 23:40:49", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011178153" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20002", + "count": "1", + "time": "2023-04-29 23:40:49", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011178253" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "21001", + "count": "1", + "time": "2023-04-29 23:40:49", + "name": "晚安与睡颜", + "item_type": "光锥", + "rank_type": "4", + "id": "1682781000011178353" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20018", + "count": "1", + "time": "2023-04-29 23:40:49", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011178453" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20001", + "count": "1", + "time": "2023-04-29 23:40:49", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011178553" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20006", + "count": "1", + "time": "2023-04-29 23:40:49", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1682781000011178653" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20010", + "count": "1", + "time": "2023-04-30 11:27:34", + "name": "戍御", + "item_type": "光锥", + "rank_type": "3", + "id": "1682824200006154453" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20018", + "count": "1", + "time": "2023-04-30 11:27:34", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1682824200006154553" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20018", + "count": "1", + "time": "2023-04-30 11:27:34", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1682824200006154653" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20007", + "count": "1", + "time": "2023-04-30 11:27:34", + "name": "离弦", + "item_type": "光锥", + "rank_type": "3", + "id": "1682824200006154753" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20008", + "count": "1", + "time": "2023-04-30 11:27:34", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1682824200006154853" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "1106", + "count": "1", + "time": "2023-04-30 11:27:34", + "name": "佩拉", + "item_type": "角色", + "rank_type": "4", + "id": "1682824200006154953" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20014", + "count": "1", + "time": "2023-04-30 11:27:34", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1682824200006155053" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20008", + "count": "1", + "time": "2023-04-30 11:27:34", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1682824200006155153" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-04-30 11:27:34", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1682824200006155253" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20017", + "count": "1", + "time": "2023-04-30 11:27:34", + "name": "开疆", + "item_type": "光锥", + "rank_type": "3", + "id": "1682824200006155353" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20015", + "count": "1", + "time": "2023-04-30 22:08:09", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1682863800003728053" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20010", + "count": "1", + "time": "2023-04-30 22:08:09", + "name": "戍御", + "item_type": "光锥", + "rank_type": "3", + "id": "1682863800003728153" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "1201", + "count": "1", + "time": "2023-04-30 22:08:09", + "name": "青雀", + "item_type": "角色", + "rank_type": "4", + "id": "1682863800003728253" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20015", + "count": "1", + "time": "2023-04-30 22:08:09", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1682863800003728353" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20017", + "count": "1", + "time": "2023-04-30 22:08:09", + "name": "开疆", + "item_type": "光锥", + "rank_type": "3", + "id": "1682863800003728453" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-04-30 22:08:09", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1682863800003728553" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-04-30 22:08:09", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1682863800003728653" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20004", + "count": "1", + "time": "2023-04-30 22:08:09", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1682863800003728753" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20000", + "count": "1", + "time": "2023-04-30 22:08:09", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1682863800003728853" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20012", + "count": "1", + "time": "2023-04-30 22:08:09", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1682863800003728953" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20020", + "count": "1", + "time": "2023-04-30 23:44:18", + "name": "睿见", + "item_type": "光锥", + "rank_type": "3", + "id": "1682867400015879253" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "1109", + "count": "1", + "time": "2023-04-30 23:44:18", + "name": "虎克", + "item_type": "角色", + "rank_type": "4", + "id": "1682867400015879353" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20010", + "count": "1", + "time": "2023-04-30 23:44:18", + "name": "戍御", + "item_type": "光锥", + "rank_type": "3", + "id": "1682867400015879453" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20003", + "count": "1", + "time": "2023-04-30 23:44:18", + "name": "琥珀", + "item_type": "光锥", + "rank_type": "3", + "id": "1682867400015879553" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20001", + "count": "1", + "time": "2023-04-30 23:44:18", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1682867400015879653" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20005", + "count": "1", + "time": "2023-04-30 23:44:18", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1682867400015879753" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20018", + "count": "1", + "time": "2023-04-30 23:44:18", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1682867400015879853" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20019", + "count": "1", + "time": "2023-04-30 23:44:18", + "name": "调和", + "item_type": "光锥", + "rank_type": "3", + "id": "1682867400015879953" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20012", + "count": "1", + "time": "2023-04-30 23:44:18", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1682867400015880053" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20009", + "count": "1", + "time": "2023-04-30 23:44:18", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1682867400015880153" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20017", + "count": "1", + "time": "2023-05-01 09:43:10", + "name": "开疆", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400013843453" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "21003", + "count": "1", + "time": "2023-05-01 09:43:10", + "name": "唯有沉默", + "item_type": "光锥", + "rank_type": "4", + "id": "1682903400013843553" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20020", + "count": "1", + "time": "2023-05-01 09:43:10", + "name": "睿见", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400013843653" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20003", + "count": "1", + "time": "2023-05-01 09:43:10", + "name": "琥珀", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400013843753" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20013", + "count": "1", + "time": "2023-05-01 09:43:10", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400013843853" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20011", + "count": "1", + "time": "2023-05-01 09:43:10", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400013843953" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20019", + "count": "1", + "time": "2023-05-01 09:43:10", + "name": "调和", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400013844053" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20020", + "count": "1", + "time": "2023-05-01 09:43:10", + "name": "睿见", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400013844153" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20000", + "count": "1", + "time": "2023-05-01 09:43:10", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400013844253" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20009", + "count": "1", + "time": "2023-05-01 09:43:10", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400013844353" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "21011", + "count": "1", + "time": "2023-05-01 09:43:42", + "name": "与行星相会", + "item_type": "光锥", + "rank_type": "4", + "id": "1682903400014012853" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20006", + "count": "1", + "time": "2023-05-01 09:43:42", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400014012953" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20002", + "count": "1", + "time": "2023-05-01 09:43:42", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400014013053" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "1105", + "count": "1", + "time": "2023-05-01 09:43:42", + "name": "娜塔莎", + "item_type": "角色", + "rank_type": "4", + "id": "1682903400014013153" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "1106", + "count": "1", + "time": "2023-05-01 09:43:42", + "name": "佩拉", + "item_type": "角色", + "rank_type": "4", + "id": "1682903400014013253" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-05-01 09:43:42", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400014013353" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20018", + "count": "1", + "time": "2023-05-01 09:43:42", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400014013453" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20008", + "count": "1", + "time": "2023-05-01 09:43:42", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400014013553" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20020", + "count": "1", + "time": "2023-05-01 09:43:42", + "name": "睿见", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400014013653" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20005", + "count": "1", + "time": "2023-05-01 09:43:42", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1682903400014013753" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "1201", + "count": "1", + "time": "2023-05-01 18:54:21", + "name": "青雀", + "item_type": "角色", + "rank_type": "4", + "id": "1682935800010903253" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20013", + "count": "1", + "time": "2023-05-01 18:54:21", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1682935800010903353" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20014", + "count": "1", + "time": "2023-05-01 18:54:21", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1682935800010903453" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20011", + "count": "1", + "time": "2023-05-01 18:54:21", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1682935800010903553" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20016", + "count": "1", + "time": "2023-05-01 18:54:21", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1682935800010903653" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20013", + "count": "1", + "time": "2023-05-01 18:54:21", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1682935800010903753" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20011", + "count": "1", + "time": "2023-05-01 18:54:21", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1682935800010903853" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20003", + "count": "1", + "time": "2023-05-01 18:54:21", + "name": "琥珀", + "item_type": "光锥", + "rank_type": "3", + "id": "1682935800010903953" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20011", + "count": "1", + "time": "2023-05-01 18:54:21", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1682935800010904053" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20008", + "count": "1", + "time": "2023-05-01 18:54:21", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1682935800010904153" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20019", + "count": "1", + "time": "2023-05-02 00:19:48", + "name": "调和", + "item_type": "光锥", + "rank_type": "3", + "id": "1682957400004217153" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20005", + "count": "1", + "time": "2023-05-02 00:19:48", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1682957400004217253" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20002", + "count": "1", + "time": "2023-05-02 00:19:48", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1682957400004217353" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "1109", + "count": "1", + "time": "2023-05-02 00:19:48", + "name": "虎克", + "item_type": "角色", + "rank_type": "4", + "id": "1682957400004217453" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20012", + "count": "1", + "time": "2023-05-02 00:19:48", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1682957400004217553" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20005", + "count": "1", + "time": "2023-05-02 00:19:48", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1682957400004217653" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20007", + "count": "1", + "time": "2023-05-02 00:19:48", + "name": "离弦", + "item_type": "光锥", + "rank_type": "3", + "id": "1682957400004217753" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20001", + "count": "1", + "time": "2023-05-02 00:19:48", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1682957400004217853" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20016", + "count": "1", + "time": "2023-05-02 00:19:48", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1682957400004217953" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "21014", + "count": "1", + "time": "2023-05-02 00:19:48", + "name": "此时恰好", + "item_type": "光锥", + "rank_type": "4", + "id": "1682957400004218053" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20020", + "count": "1", + "time": "2023-05-02 13:03:19", + "name": "睿见", + "item_type": "光锥", + "rank_type": "3", + "id": "1683004200000682053" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20003", + "count": "1", + "time": "2023-05-02 13:03:19", + "name": "琥珀", + "item_type": "光锥", + "rank_type": "3", + "id": "1683004200000682153" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20014", + "count": "1", + "time": "2023-05-02 13:03:19", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1683004200000682253" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20009", + "count": "1", + "time": "2023-05-02 13:03:19", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1683004200000682353" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20018", + "count": "1", + "time": "2023-05-02 13:03:19", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1683004200000682453" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-05-02 13:03:19", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1683004200000682553" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20009", + "count": "1", + "time": "2023-05-02 13:03:19", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1683004200000682653" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20008", + "count": "1", + "time": "2023-05-02 13:03:19", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1683004200000682753" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20014", + "count": "1", + "time": "2023-05-02 13:03:19", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1683004200000682853" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "1106", + "count": "1", + "time": "2023-05-02 13:03:19", + "name": "佩拉", + "item_type": "角色", + "rank_type": "4", + "id": "1683004200000682953" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20001", + "count": "1", + "time": "2023-05-02 18:20:45", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1683022200003149053" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20009", + "count": "1", + "time": "2023-05-02 18:20:45", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1683022200003149153" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20000", + "count": "1", + "time": "2023-05-02 18:20:45", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1683022200003149253" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20007", + "count": "1", + "time": "2023-05-02 18:20:45", + "name": "离弦", + "item_type": "光锥", + "rank_type": "3", + "id": "1683022200003149353" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20006", + "count": "1", + "time": "2023-05-02 18:20:45", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1683022200003149453" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20018", + "count": "1", + "time": "2023-05-02 18:20:45", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1683022200003149553" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20005", + "count": "1", + "time": "2023-05-02 18:20:45", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1683022200003149653" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20006", + "count": "1", + "time": "2023-05-02 18:20:45", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1683022200003149753" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "1105", + "count": "1", + "time": "2023-05-02 18:20:45", + "name": "娜塔莎", + "item_type": "角色", + "rank_type": "4", + "id": "1683022200003149853" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "1102", + "count": "1", + "time": "2023-05-02 18:20:45", + "name": "希儿", + "item_type": "角色", + "rank_type": "5", + "id": "1683022200003149953" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "21017", + "count": "1", + "time": "2023-05-02 20:50:19", + "name": "点个关注吧!", + "item_type": "光锥", + "rank_type": "4", + "id": "1683029400008024753" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20013", + "count": "1", + "time": "2023-05-02 20:50:19", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1683029400008024853" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20017", + "count": "1", + "time": "2023-05-02 20:50:19", + "name": "开疆", + "item_type": "光锥", + "rank_type": "3", + "id": "1683029400008024953" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20016", + "count": "1", + "time": "2023-05-02 20:50:19", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1683029400008025053" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20015", + "count": "1", + "time": "2023-05-02 20:50:19", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1683029400008025153" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20015", + "count": "1", + "time": "2023-05-02 20:50:19", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1683029400008025253" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "21007", + "count": "1", + "time": "2023-05-02 20:50:19", + "name": "同一种心情", + "item_type": "光锥", + "rank_type": "4", + "id": "1683029400008025353" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20018", + "count": "1", + "time": "2023-05-02 20:50:19", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1683029400008025453" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20018", + "count": "1", + "time": "2023-05-02 20:50:19", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1683029400008025553" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20014", + "count": "1", + "time": "2023-05-02 20:50:19", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1683029400008025653" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20003", + "count": "1", + "time": "2023-05-03 18:15:00", + "name": "琥珀", + "item_type": "光锥", + "rank_type": "3", + "id": "1683108600001682553" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20009", + "count": "1", + "time": "2023-05-03 18:15:00", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1683108600001682653" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20016", + "count": "1", + "time": "2023-05-03 18:15:00", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1683108600001682753" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20018", + "count": "1", + "time": "2023-05-03 18:15:00", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1683108600001682853" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20018", + "count": "1", + "time": "2023-05-03 18:15:00", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1683108600001682953" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "1009", + "count": "1", + "time": "2023-05-03 18:15:00", + "name": "艾丝妲", + "item_type": "角色", + "rank_type": "4", + "id": "1683108600001683053" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20001", + "count": "1", + "time": "2023-05-03 18:15:00", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1683108600001683153" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20006", + "count": "1", + "time": "2023-05-03 18:15:00", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1683108600001683253" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20019", + "count": "1", + "time": "2023-05-03 18:15:00", + "name": "调和", + "item_type": "光锥", + "rank_type": "3", + "id": "1683108600001683353" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20005", + "count": "1", + "time": "2023-05-03 18:15:00", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1683108600001683453" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20004", + "count": "1", + "time": "2023-05-07 22:41:51", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1683468600004519653" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20008", + "count": "1", + "time": "2023-05-07 22:41:51", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1683468600004519753" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20011", + "count": "1", + "time": "2023-05-07 22:41:51", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1683468600004519853" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20019", + "count": "1", + "time": "2023-05-07 22:41:51", + "name": "调和", + "item_type": "光锥", + "rank_type": "3", + "id": "1683468600004519953" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "21013", + "count": "1", + "time": "2023-05-07 22:41:51", + "name": "别让世界静下来", + "item_type": "光锥", + "rank_type": "4", + "id": "1683468600004520053" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20004", + "count": "1", + "time": "2023-05-07 22:41:51", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1683468600004520153" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20005", + "count": "1", + "time": "2023-05-07 22:41:51", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1683468600004520253" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20005", + "count": "1", + "time": "2023-05-07 22:41:51", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1683468600004520353" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20000", + "count": "1", + "time": "2023-05-07 22:41:51", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1683468600004520453" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20007", + "count": "1", + "time": "2023-05-07 22:41:51", + "name": "离弦", + "item_type": "光锥", + "rank_type": "3", + "id": "1683468600004520553" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20009", + "count": "1", + "time": "2023-05-08 22:15:59", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1683555000001598253" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "1201", + "count": "1", + "time": "2023-05-09 20:20:10", + "name": "青雀", + "item_type": "角色", + "rank_type": "4", + "id": "1683634200001415553" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20009", + "count": "1", + "time": "2023-05-09 20:20:15", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1683634200001424553" + }, + { + "gacha_id": "2003", + "gacha_type": "11", + "item_id": "20020", + "count": "1", + "time": "2023-05-13 00:49:56", + "name": "睿见", + "item_type": "光锥", + "rank_type": "3", + "id": "1683907800003888453" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20015", + "count": "1", + "time": "2023-05-13 20:45:44", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1683979800003496553" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "1105", + "count": "1", + "time": "2023-05-14 22:51:20", + "name": "娜塔莎", + "item_type": "角色", + "rank_type": "4", + "id": "1684073400002912553" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20003", + "count": "1", + "time": "2023-05-16 22:03:09", + "name": "琥珀", + "item_type": "光锥", + "rank_type": "3", + "id": "1684246200000138053" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20013", + "count": "1", + "time": "2023-05-16 22:03:13", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1684246200000140853" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20014", + "count": "1", + "time": "2023-05-17 18:18:04", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200118591953" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20017", + "count": "1", + "time": "2023-05-17 18:18:04", + "name": "开疆", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200118592053" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20011", + "count": "1", + "time": "2023-05-17 18:18:04", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200118592153" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20005", + "count": "1", + "time": "2023-05-17 18:18:04", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200118592253" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20003", + "count": "1", + "time": "2023-05-17 18:18:04", + "name": "琥珀", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200118592353" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20008", + "count": "1", + "time": "2023-05-17 18:18:04", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200118592453" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "1001", + "count": "1", + "time": "2023-05-17 18:18:04", + "name": "三月七", + "item_type": "角色", + "rank_type": "4", + "id": "1684318200118592553" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20006", + "count": "1", + "time": "2023-05-17 18:18:04", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200118592653" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-05-17 18:18:04", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200118592753" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20015", + "count": "1", + "time": "2023-05-17 18:18:04", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200118592853" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20008", + "count": "1", + "time": "2023-05-17 18:18:14", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119094753" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20015", + "count": "1", + "time": "2023-05-17 18:18:14", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119094853" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20004", + "count": "1", + "time": "2023-05-17 18:18:14", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119094953" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20012", + "count": "1", + "time": "2023-05-17 18:18:14", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119095053" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20005", + "count": "1", + "time": "2023-05-17 18:18:14", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119095153" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "21006", + "count": "1", + "time": "2023-05-17 18:18:14", + "name": "「我」的诞生", + "item_type": "光锥", + "rank_type": "4", + "id": "1684318200119095253" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20002", + "count": "1", + "time": "2023-05-17 18:18:14", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119095353" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20009", + "count": "1", + "time": "2023-05-17 18:18:14", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119095453" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20001", + "count": "1", + "time": "2023-05-17 18:18:14", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119095553" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20018", + "count": "1", + "time": "2023-05-17 18:18:14", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119095653" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20002", + "count": "1", + "time": "2023-05-17 18:18:19", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119354253" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20019", + "count": "1", + "time": "2023-05-17 18:18:19", + "name": "调和", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119354353" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20000", + "count": "1", + "time": "2023-05-17 18:18:19", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119354453" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20008", + "count": "1", + "time": "2023-05-17 18:18:19", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119354553" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-05-17 18:18:19", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119354653" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "1206", + "count": "1", + "time": "2023-05-17 18:18:19", + "name": "素裳", + "item_type": "角色", + "rank_type": "4", + "id": "1684318200119354753" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20008", + "count": "1", + "time": "2023-05-17 18:18:19", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119354853" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-05-17 18:18:19", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119354953" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20004", + "count": "1", + "time": "2023-05-17 18:18:19", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119355053" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20017", + "count": "1", + "time": "2023-05-17 18:18:19", + "name": "开疆", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119355153" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20006", + "count": "1", + "time": "2023-05-17 18:18:32", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119969053" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20015", + "count": "1", + "time": "2023-05-17 18:18:32", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119969153" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20014", + "count": "1", + "time": "2023-05-17 18:18:32", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119969253" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20020", + "count": "1", + "time": "2023-05-17 18:18:32", + "name": "睿见", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119969353" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20005", + "count": "1", + "time": "2023-05-17 18:18:32", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119969453" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "21016", + "count": "1", + "time": "2023-05-17 18:18:32", + "name": "宇宙市场趋势", + "item_type": "光锥", + "rank_type": "4", + "id": "1684318200119969553" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20008", + "count": "1", + "time": "2023-05-17 18:18:32", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119969653" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20016", + "count": "1", + "time": "2023-05-17 18:18:32", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119969753" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20006", + "count": "1", + "time": "2023-05-17 18:18:32", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119969853" + }, + { + "gacha_id": "2004", + "gacha_type": "11", + "item_id": "20015", + "count": "1", + "time": "2023-05-17 18:18:32", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1684318200119969953" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20002", + "count": "1", + "time": "2023-05-17 21:58:24", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1684329000019676253" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20012", + "count": "1", + "time": "2023-05-18 21:45:30", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1684415400004135753" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20002", + "count": "1", + "time": "2023-05-21 00:14:14", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1684599000001068853" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20007", + "count": "1", + "time": "2023-05-21 22:58:09", + "name": "离弦", + "item_type": "光锥", + "rank_type": "3", + "id": "1684678200003221753" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20016", + "count": "1", + "time": "2023-05-21 23:02:37", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1684681800000133453" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20010", + "count": "1", + "time": "2023-05-21 23:02:41", + "name": "戍御", + "item_type": "光锥", + "rank_type": "3", + "id": "1684681800000138953" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "21019", + "count": "1", + "time": "2023-05-21 23:02:44", + "name": "在蓝天下", + "item_type": "光锥", + "rank_type": "4", + "id": "1684681800000140953" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20012", + "count": "1", + "time": "2023-05-21 23:02:48", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1684681800000143153" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20018", + "count": "1", + "time": "2023-05-21 23:02:51", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1684681800000147653" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20005", + "count": "1", + "time": "2023-05-22 23:16:22", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1684768200001180453" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20015", + "count": "1", + "time": "2023-05-22 23:27:44", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1684768200001927653" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20016", + "count": "1", + "time": "2023-05-23 13:38:31", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1684818600001806153" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20011", + "count": "1", + "time": "2023-05-24 13:43:42", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1684905000001609553" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20018", + "count": "1", + "time": "2023-05-25 00:42:27", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1684944600001865353" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20004", + "count": "1", + "time": "2023-05-26 01:04:23", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1685034600000115353" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20017", + "count": "1", + "time": "2023-05-26 01:04:26", + "name": "开疆", + "item_type": "光锥", + "rank_type": "3", + "id": "1685034600000116153" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "1002", + "count": "1", + "time": "2023-05-26 23:48:36", + "name": "丹恒", + "item_type": "角色", + "rank_type": "4", + "id": "1685113800004255653" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20017", + "count": "1", + "time": "2023-05-27 22:28:55", + "name": "开疆", + "item_type": "光锥", + "rank_type": "3", + "id": "1685196600001768453" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "1209", + "count": "1", + "time": "2023-05-30 12:24:41", + "name": "彦卿", + "item_type": "角色", + "rank_type": "5", + "id": "1685419800000542653" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20002", + "count": "1", + "time": "2023-05-30 19:59:03", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1685445000001268753" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20012", + "count": "1", + "time": "2023-05-30 19:59:30", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1685445000001281553" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20009", + "count": "1", + "time": "2023-05-30 20:05:04", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1685448600000121653" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20016", + "count": "1", + "time": "2023-05-31 22:05:47", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1685542200000148053" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20003", + "count": "1", + "time": "2023-06-01 20:16:06", + "name": "琥珀", + "item_type": "光锥", + "rank_type": "3", + "id": "1685621400000692953" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20002", + "count": "1", + "time": "2023-06-01 20:16:16", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1685621400000698953" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20010", + "count": "1", + "time": "2023-06-01 20:16:20", + "name": "戍御", + "item_type": "光锥", + "rank_type": "3", + "id": "1685621400000701053" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "21020", + "count": "1", + "time": "2023-06-01 20:16:24", + "name": "天才们的休憩", + "item_type": "光锥", + "rank_type": "4", + "id": "1685621400000704053" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20008", + "count": "1", + "time": "2023-06-01 20:16:29", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1685621400000707253" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20013", + "count": "1", + "time": "2023-06-02 22:16:24", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1685715000001012853" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "1106", + "count": "1", + "time": "2023-06-06 00:43:29", + "name": "佩拉", + "item_type": "角色", + "rank_type": "4", + "id": "1685981400001351153" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20001", + "count": "1", + "time": "2023-06-07 10:54:32", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800009206553" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20015", + "count": "1", + "time": "2023-06-07 10:54:32", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800009206653" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20010", + "count": "1", + "time": "2023-06-07 10:54:32", + "name": "戍御", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800009206753" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20016", + "count": "1", + "time": "2023-06-07 10:54:32", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800009206853" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "1009", + "count": "1", + "time": "2023-06-07 10:54:32", + "name": "艾丝妲", + "item_type": "角色", + "rank_type": "4", + "id": "1686103800009206953" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20020", + "count": "1", + "time": "2023-06-07 10:54:32", + "name": "睿见", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800009207053" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-06-07 10:54:32", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800009207153" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20014", + "count": "1", + "time": "2023-06-07 10:54:32", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800009207253" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20010", + "count": "1", + "time": "2023-06-07 10:54:32", + "name": "戍御", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800009207353" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "21011", + "count": "1", + "time": "2023-06-07 10:54:32", + "name": "与行星相会", + "item_type": "光锥", + "rank_type": "4", + "id": "1686103800009207453" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20010", + "count": "1", + "time": "2023-06-07 10:54:41", + "name": "戍御", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800009485353" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20014", + "count": "1", + "time": "2023-06-07 10:54:41", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800009485453" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "1002", + "count": "1", + "time": "2023-06-07 10:54:41", + "name": "丹恒", + "item_type": "角色", + "rank_type": "4", + "id": "1686103800009485553" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20020", + "count": "1", + "time": "2023-06-07 10:54:41", + "name": "睿见", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800009485653" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20002", + "count": "1", + "time": "2023-06-07 10:54:41", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800009485753" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20015", + "count": "1", + "time": "2023-06-07 10:54:41", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800009485853" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20005", + "count": "1", + "time": "2023-06-07 10:54:41", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800009485953" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "1009", + "count": "1", + "time": "2023-06-07 10:54:41", + "name": "艾丝妲", + "item_type": "角色", + "rank_type": "4", + "id": "1686103800009486053" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-06-07 10:54:41", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800009486153" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "1211", + "count": "1", + "time": "2023-06-07 10:54:41", + "name": "白露", + "item_type": "角色", + "rank_type": "5", + "id": "1686103800009486253" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20020", + "count": "1", + "time": "2023-06-07 10:56:25", + "name": "睿见", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012532253" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20007", + "count": "1", + "time": "2023-06-07 10:56:25", + "name": "离弦", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012532353" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20009", + "count": "1", + "time": "2023-06-07 10:56:25", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012532453" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20004", + "count": "1", + "time": "2023-06-07 10:56:25", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012532553" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20004", + "count": "1", + "time": "2023-06-07 10:56:25", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012532653" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-06-07 10:56:25", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012532753" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "1013", + "count": "1", + "time": "2023-06-07 10:56:25", + "name": "黑塔", + "item_type": "角色", + "rank_type": "4", + "id": "1686103800012532853" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20004", + "count": "1", + "time": "2023-06-07 10:56:25", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012532953" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20011", + "count": "1", + "time": "2023-06-07 10:56:25", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012533053" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20009", + "count": "1", + "time": "2023-06-07 10:56:25", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012533153" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20015", + "count": "1", + "time": "2023-06-07 10:56:30", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012689953" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20006", + "count": "1", + "time": "2023-06-07 10:56:30", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012690053" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20009", + "count": "1", + "time": "2023-06-07 10:56:30", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012690153" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20000", + "count": "1", + "time": "2023-06-07 10:56:30", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012690253" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20001", + "count": "1", + "time": "2023-06-07 10:56:30", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012690353" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20016", + "count": "1", + "time": "2023-06-07 10:56:30", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012690453" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "1009", + "count": "1", + "time": "2023-06-07 10:56:30", + "name": "艾丝妲", + "item_type": "角色", + "rank_type": "4", + "id": "1686103800012690553" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-06-07 10:56:30", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012690653" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20011", + "count": "1", + "time": "2023-06-07 10:56:30", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012690753" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20001", + "count": "1", + "time": "2023-06-07 10:56:30", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012690853" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20005", + "count": "1", + "time": "2023-06-07 10:56:34", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012794453" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20012", + "count": "1", + "time": "2023-06-07 10:56:34", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012794553" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20012", + "count": "1", + "time": "2023-06-07 10:56:34", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012794653" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20012", + "count": "1", + "time": "2023-06-07 10:56:34", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012794753" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20004", + "count": "1", + "time": "2023-06-07 10:56:34", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012794853" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "21002", + "count": "1", + "time": "2023-06-07 10:56:34", + "name": "余生的第一天", + "item_type": "光锥", + "rank_type": "4", + "id": "1686103800012794953" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20018", + "count": "1", + "time": "2023-06-07 10:56:34", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012795053" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20008", + "count": "1", + "time": "2023-06-07 10:56:34", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012795153" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20000", + "count": "1", + "time": "2023-06-07 10:56:34", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012795253" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20016", + "count": "1", + "time": "2023-06-07 10:56:34", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012795353" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20014", + "count": "1", + "time": "2023-06-07 10:56:38", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012902953" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20009", + "count": "1", + "time": "2023-06-07 10:56:38", + "name": "乐圮", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012903053" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20010", + "count": "1", + "time": "2023-06-07 10:56:38", + "name": "戍御", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012903153" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20017", + "count": "1", + "time": "2023-06-07 10:56:38", + "name": "开疆", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012903253" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "1002", + "count": "1", + "time": "2023-06-07 10:56:38", + "name": "丹恒", + "item_type": "角色", + "rank_type": "4", + "id": "1686103800012903353" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20002", + "count": "1", + "time": "2023-06-07 10:56:38", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012903453" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20019", + "count": "1", + "time": "2023-06-07 10:56:38", + "name": "调和", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012903553" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20004", + "count": "1", + "time": "2023-06-07 10:56:38", + "name": "幽邃", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012903653" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20014", + "count": "1", + "time": "2023-06-07 10:56:38", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012903753" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-06-07 10:56:38", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800012903853" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20014", + "count": "1", + "time": "2023-06-07 10:56:42", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800013011753" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20002", + "count": "1", + "time": "2023-06-07 10:56:42", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800013011853" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-06-07 10:56:42", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800013011953" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20014", + "count": "1", + "time": "2023-06-07 10:56:42", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800013012053" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "21002", + "count": "1", + "time": "2023-06-07 10:56:42", + "name": "余生的第一天", + "item_type": "光锥", + "rank_type": "4", + "id": "1686103800013012153" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20014", + "count": "1", + "time": "2023-06-07 10:56:42", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800013012253" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20015", + "count": "1", + "time": "2023-06-07 10:56:42", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800013012353" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20006", + "count": "1", + "time": "2023-06-07 10:56:42", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800013012453" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20014", + "count": "1", + "time": "2023-06-07 10:56:42", + "name": "相抗", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800013012553" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20012", + "count": "1", + "time": "2023-06-07 10:56:42", + "name": "轮契", + "item_type": "光锥", + "rank_type": "3", + "id": "1686103800013012653" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20001", + "count": "1", + "time": "2023-06-08 23:26:55", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1686237000001623853" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20000", + "count": "1", + "time": "2023-06-08 23:26:55", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1686237000001623953" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20002", + "count": "1", + "time": "2023-06-08 23:26:55", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1686237000001624053" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "1009", + "count": "1", + "time": "2023-06-08 23:26:55", + "name": "艾丝妲", + "item_type": "角色", + "rank_type": "4", + "id": "1686237000001624153" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20001", + "count": "1", + "time": "2023-06-08 23:26:55", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1686237000001624253" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20001", + "count": "1", + "time": "2023-06-08 23:26:55", + "name": "物穰", + "item_type": "光锥", + "rank_type": "3", + "id": "1686237000001624353" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20003", + "count": "1", + "time": "2023-06-08 23:26:55", + "name": "琥珀", + "item_type": "光锥", + "rank_type": "3", + "id": "1686237000001624453" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20000", + "count": "1", + "time": "2023-06-08 23:26:55", + "name": "锋镝", + "item_type": "光锥", + "rank_type": "3", + "id": "1686237000001624553" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20002", + "count": "1", + "time": "2023-06-08 23:26:55", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1686237000001624653" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "1106", + "count": "1", + "time": "2023-06-08 23:26:55", + "name": "佩拉", + "item_type": "角色", + "rank_type": "4", + "id": "1686237000001624753" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20003", + "count": "1", + "time": "2023-06-09 00:50:47", + "name": "琥珀", + "item_type": "光锥", + "rank_type": "3", + "id": "1686240600002096753" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20017", + "count": "1", + "time": "2023-06-09 00:50:51", + "name": "开疆", + "item_type": "光锥", + "rank_type": "3", + "id": "1686240600002097653" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20011", + "count": "1", + "time": "2023-06-09 00:50:54", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1686240600002098553" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20017", + "count": "1", + "time": "2023-06-09 22:36:11", + "name": "开疆", + "item_type": "光锥", + "rank_type": "3", + "id": "1686319800002529353" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20015", + "count": "1", + "time": "2023-06-09 22:57:35", + "name": "蕃息", + "item_type": "光锥", + "rank_type": "3", + "id": "1686319800004002953" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20006", + "count": "1", + "time": "2023-06-09 23:28:31", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1686323400001945253" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "1103", + "count": "1", + "time": "2023-06-09 23:28:31", + "name": "希露瓦", + "item_type": "角色", + "rank_type": "4", + "id": "1686323400001945353" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20011", + "count": "1", + "time": "2023-06-09 23:28:31", + "name": "渊环", + "item_type": "光锥", + "rank_type": "3", + "id": "1686323400001945453" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20013", + "count": "1", + "time": "2023-06-09 23:28:31", + "name": "灵钥", + "item_type": "光锥", + "rank_type": "3", + "id": "1686323400001945553" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20016", + "count": "1", + "time": "2023-06-09 23:28:31", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1686323400001945653" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20008", + "count": "1", + "time": "2023-06-09 23:28:31", + "name": "嘉果", + "item_type": "光锥", + "rank_type": "3", + "id": "1686323400001945753" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20016", + "count": "1", + "time": "2023-06-09 23:28:31", + "name": "俱殁", + "item_type": "光锥", + "rank_type": "3", + "id": "1686323400001945853" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20006", + "count": "1", + "time": "2023-06-09 23:28:31", + "name": "智库", + "item_type": "光锥", + "rank_type": "3", + "id": "1686323400001945953" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20002", + "count": "1", + "time": "2023-06-09 23:28:31", + "name": "天倾", + "item_type": "光锥", + "rank_type": "3", + "id": "1686323400001946053" + }, + { + "gacha_id": "2005", + "gacha_type": "11", + "item_id": "20018", + "count": "1", + "time": "2023-06-09 23:28:31", + "name": "匿影", + "item_type": "光锥", + "rank_type": "3", + "id": "1686323400001946153" + }, + { + "gacha_id": "1001", + "gacha_type": "1", + "item_id": "20005", + "count": "1", + "time": "2023-06-09 23:48:54", + "name": "齐颂", + "item_type": "光锥", + "rank_type": "3", + "id": "1686323400003187353" + } + ], + "game_biz": "hkrpg_cn" + } + ] +} From 3ea5258d0e519ef652b895e9f76ce0f6509a61a8 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 13 Jul 2024 15:08:29 +0800 Subject: [PATCH 4/6] GachaKit // Add a public enum for choosing formats. --- Packages/GachaKit/Sources/GachaKit/GachaKit.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Packages/GachaKit/Sources/GachaKit/GachaKit.swift b/Packages/GachaKit/Sources/GachaKit/GachaKit.swift index aba8a9db..414b6bf7 100644 --- a/Packages/GachaKit/Sources/GachaKit/GachaKit.swift +++ b/Packages/GachaKit/Sources/GachaKit/GachaKit.swift @@ -5,6 +5,17 @@ import Foundation import HBMihoyoAPI +// MARK: - UIGFFormat + +public enum UIGFFormat: String, Identifiable, Sendable, Hashable { + case uigfv4 + case srgfv1 + + // MARK: Public + + public var id: String { rawValue } +} + // MARK: - GachaKit public enum GachaKit {} From fd739d1112e323bafd293c2cf944713279853ff7 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 13 Jul 2024 13:08:54 +0800 Subject: [PATCH 5/6] GachaItemMO // Add translator targeting UIGFv4. --- Features/Gacha/Impl/UIGFImpl.swift | 47 ++++++++++++++++++++++++ HSRPizzaHelper.xcodeproj/project.pbxproj | 4 ++ 2 files changed, 51 insertions(+) create mode 100644 Features/Gacha/Impl/UIGFImpl.swift diff --git a/Features/Gacha/Impl/UIGFImpl.swift b/Features/Gacha/Impl/UIGFImpl.swift new file mode 100644 index 00000000..b367940d --- /dev/null +++ b/Features/Gacha/Impl/UIGFImpl.swift @@ -0,0 +1,47 @@ +// (c) 2023 and onwards Pizza Studio (GPL v3.0 License). +// ==================== +// This code is released under the GPL v3.0 License (SPDX-License-Identifier: GPL-3.0) + +import CoreData +import Defaults +import EnkaKitHSR +import Foundation +import GachaKit +import HBMihoyoAPI +import SwiftUI + +extension GachaItemMO { + public func toUIGFEntry( + langOverride: GachaLanguageCode? = nil, + timeZoneDeltaOverride: Int? = nil + ) + -> UIGFv4.DataEntry { + toEntry().toUIGFEntry( + langOverride: langOverride, + timeZoneDeltaOverride: timeZoneDeltaOverride + ) + } +} + +extension UIGFv4.DataEntry { + public func toManagedModel( + uid: String, + lang: GachaLanguageCode?, + timeZoneDelta: Int + ) + -> GachaItemMO { + let rawResult = toGachaEntry(uid: uid, lang: lang, timeZoneDelta: timeZoneDelta) + return rawResult.toManagedModel() + } + + public func toManagedModel( + uid: String, + lang: GachaLanguageCode?, + timeZoneDelta: Int, + context: NSManagedObjectContext + ) + -> GachaItemMO { + let rawResult = toGachaEntry(uid: uid, lang: lang, timeZoneDelta: timeZoneDelta) + return rawResult.toManagedModel(context: context) + } +} diff --git a/HSRPizzaHelper.xcodeproj/project.pbxproj b/HSRPizzaHelper.xcodeproj/project.pbxproj index 6542ff9f..1986e7ce 100644 --- a/HSRPizzaHelper.xcodeproj/project.pbxproj +++ b/HSRPizzaHelper.xcodeproj/project.pbxproj @@ -39,6 +39,7 @@ 5BB6BD702ACAC529001D6847 /* DisplayOptionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BB6BD6F2ACAC529001D6847 /* DisplayOptionsView.swift */; }; 5BB792B22C1067C400AFCBF5 /* GetCookieQRCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BB792B12C1067C400AFCBF5 /* GetCookieQRCodeView.swift */; }; 5BCBAEF32C29BC3D00BAF156 /* GetCookieQRCodeView_HSR.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BCBAEF22C29BC3D00BAF156 /* GetCookieQRCodeView_HSR.swift */; }; + 5BE468222C42410800D5FE38 /* UIGFImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BE468212C42410800D5FE38 /* UIGFImpl.swift */; }; 5BF453502BD422FE00A842C0 /* DetailPortalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BF4534F2BD422FE00A842C0 /* DetailPortalView.swift */; }; BF06C4A52A04D42900EE9120 /* WebViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF06C4A42A04D42900EE9120 /* WebViews.swift */; }; BF06C4A82A04FD1F00EE9120 /* ReviewHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF06C4A72A04FD1F00EE9120 /* ReviewHandler.swift */; }; @@ -368,6 +369,7 @@ 5BB6BD6F2ACAC529001D6847 /* DisplayOptionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisplayOptionsView.swift; sourceTree = ""; }; 5BB792B12C1067C400AFCBF5 /* GetCookieQRCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetCookieQRCodeView.swift; sourceTree = ""; }; 5BCBAEF22C29BC3D00BAF156 /* GetCookieQRCodeView_HSR.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetCookieQRCodeView_HSR.swift; sourceTree = ""; }; + 5BE468212C42410800D5FE38 /* UIGFImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIGFImpl.swift; sourceTree = ""; }; 5BF4534F2BD422FE00A842C0 /* DetailPortalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailPortalView.swift; sourceTree = ""; }; BF06C4A42A04D42900EE9120 /* WebViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViews.swift; sourceTree = ""; }; BF06C4A72A04FD1F00EE9120 /* ReviewHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewHandler.swift; sourceTree = ""; }; @@ -604,6 +606,7 @@ isa = PBXGroup; children = ( 5B16985D2BDBEE770017660A /* SRGFImpl.swift */, + 5BE468212C42410800D5FE38 /* UIGFImpl.swift */, 5B23404C2BFA7C6700F1974A /* GachaNameViewRenderable.swift */, ); path = Impl; @@ -1666,6 +1669,7 @@ 5B4C5BAB2C09F3BD00A6EA05 /* WebImageView.swift in Sources */, EAEC11EB2A0241620024314D /* InAppDailyNoteCardView.swift in Sources */, EA80CFE12A0E8F2700002B53 /* RequestNotification.swift in Sources */, + 5BE468222C42410800D5FE38 /* UIGFImpl.swift in Sources */, EA1DE41F2A08C4DB00CFB37C /* WidgetBackgroundOptionsCollectionProvider.swift in Sources */, EA09B19D2A091B0200986D46 /* LatestVersionInformationChecker.swift in Sources */, EA5F23322A0BE87000D6D024 /* OnFocused.swift in Sources */, From cc7c118cb08a6ea903895583ad6b3b4db6b3d53b Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 13 Jul 2024 13:09:19 +0800 Subject: [PATCH 6/6] IGV & EGV // Add UIGFv4 export support. --- Features/Gacha/View/GachaView.swift | 4 +- .../Gacha/View/SRGF/ExportGachaView.swift | 212 +++++--- .../Gacha/View/SRGF/ImportGachaView.swift | 353 +++++++----- Internationalization/Localizable.xcstrings | 507 +++++++++++------- 4 files changed, 694 insertions(+), 382 deletions(-) diff --git a/Features/Gacha/View/GachaView.swift b/Features/Gacha/View/GachaView.swift index 9899955d..4ac2eefe 100644 --- a/Features/Gacha/View/GachaView.swift +++ b/Features/Gacha/View/GachaView.swift @@ -23,10 +23,10 @@ struct GachaView: View { NavigationLink("gacha.home.manage_gacha_record") { ManageGachaRecordView() } - NavigationLink("gacha.manage.srgf.import") { + NavigationLink("gacha.manage.uigf.import") { ImportGachaView() } - NavigationLink("gacha.manage.srgf.export") { + NavigationLink("gacha.manage.uigf.export") { ExportGachaView() }.disabled(noDataAvailable) } diff --git a/Features/Gacha/View/SRGF/ExportGachaView.swift b/Features/Gacha/View/SRGF/ExportGachaView.swift index 4eb49690..15a950a8 100644 --- a/Features/Gacha/View/SRGF/ExportGachaView.swift +++ b/Features/Gacha/View/SRGF/ExportGachaView.swift @@ -31,10 +31,7 @@ struct ExportGachaView: View { .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { - Button("app.gacha.data.export.button") { - exportButtonClicked() - } - .disabled(params.uid == nil) + exportButton() } } } @@ -45,17 +42,10 @@ struct ExportGachaView: View { isPresented: $isSucceedAlertShown, presenting: alert, actions: { _ in - Button("button.okay") { - isSucceedAlertShown = false - } + Button("button.okay") { isSucceedAlertShown = false } }, - message: { thisAlert in - switch thisAlert { - case let .succeed(url): - Text("gacha.export.fileSavedTo:\(url)") - default: - EmptyView() - } + message: { _ in + postAlertMessage() } ) .alert( @@ -63,31 +53,27 @@ struct ExportGachaView: View { isPresented: $isFailureAlertShown, presenting: alert, actions: { _ in - Button("button.okay") { - isFailureAlertShown = false - } + Button("button.okay") { isSucceedAlertShown = false } }, - message: { thisAlert in - switch thisAlert { - case let .failure(error): - Text("错误信息:\(error)") - default: - EmptyView() - } + message: { _ in + postAlertMessage() } ) .fileExporter( - isPresented: $isExporterPresented, - document: file, + isPresented: $isSRGFExporterPresented, + document: srgfJson?.asDocument, contentType: .json, - defaultFilename: defaultFileName + defaultFilename: fileNameStem ) { result in - switch result { - case let .success(url): - alert = .succeed(url: url.absoluteString) - case let .failure(failure): - alert = .failure(message: failure.localizedDescription) - } + handleFileExporterResult(result) + } + .fileExporter( + isPresented: $isUIGFExporterPresented, + document: uigfJson?.asDocument, + contentType: .json, + defaultFilename: fileNameStem + ) { result in + handleFileExporterResult(result) } } @@ -103,6 +89,10 @@ struct ExportGachaView: View { Text(code.localized).tag(code) } } + Picker("gacha.export.chooseFormat", selection: $currentFormat) { + Text(verbatim: "UIGFv4").tag(UIGFFormat.uigfv4) + Text(verbatim: "SRGFv1").tag(UIGFFormat.srgfv1) + } } footer: { Text("app.gacha.srgf.affLink.[SRGF](https://uigf.org/)") } @@ -111,31 +101,30 @@ struct ExportGachaView: View { @ViewBuilder func compactMain() -> some View { - Menu("gacha.manage.srgf.export.toolbarTitle") { - ForEach(GachaLanguageCode.allCases, id: \.rawValue) { code in - Button(code.localized) { - params.lang = code - exportButtonClicked() + Menu("gacha.manage.uigf.export.toolbarTitle") { + Menu { + ForEach(GachaLanguageCode.allCases, id: \.rawValue) { code in + Button(code.localized) { + params.lang = code + exportButtonClicked(format: .uigfv4) + } } + } label: { + Text(verbatim: "UIGFv4") + } + Menu { + ForEach(GachaLanguageCode.allCases, id: \.rawValue) { code in + Button(code.localized) { + params.lang = code + exportButtonClicked(format: .srgfv1) + } + } + } label: { + Text(verbatim: "SRGFv1") } } } - func exportButtonClicked() { - let uid = params.uid! - let items = fetchAllMO(uid: uid).map { - $0.toSRGFEntry( - langOverride: params.lang, - timeZoneDeltaOverride: nil - ) - } - srgfJson = .init( - info: .init(uid: uid, lang: params.lang), - list: items - ) - isExporterPresented.toggle() - } - // MARK: Private @State private var isSucceedAlertShown: Bool = false @@ -151,14 +140,30 @@ struct ExportGachaView: View { @ObservedObject private var params: ExportGachaParams = .init() - @State private var isExporterPresented: Bool = false + @State private var isSRGFExporterPresented: Bool = false + @State private var isUIGFExporterPresented: Bool = false @State private var srgfJson: SRGFv1? + @State private var uigfJson: UIGFv4? + @State private var currentFormat: UIGFFormat = .uigfv4 + + private var fileNameStem: String { + switch currentFormat { + case .uigfv4: + return uigfJson?.getFileNameStem(uid: params.uid, for: .starRail) ?? "Untitled" + case .srgfv1: + return srgfJson?.defaultFileNameStem ?? "Untitled" + } + } private var accountPickerPairs: [(value: String, tag: String?)] { var result = [(value: String, tag: String?)]() if params.uid == nil { - let i18nStr = String(localized: .init(stringLiteral: "app.gacha.account.select.notSelected")) + var i18nKey = "app.gacha.account.select.selectAll" + if currentFormat == .srgfv1 { + i18nKey = "app.gacha.account.select.notSelected" + } + let i18nStr = String(localized: .init(stringLiteral: i18nKey)) result.append((i18nStr, nil)) } result.append(contentsOf: allAvaliableAccountUID.map { uid in @@ -187,12 +192,45 @@ struct ExportGachaView: View { } } - private var defaultFileName: String { - srgfJson?.defaultFileNameStem ?? "Untitled" - } - - private var file: JsonFile? { - srgfJson?.asDocument + private func exportButtonClicked(format: UIGFFormat) { + switch format { + case .uigfv4: + currentFormat = format + srgfJson = nil + if let uid = params.uid { + let itemsUIGF = fetchAllMO(uid: uid).map { + $0.toUIGFEntry( + langOverride: params.lang, + timeZoneDeltaOverride: nil + ) + } + let hsrProfile = UIGFv4.ProfileHSR( + lang: params.lang, + list: itemsUIGF, + timezone: nil, + uid: uid + ) + uigfJson = .init(info: .init(), hsrProfiles: [hsrProfile]) + } else { + uigfJson = exportAllAccountDataIntoSingleUIGFv4() + } + isUIGFExporterPresented.toggle() + case .srgfv1: + guard let uid = params.uid else { return } + currentFormat = format + uigfJson = nil + let itemsSRGF = fetchAllMO(uid: uid).map { + $0.toSRGFEntry( + langOverride: params.lang, + timeZoneDeltaOverride: nil + ) + } + srgfJson = .init( + info: .init(uid: uid, lang: params.lang), + list: itemsSRGF + ) + isSRGFExporterPresented.toggle() + } } @ViewBuilder @@ -209,6 +247,32 @@ struct ExportGachaView: View { private func firstAccount(uid: String) -> Account? { accounts.first(where: { $0.uid! == uid }) } + + private func handleFileExporterResult(_ result: Result) { + switch result { + case let .success(url): + alert = .succeed(url: url.absoluteString) + case let .failure(failure): + alert = .failure(message: failure.localizedDescription) + } + } + + @ViewBuilder + private func postAlertMessage() -> some View { + switch alert { + case let .succeed(url): Text("gacha.export.fileSavedTo:\(url)") + case let .failure(message): Text(verbatim: "⚠︎ \(message)") + case nil: EmptyView() + } + } + + @ViewBuilder + private func exportButton() -> some View { + Button("app.gacha.data.export.button") { + exportButtonClicked(format: currentFormat) + } + .disabled(params.uid == nil && currentFormat == .srgfv1) + } } extension ExportGachaView { @@ -250,6 +314,28 @@ extension ExportGachaView { } } +// MARK: - Batch Export Support (UIGFv4 Only). + +extension ExportGachaView { + public func exportAllAccountDataIntoSingleUIGFv4() -> UIGFv4 { + let profiles: [UIGFv4.ProfileHSR] = allAvaliableAccountUID.compactMap { uid in + let itemsUIGF = fetchAllMO(uid: uid).map { + $0.toUIGFEntry( + langOverride: params.lang, + timeZoneDeltaOverride: nil + ) + } + return !itemsUIGF.isEmpty ? UIGFv4.ProfileHSR( + lang: params.lang, + list: itemsUIGF, + timezone: nil, + uid: uid + ) : nil + } + return .init(info: .init(), hsrProfiles: profiles) + } +} + // MARK: - ExportGachaParams private class ExportGachaParams: ObservableObject { @@ -257,10 +343,6 @@ private class ExportGachaParams: ObservableObject { @Published var lang: GachaLanguageCode = .zhHans } -// MARK: - JsonFile - -typealias JsonFile = SRGFv1.Document - // MARK: - AlertType private enum AlertType: Identifiable { diff --git a/Features/Gacha/View/SRGF/ImportGachaView.swift b/Features/Gacha/View/SRGF/ImportGachaView.swift index eae3127b..29fdbbb0 100644 --- a/Features/Gacha/View/SRGF/ImportGachaView.swift +++ b/Features/Gacha/View/SRGF/ImportGachaView.swift @@ -12,39 +12,33 @@ import UniformTypeIdentifiers // MARK: - ImportGachaView struct ImportGachaView: View { - @Environment(\.managedObjectContext) private var viewContext - // MARK: Internal struct GachaImportReport { let uid: String, totalCount: Int, newCount: Int } - @State var isHelpSheetShow: Bool = false - - @State var isCompleteAlertShow: Bool = false - var body: some View { ImportView(status: $status, alert: $alert) .toolbar(content: { ToolbarItem(placement: .navigationBarTrailing) { Button { - isHelpSheetShow.toggle() + isHelpSheetShown.toggle() } label: { Image(systemSymbol: .questionmarkCircle) } } }) - .sheet(isPresented: $isHelpSheetShow, content: { - HelpSheet(isShow: $isHelpSheetShow) + .sheet(isPresented: $isHelpSheetShown, content: { + HelpSheet(isShown: $isHelpSheetShown) }) - .navigationTitle("app.gacha.import.srgf") + .navigationTitle("app.gacha.import.uigf") .onChange(of: status, perform: { newValue in if case .succeed = newValue { - isCompleteAlertShow.toggle() + isCompleteAlertShown.toggle() } }) - .toast(isPresenting: $isCompleteAlertShow, alert: { + .toast(isPresenting: $isCompleteAlertShown, alert: { .init( displayMode: .alert, type: .complete(.green), @@ -53,7 +47,7 @@ struct ImportGachaView: View { }) .alert( "gacha.import.startImport".localized(), - isPresented: isReadyToStartAlertShow, + isPresented: isReadyToStartAlertShown, presenting: alert, actions: { thisAlert in Button( @@ -61,8 +55,8 @@ struct ImportGachaView: View { role: .destructive, action: { switch thisAlert { - case let .readyToStartJson(url: url): - processJson(url: url) + case let .readyToStartJson(url: url, format: format): + processJson(url: url, format: format) } } ) @@ -75,7 +69,36 @@ struct ImportGachaView: View { ) } - func processJson(url: URL) { + // MARK: Private + + @Environment(\.managedObjectContext) private var viewContext + + @State private var isHelpSheetShown: Bool = false + @State private var isCompleteAlertShown: Bool = false + @State private var currentFormat: UIGFFormat = .uigfv4 + @State private var fallbackLanguage: GachaLanguageCode = .enUS + @State private var status: ImportStatus = .pending + + @State private var alert: AlertType? + + private var isReadyToStartAlertShown: Binding { + .init { + alert != nil + } set: { newValue in + if newValue == false { + alert = nil + } + } + } + + private var dateFormatter: DateFormatter { + let fmt = DateFormatter() + fmt.dateStyle = .medium + fmt.timeStyle = .medium + return fmt + } + + private func processJson(url: URL, format: UIGFFormat) { Task(priority: .userInitiated) { status = .reading } @@ -84,23 +107,48 @@ struct ImportGachaView: View { do { let decoder = JSONDecoder() let data: Data = try Data(contentsOf: url) - let srgfModel: SRGFv1 = try decoder - .decode( - SRGFv1.self, - from: data + var result = [GachaImportReport]() + let appMeta: String? + let dateMeta: Date? + switch format { + case .uigfv4: + let uigfModel: UIGFv4 = try decoder + .decode( + UIGFv4.self, + from: data + ) + result = importGachaFromUIGFv4( + uigfJson: uigfModel ) - let result = importGachaFromSRGFv1( - srgfJson: srgfModel - ) - status = .succeed(ImportSucceedInfo( - uid: result.uid, - totalCount: result.totalCount, - newCount: result.newCount, - app: srgfModel.info.exportApp, - exportDate: srgfModel.info.exportDate, - timeZone: GachaItem.getServerTimeZoneDelta(result.uid) - )) - isCompleteAlertShow.toggle() + appMeta = uigfModel.info.exportApp + dateMeta = uigfModel.info.maybeDateExported + case .srgfv1: + let srgfModel: SRGFv1 = try decoder + .decode( + SRGFv1.self, + from: data + ) + result = importGachaFromSRGFv1( + srgfJson: srgfModel + ) + appMeta = srgfModel.info.exportApp + dateMeta = srgfModel.info.maybeDateExported + } + var succeededMessages: [ImportSucceedInfo] = [] + result.forEach { currentMsg in + succeededMessages.append( + ImportSucceedInfo( + uid: currentMsg.uid, + totalCount: currentMsg.totalCount, + newCount: currentMsg.newCount, + app: appMeta, + exportDate: dateMeta, + timeZone: GachaItem.getServerTimeZoneDelta(currentMsg.uid) + ) + ) + } + status = .succeed(succeededMessages) + isCompleteAlertShown.toggle() } catch { status = .failure(error.localizedDescription) } @@ -111,23 +159,44 @@ struct ImportGachaView: View { } } - func importGachaFromSRGFv1( + private func importGachaFromSRGFv1( srgfJson: SRGFv1 ) - -> GachaImportReport { + -> [GachaImportReport] { let info = srgfJson.info let items = srgfJson.list - let newCount = addRecordItems( + let newCount = addRecordItemsSRGFv1( items, uid: info.uid, lang: info.lang, timeZoneDelta: info.regionTimeZone // 优先尊重 JSON 里面写的 TimeZone 资料值。 ) - return .init(uid: info.uid, totalCount: items.count, newCount: newCount) + return [.init(uid: info.uid, totalCount: items.count, newCount: newCount)] + } + + private func importGachaFromUIGFv4( + uigfJson: UIGFv4 + ) + -> [GachaImportReport] { + let info = uigfJson.info + var resultStack = [GachaImportReport]() + uigfJson.hsrProfiles?.forEach { profile in + let items = profile.list + let newCount = addRecordItemsUIGFv4( + items, + uid: profile.uid, + lang: profile.lang ?? fallbackLanguage, + timeZoneDelta: profile.timezone // 优先尊重 JSON 里面写的 TimeZone 资料值。 + ) + resultStack.append( + .init(uid: profile.uid, totalCount: items.count, newCount: newCount) + ) + } + return resultStack } /// 返回已保存的新数据数量 - func addRecordItems( + private func addRecordItemsSRGFv1( _ items: [SRGFv1.DataEntry], uid: String, lang: GachaLanguageCode, @@ -155,7 +224,36 @@ struct ImportGachaView: View { return count } - func checkIDAndUIDExists(uid: String, id: String) -> Bool { + /// 返回已保存的新数据数量 + private func addRecordItemsUIGFv4( + _ items: [UIGFv4.DataEntry], + uid: String, + lang: GachaLanguageCode, + timeZoneDelta: Int? = nil + ) + -> Int { + var count = 0 + viewContext.performAndWait { + items.enumerated().forEach { index, item in + var item = item + if item.id.isEmpty { + item.id = String(index) + } + if !checkIDAndUIDExists(uid: uid, id: item.id) { + _ = item.toManagedModel( + uid: uid, lang: lang, + timeZoneDelta: timeZoneDelta ?? GachaItem.getServerTimeZoneDelta(uid), + context: viewContext + ) + count += 1 + } + } + } + save() + return count + } + + private func checkIDAndUIDExists(uid: String, id: String) -> Bool { let request = GachaItemMO.fetchRequest() let predicate = NSPredicate(format: "(id = %@) AND (uid = %@)", id, uid) request.predicate = predicate @@ -169,44 +267,19 @@ struct ImportGachaView: View { } } - func save() { + private func save() { do { try viewContext.save() } catch { print("ERROR SAVING. \(error.localizedDescription)") } } - - // MARK: Fileprivate - - @State fileprivate var status: ImportStatus = .pending - - fileprivate var isReadyToStartAlertShow: Binding { - .init { - alert != nil - } set: { newValue in - if newValue == false { - alert = nil - } - } - } - - // MARK: Private - - @State private var alert: AlertType? - - private var dateFormatter: DateFormatter { - let fmt = DateFormatter() - fmt.dateStyle = .medium - fmt.timeStyle = .medium - return fmt - } } // MARK: - AlertType private enum AlertType: Identifiable { - case readyToStartJson(url: URL) + case readyToStartJson(url: URL, format: UIGFFormat) // MARK: Internal @@ -223,7 +296,7 @@ private enum AlertType: Identifiable { private enum ImportStatus { case pending case reading - case succeed(ImportSucceedInfo) + case succeed([ImportSucceedInfo]) case failure(String) } @@ -250,7 +323,7 @@ extension ImportStatus: Identifiable { // MARK: - ImportSucceedInfo -private struct ImportSucceedInfo: Equatable { +private struct ImportSucceedInfo: Equatable, Identifiable { // MARK: Lifecycle init( @@ -271,24 +344,63 @@ private struct ImportSucceedInfo: Equatable { // MARK: Internal + let id = UUID().uuidString let uid: String let totalCount: Int let newCount: Int let app: String? let exportDate: Date? let timeZoneDelta: Int -} -// MARK: - ImportFileSourceType + @ViewBuilder var timeView: some View { + if let date = exportDate { + VStack(alignment: .leading) { + let timeInfo = String( + format: "app.gacha.import.info.time:%@".localized(), + dateFormatterCurrent.string(from: date) + ) + Text(timeInfo) + if importedTimeZone.secondsFromGMT() != TimeZone.autoupdatingCurrent.secondsFromGMT() { + let timeInfo2 = "UTC\(timeZoneDeltaValueText): " + dateFormatterAsImported.string(from: date) + Text(timeInfo2).font(.caption).foregroundStyle(.secondary) + } + } + } + } + + // MARK: Private + + private var timeZoneDeltaValueText: String { + switch timeZoneDelta { + case 0...: return "+\(timeZoneDelta)" + default: return "\(timeZoneDelta)" + } + } + + private var importedTimeZone: TimeZone { + .init(secondsFromGMT: 3600 * timeZoneDelta) ?? .autoupdatingCurrent + } -private enum ImportFileSourceType { - case SRGFJSON + private var dateFormatterAsImported: DateFormatter { + let fmt = DateFormatter() + fmt.dateStyle = .medium + fmt.timeStyle = .medium + return fmt + } + + private var dateFormatterCurrent: DateFormatter { + let fmt = DateFormatter() + fmt.dateStyle = .medium + fmt.timeStyle = .medium + fmt.timeZone = .init(secondsFromGMT: 3600 * timeZoneDelta) + return fmt + } } // MARK: - HelpSheet private struct HelpSheet: View { - @Binding var isShow: Bool + @Binding var isShown: Bool var body: some View { NavigationStack { @@ -300,12 +412,12 @@ private struct HelpSheet: View { )! ) { Label( - "app.gacha.import.help.srgf.button", + "app.gacha.import.help.uigf.button", systemSymbol: .appBadgeCheckmark ) } } footer: { - Text("app.gacha.import.srgf.verified.note.2") + Text("app.gacha.import.uigf.verified.note.2") .fixedSize(horizontal: false, vertical: true) } } @@ -314,7 +426,7 @@ private struct HelpSheet: View { .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button("sys.done") { - isShow.toggle() + isShown.toggle() } } } @@ -332,13 +444,13 @@ private struct PopFileButton: View { let completion: (Result) -> Void - @State var isFileImporterShow: Bool = false + @State var isFileImporterShown: Bool = false var body: some View { Button(title.localized()) { - isFileImporterShow.toggle() + isFileImporterShown.toggle() } - .fileImporter(isPresented: $isFileImporterShow, allowedContentTypes: allowedContentTypes) { result in + .fileImporter(isPresented: $isFileImporterShown, allowedContentTypes: allowedContentTypes) { result in completion(result) } } @@ -358,7 +470,7 @@ private struct StatusView: View { case .reading: ReadingView() case let .succeed(info): - SucceedView(status: $status, info: info) + SucceedView(status: $status, infoMsgs: info) case let .failure(string): FailureView(status: $status, errorMessage: string) } @@ -385,17 +497,8 @@ private struct FailureView: View { // MARK: - SucceedView private struct SucceedView: View { - // MARK: Internal - @Binding var status: ImportStatus - let info: ImportSucceedInfo - - var timeZoneDeltaValueText: String { - switch info.timeZoneDelta { - case 0...: return "+\(info.timeZoneDelta)" - default: return "\(info.timeZoneDelta)" - } - } + let infoMsgs: [ImportSucceedInfo] var body: some View { Section { @@ -405,56 +508,26 @@ private struct SucceedView: View { Image(systemSymbol: .checkmarkCircle) .foregroundColor(.green) } - Text(verbatim: "UID: \(info.uid)") - if let app = info.app { + if let app = infoMsgs.first?.app { let sourceInfo = String(format: "app.gacha.import.info.source:%@".localized(), app) Text(sourceInfo) } - if let date = info.exportDate { - VStack(alignment: .leading) { - let timeInfo = String( - format: "app.gacha.import.info.time:%@".localized(), - dateFormatterCurrent.string(from: date) - ) - Text(timeInfo) - if importedTimeZone.secondsFromGMT() != TimeZone.autoupdatingCurrent.secondsFromGMT() { - let timeInfo2 = "UTC\(timeZoneDeltaValueText): " + dateFormatterAsImported.string(from: date) - Text(timeInfo2).font(.caption).foregroundStyle(.secondary) - } - } - } } - Section { - let importInfo = String(format: "app.gacha.import.info.import:%lld".localized(), info.totalCount) - let storageInfo = String(format: "app.gacha.import.info.storage:%lld".localized(), info.newCount) - Text(importInfo) - Text(storageInfo) + ForEach(infoMsgs, id: \.id) { info in + Section { + info.timeView + let importInfo = String(format: "app.gacha.import.info.import:%lld".localized(), info.totalCount) + let storageInfo = String(format: "app.gacha.import.info.storage:%lld".localized(), info.newCount) + Text(importInfo) + Text(storageInfo) + } header: { + Text(verbatim: "UID: \(info.uid)") + } } Button("app.gacha.import.continue") { status = .pending } } - - // MARK: Private - - private var importedTimeZone: TimeZone { - .init(secondsFromGMT: 3600 * info.timeZoneDelta) ?? .autoupdatingCurrent - } - - private var dateFormatterAsImported: DateFormatter { - let fmt = DateFormatter() - fmt.dateStyle = .medium - fmt.timeStyle = .medium - return fmt - } - - private var dateFormatterCurrent: DateFormatter { - let fmt = DateFormatter() - fmt.dateStyle = .medium - fmt.timeStyle = .medium - fmt.timeZone = .init(secondsFromGMT: 3600 * info.timeZoneDelta) - return fmt - } } // MARK: - ReadingView @@ -478,10 +551,24 @@ private struct ImportView: View { var body: some View { StatusView(status: $status) { Section { - PopFileButton(title: "app.gacha.import.srgf.json", allowedContentTypes: [.json]) { result in + PopFileButton( + title: "app.gacha.import.fromUIGF", + allowedContentTypes: [.json] + ) { result in + switch result { + case let .success(url): + alert = .readyToStartJson(url: url, format: .uigfv4) + case let .failure(error): + status = .failure(error.localizedDescription) + } + } + PopFileButton( + title: "app.gacha.import.fromSRGF", + allowedContentTypes: [.json] + ) { result in switch result { case let .success(url): - alert = .readyToStartJson(url: url) + alert = .readyToStartJson(url: url, format: .srgfv1) case let .failure(error): status = .failure(error.localizedDescription) } @@ -489,7 +576,7 @@ private struct ImportView: View { } footer: { VStack(alignment: .leading) { Text( - "app.gacha.import.srgf.verified.note.1" + "app.gacha.import.uigf.verified.note.1" ) Text("app.gacha.srgf.affLink.[SRGF](https://uigf.org/)") } diff --git a/Internationalization/Localizable.xcstrings b/Internationalization/Localizable.xcstrings index 2a360816..df348c8b 100644 --- a/Internationalization/Localizable.xcstrings +++ b/Internationalization/Localizable.xcstrings @@ -2424,6 +2424,34 @@ } } }, + "app.gacha.account.select.selectAll" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Select All" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "全部書き出す" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "全部账号" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "全部帳號" + } + } + } + }, "app.gacha.account.select.title" : { "localizations" : { "en" : { @@ -2511,7 +2539,7 @@ "it" : { "stringUnit" : { "state" : "translated", - "value" : "Export SRGF Wish Records" + "value" : "Export" } }, "ja" : { @@ -2732,66 +2760,196 @@ } } }, - "app.gacha.import.help.srgf.button" : { + "app.gacha.import.fromSRGF" : { + "extractionState" : "migrated", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Import SRGFv1 JSON wish records" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Import SRGFv1 JSON wish records" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Importer les enregistrements de vœux au format JSON SRGFv1" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Import SRGFv1 JSON wish records" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "SRGFv1 規格に準ずる JSON ファイルから読み込む" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Import SRGFv1 JSON wish records" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Импортировать SRGFv1 JSON записи молитв" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nhập bản ghi SRGFv1 JSON" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "导入 SRGFv1 JSON 格式祈愿记录" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "匯入 SRGFv1 JSON 格式祈願記錄" + } + } + } + }, + "app.gacha.import.fromUIGF" : { + "extractionState" : "migrated", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Import UIGFv4 JSON wish records" + } + }, + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Import UIGFv4 JSON wish records" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Importer les enregistrements de vœux au format JSON UIGFv4" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Import UIGFv4 JSON wish records" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "UIGFv4 規格に準ずる JSON ファイルから読み込む" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Import UIGFv4 JSON wish records" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Импортировать UIGFv4 JSON записи молитв" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nhập bản ghi UIGFv4 JSON" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "导入 UIGFv4 JSON 格式祈愿记录" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "匯入 UIGFv4 JSON 格式祈願記錄" + } + } + } + }, + "app.gacha.import.help.uigf.button" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Apps Supporting SRGF" + "value" : "Apps Supporting UIGF" } }, "fil" : { "stringUnit" : { "state" : "translated", - "value" : "Mga softwares na sumusuporta sa SRGF" + "value" : "Mga softwares na sumusuporta sa UIGF" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Logiciels prenant en charge SRGF" + "value" : "Logiciels prenant en charge UIGF" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Softwares Supporting SRGF" + "value" : "Softwares Supporting UIGF" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "SRGFフォーマットをサポートしているアプリ" + "value" : "UIGF フォーマットをサポートしているアプリ" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Softwares Supporting SRGF" + "value" : "Softwares Supporting UIGF" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Программы поддерживающие SRGF" + "value" : "Программы поддерживающие UIGF" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Phần Mềm Hỗ Trợ SRGF" + "value" : "Phần Mềm Hỗ Trợ UIGF" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "支持SRGF的软件" + "value" : "支持 UIGF 的软件" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "支援SRGF的軟體" + "value" : "支援 UIGF 的軟體" } } } @@ -3120,323 +3278,258 @@ } } }, - "app.gacha.import.srgf" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Import SRGF Wish Log" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mag-Import ng SRGF Wish Log" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Importer le journal de souhaits SRGF" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Import SRGF Wish Log" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "SRGF祈願履歴データを読み込む" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "Import SRGF Wish Log" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Импорт журнала круток SRGF" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nhập Vào Lịch Sử Cầu Nguyện Định Dạng SRGF" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "导入SRGF祈愿记录" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "匯入SRGF祈願記錄" - } - } - } - }, - "app.gacha.import.srgf.json" : { - "extractionState" : "migrated", + "app.gacha.import.success" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Import SRGF JSON wish records" + "value" : "Wish data imported successfully" } }, "fil" : { "stringUnit" : { "state" : "translated", - "value" : "Import SRGF JSON wish records" + "value" : "Wish data imported successfully" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Importer les enregistrements de vœux au format JSON SRGF" + "value" : "Les données de vœux ont été importées avec succès" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Import SRGF JSON wish records" + "value" : "Wish data imported successfully" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "SRGF(JSON)フォーマットの祈願履歴を読み込む" + "value" : "祈願データの読み込みは無事完了しました" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Import SRGF JSON wish records" + "value" : "Wish data imported successfully" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Импортировать SRGF JSON записи молитв" + "value" : "Данные молитв были успешно импортированы" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Nhập bản ghi SRGF JSON" + "value" : "Dữ liệu cầu nguyện được nhập thành công" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "导入SRGF JSON格式祈愿记录" + "value" : "成功导入祈愿数据" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "匯入SRGF JSON格式祈願記錄" + "value" : "成功匯入祈願資料" } } } }, - "app.gacha.import.srgf.verified.note.1" : { + "app.gacha.import.uigf" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "We support all export files that strictly comply with the SRGF standard. For a list of supported apps and corresponding export formats, please click on the top right corner to open help page." + "value" : "Import UIGF / SRGF Wish Log" } }, "fil" : { "stringUnit" : { "state" : "translated", - "value" : "Sinusuportahan namin ang lahat ng mga export files na mahigpit na sumunod sa pamantayan ng SRGF. Para sa isang listahan ng mga suportadong apps at kaukulang mga format ng pag-export, mangyaring mag-click sa kanang tuktok na sulok upang buksan ang pahina ng tulong." + "value" : "Mag-Import ng UIGF / SRGF Wish Log" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Nous prenons en charge tous les fichiers d'exportation qui respectent strictement la norme SRGF. Pour une liste des applications prises en charge et des formats d'exportation correspondants, veuillez cliquer sur le coin supérieur droit pour ouvrir la page d'aide." + "value" : "Importer le journal de souhaits UIGF / SRGF" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "We support all export files that strictly comply with the SRGF standard. For a list of supported apps and corresponding export formats, please click on the top right corner to open help page." + "value" : "Import UIGF / SRGF Wish Log" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "SRGFフォーマット標準を厳しくしたアプリ・サービスから書き出したそのファイルデータ限り、ここで読み込めます。その標準をサポートしたアプリ・サービスとそれに応ずるフォーマットについての情報は、画面の右上をタップしてから参考説明ページに記されております。" + "value" : "UIGF / SRGF 祈願履歴データを読み込む" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "We support all export files that strictly comply with the SRGF standard. For a list of supported apps and corresponding export formats, please click on the top right corner to open help page." + "value" : "Import UIGF / SRGF Wish Log" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Мы поддерживаем все файлы экспорта, которые строго соответствуют стандарту SRGF. Чтобы просмотреть список поддерживаемых приложений и соответствующих форматов экспорта, нажмите в правом верхнем углу, чтобы открыть страницу справки." + "value" : "Импорт журнала круток UIGF / SRGF" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Chúng tôi hỗ trợ tất cả các tệp xuất tuân thủ nghiêm ngặt tiêu chuẩn SRGF. Để biết danh sách các ứng dụng được hỗ trợ và các định dạng xuất tương ứng, vui lòng nhấp vào góc trên cùng bên phải để mở trang trợ giúp." + "value" : "Nhập Vào Lịch Sử Cầu Nguyện Định Dạng UIGF / SRGF" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "我们支持所有严格遵守SRGF标准的导出文件。受支持的App及对应导出格式请点击右上角参阅帮助页面。" + "value" : "导入 UIGF / SRGF 祈愿记录" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "我們支援所有嚴格遵守SRGF標準的匯出檔案。受支援的App及對應匯出格式請點擊右上角參閱說明頁面。" + "value" : "匯入 UIGF / SRGF 祈願記錄" } } } }, - "app.gacha.import.srgf.verified.note.2" : { + "app.gacha.import.uigf.verified.note.1" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "We support importing all files that comply with the SRGF format, but we have found that some software that claims to support SRGF that do not meet the standard. The following software has been verified to be able to import smoothly into this App." + "value" : "We support all export files that strictly comply with the UIGF / SRGF standard. For a list of supported apps and corresponding export formats, please click on the top right corner to open help page." } }, "fil" : { "stringUnit" : { "state" : "translated", - "value" : "Sinusuportahan namin ang pag-import ng lahat ng mga file na sumunod sa format ng SRGF, ngunit natagpuan namin na ang ilang software na nagsasabing suportahan ang SRGF na hindi nakakatugon sa pamantayan. Ang sumusunod na software ay napatunayan upang ma-import nang maayos sa app na ito." + "value" : "Sinusuportahan namin ang lahat ng mga export files na mahigpit na sumunod sa pamantayan ng UIGF / SRGF. Para sa isang listahan ng mga suportadong apps at kaukulang mga format ng pag-export, mangyaring mag-click sa kanang tuktok na sulok upang buksan ang pahina ng tulong." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Nous prenons en charge l'importation de tous les fichiers conformes au format SRGF, mais nous avons constaté que certains logiciels qui prétendent prendre en charge SRGF ne respectent pas la norme. Les logiciels suivants ont été vérifiés pour pouvoir être importés sans problème dans cette application." + "value" : "Nous prenons en charge tous les fichiers d'exportation qui respectent strictement la norme UIGF / SRGF. Pour une liste des applications prises en charge et des formats d'exportation correspondants, veuillez cliquer sur le coin supérieur droit pour ouvrir la page d'aide." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "We support importing all files that comply with the SRGF format, but we have found that some software that claims to support SRGF that do not meet the standard. The following software has been verified to be able to import smoothly into this App." + "value" : "We support all export files that strictly comply with the UIGF / SRGF standard. For a list of supported apps and corresponding export formats, please click on the top right corner to open help page." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "SRGFフォーマット標準を厳しくしたアプリ・サービスから書き出したそのファイルデータ限り、ここで読み込めます。ですが、一部のアプリ・サービスはそれを宣言したとしても、互換性のないファイルを書き出したことはございます。下記のは「書き出したファイルはここで利用可能」だと検証済みのアプリ・サービス。" + "value" : "UIGF / SRGF フォーマット標準を厳しくしたアプリ・サービスから書き出したそのファイルデータ限り、ここで読み込めます。その標準をサポートしたアプリ・サービスとそれに応ずるフォーマットについての情報は、画面の右上をタップしてから参考説明ページに記されております。" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "We support importing all files that comply with the SRGF format, but we have found that some software that claims to support SRGF that do not meet the standard. The following software has been verified to be able to import smoothly into this App." + "value" : "We support all export files that strictly comply with the UIGF / SRGF standard. For a list of supported apps and corresponding export formats, please click on the top right corner to open help page." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Мы поддерживаем импорт всех файлов, соответствующих формату SRGF, но обнаружили, что некоторые программы, заявленные как поддерживающие SRGF, не соответствуют этому. Следующее ПО было проверено на возможность беспрепятственного импорта в GIPH." + "value" : "Мы поддерживаем все файлы экспорта, которые строго соответствуют стандарту UIGF / SRGF. Чтобы просмотреть список поддерживаемых приложений и соответствующих форматов экспорта, нажмите в правом верхнем углу, чтобы открыть страницу справки." } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Chúng tôi hỗ trợ nhập tất cả các tệp tuân thủ định dạng SRGF, nhưng chúng tôi đã phát hiện ra rằng một số phần mềm tuyên bố hỗ trợ SRGF không đáp ứng tiêu chuẩn. Phần mềm sau đã được xác minh để có thể nhập trơn tru vào ứng dụng này." + "value" : "Chúng tôi hỗ trợ tất cả các tệp xuất tuân thủ nghiêm ngặt tiêu chuẩn UIGF / SRGF. Để biết danh sách các ứng dụng được hỗ trợ và các định dạng xuất tương ứng, vui lòng nhấp vào góc trên cùng bên phải để mở trang trợ giúp." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "我们支持导入所有符合SRGF格式的文件,但我们仍发现部分宣称已支持SRGF的软件导出的记录不合标准。以下为经验证能够顺利导入本App的软件。" + "value" : "我们支持所有严格遵守 UIGF / SRGF 标准的导出文件。受支持的App及对应导出格式请点击右上角参阅帮助页面。" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "我們支援匯入所有符合SRGF格式的檔案,但我們仍發現部分宣稱已支援SRGF的軟體匯出的記錄不合標準。以下為經驗證能夠順利匯入本App的軟體。" + "value" : "我們支援所有嚴格遵守 UIGF / SRGF 標準的匯出檔案。受支援的App及對應匯出格式請點擊右上角參閱說明頁面。" } } } }, - "app.gacha.import.success" : { + "app.gacha.import.uigf.verified.note.2" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Wish data imported successfully" + "value" : "We support importing all files that comply with the UIGF / SRGF format, but we have found that some software that claims to support UIGF / SRGF that do not meet the standard. The following software has been verified to be able to import smoothly into this App." } }, "fil" : { "stringUnit" : { "state" : "translated", - "value" : "Wish data imported successfully" + "value" : "Sinusuportahan namin ang pag-import ng lahat ng mga file na sumunod sa format ng UIGF / SRGF, ngunit natagpuan namin na ang ilang software na nagsasabing suportahan ang UIGF / SRGF na hindi nakakatugon sa pamantayan. Ang sumusunod na software ay napatunayan upang ma-import nang maayos sa app na ito." } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Les données de vœux ont été importées avec succès" + "value" : "Nous prenons en charge l'importation de tous les fichiers conformes au format UIGF / SRGF, mais nous avons constaté que certains logiciels qui prétendent prendre en charge UIGF / SRGF ne respectent pas la norme. Les logiciels suivants ont été vérifiés pour pouvoir être importés sans problème dans cette application." } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Wish data imported successfully" + "value" : "We support importing all files that comply with the UIGF / SRGF format, but we have found that some software that claims to support UIGF / SRGF that do not meet the standard. The following software has been verified to be able to import smoothly into this App." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "祈願データの読み込みは無事完了しました" + "value" : "UIGF / SRGF フォーマット標準を厳しくしたアプリ・サービスから書き出したそのファイルデータ限り、ここで読み込めます。ですが、一部のアプリ・サービスはそれを宣言したとしても、互換性のないファイルを書き出したことはございます。下記のは「書き出したファイルはここで利用可能」だと検証済みのアプリ・サービス。" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Wish data imported successfully" + "value" : "We support importing all files that comply with the UIGF / SRGF format, but we have found that some software that claims to support UIGF / SRGF that do not meet the standard. The following software has been verified to be able to import smoothly into this App." } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Данные молитв были успешно импортированы" + "value" : "Мы поддерживаем импорт всех файлов, соответствующих формату UIGF / SRGF, но обнаружили, что некоторые программы, заявленные как поддерживающие UIGF / SRGF, не соответствуют этому. Следующее ПО было проверено на возможность беспрепятственного импорта в GIPH." } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Dữ liệu cầu nguyện được nhập thành công" + "value" : "Chúng tôi hỗ trợ nhập tất cả các tệp tuân thủ định dạng UIGF / SRGF, nhưng chúng tôi đã phát hiện ra rằng một số phần mềm tuyên bố hỗ trợ UIGF / SRGF không đáp ứng tiêu chuẩn. Phần mềm sau đã được xác minh để có thể nhập trơn tru vào ứng dụng này." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "成功导入祈愿数据" + "value" : "我们支持导入所有符合 UIGF / SRGF 格式的文件,但我们仍发现部分宣称已支持 UIGF / SRGF 的软件导出的记录不合标准。以下为经验证能够顺利导入本App的软件。" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "成功匯入祈願資料" + "value" : "我們支援匯入所有符合 UIGF / SRGF 格式的檔案,但我們仍發現部分宣稱已支援 UIGF / SRGF 的軟體匯出的記錄不合標準。以下為經驗證能夠順利匯入本App的軟體。" } } } @@ -3511,25 +3604,25 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "[About SRGF v1.0 format, a UIGF standard.](https://uigf.org/)" + "value" : "[About UIGF v4.0 and SRGF v1.0 format, a UIGF standard.](https://uigf.org/)" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "[UIGF 委員会の SRGF v1.0 ガチャ記録規格について](https://uigf.org/)" + "value" : "[UIGF 委員会の UIGF v4.0 と SRGF v1.0 ガチャ記録規格について](https://uigf.org/)" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "[关于 UIGF 组织所规范的星穹铁道抽卡记录标准 SRGF v1.0 格式](https://uigf.org/)" + "value" : "[关于 UIGF 组织所规范的「米哈游游戏统一抽卡记录交换标准 UIGF v4.0」以及其前任「星穹铁道抽卡记录交换标准 SRGF v1.0」格式](https://uigf.org/)" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "[關於 UIGF 組織所規範的星穹鐵道抽卡記錄標準 SRGF v1.0 格式](https://uigf.org/)" + "value" : "[關於 UIGF 組織所規範的「米哈遊遊戲統一抽卡記錄交換標準 UIGF v4.0」以及其前任「星穹鐵道抽卡記錄交換標準 SRGF v1.0」格式](https://uigf.org/)" } } } @@ -6534,6 +6627,34 @@ } } }, + "gacha.export.chooseFormat" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Output format" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "このフォーマットで書き出す" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "输出格式" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "輸出格式" + } + } + } + }, "gacha.export.chooseLanguage" : { "localizations" : { "en" : { @@ -6599,32 +6720,57 @@ } }, "gacha.export.failedInSavingToFile" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Failed from dumping UIGF / SRGF file." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "残念ながら、UIGF / SRGF ファイルは書き出しできませんでした。" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "UIGF / SRGF 文件没能成功导出。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "UIGF / SRGF 檔案沒能成功匯出。" + } + } + } }, "gacha.export.fileSavedTo:%@" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Successfully dumped SRGF file to:\n\n%@" + "value" : "Successfully dumped UIGF / SRGF file to:\n\n%@" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "SRGF ファイルは無事でここで書き出しました:\n\n%@" + "value" : "UIGF / SRGF ファイルは無事でここで書き出しました:\n\n%@" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "SRGF 文件已成功导出至:\n\n%@" + "value" : "UIGF / SRGF 文件已成功导出至:\n\n%@" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "SRGF 檔案已成功匯出至:\n\n%@" + "value" : "UIGF / SRGF 檔案已成功匯出至:\n\n%@" } } } @@ -6634,25 +6780,25 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Successfully dumped SRGF file." + "value" : "Successfully dumped UIGF / SRGF file." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "SRGF ファイルは無事で書き出しました。" + "value" : "UIGF / SRGF ファイルは無事で書き出しました。" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "SRGF 文件已成功导出。" + "value" : "UIGF / SRGF 文件已成功导出。" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "SRGF 檔案已成功匯出。" + "value" : "UIGF / SRGF 檔案已成功匯出。" } } } @@ -8101,43 +8247,43 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "No data. Get warp record first. You can import warp record from SRGF record files or using your own gacha link URL." + "value" : "No data. Get warp record first. You can import warp record from UIGF / SRGF record files or using your own gacha link URL." } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "No data. Get warp record first. You can import warp record from SRGF record files or using your own gacha link URL." + "value" : "No data. Get warp record first. You can import warp record from UIGF / SRGF record files or using your own gacha link URL." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "データはございません。跳躍履歴を取得してください。SRGFファイルでも、ご自分のガチャURLでも、ガチャ記録を読み込むのも可能です。" + "value" : "データはございません。跳躍履歴を取得してください。UIGF / SRGF ファイルでも、ご自分のガチャURLでも、ガチャ記録を読み込むのも可能です。" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "No data. Get warp record first. You can import warp record from SRGF record files or using your own gacha link URL." + "value" : "No data. Get warp record first. You can import warp record from UIGF / SRGF record files or using your own gacha link URL." } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "No data. Get warp record first. You can import warp record from SRGF record files or using your own gacha link URL." + "value" : "No data. Get warp record first. You can import warp record from UIGF / SRGF record files or using your own gacha link URL." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "无数据。请先获取跃迁记录。您可以导入 SRGF 抽卡记录,或者使用自己的抽卡 URL 来获取抽卡记录。" + "value" : "无数据。请先获取跃迁记录。您可以导入 UIGF / SRGF 抽卡记录,或者使用自己的抽卡 URL 来获取抽卡记录。" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "無資料。請先獲取躍遷記錄。您可以匯入 SRGF 抽卡記錄,或者使用自己的抽卡 URL 來獲取抽卡記錄。" + "value" : "無資料。請先獲取躍遷記錄。您可以匯入 UIGF / SRGF 抽卡記錄,或者使用自己的抽卡 URL 來獲取抽卡記錄。" } } } @@ -9507,132 +9653,132 @@ } } }, - "gacha.manage.srgf.export" : { + "gacha.manage.title" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Export to SRGF file" + "value" : "Manage Data" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Manage Data" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "SRGF ファイルとしてデータを書き出す" + "value" : "データを管理" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Manage Data" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Manage Data" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "导出数据为 SRGF 文件" + "value" : "管理数据" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "將資料匯出為 SRGF 檔案" + "value" : "管理資料" } } } }, - "gacha.manage.srgf.export.toolbarTitle" : { + "gacha.manage.uigf.export" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Export" + "value" : "Export to UIGF / SRGF file" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "書き出す" + "value" : "SRGF ファイルとしてデータを書き出す" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "导出" + "value" : "导出数据为 UIGF / SRGF 文件" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "匯出" + "value" : "將資料匯出為 UIGF / SRGF 檔案" } } } }, - "gacha.manage.srgf.import" : { + "gacha.manage.uigf.export.toolbarTitle" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Import from SRGF file" + "value" : "Export" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "SRGF ファイルからデータを読み込む" + "value" : "書き出す" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "自 SRGF 文件读入数据" + "value" : "导出" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "自 SRGF 檔案匯入資料" + "value" : "匯出" } } } }, - "gacha.manage.title" : { + "gacha.manage.uigf.import" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Manage Data" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manage Data" + "value" : "Import from UIGF / SRGF file" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "データを管理" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manage Data" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manage Data" + "value" : "UIGF / SRGF ファイルからデータを読み込む" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "管理数据" + "value" : "自 UIGF / SRGF 文件读入数据" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "管理資料" + "value" : "自 UIGF / SRGF 檔案匯入資料" } } } @@ -20804,9 +20950,6 @@ } } } - }, - "错误信息:%@" : { - } }, "version" : "1.0"