시그니처 후원

- 시그니처 별로 설정된 시간 만큼 GIF가 재생되도록 기능 추가
This commit is contained in:
klaus 2024-05-01 21:47:56 +09:00
parent 108eb759ec
commit 02c815077e
6 changed files with 69 additions and 12 deletions

View File

@ -21,6 +21,7 @@ import kr.co.vividnext.sodalive.live.room.donation.GetLiveRoomDonationStatusResp
import kr.co.vividnext.sodalive.live.room.donation.GetLiveRoomDonationTotalResponse
import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationMessage
import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationRequest
import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationResponse
import kr.co.vividnext.sodalive.live.room.info.GetRoomInfoResponse
import kr.co.vividnext.sodalive.live.room.kick_out.LiveRoomKickOutRequest
import kr.co.vividnext.sodalive.live.room.profile.GetLiveRoomUserProfileResponse
@ -156,11 +157,11 @@ interface LiveApi {
@Header("Authorization") authHeader: String
): Single<ApiResponse<Any>>
@POST("/live/room/donation")
@POST("/live/room/donation/v2")
fun donation(
@Body request: LiveRoomDonationRequest,
@Header("Authorization") authHeader: String
): Single<ApiResponse<String>>
): Single<ApiResponse<LiveRoomDonationResponse>>
@POST("/live/room/donation/refund/{id}")
fun refundDonation(

View File

@ -14,6 +14,7 @@ import kr.co.vividnext.sodalive.live.room.create.CreateLiveRoomResponse
import kr.co.vividnext.sodalive.live.room.detail.GetRoomDetailResponse
import kr.co.vividnext.sodalive.live.room.donation.DeleteLiveRoomDonationMessage
import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationRequest
import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationResponse
import kr.co.vividnext.sodalive.live.room.kick_out.LiveRoomKickOutRequest
import kr.co.vividnext.sodalive.live.room.menu.MenuApi
import kr.co.vividnext.sodalive.user.CreatorFollowRequestRequest
@ -163,7 +164,7 @@ class LiveRepository(
can: Int,
message: String,
token: String
): Single<ApiResponse<String>> {
): Single<ApiResponse<LiveRoomDonationResponse>> {
return api.donation(
request = LiveRoomDonationRequest(
roomId = roomId,

View File

@ -68,6 +68,7 @@ import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationDialog
import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationMessageDialog
import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationMessageViewModel
import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationRankingDialog
import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationResponse
import kr.co.vividnext.sodalive.live.room.info.GetRoomInfoResponse
import kr.co.vividnext.sodalive.live.room.profile.LiveRoomProfileDialog
import kr.co.vividnext.sodalive.live.room.profile.LiveRoomProfileListAdapter
@ -124,6 +125,16 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
}
}
private val signatureList = mutableListOf<LiveRoomDonationResponse>()
private var signature: LiveRoomDonationResponse? = null
set(value) {
field = value
if (field != null) {
showSignatureImage()
}
}
private var isShowSignatureImage = false
private val countDownTimer = object : CountDownTimer(remainingNoChattingTime * 1000, 1000) {
@ -1270,13 +1281,14 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
private fun donation(can: Int, message: String) {
val rawMessage = "${can}캔을 후원하셨습니다.\uD83D\uDCB0\uD83E\uDE99"
viewModel.donation(roomId, can, message) { signatureImage ->
viewModel.donation(roomId, can, message) { signature ->
val donationRawMessage = Gson().toJson(
LiveRoomChatRawMessage(
type = LiveRoomChatRawMessageType.DONATION,
message = rawMessage,
can = can,
signatureImageUrl = signatureImage,
signature = signature,
signatureImageUrl = signature?.imageUrl,
donationMessage = message
)
)
@ -1300,7 +1312,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
)
invalidateChat()
viewModel.addDonationCan(can)
addSignatureImage(signatureImage)
addSignature(signature)
}
},
onFailure = {
@ -1407,9 +1419,12 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
)
invalidateChat()
viewModel.addDonationCan(rawMessage.can)
addSignatureImage(
imageUrl = rawMessage.signatureImageUrl ?: ""
)
if (rawMessage.signature != null) {
addSignature(rawMessage.signature)
} else if (rawMessage.signatureImageUrl != null) {
addSignatureImage(rawMessage.signatureImageUrl)
}
}
}
@ -1762,8 +1777,37 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
}
}
private fun addSignature(signature: LiveRoomDonationResponse?) {
if (signature != null) {
if (!isShowSignatureImage) {
this.signature = signature
isShowSignatureImage = true
} else {
signatureList.add(signature)
}
}
}
private fun showSignatureImage() {
if (signatureImageUrl.isNotBlank()) {
if (signature != null) {
Glide
.with(this)
.load(signature!!.imageUrl)
.into(binding.ivSignature)
binding.ivSignature.visibility = View.VISIBLE
handler.postDelayed({
if (signatureList.isNotEmpty()) {
signature = signatureList.removeAt(0)
} else {
signature = null
isShowSignatureImage = false
binding.ivSignature.setImageDrawable(null)
binding.ivSignature.visibility = View.GONE
}
}, signature!!.time * 1000L)
} else if (signatureImageUrl.isNotBlank()) {
Glide
.with(this)
.load(signatureImageUrl)

View File

@ -17,6 +17,7 @@ import kr.co.vividnext.sodalive.base.BaseViewModel
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.live.LiveRepository
import kr.co.vividnext.sodalive.live.room.donation.GetLiveRoomDonationStatusResponse
import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationResponse
import kr.co.vividnext.sodalive.live.room.info.GetRoomInfoResponse
import kr.co.vividnext.sodalive.live.room.menu.GetMenuPresetResponse
import kr.co.vividnext.sodalive.live.room.profile.GetLiveRoomUserProfileResponse
@ -508,7 +509,7 @@ class LiveRoomViewModel(
)
}
fun donation(roomId: Long, can: Int, message: String, onSuccess: (String) -> Unit) {
fun donation(roomId: Long, can: Int, message: String, onSuccess: (LiveRoomDonationResponse?) -> Unit) {
_isLoading.postValue(true)
compositeDisposable.add(
repository.donation(roomId, can, message, "Bearer ${SharedPreferenceManager.token}")
@ -519,7 +520,7 @@ class LiveRoomViewModel(
_isLoading.value = false
if (it.success) {
SharedPreferenceManager.can -= can
onSuccess(it.data ?: "")
onSuccess(it.data)
} else {
if (it.message != null) {
_toastLiveData.postValue(it.message)

View File

@ -1,11 +1,13 @@
package kr.co.vividnext.sodalive.live.room.chat
import com.google.gson.annotations.SerializedName
import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationResponse
data class LiveRoomChatRawMessage(
@SerializedName("type") val type: LiveRoomChatRawMessageType,
@SerializedName("message") val message: String,
@SerializedName("can") val can: Int,
@SerializedName("signature") val signature: LiveRoomDonationResponse? = null,
@SerializedName("signatureImageUrl") val signatureImageUrl: String? = null,
@SerializedName("donationMessage") val donationMessage: String?,
@SerializedName("isActiveRoulette") val isActiveRoulette: Boolean? = null

View File

@ -0,0 +1,8 @@
package kr.co.vividnext.sodalive.live.room.donation
import com.google.gson.annotations.SerializedName
data class LiveRoomDonationResponse(
@SerializedName("imageUrl") val imageUrl: String,
@SerializedName("time") val time: Int
)