
simple.server.extension.MonitorExtension Maven / Gradle / Ivy
The newest version!
package simple.server.extension;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import marauroa.common.Log4J;
import marauroa.common.Logger;
import marauroa.common.game.*;
import marauroa.server.db.DBTransaction;
import marauroa.server.db.JDBCSQLHelper;
import marauroa.server.db.TransactionPool;
import marauroa.server.game.db.DAORegister;
import org.openide.util.Lookup;
import org.openide.util.lookup.ServiceProvider;
import simple.common.game.ClientObjectInterface;
import simple.server.core.action.ActionListener;
import simple.server.core.action.CommandCenter;
import simple.server.core.engine.IRPWorld;
/**
*
* @author Javier A. Ortiz Bultrón
*/
@ServiceProvider(service = MarauroaServerExtension.class)
public class MonitorExtension extends SimpleServerExtension implements ActionListener {
public static final String _MONITOR = "monitor";
private static final Logger logger = Log4J.getLogger(MonitorExtension.class);
public static final int LISTZONES = 1, LISTPLAYERS = 2, LISTCONTENTS = 3;
public MonitorExtension() {
CommandCenter.register(_MONITOR, MonitorExtension.this);
DAORegister.get().register(MonitorDAO.class, new MonitorDAO());
}
private void getZoneInfo(ClientObjectInterface monitor, RPAction action) {
if (isMonitor(monitor)) {
list(monitor, LISTPLAYERS, action);
}
}
private void getZones(ClientObjectInterface monitor, RPAction action) {
if (isMonitor(monitor)) {
list(monitor, LISTZONES, action);
}
}
private boolean isMonitor(ClientObjectInterface monitor) {
return DAORegister.get().get(MonitorDAO.class).isMonitor(monitor.getName());
}
private void list(ClientObjectInterface monitor, int option, RPAction action) {
try {
if (option == LISTZONES) {
logger.debug("Sending zone list...");
String zones = Lookup.getDefault().lookup(IRPWorld.class).listZones("#").toString();
logger.debug("Sending: '" + zones + "'");
monitor.sendText(zones);
}
if (option == LISTPLAYERS) {
monitor.sendText(
Lookup.getDefault().lookup(IRPWorld.class).getZone(action.get(MonitorEvent.STRING)).getPlayersInString("#"));
}
if (option == LISTCONTENTS) {
// monitor.sendPrivateText(
// Lookup.getDefault().lookup(IRPWorld.class)
// .getZone(action.get(MonitorEvent.STRING)).getNonPlayers());
}
monitor.notifyWorldAboutChanges();
logger.debug("Done!");
} catch (Exception ex) {
logger.error(null, ex);
}
}
@Override
public RPObject onRPObjectRemoveFromZone(RPObject object) {
logger.debug("Processing removal of object from " + getClass().getSimpleName());
if (object instanceof ClientObjectInterface
&& isMonitor((ClientObjectInterface) object)) {
ClientObjectInterface monitor = (ClientObjectInterface) object;
setEnabled(monitor, false);
}
return object;
}
@Override
public boolean updateMonitor(RPObject object, Perception perception) {
try {
if (object instanceof ClientObjectInterface) {
ClientObjectInterface monitor = (ClientObjectInterface) object;
if (DAORegister.get().get(MonitorDAO.class).isMonitor(monitor.getName())) {
logger.debug("Updating monitor: " + monitor.getName());
for (IRPZone zone : getZones()) {
//Only add stuff not currently in the perception
if (zone.getID() != monitor.getZone().getID()) {
Perception p = zone.getPerception(object, Perception.DELTA);
logger.debug("Adding contents of zone: " + p.zoneid);
for (RPObject o : p.addedList) {
perception.addedList.add(o);
}
for (RPObject o : p.deletedList) {
perception.deletedList.add(o);
}
for (RPObject o : p.modifiedAddedList) {
perception.modifiedAddedList.add(o);
}
for (RPObject o : p.modifiedDeletedList) {
perception.modifiedDeletedList.add(o);
}
}
}
logger.debug(perception.toString());
}
}
} catch (Exception e) {
logger.error(null, e);
}
return true;
}
public List getZones() {
ArrayList zones = new ArrayList();
Lookup.getDefault().lookup(IRPWorld.class);
for (IRPZone z : Lookup.getDefault().lookup(IRPWorld.class)) {
zones.add(z);
}
return zones;
}
@Override
public void modifyClientObjectDefinition(RPClass client) {
client.addRPEvent(MonitorEvent.RPCLASS_NAME, Definition.VOLATILE);
}
@Override
public void afterWorldInit() {
// try {
// if (!DAORegister.get().get(CharacterDAO.class).hasCharacter(_MONITOR)) {
// logger.debug("Adding the monitor character: " + _MONITOR + " to the System account.");
// //Create it
// ClientObject monitor = new ClientObject(new RPObject());
// //Save it.
// DAORegister.get().get(RPObjectDAO.class).storeRPObject(monitor);
// //Link with System account
// DAORegister.get().get(CharacterDAO.class).addCharacter(
// Configuration.getConfiguration().get("system_account_name"),
// _MONITOR, monitor);
// }
// } catch (SQLException ex) {
// logger.error(ex);
// } catch (IOException ex) {
// logger.error(ex);
// }
}
private void register(ClientObjectInterface monitor) throws SQLException {
DBTransaction transaction = TransactionPool.get().beginWork();
try {
if (!DAORegister.get().get(MonitorDAO.class).isMonitor(monitor.getName())) {
DAORegister.get().get(MonitorDAO.class).addPlayer(
transaction, monitor.getName());
}
DAORegister.get().get(MonitorDAO.class).setEnabled(monitor, true);
} catch (SQLException ex) {
java.util.logging.Logger.getLogger(MonitorExtension.class.getName()).log(Level.SEVERE, null, ex);
} finally {
TransactionPool.get().commit(transaction);
}
}
private void unregister(ClientObjectInterface monitor) throws SQLException {
DBTransaction transaction = TransactionPool.get().beginWork();
try {
if (DAORegister.get().get(MonitorDAO.class).isMonitor(monitor.getName())) {
DAORegister.get().get(MonitorDAO.class).removePlayer(
transaction, monitor.getName());
}
DAORegister.get().get(MonitorDAO.class).setEnabled(monitor, false);
} catch (SQLException ex) {
java.util.logging.Logger.getLogger(MonitorExtension.class.getName()).log(Level.SEVERE, null, ex);
} finally {
TransactionPool.get().commit(transaction);
}
}
private void setEnabled(ClientObjectInterface monitor, boolean enabled) {
try {
DAORegister.get().get(MonitorDAO.class).setEnabled(monitor, enabled);
} catch (SQLException ex) {
java.util.logging.Logger.getLogger(MonitorExtension.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public void updateDatabase() {
logger.debug("Updating database for extension " + _MONITOR);
final DBTransaction transaction = TransactionPool.get().beginWork();
try {
createTablesUnlessTheyAlreadyExist(transaction);
TransactionPool.get().commit(transaction);
} catch (SQLException e) {
logger.error(e, e);
TransactionPool.get().rollback(transaction);
}
logger.debug("Done!");
}
private void createTablesUnlessTheyAlreadyExist(final DBTransaction transaction) {
logger.debug("Creating Monitor extension Tables...");
logger.debug("Creation successful? " + new JDBCSQLHelper(transaction).runDBScript("simple/server/extension/monitor_init.sql"));
logger.debug("Done!");
}
@Override
public void onAction(RPObject rpo, RPAction action) {
if (rpo instanceof ClientObjectInterface) {
ClientObjectInterface monitor = (ClientObjectInterface) rpo;
logger.debug("Got action request from: " + monitor + ": " + action);
switch (action.getInt(MonitorEvent.ACTION)) {
case MonitorEvent.GET_ZONES:
getZones(monitor, action);
break;
case MonitorEvent.GET_ZONE_INFO:
getZoneInfo(monitor, action);
break;
case MonitorEvent.REGISTER:
try {
register(monitor);
} catch (SQLException ex) {
java.util.logging.Logger.getLogger(MonitorExtension.class.getName()).log(Level.SEVERE, null, ex);
}
break;
case MonitorEvent.UNREGISTER:
try {
unregister(monitor);
} catch (SQLException ex) {
java.util.logging.Logger.getLogger(MonitorExtension.class.getName()).log(Level.SEVERE, null, ex);
}
break;
default:
break;
}
}
}
@Override
public String getName() {
return "Monitor Extension";
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy