/* * Copyright 2016 Nathan Howard * * This file is part of OpenGrave * * OpenGrave 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. * * OpenGrave 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 OpenGrave. If not, see <http://www.gnu.org/licenses/>. */ package com.opengrave.og.states; import java.util.HashMap; import com.opengrave.common.ServerData; import com.opengrave.common.event.*; import com.opengrave.common.xml.HGXMLThread; import com.opengrave.og.MainThread; import com.opengrave.og.gui.*; import com.opengrave.og.gui.callback.ButtonPressedEvent; import com.opengrave.og.resources.GUIXML; import com.opengrave.og.states.waitables.GameLoader; public class ServerListState extends BaseState implements EventListener { long timestamp; private TextButton refreshButton; private Button exitButton; private VerticalContainer vert; HashMap<TextButton, ServerData> serverButtons = new HashMap<TextButton, ServerData>(); public ServerListState() { EventDispatcher.addHandler(this); GUIXML mainMenuFile = new GUIXML("gui/serverlist.xml"); screen = mainMenuFile.getGUI(); refreshButton = (TextButton) screen.getElementById("refreshbutton"); exitButton = (Button) screen.getElementById("exitbutton"); vert = (VerticalContainer) screen.getElementById("container"); } @EventHandler(priority = EventHandlerPriority.LATE) public void onButtonPress(ButtonPressedEvent event) { if (!isActive()) { return; } if (event.getButton().equals(refreshButton)) { doRefreshListNow(); } else if (event.getButton().equals(exitButton)) { MainThread.changeState(new MenuState()); } else if (serverButtons.containsKey(event.getButton())) { MainThread.changeServerConnection(serverButtons.get(event.getButton())); MainThread.changeState(new LoadingState(new GameLoader(serverButtons.get(event.getButton()).getMods()))); } } @EventHandler(priority = EventHandlerPriority.LATE) public void onServerListUpdate(ServerListEvent event) { if (!isActive()) { return; } vert.removeAllChildren(); TextArea ta = new TextArea(new ElementData(vert.getElementData())); ta.setString("Not ingame:"); for (ServerData sd : event.getList()) { if (sd.getPort().equals("-1")) { // Not a Server. Client is online but not playing yet TextButton tb = new TextButton(new ElementData(vert.getElementData())); tb.setString(sd.getNames()); tb.setColourScheme(screen.getElementData()); tb.setDisabled(true); vert.addChildEnd(tb); } else { // Name length random guess. IP length x.x.x.x (7 chars min) if (sd.getNames().length() < 3 || sd.getIP().length() < 7) { continue; } TextButton tb = new TextButton(new ElementData(vert.getElementData())); serverButtons.put(tb, sd); tb.setString(sd.getNames()); tb.setColourScheme(screen.getElementData()); vert.addChildStart(tb); } } refreshButton.setDisabled(false); refreshButton.setString("Refresh Now"); vert.setAllChanged(); } public void doRefreshList() { long now = System.currentTimeMillis(); long inter = 1000 * 30; // Refresh every 30 seconds if (timestamp + inter < now) { doRefreshListNow(); } } public void doRefreshListNow() { refreshButton.setDisabled(true); refreshButton.setString("Refreshing..."); timestamp = System.currentTimeMillis(); HGXMLThread.requestServerlist(); } @Override public void start() { doRefreshListNow(); } @Override public void stop() { } @Override public void update(float delta) { doRefreshList(); } }