2011-05-13 19:58:30 +00:00
/ *
* Essentials - a bukkit plugin
* Copyright ( C ) 2011 Essentials Team
2011-11-21 01:55:26 +00:00
*
2011-05-13 19:58:30 +00:00
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
2011-11-21 01:55:26 +00:00
*
2011-05-13 19:58:30 +00:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
2011-11-21 01:55:26 +00:00
*
2011-05-13 19:58:30 +00:00
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
* /
2011-03-30 04:03:21 +00:00
package com.earth2me.essentials ;
2015-04-15 04:06:16 +00:00
import com.earth2me.essentials.commands.* ;
2016-01-19 15:09:44 +00:00
import com.earth2me.essentials.metrics.Metrics ;
2011-08-30 21:26:23 +00:00
import com.earth2me.essentials.perm.PermissionsHandler ;
2011-05-13 23:39:18 +00:00
import com.earth2me.essentials.register.payment.Methods ;
2011-07-09 11:52:46 +00:00
import com.earth2me.essentials.signs.SignBlockListener ;
import com.earth2me.essentials.signs.SignEntityListener ;
import com.earth2me.essentials.signs.SignPlayerListener ;
2013-06-16 00:07:16 +00:00
import com.earth2me.essentials.textreader.IText ;
import com.earth2me.essentials.textreader.KeywordReplacer ;
import com.earth2me.essentials.textreader.SimpleTextInput ;
2013-06-08 21:31:19 +00:00
import com.earth2me.essentials.utils.DateUtil ;
2014-07-12 06:03:36 +00:00
import com.google.common.base.Function ;
import com.google.common.base.Throwables ;
import com.google.common.collect.Iterables ;
2015-04-15 04:06:16 +00:00
import net.ess3.api.* ;
2013-10-11 02:44:41 +00:00
import net.ess3.api.IEssentials ;
import net.ess3.api.ISettings ;
2016-03-28 23:42:33 +00:00
import net.ess3.nms.PotionMetaProvider ;
2016-03-10 16:28:08 +00:00
import net.ess3.nms.SpawnEggProvider ;
2015-06-17 14:25:46 +00:00
import net.ess3.nms.SpawnerProvider ;
2016-03-28 23:42:33 +00:00
import net.ess3.nms.legacy.LegacyPotionMetaProvider ;
2016-06-10 01:04:02 +00:00
import net.ess3.nms.refl.ReflSpawnEggProvider ;
2016-03-28 23:42:33 +00:00
import net.ess3.nms.updatedmeta.BasePotionDataProvider ;
import net.ess3.nms.updatedmeta.BlockMetaSpawnerProvider ;
2016-03-10 16:28:08 +00:00
import net.ess3.nms.legacy.LegacySpawnEggProvider ;
2016-03-10 14:47:43 +00:00
import net.ess3.nms.legacy.LegacySpawnerProvider ;
import net.ess3.nms.v1_8_R1.v1_8_R1SpawnerProvider ;
import net.ess3.nms.v1_8_R2.v1_8_R2SpawnerProvider ;
import net.ess3.providers.ProviderFactory ;
2012-04-20 21:31:25 +00:00
import org.bukkit.Bukkit ;
2012-02-11 02:45:15 +00:00
import org.bukkit.ChatColor ;
2011-11-18 17:42:26 +00:00
import org.bukkit.Server ;
import org.bukkit.World ;
2013-07-02 06:16:42 +00:00
import org.bukkit.block.Block ;
2015-04-15 04:06:16 +00:00
import org.bukkit.command.* ;
2011-03-30 04:03:21 +00:00
import org.bukkit.entity.Player ;
2012-01-20 04:20:37 +00:00
import org.bukkit.event.EventHandler ;
import org.bukkit.event.EventPriority ;
2012-12-31 05:44:20 +00:00
import org.bukkit.event.HandlerList ;
2012-01-20 04:20:37 +00:00
import org.bukkit.event.Listener ;
2011-11-30 19:48:42 +00:00
import org.bukkit.event.player.PlayerJoinEvent ;
2012-01-14 22:13:58 +00:00
import org.bukkit.event.world.WorldLoadEvent ;
import org.bukkit.event.world.WorldUnloadEvent ;
2011-11-18 17:42:26 +00:00
import org.bukkit.plugin.InvalidDescriptionException ;
import org.bukkit.plugin.Plugin ;
import org.bukkit.plugin.PluginDescriptionFile ;
import org.bukkit.plugin.PluginManager ;
import org.bukkit.plugin.java.JavaPlugin ;
2014-01-20 10:20:13 +00:00
import org.bukkit.plugin.java.JavaPluginLoader ;
2015-07-05 15:27:53 +00:00
import org.bukkit.scheduler.BukkitRunnable ;
2011-08-08 12:40:30 +00:00
import org.bukkit.scheduler.BukkitScheduler ;
2013-01-31 19:03:27 +00:00
import org.bukkit.scheduler.BukkitTask ;
2011-11-30 19:48:42 +00:00
import org.yaml.snakeyaml.error.YAMLException ;
2011-03-30 04:03:21 +00:00
2015-04-15 04:06:16 +00:00
import java.io.File ;
import java.io.FileReader ;
import java.io.IOException ;
import java.lang.reflect.InvocationTargetException ;
import java.lang.reflect.Method ;
import java.util.* ;
import java.util.logging.Level ;
import java.util.logging.Logger ;
import static com.earth2me.essentials.I18n.tl ;
2011-03-30 04:03:21 +00:00
2015-04-15 04:06:16 +00:00
public class Essentials extends JavaPlugin implements net . ess3 . api . IEssentials {
private static final Logger LOGGER = Logger . getLogger ( " Essentials " ) ;
private transient ISettings settings ;
private final transient TNTExplodeListener tntListener = new TNTExplodeListener ( this ) ;
private transient Jails jails ;
private transient Warps warps ;
private transient Worth worth ;
private transient List < IConf > confList ;
private transient Backup backup ;
private transient ItemDb itemDb ;
private transient final Methods paymentMethod = new Methods ( ) ;
private transient PermissionsHandler permissionsHandler ;
private transient AlternativeCommandsHandler alternativeCommandsHandler ;
private transient UserMap userMap ;
private transient ExecuteTimer execTimer ;
private transient I18n i18n ;
2016-01-19 15:09:44 +00:00
private transient Metrics metrics ;
2015-04-15 04:06:16 +00:00
private transient EssentialsTimer timer ;
2015-06-03 20:11:56 +00:00
private final transient List < String > vanishedPlayers = new ArrayList < > ( ) ;
2015-04-15 04:06:16 +00:00
private transient Method oldGetOnlinePlayers ;
2015-06-17 14:25:46 +00:00
private transient SpawnerProvider spawnerProvider ;
2016-03-10 16:28:08 +00:00
private transient SpawnEggProvider spawnEggProvider ;
2016-03-28 23:42:33 +00:00
private transient PotionMetaProvider potionMetaProvider ;
2015-04-15 04:06:16 +00:00
public Essentials ( ) {
}
public Essentials ( final Server server ) {
super ( new JavaPluginLoader ( server ) , new PluginDescriptionFile ( " Essentials " , " " , " com.earth2me.essentials.Essentials " ) , null , null ) ;
}
2016-01-18 22:02:20 +00:00
@SuppressWarnings ( " unused " )
public void forceLoadClasses ( ) {
try {
Class . forName ( OfflinePlayer . class . getName ( ) ) ;
} catch ( ClassNotFoundException e ) {
e . printStackTrace ( ) ;
}
}
2015-04-15 04:06:16 +00:00
@Override
public ISettings getSettings ( ) {
return settings ;
}
public void setupForTesting ( final Server server ) throws IOException , InvalidDescriptionException {
final File dataFolder = File . createTempFile ( " essentialstest " , " " ) ;
if ( ! dataFolder . delete ( ) ) {
throw new IOException ( ) ;
}
if ( ! dataFolder . mkdir ( ) ) {
throw new IOException ( ) ;
}
i18n = new I18n ( this ) ;
i18n . onEnable ( ) ;
i18n . updateLocale ( " en " ) ;
2015-10-27 17:34:59 +00:00
Console . setInstance ( this ) ;
2015-04-15 04:06:16 +00:00
LOGGER . log ( Level . INFO , tl ( " usingTempFolderForTesting " ) ) ;
LOGGER . log ( Level . INFO , dataFolder . toString ( ) ) ;
settings = new Settings ( this ) ;
userMap = new UserMap ( this ) ;
permissionsHandler = new PermissionsHandler ( this , false ) ;
Economy . setEss ( this ) ;
2015-06-03 20:11:56 +00:00
confList = new ArrayList < > ( ) ;
2015-04-15 04:06:16 +00:00
jails = new Jails ( this ) ;
registerListeners ( server . getPluginManager ( ) ) ;
}
@Override
public void onEnable ( ) {
try {
2015-06-05 22:49:05 +00:00
LOGGER . setParent ( this . getLogger ( ) ) ;
execTimer = new ExecuteTimer ( ) ;
execTimer . start ( ) ;
i18n = new I18n ( this ) ;
i18n . onEnable ( ) ;
execTimer . mark ( " I18n1 " ) ;
2015-10-27 17:34:59 +00:00
Console . setInstance ( this ) ;
2016-01-18 22:49:43 +00:00
2015-04-15 04:06:16 +00:00
final PluginManager pm = getServer ( ) . getPluginManager ( ) ;
for ( Plugin plugin : pm . getPlugins ( ) ) {
if ( plugin . getDescription ( ) . getName ( ) . startsWith ( " Essentials " ) & & ! plugin . getDescription ( ) . getVersion ( ) . equals ( this . getDescription ( ) . getVersion ( ) ) & & ! plugin . getDescription ( ) . getName ( ) . equals ( " EssentialsAntiCheat " ) ) {
2015-06-03 13:44:18 +00:00
getLogger ( ) . warning ( tl ( " versionMismatch " , plugin . getDescription ( ) . getName ( ) ) ) ;
2015-04-15 04:06:16 +00:00
}
}
for ( Method method : Server . class . getDeclaredMethods ( ) ) {
if ( method . getName ( ) . endsWith ( " getOnlinePlayers " ) & & method . getReturnType ( ) = = Player [ ] . class ) {
oldGetOnlinePlayers = method ;
break ;
}
}
2016-01-18 22:02:20 +00:00
forceLoadClasses ( ) ;
2015-04-15 04:06:16 +00:00
try {
final EssentialsUpgrade upgrade = new EssentialsUpgrade ( this ) ;
upgrade . beforeSettings ( ) ;
execTimer . mark ( " Upgrade " ) ;
2015-06-03 20:11:56 +00:00
confList = new ArrayList < > ( ) ;
2015-04-15 04:06:16 +00:00
settings = new Settings ( this ) ;
confList . add ( settings ) ;
execTimer . mark ( " Settings " ) ;
userMap = new UserMap ( this ) ;
confList . add ( userMap ) ;
execTimer . mark ( " Init(Usermap) " ) ;
upgrade . afterSettings ( ) ;
execTimer . mark ( " Upgrade2 " ) ;
warps = new Warps ( getServer ( ) , this . getDataFolder ( ) ) ;
confList . add ( warps ) ;
execTimer . mark ( " Init(Spawn/Warp) " ) ;
worth = new Worth ( this . getDataFolder ( ) ) ;
confList . add ( worth ) ;
itemDb = new ItemDb ( this ) ;
confList . add ( itemDb ) ;
execTimer . mark ( " Init(Worth/ItemDB) " ) ;
jails = new Jails ( this ) ;
confList . add ( jails ) ;
2016-03-10 14:47:43 +00:00
spawnerProvider = new ProviderFactory < > ( getLogger ( ) ,
Arrays . asList (
BlockMetaSpawnerProvider . class ,
v1_8_R2SpawnerProvider . class ,
v1_8_R1SpawnerProvider . class ,
LegacySpawnerProvider . class
) , " mob spawner " ) . getProvider ( ) ;
2016-03-10 16:28:08 +00:00
spawnEggProvider = new ProviderFactory < > ( getLogger ( ) ,
Arrays . asList (
2016-06-10 01:04:02 +00:00
ReflSpawnEggProvider . class ,
2016-03-10 16:28:08 +00:00
LegacySpawnEggProvider . class
) , " spawn egg " ) . getProvider ( ) ;
2016-03-28 23:42:33 +00:00
potionMetaProvider = new ProviderFactory < > ( getLogger ( ) ,
Arrays . asList (
BasePotionDataProvider . class ,
LegacyPotionMetaProvider . class
) , " potion meta " ) . getProvider ( ) ;
2015-04-15 04:06:16 +00:00
reload ( ) ;
} catch ( YAMLException exception ) {
if ( pm . getPlugin ( " EssentialsUpdate " ) ! = null ) {
LOGGER . log ( Level . SEVERE , tl ( " essentialsHelp2 " ) ) ;
} else {
LOGGER . log ( Level . SEVERE , tl ( " essentialsHelp1 " ) ) ;
}
handleCrash ( exception ) ;
return ;
}
backup = new Backup ( this ) ;
permissionsHandler = new PermissionsHandler ( this , settings . useBukkitPermissions ( ) ) ;
alternativeCommandsHandler = new AlternativeCommandsHandler ( this ) ;
timer = new EssentialsTimer ( this ) ;
scheduleSyncRepeatingTask ( timer , 1000 , 50 ) ;
Economy . setEss ( this ) ;
execTimer . mark ( " RegHandler " ) ;
2017-05-07 16:14:20 +00:00
metrics = new Metrics ( this ) ;
if ( ! metrics . isOptOut ( ) ) {
getLogger ( ) . info ( " Starting Metrics. Opt-out using the global bStats config. " ) ;
} else {
getLogger ( ) . info ( " Metrics disabled per bStats config. " ) ;
2015-07-05 15:37:17 +00:00
}
2015-04-15 04:06:16 +00:00
final String timeroutput = execTimer . end ( ) ;
if ( getSettings ( ) . isDebug ( ) ) {
LOGGER . log ( Level . INFO , " Essentials load {0} " , timeroutput ) ;
}
} catch ( NumberFormatException ex ) {
handleCrash ( ex ) ;
} catch ( Error ex ) {
handleCrash ( ex ) ;
throw ex ;
}
}
@Override
public void saveConfig ( ) {
// We don't use any of the bukkit config writing, as this breaks our config file formatting.
}
private void registerListeners ( PluginManager pm ) {
HandlerList . unregisterAll ( this ) ;
if ( getSettings ( ) . isDebug ( ) ) {
LOGGER . log ( Level . INFO , " Registering Listeners " ) ;
}
2016-08-27 02:27:52 +00:00
final EssentialsPluginListener pluginListener = new EssentialsPluginListener ( this ) ;
pm . registerEvents ( pluginListener , this ) ;
confList . add ( pluginListener ) ;
2015-04-15 04:06:16 +00:00
final EssentialsPlayerListener playerListener = new EssentialsPlayerListener ( this ) ;
2017-07-28 19:13:59 +00:00
playerListener . registerEvents ( ) ;
2015-04-15 04:06:16 +00:00
final EssentialsBlockListener blockListener = new EssentialsBlockListener ( this ) ;
pm . registerEvents ( blockListener , this ) ;
final SignBlockListener signBlockListener = new SignBlockListener ( this ) ;
pm . registerEvents ( signBlockListener , this ) ;
final SignPlayerListener signPlayerListener = new SignPlayerListener ( this ) ;
pm . registerEvents ( signPlayerListener , this ) ;
final SignEntityListener signEntityListener = new SignEntityListener ( this ) ;
pm . registerEvents ( signEntityListener , this ) ;
final EssentialsEntityListener entityListener = new EssentialsEntityListener ( this ) ;
pm . registerEvents ( entityListener , this ) ;
final EssentialsWorldListener worldListener = new EssentialsWorldListener ( this ) ;
pm . registerEvents ( worldListener , this ) ;
2016-08-27 02:27:52 +00:00
final EssentialsServerListener serverListener = new EssentialsServerListener ( this ) ;
pm . registerEvents ( serverListener , this ) ;
2015-04-15 04:06:16 +00:00
pm . registerEvents ( tntListener , this ) ;
jails . resetListener ( ) ;
}
@Override
public void onDisable ( ) {
for ( User user : getOnlineUsers ( ) ) {
if ( user . isVanished ( ) ) {
user . setVanished ( false ) ;
user . sendMessage ( tl ( " unvanishedReload " ) ) ;
}
user . stopTransaction ( ) ;
}
cleanupOpenInventories ( ) ;
if ( i18n ! = null ) {
i18n . onDisable ( ) ;
}
if ( backup ! = null ) {
backup . stopTask ( ) ;
}
Economy . setEss ( null ) ;
Trade . closeLog ( ) ;
2016-03-02 00:45:48 +00:00
getUserMap ( ) . getUUIDMap ( ) . shutdown ( ) ;
2015-04-15 04:06:16 +00:00
HandlerList . unregisterAll ( this ) ;
}
@Override
public void reload ( ) {
Trade . closeLog ( ) ;
for ( IConf iConf : confList ) {
iConf . reloadConfig ( ) ;
execTimer . mark ( " Reload( " + iConf . getClass ( ) . getSimpleName ( ) + " ) " ) ;
}
i18n . updateLocale ( settings . getLocale ( ) ) ;
final PluginManager pm = getServer ( ) . getPluginManager ( ) ;
registerListeners ( pm ) ;
}
@Override
public List < String > onTabComplete ( CommandSender sender , Command command , String commandLabel , String [ ] args ) {
2017-04-14 01:46:43 +00:00
return onTabCompleteEssentials ( sender , command , commandLabel , args , Essentials . class . getClassLoader ( ) ,
" com.earth2me.essentials.commands.Command " , " essentials. " , null ) ;
}
@Override
public List < String > onTabCompleteEssentials ( final CommandSender cSender , final Command command , final String commandLabel , final String [ ] args ,
final ClassLoader classLoader , final String commandPath , final String permissionPrefix ,
final IEssentialsModule module ) {
2015-04-15 04:06:16 +00:00
if ( ! getSettings ( ) . isCommandOverridden ( command . getName ( ) ) & & ( ! commandLabel . startsWith ( " e " ) | | commandLabel . equalsIgnoreCase ( command . getName ( ) ) ) ) {
final PluginCommand pc = alternativeCommandsHandler . getAlternative ( commandLabel ) ;
if ( pc ! = null ) {
try {
TabCompleter completer = pc . getTabCompleter ( ) ;
if ( completer ! = null ) {
2017-04-14 01:46:43 +00:00
return completer . onTabComplete ( cSender , command , commandLabel , args ) ;
2015-04-15 04:06:16 +00:00
}
} catch ( final Exception ex ) {
Bukkit . getLogger ( ) . log ( Level . SEVERE , ex . getMessage ( ) , ex ) ;
}
}
}
2017-04-14 01:46:43 +00:00
try {
// Note: The tab completer is always a player, even when tab-completing in a command block
User user = null ;
if ( cSender instanceof Player ) {
user = getUser ( ( Player ) cSender ) ;
}
CommandSource sender = new CommandSource ( cSender ) ;
// Check for disabled commands
if ( getSettings ( ) . isCommandDisabled ( commandLabel ) ) {
return Collections . emptyList ( ) ;
}
IEssentialsCommand cmd ;
try {
cmd = ( IEssentialsCommand ) classLoader . loadClass ( commandPath + command . getName ( ) ) . newInstance ( ) ;
cmd . setEssentials ( this ) ;
cmd . setEssentialsModule ( module ) ;
} catch ( Exception ex ) {
sender . sendMessage ( tl ( " commandNotLoaded " , commandLabel ) ) ;
LOGGER . log ( Level . SEVERE , tl ( " commandNotLoaded " , commandLabel ) , ex ) ;
return Collections . emptyList ( ) ;
}
// Check authorization
if ( user ! = null & & ! user . isAuthorized ( cmd , permissionPrefix ) ) {
return Collections . emptyList ( ) ;
}
if ( user ! = null & & user . isJailed ( ) & & ! user . isAuthorized ( cmd , " essentials.jail.allow. " ) ) {
return Collections . emptyList ( ) ;
}
// Run the command
try {
if ( user = = null ) {
return cmd . tabComplete ( getServer ( ) , sender , commandLabel , command , args ) ;
} else {
return cmd . tabComplete ( getServer ( ) , user , commandLabel , command , args ) ;
}
} catch ( Exception ex ) {
showError ( sender , ex , commandLabel ) ;
// Tab completion shouldn't fail
LOGGER . log ( Level . SEVERE , tl ( " commandFailed " , commandLabel ) , ex ) ;
return Collections . emptyList ( ) ;
}
} catch ( Throwable ex ) {
LOGGER . log ( Level . SEVERE , tl ( " commandFailed " , commandLabel ) , ex ) ;
return Collections . emptyList ( ) ;
}
2015-04-15 04:06:16 +00:00
}
@Override
public boolean onCommand ( final CommandSender sender , final Command command , final String commandLabel , final String [ ] args ) {
return onCommandEssentials ( sender , command , commandLabel , args , Essentials . class . getClassLoader ( ) , " com.earth2me.essentials.commands.Command " , " essentials. " , null ) ;
}
@Override
public boolean onCommandEssentials ( final CommandSender cSender , final Command command , final String commandLabel , final String [ ] args , final ClassLoader classLoader , final String commandPath , final String permissionPrefix , final IEssentialsModule module ) {
// Allow plugins to override the command via onCommand
if ( ! getSettings ( ) . isCommandOverridden ( command . getName ( ) ) & & ( ! commandLabel . startsWith ( " e " ) | | commandLabel . equalsIgnoreCase ( command . getName ( ) ) ) ) {
final PluginCommand pc = alternativeCommandsHandler . getAlternative ( commandLabel ) ;
if ( pc ! = null ) {
alternativeCommandsHandler . executed ( commandLabel , pc ) ;
try {
return pc . execute ( cSender , commandLabel , args ) ;
} catch ( final Exception ex ) {
Bukkit . getLogger ( ) . log ( Level . SEVERE , ex . getMessage ( ) , ex ) ;
cSender . sendMessage ( ChatColor . RED + " An internal error occurred while attempting to perform this command " ) ;
return true ;
}
}
}
try {
User user = null ;
Block bSenderBlock = null ;
if ( cSender instanceof Player ) {
user = getUser ( ( Player ) cSender ) ;
} else if ( cSender instanceof BlockCommandSender ) {
BlockCommandSender bsender = ( BlockCommandSender ) cSender ;
bSenderBlock = bsender . getBlock ( ) ;
}
if ( bSenderBlock ! = null ) {
Bukkit . getLogger ( ) . log ( Level . INFO , " CommandBlock at {0},{1},{2} issued server command: /{3} {4} " , new Object [ ] { bSenderBlock . getX ( ) , bSenderBlock . getY ( ) , bSenderBlock . getZ ( ) , commandLabel , EssentialsCommand . getFinalArg ( args , 0 ) } ) ;
} else if ( user = = null ) {
Bukkit . getLogger ( ) . log ( Level . INFO , " {0} issued server command: /{1} {2} " , new Object [ ] { cSender . getName ( ) , commandLabel , EssentialsCommand . getFinalArg ( args , 0 ) } ) ;
}
CommandSource sender = new CommandSource ( cSender ) ;
// New mail notification
if ( user ! = null & & ! getSettings ( ) . isCommandDisabled ( " mail " ) & & ! command . getName ( ) . equals ( " mail " ) & & user . isAuthorized ( " essentials.mail " ) ) {
2017-06-22 21:54:51 +00:00
user . notifyOfMail ( ) ;
2015-04-15 04:06:16 +00:00
}
//Print version even if admin command is not available #easteregg
if ( commandLabel . equalsIgnoreCase ( " essversion " ) ) {
sender . sendMessage ( " This server is running Essentials " + getDescription ( ) . getVersion ( ) ) ;
return true ;
}
// Check for disabled commands
if ( getSettings ( ) . isCommandDisabled ( commandLabel ) ) {
return true ;
}
IEssentialsCommand cmd ;
try {
cmd = ( IEssentialsCommand ) classLoader . loadClass ( commandPath + command . getName ( ) ) . newInstance ( ) ;
cmd . setEssentials ( this ) ;
cmd . setEssentialsModule ( module ) ;
} catch ( Exception ex ) {
sender . sendMessage ( tl ( " commandNotLoaded " , commandLabel ) ) ;
LOGGER . log ( Level . SEVERE , tl ( " commandNotLoaded " , commandLabel ) , ex ) ;
return true ;
}
// Check authorization
if ( user ! = null & & ! user . isAuthorized ( cmd , permissionPrefix ) ) {
LOGGER . log ( Level . INFO , tl ( " deniedAccessCommand " , user . getName ( ) ) ) ;
user . sendMessage ( tl ( " noAccessCommand " ) ) ;
return true ;
}
if ( user ! = null & & user . isJailed ( ) & & ! user . isAuthorized ( cmd , " essentials.jail.allow. " ) ) {
if ( user . getJailTimeout ( ) > 0 ) {
user . sendMessage ( tl ( " playerJailedFor " , user . getName ( ) , DateUtil . formatDateDiff ( user . getJailTimeout ( ) ) ) ) ;
} else {
user . sendMessage ( tl ( " jailMessage " ) ) ;
}
return true ;
}
// Run the command
try {
if ( user = = null ) {
cmd . run ( getServer ( ) , sender , commandLabel , command , args ) ;
} else {
cmd . run ( getServer ( ) , user , commandLabel , command , args ) ;
}
return true ;
} catch ( NoChargeException ex ) {
return true ;
} catch ( QuietAbortException ex ) {
return true ;
} catch ( NotEnoughArgumentsException ex ) {
sender . sendMessage ( command . getDescription ( ) ) ;
sender . sendMessage ( command . getUsage ( ) . replaceAll ( " <command> " , commandLabel ) ) ;
if ( ! ex . getMessage ( ) . isEmpty ( ) ) {
sender . sendMessage ( ex . getMessage ( ) ) ;
}
return true ;
} catch ( Exception ex ) {
showError ( sender , ex , commandLabel ) ;
2015-09-30 01:56:04 +00:00
if ( settings . isDebug ( ) ) {
2015-04-20 22:49:23 +00:00
ex . printStackTrace ( ) ;
}
2015-04-15 04:06:16 +00:00
return true ;
}
} catch ( Throwable ex ) {
LOGGER . log ( Level . SEVERE , tl ( " commandFailed " , commandLabel ) , ex ) ;
return true ;
}
}
public void cleanupOpenInventories ( ) {
for ( User user : getOnlineUsers ( ) ) {
if ( user . isRecipeSee ( ) ) {
user . getBase ( ) . getOpenInventory ( ) . getTopInventory ( ) . clear ( ) ;
user . getBase ( ) . getOpenInventory ( ) . close ( ) ;
user . setRecipeSee ( false ) ;
}
if ( user . isInvSee ( ) | | user . isEnderSee ( ) ) {
user . getBase ( ) . getOpenInventory ( ) . close ( ) ;
user . setInvSee ( false ) ;
user . setEnderSee ( false ) ;
}
}
}
@Override
public void showError ( final CommandSource sender , final Throwable exception , final String commandLabel ) {
sender . sendMessage ( tl ( " errorWithMessage " , exception . getMessage ( ) ) ) ;
if ( getSettings ( ) . isDebug ( ) ) {
LOGGER . log ( Level . INFO , tl ( " errorCallingCommand " , commandLabel ) , exception ) ;
}
}
@Override
public BukkitScheduler getScheduler ( ) {
return this . getServer ( ) . getScheduler ( ) ;
}
@Override
public IJails getJails ( ) {
return jails ;
}
@Override
public Warps getWarps ( ) {
return warps ;
}
@Override
public Worth getWorth ( ) {
return worth ;
}
@Override
public Backup getBackup ( ) {
return backup ;
}
@Override
2016-01-19 15:09:44 +00:00
public Metrics getMetrics ( ) {
2015-04-15 04:06:16 +00:00
return metrics ;
}
@Override
2016-01-19 15:09:44 +00:00
public void setMetrics ( Metrics metrics ) {
2015-04-15 04:06:16 +00:00
this . metrics = metrics ;
}
@Deprecated
@Override
public User getUser ( final Object base ) {
if ( base instanceof Player ) {
return getUser ( ( Player ) base ) ;
}
if ( base instanceof org . bukkit . OfflinePlayer ) {
return getUser ( ( ( org . bukkit . OfflinePlayer ) base ) . getUniqueId ( ) ) ;
}
if ( base instanceof UUID ) {
return getUser ( ( UUID ) base ) ;
}
if ( base instanceof String ) {
return getOfflineUser ( ( String ) base ) ;
}
return null ;
}
//This will return null if there is not a match.
@Override
public User getUser ( final String base ) {
return getOfflineUser ( base ) ;
}
//This will return null if there is not a match.
@Override
public User getUser ( final UUID base ) {
return userMap . getUser ( base ) ;
}
//This will return null if there is not a match.
@Override
public User getOfflineUser ( final String name ) {
final User user = userMap . getUser ( name ) ;
if ( user ! = null & & user . getBase ( ) instanceof OfflinePlayer ) {
//This code should attempt to use the last known name of a user, if Bukkit returns name as null.
final String lastName = user . getLastAccountName ( ) ;
if ( lastName ! = null ) {
( ( OfflinePlayer ) user . getBase ( ) ) . setName ( lastName ) ;
} else {
( ( OfflinePlayer ) user . getBase ( ) ) . setName ( name ) ;
}
}
return user ;
}
//This will create a new user if there is not a match.
@Override
public User getUser ( final Player base ) {
if ( base = = null ) {
return null ;
}
if ( userMap = = null ) {
LOGGER . log ( Level . WARNING , " Essentials userMap not initialized " ) ;
return null ;
}
User user = userMap . getUser ( base . getUniqueId ( ) ) ;
if ( user = = null ) {
if ( getSettings ( ) . isDebug ( ) ) {
LOGGER . log ( Level . INFO , " Constructing new userfile from base player {0} " , base . getName ( ) ) ;
}
user = new User ( base , this ) ;
} else {
user . update ( base ) ;
}
return user ;
}
private void handleCrash ( Throwable exception ) {
final PluginManager pm = getServer ( ) . getPluginManager ( ) ;
LOGGER . log ( Level . SEVERE , exception . toString ( ) ) ;
2017-07-03 13:24:43 +00:00
exception . printStackTrace ( ) ;
2015-04-15 04:06:16 +00:00
pm . registerEvents ( new Listener ( ) {
@EventHandler ( priority = EventPriority . LOW )
public void onPlayerJoin ( final PlayerJoinEvent event ) {
event . getPlayer ( ) . sendMessage ( " Essentials failed to load, read the log file. " ) ;
}
} , this ) ;
for ( Player player : getOnlinePlayers ( ) ) {
player . sendMessage ( " Essentials failed to load, read the log file. " ) ;
}
this . setEnabled ( false ) ;
}
@Override
public World getWorld ( final String name ) {
if ( name . matches ( " [0-9]+ " ) ) {
final int worldId = Integer . parseInt ( name ) ;
if ( worldId < getServer ( ) . getWorlds ( ) . size ( ) ) {
return getServer ( ) . getWorlds ( ) . get ( worldId ) ;
}
}
return getServer ( ) . getWorld ( name ) ;
}
@Override
public void addReloadListener ( final IConf listener ) {
confList . add ( listener ) ;
}
@Override
public Methods getPaymentMethod ( ) {
return paymentMethod ;
}
@Override
public int broadcastMessage ( final String message ) {
return broadcastMessage ( null , null , message , true ) ;
}
@Override
public int broadcastMessage ( final IUser sender , final String message ) {
return broadcastMessage ( sender , null , message , false ) ;
}
@Override
public int broadcastMessage ( final String permission , final String message ) {
return broadcastMessage ( null , permission , message , false ) ;
}
private int broadcastMessage ( final IUser sender , final String permission , final String message , final boolean keywords ) {
if ( sender ! = null & & sender . isHidden ( ) ) {
return 0 ;
}
IText broadcast = new SimpleTextInput ( message ) ;
final Collection < Player > players = getOnlinePlayers ( ) ;
for ( Player player : players ) {
final User user = getUser ( player ) ;
if ( ( permission = = null & & ( sender = = null | | ! user . isIgnoredPlayer ( sender ) ) ) | | ( permission ! = null & & user . isAuthorized ( permission ) ) ) {
if ( keywords ) {
broadcast = new KeywordReplacer ( broadcast , new CommandSource ( player ) , this , false ) ;
}
for ( String messageText : broadcast . getLines ( ) ) {
user . sendMessage ( messageText ) ;
}
}
}
return players . size ( ) ;
}
@Override
public BukkitTask runTaskAsynchronously ( final Runnable run ) {
return this . getScheduler ( ) . runTaskAsynchronously ( this , run ) ;
}
@Override
public BukkitTask runTaskLaterAsynchronously ( final Runnable run , final long delay ) {
return this . getScheduler ( ) . runTaskLaterAsynchronously ( this , run , delay ) ;
}
@Override
public BukkitTask runTaskTimerAsynchronously ( final Runnable run , final long delay , final long period ) {
return this . getScheduler ( ) . runTaskTimerAsynchronously ( this , run , delay , period ) ;
}
@Override
public int scheduleSyncDelayedTask ( final Runnable run ) {
return this . getScheduler ( ) . scheduleSyncDelayedTask ( this , run ) ;
}
@Override
public int scheduleSyncDelayedTask ( final Runnable run , final long delay ) {
return this . getScheduler ( ) . scheduleSyncDelayedTask ( this , run , delay ) ;
}
@Override
public int scheduleSyncRepeatingTask ( final Runnable run , final long delay , final long period ) {
return this . getScheduler ( ) . scheduleSyncRepeatingTask ( this , run , delay , period ) ;
}
@Override
public TNTExplodeListener getTNTListener ( ) {
return tntListener ;
}
@Override
public PermissionsHandler getPermissionsHandler ( ) {
return permissionsHandler ;
}
@Override
public AlternativeCommandsHandler getAlternativeCommandsHandler ( ) {
return alternativeCommandsHandler ;
}
@Override
public IItemDb getItemDb ( ) {
return itemDb ;
}
@Override
public UserMap getUserMap ( ) {
return userMap ;
}
@Override
public I18n getI18n ( ) {
return i18n ;
}
@Override
public EssentialsTimer getTimer ( ) {
return timer ;
}
@Override
public List < String > getVanishedPlayers ( ) {
return vanishedPlayers ;
}
@Override
public Collection < Player > getOnlinePlayers ( ) {
try {
return ( Collection < Player > ) getServer ( ) . getOnlinePlayers ( ) ; // Needed for sanity here, the Bukkit API is a bit broken in the sense it only allows subclasses of Player to this list
} catch ( NoSuchMethodError ex ) {
try {
return Arrays . asList ( ( Player [ ] ) oldGetOnlinePlayers . invoke ( getServer ( ) ) ) ;
} catch ( InvocationTargetException ex1 ) {
throw Throwables . propagate ( ex . getCause ( ) ) ;
} catch ( IllegalAccessException ex1 ) {
throw new RuntimeException ( " Error invoking oldGetOnlinePlayers " , ex1 ) ;
}
}
}
@Override
public Iterable < User > getOnlineUsers ( ) {
return Iterables . transform ( getOnlinePlayers ( ) , new Function < Player , User > ( ) {
@Override
public User apply ( Player player ) {
return getUser ( player ) ;
}
} ) ;
}
2015-06-02 13:32:10 +00:00
@Override
2015-06-17 14:25:46 +00:00
public SpawnerProvider getSpawnerProvider ( ) {
return spawnerProvider ;
2015-06-02 13:32:10 +00:00
}
2016-03-10 16:28:08 +00:00
@Override
public SpawnEggProvider getSpawnEggProvider ( ) {
return spawnEggProvider ;
}
2016-03-28 23:42:33 +00:00
@Override
public PotionMetaProvider getPotionMetaProvider ( ) {
return potionMetaProvider ;
}
2015-04-15 04:06:16 +00:00
private static class EssentialsWorldListener implements Listener , Runnable {
private transient final IEssentials ess ;
public EssentialsWorldListener ( final IEssentials ess ) {
this . ess = ess ;
}
@EventHandler ( priority = EventPriority . LOW )
public void onWorldLoad ( final WorldLoadEvent event ) {
ess . getJails ( ) . onReload ( ) ;
ess . getWarps ( ) . reloadConfig ( ) ;
for ( IConf iConf : ( ( Essentials ) ess ) . confList ) {
if ( iConf instanceof IEssentialsModule ) {
iConf . reloadConfig ( ) ;
}
}
}
@EventHandler ( priority = EventPriority . LOW )
public void onWorldUnload ( final WorldUnloadEvent event ) {
ess . getJails ( ) . onReload ( ) ;
ess . getWarps ( ) . reloadConfig ( ) ;
for ( IConf iConf : ( ( Essentials ) ess ) . confList ) {
if ( iConf instanceof IEssentialsModule ) {
iConf . reloadConfig ( ) ;
}
}
}
@Override
public void run ( ) {
ess . reload ( ) ;
}
}
2011-03-30 04:03:21 +00:00
}