Skip to content

Commit db3820a

Browse files
authored
Merge pull request #8 from BlitzOffline/issue/6
2 parents 82528c5 + 73dd02f commit db3820a

6 files changed

Lines changed: 76 additions & 40 deletions

File tree

src/main/kotlin/com/blitzoffline/giveall/GiveAll.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class GiveAll : JavaPlugin() {
4646
}
4747

4848
val vaultHook = settingsManager.settings.hooks["vault"]
49-
if (vaultHook != null && vaultHook == true) {
49+
if (vaultHook != null && vaultHook) {
5050
val vault = Bukkit.getPluginManager().getPlugin("Vault")
5151

5252
if (vault == null) {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.blitzoffline.giveall.settings.holder
2+
3+
enum class IpMode {
4+
ALL,
5+
RANDOM,
6+
FIRST,
7+
LAST,
8+
NONE
9+
}

src/main/kotlin/com/blitzoffline/giveall/settings/holder/SettingsHolder.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ import org.spongepowered.configurate.objectmapping.ConfigSerializable
66
data class SettingsHolder(
77
val giveRewardsToSender: Boolean = false,
88
val requirePermission: Boolean = false,
9-
val hooks: Map<String, Boolean> = mapOf("vault" to true)
9+
val hooks: Map<String, Boolean> = mapOf("vault" to true),
10+
val ipMode: IpMode = IpMode.ALL
1011
)

src/main/kotlin/com/blitzoffline/giveall/util/RewardsManager.kt

Lines changed: 55 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.blitzoffline.giveall.util
33
import com.blitzoffline.giveall.GiveAll
44
import com.blitzoffline.giveall.command.CommandManager
55
import com.blitzoffline.giveall.extension.sendMessage
6+
import com.blitzoffline.giveall.settings.holder.IpMode
67
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder
78
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver
89
import 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

6263
fun 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+
}

src/main/kotlin/com/blitzoffline/giveall/util/VersionHelper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ object VersionHelper {
1818
return try {
1919
Class.forName("com.destroystokyo.paper.PaperConfig")
2020
true
21-
} catch (ignored: ClassNotFoundException) {
21+
} catch (_: ClassNotFoundException) {
2222
false
2323
}
2424
}

src/main/resources/settings.conf

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,11 @@ hooks {
1313
vault=true
1414
}
1515
# If you enable this, only players with the permission 'giveall.receive' will be able to get the rewards.
16-
require-permission=false
16+
require-permission=false
17+
# Select what happens when there are multiple players logged in with the same IP address.
18+
# ALL - gives rewards to all players even if they share an IP address.
19+
# RANDOM - gives rewards to one random player from the players sharing an IP address.
20+
# FIRST - gives rewards to one player from the players sharing an IP address. The player is chosen based on alphabetical order.
21+
# LAST - gives rewards to one player from the players sharing an IP address. The player is chosen based on reversed alphabetical order.
22+
# NONE - do not give rewards at all to players that share an IP address.
23+
ip-mode=ALL

0 commit comments

Comments
 (0)