Merge branch 'develop' into feature/dinnerbone-morph
This commit is contained in:
commit
140da98922
|
@ -60,7 +60,7 @@ public class PlayerTracker implements Listener
|
|||
{
|
||||
public void run()
|
||||
{
|
||||
PlayerStatus snapshot = new PlayerStatus(event.getPlayer().getName(), event.getServer().getInfo().getName());
|
||||
PlayerStatus snapshot = new PlayerStatus(event.getPlayer().getUniqueId(), event.getPlayer().getName(), event.getServer().getInfo().getName());
|
||||
_repository.addElement(snapshot, DEFAULT_STATUS_TIMEOUT);
|
||||
}
|
||||
});
|
||||
|
@ -73,7 +73,7 @@ public class PlayerTracker implements Listener
|
|||
{
|
||||
public void run()
|
||||
{
|
||||
_repository.removeElement(event.getPlayer().getName().toLowerCase());
|
||||
_repository.removeElement(event.getPlayer().getUniqueId().toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ public class PlayerTracker implements Listener
|
|||
public void playerConnect(final PostLoginEvent event)
|
||||
{
|
||||
_ignoreKick.add(event.getPlayer().getUniqueId());
|
||||
PlayerJoinCommand command = new PlayerJoinCommand(event.getPlayer().getUniqueId());
|
||||
PlayerJoinCommand command = new PlayerJoinCommand(event.getPlayer().getUniqueId(), event.getPlayer().getName());
|
||||
command.publish();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
package mineplex.core.antihack;
|
||||
|
||||
import javax.xml.bind.DatatypeConverter;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Consumer;
|
||||
|
@ -27,6 +29,7 @@ import org.bukkit.event.entity.EntityDamageEvent;
|
|||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.event.player.PlayerToggleFlightEvent;
|
||||
import org.bukkit.plugin.ServicePriority;
|
||||
|
||||
|
@ -138,7 +141,9 @@ public class AntiHack extends MiniPlugin
|
|||
|
||||
private final Set<String> _detailedMessages = new HashSet<>();
|
||||
|
||||
private Set<Player> _pendingBan = new HashSet<>();
|
||||
private Set<Player> _pendingBan = Collections.synchronizedSet(new HashSet<>());
|
||||
|
||||
private Set<UUID> _banned = Collections.synchronizedSet(new HashSet<>());
|
||||
|
||||
// These are the GWEN checks to ignore when handling PlayerViolationEvent
|
||||
private HashSet<Class<? extends Check>> _ignoredChecks = new HashSet<>();
|
||||
|
@ -186,11 +191,18 @@ public class AntiHack extends MiniPlugin
|
|||
new BanwaveAnimationSpin().run(player, after);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onQuit(PlayerQuitEvent event)
|
||||
{
|
||||
UUID uuid = event.getPlayer().getUniqueId();
|
||||
runSync(() -> _banned.remove(uuid));
|
||||
}
|
||||
|
||||
public void doBan(Player player, Class<? extends Check> cause)
|
||||
{
|
||||
runSync(() ->
|
||||
{
|
||||
if (_pendingBan.add(player))
|
||||
if (_pendingBan.add(player) && !_banned.contains(player.getUniqueId()))
|
||||
{
|
||||
CoreClient coreClient = _clientManager.Get(player);
|
||||
|
||||
|
@ -203,22 +215,23 @@ public class AntiHack extends MiniPlugin
|
|||
String finalMessage = "[GWEN] " + id;
|
||||
_logger.saveMetadata(player, id, () ->
|
||||
{
|
||||
_logger.resetViolations(player, () ->
|
||||
runAsync(() ->
|
||||
{
|
||||
runAsync(() ->
|
||||
{
|
||||
GwenBanNotification notification = new GwenBanNotification(_thisServer, player.getName(), player.getUniqueId().toString(), CheckManager.getCheckSimpleName(cause), id);
|
||||
ServerCommandManager.getInstance().publishCommand(notification);
|
||||
});
|
||||
|
||||
_punish.AddPunishment(coreClient.getName(), Category.Hacking, finalMessage, AntiHack.NAME, 3, true, -1, true, after);
|
||||
GwenBanNotification notification = new GwenBanNotification(_thisServer, player.getName(), player.getUniqueId().toString(), CheckManager.getCheckSimpleName(cause), id);
|
||||
ServerCommandManager.getInstance().publishCommand(notification);
|
||||
});
|
||||
|
||||
_punish.AddPunishment(coreClient.getName(), Category.Hacking, finalMessage, AntiHack.NAME, 3, true, -1, true, after);
|
||||
}, custom);
|
||||
};
|
||||
|
||||
if (coreClient.GetRank().has(Rank.TWITCH))
|
||||
{
|
||||
doPunish.accept(result -> _pendingBan.remove(player));
|
||||
doPunish.accept(result ->
|
||||
{
|
||||
_pendingBan.remove(player);
|
||||
_banned.add(player.getUniqueId());
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -228,6 +241,7 @@ public class AntiHack extends MiniPlugin
|
|||
if (result == PunishmentResponse.Punished)
|
||||
{
|
||||
announceBan(player);
|
||||
_banned.add(player.getUniqueId());
|
||||
}
|
||||
_pendingBan.remove(player);
|
||||
})
|
||||
|
|
|
@ -2,164 +2,24 @@ package mineplex.core.antihack.logging;
|
|||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import com.mineplex.anticheat.checks.Check;
|
||||
import com.mineplex.anticheat.checks.CheckManager;
|
||||
|
||||
import mineplex.core.antihack.ViolationLevels;
|
||||
import mineplex.core.database.MinecraftRepository;
|
||||
import mineplex.serverdata.database.DBPool;
|
||||
|
||||
import gnu.trove.map.TIntObjectMap;
|
||||
|
||||
public class AnticheatDatabase extends MinecraftRepository
|
||||
{
|
||||
/*
|
||||
CREATE TABLE IF NOT EXISTS anticheat_vl_logs (accountId INT, checkId INT, maxViolations INT, totalAlerts INT, sinceLastBan INT, PRIMARY KEY(accountId, checkId));
|
||||
CREATE TABLE IF NOT EXISTS anticheat_ban_metadata (id INT NOT NULL AUTO_INCREMENT, accountId INT, banId CHAR(10) NOT NULL, data MEDIUMTEXT NOT NULL, PRIMARY KEY(id));
|
||||
*/
|
||||
|
||||
private static final String INSERT_INTO_METADATA = "INSERT INTO anticheat_ban_metadata (accountId, banId, data) VALUES (?, ?, ?);";
|
||||
|
||||
private static final String UPDATE_VIOLATIONS = "INSERT INTO anticheat_vl_logs (accountId, checkId, "
|
||||
+ "maxViolations, sinceLastBan, totalAlerts) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY"
|
||||
+ " UPDATE maxViolations = VALUES(maxViolations), totalAlerts = VALUES(totalAlerts), sinceLastBan = VALUES(sinceLastBan);";
|
||||
|
||||
private static final String CLEAR_LAST_BAN_VIOLATIONS = "UPDATE anticheat_vl_logs SET sinceLastBan = 0 WHERE accountId = ?;";
|
||||
|
||||
private static final String GET_VLS = "SELECT checkId, maxViolations, sinceLastBan, totalAlerts FROM anticheat_vl_logs";
|
||||
|
||||
private static final String GET_VLS_BY_ACCOUNT_ID = GET_VLS + " WHERE accountId = ?";
|
||||
|
||||
private static final String GET_VLS_FOR_CHECK = GET_VLS + " WHERE checkId = ? AND accountId = ?";
|
||||
|
||||
|
||||
public AnticheatDatabase(JavaPlugin plugin)
|
||||
public AnticheatDatabase()
|
||||
{
|
||||
super(DBPool.getAccount());
|
||||
}
|
||||
|
||||
/**
|
||||
* Submit a set of user violation changes batch style.
|
||||
*
|
||||
* @param uploadQueue the {@link TIntObjectMap} describing the changes.
|
||||
*/
|
||||
public void saveViolationLevels(Map<Integer, ViolationLevels> uploadQueue)
|
||||
{
|
||||
try (Connection connection = getConnection())
|
||||
{
|
||||
PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_VIOLATIONS);
|
||||
|
||||
uploadQueue.forEach((accountId, vls) ->
|
||||
{
|
||||
CheckManager.AVAILABLE_CHECKS.values().forEach(check ->
|
||||
{
|
||||
int checkId = CheckManager.getCheckId(check),
|
||||
maxVls = vls.getMaxViolationsForCheck(check),
|
||||
maxVlsSinceLastBan = vls.getLastBanViolationsForCheck(check),
|
||||
totalAlerts = vls.getTotalAlertsForCheck(check);
|
||||
|
||||
// if neither value has been set don't store anything
|
||||
if (maxVls < 0 && totalAlerts < 0 && maxVlsSinceLastBan < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
maxVls = Math.max(maxVls, 0);
|
||||
maxVlsSinceLastBan = Math.max(maxVlsSinceLastBan, 0);
|
||||
totalAlerts = Math.max(totalAlerts, 0);
|
||||
|
||||
try
|
||||
{
|
||||
preparedStatement.setInt(1, accountId);
|
||||
preparedStatement.setInt(2, checkId);
|
||||
preparedStatement.setInt(3, maxVls);
|
||||
preparedStatement.setInt(4, maxVlsSinceLastBan);
|
||||
preparedStatement.setInt(5, totalAlerts);
|
||||
preparedStatement.addBatch();
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
preparedStatement.executeBatch();
|
||||
}
|
||||
catch (SQLException ex)
|
||||
{
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to retrieve violation levels for the given account id.
|
||||
*
|
||||
* @param accountId The account id;
|
||||
* @return an {@link Optional} describing the user's violation levels, or an empty one if none
|
||||
* are found.
|
||||
* @throws SQLException On failing to connect to the database.
|
||||
*/
|
||||
public Optional<ViolationLevels> getViolationLevels(int accountId)
|
||||
{
|
||||
ViolationLevels levels = new ViolationLevels();
|
||||
|
||||
try (Connection connection = getConnection())
|
||||
{
|
||||
PreparedStatement statement = connection.prepareStatement(GET_VLS_BY_ACCOUNT_ID);
|
||||
statement.setInt(1, accountId);
|
||||
|
||||
ResultSet result = statement.executeQuery();
|
||||
|
||||
while (result.next())
|
||||
{
|
||||
int checkId = result.getInt("checkId");
|
||||
Class<? extends Check> checkType = CheckManager.getCheckById(checkId);
|
||||
if (checkType == null)
|
||||
{
|
||||
System.err.println("Whoops. Unintended refactor?");
|
||||
continue;
|
||||
}
|
||||
levels.updateMaxViolations(checkType, result.getInt("maxViolations"));
|
||||
levels.updateMaxViolationsSinceLastBan(checkType, result.getInt("sinceLastBan"));
|
||||
levels.setTotalAlerts(checkType, result.getInt("totalAlerts"));
|
||||
}
|
||||
}
|
||||
catch (SQLException ex)
|
||||
{
|
||||
ex.printStackTrace();
|
||||
}
|
||||
|
||||
return Optional.of(levels);
|
||||
}
|
||||
|
||||
public void clearLastBan(int accountId, Runnable after)
|
||||
{
|
||||
try (Connection connection = getConnection())
|
||||
{
|
||||
PreparedStatement statement = connection.prepareStatement(CLEAR_LAST_BAN_VIOLATIONS);
|
||||
statement.setInt(1, accountId);
|
||||
|
||||
statement.executeUpdate();
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (after != null)
|
||||
after.run();
|
||||
}
|
||||
}
|
||||
|
||||
public void saveMetadata(int accountId, String id, String base64, Runnable after)
|
||||
{
|
||||
try (Connection connection = getConnection())
|
||||
|
@ -181,16 +41,4 @@ public class AnticheatDatabase extends MinecraftRepository
|
|||
after.run();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initialize()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void update()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,7 +11,6 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.tukaani.xz.LZMA2Options;
|
||||
import org.tukaani.xz.XZ;
|
||||
|
@ -43,12 +42,8 @@ public class AntihackLogger extends MiniPlugin
|
|||
{
|
||||
public static final Gson GSON = new Gson();
|
||||
|
||||
private static final int PUSH_QUEUE_TIME_IN_SECONDS = 60;
|
||||
|
||||
private final CoreClientManager _clientManager = require(CoreClientManager.class);
|
||||
|
||||
private final Map<Integer, ViolationLevels> _violationLevels = new ConcurrentHashMap<>();
|
||||
|
||||
private final Map<String, AnticheatMetadata> _metadata = new HashMap<>();
|
||||
|
||||
private final AnticheatDatabase _db;
|
||||
|
@ -57,9 +52,7 @@ public class AntihackLogger extends MiniPlugin
|
|||
{
|
||||
super("AnticheatPlugin");
|
||||
|
||||
_db = new AnticheatDatabase(getPlugin());
|
||||
|
||||
runSyncTimer(this::pushQueuedViolationChanges, 20, 20 * PUSH_QUEUE_TIME_IN_SECONDS);
|
||||
_db = new AnticheatDatabase();
|
||||
|
||||
registerMetadata(new ServerInfoMetadata());
|
||||
registerMetadata(new ViolationInfoMetadata());
|
||||
|
@ -67,12 +60,6 @@ public class AntihackLogger extends MiniPlugin
|
|||
registerMetadata(new PlayerInfoMetadata());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disable()
|
||||
{
|
||||
pushQueuedViolationChanges();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void addCommands()
|
||||
{
|
||||
|
@ -102,53 +89,9 @@ public class AntihackLogger extends MiniPlugin
|
|||
}
|
||||
}
|
||||
|
||||
private void pushQueuedViolationChanges()
|
||||
{
|
||||
Map<Integer, ViolationLevels> clone = new HashMap<>(_violationLevels);
|
||||
runAsync(() -> _db.saveViolationLevels(clone));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onCheckFail(PlayerViolationEvent event)
|
||||
{
|
||||
ViolationLevels playerVls = _violationLevels.get(_clientManager.getAccountId(event.getPlayer()));
|
||||
Class<? extends Check> check = event.getCheckClass();
|
||||
playerVls.updateMaxViolations(check, event.getViolations());
|
||||
playerVls.updateMaxViolationsSinceLastBan(check, event.getViolations());
|
||||
playerVls.incrementAlerts(check);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onLoad(PlayerLoginEvent event)
|
||||
{
|
||||
runAsync(() ->
|
||||
{
|
||||
int accountId = _clientManager.getAccountId(event.getPlayer());
|
||||
|
||||
_db.getViolationLevels(accountId)
|
||||
.ifPresent(vls ->
|
||||
{
|
||||
_violationLevels.put(accountId, vls);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onQuit(PlayerQuitEvent event)
|
||||
{
|
||||
Player player = event.getPlayer();
|
||||
int accountId =_clientManager.getAccountId(event.getPlayer());
|
||||
|
||||
ViolationLevels levels = _violationLevels.get(accountId);
|
||||
|
||||
if (levels != null)
|
||||
{
|
||||
Map<Integer, ViolationLevels> clone = new HashMap<>();
|
||||
clone.put(accountId, levels);
|
||||
|
||||
runAsync(() -> _db.saveViolationLevels(clone));
|
||||
}
|
||||
|
||||
_metadata.values().forEach(metadata -> metadata.remove(event.getPlayer().getUniqueId()));
|
||||
}
|
||||
|
||||
|
@ -206,9 +149,4 @@ public class AntihackLogger extends MiniPlugin
|
|||
throw new IllegalArgumentException("Attempting to register: " + metadata.getId());
|
||||
}
|
||||
}
|
||||
|
||||
public void resetViolations(Player player, Runnable after)
|
||||
{
|
||||
_db.clearLastBan(_clientManager.getAccountId(player), after);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
package mineplex.core.communities;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
|
||||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.common.util.UtilPlayer;
|
||||
import mineplex.core.game.GameDisplay;
|
||||
|
||||
|
@ -16,8 +15,8 @@ public class Community
|
|||
private final int _id;
|
||||
private String _name;
|
||||
private String _description;
|
||||
private Map<UUID, CommunityMemberInfo> _members = new HashMap<>();
|
||||
private Map<UUID, CommunityJoinRequestInfo> _joinRequests = new HashMap<>();
|
||||
private Map<UUID, CommunityMemberInfo> _members = new ConcurrentHashMap<>();
|
||||
private Map<UUID, CommunityJoinRequestInfo> _joinRequests = new ConcurrentHashMap<>();
|
||||
private ChatColor[] _chatFormat;
|
||||
private long _chatDelay;
|
||||
private GameDisplay _favoriteGame;
|
||||
|
|
|
@ -36,6 +36,10 @@ public class CommunityJoinRequestInfo
|
|||
|
||||
public void update(String name)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Name = name;
|
||||
buildIcon();
|
||||
}
|
||||
|
|
|
@ -2,11 +2,12 @@ package mineplex.core.communities;
|
|||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Random;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.regex.Pattern;
|
||||
|
@ -19,11 +20,10 @@ import org.bukkit.event.player.AsyncPlayerChatEvent;
|
|||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import mineplex.core.Managers;
|
||||
import mineplex.core.MiniDbClientPlugin;
|
||||
import mineplex.core.account.CoreClientManager;
|
||||
import mineplex.core.account.ILoginProcessor;
|
||||
import mineplex.core.common.jsonchat.ClickEvent;
|
||||
import mineplex.core.common.jsonchat.JsonMessage;
|
||||
import mineplex.core.common.util.C;
|
||||
|
@ -74,15 +74,18 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
public final String[] BLOCKED_NAMES = new String[] {"help", "chat", "create", "description", "disband", "invite", "join", "mcs", "rename", "uninvite", "trainee", "mod", "moderator", "srmod", "seniormod", "seniormoderator", "builder", "maplead", "twitch", "youtube", "support", "admin", "administrator", "leader", "dev", "developer", "owner", "party", "mineplex", "mineplexOfficial", "staff", "mineplexstaff", "qualityassurance", "traineemanagement", "modcoordination", "forumninja", "communitymanagement", "event", "socialmedia"};
|
||||
private final CommunityRepository _repo;
|
||||
private final Map<Integer, Community> _loadedCommunities;
|
||||
|
||||
|
||||
public final List<Integer> BrowserIds = new LinkedList<>();
|
||||
private final List<UUID> _creating = new ArrayList<>();
|
||||
|
||||
public final DataRepository<PlayerStatus> StatusRepository;
|
||||
|
||||
private ServerRepository _serverRepo;
|
||||
private boolean _us;
|
||||
|
||||
private boolean _cycling = false;
|
||||
private volatile boolean _cycling = false;
|
||||
|
||||
private volatile boolean _updateJoinRequests = false;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public CommunityManager(JavaPlugin plugin, CoreClientManager clientManager)
|
||||
|
@ -101,6 +104,34 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
|
||||
_loadedCommunities = new ConcurrentHashMap<>();
|
||||
|
||||
clientManager.addStoredProcedureLoginProcessor(new ILoginProcessor()
|
||||
{
|
||||
@Override
|
||||
public String getName()
|
||||
{
|
||||
return "community-invite-loader";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processLoginResultSet(String playerName, UUID uuid, int accountId, ResultSet resultSet) throws SQLException
|
||||
{
|
||||
while (resultSet.next())
|
||||
{
|
||||
String region = resultSet.getString("region");
|
||||
if ((_us && region.equalsIgnoreCase("US")) || (!_us && region.equalsIgnoreCase("EU")))
|
||||
{
|
||||
CommunityManager.this.Get(uuid).Invites.add(resultSet.getInt("communityId"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getQuery(int accountId, String uuid, String name)
|
||||
{
|
||||
return "SELECT ci.communityId, c.region FROM communityInvites AS ci INNER JOIN communities AS c ON c.id=ci.communityId WHERE accountId=" + accountId + ";";
|
||||
}
|
||||
});
|
||||
|
||||
Bukkit.getScheduler().scheduleAsyncRepeatingTask(plugin, () ->
|
||||
{
|
||||
if (_cycling)
|
||||
|
@ -110,8 +141,13 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
|
||||
LinkedList<Community> communities = new LinkedList<>();
|
||||
_loadedCommunities.values().forEach(community -> communities.add(community));
|
||||
_repo.updateMembersAndJoinRequests(communities);
|
||||
}, 0L, 20 * 5);
|
||||
_repo.updateMembers(communities);
|
||||
if (_updateJoinRequests)
|
||||
{
|
||||
_repo.updateJoinRequests(communities);
|
||||
}
|
||||
_updateJoinRequests = !_updateJoinRequests;
|
||||
}, 0L, 20 * 7);
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () ->
|
||||
{
|
||||
|
@ -135,6 +171,13 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
ServerCommandManager.getInstance().registerCommandType(CommunityUpdateName.class, new CommunityUpdateNameHandler(this));
|
||||
ServerCommandManager.getInstance().registerCommandType(CommunityUpdateSetting.class, new CommunityUpdateSettingHandler(this));
|
||||
}
|
||||
|
||||
public boolean ownsCommunity(UUID uuid)
|
||||
{
|
||||
return _loadedCommunities.values().stream()
|
||||
.flatMap(community -> community.getMembers().entrySet().stream())
|
||||
.anyMatch(entry -> entry.getKey().equals(uuid) && entry.getValue().Role == CommunityRole.LEADER);
|
||||
}
|
||||
|
||||
private void cycleBrowser()
|
||||
{
|
||||
|
@ -145,15 +188,10 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
_cycling = true;
|
||||
runAsync(() ->
|
||||
{
|
||||
final List<Integer> resultant = Lists.newArrayList();
|
||||
final List<Integer> ids = new LinkedList<>();
|
||||
_loadedCommunities.values().stream().filter(c -> c.getMembers().size() >= 5 && c.getPrivacySetting() != PrivacySetting.PRIVATE).forEach(c -> resultant.add(c.getId()));
|
||||
_loadedCommunities.values().stream().filter(c -> c.getMembers().size() >= 5 && c.getPrivacySetting() != PrivacySetting.PRIVATE).forEach(c -> ids.add(c.getId()));
|
||||
|
||||
Random random = new Random();
|
||||
while (!resultant.isEmpty())
|
||||
{
|
||||
ids.add(resultant.remove(random.nextInt(resultant.size())));
|
||||
}
|
||||
Collections.shuffle(ids);
|
||||
|
||||
runSync(() ->
|
||||
{
|
||||
|
@ -192,7 +230,7 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
}
|
||||
setting.parseValueInto(newValue, community);
|
||||
//community.message(F.main(getName(), F.name(sender) + " has changed settings in " + F.name(community.getName()) + "!"));
|
||||
UtilServer.CallEvent(new CommunitySettingUpdateEvent(community));
|
||||
runSync(() -> UtilServer.CallEvent(new CommunitySettingUpdateEvent(community)));
|
||||
}
|
||||
|
||||
public void handleCommunityNameUpdate(Integer id, String sender, String name)
|
||||
|
@ -205,7 +243,7 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
String oldName = community.getName();
|
||||
community.setName(name);
|
||||
community.message(F.main(getName(), F.name(sender) + " has changed the name of " + F.name(oldName) + " to " + F.name(community.getName()) + "!"));
|
||||
UtilServer.CallEvent(new CommunityNameUpdateEvent(community));
|
||||
runSync(() -> UtilServer.CallEvent(new CommunityNameUpdateEvent(community)));
|
||||
}
|
||||
|
||||
public void handleCommunityMembershipRoleUpdate(Integer id, String sender, UUID uuid, CommunityRole role)
|
||||
|
@ -216,7 +254,7 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
return;
|
||||
}
|
||||
CommunityMemberInfo member = community.getMembers().get(uuid);
|
||||
member.Role = role;
|
||||
member.updateRole(role);
|
||||
if (Bukkit.getPlayer(uuid) != null)
|
||||
{
|
||||
if (role.ordinal() > CommunityRole.COLEADER.ordinal())
|
||||
|
@ -227,7 +265,7 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
}
|
||||
String name = member.Name;
|
||||
community.message(F.main(getName(), F.name(sender) + " has changed " + F.name(name + "'s") + " role to " + F.elem(role.getDisplay()) + " in " + F.name(community.getName()) + "!"), CommunityRole.COLEADER);
|
||||
UtilServer.CallEvent(new CommunityMembershipUpdateEvent(community));
|
||||
runSync(() -> UtilServer.CallEvent(new CommunityMembershipUpdateEvent(community)));
|
||||
}
|
||||
|
||||
public void handleCommunityMembershipUpdate(Integer id, String sender, String playerName, UUID playerUUID, Integer accountId, boolean kick, boolean leave)
|
||||
|
@ -262,17 +300,20 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
if (Bukkit.getPlayer(playerUUID) != null)
|
||||
{
|
||||
Get(Bukkit.getPlayer(playerUUID)).joinCommunity(community);
|
||||
Get(Bukkit.getPlayer(playerUUID)).Invites.remove(community.getId());
|
||||
runSync(() -> Get(Bukkit.getPlayer(playerUUID)).Invites.remove(community.getId()));
|
||||
}
|
||||
|
||||
community.message(F.main(getName(), F.name(playerName) + " has joined " + F.name(community.getName()) + "!"));
|
||||
}
|
||||
|
||||
UtilServer.CallEvent(new CommunityMembershipUpdateEvent(community));
|
||||
if (Bukkit.getPlayer(playerUUID) != null)
|
||||
|
||||
runSync(() ->
|
||||
{
|
||||
UtilServer.CallEvent(new CommunityMemberDataUpdateEvent(Bukkit.getPlayer(playerUUID)));
|
||||
}
|
||||
UtilServer.CallEvent(new CommunityMembershipUpdateEvent(community));
|
||||
if (Bukkit.getPlayer(playerUUID) != null)
|
||||
{
|
||||
UtilServer.CallEvent(new CommunityMemberDataUpdateEvent(Bukkit.getPlayer(playerUUID)));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void handleCommunityInvite(Integer id, String sender, String targetName, UUID targetUUID)
|
||||
|
@ -282,19 +323,22 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
{
|
||||
return;
|
||||
}
|
||||
if (Bukkit.getPlayer(targetUUID) != null)
|
||||
runSync(() ->
|
||||
{
|
||||
if (!Get(Bukkit.getPlayer(targetUUID)).Invites.contains(community.getId()))
|
||||
if (Bukkit.getPlayer(targetUUID) != null)
|
||||
{
|
||||
Get(Bukkit.getPlayer(targetUUID)).Invites.add(community.getId());
|
||||
if (Managers.get(PreferencesManager.class).get(Bukkit.getPlayer(targetUUID)).isActive(Preference.COMMUNITY_INVITES))
|
||||
if (!Get(Bukkit.getPlayer(targetUUID)).Invites.contains(community.getId()))
|
||||
{
|
||||
new JsonMessage(F.main(getName(), "You have been invited to join " + F.elem(community.getName()) + " by " + F.name(sender) + "! Click to join!")).click(ClickEvent.RUN_COMMAND, "/community join " + community.getName()).sendToPlayer(Bukkit.getPlayer(targetUUID));
|
||||
Get(Bukkit.getPlayer(targetUUID)).Invites.add(community.getId());
|
||||
if (Managers.get(PreferencesManager.class).get(Bukkit.getPlayer(targetUUID)).isActive(Preference.COMMUNITY_INVITES))
|
||||
{
|
||||
new JsonMessage(F.main(getName(), "You have been invited to join " + F.elem(community.getName()) + " by " + F.name(sender) + "! Click to join!")).click(ClickEvent.RUN_COMMAND, "/community join " + community.getName()).sendToPlayer(Bukkit.getPlayer(targetUUID));
|
||||
}
|
||||
|
||||
UtilServer.CallEvent(new CommunityMemberDataUpdateEvent(Bukkit.getPlayer(targetUUID)));
|
||||
}
|
||||
|
||||
UtilServer.CallEvent(new CommunityMemberDataUpdateEvent(Bukkit.getPlayer(targetUUID)));
|
||||
}
|
||||
}
|
||||
});
|
||||
community.message(F.main(getName(), F.name(sender) + " has invited " + F.name(targetName) + " to " + F.name(community.getName()) + "!"), CommunityRole.COLEADER);
|
||||
}
|
||||
|
||||
|
@ -305,15 +349,18 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
{
|
||||
return;
|
||||
}
|
||||
if (Bukkit.getPlayer(targetUUID) != null)
|
||||
runSync(() ->
|
||||
{
|
||||
Get(Bukkit.getPlayer(targetUUID)).Invites.remove(community.getId());
|
||||
if (Managers.get(PreferencesManager.class).get(Bukkit.getPlayer(targetUUID)).isActive(Preference.COMMUNITY_INVITES) && announce)
|
||||
if (Bukkit.getPlayer(targetUUID) != null)
|
||||
{
|
||||
UtilPlayer.message(Bukkit.getPlayer(targetUUID), F.main(getName(), "Your invitation to join " + F.elem(community.getName()) + " has been revoked by " + F.name(sender) + "!"));
|
||||
Get(Bukkit.getPlayer(targetUUID)).Invites.remove(community.getId());
|
||||
if (Managers.get(PreferencesManager.class).get(Bukkit.getPlayer(targetUUID)).isActive(Preference.COMMUNITY_INVITES) && announce)
|
||||
{
|
||||
UtilPlayer.message(Bukkit.getPlayer(targetUUID), F.main(getName(), "Your invitation to join " + F.elem(community.getName()) + " has been revoked by " + F.name(sender) + "!"));
|
||||
}
|
||||
UtilServer.CallEvent(new CommunityMemberDataUpdateEvent(Bukkit.getPlayer(targetUUID)));
|
||||
}
|
||||
UtilServer.CallEvent(new CommunityMemberDataUpdateEvent(Bukkit.getPlayer(targetUUID)));
|
||||
}
|
||||
});
|
||||
if (announce)
|
||||
{
|
||||
community.message(F.main(getName(), F.name(targetName) + "'s invitation to join " + F.name(community.getName()) + " has been revoked by " + F.name(sender) + "!"), CommunityRole.COLEADER);
|
||||
|
@ -334,7 +381,7 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
community.getJoinRequests().put(playerUUID, new CommunityJoinRequestInfo(playerName, playerUUID, accountId));
|
||||
community.message(F.main(getName(), F.name(playerName) + " has requested to join " + F.name(community.getName()) + "!"), CommunityRole.COLEADER);
|
||||
|
||||
UtilServer.CallEvent(new CommunityJoinRequestsUpdateEvent(community));
|
||||
runSync(() -> UtilServer.CallEvent(new CommunityJoinRequestsUpdateEvent(community)));
|
||||
}
|
||||
|
||||
public void handleCommunityCloseJoinRequest(Integer id, String sender, String playerName, UUID playerUUID, Integer accountId, boolean announce)
|
||||
|
@ -354,14 +401,15 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
community.message(F.main(getName(), F.name(playerName) + "'s request to join " + F.name(community.getName()) + " has been denied by " + F.name(sender) + "!"), CommunityRole.COLEADER);
|
||||
}
|
||||
|
||||
UtilServer.CallEvent(new CommunityJoinRequestsUpdateEvent(community));
|
||||
runSync(() -> UtilServer.CallEvent(new CommunityJoinRequestsUpdateEvent(community)));
|
||||
}
|
||||
|
||||
public void handleCommunityCreation(Integer id, UUID leaderUUID)
|
||||
public void handleCommunityCreation(Integer id, String name, Integer leaderId, UUID leaderUUID, String leaderName)
|
||||
{
|
||||
runAsync(() ->
|
||||
{
|
||||
_repo.loadCommunity(id, _loadedCommunities);
|
||||
_loadedCommunities.put(id, new Community(id, name));
|
||||
_loadedCommunities.get(id).getMembers().put(leaderUUID, new CommunityMemberInfo(leaderName, leaderUUID, leaderId, CommunityRole.LEADER, System.currentTimeMillis()));
|
||||
runSync(() ->
|
||||
{
|
||||
Community community = _loadedCommunities.get(id);
|
||||
|
@ -384,7 +432,10 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
}
|
||||
community.message(F.main(getName(), F.name(senderName) + " has disbanded community " + F.name(community.getName()) + "!"));
|
||||
UtilServer.CallEvent(new CommunityDisbandEvent(community));
|
||||
UtilServer.GetPlayers().stream().filter(player -> Get(player).Invites.contains(community.getId())).forEach(player -> Get(player).Invites.remove(community.getId()));
|
||||
runSync(() ->
|
||||
{
|
||||
UtilServer.GetPlayers().stream().filter(player -> Get(player).Invites.contains(community.getId())).forEach(player -> Get(player).Invites.remove(community.getId()));
|
||||
});
|
||||
community.getMembers().keySet().stream().filter(uuid -> Bukkit.getPlayer(uuid) != null).forEach(uuid -> Get(Bukkit.getPlayer(uuid)).leaveCommunity(community));
|
||||
_loadedCommunities.remove(community.getId());
|
||||
runSync(() ->
|
||||
|
@ -455,7 +506,7 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
}
|
||||
else
|
||||
{
|
||||
UtilPlayer.message(sender, F.main(getName(), "Either " + F.name(target) + " does not exist or you have already invited them to " + F.name(community.getName()) + "!"));
|
||||
UtilPlayer.message(sender, F.main(getName(), F.name(target) + " does not exist!"));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -586,19 +637,34 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
new CommunityUpdateMemberRole(community.getId(), sender.getName(), info.UUID.toString(), role.toString()).publish();
|
||||
}
|
||||
|
||||
public void handleCreate(Player sender, int accountId, String name)
|
||||
public void handleCreate(Player sender, String senderName, int accountId, String name)
|
||||
{
|
||||
if (_creating.contains(sender.getUniqueId()))
|
||||
{
|
||||
UtilPlayer.message(sender, F.main(getName(), "You are already creating a Community!"));
|
||||
return;
|
||||
}
|
||||
_creating.add(sender.getUniqueId());
|
||||
runAsync(() ->
|
||||
{
|
||||
_repo.createCommunity(name, accountId, id ->
|
||||
{
|
||||
if (id == -1)
|
||||
{
|
||||
sender.sendMessage(F.main(getName(), "Failed to create community " + F.elem(name)));
|
||||
UtilPlayer.message(sender, F.main(getName(), "Failed to create community " + F.elem(name)));
|
||||
runSync(() -> _creating.remove(sender.getUniqueId()));
|
||||
}
|
||||
else
|
||||
{
|
||||
new CommunityCreate(sender.getUniqueId().toString(), id).publish();
|
||||
if (ownsCommunity(sender.getUniqueId()))
|
||||
{
|
||||
UtilPlayer.message(sender, F.main(getName(), "You already own a community!"));
|
||||
_repo.deleteCommunity(id);
|
||||
runSync(() -> _creating.remove(sender.getUniqueId()));
|
||||
return;
|
||||
}
|
||||
new CommunityCreate(sender.getUniqueId().toString(), senderName, accountId, id, name).publish();
|
||||
runSync(() -> _creating.remove(sender.getUniqueId()));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -651,19 +717,11 @@ public class CommunityManager extends MiniDbClientPlugin<CommunityMemberData>
|
|||
@EventHandler
|
||||
public void loadInvites(PlayerJoinEvent event)
|
||||
{
|
||||
final int accountId = Managers.get(CoreClientManager.class).getAccountId(event.getPlayer());
|
||||
final CommunityMemberData data = Get(event.getPlayer());
|
||||
runAsync(() ->
|
||||
if (data.Invites.size() > 0 && Managers.get(PreferencesManager.class).get(event.getPlayer()).isActive(Preference.COMMUNITY_INVITES))
|
||||
{
|
||||
_repo.loadInvites(accountId, data.Invites);
|
||||
runSync(() ->
|
||||
{
|
||||
if (data.Invites.size() > 0 && Managers.get(PreferencesManager.class).get(event.getPlayer()).isActive(Preference.COMMUNITY_INVITES))
|
||||
{
|
||||
UtilPlayer.message(event.getPlayer(), F.main(getName(), "You have been invited to join " + F.elem(data.Invites.size()) + " communities!"));
|
||||
}
|
||||
});
|
||||
});
|
||||
UtilPlayer.message(event.getPlayer(), F.main(getName(), "You have been invited to join " + F.elem(data.Invites.size()) + " communities!"));
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
package mineplex.core.communities;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import mineplex.core.Managers;
|
||||
|
||||
public class CommunityMemberData
|
||||
{
|
||||
private final Map<Integer, CommunityRole> _communities = new HashMap<>();
|
||||
private final Map<Integer, CommunityRole> _communities = new ConcurrentHashMap<>();
|
||||
|
||||
public final List<Integer> Invites = new ArrayList<>();
|
||||
|
||||
|
|
|
@ -15,20 +15,19 @@ public class CommunityMemberInfo
|
|||
public final UUID UUID;
|
||||
public final int AccountId;
|
||||
public CommunityRole Role;
|
||||
public boolean OwnsCommunity = false;
|
||||
public boolean ReadingChat = true;
|
||||
private ItemStack _memberIcon, _outsiderIcon;
|
||||
private long _sinceLastLogin;
|
||||
private long _lastLogin;
|
||||
private boolean _online = false;
|
||||
private String _currentServer = "";
|
||||
|
||||
public CommunityMemberInfo(String name, UUID uuid, int accountId, CommunityRole role, long timeSinceLastLogin)
|
||||
public CommunityMemberInfo(String name, UUID uuid, int accountId, CommunityRole role, long lastLogin)
|
||||
{
|
||||
Name = name;
|
||||
UUID = uuid;
|
||||
AccountId = accountId;
|
||||
Role = role;
|
||||
_sinceLastLogin = timeSinceLastLogin;
|
||||
_lastLogin = lastLogin;
|
||||
|
||||
buildIcons();
|
||||
}
|
||||
|
@ -44,7 +43,7 @@ public class CommunityMemberInfo
|
|||
}
|
||||
else
|
||||
{
|
||||
builder.addLore(C.cYellow + "Last Seen " + C.cWhite + UtilTime.MakeStr(_sinceLastLogin) + " Ago");
|
||||
builder.addLore(C.cYellow + "Last Seen " + C.cWhite + UtilTime.MakeStr(System.currentTimeMillis() - _lastLogin) + " Ago");
|
||||
}
|
||||
if (_online)
|
||||
{
|
||||
|
@ -54,11 +53,32 @@ public class CommunityMemberInfo
|
|||
_memberIcon = builder.build();
|
||||
}
|
||||
|
||||
public void update(String name, CommunityRole role, long timeSinceLastLogin, boolean online, String currentServer)
|
||||
public void setOffline()
|
||||
{
|
||||
_online = false;
|
||||
_currentServer = "";
|
||||
buildIcons();
|
||||
}
|
||||
|
||||
public void updateName(String name)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Name = name;
|
||||
buildIcons();
|
||||
}
|
||||
|
||||
public void updateRole(CommunityRole role)
|
||||
{
|
||||
Role = role;
|
||||
_sinceLastLogin = timeSinceLastLogin;
|
||||
buildIcons();
|
||||
}
|
||||
|
||||
public void update(long lastLogin, boolean online, String currentServer)
|
||||
{
|
||||
_lastLogin = lastLogin;
|
||||
_online = online;
|
||||
_currentServer = currentServer;
|
||||
|
||||
|
|
|
@ -20,12 +20,6 @@ public class CommunityChatCommand extends CommandBase<CommunityManager>
|
|||
@Override
|
||||
public void Execute(Player caller, String[] args)
|
||||
{
|
||||
if (true)
|
||||
{
|
||||
caller.sendMessage(F.main("Communities", "Coming soon!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.length < 1)
|
||||
{
|
||||
UtilPlayer.message(caller, F.help("/com chat <community>", "Selects which community you chat to", Rank.ALL, ChatColor.AQUA));
|
||||
|
|
|
@ -33,12 +33,6 @@ public class CommunityCommand extends MultiCommandBase<CommunityManager>
|
|||
@Override
|
||||
protected void Help(Player caller, String[] args)
|
||||
{
|
||||
if (true)
|
||||
{
|
||||
caller.sendMessage(F.main("Communities", "Coming soon!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.length > 0)
|
||||
{
|
||||
if (args[0].equalsIgnoreCase("help"))
|
||||
|
|
|
@ -25,12 +25,6 @@ public class CommunityCreateCommand extends CommandBase<CommunityManager>
|
|||
@Override
|
||||
public void Execute(Player caller, String[] args)
|
||||
{
|
||||
if (true)
|
||||
{
|
||||
caller.sendMessage(F.main("Communities", "Coming soon!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.length < 1)
|
||||
{
|
||||
UtilPlayer.message(caller, F.help("/com create <name>", "Creates a new community", Rank.ETERNAL, ChatColor.AQUA));
|
||||
|
@ -57,16 +51,17 @@ public class CommunityCreateCommand extends CommandBase<CommunityManager>
|
|||
UtilPlayer.message(caller, F.main(Plugin.getName(), "That name is not allowed!"));
|
||||
return;
|
||||
}
|
||||
final int accountId = Managers.get(CoreClientManager.class).getAccountId(caller);
|
||||
final String senderName = Managers.get(CoreClientManager.class).Get(caller).getName();
|
||||
Plugin.runAsync(() ->
|
||||
{
|
||||
int accountId = Managers.get(CoreClientManager.class).getAccountId(caller);
|
||||
if (Managers.get(Chat.class).getFilteredMessage(caller, args[0]).contains("*"))
|
||||
{
|
||||
UtilPlayer.message(caller, F.main(Plugin.getName(), "That name is not allowed!"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Plugin.handleCreate(caller, accountId, args[0]);
|
||||
Plugin.runSync(() -> Plugin.handleCreate(caller, senderName, accountId, args[0]));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -26,12 +26,6 @@ public class CommunityDescriptionCommand extends CommandBase<CommunityManager>
|
|||
@Override
|
||||
public void Execute(Player caller, String[] args)
|
||||
{
|
||||
if (true)
|
||||
{
|
||||
caller.sendMessage(F.main("Communities", "Coming soon!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.length < 2)
|
||||
{
|
||||
UtilPlayer.message(caller, F.help("/com description <community> <description>", "Sets the description of a community you manage", Rank.ALL, ChatColor.AQUA));
|
||||
|
|
|
@ -24,12 +24,6 @@ public class CommunityDisbandCommand extends CommandBase<CommunityManager>
|
|||
@Override
|
||||
public void Execute(Player caller, String[] args)
|
||||
{
|
||||
if (true)
|
||||
{
|
||||
caller.sendMessage(F.main("Communities", "Coming soon!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.length < 1)
|
||||
{
|
||||
UtilPlayer.message(caller, F.help("/com disband <community>", "Disbands a community you own", Rank.ETERNAL, ChatColor.AQUA));
|
||||
|
|
|
@ -24,12 +24,6 @@ public class CommunityInviteCommand extends CommandBase<CommunityManager>
|
|||
@Override
|
||||
public void Execute(Player caller, String[] args)
|
||||
{
|
||||
if (true)
|
||||
{
|
||||
caller.sendMessage(F.main("Communities", "Coming soon!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.length < 2)
|
||||
{
|
||||
UtilPlayer.message(caller, F.help("/com invite <player> <community>", "Invites a player to a community you manage", Rank.ALL, ChatColor.AQUA));
|
||||
|
|
|
@ -21,12 +21,6 @@ public class CommunityJoinCommand extends CommandBase<CommunityManager>
|
|||
@Override
|
||||
public void Execute(Player caller, String[] args)
|
||||
{
|
||||
if (true)
|
||||
{
|
||||
caller.sendMessage(F.main("Communities", "Coming soon!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.length < 1)
|
||||
{
|
||||
UtilPlayer.message(caller, F.help("/com join <community>", "Joins a community that is open or you have been invited to", Rank.ALL, ChatColor.AQUA));
|
||||
|
|
|
@ -25,12 +25,6 @@ public class CommunityMCSCommand extends CommandBase<CommunityManager>
|
|||
@Override
|
||||
public void Execute(Player caller, String[] args)
|
||||
{
|
||||
if (true)
|
||||
{
|
||||
caller.sendMessage(F.main("Communities", "Coming soon!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.length < 1)
|
||||
{
|
||||
UtilPlayer.message(caller, F.help("/com mcs <community>", "Opens the Mineplex Community Server of a community you manage", Rank.ALL, ChatColor.AQUA));
|
||||
|
|
|
@ -27,12 +27,6 @@ public class CommunityRenameCommand extends CommandBase<CommunityManager>
|
|||
@Override
|
||||
public void Execute(Player caller, String[] args)
|
||||
{
|
||||
if (true)
|
||||
{
|
||||
caller.sendMessage(F.main("Communities", "Coming soon!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.length < 2)
|
||||
{
|
||||
UtilPlayer.message(caller, F.help("/com rename <community> <name>", "Changes the name of a community you own", Rank.ETERNAL, ChatColor.AQUA));
|
||||
|
|
|
@ -24,12 +24,6 @@ public class CommunityUnInviteCommand extends CommandBase<CommunityManager>
|
|||
@Override
|
||||
public void Execute(Player caller, String[] args)
|
||||
{
|
||||
if (true)
|
||||
{
|
||||
caller.sendMessage(F.main("Communities", "Coming soon!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.length < 2)
|
||||
{
|
||||
UtilPlayer.message(caller, F.help("/com uninvite <player> <community>", "Revokes a player's invitation to a community you manage", Rank.ALL, ChatColor.AQUA));
|
||||
|
|
|
@ -54,7 +54,7 @@ public class CommunityMemberButton extends CommunitiesGUIButton
|
|||
}
|
||||
if (_info.Role == CommunityRole.COLEADER && type == ClickType.SHIFT_LEFT)
|
||||
{
|
||||
if (_info.OwnsCommunity)
|
||||
if (getCommunityManager().ownsCommunity(_info.UUID))
|
||||
{
|
||||
UtilPlayer.message(_viewer, F.main(getCommunityManager().getName(), F.name(_info.Name) + " can only own one community at a time!"));
|
||||
return;
|
||||
|
|
|
@ -10,11 +10,13 @@ import org.bukkit.event.EventHandler;
|
|||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.communities.Community;
|
||||
import mineplex.core.communities.CommunityDisbandEvent;
|
||||
import mineplex.core.communities.CommunityJoinRequestsUpdateEvent;
|
||||
import mineplex.core.communities.CommunityMemberDataUpdateEvent;
|
||||
import mineplex.core.communities.CommunityMemberInfo;
|
||||
import mineplex.core.communities.CommunityMembershipUpdateEvent;
|
||||
import mineplex.core.communities.CommunityRole;
|
||||
import mineplex.core.communities.gui.ActionButton;
|
||||
import mineplex.core.communities.gui.CommunitiesGUIButton;
|
||||
import mineplex.core.communities.gui.CommunitiesGUIPage;
|
||||
import mineplex.core.communities.gui.overview.CommunityOverviewPage;
|
||||
import mineplex.core.itemstack.ItemBuilder;
|
||||
|
@ -108,7 +110,18 @@ public class CommunityMembersPage extends CommunitiesGUIPage
|
|||
{
|
||||
if (info1.isOnline() == info2.isOnline())
|
||||
{
|
||||
return info1.Name.compareToIgnoreCase(info2.Name);
|
||||
if (info1.Role == info2.Role)
|
||||
{
|
||||
return info1.Name.compareToIgnoreCase(info2.Name);
|
||||
}
|
||||
else if (info1.Role.ordinal() < info2.Role.ordinal())
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (info1.isOnline())
|
||||
|
@ -142,6 +155,19 @@ public class CommunityMembersPage extends CommunitiesGUIPage
|
|||
Viewer.updateInventory();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onRequestsUpdate(CommunityJoinRequestsUpdateEvent event)
|
||||
{
|
||||
if (event.getCommunity().getId().intValue() != _community.getId().intValue())
|
||||
{
|
||||
return;
|
||||
}
|
||||
CommunitiesGUIButton button = Buttons.get(4);
|
||||
button.update();
|
||||
Inv.setItem(4, button.Button);
|
||||
Viewer.updateInventory();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onMembershipUpdate(CommunityMembershipUpdateEvent event)
|
||||
{
|
||||
|
|
|
@ -7,12 +7,14 @@ import org.bukkit.event.EventHandler;
|
|||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.communities.Community;
|
||||
import mineplex.core.communities.CommunityDisbandEvent;
|
||||
import mineplex.core.communities.CommunityJoinRequestsUpdateEvent;
|
||||
import mineplex.core.communities.CommunityMemberDataUpdateEvent;
|
||||
import mineplex.core.communities.CommunityMembershipUpdateEvent;
|
||||
import mineplex.core.communities.CommunityRole;
|
||||
import mineplex.core.communities.CommunitySetting;
|
||||
import mineplex.core.communities.CommunitySettingUpdateEvent;
|
||||
import mineplex.core.communities.gui.ActionButton;
|
||||
import mineplex.core.communities.gui.CommunitiesGUIButton;
|
||||
import mineplex.core.communities.gui.CommunitiesGUIPage;
|
||||
import mineplex.core.communities.gui.overview.CommunityOverviewPage;
|
||||
import mineplex.core.itemstack.ItemBuilder;
|
||||
|
@ -104,6 +106,19 @@ public class CommunitySettingsPage extends CommunitiesGUIPage
|
|||
Viewer.updateInventory();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onRequestsUpdate(CommunityJoinRequestsUpdateEvent event)
|
||||
{
|
||||
if (event.getCommunity().getId().intValue() != _community.getId().intValue())
|
||||
{
|
||||
return;
|
||||
}
|
||||
CommunitiesGUIButton button = Buttons.get(4);
|
||||
button.update();
|
||||
Inv.setItem(4, button.Button);
|
||||
Viewer.updateInventory();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onMembershipUpdate(CommunityMembershipUpdateEvent event)
|
||||
{
|
||||
|
@ -121,7 +136,7 @@ public class CommunitySettingsPage extends CommunitiesGUIPage
|
|||
@EventHandler
|
||||
public void onSettingsUpdate(CommunitySettingUpdateEvent event)
|
||||
{
|
||||
if (event.getCommunity().getId() != _community.getId())
|
||||
if (event.getCommunity().getId().intValue() != _community.getId().intValue())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -5,12 +5,18 @@ import mineplex.serverdata.commands.ServerCommand;
|
|||
public class CommunityCreate extends ServerCommand
|
||||
{
|
||||
private String _leaderUUID;
|
||||
private String _leaderName;
|
||||
private Integer _leaderId;
|
||||
private Integer _communityId;
|
||||
private String _communityName;
|
||||
|
||||
public CommunityCreate(String leaderUUID, Integer communityId)
|
||||
public CommunityCreate(String leaderUUID, String leaderName, Integer leaderId, Integer communityId, String communityName)
|
||||
{
|
||||
_leaderUUID = leaderUUID;
|
||||
_leaderName = leaderName;
|
||||
_leaderId = leaderId;
|
||||
_communityId = communityId;
|
||||
_communityName = communityName;
|
||||
}
|
||||
|
||||
public String getLeaderUUID()
|
||||
|
@ -18,8 +24,23 @@ public class CommunityCreate extends ServerCommand
|
|||
return _leaderUUID;
|
||||
}
|
||||
|
||||
public String getLeaderName()
|
||||
{
|
||||
return _leaderName;
|
||||
}
|
||||
|
||||
public Integer getLeaderId()
|
||||
{
|
||||
return _leaderId;
|
||||
}
|
||||
|
||||
public Integer getCommunityId()
|
||||
{
|
||||
return _communityId;
|
||||
}
|
||||
|
||||
public String getCommunityName()
|
||||
{
|
||||
return _communityName;
|
||||
}
|
||||
}
|
|
@ -23,8 +23,11 @@ public class CommunityCreateHandler implements CommandCallback
|
|||
CommunityCreate update = ((CommunityCreate) command);
|
||||
UUID leaderUUID = UUID.fromString(update.getLeaderUUID());
|
||||
Integer communityId = update.getCommunityId();
|
||||
String communityName = update.getCommunityName();
|
||||
Integer leaderId = update.getLeaderId();
|
||||
String leaderName = update.getLeaderName();
|
||||
|
||||
_manager.handleCommunityCreation(communityId, leaderUUID);
|
||||
_manager.handleCommunityCreation(communityId, communityName, leaderId, leaderUUID, leaderName);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package mineplex.core.communities.redis;
|
||||
|
||||
import mineplex.core.communities.CommunityManager;
|
||||
import mineplex.serverdata.commands.CommandCallback;
|
||||
import mineplex.serverdata.commands.PlayerJoinCommand;
|
||||
import mineplex.serverdata.commands.ServerCommand;
|
||||
|
||||
public class PlayerJoinHandler implements CommandCallback
|
||||
{
|
||||
private CommunityManager _communityManager;
|
||||
|
||||
public PlayerJoinHandler(CommunityManager communityManager)
|
||||
{
|
||||
_communityManager = communityManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(ServerCommand command)
|
||||
{
|
||||
if (command instanceof PlayerJoinCommand)
|
||||
{
|
||||
PlayerJoinCommand joinCommand = (PlayerJoinCommand)command;
|
||||
//_communityManager.updateAllMemberData(UUID.fromString(joinCommand.getUuid()), joinCommand.getName());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,17 +1,18 @@
|
|||
package mineplex.core.communities.storage;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import mineplex.core.common.timing.TimingManager;
|
||||
import mineplex.core.common.util.Callback;
|
||||
import mineplex.core.communities.Community;
|
||||
import mineplex.core.communities.CommunityJoinRequestInfo;
|
||||
|
@ -31,9 +32,9 @@ public class CommunityRepository extends MinecraftRepository
|
|||
private static final String GET_ALL_COMMUNITIES = "SELECT * FROM communities WHERE region=?;";
|
||||
private static final String GET_COMMUNITY_BY_ID = "SELECT * FROM communities WHERE id=?;";
|
||||
private static final String GET_COMMUNITY_BY_NAME = "SELECT * FROM communities WHERE name=? AND region=?;";
|
||||
private static final String GET_COMMUNITY_MEMBERS = "SELECT cm.accountId, cm.communityRole, ac.name, ac.uuid, ac.lastLogin, now(), cm.readingChat, (SELECT COUNT(id) FROM communityMembers WHERE accountId=cm.accountId AND communityRole='LEADER') FROM communityMembers cm INNER JOIN accounts ac ON ac.id=cm.accountId WHERE communityId=?;";
|
||||
private static final String GET_COMMUNITY_JOIN_REQUESTS = "SELECT cjr.accountId, ac.name, ac.uuid FROM communityJoinRequests cjr INNER JOIN accounts ac ON ac.id=cjr.accountId WHERE communityId=?;";
|
||||
private static final String GET_COMMUNITY_SETTINGS = "SELECT settingId, settingValue FROM communitySettings WHERE communityId=?;";
|
||||
private static final String GET_COMMUNITY_MEMBERS = "SELECT cm.communityId, cm.accountId, cm.communityRole, ac.name, ac.uuid, ac.lastLogin, cm.readingChat FROM communityMembers cm INNER JOIN accounts ac ON ac.id=cm.accountId;";
|
||||
private static final String GET_COMMUNITY_JOIN_REQUESTS = "SELECT cjr.communityId, cjr.accountId, ac.name, ac.uuid FROM communityJoinRequests cjr INNER JOIN accounts ac ON ac.id=cjr.accountId;";
|
||||
private static final String GET_COMMUNITY_SETTINGS = "SELECT communityId, settingId, settingValue FROM communitySettings;";
|
||||
|
||||
private static final String REMOVE_FROM_COMMUNITY = "DELETE FROM communityMembers WHERE accountId=? AND communityId=?;";
|
||||
private static final String UPDATE_COMMUNITY_ROLE = "UPDATE communityMembers SET communityRole=? WHERE accountId=? AND communityId=?;";
|
||||
|
@ -59,79 +60,7 @@ public class CommunityRepository extends MinecraftRepository
|
|||
_repo = statusRepo;
|
||||
_us = us;
|
||||
}
|
||||
|
||||
public void loadCommunity(int communityId, final Map<Integer, Community> communityMap)
|
||||
{
|
||||
try (Connection connection = getConnection())
|
||||
{
|
||||
executeQuery(connection, GET_COMMUNITY_BY_ID, resultSet ->
|
||||
{
|
||||
if (resultSet.next())
|
||||
{
|
||||
final int id = resultSet.getInt("id");
|
||||
final String cName = resultSet.getString("name");
|
||||
final Community community = new Community(id, cName);
|
||||
executeQuery(connection, GET_COMMUNITY_MEMBERS, memberSet ->
|
||||
{
|
||||
while (memberSet.next())
|
||||
{
|
||||
final int accountId = memberSet.getInt("accountId");
|
||||
final String name = memberSet.getString("name");
|
||||
final UUID uuid = UUID.fromString(memberSet.getString("uuid"));
|
||||
final CommunityRole role = CommunityRole.parseRole(memberSet.getString("communityRole"));
|
||||
final long timeSinceOnline = memberSet.getTimestamp(6).getTime() - memberSet.getTimestamp(5).getTime();
|
||||
boolean readingChat = memberSet.getBoolean("readingChat");
|
||||
final int owns = memberSet.getInt(8);
|
||||
|
||||
CommunityMemberInfo info = new CommunityMemberInfo(name, uuid, accountId, role, timeSinceOnline);
|
||||
PlayerStatus status = _repo.getElement(name);
|
||||
if (status != null)
|
||||
{
|
||||
info.update(name, role, timeSinceOnline, true, status.getServer());
|
||||
}
|
||||
info.ReadingChat = readingChat;
|
||||
info.OwnsCommunity = owns > 0;
|
||||
community.getMembers().put(info.UUID, info);
|
||||
}
|
||||
}, new ColumnInt("communityId", community.getId()));
|
||||
|
||||
executeQuery(connection, GET_COMMUNITY_JOIN_REQUESTS, requestSet ->
|
||||
{
|
||||
while (requestSet.next())
|
||||
{
|
||||
final int accountId = requestSet.getInt("accountId");
|
||||
final UUID uuid = UUID.fromString(requestSet.getString("uuid"));
|
||||
final String name = requestSet.getString("name");
|
||||
|
||||
community.getJoinRequests().put(uuid, new CommunityJoinRequestInfo(name, uuid, accountId));
|
||||
}
|
||||
}, new ColumnInt("communityId", community.getId()));
|
||||
|
||||
executeQuery(connection, GET_COMMUNITY_SETTINGS, settingSet ->
|
||||
{
|
||||
while (settingSet.next())
|
||||
{
|
||||
final int settingId = settingSet.getInt("settingId");
|
||||
final String value = settingSet.getString("settingValue");
|
||||
|
||||
CommunitySetting setting = CommunitySetting.getSetting(settingId);
|
||||
if (setting != null)
|
||||
{
|
||||
setting.parseValueInto(value, community);
|
||||
}
|
||||
}
|
||||
}, new ColumnInt("communityId", community.getId()));
|
||||
|
||||
communityMap.put(community.getId(), community);
|
||||
}
|
||||
}, new ColumnInt("id", communityId));
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void loadCommunities(final Map<Integer, Community> communityMap)
|
||||
{
|
||||
try (Connection connection = getConnection())
|
||||
|
@ -144,56 +73,6 @@ public class CommunityRepository extends MinecraftRepository
|
|||
final int id = resultSet.getInt("id");
|
||||
final String cName = resultSet.getString("name");
|
||||
final Community community = new Community(id, cName);
|
||||
executeQuery(connection, GET_COMMUNITY_MEMBERS, memberSet ->
|
||||
{
|
||||
while (memberSet.next())
|
||||
{
|
||||
final int accountId = memberSet.getInt("accountId");
|
||||
final String name = memberSet.getString("name");
|
||||
final UUID uuid = UUID.fromString(memberSet.getString("uuid"));
|
||||
final CommunityRole role = CommunityRole.parseRole(memberSet.getString("communityRole"));
|
||||
final long timeSinceOnline = memberSet.getTimestamp(6).getTime() - memberSet.getTimestamp(5).getTime();
|
||||
boolean readingChat = memberSet.getBoolean("readingChat");
|
||||
final int owns = memberSet.getInt(8);
|
||||
|
||||
CommunityMemberInfo info = new CommunityMemberInfo(name, uuid, accountId, role, timeSinceOnline);
|
||||
PlayerStatus status = _repo.getElement(name);
|
||||
if (status != null)
|
||||
{
|
||||
info.update(name, role, timeSinceOnline, true, status.getServer());
|
||||
}
|
||||
info.ReadingChat = readingChat;
|
||||
info.OwnsCommunity = owns > 0;
|
||||
community.getMembers().put(info.UUID, info);
|
||||
}
|
||||
}, new ColumnInt("communityId", community.getId()));
|
||||
|
||||
executeQuery(connection, GET_COMMUNITY_JOIN_REQUESTS, requestSet ->
|
||||
{
|
||||
while (requestSet.next())
|
||||
{
|
||||
final int accountId = requestSet.getInt("accountId");
|
||||
final UUID uuid = UUID.fromString(requestSet.getString("uuid"));
|
||||
final String name = requestSet.getString("name");
|
||||
|
||||
community.getJoinRequests().put(uuid, new CommunityJoinRequestInfo(name, uuid, accountId));
|
||||
}
|
||||
}, new ColumnInt("communityId", community.getId()));
|
||||
|
||||
executeQuery(connection, GET_COMMUNITY_SETTINGS, settingSet ->
|
||||
{
|
||||
while (settingSet.next())
|
||||
{
|
||||
final int settingId = settingSet.getInt("settingId");
|
||||
final String value = settingSet.getString("settingValue");
|
||||
|
||||
CommunitySetting setting = CommunitySetting.getSetting(settingId);
|
||||
if (setting != null)
|
||||
{
|
||||
setting.parseValueInto(value, community);
|
||||
}
|
||||
}
|
||||
}, new ColumnInt("communityId", community.getId()));
|
||||
|
||||
resultant.put(community.getId(), community);
|
||||
}
|
||||
|
@ -201,6 +80,63 @@ public class CommunityRepository extends MinecraftRepository
|
|||
communityMap.clear();
|
||||
communityMap.putAll(resultant);
|
||||
}, new ColumnVarChar("region", 5, _us ? "US" : "EU"));
|
||||
|
||||
executeQuery(connection, GET_COMMUNITY_MEMBERS, memberSet ->
|
||||
{
|
||||
while (memberSet.next())
|
||||
{
|
||||
final int communityId = memberSet.getInt("communityId");
|
||||
final int accountId = memberSet.getInt("accountId");
|
||||
final String name = memberSet.getString("name");
|
||||
final UUID uuid = UUID.fromString(memberSet.getString("uuid"));
|
||||
final CommunityRole role = CommunityRole.parseRole(memberSet.getString("communityRole"));
|
||||
final long lastLogin = memberSet.getTimestamp("lastLogin").getTime();
|
||||
boolean readingChat = memberSet.getBoolean("readingChat");
|
||||
|
||||
CommunityMemberInfo info = new CommunityMemberInfo(name, uuid, accountId, role, lastLogin);
|
||||
info.ReadingChat = readingChat;
|
||||
|
||||
Community community = communityMap.get(communityId);
|
||||
if (community != null)
|
||||
{
|
||||
community.getMembers().put(info.UUID, info);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
executeQuery(connection, GET_COMMUNITY_JOIN_REQUESTS, requestSet ->
|
||||
{
|
||||
while (requestSet.next())
|
||||
{
|
||||
final int communityId = requestSet.getInt("communityId");
|
||||
final int accountId = requestSet.getInt("accountId");
|
||||
final UUID uuid = UUID.fromString(requestSet.getString("uuid"));
|
||||
final String name = requestSet.getString("name");
|
||||
|
||||
Community community = communityMap.get(communityId);
|
||||
if (community != null)
|
||||
{
|
||||
community.getJoinRequests().put(uuid, new CommunityJoinRequestInfo(name, uuid, accountId));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
executeQuery(connection, GET_COMMUNITY_SETTINGS, settingSet ->
|
||||
{
|
||||
while (settingSet.next())
|
||||
{
|
||||
final int communityId = settingSet.getInt("communityId");
|
||||
final int settingId = settingSet.getInt("settingId");
|
||||
final String value = settingSet.getString("settingValue");
|
||||
|
||||
Community community = communityMap.get(communityId);
|
||||
CommunitySetting setting = CommunitySetting.getSetting(settingId);
|
||||
if (community != null && setting != null)
|
||||
{
|
||||
setting.parseValueInto(value, community);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
|
@ -208,124 +144,72 @@ public class CommunityRepository extends MinecraftRepository
|
|||
}
|
||||
}
|
||||
|
||||
public void updateMembersAndJoinRequests(LinkedList<Community> communities)
|
||||
public void updateMembers(LinkedList<Community> communities)
|
||||
{
|
||||
if (communities.isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
String query = "";
|
||||
TimingManager.start("member elements");
|
||||
for (Community c : communities)
|
||||
{
|
||||
query = query + GET_COMMUNITY_MEMBERS.replace("?", c.getId().toString()) + GET_COMMUNITY_JOIN_REQUESTS.replace("?", c.getId().toString());
|
||||
List<CommunityMemberInfo> members = new ArrayList<>(c.getMembers().values());
|
||||
List<PlayerStatus> statuses = _repo.getElementsSequential(members.stream().map(info -> info.UUID.toString()).collect(Collectors.toList()));
|
||||
for (int i = 0; i < members.size(); i++)
|
||||
{
|
||||
CommunityMemberInfo info = members.get(i);
|
||||
PlayerStatus status = statuses.get(i);
|
||||
|
||||
boolean online = false;
|
||||
String server = "";
|
||||
if (status != null)
|
||||
{
|
||||
online = true;
|
||||
server = status.getServer();
|
||||
info.update(System.currentTimeMillis(), online, server);
|
||||
if (!info.Name.equals(status.getName()))
|
||||
{
|
||||
info.updateName(status.getName());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (info.isOnline())
|
||||
{
|
||||
info.setOffline();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (query.isEmpty())
|
||||
TimingManager.stop("member elements");
|
||||
}
|
||||
|
||||
public void updateJoinRequests(LinkedList<Community> communities)
|
||||
{
|
||||
if (communities.isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
try (Connection connection = getConnection(); Statement statement = connection.createStatement())
|
||||
TimingManager.start("request elements");
|
||||
for (Community c : communities)
|
||||
{
|
||||
statement.executeQuery(query);
|
||||
|
||||
for (Community c : communities)
|
||||
List<CommunityJoinRequestInfo> requests = new ArrayList<>(c.getJoinRequests().values());
|
||||
List<PlayerStatus> statuses = _repo.getElementsSequential(requests.stream().map(info -> info.UUID.toString()).collect(Collectors.toList()));
|
||||
for (int i = 0; i < requests.size(); i++)
|
||||
{
|
||||
ResultSet memberSet = statement.getResultSet();
|
||||
while (memberSet.next())
|
||||
CommunityJoinRequestInfo info = requests.get(i);
|
||||
PlayerStatus status = statuses.get(i);
|
||||
|
||||
if (status != null)
|
||||
{
|
||||
final UUID uuid = UUID.fromString(memberSet.getString("uuid"));
|
||||
final String name = memberSet.getString("name");
|
||||
final CommunityRole role = CommunityRole.parseRole(memberSet.getString("communityRole"));
|
||||
final long timeSinceOnline = memberSet.getTimestamp(6).getTime() - memberSet.getTimestamp(5).getTime();
|
||||
//boolean readingChat = memberSet.getBoolean("readingChat");
|
||||
final int owns = memberSet.getInt(8);
|
||||
|
||||
if (c.getMembers().containsKey(uuid))
|
||||
if (!info.Name.equals(status.getName()))
|
||||
{
|
||||
PlayerStatus status = _repo.getElement(name);
|
||||
boolean online = false;
|
||||
String server = "";
|
||||
if (status != null)
|
||||
{
|
||||
online = true;
|
||||
server = status.getServer();
|
||||
}
|
||||
//c.getMembers().get(uuid).ReadingChat = readingChat;
|
||||
c.getMembers().get(uuid).OwnsCommunity = owns > 0;
|
||||
c.getMembers().get(uuid).update(name, role, timeSinceOnline, online, server);
|
||||
info.update(status.getName());
|
||||
}
|
||||
}
|
||||
|
||||
statement.getMoreResults();
|
||||
|
||||
ResultSet requestSet = statement.getResultSet();
|
||||
while (requestSet.next())
|
||||
{
|
||||
final UUID uuid = UUID.fromString(requestSet.getString("uuid"));
|
||||
final String name = requestSet.getString("name");
|
||||
|
||||
if (c.getJoinRequests().containsKey(uuid))
|
||||
{
|
||||
c.getJoinRequests().get(uuid).update(name);
|
||||
}
|
||||
}
|
||||
|
||||
statement.getMoreResults();
|
||||
}
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void updateMembers(Map<UUID, CommunityMemberInfo> members, int communityId)
|
||||
{
|
||||
executeQuery(GET_COMMUNITY_MEMBERS, memberSet ->
|
||||
{
|
||||
while (memberSet.next())
|
||||
{
|
||||
final UUID uuid = UUID.fromString(memberSet.getString("uuid"));
|
||||
final String name = memberSet.getString("name");
|
||||
final CommunityRole role = CommunityRole.parseRole(memberSet.getString("communityRole"));
|
||||
final long timeSinceOnline = memberSet.getTimestamp(5).getTime() - memberSet.getTimestamp(4).getTime();
|
||||
//boolean readingChat = memberSet.getBoolean("readingChat");
|
||||
final int owns = memberSet.getInt(8);
|
||||
|
||||
if (members.containsKey(uuid))
|
||||
{
|
||||
PlayerStatus status = _repo.getElement(name);
|
||||
boolean online = false;
|
||||
String server = "";
|
||||
if (status != null)
|
||||
{
|
||||
online = true;
|
||||
server = status.getServer();
|
||||
}
|
||||
//members.get(uuid).ReadingChat = readingChat;
|
||||
members.get(uuid).OwnsCommunity = owns > 0;
|
||||
members.get(uuid).update(name, role, timeSinceOnline, online, server);
|
||||
}
|
||||
}
|
||||
}, new ColumnInt("communityId", communityId));
|
||||
}
|
||||
|
||||
public void updateJoinRequests(Map<UUID, CommunityJoinRequestInfo> requests, int communityId)
|
||||
{
|
||||
executeQuery(GET_COMMUNITY_JOIN_REQUESTS, requestSet ->
|
||||
{
|
||||
while (requestSet.next())
|
||||
{
|
||||
final UUID uuid = UUID.fromString(requestSet.getString("uuid"));
|
||||
final String name = requestSet.getString("name");
|
||||
|
||||
if (requests.containsKey(uuid))
|
||||
{
|
||||
requests.get(uuid).update(name);
|
||||
}
|
||||
}
|
||||
}, new ColumnInt("communityId", communityId));
|
||||
TimingManager.stop("request elements");
|
||||
}
|
||||
|
||||
public void loadInvites(int accountId, List<Integer> invites)
|
||||
|
@ -397,18 +281,19 @@ public class CommunityRepository extends MinecraftRepository
|
|||
if (resultSet.next())
|
||||
{
|
||||
int id = resultSet.getInt(1);
|
||||
executeUpdate(connection, ADD_TO_COMMUNITY, new ColumnInt("accountId", leaderAccount), new ColumnInt("communityId", id), new ColumnVarChar("communityRole", 20, CommunityRole.LEADER.toString()));
|
||||
executeUpdate(connection, ADD_TO_COMMUNITY, null, new ColumnInt("accountId", leaderAccount), new ColumnInt("communityId", id), new ColumnVarChar("communityRole", 20, CommunityRole.LEADER.toString()));
|
||||
idCallback.run(id);
|
||||
}
|
||||
else
|
||||
{
|
||||
idCallback.run(-1);
|
||||
}
|
||||
}, new ColumnVarChar("name", 15, name), new ColumnVarChar("region", 5, _us ? "US" : "EU"));
|
||||
}, () -> idCallback.run(-1), new ColumnVarChar("name", 15, name), new ColumnVarChar("region", 5, _us ? "US" : "EU"));
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
idCallback.run(-1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -416,11 +301,11 @@ public class CommunityRepository extends MinecraftRepository
|
|||
{
|
||||
try (Connection connection = getConnection())
|
||||
{
|
||||
executeUpdate(connection, "DELETE FROM communities WHERE id=?;", new ColumnInt("id", communityId));
|
||||
executeUpdate(connection, "DELETE FROM communitySettings WHERE communityId=?;", new ColumnInt("communityId", communityId));
|
||||
executeUpdate(connection, "DELETE FROM communityMembers WHERE communityId=?;", new ColumnInt("communityId", communityId));
|
||||
executeUpdate(connection, "DELETE FROM communityInvites WHERE communityId=?;", new ColumnInt("communityId", communityId));
|
||||
executeUpdate(connection, "DELETE FROM communityJoinRequests WHERE communityId=?", new ColumnInt("communityId", communityId));
|
||||
executeUpdate(connection, "DELETE FROM communities WHERE id=?;", null, new ColumnInt("id", communityId));
|
||||
executeUpdate(connection, "DELETE FROM communitySettings WHERE communityId=?;", null, new ColumnInt("communityId", communityId));
|
||||
executeUpdate(connection, "DELETE FROM communityMembers WHERE communityId=?;", null, new ColumnInt("communityId", communityId));
|
||||
executeUpdate(connection, "DELETE FROM communityInvites WHERE communityId=?;", null, new ColumnInt("communityId", communityId));
|
||||
executeUpdate(connection, "DELETE FROM communityJoinRequests WHERE communityId=?", null, new ColumnInt("communityId", communityId));
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
|
|
|
@ -392,8 +392,8 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
|
|||
CoreClient client = getClientManager().Get(caller);
|
||||
client.undisguise();
|
||||
|
||||
require(FriendManager.class).updatePlayerStatus(disguisedProfile.getName(), null);
|
||||
require(FriendManager.class).updatePlayerStatus(originalProfile.getName(), new PlayerStatus(originalProfile.getName(), _serverName));
|
||||
require(FriendManager.class).updatePlayerStatus(disguisedProfile.getId(), null);
|
||||
require(FriendManager.class).updatePlayerStatus(originalProfile.getId(), new PlayerStatus(originalProfile.getId(), originalProfile.getName(), _serverName));
|
||||
getPreferencesManager().handlePlayerJoin(caller, true);
|
||||
|
||||
require(ScoreboardManager.class).handlePlayerJoin(disguise.getOriginalProfile().getName());
|
||||
|
@ -539,8 +539,8 @@ public class PlayerDisguiseManager extends MiniPlugin implements IPacketHandler
|
|||
callerProfile.getProperties().removeAll(ORIGINAL_UUID_KEY);
|
||||
callerProfile.getProperties().put(ORIGINAL_UUID_KEY, new Property(ORIGINAL_UUID_KEY, caller.getUniqueId().toString()));
|
||||
|
||||
require(FriendManager.class).updatePlayerStatus(disguisePlayer.getOriginalProfile().getName(), null);
|
||||
require(FriendManager.class).updatePlayerStatus(requestedUsername, new PlayerStatus(requestedUsername, _serverName));
|
||||
require(FriendManager.class).updatePlayerStatus(disguisePlayer.getOriginalProfile().getId(), null);
|
||||
require(FriendManager.class).updatePlayerStatus(disguisePlayer.getProfile().getId(), new PlayerStatus(disguisePlayer.getProfile().getId(), requestedUsername, _serverName));
|
||||
|
||||
getPreferencesManager().handlePlayerJoin(caller, true);
|
||||
|
||||
|
|
|
@ -1,5 +1,19 @@
|
|||
package mineplex.core.friend;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import mineplex.core.MiniDbClientPlugin;
|
||||
import mineplex.core.account.CoreClientManager;
|
||||
import mineplex.core.common.Rank;
|
||||
|
@ -22,19 +36,6 @@ import mineplex.core.preferences.PreferencesManager;
|
|||
import mineplex.core.updater.UpdateType;
|
||||
import mineplex.core.updater.event.UpdateEvent;
|
||||
import mineplex.serverdata.data.PlayerStatus;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public class FriendManager extends MiniDbClientPlugin<FriendData>
|
||||
{
|
||||
|
@ -402,14 +403,14 @@ public class FriendManager extends MiniDbClientPlugin<FriendData>
|
|||
}
|
||||
|
||||
|
||||
public void updatePlayerStatus(String playerName, PlayerStatus status)
|
||||
public void updatePlayerStatus(UUID playerUUID, PlayerStatus status)
|
||||
{
|
||||
_repository.updatePlayerStatus(playerName, status);
|
||||
_repository.updatePlayerStatus(playerUUID, status);
|
||||
}
|
||||
|
||||
public PlayerStatus getStatus(String playerName)
|
||||
public PlayerStatus getStatus(UUID playerUUID)
|
||||
{
|
||||
return _repository.getStatus(playerName);
|
||||
return _repository.getStatus(playerUUID);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -421,7 +422,7 @@ public class FriendManager extends MiniDbClientPlugin<FriendData>
|
|||
@Override
|
||||
public String getQuery(int accountId, String uuid, String name)
|
||||
{
|
||||
return "SELECT tA.Name, status, tA.lastLogin, now() FROM accountFriend INNER Join accounts AS fA ON fA.uuid = uuidSource INNER JOIN accounts AS tA ON tA.uuid = uuidTarget WHERE uuidSource = '"
|
||||
return "SELECT tA.Name, status, tA.lastLogin, now(), uuidTarget FROM accountFriend INNER Join accounts AS fA ON fA.uuid = uuidSource INNER JOIN accounts AS tA ON tA.uuid = uuidTarget WHERE uuidSource = '"
|
||||
+ uuid + "';";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import java.util.HashMap;
|
|||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
import mineplex.core.database.MinecraftRepository;
|
||||
import org.bukkit.entity.Player;
|
||||
|
@ -26,7 +27,7 @@ import mineplex.serverdata.servers.ServerManager;
|
|||
public class FriendRepository extends MinecraftRepository
|
||||
{
|
||||
private static String CREATE_FRIEND_TABLE = "CREATE TABLE IF NOT EXISTS accountFriend (id INT NOT NULL AUTO_INCREMENT, uuidSource VARCHAR(100), uuidTarget VARCHAR(100), status VARCHAR(100), PRIMARY KEY (id), UNIQUE INDEX uuidIndex (uuidSource, uuidTarget));";
|
||||
private static String RETRIEVE_MULTIPLE_FRIEND_RECORDS = "SELECT uuidSource, tA.Name, status, tA.lastLogin, now() FROM accountFriend INNER Join accounts AS fA ON fA.uuid = uuidSource INNER JOIN accounts AS tA ON tA.uuid = uuidTarget WHERE uuidSource IN ";
|
||||
private static String RETRIEVE_MULTIPLE_FRIEND_RECORDS = "SELECT uuidSource, tA.Name, status, tA.lastLogin, now(), uuidTarget FROM accountFriend INNER Join accounts AS fA ON fA.uuid = uuidSource INNER JOIN accounts AS tA ON tA.uuid = uuidTarget WHERE uuidSource IN ";
|
||||
private static String ADD_FRIEND_RECORD = "INSERT INTO accountFriend (uuidSource, uuidTarget, status, created) SELECT fA.uuid AS uuidSource, tA.uuid AS uuidTarget, ?, now() FROM accounts as fA LEFT JOIN accounts AS tA ON tA.name = ? WHERE fA.name = ?;";
|
||||
private static String UPDATE_MUTUAL_RECORD = "UPDATE accountFriend AS aF INNER JOIN accounts as fA ON aF.uuidSource = fA.uuid INNER JOIN accounts AS tA ON aF.uuidTarget = tA.uuid SET aF.status = ? WHERE tA.name = ? AND fA.name = ?;";
|
||||
private static String DELETE_FRIEND_RECORD = "DELETE aF FROM accountFriend AS aF INNER JOIN accounts as fA ON aF.uuidSource = fA.uuid INNER JOIN accounts AS tA ON aF.uuidTarget = tA.uuid WHERE fA.name = ? AND tA.name = ?;";
|
||||
|
@ -95,6 +96,7 @@ public class FriendRepository extends MinecraftRepository
|
|||
friend.Name = resultSet.getString(2);
|
||||
friend.Status = Enum.valueOf(FriendStatusType.class, resultSet.getString(3));
|
||||
friend.LastSeenOnline = resultSet.getTimestamp(5).getTime() - resultSet.getTimestamp(4).getTime();
|
||||
friend.UUID = UUID.fromString(resultSet.getString(6));
|
||||
|
||||
if (!friends.containsKey(uuidSource))
|
||||
friends.put(uuidSource, new FriendData());
|
||||
|
@ -126,6 +128,7 @@ public class FriendRepository extends MinecraftRepository
|
|||
friend.Name = resultSet.getString(1);
|
||||
friend.Status = Enum.valueOf(FriendStatusType.class, resultSet.getString(2));
|
||||
friend.LastSeenOnline = resultSet.getTimestamp(4).getTime() - resultSet.getTimestamp(3).getTime();
|
||||
friend.UUID = UUID.fromString(resultSet.getString(5));
|
||||
friend.ServerName = null;
|
||||
friend.Online = (friend.ServerName != null);
|
||||
friendData.getFriends().add(friend);
|
||||
|
@ -144,26 +147,26 @@ public class FriendRepository extends MinecraftRepository
|
|||
public void loadFriendStatuses(FriendData friendData)
|
||||
{
|
||||
// Generate a set of all friend names
|
||||
Set<String> friendNames = new HashSet<String>();
|
||||
Set<String> friendUUIDS = new HashSet<>();
|
||||
for(FriendStatus status : friendData.getFriends())
|
||||
{
|
||||
friendNames.add(status.Name.toLowerCase());
|
||||
friendUUIDS.add(status.UUID.toString());
|
||||
}
|
||||
|
||||
// Load PlayerStatus' for friends
|
||||
Collection<PlayerStatus> statuses = _repository.getElements(friendNames);
|
||||
Collection<PlayerStatus> statuses = _repository.getElements(friendUUIDS);
|
||||
|
||||
// Load player statuses into a mapping
|
||||
Map<String, PlayerStatus> playerStatuses = new HashMap<String, PlayerStatus>();
|
||||
Map<UUID, PlayerStatus> playerStatuses = new HashMap<>();
|
||||
for(PlayerStatus status : statuses)
|
||||
{
|
||||
playerStatuses.put(status.getName(), status);
|
||||
playerStatuses.put(status.getUUID(), status);
|
||||
}
|
||||
|
||||
// Load status information into friend data.
|
||||
for (FriendStatus friend : friendData.getFriends())
|
||||
{
|
||||
PlayerStatus status = playerStatuses.get(friend.Name);
|
||||
PlayerStatus status = playerStatuses.get(friend.UUID);
|
||||
friend.Online = (status != null);
|
||||
friend.ServerName = (friend.Online) ? status.getServer() : null;
|
||||
}
|
||||
|
@ -174,14 +177,14 @@ public class FriendRepository extends MinecraftRepository
|
|||
* @return the name that the player matching {@code playerName}
|
||||
* is currently online on, if they are online, null otherwise.
|
||||
*/
|
||||
public String fetchPlayerServer(String playerName)
|
||||
public String fetchPlayerServer(UUID playerUUID)
|
||||
{
|
||||
PlayerStatus status = _repository.getElement(playerName.toLowerCase());
|
||||
PlayerStatus status = _repository.getElement(playerUUID.toString());
|
||||
|
||||
return (status == null) ? null : status.getServer();
|
||||
}
|
||||
|
||||
public void updatePlayerStatus(String playerName, PlayerStatus status)
|
||||
public void updatePlayerStatus(UUID playerUUID, PlayerStatus status)
|
||||
{
|
||||
if (status != null)
|
||||
{
|
||||
|
@ -189,12 +192,12 @@ public class FriendRepository extends MinecraftRepository
|
|||
}
|
||||
else
|
||||
{
|
||||
_repository.removeElement(playerName.toLowerCase());
|
||||
_repository.removeElement(playerUUID.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public PlayerStatus getStatus(String playerName)
|
||||
public PlayerStatus getStatus(UUID playerUUID)
|
||||
{
|
||||
return _repository.getElement(playerName.toLowerCase());
|
||||
return _repository.getElement(playerUUID.toString());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,10 +1,13 @@
|
|||
package mineplex.core.friend.data;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import mineplex.core.friend.FriendStatusType;
|
||||
|
||||
public class FriendStatus
|
||||
{
|
||||
public String Name;
|
||||
public UUID UUID;
|
||||
public String ServerName;
|
||||
public boolean Online;
|
||||
/**
|
||||
|
|
|
@ -44,7 +44,7 @@ public class EternalTaunt extends TauntGadget
|
|||
|
||||
public EternalTaunt(GadgetManager manager)
|
||||
{
|
||||
super(manager, "Eternal Taunt", UtilText.splitLinesToArray(new String[]{C.cGray + "Although the Eternal has been around forever, he waited to long for a worthy opponent and he turned to bones.",
|
||||
super(manager, "Eternal Taunt", UtilText.splitLinesToArray(new String[]{C.cGray + "Although the Eternal has been around forever, he waited too long for a worthy opponent and he turned to bones.",
|
||||
"",
|
||||
C.cWhite + "Use /taunt in game to show how long you've been waiting.",
|
||||
C.cRed + "Cannot be used while in PvP!"}, LineFormat.LORE),
|
||||
|
|
|
@ -409,7 +409,7 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
|
|||
_bannerManager.loadBanners(this);
|
||||
|
||||
new PersonalServerManager(plugin, _clientManager).setUseInterfaceItem(false);
|
||||
// new CommunityManager(plugin, _clientManager);
|
||||
new CommunityManager(plugin, _clientManager);
|
||||
|
||||
Bukkit.getMessenger().registerOutgoingPluginChannel(plugin, "Replay|Restrict");
|
||||
|
||||
|
|
|
@ -275,7 +275,7 @@ public class HubManager extends MiniClientPlugin<HubClient> implements IChatMess
|
|||
|
||||
new SalesAnnouncementManager(plugin);
|
||||
|
||||
// new CommunityManager(plugin, _clientManager);
|
||||
new CommunityManager(plugin, _clientManager);
|
||||
|
||||
ScoreboardManager scoreboardManager = new ScoreboardManager(plugin)
|
||||
{
|
||||
|
|
|
@ -5,10 +5,12 @@ import java.util.UUID;
|
|||
public class PlayerJoinCommand extends ServerCommand
|
||||
{
|
||||
private String _uuid;
|
||||
private String _name;
|
||||
|
||||
public PlayerJoinCommand(UUID uuid)
|
||||
public PlayerJoinCommand(UUID uuid, String name)
|
||||
{
|
||||
_uuid = uuid.toString();
|
||||
_name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -21,4 +23,9 @@ public class PlayerJoinCommand extends ServerCommand
|
|||
{
|
||||
return _uuid;
|
||||
}
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
package mineplex.serverdata.data;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* DataRepository is used to store {@link Data} objects in a central database
|
||||
|
@ -18,6 +19,8 @@ public interface DataRepository<T extends Data>
|
|||
|
||||
public Collection<T> getElements(Collection<String> dataIds);
|
||||
|
||||
public List<T> getElementsSequential(List<String> dataIds);
|
||||
|
||||
public void addElement(T element, int timeout);
|
||||
|
||||
public void addElement(T element);
|
||||
|
|
|
@ -1,14 +1,18 @@
|
|||
package mineplex.serverdata.data;
|
||||
|
||||
import mineplex.serverdata.data.Data;
|
||||
import java.util.UUID;
|
||||
|
||||
public class PlayerStatus implements Data
|
||||
{
|
||||
// The name of this server.
|
||||
// The uuid of this player.
|
||||
private UUID _uuid;
|
||||
public UUID getUUID() { return _uuid; }
|
||||
|
||||
// The name of this player.
|
||||
private String _name;
|
||||
public String getName() { return _name; }
|
||||
|
||||
// The current message of the day (MOTD) of the server.
|
||||
// The current server occupied by this player.
|
||||
private String _server;
|
||||
public String getServer() { return _server; }
|
||||
|
||||
|
@ -17,19 +21,18 @@ public class PlayerStatus implements Data
|
|||
* @param name
|
||||
* @param server
|
||||
*/
|
||||
public PlayerStatus(String name, String server)
|
||||
public PlayerStatus(UUID uuid, String name, String server)
|
||||
{
|
||||
_uuid = uuid;
|
||||
_name = name;
|
||||
_server = server;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unique identifying String ID associated with this {@link PlayerStatus}.
|
||||
*
|
||||
* Use the lowercase name so we can have case-insensitive lookup
|
||||
*/
|
||||
public String getDataId()
|
||||
{
|
||||
return _name.toLowerCase();
|
||||
return _uuid.toString();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -76,9 +76,14 @@ public abstract class RepositoryBase
|
|||
}
|
||||
}
|
||||
|
||||
protected int executeUpdate(Connection connection, String query, Column<?>...columns)
|
||||
protected int executeUpdate(Connection connection, String query, Runnable onSQLError, Column<?>...columns)
|
||||
{
|
||||
return executeInsert(connection, query, null, columns);
|
||||
return executeInsert(connection, query, null, onSQLError, columns);
|
||||
}
|
||||
|
||||
protected int executeUpdate(String query, Runnable onSQLError, Column<?>...columns)
|
||||
{
|
||||
return executeInsert(query, null, columns);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -92,7 +97,7 @@ public abstract class RepositoryBase
|
|||
return executeInsert(query, null, columns);
|
||||
}
|
||||
|
||||
protected int executeInsert(Connection connection, String query, ResultSetCallable callable, Column<?>...columns)
|
||||
protected int executeInsert(Connection connection, String query, ResultSetCallable callable, Runnable onSQLError, Column<?>...columns)
|
||||
{
|
||||
int affectedRows = 0;
|
||||
|
||||
|
@ -114,6 +119,33 @@ public abstract class RepositoryBase
|
|||
}
|
||||
}
|
||||
catch (SQLException exception)
|
||||
{
|
||||
exception.printStackTrace();
|
||||
if (onSQLError != null)
|
||||
{
|
||||
onSQLError.run();
|
||||
}
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
exception.printStackTrace();
|
||||
}
|
||||
|
||||
return affectedRows;
|
||||
}
|
||||
|
||||
protected int executeInsert(String query, ResultSetCallable callable, Runnable onSQLError, Column<?>...columns)
|
||||
{
|
||||
int affectedRows = 0;
|
||||
|
||||
// Automatic resource management for handling/closing objects.
|
||||
try (
|
||||
Connection connection = getConnection();
|
||||
)
|
||||
{
|
||||
affectedRows = executeInsert(connection, query, callable, onSQLError, columns);
|
||||
}
|
||||
catch (SQLException exception)
|
||||
{
|
||||
exception.printStackTrace();
|
||||
}
|
||||
|
@ -134,7 +166,7 @@ public abstract class RepositoryBase
|
|||
Connection connection = getConnection();
|
||||
)
|
||||
{
|
||||
affectedRows = executeInsert(connection, query, callable, columns);
|
||||
affectedRows = executeInsert(connection, query, callable, null, columns);
|
||||
}
|
||||
catch (SQLException exception)
|
||||
{
|
||||
|
@ -148,7 +180,7 @@ public abstract class RepositoryBase
|
|||
return affectedRows;
|
||||
}
|
||||
|
||||
protected void executeQuery(PreparedStatement statement, ResultSetCallable callable, Column<?>...columns)
|
||||
protected void executeQuery(PreparedStatement statement, ResultSetCallable callable, Runnable onSQLError, Column<?>...columns)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -166,6 +198,34 @@ public abstract class RepositoryBase
|
|||
}
|
||||
}
|
||||
catch (SQLException exception)
|
||||
{
|
||||
exception.printStackTrace();
|
||||
if (onSQLError != null)
|
||||
{
|
||||
onSQLError.run();
|
||||
}
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
exception.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
protected void executeQuery(PreparedStatement statement, ResultSetCallable callable, Column<?>...columns)
|
||||
{
|
||||
executeQuery(statement, callable, null, columns);
|
||||
}
|
||||
|
||||
protected void executeQuery(Connection connection, String query, ResultSetCallable callable, Runnable onSQLError, Column<?>...columns)
|
||||
{
|
||||
// Automatic resource management for handling/closing objects.
|
||||
try (
|
||||
PreparedStatement preparedStatement = connection.prepareStatement(query)
|
||||
)
|
||||
{
|
||||
executeQuery(preparedStatement, callable, onSQLError, columns);
|
||||
}
|
||||
catch (SQLException exception)
|
||||
{
|
||||
exception.printStackTrace();
|
||||
}
|
||||
|
@ -194,6 +254,25 @@ public abstract class RepositoryBase
|
|||
}
|
||||
}
|
||||
|
||||
protected void executeQuery(String query, ResultSetCallable callable, Runnable onSQLError, Column<?>...columns)
|
||||
{
|
||||
// Automatic resource management for handling/closing objects.
|
||||
try (
|
||||
Connection connection = getConnection();
|
||||
)
|
||||
{
|
||||
executeQuery(connection, query, callable, onSQLError, columns);
|
||||
}
|
||||
catch (SQLException exception)
|
||||
{
|
||||
exception.printStackTrace();
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
exception.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
protected void executeQuery(String query, ResultSetCallable callable, Column<?>...columns)
|
||||
{
|
||||
// Automatic resource management for handling/closing objects.
|
||||
|
|
|
@ -102,7 +102,37 @@ public class RedisDataRepository<T extends Data> extends RedisRepository impleme
|
|||
|
||||
return elements;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<T> getElementsSequential(List<String> dataIds)
|
||||
{
|
||||
List<T> elements = new ArrayList<>();
|
||||
|
||||
try(Jedis jedis = getResource(false))
|
||||
{
|
||||
Pipeline pipeline = jedis.pipelined();
|
||||
|
||||
List<Response<String>> responses = new ArrayList<>();
|
||||
for (String dataId : dataIds)
|
||||
{
|
||||
responses.add(pipeline.get(generateKey(dataId)));
|
||||
}
|
||||
|
||||
// Block until all requests have received pipelined responses
|
||||
pipeline.sync();
|
||||
|
||||
for (Response<String> response : responses)
|
||||
{
|
||||
String serializedData = response.get();
|
||||
T element = deserialize(serializedData);
|
||||
|
||||
elements.add(element);
|
||||
}
|
||||
}
|
||||
|
||||
return elements;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T getElement(String dataId)
|
||||
{
|
||||
|
|
|
@ -407,7 +407,7 @@ public class ArcadeManager extends MiniPlugin implements IRelation
|
|||
addCommand(new TauntCommand(this));
|
||||
|
||||
new PersonalServerManager(plugin, _clientManager).setUseInterfaceItem(false);
|
||||
// new CommunityManager(plugin, _clientManager);
|
||||
new CommunityManager(plugin, _clientManager);
|
||||
|
||||
_scoreboardManager = new ScoreboardManager(_plugin)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue