4 Commits

2 changed files with 54 additions and 27 deletions

View File

@@ -206,8 +206,8 @@ class UserHandler(
) { ) {
lateinit var client: ChzzkClient lateinit var client: ChzzkClient
lateinit var chatChannelId: String lateinit var chatChannelId: String
var listener: ChzzkUserSession? = null lateinit var listener: ChzzkUserSession
var messageHandler: MessageHandler? = null lateinit var messageHandler: MessageHandler
private val dispatcher: CoroutinesEventBus by inject(CoroutinesEventBus::class.java) private val dispatcher: CoroutinesEventBus by inject(CoroutinesEventBus::class.java)
private var _isActive: Boolean private var _isActive: Boolean
@@ -233,9 +233,17 @@ class UserHandler(
client.loginAsync().await() client.loginAsync().await()
listener = ChzzkSessionBuilder(client).buildUserSession() listener = ChzzkSessionBuilder(client).buildUserSession()
listener?.createAndConnectAsync()?.await() listener.createAndConnectAsync().await()
listener.subscribeAsync(ChzzkSessionSubscriptionType.CHAT)?.await()
delay(1000L) delay(5000L)
messageHandler = MessageHandler(this@UserHandler)
logger.info("${user.username} message handler init.")
listener.on(SessionChatMessageEvent::class.java) {
messageHandler.handle(it.message, user)
}
logger.info("${user.username} is connected.")
val timer = TimerConfigService.getConfig(user) val timer = TimerConfigService.getConfig(user)
if (timer?.option == TimerType.UPTIME.value) if (timer?.option == TimerType.UPTIME.value)
@@ -253,25 +261,17 @@ class UserHandler(
null null
) )
) )
messageHandler = MessageHandler(this@UserHandler)
listener?.on(SessionChatMessageEvent::class.java) {
messageHandler?.handle(it.message, user)
}
} }
internal suspend fun disable() { internal suspend fun disable() {
listener?.unsubscribeAsync(ChzzkSessionSubscriptionType.CHAT)?.await() listener.unsubscribeAsync(ChzzkSessionSubscriptionType.CHAT)?.await()
listener?.disconnectAsync()?.await() listener.disconnectAsync()?.await()
listener = null
messageHandler = null
_isActive = false _isActive = false
} }
internal fun reloadCommand() { internal fun reloadCommand() {
messageHandler?.reloadCommand() messageHandler.reloadCommand()
} }
internal fun reloadUser(user: User) { internal fun reloadUser(user: User) {
@@ -325,7 +325,8 @@ class UserHandler(
} else { } else {
logger.info("${user.username} is offline.") logger.info("${user.username} is offline.")
streamStartTime = null streamStartTime = null
listener?.disconnectAsync()?.join() listener.unsubscribeAsync(ChzzkSessionSubscriptionType.CHAT)?.join()
listener.disconnectAsync()?.join()
_isActive = false _isActive = false
CoroutineScope(Dispatchers.Default).launch { CoroutineScope(Dispatchers.Default).launch {

View File

@@ -37,11 +37,13 @@ class MessageHandler(
init { init {
reloadCommand() reloadCommand()
dispatcher.subscribe(SongEvent::class) { CoroutineScope(Dispatchers.Default).launch {
if(it.type == SongType.STREAM_OFF) { dispatcher.subscribe(SongEvent::class) {
val user = UserService.getUser(channel.channelId) if(it.type == SongType.STREAM_OFF) {
if(! user?.let { usr -> SongListService.getSong(usr) }.isNullOrEmpty()) { val user = UserService.getUser(channel.channelId)
SongListService.deleteUser(user) if(! user?.let { usr -> SongListService.getSong(usr) }.isNullOrEmpty()) {
SongListService.deleteUser(user)
}
} }
} }
} }
@@ -61,6 +63,7 @@ class MessageHandler(
"!노래목록" to this::songListCommand, "!노래목록" to this::songListCommand,
"!노래시작" to this::songStartCommand, "!노래시작" to this::songStartCommand,
"!카테고리" to this::categoryChangeCommand, "!카테고리" to this::categoryChangeCommand,
"!방제" to this::titleChangeCommand,
) )
manageCommands.forEach { (commandName, command) -> manageCommands.forEach { (commandName, command) ->
@@ -87,7 +90,7 @@ class MessageHandler(
} }
private fun manageAddCommand(msg: SessionChatMessage, user: User) { private fun manageAddCommand(msg: SessionChatMessage, user: User) {
if (msg.profile.badges.none { it.imageUrl.contains("manager") || it.imageUrl.contains("streamer") }) { if (msg.profile.badges.none { it.isModerator() }) {
handler.sendChat("매니저만 명령어를 추가할 수 있습니다.") handler.sendChat("매니저만 명령어를 추가할 수 있습니다.")
return return
} }
@@ -108,7 +111,7 @@ class MessageHandler(
} }
private fun manageUpdateCommand(msg: SessionChatMessage, user: User) { private fun manageUpdateCommand(msg: SessionChatMessage, user: User) {
if (msg.profile.badges.none { it.imageUrl.contains("manager") || it.imageUrl.contains("streamer") }) { if (msg.profile.badges.none { it.isModerator() }) {
handler.sendChat("매니저만 명령어를 추가할 수 있습니다.") handler.sendChat("매니저만 명령어를 추가할 수 있습니다.")
return return
} }
@@ -130,7 +133,7 @@ class MessageHandler(
} }
private fun manageRemoveCommand(msg: SessionChatMessage, user: User) { private fun manageRemoveCommand(msg: SessionChatMessage, user: User) {
if (msg.profile.badges.none { it.imageUrl.contains("manager") || it.imageUrl.contains("streamer") }) { if (msg.profile.badges.none { it.isModerator() }) {
handler.sendChat("매니저만 명령어를 삭제할 수 있습니다.") handler.sendChat("매니저만 명령어를 삭제할 수 있습니다.")
return return
} }
@@ -147,7 +150,7 @@ class MessageHandler(
} }
private fun timerCommand(msg: SessionChatMessage, user: User) { private fun timerCommand(msg: SessionChatMessage, user: User) {
if (msg.profile.badges.none { it.imageUrl.contains("manager") || it.imageUrl.contains("streamer") }) { if (msg.profile.badges.none { it.isModerator() }) {
handler.sendChat("매니저만 이 명령어를 사용할 수 있습니다.") handler.sendChat("매니저만 이 명령어를 사용할 수 있습니다.")
return return
} }
@@ -297,7 +300,7 @@ class MessageHandler(
} }
private fun songStartCommand(msg: SessionChatMessage, user: User) { private fun songStartCommand(msg: SessionChatMessage, user: User) {
if (msg.profile.badges.none { it.imageUrl.contains("manager") || it.imageUrl.contains("streamer") }) { if (msg.profile.badges.none { it.isModerator() }) {
handler.sendChat("매니저만 이 명령어를 사용할 수 있습니다.") handler.sendChat("매니저만 이 명령어를 사용할 수 있습니다.")
return return
} }
@@ -316,7 +319,7 @@ class MessageHandler(
} }
private fun categoryChangeCommand(msg: SessionChatMessage, user: User) { private fun categoryChangeCommand(msg: SessionChatMessage, user: User) {
if (msg.profile.badges.none { it.imageUrl.contains("manager") || it.imageUrl.contains("streamer") }) { if (msg.profile.badges.none { it.isModerator() }) {
handler.sendChat("매니저만 이 명령어를 사용할 수 있습니다.") handler.sendChat("매니저만 이 명령어를 사용할 수 있습니다.")
return return
} }
@@ -348,6 +351,25 @@ class MessageHandler(
} }
} }
private fun titleChangeCommand(msg: SessionChatMessage, user: User) {
if (msg.profile.badges.none { it.isModerator() }) {
handler.sendChat("매니저만 이 명령어를 사용할 수 있습니다.")
return
}
val parts = msg.content.split(" ", limit = 2)
if(parts.size <= 1) {
handler.sendChat("입력된 방송 제목이 없습니다.")
return
}
val title = parts[1]
val settings = ChzzkLiveSettings()
settings.defaultLiveTitle = title
handler.client.modifyLiveSettings(settings)
handler.sendChat("$title 로 수정했어요!")
}
internal fun handle(msg: SessionChatMessage, user: User) { internal fun handle(msg: SessionChatMessage, user: User) {
if(msg.senderChannelId == ChzzkHandler.botUid) return if(msg.senderChannelId == ChzzkHandler.botUid) return
@@ -430,3 +452,7 @@ class MessageHandler(
return result return result
} }
} }
fun SessionChatMessage.Profile.Badge.isManager() = imageUrl.contains("manager")
fun SessionChatMessage.Profile.Badge.isStreamer() = imageUrl.contains("streamer")
fun SessionChatMessage.Profile.Badge.isModerator() = isManager() || isStreamer()