mirror of
https://github.com/correl/mage.git
synced 2024-12-25 19:25:41 +00:00
Make draft logs compatible with MTGO format #5450 - https://github.com/magefree/mage/issues/5450
This commit is contained in:
parent
c7bc799f86
commit
7e621ee8af
7 changed files with 134 additions and 70 deletions
|
@ -21,7 +21,6 @@ import mage.client.util.audio.AudioManager;
|
||||||
import mage.client.util.gui.BufferedImageBuilder;
|
import mage.client.util.gui.BufferedImageBuilder;
|
||||||
import mage.constants.PlayerAction;
|
import mage.constants.PlayerAction;
|
||||||
import mage.view.*;
|
import mage.view.*;
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import javax.swing.Timer;
|
import javax.swing.Timer;
|
||||||
|
@ -31,21 +30,16 @@ import java.awt.event.ActionListener;
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.nio.file.StandardOpenOption;
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author BetaSteward_at_googlemail.com
|
* @author BetaSteward_at_googlemail.com
|
||||||
*/
|
*/
|
||||||
public class DraftPanel extends javax.swing.JPanel {
|
public class DraftPanel extends javax.swing.JPanel {
|
||||||
|
|
||||||
private static final Logger LOGGER = Logger.getLogger(DraftPanel.class);
|
|
||||||
|
|
||||||
private UUID draftId;
|
private UUID draftId;
|
||||||
private Timer countdown;
|
private Timer countdown;
|
||||||
private int timeout;
|
private int timeout;
|
||||||
|
@ -63,8 +57,11 @@ public class DraftPanel extends javax.swing.JPanel {
|
||||||
// id of card with popup menu
|
// id of card with popup menu
|
||||||
protected UUID cardIdPopupMenu;
|
protected UUID cardIdPopupMenu;
|
||||||
|
|
||||||
// Filename for the draft log (only updated if writing the log).
|
// Helper for writing the draft log.
|
||||||
private String logFilename;
|
private DraftPickLogger draftLogger;
|
||||||
|
|
||||||
|
// List of set codes (for draft log writing).
|
||||||
|
private List<String> setCodes;
|
||||||
|
|
||||||
// Number of the current booster (for draft log writing).
|
// Number of the current booster (for draft log writing).
|
||||||
private int packNo;
|
private int packNo;
|
||||||
|
@ -73,7 +70,6 @@ public class DraftPanel extends javax.swing.JPanel {
|
||||||
private int pickNo;
|
private int pickNo;
|
||||||
|
|
||||||
// Cached booster data to be written into the log (see logLastPick).
|
// Cached booster data to be written into the log (see logLastPick).
|
||||||
private String currentBoosterHeader;
|
|
||||||
private String[] currentBooster;
|
private String[] currentBooster;
|
||||||
|
|
||||||
private static final CardsView EMPTY_VIEW = new CardsView();
|
private static final CardsView EMPTY_VIEW = new CardsView();
|
||||||
|
@ -139,17 +135,11 @@ public class DraftPanel extends javax.swing.JPanel {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isLogging()) {
|
if (isLogging()) {
|
||||||
// If we are logging the draft create a file that will contain
|
|
||||||
// the log.
|
|
||||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
|
||||||
logFilename = "Draft_" + sdf.format(new Date()) + '_' + draftId + ".txt";
|
String logFilename = "Draft_" + sdf.format(new Date()) + '_' + draftId + ".txt";
|
||||||
try {
|
draftLogger = new DraftPickLogger(new File("gamelogs"), logFilename);
|
||||||
Files.write(pathToDraftLog(), "".getBytes(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
|
|
||||||
} catch (IOException ex) {
|
|
||||||
LOGGER.error(null, ex);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
logFilename = null;
|
draftLogger = new DraftPickLogger();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,6 +161,8 @@ public class DraftPanel extends javax.swing.JPanel {
|
||||||
|
|
||||||
packNo = draftView.getBoosterNum();
|
packNo = draftView.getBoosterNum();
|
||||||
pickNo = draftView.getCardNum();
|
pickNo = draftView.getCardNum();
|
||||||
|
setCodes = draftView.getSetCodes();
|
||||||
|
draftLogger.updateDraft(draftId, draftView);
|
||||||
|
|
||||||
int right = draftView.getPlayers().size() / 2;
|
int right = draftView.getPlayers().size() / 2;
|
||||||
int left = draftView.getPlayers().size() - right;
|
int left = draftView.getPlayers().size() - right;
|
||||||
|
@ -416,13 +408,21 @@ public class DraftPanel extends javax.swing.JPanel {
|
||||||
if (currentBooster != null) {
|
if (currentBooster != null) {
|
||||||
String lastPick = getCardName(getLastPick(pickView.getPicks().values()));
|
String lastPick = getCardName(getLastPick(pickView.getPicks().values()));
|
||||||
if (lastPick != null && currentBooster.length > 1) {
|
if (lastPick != null && currentBooster.length > 1) {
|
||||||
logPick(lastPick);
|
draftLogger.logPick(getCurrentSetCode(), packNo, pickNo-1, lastPick, currentBooster);
|
||||||
}
|
}
|
||||||
currentBooster = null;
|
currentBooster = null;
|
||||||
}
|
}
|
||||||
setCurrentBoosterForLog(pickView.getBooster());
|
setCurrentBoosterForLog(pickView.getBooster());
|
||||||
if (currentBooster.length == 1) {
|
if (currentBooster.length == 1) {
|
||||||
logPick(currentBooster[0]);
|
draftLogger.logPick(getCurrentSetCode(), packNo, pickNo, currentBooster[0], currentBooster);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getCurrentSetCode() {
|
||||||
|
if (!setCodes.isEmpty()) {
|
||||||
|
return setCodes.get(packNo-1);
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -440,38 +440,9 @@ public class DraftPanel extends javax.swing.JPanel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
currentBoosterHeader = "Pack " + packNo + " pick " + pickNo + ":\n";
|
|
||||||
currentBooster = cards.toArray(new String[cards.size()]);
|
currentBooster = cards.toArray(new String[cards.size()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void logPick(String pick) {
|
|
||||||
StringBuilder b = new StringBuilder();
|
|
||||||
b.append(currentBoosterHeader);
|
|
||||||
for (String name : currentBooster) {
|
|
||||||
b.append(pick.equals(name) ? "--> " : " ");
|
|
||||||
b.append(name);
|
|
||||||
b.append('\n');
|
|
||||||
}
|
|
||||||
b.append('\n');
|
|
||||||
appendToDraftLog(b.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
private Path pathToDraftLog() {
|
|
||||||
File saveDir = new File("gamelogs");
|
|
||||||
if (!saveDir.exists()) {
|
|
||||||
saveDir.mkdirs();
|
|
||||||
}
|
|
||||||
return new File(saveDir, logFilename).toPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void appendToDraftLog(String data) {
|
|
||||||
try {
|
|
||||||
Files.write(pathToDraftLog(), data.getBytes(), StandardOpenOption.APPEND);
|
|
||||||
} catch (IOException ex) {
|
|
||||||
LOGGER.error(null, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static SimpleCardView getLastPick(Collection<SimpleCardView> picks) {
|
private static SimpleCardView getLastPick(Collection<SimpleCardView> picks) {
|
||||||
SimpleCardView last = null;
|
SimpleCardView last = null;
|
||||||
for (SimpleCardView pick : picks) {
|
for (SimpleCardView pick : picks) {
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
package mage.client.draft;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.StandardOpenOption;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import mage.view.DraftView;
|
||||||
|
|
||||||
|
public class DraftPickLogger {
|
||||||
|
|
||||||
|
private static final Logger LOGGER = Logger.getLogger(DraftPickLogger.class);
|
||||||
|
|
||||||
|
private final Path logPath;
|
||||||
|
private final boolean logging;
|
||||||
|
private boolean headerWritten = false;
|
||||||
|
|
||||||
|
public DraftPickLogger(File directory, String logFilename) {
|
||||||
|
this.logging = true;
|
||||||
|
if (!directory.exists()) {
|
||||||
|
directory.mkdirs();
|
||||||
|
}
|
||||||
|
this.logPath = new File(directory, logFilename).toPath();
|
||||||
|
try {
|
||||||
|
Files.write(logPath, new byte[0], StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
LOGGER.error(null, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public DraftPickLogger() {
|
||||||
|
this.logging = false;
|
||||||
|
this.logPath = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateDraft(UUID draftId, DraftView draftView) {
|
||||||
|
if (headerWritten) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
headerWritten = true;
|
||||||
|
Date now = new Date();
|
||||||
|
SimpleDateFormat formatter = new SimpleDateFormat("M/d/yyyy h:mm:ss a");
|
||||||
|
StringBuilder buffer = new StringBuilder()
|
||||||
|
.append("Event #: ").append(draftId).append("\n")
|
||||||
|
.append("Time: ").append(formatter.format(now)).append('\n');
|
||||||
|
buffer.append("Players:\n");
|
||||||
|
for (String player : draftView.getPlayers()) {
|
||||||
|
buffer.append(" ").append(player).append('\n');
|
||||||
|
}
|
||||||
|
buffer.append('\n');
|
||||||
|
appendToDraftLog(buffer.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void logPick(String setCode, int packNo, int pickNo, String pick, String[] currentBooster) {
|
||||||
|
StringBuilder b = new StringBuilder();
|
||||||
|
if (pickNo == 1) {
|
||||||
|
b.append("------ ").append(setCode).append(" ------\n\n");
|
||||||
|
}
|
||||||
|
b.append("Pack ").append(packNo).append(" pick ").append(pickNo).append(":\n");
|
||||||
|
for (String name : currentBooster) {
|
||||||
|
b.append(pick.equals(name) ? "--> " : " ");
|
||||||
|
b.append(name);
|
||||||
|
b.append('\n');
|
||||||
|
}
|
||||||
|
b.append('\n');
|
||||||
|
appendToDraftLog(b.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void appendToDraftLog(String data) {
|
||||||
|
if (logging) {
|
||||||
|
try {
|
||||||
|
Files.write(logPath, data.getBytes(), StandardOpenOption.APPEND);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
LOGGER.error(null, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -353,8 +353,9 @@ public class CallbackClientImpl implements CallbackClient {
|
||||||
}
|
}
|
||||||
case DRAFT_UPDATE: {
|
case DRAFT_UPDATE: {
|
||||||
DraftPanel panel = MageFrame.getDraft(callback.getObjectId());
|
DraftPanel panel = MageFrame.getDraft(callback.getObjectId());
|
||||||
|
DraftClientMessage message = (DraftClientMessage) callback.getData();
|
||||||
if (panel != null) {
|
if (panel != null) {
|
||||||
panel.updateDraft((DraftView) callback.getData());
|
panel.updateDraft(message.getDraftView());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,21 +13,12 @@ public class DraftClientMessage implements Serializable {
|
||||||
|
|
||||||
private DraftView draftView;
|
private DraftView draftView;
|
||||||
private DraftPickView draftPickView;
|
private DraftPickView draftPickView;
|
||||||
private String message;
|
|
||||||
|
|
||||||
public DraftClientMessage(DraftView draftView) {
|
public DraftClientMessage(DraftView draftView, DraftPickView draftPickView) {
|
||||||
this.draftView = draftView;
|
this.draftView = draftView;
|
||||||
}
|
|
||||||
|
|
||||||
public DraftClientMessage(DraftPickView draftPickView) {
|
|
||||||
this.draftPickView = draftPickView;
|
this.draftPickView = draftPickView;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DraftClientMessage(DraftView draftView, String message) {
|
|
||||||
this.message = message;
|
|
||||||
this.draftView = draftView;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DraftPickView getDraftPickView() {
|
public DraftPickView getDraftPickView() {
|
||||||
return draftPickView;
|
return draftPickView;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import mage.cards.ExpansionSet;
|
import mage.cards.ExpansionSet;
|
||||||
import mage.game.draft.Draft;
|
import mage.game.draft.Draft;
|
||||||
|
import mage.game.draft.DraftCube;
|
||||||
import mage.game.draft.DraftPlayer;
|
import mage.game.draft.DraftPlayer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -17,6 +18,7 @@ public class DraftView implements Serializable {
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private final List<String> sets = new ArrayList<>();
|
private final List<String> sets = new ArrayList<>();
|
||||||
|
private final List<String> setCodes = new ArrayList<>();
|
||||||
private final int boosterNum;
|
private final int boosterNum;
|
||||||
private final int cardNum;
|
private final int cardNum;
|
||||||
private final List<String> players = new ArrayList<>();
|
private final List<String> players = new ArrayList<>();
|
||||||
|
@ -24,11 +26,14 @@ public class DraftView implements Serializable {
|
||||||
public DraftView(Draft draft) {
|
public DraftView(Draft draft) {
|
||||||
if (draft.getDraftCube() != null) {
|
if (draft.getDraftCube() != null) {
|
||||||
for (int i = 0; i < draft.getNumberBoosters(); i++) {
|
for (int i = 0; i < draft.getNumberBoosters(); i++) {
|
||||||
sets.add(draft.getDraftCube().getName());
|
DraftCube cube = draft.getDraftCube();
|
||||||
|
sets.add(cube.getName());
|
||||||
|
setCodes.add(cube.getCode());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (ExpansionSet set: draft.getSets()) {
|
for (ExpansionSet set: draft.getSets()) {
|
||||||
sets.add(set.getName());
|
sets.add(set.getName());
|
||||||
|
setCodes.add(set.getCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.boosterNum = draft.getBoosterNum();
|
this.boosterNum = draft.getBoosterNum();
|
||||||
|
@ -42,6 +47,10 @@ public class DraftView implements Serializable {
|
||||||
return sets;
|
return sets;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<String> getSetCodes() {
|
||||||
|
return setCodes;
|
||||||
|
}
|
||||||
|
|
||||||
public List<String> getPlayers() {
|
public List<String> getPlayers() {
|
||||||
return players;
|
return players;
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,8 @@ public class DraftSession {
|
||||||
if (user.isPresent()) {
|
if (user.isPresent()) {
|
||||||
if (futureTimeout != null && !futureTimeout.isDone()) {
|
if (futureTimeout != null && !futureTimeout.isDone()) {
|
||||||
int remaining = (int) futureTimeout.getDelay(TimeUnit.SECONDS);
|
int remaining = (int) futureTimeout.getDelay(TimeUnit.SECONDS);
|
||||||
user.get().fireCallback(new ClientCallback(ClientCallbackMethod.DRAFT_INIT, draft.getId(), new DraftClientMessage(getDraftPickView(remaining))));
|
user.get().fireCallback(new ClientCallback(ClientCallbackMethod.DRAFT_INIT, draft.getId(),
|
||||||
|
new DraftClientMessage(getDraftView(), getDraftPickView(remaining))));
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -60,8 +61,8 @@ public class DraftSession {
|
||||||
if (!killed) {
|
if (!killed) {
|
||||||
UserManager.instance
|
UserManager.instance
|
||||||
.getUser(userId).
|
.getUser(userId).
|
||||||
ifPresent(user -> user.fireCallback(
|
ifPresent(user -> user.fireCallback(new ClientCallback(ClientCallbackMethod.DRAFT_UPDATE, draft.getId(),
|
||||||
new ClientCallback(ClientCallbackMethod.DRAFT_UPDATE, draft.getId(), getDraftView())));
|
new DraftClientMessage(getDraftView(), null))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +71,6 @@ public class DraftSession {
|
||||||
UserManager.instance
|
UserManager.instance
|
||||||
.getUser(userId)
|
.getUser(userId)
|
||||||
.ifPresent(user -> user.fireCallback(new ClientCallback(ClientCallbackMethod.DRAFT_OVER, draft.getId())));
|
.ifPresent(user -> user.fireCallback(new ClientCallback(ClientCallbackMethod.DRAFT_OVER, draft.getId())));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +79,8 @@ public class DraftSession {
|
||||||
setupTimeout(timeout);
|
setupTimeout(timeout);
|
||||||
UserManager.instance
|
UserManager.instance
|
||||||
.getUser(userId)
|
.getUser(userId)
|
||||||
.ifPresent(user -> user.fireCallback(new ClientCallback(ClientCallbackMethod.DRAFT_PICK, draft.getId(), new DraftClientMessage(getDraftPickView(timeout)))));
|
.ifPresent(user -> user.fireCallback(new ClientCallback(ClientCallbackMethod.DRAFT_PICK, draft.getId(),
|
||||||
|
new DraftClientMessage(getDraftView(), getDraftPickView(timeout)))));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,7 @@ public abstract class DraftCube {
|
||||||
private static final Logger logger = Logger.getLogger(DraftCube.class);
|
private static final Logger logger = Logger.getLogger(DraftCube.class);
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
private final String code;
|
||||||
private static final int boosterSize = 15;
|
private static final int boosterSize = 15;
|
||||||
|
|
||||||
protected List<CardIdentity> cubeCards = new ArrayList<>();
|
protected List<CardIdentity> cubeCards = new ArrayList<>();
|
||||||
|
@ -53,12 +54,17 @@ public abstract class DraftCube {
|
||||||
|
|
||||||
public DraftCube(String name) {
|
public DraftCube(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
this.code = getClass().getSimpleName();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getCode() {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
public List<CardIdentity> getCubeCards() {
|
public List<CardIdentity> getCubeCards() {
|
||||||
return cubeCards;
|
return cubeCards;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue