Compare commits

..

3 Commits

Author SHA1 Message Date
7afbf1bff8 라이브방 정보 응답에 방장 언어코드를 제공한다
라이브방 정보 조회 응답에서 tags 필드를 제거한다.
방장이 설정한 언어를 2자리 creatorLanguageCode로 제공한다.
2026-02-08 22:26:34 +09:00
8dec0fe2e5 라이브 언어 태그를 조회 언어로 번역해 노출한다
라이브 목록/상세 응답의 언어 태그를 조회자 언어로 반환한다.
언어 코드를 메시지 키로 매핑해 ko/en/ja 번역값을 제공한다.
2026-02-08 22:18:50 +09:00
4ea7fdc562 방 정보 응답의 v2v 워커 토큰을 RTC로 전환
GetRoomInfoResponse의 v2vWorkerRtmToken 필드를
v2vWorkerToken으로 변경한다.
v2v 워커 토큰은 RTM 대신 채널 기반 RTC 토큰을 반환한다.
2026-02-08 21:01:53 +09:00
4 changed files with 44 additions and 29 deletions

View File

@@ -34,15 +34,14 @@ class RtcTokenBuilder {
appId: String, appId: String,
appCertificate: String, appCertificate: String,
channelName: String, channelName: String,
uid: Int, uid: String,
privilegeTs: Int privilegeTs: Int
): String { ): String {
val account = if (uid == 0) "" else uid.toString()
return buildTokenWithUserAccount( return buildTokenWithUserAccount(
appId, appId,
appCertificate, appCertificate,
channelName, channelName,
account, uid,
privilegeTs privilegeTs
) )
} }

View File

@@ -1578,6 +1578,21 @@ class SodaMessageSource {
Lang.EN to "yyyy.MM.dd E hh:mm a", Lang.EN to "yyyy.MM.dd E hh:mm a",
Lang.JA to "yyyy.MM.dd E hh:mm a" Lang.JA to "yyyy.MM.dd E hh:mm a"
), ),
"live.room.language_tag.korean" to mapOf(
Lang.KO to "한국어",
Lang.EN to "Korean",
Lang.JA to "韓国語"
),
"live.room.language_tag.japanese" to mapOf(
Lang.KO to "일본어",
Lang.EN to "Japanese",
Lang.JA to "日本語"
),
"live.room.language_tag.english" to mapOf(
Lang.KO to "영어",
Lang.EN to "English",
Lang.JA to "英語"
),
"live.room.fcm.message.started" to mapOf( "live.room.fcm.message.started" to mapOf(
Lang.KO to "라이브를 시작했습니다. - %s", Lang.KO to "라이브를 시작했습니다. - %s",
Lang.EN to "Live started. - %s", Lang.EN to "Live started. - %s",

View File

@@ -154,13 +154,7 @@ class LiveRoomService(
.maxByOrNull { it.updatedAt ?: LocalDateTime.MIN } .maxByOrNull { it.updatedAt ?: LocalDateTime.MIN }
?.languageCode ?.languageCode
val languageTag = when (languageCode?.lowercase()?.take(2)) { return resolveLanguageTag(languageCode)
"ko" -> "한국어"
"ja" -> "일본어"
"en" -> "영어"
else -> null
}
return languageTag
} }
private fun buildLanguageTagMap(memberIds: List<Long>): Map<Long, String?> { private fun buildLanguageTagMap(memberIds: List<Long>): Map<Long, String?> {
@@ -175,15 +169,21 @@ class LiveRoomService(
} }
return latestTokenByMemberId.mapValues { (_, token) -> return latestTokenByMemberId.mapValues { (_, token) ->
when (token?.languageCode?.lowercase()?.take(2)) { resolveLanguageTag(token?.languageCode)
"ko" -> "한국어"
"ja" -> "일본어"
"en" -> "영어"
else -> null
}
} }
} }
private fun resolveLanguageTag(languageCode: String?): String? {
val key = when (languageCode?.lowercase()?.take(2)) {
"ko" -> "live.room.language_tag.korean"
"ja" -> "live.room.language_tag.japanese"
"en" -> "live.room.language_tag.english"
else -> null
} ?: return null
return messageSource.getMessage(key, langContext.lang)
}
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun getRoomList( fun getRoomList(
dateString: String?, dateString: String?,
@@ -917,7 +917,7 @@ class LiveRoomService(
agoraAppId, agoraAppId,
agoraAppCertificate, agoraAppCertificate,
room.channelName!!, room.channelName!!,
member.id!!.toInt(), member.id!!.toString(),
expireTimestamp.toInt() expireTimestamp.toInt()
) )
@@ -928,10 +928,11 @@ class LiveRoomService(
expireTimestamp.toInt() expireTimestamp.toInt()
) )
val v2vWorkerRtmToken = rtmTokenBuilder.buildToken( val v2vWorkerToken = rtcTokenBuilder.buildTokenWithUid(
agoraAppId, agoraAppId,
agoraAppCertificate, agoraAppCertificate,
"v2v-agent-${member.id!!}", room.channelName!!,
"${member.id!!}333",
expireTimestamp.toInt() expireTimestamp.toInt()
) )
@@ -962,12 +963,12 @@ class LiveRoomService(
} }
val menuPan = menuService.getLiveMenu(creatorId = room.member!!.id!!) val menuPan = menuService.getLiveMenu(creatorId = room.member!!.id!!)
val languageTagByMemberId = buildLanguageTagMap(listOfNotNull(room.member?.id)) val creatorLanguageCode = pushTokenRepository.findByMemberId(room.member!!.id!!)
.filterNot { it.languageCode.isNullOrBlank() }
val tags = room.tags .maxByOrNull { it.updatedAt ?: LocalDateTime.MIN }
.filter { it.tag.isActive } ?.languageCode
.map { it.tag.tag } ?.lowercase()
.let { tags -> applyLanguageTagToRoomTags(room.member?.id, tags, languageTagByMemberId) } ?.take(2)
return GetRoomInfoResponse( return GetRoomInfoResponse(
roomId = roomId, roomId = roomId,
@@ -989,7 +990,7 @@ class LiveRoomService(
channelName = room.channelName!!, channelName = room.channelName!!,
rtcToken = rtcToken, rtcToken = rtcToken,
rtmToken = rtmToken, rtmToken = rtmToken,
v2vWorkerRtmToken = v2vWorkerRtmToken, v2vWorkerToken = v2vWorkerToken,
creatorId = room.member!!.id!!, creatorId = room.member!!.id!!,
creatorNickname = room.member!!.nickname, creatorNickname = room.member!!.nickname,
creatorProfileUrl = if (room.member!!.profileImage != null) { creatorProfileUrl = if (room.member!!.profileImage != null) {
@@ -1006,7 +1007,7 @@ class LiveRoomService(
managerList = roomInfo.managerList, managerList = roomInfo.managerList,
donationRankingTop3UserIds = donationRankingTop3UserIds, donationRankingTop3UserIds = donationRankingTop3UserIds,
menuPan = menuPan?.menu ?: "", menuPan = menuPan?.menu ?: "",
tags = tags, creatorLanguageCode = creatorLanguageCode,
isPrivateRoom = room.type == LiveRoomType.PRIVATE, isPrivateRoom = room.type == LiveRoomType.PRIVATE,
password = room.password, password = room.password,
isActiveRoulette = isActiveRoulette isActiveRoulette = isActiveRoulette

View File

@@ -8,7 +8,7 @@ data class GetRoomInfoResponse(
val channelName: String, val channelName: String,
val rtcToken: String, val rtcToken: String,
val rtmToken: String, val rtmToken: String,
val v2vWorkerRtmToken: String, val v2vWorkerToken: String,
val creatorId: Long, val creatorId: Long,
val creatorNickname: String, val creatorNickname: String,
val creatorProfileUrl: String, val creatorProfileUrl: String,
@@ -21,7 +21,7 @@ data class GetRoomInfoResponse(
val managerList: List<LiveRoomMember>, val managerList: List<LiveRoomMember>,
val donationRankingTop3UserIds: List<Long>, val donationRankingTop3UserIds: List<Long>,
val menuPan: String, val menuPan: String,
val tags: List<String>, val creatorLanguageCode: String?,
val isPrivateRoom: Boolean = false, val isPrivateRoom: Boolean = false,
val password: String? = null, val password: String? = null,
val isActiveRoulette: Boolean = false val isActiveRoulette: Boolean = false