com.l2jfree.gameserver.elayne.RemoteAdministrationImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.l2jfree.gameserver.elayne.RemoteAdministrationImpl.java

Source

/*
 * 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.
 * 
 * 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.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program. If not, see <http://www.gnu.org/licenses/>.
 */
package com.l2jfree.gameserver.elayne;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

import javolution.util.FastMap;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.l2jfree.Config;
import com.l2jfree.gameserver.Announcements;
import com.l2jfree.gameserver.Shutdown;
import com.l2jfree.gameserver.Shutdown.ShutdownMode;
import com.l2jfree.gameserver.cache.HtmCache;
import com.l2jfree.gameserver.datatables.GmListTable;
import com.l2jfree.gameserver.datatables.ItemTable;
import com.l2jfree.gameserver.datatables.MultisellTable;
import com.l2jfree.gameserver.datatables.NpcTable;
import com.l2jfree.gameserver.datatables.SkillTable;
import com.l2jfree.gameserver.datatables.SpawnTable;
import com.l2jfree.gameserver.datatables.TeleportLocationTable;
import com.l2jfree.gameserver.gameobjects.L2Player;
import com.l2jfree.gameserver.instancemanager.DayNightSpawnManager;
import com.l2jfree.gameserver.instancemanager.Manager;
import com.l2jfree.gameserver.instancemanager.RaidBossSpawnManager;
import com.l2jfree.gameserver.model.world.L2World;
import com.l2jfree.gameserver.network.Disconnection;
import com.l2jfree.gameserver.network.SystemChatChannelId;
import com.l2jfree.gameserver.network.packets.server.CreatureSay;
import com.l2jfree.lang.L2TextBuilder;
import com.l2jfree.tools.random.Rnd;

public class RemoteAdministrationImpl extends UnicastRemoteObject implements IRemoteAdministration {
    private final static Log _log = LogFactory.getLog(RemoteAdministrationImpl.class.getName());
    private static final long serialVersionUID = -8523099127883669758L;
    private static RemoteAdministrationImpl _instance;
    private IRemoteAdministration _obj;

    @SuppressWarnings("unused")
    private Registry _lReg;
    private String _pass;
    private int _port;

    public static RemoteAdministrationImpl getInstance() {
        if (_instance == null) {
            try {
                _instance = new RemoteAdministrationImpl();
            } catch (RemoteException e) {
                _log.error("RemoteAdministrationImpl: Problems ocurred while starting RMI Server.", e);
            }
        }
        return _instance;
    }

    public RemoteAdministrationImpl() throws RemoteException {
        super();
        _pass = Config.RMI_SERVER_PASSWORD;
        _port = Config.RMI_SERVER_PORT;
    }

    public void startServer() {
        if (Config.ALLOW_RMI_SERVER && _port != 0) {
            try {
                _lReg = LocateRegistry.createRegistry(_port);
                _obj = new RemoteAdministrationImpl();

                if (_pass.isEmpty()) {
                    _log.info("No password defined for RMI Server");
                    _pass = generateRandomPassword(10);
                    _log.info("A password has been automatically generated: " + _pass);
                }

                Naming.rebind("//localhost:" + _port + "/Elayne", _obj);
                _log.info("RMI Server started on port: " + _port + ", Password: " + _pass + ".");
            } catch (Exception e) {
                _log.error("RemoteAdministrationImpl error: ", e);
                e.printStackTrace();
            }
        } else
            _log.info("RMI Server is currently disabled.");
    }

    /**
     * @see com.l2jfree.gameserver.elayne.IRemoteAdministration#getOnlineUsersCount()
     */
    @Override
    public int getOnlineUsersCount(String password) throws RemoteException {
        if (!password.equals(_pass))
            return 0;
        return L2World.getInstance().getAllPlayersCount();
    }

    /**
     * @see com.l2jfree.gameserver.elayne.IRemoteAdministration#getPlayerInformation(java.lang.String)
     */
    @Override
    public IRemotePlayer getPlayerInformation(String password, String playerName) throws RemoteException {
        if (!password.equals(_pass))
            return null;
        L2Player player = L2World.getInstance().getPlayer(playerName);
        if (player != null)
            return new RemotePlayerImpl(player);
        return null;
    }

    /**
     * @see com.l2jfree.gameserver.elayne.IRemoteAdministration#announceToAll(java.lang.String)
     */
    @Override
    public void announceToAll(String password, String announcement) throws RemoteException {
        if (!password.equals(_pass))
            return;
        Announcements.getInstance().announceToAll(announcement);
    }

    /**
     * @see com.l2jfree.gameserver.elayne.IRemoteAdministration#abortServerRestart()
     */
    @Override
    public void abortServerRestart(String password) throws RemoteException {
        if (password.equals(_pass))
            Shutdown.abort("127.0.0.1");
    }

    /**
     * @see com.l2jfree.gameserver.elayne.IRemoteAdministration#kickPlayerFromServer(java.lang.String)
     */
    @Override
    public int kickPlayerFromServer(String password, String playerName) throws RemoteException {
        if (password.equals(_pass)) {
            L2Player player = L2World.getInstance().getPlayer(playerName);
            if (player != null) {
                player.sendMessage("You are kicked out by a GM.");
                new Disconnection(player).defaultSequence(false);
                return 1;
            }
            return 2;
        }

        return 3;
    }

    /**
     * @see com.l2jfree.gameserver.elayne.IRemoteAdministration#reload(int)
     */
    @Override
    public void reload(String password, int reloadProcedure) throws RemoteException {
        if (password.equals(_pass)) {
            switch (reloadProcedure) {
            case 1:
                MultisellTable.getInstance().reload();
                break;
            case 2:
                SkillTable.reload();
                break;
            case 3:
                NpcTable.getInstance().reloadAll();
                break;
            case 4:
                HtmCache.getInstance().reload(true);
                break;
            case 5:
                ItemTable.reload();
                break;
            case 6:
                Manager.reloadAll();
                break;
            case 7:
                break;
            case 8:
                TeleportLocationTable.getInstance().reloadAll();
                break;
            case 9:
                RaidBossSpawnManager.getInstance().cleanUp();
                DayNightSpawnManager.getInstance().cleanUp();
                L2World.getInstance().deleteVisibleNpcSpawns();
                NpcTable.getInstance().reloadAll();
                SpawnTable.getInstance().reloadAll();
                RaidBossSpawnManager.getInstance().reloadBosses();
                break;
            }
        }
    }

    /**
     * @see com.l2jfree.gameserver.elayne.IRemoteAdministration#scheduleServerRestart(int)
     */
    @Override
    public void scheduleServerRestart(String password, int secondsUntilRestart) throws RemoteException {
        if (password.equals(_pass))
            Shutdown.start("127.0.0.1", secondsUntilRestart, ShutdownMode.SHUTDOWN);
    }

    /**
     * @see com.l2jfree.gameserver.elayne.IRemoteAdministration#scheduleServerShutDown(int)
     */
    @Override
    public void scheduleServerShutDown(String password, int secondsUntilShutDown) throws RemoteException {
        if (password.equals(_pass))
            Shutdown.start("127.0.0.1", secondsUntilShutDown, ShutdownMode.RESTART);

    }

    /**
     * @see com.l2jfree.gameserver.elayne.IRemoteAdministration#sendMessageToGms(java.lang.String)
     */
    @Override
    public int sendMessageToGms(String password, String message) throws RemoteException {
        if (!password.equals(_pass))
            return 0;
        CreatureSay cs = new CreatureSay(0, SystemChatChannelId.Chat_Alliance, "Message From Elayne GM Tool",
                message);
        GmListTable.broadcastToGMs(cs);
        return GmListTable.getAllGms(true).size();
    }

    /**
     * @see com.l2jfree.gameserver.elayne.IRemoteAdministration#sendPrivateMessage(java.lang.String, java.lang.String)
     */
    @Override
    public int sendPrivateMessage(String password, String player, String message) throws RemoteException {
        if (!password.equals(_pass))
            return 2;
        L2Player reciever = L2World.getInstance().getPlayer(player);
        CreatureSay cs = new CreatureSay(0, SystemChatChannelId.Chat_Tell, "Elayne GM Tool MSG", message);
        if (reciever != null) {
            reciever.sendPacket(cs);
            return 1;
        }

        return 2;
    }

    /**
     * @see com.l2jfree.gameserver.elayne.IRemoteAdministration#getOnlinePlayersDetails(java.lang.String)
     */
    @Override
    public FastMap<String, IRemotePlayer> getOnlinePlayersDetails(String rmiPassword) throws RemoteException {
        if (!rmiPassword.equals(_pass))
            return null;
        return null;
    }

    private String generateRandomPassword(int length) {
        L2TextBuilder password = L2TextBuilder.newInstance();
        String lowerChar = "qwertzuiopasdfghjklyxcvbnm";
        String upperChar = "QWERTZUIOPASDFGHJKLYXCVBNM";
        String digits = "1234567890";
        for (int i = 0; i < length; i++) {
            int charSet = Rnd.nextInt(3);
            switch (charSet) {
            case 0:
                password.append(lowerChar.charAt(Rnd.nextInt(lowerChar.length() - 1)));
                break;
            case 1:
                password.append(upperChar.charAt(Rnd.nextInt(upperChar.length() - 1)));
                break;
            case 2:
                password.append(digits.charAt(Rnd.nextInt(digits.length() - 1)));
                break;
            }
        }
        return password.moveToString();
    }
}