@@ -3,6 +3,7 @@ package com.blitzoffline.giveall.util
33import com.blitzoffline.giveall.GiveAll
44import com.blitzoffline.giveall.command.CommandManager
55import com.blitzoffline.giveall.extension.sendMessage
6+ import com.blitzoffline.giveall.settings.holder.IpMode
67import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder
78import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver
89import org.bukkit.command.CommandSender
@@ -18,12 +19,11 @@ fun handleItemGiving(
1819 receivers : Collection <Player >,
1920 vararg placeholders : TagResolver
2021) {
21- if (! handleBasicChecks(plugin, sender, receivers, * placeholders)) return
22+ val filteredReceivers = filterReceivers(plugin, sender, receivers)
23+ if (! handleBasicChecks(plugin, sender, filteredReceivers, * placeholders)) return
2224
2325 var count = 0
24- for (receiver in receivers) {
25- if (! handleBasicReceiverChecks(plugin, sender, receiver)) continue
26-
26+ for (receiver in filteredReceivers) {
2727 receiver.inventory.addItem(item.clone())
2828 count++
2929
@@ -53,10 +53,11 @@ fun handleXpGiving(
5353 receivers : Collection <Player >,
5454 vararg placeholders : TagResolver
5555) {
56- if (! handleBasicChecks(plugin, sender, receivers, * placeholders)) return
56+ val filteredReceivers = filterReceivers(plugin, sender, receivers)
57+ if (! handleBasicChecks(plugin, sender, filteredReceivers, * placeholders)) return
5758
58- if (levels) return handleXpLevelsGiving(plugin, sender, amount, receivers , * placeholders)
59- handleXpPointsGiving(plugin, sender, amount, receivers , * placeholders)
59+ if (levels) return handleXpLevelsGiving(plugin, sender, amount, filteredReceivers , * placeholders)
60+ handleXpPointsGiving(plugin, sender, amount, filteredReceivers , * placeholders)
6061}
6162
6263fun handleMoneyGiving (
@@ -66,12 +67,11 @@ fun handleMoneyGiving(
6667 receivers : Collection <Player >,
6768 vararg placeholders : TagResolver
6869) {
69- if (! handleBasicChecks(plugin, sender, receivers, * placeholders)) return
70+ val filteredReceivers = filterReceivers(plugin, sender, receivers)
71+ if (! handleBasicChecks(plugin, sender, filteredReceivers, * placeholders)) return
7072
7173 var count = 0
72- for (receiver in receivers) {
73- if (! handleBasicReceiverChecks(plugin, sender, receiver)) continue
74-
74+ for (receiver in filteredReceivers) {
7575 plugin.econ.depositPlayer(receiver, amount)
7676 count++
7777
@@ -99,8 +99,6 @@ private fun handleXpLevelsGiving(
9999) {
100100 var count = 0
101101 for (receiver in receivers) {
102- if (! handleBasicReceiverChecks(plugin, sender, receiver)) continue
103-
104102 receiver.giveExpLevels(amount)
105103 count++
106104
@@ -128,8 +126,6 @@ private fun handleXpPointsGiving(
128126) {
129127 var count = 0
130128 for (receiver in receivers) {
131- if (! handleBasicReceiverChecks(plugin, sender, receiver)) continue
132-
133129 receiver.giveExp(amount)
134130 count++
135131
@@ -163,29 +159,52 @@ private fun handleBasicChecks(
163159 return false
164160 }
165161
166- if (sender is Player && receivers.size == 1 && receivers.first() == sender &&
167- ! plugin.settingsManager.settings.giveRewardsToSender
168- ) {
169- sendMessage(
170- sender,
171- plugin.settingsManager.messages.noPlayers,
172- * placeholders
173- )
174- return false
175- }
176-
177162 return true
178163}
179164
180- private fun handleBasicReceiverChecks (
165+ private fun filterReceivers (
181166 plugin : GiveAll ,
182167 sender : CommandSender ,
183- receiver : Player
184- ): Boolean {
185- if (! plugin.settingsManager.settings.giveRewardsToSender && receiver == sender)
186- return false
187- if (plugin.settingsManager.settings.requirePermission && ! receiver.hasPermission(RECEIVE_PERMISSION ))
188- return false
189-
190- return true
191- }
168+ receivers : Collection <Player >
169+ ): Collection <Player > {
170+ val filteredReceivers = receivers
171+ .asSequence()
172+ .filter { plugin.settingsManager.settings.giveRewardsToSender || it != sender }
173+ .filter { ! plugin.settingsManager.settings.requirePermission || it.hasPermission(RECEIVE_PERMISSION ) }
174+ .toList()
175+
176+ val ipMode = plugin.settingsManager.settings.ipMode
177+ if (ipMode == IpMode .ALL ) return filteredReceivers
178+
179+ val ipMap = filteredReceivers.associateWith { it.address.address.hostAddress }
180+
181+ return when (ipMode) {
182+ IpMode .NONE -> {
183+ val counts = ipMap.values.groupingBy { it }.eachCount()
184+ ipMap.filter { (_, ip) -> counts[ip] == 1 }.keys
185+ }
186+
187+ IpMode .RANDOM -> {
188+ ipMap.entries
189+ .groupBy { it.value }
190+ .map { (_, entries) -> entries.random() }
191+ .map { it.key }
192+ }
193+
194+ IpMode .FIRST -> {
195+ ipMap.entries
196+ .groupBy { it.value }
197+ .map { (_, entries) -> entries.minByOrNull { it.key.name }!! }
198+ .map { it.key }
199+ }
200+
201+ IpMode .LAST -> {
202+ ipMap.entries
203+ .groupBy { it.value }
204+ .map { (_, entries) -> entries.maxByOrNull { it.key.name }!! }
205+ .map { it.key }
206+ }
207+
208+ else -> filteredReceivers
209+ }
210+ }
0 commit comments