AreaShop/AreaShop/src/main/java/me/wiefferink/areashop/regions/RegionGroup.java

173 lines
4.5 KiB
Java

package me.wiefferink.areashop.regions;
import me.wiefferink.areashop.AreaShop;
import org.bukkit.configuration.ConfigurationSection;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class RegionGroup {
private AreaShop plugin;
private String name;
/**
* Constructor, used when creating new groups or restoring them from groups.yml at server boot
* @param plugin The AreaShop plugin
* @param name Name of the group, has to be unique
*/
public RegionGroup(AreaShop plugin, String name) {
this.plugin = plugin;
this.name = name;
setSetting("name", name);
// Delete duplicates
List<String> members = getMembers();
int previousCount = members.size();
List<String> newMembers = new ArrayList<>();
while(!members.isEmpty()) {
String member = members.remove(0);
// If the region has been deleted also clean it from the group
if(plugin.getFileManager().getRegion(member) != null) {
newMembers.add(member);
}
while(members.contains(member)) {
members.remove(member);
}
}
if(newMembers.size() != previousCount) {
setSetting("regions", newMembers);
AreaShop.debug("group save required because of changed member size");
saveRequired();
}
if(getMembers().size() == 0) {
plugin.getFileManager().removeGroup(this);
}
}
/**
* Adds a member to a group.
* @param region The region to add to the group (GeneralRegion or a subclass of it)
* @return true if the region was not already added, otherwise false
*/
public boolean addMember(GeneralRegion region) {
List<String> members = getMembers();
if(members.contains(region.getLowerCaseName())) {
return false;
} else {
members.add(region.getName());
setSetting("regions", members);
this.saveRequired();
return true;
}
}
/**
* Remove a member from the group.
* @param region The region to remove
* @return true if the region was in the group before, otherwise false
*/
public boolean removeMember(GeneralRegion region) {
List<String> members = getMembers();
boolean result = isMember(region);
members.remove(region.getName());
if(members.isEmpty()) {
plugin.getFileManager().removeGroup(this);
} else {
setSetting("regions", members);
}
if(result) {
this.saveRequired();
}
return result;
}
/**
* Get all members of the group.
* @return A list with the names of all members of the group
*/
public List<String> getMembers() {
if(getSettings() == null || getSettings().getStringList("regions") == null) {
return new ArrayList<>();
}
return getSettings().getStringList("regions");
}
/**
* Get all members of the group as GeneralRegions.
* @return A Set with all group members
*/
public Set<GeneralRegion> getMemberRegions() {
Set<GeneralRegion> result = new HashSet<>();
for(String name : getMembers()) {
result.add(plugin.getFileManager().getRegion(name));
}
return result;
}
/**
* Get the name of the group.
* @return The name of the group
*/
public String getName() {
return name;
}
/**
* Get the lowercase name of the group (used for getting the config etc).
* @return The name of the group in lowercase
*/
public String getLowerCaseName() {
return getName().toLowerCase();
}
/**
* Check if a region is member of the group.
* @param region Region to check
* @return true if the region is in the group, otherwise false
*/
public boolean isMember(GeneralRegion region) {
return getMembers().contains(region.getName());
}
/**
* Get the priority of the group (higher overwrites).
* @return The priority of the group
*/
public int getPriority() {
return getSettings().getInt("priority");
}
/**
* Get the configurationsection with the settings of this group.
* @return The ConfigurationSection with the settings of the group
*/
public ConfigurationSection getSettings() {
return plugin.getFileManager().getGroupSettings(name);
}
/**
* Set a setting of this group.
* @param path The path to set
* @param setting The value to set
*/
public void setSetting(String path, Object setting) {
plugin.getFileManager().setGroupSetting(this, path, setting);
}
/**
* Indicates this file needs to be saved, will actually get saved later by a task.
*/
public void saveRequired() {
plugin.getFileManager().saveGroupsIsRequired();
}
/**
* Save the groups to disk now, normally saveRequired() is preferred because of performance.
*/
public void saveNow() {
plugin.getFileManager().saveGroupsNow();
}
}