feat: 라이브 30분 연속 청취시 트래킹 API 호출 기능 추가

This commit is contained in:
Yu Sung
2025-05-17 17:29:48 +09:00
parent 35d98b2378
commit 0e61ee1adf
5 changed files with 114 additions and 0 deletions

View File

@@ -20,6 +20,7 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
private let userRepository = UserRepository()
private let reportRepository = ReportRepository()
private let rouletteRepository = RouletteRepository()
private let userActionRepository = UserActionRepository()
private var subscription = Set<AnyCancellable>()
@Published var isSpeakerMute = false
@@ -218,6 +219,7 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
var timer: DispatchSourceTimer?
var heartTimer: DispatchSourceTimer?
var periodicPlaybackTimer: DispatchSourceTimer?
var isAvailableLikeHeart = false
@@ -284,6 +286,8 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
if containNoChatRoom() {
startNoChatting()
}
startPeriodicPlaybackValidation()
}
func agoraConnectFail() {
@@ -1784,6 +1788,36 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
)
}
func stopPeriodicPlaybackValidation() {
periodicPlaybackTimer?.cancel()
periodicPlaybackTimer = nil
}
private func trackEventLiveContinuousListen30() {
userActionRepository.trackEvent(actionType: .LIVE_CONTINUOUS_LISTEN_30)
.sink { result in
switch result {
case .finished:
DEBUG_LOG("finish")
case .failure(let error):
ERROR_LOG(error.localizedDescription)
}
} receiveValue: { response in
DEBUG_LOG("트래킹 성공: \(response)")
}
.store(in: &subscription)
}
private func startPeriodicPlaybackValidation() {
let queue = DispatchQueue.global(qos: .background)
periodicPlaybackTimer = DispatchSource.makeTimerSource(queue: queue)
periodicPlaybackTimer?.schedule(deadline: .now() + 1800, repeating: 1800)
periodicPlaybackTimer?.setEventHandler { [weak self] in
self?.trackEventLiveContinuousListen30()
}
periodicPlaybackTimer?.resume()
}
private func calculatePercentages(options: [RouletteItem]) -> [RoulettePreviewItem] {
let updatedOptions = options.map { option in
return RoulettePreviewItem(title: option.title, percent: "\(String(format: "%.2f", option.percentage))%")