package org.openbakery.racecontrol.plugin.admin.messages; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.openbakery.jinsim.response.ButtonClickedResponse; import org.openbakery.jinsim.response.HiddenMessageResponse; import org.openbakery.jinsim.response.InSimResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openbakery.racecontrol.RaceControl; import org.openbakery.racecontrol.data.Driver; import org.openbakery.racecontrol.gui.Button; import org.openbakery.racecontrol.gui.MessageSize; import org.openbakery.racecontrol.gui.Panel; import org.openbakery.racecontrol.persistence.PersistenceException; import org.openbakery.racecontrol.plugin.Plugin; import org.openbakery.racecontrol.plugin.admin.messages.data.AdminMessage; import org.openbakery.racecontrol.plugin.admin.messages.service.AdminMessagesService; import org.openbakery.racecontrol.plugin.admin.messages.web.AdminMessagesOverviewPage; import org.openbakery.racecontrol.web.bean.MenuItem; import org.openbakery.racecontrol.web.bean.Visibility; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; public class AdminMessages implements Plugin { private static Logger log = LoggerFactory.getLogger(AdminMessages.class); private RaceControl raceControl; private Map<Integer, Panel> adminMessagePanel = new HashMap<Integer, Panel>(); private Button cancelButton; private Button clearButton; @Autowired private AdminMessagesService adminMessagesService; public AdminMessages() { } public void packetReceived(InSimResponse response) { if (response instanceof HiddenMessageResponse) { HiddenMessageResponse hiddenMessageResponse = (HiddenMessageResponse) response; int connectionId = hiddenMessageResponse.getConnectionId(); Driver driver = raceControl.getRace().getDriver(connectionId); if (connectionId == 0 || driver.isAdmin()) { String message = hiddenMessageResponse.getMessage(); if (message.startsWith("bmsg ")) { if (message.length() > 4) { adminMessagesService.sendButtonMessage(message.substring(5, message.length()), 5, MessageSize.LARGE); } } else if (message.startsWith("msg ")) { if (message.length() > 4) { adminMessagesService.sendButtonMessage(message.substring(4, message.length()), 5, MessageSize.MEDIUM); } } else if (message.startsWith("smsg")) { if (message.length() > 3) { adminMessagesService.sendStaticButtonMessage(message.substring(4, message.length())); } } else if (message.startsWith("amsg")) { if (message.length() > 4) { String key = message.substring(5, message.length()); showAdminMessage(key); } else { showMessagePanel(driver.getConnectionId()); } } else if (message.startsWith("cmsg")) { adminMessagesService.hideAllMessages(); } } } else if (response instanceof ButtonClickedResponse) { processClickResponse((ButtonClickedResponse) response); } } private void showAdminMessage(String key) { try { for (AdminMessage m : adminMessagesService.getAllMessages()) { if (key.equals(m.getKey())) { adminMessagesService.showAdminMessage(m); return; } } } catch (PersistenceException e) { log.error(e.getMessage(), e); } } private void processClickResponse(ButtonClickedResponse response) { int id = response.getClickId(); Panel panel = adminMessagePanel.get(Integer.valueOf(response.getConnectionId())); if (panel != null) { Button button = panel.getButton(id); if (button != null && button != cancelButton && button != clearButton) { showAdminMessage(((AdminMessage) button.getObject()).getKey()); } else if (button != null && button == clearButton) { adminMessagesService.hideAllMessages(); } panel.destroy(); } } public void setRaceControl(RaceControl raceControl) { this.raceControl = raceControl; } public String getHelp() { return "Provided commands by the '" + getName() + "' plugin are: bmsg - big message, msg - message, smsg - static message"; } public String getName() { return "Admin Messages"; } private void showMessagePanel(int connectionId) { Panel panel = adminMessagePanel.get(Integer.valueOf(connectionId)); if (panel != null) { panel.destroy(); adminMessagePanel.remove(Integer.valueOf(connectionId)); } panel = new Panel(20, 40); panel.setColumns(30, 100); panel.add(new Button(connectionId, "Key"), 0); panel.add(new Button(connectionId, "Message"), 1); try { for (AdminMessage message : adminMessagesService.getAllMessages()) { Button button = new Button(connectionId, message.getKey()); button.setClickable(this); button.setObject(message); panel.add(button); Button text = new Button(connectionId, message.getMessage()); panel.add(text, 1); } } catch (PersistenceException persistenceException) { log.error(persistenceException.getMessage(), persistenceException); } cancelButton = new Button(connectionId, "Cancel"); cancelButton.setClickable(this); panel.add(cancelButton); clearButton = new Button(connectionId, "Clear"); clearButton.setClickable(this); panel.add(clearButton, 1); adminMessagePanel.put(Integer.valueOf(connectionId), panel); try { panel.setVisible(true); } catch (IOException e) { log.error(e.getMessage(), e); } } public AdminMessage getAdminMessage(String key) { try { List<AdminMessage> messageList = adminMessagesService.getAllMessages(); for (AdminMessage message : messageList) { if (message.getKey().equals(key)) { return message; } } } catch (PersistenceException e) { log.error(e.getMessage(), e); } return null; } public List<MenuItem> getMenuItems() { return Arrays.asList(new MenuItem("Admin Messages", AdminMessagesOverviewPage.class, Visibility.AUTHENTICATED)); } }