Added a feature to unban clients across the network

But there still a bug when you type a username of a none registered member.
Will fix ASAP - likely after Mineware
This commit is contained in:
Morten 2015-12-21 12:58:19 +01:00
parent 453c3a65b6
commit 1726aa2530
3 changed files with 168 additions and 7 deletions

View File

@ -15,6 +15,7 @@ import mineplex.core.account.CoreClientManager;
import mineplex.core.common.util.NautHashMap;
import mineplex.core.common.util.UtilServer;
import mineplex.core.stats.command.GiveStatCommand;
import mineplex.core.stats.command.MasterBuilderUnban;
import mineplex.core.stats.command.TimeCommand;
import mineplex.core.stats.event.StatChangeEvent;
@ -26,6 +27,8 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
private NautHashMap<String, Integer> _stats = new NautHashMap<String, Integer>();
private NautHashMap<Player, NautHashMap<String, Long>> _statUploadQueue = new NautHashMap<Player, NautHashMap<String, Long>>();
private NautHashMap<Player, NautHashMap<String, Long>> _statUploadQueueOverRidable = new NautHashMap<Player, NautHashMap<String, Long>>();
private Runnable _saveRunnable;
public StatsManager(JavaPlugin plugin, CoreClientManager clientManager)
@ -41,6 +44,7 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
public void run()
{
saveStats();
overRidableSaveStats();
}
};
@ -81,6 +85,11 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
}
public void incrementStat(final Player player, final String statName, final long value)
{
incrementStat(player, statName, value, false);
}
public void incrementStat(final Player player, final String statName, final long value, boolean overRide)
{
if (value <= 0)
return;
@ -96,11 +105,80 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
@Override
public void run()
{
addToQueue(statName, player, value);
if(overRide)
{
addToOverRidableQueue(statName, player, value);
}
else
{
addToQueue(statName, player, value);
}
}
});
}
private void addToOverRidableQueue(String statName, Player player, long value)
{
synchronized (_statSync)
{
if (!_statUploadQueueOverRidable.containsKey(player))
_statUploadQueueOverRidable.put(player, new NautHashMap<String, Long>());
if (!_statUploadQueueOverRidable.get(player).containsKey(statName))
_statUploadQueueOverRidable.get(player).put(statName, 0L);
_statUploadQueueOverRidable.get(player).put(statName, _statUploadQueueOverRidable.get(player).get(statName) + value);
}
}
protected void overRidableSaveStats()
{
if (_statUploadQueueOverRidable.isEmpty())
return;
try
{
NautHashMap<Integer, NautHashMap<Integer, Long>> uploadQueue = new NautHashMap<Integer, NautHashMap<Integer, Long>>();
synchronized (_statSync)
{
for (Iterator<Player> statIterator = _statUploadQueueOverRidable.keySet().iterator(); statIterator.hasNext();)
{
Player player = statIterator.next();
if (player.isOnline())
continue;
try
{
int uploadKey = PlayerCache.getInstance().getPlayer(player.getUniqueId()).getAccountId();
uploadQueue.put(uploadKey, new NautHashMap<Integer, Long>());
for (String statName : _statUploadQueueOverRidable.get(player).keySet())
{
int statId = _stats.get(statName);
uploadQueue.get(uploadKey).put(statId, _statUploadQueueOverRidable.get(player).get(statName));
System.out.println(player.getName() + " saving stat : " + statName + " overriding " + _statUploadQueueOverRidable.get(player).get(statName));
}
statIterator.remove();
}
catch (Exception e)
{
//System.out.println("[StatsManager] AccountId was not set for " + player.getName());
}
}
}
_repository.saveStats(uploadQueue, true);
}
catch (Exception exception)
{
exception.printStackTrace();
}
}
private void addToQueue(String statName, Player player, long value)
{
synchronized (_statSync)
@ -162,8 +240,13 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
exception.printStackTrace();
}
}
public boolean incrementStat(final int accountId, final String statName, final long value)
{
return incrementStat(accountId, statName, value, false);
}
public boolean incrementStat(final int accountId, final String statName, final long value, boolean overRide)
{
// This will register a new stat if we don't have one, otherwise it will just run the callback
registerNewStat(statName, new Runnable()
@ -175,7 +258,7 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
uploadQueue.put(accountId, new NautHashMap<Integer, Long>());
uploadQueue.get(accountId).put(_stats.get(statName), value);
_repository.saveStats(uploadQueue);
_repository.saveStats(uploadQueue, overRide);
}
});
@ -237,6 +320,7 @@ public class StatsManager extends MiniDbClientPlugin<PlayerStats>
{
addCommand(new TimeCommand(this));
addCommand(new GiveStatCommand(this));
addCommand(new MasterBuilderUnban(this));
}
@Override

View File

@ -29,6 +29,8 @@ public class StatsRepository extends RepositoryBase
{
private static String RETRIEVE_STATS = "SELECT id, name FROM stats;";
private static String INSERT_STAT = "INSERT INTO stats (name) VALUES (?);";
private static String UPDATE_ACCOUNT_STAT_VALUE= "UPDATE accounts SET rank=?, rankPerm=true WHERE uuid = ?;";
public StatsRepository(JavaPlugin plugin)
{
@ -68,9 +70,15 @@ public class StatsRepository extends RepositoryBase
{
executeUpdate(INSERT_STAT, new ColumnVarChar("name", 100, name));
}
public void saveStats(NautHashMap<Integer, NautHashMap<Integer, Long>> uploadQueue)
{
saveStats(uploadQueue, false);
}
@SuppressWarnings("rawtypes")
public void saveStats(NautHashMap<Integer, NautHashMap<Integer, Long>> uploadQueue)
public void saveStats(NautHashMap<Integer, NautHashMap<Integer, Long>> uploadQueue, boolean overRideStat)
{
try
{
@ -83,13 +91,24 @@ public class StatsRepository extends RepositoryBase
{
for (Integer statId : uploadQueue.get(accountId).keySet())
{
Update update = context
if(overRideStat)
{
Update update = context
.update(Tables.accountStat)
.set(Tables.accountStat.value, ULong.valueOf(uploadQueue.get(accountId).get(statId)))
.where(Tables.accountStat.accountId.eq(accountId))
.and(Tables.accountStat.statId.eq(statId));
updates.add(update);
}
else
{
Update update = context
.update(Tables.accountStat)
.set(Tables.accountStat.value, Tables.accountStat.value.plus(uploadQueue.get(accountId).get(statId)))
.where(Tables.accountStat.accountId.eq(accountId))
.and(Tables.accountStat.statId.eq(statId));
updates.add(update);
updates.add(update);
}
Insert insert = context
.insertInto(Tables.accountStat)

View File

@ -0,0 +1,58 @@
package mineplex.core.stats.command;
import mineplex.core.account.CoreClient;
import mineplex.core.command.CommandBase;
import mineplex.core.common.Rank;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.stats.StatsManager;
import org.bukkit.entity.Player;
public class MasterBuilderUnban extends CommandBase<StatsManager>
{
public MasterBuilderUnban(StatsManager plugin)
{
super(plugin, Rank.ADMIN, "buildunban");
}
@Override
public void Execute(Player caller, String[] args)
{
if(args.length != 1)
{
UtilPlayer.message(caller, F.main("MasterBuilder Unban", "/buildunban <Target>"));
return;
}
try
{
Plugin.getClientManager().loadClientByName(args[0], new Runnable()
{
@Override
public void run()
{
CoreClient theClient = Plugin.getClientManager().Get(args[0]);
if(theClient != null)
{
Plugin.incrementStat(theClient.getAccountId(), "Global.Build Draw Abuse", 0, true);
caller.sendMessage(F.main("MasterBuilder Unban", "The user " + args[0] + " has been unbanned for Master Builders"));
}
else
{
caller.sendMessage(F.main("MasterBuilder Unban", "Couldn't find " + args[0] + "'s account!"));
return;
}
}
});
}
catch(Exception e)
{
caller.sendMessage(F.main("MasterBuilder Unban", "Exception caught! Please contact Morten and explain what happened."));
}
}
}