package org.openbakery.racecontrol.plugin.penalty.service;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import org.openbakery.jinsim.request.MessageRequest;
import org.openbakery.racecontrol.data.Driver;
import org.openbakery.racecontrol.gui.ButtonMessageHelper;
import org.openbakery.racecontrol.gui.MessageSize;
import org.openbakery.racecontrol.plugin.penalty.data.Penalty;
import org.openbakery.racecontrol.service.RaceService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
public class PenaltyService {
private static Logger logger = LoggerFactory.getLogger(PenaltyService.class);
@Autowired
private RaceService raceService;
private LinkedList<Penalty> penaltyToConfirm = new LinkedList<Penalty>();
private PenaltyExpireRunner penaltyExpireRunner;
private boolean penaltyActive;
public synchronized void confirmChatPenalty(int connectionId) {
Driver driver = raceService.getRaceControl().getRace().getDriver(connectionId);
Penalty penalty = new Penalty(driver, Penalty.Type.DRIVE_THOUGH, Penalty.Reason.CHAT);
penaltyToConfirm.add(penalty);
sendConfirmQuestion();
}
public synchronized void sendConfirmQuestion() {
for (Penalty p : penaltyToConfirm) {
if (p.isPending()) {
return;
}
}
if (penaltyToConfirm.size() > 0) {
Penalty penalty = penaltyToConfirm.getFirst();
penalty.setPending(true);
sendMessageToAdmins("Confirm penalty for " + penalty.getDriver().getName() + " with '/i confirm'");
}
}
public synchronized void penaltyConfirmed() {
Penalty penalty = penaltyToConfirm.removeFirst();
sendMessageToAdmins("Penalty confirmed for " + penalty.getDriver().getPlayerName() + "!");
executePenalty(penalty);
}
public synchronized void sendPenalty(Driver driver, Penalty.Type type) {
executePenalty(new Penalty(driver, type, Penalty.Reason.ADMIN));
}
private void executePenalty(Penalty penalty) {
String command = penalty.getPenaltyCommando();
if (command != null) {
MessageRequest msgRequest = new MessageRequest();
msgRequest.setMessage(command);
try {
raceService.getClient().send(msgRequest);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
}
public void deleteAllPenalties() {
penaltyToConfirm = new LinkedList<Penalty>();
}
public void sendMessageToAdmins(String message) {
List<Driver> admins = raceService.getRaceControl().getRace().getAdmins();
for (Driver admin : admins) {
ButtonMessageHelper.getInstance().sendButtonMessage(admin.getConnectionId(), message, 5, MessageSize.SMALL);
}
}
public void setPenaltyActive(boolean active) {
penaltyActive = active;
if (penaltyActive) {
sendMessageToAdmins("Penalties on");
if (penaltyExpireRunner == null) {
penaltyExpireRunner = new PenaltyExpireRunner(this);
Thread expireThread = new Thread(penaltyExpireRunner);
expireThread.start();
}
} else {
sendMessageToAdmins("Penalties off");
deleteAllPenalties();
if (penaltyExpireRunner != null) {
penaltyExpireRunner.stop();
}
penaltyExpireRunner = null;
}
}
public LinkedList<Penalty> getPenaltyToConfirm() {
return penaltyToConfirm;
}
public void penaltyExpired(Penalty penalty) {
penaltyToConfirm.remove(penalty);
sendMessageToAdmins("Penalty expired: " + penalty.getDriver().getPlayerName());
}
public boolean isPenaltyActive() {
return penaltyActive;
}
public void penaltyDeclined() {
Penalty penalty = penaltyToConfirm.removeFirst();
sendMessageToAdmins("Penalty declined for " + penalty.getDriver().getPlayerName() + "!");
}
public List<Driver> getDrivers() {
return raceService.getRaceControl().getRace().getRaceEntry().getDrivers();
}
}