Newer
Older
Twilight / src / main / kotlin / net / taehui / twilight / system / AvatarHandler.kt
@Taehui Taehui on 17 Mar 2 KB 2024-03-17 오후 2:12
package net.taehui.twilight.system

import net.taehui.twilight.Avatar
import net.taehui.twilight.Logger
import java.util.concurrent.ConcurrentHashMap

object AvatarHandler {
    private val avatars = ConcurrentHashMap<String, Avatar>()

    fun doInfo(logger: Logger) {
        avatars.values.filter { !it.isAwilight }.forEach { logger.logInfo(it.toString()) }
    }

    fun getAvatar(avatarID: String): Avatar? {
        return avatars[avatarID]
    }

    fun establish(avatar: Avatar, avatarID: String, qwilightName: String, isValve: Boolean, isPause: Boolean) {
        if (!isPause) {
            avatar.setEstablished(avatarID, qwilightName, isValve)
        }
        avatars[avatar.avatarID] = avatar
    }

    fun handleLogIn(
        avatar: Avatar,
        totem: String,
        avatarID: String,
        avatarName: String,
        avatarCompetence: Int
    ) {
        synchronized(avatarID.intern()) {
            handleNotLogIn(avatarID)
            val avatarIDBefore = avatar.avatarID
            avatar.handleLogIn(totem, avatarID, avatarName, avatarCompetence)
            avatars.remove(avatarIDBefore)?.let { avatars.put(avatarID, it) }
        }
    }

    fun handleNotLogIn(avatarID: String) {
        avatars.remove(avatarID)?.let {
            it.handleNotLogIn()
            avatars[it.avatarID] = it
        }
    }

    fun quitAvatar(avatarID: String) {
        avatars.remove(avatarID)?.let {
            it.doIfAvailable {
                if (it.isLoggedIn) {
                    it.handleNotLogIn()
                } else {
                    SiteHandler.quitAvatar(it)
                }
                it.isAvailable = false
            }
        }
    }

    fun pause(text: String) {
        avatars.values.forEach { avatar ->
            Translator.translate(avatar.language, text, avatar).thenAccept {
                avatar.send(EventOuterClass.Event.EventID.CLOSE, it)
                avatar.close()
            }
        }
    }

    fun sendInvalidateAvatarTitle(avatarID: String) {
        avatars.values.forEach {
            it.send(
                EventOuterClass.Event.EventID.INVALIDATE_AVATAR_TITLE,
                avatarID
            )
        }
    }

    fun sendInvalidateAvatarDrawing(avatarID: String) {
        avatars.values.forEach {
            it.send(
                EventOuterClass.Event.EventID.INVALIDATE_AVATAR_DRAWING,
                avatarID
            )
        }
    }

    fun sendInvalidateAvatarEdge(avatarID: String) {
        avatars.values.forEach {
            it.send(
                EventOuterClass.Event.EventID.INVALIDATE_AVATAR_EDGE,
                avatarID
            )
        }
    }

    fun sendClose(text: String) {
        avatars.values.forEach {
            it.send(
                EventOuterClass.Event.EventID.CLOSE,
                text
            )
        }
    }
}