nageyqma·git
HTTPS https://git.nageyqma.icu/nageyqma/odin_next.git SSH git@git.nageyqma.icu:nageyqma/odin_next.git

HTTPS 链接可直接 git clone;推送代码请使用 SSH。

6.6 KB · 158 行raw
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
package com.odtheking.odin.utils.skyblock

import com.odtheking.odin.OdinMod.mc
import com.odtheking.odin.events.MessageEvent
import com.odtheking.odin.events.PartyEvent
import com.odtheking.odin.events.core.on

object PartyUtils {

    private val joinedSelf = Regex("^You have joined ((?:\\[[^]]*?])? ?)?(\\w{1,16})'s? party!$")
    private val joinedOther = Regex("^((?:\\[[^]]*?])? ?)?(\\w{1,16}) joined the party\\.$")
    private val leftParty = Regex("^((?:\\[[^]]*?])? ?)?(\\w{1,16}) has left the party\\.$")
    private val kickedParty = Regex("^((?:\\[[^]]*?])? ?)?(\\w{1,16}) has been removed from the party\\.$")
    private val kickedOffline = Regex("^Kicked ((?:\\[[^]]*?])? ?)?(\\w{1,16}) because they were offline\\.$")
    private val kickedDisconnected = Regex("^((?:\\[[^]]*?])? ?)?(\\w{1,16}) was removed from your party because they disconnected\\.$")
    private val transferLeave = Regex("^The party was transferred to ((?:\\[[^]]*?])? ?)?(\\w{1,16}) because ((?:\\[[^]]*?])? ?)?(\\w{1,16}) left$")
    private val transferBy = Regex("^The party was transferred to ((?:\\[[^]]*?])? ?)?(\\w{1,16}) by ((?:\\[[^]]*?])? ?)?(\\w{1,16})$")
    private val partyChat = Regex("^Party > ((?:\\[[^]]*?])? ?)?(\\w{1,16}): (.+)$")
    private val partyInvite = Regex("^((?:\\[[^]]*?])? ?)?(\\w{1,16}) invited ((?:\\[[^]]*?])? ?)?(\\w{1,16}) to the party! They have 60 seconds to accept.$")
    private val leaderDisconnected = Regex("^The party leader, ((?:\\[[^]]*?])? ?)?(\\w{1,16}) has disconnected, they have 5 minutes to rejoin before the party is disbanded\\.$")
    private val leaderRejoined = Regex("^The party leader ((?:\\[[^]]*?])? ?)?(\\w{1,16}) has rejoined\\.$")
    private val memberFormat = Regex("^((?:\\[[^]]*?])? ?)?(\\w{1,16})$")
    private val partyWith = Regex("^You'll be partying with: (.+)$")

    private val queuedInFinder = Regex("^Party Finder > Your party has been queued in the dungeon finder!$")
    private val dungeonJoin = Regex("^Party Finder > (\\w{1,16}) joined the dungeon group! \\((\\w+) Level (\\d+)\\)$")
    private val kuudraJoin = Regex("^Party Finder > ((?:\\[[^]]*?])? ?)?(\\w{1,16}) joined the group! \\(Combat Level (\\d+)\\)$")
    private val membersList = Regex("^Party (Leader|Moderators|Members): (.+)$")

    private val disbandPatterns = listOf(
        Regex("^((?:\\[[^]]*?])? ?)?(\\w{1,16}) has disbanded the party!$"),
        Regex("^You have been kicked from the party by ((?:\\[[^]]*?])? ?)?(\\w{1,16})$"),
        Regex("^The party was disbanded because all invites expired and the party was empty.$"),
        Regex("^The party was disbanded because the party leader disconnected.$"),
        Regex("^You left the party.$"),
        Regex("^You are not currently in a party.$")
    )

    val members = mutableListOf<String>()

    var partyLeader: String? = null
        private set

    var isInParty: Boolean = false
        private set

    init {
        on<MessageEvent.Chat> {
            joinedOther.find(message)?.let { return@on addMember(it.groupValues[2]) }

            joinedSelf.find(message)?.let {
                addMember(it.groupValues[2])
                partyLeader = it.groupValues[2]
                addMember(mc.player?.gameProfile?.name ?: return@on)
                return@on
            }

            leftParty.find(message)?.let { return@on removeMember(it.groupValues[2]) }

            kickedParty.find(message)?.let { return@on removeMember(it.groupValues[2]) }

            kickedOffline.find(message)?.let { return@on removeMember(it.groupValues[2]) }

            kickedDisconnected.find(message)?.let { return@on removeMember(it.groupValues[2]) }

            transferBy.find(message)?.let {
                addMember(it.groupValues[2])
                addMember(it.groupValues[4])
                partyLeader = it.groupValues[2]
                return@on
            }

            transferLeave.find(message)?.let {
                addMember(it.groupValues[2])
                partyLeader = it.groupValues[2]
                removeMember(it.groupValues[4])
                return@on
            }

            leaderDisconnected.find(message)?.let {
                partyLeader = it.groupValues[2]
                return@on
            }

            leaderRejoined.find(message)?.let {
                partyLeader = it.groupValues[2]
                return@on
            }

            partyChat.find(message)?.let {
                addMember(it.groupValues[2])
                return@on
            }

            partyInvite.find(message)?.let {
                addMember(it.groupValues[2])
                if (partyLeader == null) partyLeader = it.groupValues[2]
                return@on
            }

            queuedInFinder.find(message)?.let {
                addMember(mc.player?.gameProfile?.name ?: return@on)
                if (partyLeader == null) partyLeader = mc.player?.gameProfile?.name
                return@on
            }

            for (pattern in disbandPatterns) {
                if (pattern.containsMatchIn(message)) return@on disband()
            }

            membersList.find(message)?.let { match ->
                val type = match.groupValues[1]

                match.groupValues[2].split(" ●").forEach { segment ->
                    val memberMatch = memberFormat.find(segment.trim()) ?: return@forEach
                    addMember(memberMatch.groupValues[2])
                    if (type == "Leader") partyLeader = memberMatch.groupValues[2]

                    return@on
                }
            }

            partyWith.find(message)?.let { match ->
                match.groupValues[1].split(", ").forEach { playerName ->
                    val memberMatch = memberFormat.find(playerName.trim()) ?: return@forEach
                    addMember(memberMatch.groupValues[2])
                }
                return@on
            }

            kuudraJoin.find(message)?.let { return@on addMember(it.groupValues[2]) }

            dungeonJoin.find(message)?.let { return@on addMember(it.groupValues[1]) }
        }
    }

    private fun addMember(playerName: String) {
        if (!isInParty) isInParty = true
        if (playerName !in members) members.add(playerName)
    }

    private fun removeMember(playerName: String) {
        if (playerName !in members) return
        members.remove(playerName)

        PartyEvent.Leave(members).postAndCatch()
        if (members.isEmpty()) disband()
    }

    private fun disband() {
        PartyEvent.Leave(members).postAndCatch()
        members.clear()
        partyLeader = null
        isInParty = false
    }

    fun isLeader(): Boolean = partyLeader == mc.player?.gameProfile?.name
}