package org.openbakery.racecontrol.plugin; import java.io.IOException; import java.util.HashMap; import java.util.List; import org.openbakery.jinsim.response.ButtonTypeResponse; import org.openbakery.jinsim.response.HiddenMessageResponse; import org.openbakery.jinsim.response.InSimListener; import org.openbakery.jinsim.response.InSimResponse; import org.openbakery.racecontrol.data.Driver; import org.openbakery.racecontrol.gui.Button; import org.openbakery.racecontrol.gui.MessageHelper; import org.openbakery.racecontrol.gui.Panel; public class PrivateMessage implements InSimListener { private final List<Driver> drivers; private HashMap<Driver, Panel> panelMap; public PrivateMessage(final List<Driver> drivers) { this.drivers = drivers; panelMap = new HashMap<Driver, Panel>(); } public void packetReceived(InSimResponse response) { if (response instanceof HiddenMessageResponse) { HiddenMessageResponse hiddenMessageResonse = (HiddenMessageResponse) response; if ("pm".equalsIgnoreCase(hiddenMessageResonse.getMessage())) { showDrivers(hiddenMessageResonse.getConnectionId()); } } else if (response instanceof ButtonTypeResponse) { sendMessage((ButtonTypeResponse) response); } } private void sendMessage(ButtonTypeResponse response) { System.out.println("button clicked: " + response.getClickId() + " - " + response.getTypeInText()); Driver currentDriver = getCurrentDriver(response.getConnectionId()); if (currentDriver != null) { Panel panel = panelMap.get(currentDriver); Button button = panel.getButton(response.getClickId()); if (button != null) { Object object = button.getObject(); if (object != null && object instanceof Number) { byte connectionId = ((Number) button.getObject()).byteValue(); MessageHelper.sendMessage(connectionId, currentDriver.getName() + ": " + response.getTypeInText()); } } try { panel.setVisible(false); } catch (IOException e) { e.printStackTrace(); } } } private synchronized void showDrivers(int connectionId) { Driver currentDriver = getCurrentDriver(connectionId); if (currentDriver != null) { Panel panel = new Panel(1, 20); panelMap.put(currentDriver, panel); for (int i = 0; i < 5; i++) { for (Driver driver : drivers) { String name = driver.getName(); if (name == null) { name = "" + driver.getPlayerId(); } Button button = new Button(connectionId, name); button.setTypeIn(true); button.setObject(Byte.valueOf((byte) driver.getConnectionId())); panel.add(button); } } try { panel.setVisible(true); } catch (IOException e) { e.printStackTrace(); } } } private Driver getCurrentDriver(int connectionId) { for (Driver driver : drivers) { if (driver.getConnectionId() == connectionId) { return driver; } } return null; } }