Skip to content

Commit 25a7f11

Browse files
committed
refactor: follow liskov substitution principle in modules
1 parent 79f8bcf commit 25a7f11

25 files changed

+119
-108
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* This file is part of Akropolis
3+
*
4+
* Copyright (c) 2025 DevBlook Team and others
5+
*
6+
* Akropolis free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU General Public License as published by
8+
* the Free Software Foundation, either version 3 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* Akropolis is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU General Public License
17+
* along with Akropolis. If not, see <http://www.gnu.org/licenses/>.
18+
*/
19+
20+
package me.zetastormy.akropolis.module;
21+
22+
public interface LifeCycle {
23+
24+
default void onEnable() {}
25+
26+
default void onDisable() {}
27+
}

src/main/java/me/zetastormy/akropolis/module/Module.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,21 @@
1919

2020
package me.zetastormy.akropolis.module;
2121

22-
import me.zetastormy.akropolis.AkropolisPlugin;
23-
import me.zetastormy.akropolis.config.ConfigType;
24-
import me.zetastormy.akropolis.cooldown.CooldownManager;
22+
import java.util.ArrayList;
23+
import java.util.List;
24+
import java.util.UUID;
25+
2526
import org.bukkit.Location;
2627
import org.bukkit.World;
2728
import org.bukkit.configuration.file.FileConfiguration;
2829
import org.bukkit.entity.Player;
2930
import org.bukkit.event.Listener;
3031

31-
import java.util.ArrayList;
32-
import java.util.List;
33-
import java.util.UUID;
32+
import me.zetastormy.akropolis.AkropolisPlugin;
33+
import me.zetastormy.akropolis.config.ConfigType;
34+
import me.zetastormy.akropolis.cooldown.CooldownManager;
3435

35-
public abstract class Module implements Listener {
36+
public class Module implements Listener {
3637
private final AkropolisPlugin plugin;
3738
private final ModuleType moduleType;
3839
private List<String> disabledWorlds;
@@ -84,8 +85,4 @@ public void executeActions(Player player, List<String> actions) {
8485
public ModuleType getModuleType() {
8586
return moduleType;
8687
}
87-
88-
public abstract void onEnable();
89-
90-
public abstract void onDisable();
9188
}

src/main/java/me/zetastormy/akropolis/module/ModuleManager.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,10 @@ public void loadModules(AkropolisPlugin plugin) {
111111
for (Module module : modules.values()) {
112112
try {
113113
module.setDisabledWorlds(disabledWorlds);
114-
module.onEnable();
114+
115+
if (module instanceof LifeCycle) {
116+
((LifeCycle) module).onEnable();
117+
}
115118
} catch (Exception e) {
116119
e.printStackTrace();
117120
plugin.getLogger().severe("There was an error loading the " + module.getModuleType() + " module");
@@ -128,7 +131,10 @@ public void unloadModules() {
128131
for (Module module : modules.values()) {
129132
try {
130133
HandlerList.unregisterAll(module);
131-
module.onDisable();
134+
135+
if (module instanceof LifeCycle) {
136+
((LifeCycle) module).onDisable();
137+
}
132138
} catch (Exception e) {
133139
e.printStackTrace();
134140
plugin.getLogger()

src/main/java/me/zetastormy/akropolis/module/modules/chat/AntiSwear.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@
3030
import me.zetastormy.akropolis.Permissions;
3131
import me.zetastormy.akropolis.config.ConfigType;
3232
import me.zetastormy.akropolis.config.Message;
33+
import me.zetastormy.akropolis.module.LifeCycle;
3334
import me.zetastormy.akropolis.module.Module;
3435
import me.zetastormy.akropolis.module.ModuleType;
3536
import me.zetastormy.akropolis.util.text.TextUtil;
3637
import net.kyori.adventure.text.Component;
3738

38-
public class AntiSwear extends Module {
39+
public class AntiSwear extends Module implements LifeCycle {
3940
private List<String> blockedWords;
4041

4142
public AntiSwear(AkropolisPlugin plugin) {
@@ -47,11 +48,6 @@ public void onEnable() {
4748
blockedWords = getConfig(ConfigType.SETTINGS).getStringList("anti_swear.blocked_words");
4849
}
4950

50-
@Override
51-
public void onDisable() {
52-
// TODO: Refactor to follow Liskov Substitution principle.
53-
}
54-
5551
@EventHandler
5652
public void onPlayerChat(AsyncChatEvent event) {
5753
Player player = event.getPlayer();

src/main/java/me/zetastormy/akropolis/module/modules/chat/AutoBroadcast.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,13 @@
3333

3434
import me.zetastormy.akropolis.AkropolisPlugin;
3535
import me.zetastormy.akropolis.config.ConfigType;
36+
import me.zetastormy.akropolis.module.LifeCycle;
3637
import me.zetastormy.akropolis.module.Module;
3738
import me.zetastormy.akropolis.module.ModuleType;
3839
import me.zetastormy.akropolis.util.text.PlaceholderUtil;
3940
import net.kyori.adventure.text.Component;
4041

41-
public class AutoBroadcast extends Module implements Runnable {
42+
public class AutoBroadcast extends Module implements Runnable, LifeCycle {
4243
private Map<Integer, List<String>> broadcasts;
4344
private int broadcastTask = 0;
4445
private int count = 0;

src/main/java/me/zetastormy/akropolis/module/modules/chat/ChatCommandBlock.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@
2929
import me.zetastormy.akropolis.Permissions;
3030
import me.zetastormy.akropolis.config.ConfigType;
3131
import me.zetastormy.akropolis.config.Message;
32+
import me.zetastormy.akropolis.module.LifeCycle;
3233
import me.zetastormy.akropolis.module.Module;
3334
import me.zetastormy.akropolis.module.ModuleType;
3435

35-
public class ChatCommandBlock extends Module {
36+
public class ChatCommandBlock extends Module implements LifeCycle {
3637
private List<String> blockedCommands;
3738

3839
public ChatCommandBlock(AkropolisPlugin plugin) {
@@ -44,11 +45,6 @@ public void onEnable() {
4445
blockedCommands = getConfig(ConfigType.SETTINGS).getStringList("command_block.blocked_commands");
4546
}
4647

47-
@Override
48-
public void onDisable() {
49-
// TODO: Refactor to follow Liskov Substitution principle.
50-
}
51-
5248
@EventHandler
5349
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) {
5450
Player player = event.getPlayer();

src/main/java/me/zetastormy/akropolis/module/modules/chat/ChatLock.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,20 @@
1919

2020
package me.zetastormy.akropolis.module.modules.chat;
2121

22+
import org.bukkit.entity.Player;
23+
import org.bukkit.event.EventHandler;
24+
import org.bukkit.event.EventPriority;
25+
2226
import io.papermc.paper.event.player.AsyncChatEvent;
2327
import me.zetastormy.akropolis.AkropolisPlugin;
2428
import me.zetastormy.akropolis.Permissions;
2529
import me.zetastormy.akropolis.config.ConfigType;
2630
import me.zetastormy.akropolis.config.Message;
31+
import me.zetastormy.akropolis.module.LifeCycle;
2732
import me.zetastormy.akropolis.module.Module;
2833
import me.zetastormy.akropolis.module.ModuleType;
29-
import org.bukkit.entity.Player;
30-
import org.bukkit.event.EventHandler;
31-
import org.bukkit.event.EventPriority;
3234

33-
public class ChatLock extends Module {
35+
public class ChatLock extends Module implements LifeCycle {
3436
private boolean isChatLocked;
3537

3638
public ChatLock(AkropolisPlugin plugin) {

src/main/java/me/zetastormy/akropolis/module/modules/chat/groups/ChatGroups.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,14 @@
3333
import io.papermc.paper.event.player.AsyncChatEvent;
3434
import me.zetastormy.akropolis.AkropolisPlugin;
3535
import me.zetastormy.akropolis.config.ConfigType;
36+
import me.zetastormy.akropolis.module.LifeCycle;
3637
import me.zetastormy.akropolis.module.Module;
3738
import me.zetastormy.akropolis.module.ModuleType;
3839
import me.zetastormy.akropolis.util.text.TextUtil;
3940
import net.kyori.adventure.text.Component;
4041
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
4142

42-
public class ChatGroups extends Module {
43+
public class ChatGroups extends Module implements LifeCycle {
4344
private final Map<String, ChatGroup> chatGroups = new HashMap<>();
4445

4546
public ChatGroups(AkropolisPlugin plugin) {

src/main/java/me/zetastormy/akropolis/module/modules/hologram/HologramManager.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,28 @@
1919

2020
package me.zetastormy.akropolis.module.modules.hologram;
2121

22-
import me.zetastormy.akropolis.AkropolisPlugin;
23-
import me.zetastormy.akropolis.config.ConfigHandler;
24-
import me.zetastormy.akropolis.config.ConfigType;
25-
import me.zetastormy.akropolis.module.Module;
26-
import me.zetastormy.akropolis.module.ModuleType;
27-
import me.zetastormy.akropolis.util.text.TextUtil;
28-
import net.kyori.adventure.text.Component;
22+
import java.util.ArrayList;
23+
import java.util.HashSet;
24+
import java.util.List;
25+
import java.util.Set;
26+
2927
import org.bukkit.Bukkit;
3028
import org.bukkit.Location;
3129
import org.bukkit.World;
3230
import org.bukkit.configuration.ConfigurationSection;
3331
import org.bukkit.entity.ArmorStand;
3432
import org.bukkit.entity.Entity;
3533

36-
import java.util.ArrayList;
37-
import java.util.HashSet;
38-
import java.util.List;
39-
import java.util.Set;
34+
import me.zetastormy.akropolis.AkropolisPlugin;
35+
import me.zetastormy.akropolis.config.ConfigHandler;
36+
import me.zetastormy.akropolis.config.ConfigType;
37+
import me.zetastormy.akropolis.module.LifeCycle;
38+
import me.zetastormy.akropolis.module.Module;
39+
import me.zetastormy.akropolis.module.ModuleType;
40+
import me.zetastormy.akropolis.util.text.TextUtil;
41+
import net.kyori.adventure.text.Component;
4042

41-
public class HologramManager extends Module {
43+
public class HologramManager extends Module implements LifeCycle {
4244
private Set<Hologram> holograms;
4345
private ConfigHandler dataConfig;
4446
private ConfigurationSection hologramsSection;

src/main/java/me/zetastormy/akropolis/module/modules/hotbar/HotbarManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,15 @@
3333

3434
import me.zetastormy.akropolis.AkropolisPlugin;
3535
import me.zetastormy.akropolis.config.ConfigType;
36+
import me.zetastormy.akropolis.module.LifeCycle;
3637
import me.zetastormy.akropolis.module.Module;
3738
import me.zetastormy.akropolis.module.ModuleType;
3839
import me.zetastormy.akropolis.module.modules.hotbar.items.CustomItem;
3940
import me.zetastormy.akropolis.module.modules.hotbar.items.FightMode;
4041
import me.zetastormy.akropolis.module.modules.hotbar.items.PlayerHider;
4142
import me.zetastormy.akropolis.util.ItemStackBuilder;
4243

43-
public class HotbarManager extends Module {
44+
public class HotbarManager extends Module implements LifeCycle {
4445
private List<HotbarItem> hotbarItems;
4546
private Set<UUID> players;
4647

0 commit comments

Comments
 (0)