(can be copied to result.txt file and used to generate card deck in nanDeck)pull/16/head
| @@ -381,6 +381,8 @@ public class BggApi { | |||
| details.maxplaytime = getIntegerFromString(getValueAttribute(eElement, "maxplaytime")); | |||
| details.age = getIntegerFromString(getValueAttribute(eElement, "minage")); | |||
| // number of players recommendations | |||
| // Only saving up to 20 players | |||
| NodeList pollList = eElement.getElementsByTagName("poll"); | |||
| for(int n = 0; n < pollList.getLength(); n++) { | |||
| Node pollNode = pollList.item(n); | |||
| @@ -462,19 +464,32 @@ public class BggApi { | |||
| NodeList nodeList = pollElement.getElementsByTagName("results"); | |||
| for(int n = 0; n < nodeList.getLength(); ++n) { | |||
| Element elem = (Element)nodeList.item(n); | |||
| // TODO: numplayers can be X+ where X is the max number of players... | |||
| if(elem.hasAttribute("numplayers") && Integer.valueOf(elem.getAttribute("numplayers")) == i) { | |||
| int lastvotes = 0; | |||
| NodeList results = elem.getElementsByTagName("result"); | |||
| for(int r = 0; r < results.getLength(); ++r) { | |||
| Element result = (Element)results.item(r); | |||
| if(result.hasAttribute("value") && result.hasAttribute("numvotes")) { | |||
| Integer numvotes = Integer.valueOf(result.getAttribute("numvotes")); | |||
| if(numvotes > lastvotes) { | |||
| recommendation = recommendationValueToEnum(result.getAttribute("value")); | |||
| if(elem.hasAttribute("numplayers")) { | |||
| String attr = elem.getAttribute("numplayers"); | |||
| boolean numPlayersDoesMatch = false; | |||
| // numplayers can be X+ where X is the max number of players... | |||
| if(attr.endsWith("+")) { | |||
| attr = attr.substring(0, attr.length()-1); | |||
| if(Integer.valueOf(attr) <= i) { | |||
| numPlayersDoesMatch = true; | |||
| } | |||
| } else { | |||
| numPlayersDoesMatch = Integer.valueOf(attr) == i; | |||
| } | |||
| if(numPlayersDoesMatch) { | |||
| int lastvotes = 0; | |||
| NodeList results = elem.getElementsByTagName("result"); | |||
| for(int r = 0; r < results.getLength(); ++r) { | |||
| Element result = (Element)results.item(r); | |||
| if(result.hasAttribute("value") && result.hasAttribute("numvotes")) { | |||
| Integer numvotes = Integer.valueOf(result.getAttribute("numvotes")); | |||
| if(numvotes > lastvotes) { | |||
| recommendation = recommendationValueToEnum(result.getAttribute("value")); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -2,8 +2,8 @@ package xyz.veronie.bgg.result; | |||
| /// Holds an id and its string representation, for example for Family, Extension, Mechanic, or Category. | |||
| public class IdString { | |||
| int id; | |||
| String string; | |||
| public int id; | |||
| public String string; | |||
| public IdString(int id, String string) { | |||
| this.id = id; | |||
| @@ -14,6 +14,7 @@ import org.eclipse.swt.graphics.Image; | |||
| import org.eclipse.swt.graphics.ImageData; | |||
| import org.eclipse.swt.graphics.ImageLoader; | |||
| import xyz.veronie.bgg.result.internal.OutputResultHelper; | |||
| import xyz.veronie.bgg.ui.helpers.Resources; | |||
| public class Thing { | |||
| @@ -79,7 +80,8 @@ public class Thing { | |||
| if(imagePath != null) | |||
| return imagePath.toString(); | |||
| else | |||
| return ""; | |||
| return Paths.get(Resources.INSTANCE.getThumbsDir().toString() | |||
| + File.separator + String.valueOf(id) + ".png").toString(); | |||
| } | |||
| private void getThumbImage(int thingId) { | |||
| @@ -183,12 +185,12 @@ public class Thing { | |||
| StringBuilder str = new StringBuilder(); | |||
| // id,name,image, | |||
| str.append(Integer.toString(id)).append(","); | |||
| str.append(metaData.getName()).append(","); | |||
| str.append(getImagePath()).append(","); | |||
| OutputResultHelper.appendToResult(str, id); | |||
| OutputResultHelper.appendToResult(str, metaData.getName()); | |||
| OutputResultHelper.appendToResult(str, getImagePath()); | |||
| if(userData != null) { | |||
| str.append(userData.toResultTextLine()); | |||
| userData.appendToResult(str); | |||
| } else { | |||
| str.append(ThingUserData.emptyReplacerLine()); | |||
| } | |||
| @@ -203,4 +205,6 @@ public class Thing { | |||
| } | |||
| } | |||
| @@ -32,7 +32,9 @@ public class ThingDetails { | |||
| Integer maxplaytime; | |||
| // poll suggested_numplayers | |||
| List<Recommendation> players; // 1 to 20 | |||
| // The index in the list indicates the number of players | |||
| // Recommendation indicates how well it plays based on what the majority thinks | |||
| List<Recommendation> players; | |||
| // poll suggested_playerage | |||
| Float age_poll; | |||
| @@ -90,48 +92,53 @@ public class ThingDetails { | |||
| // designer,publisher,artist,yearpublished,minplayers,maxplayers,playingtime,minplaytime,maxplaytime, | |||
| // age,usersrated,average,bayesaverage,rank,rank_wg,numcomments,numweights,averageweight,stddev,median, | |||
| // category,mechanic, | |||
| str.append(designer).append(","); | |||
| str.append(publisher).append(","); | |||
| str.append(artist).append(","); | |||
| str.append(yearpublished).append(","); | |||
| str.append(minplayers).append(","); | |||
| str.append(maxplayers).append(","); | |||
| str.append(playingtime).append(","); | |||
| str.append(minplaytime).append(","); | |||
| str.append(maxplaytime).append(","); | |||
| str.append(age).append(","); | |||
| str.append(usersrated).append(","); | |||
| str.append(average).append(","); | |||
| str.append(OutputResultHelper.floatToResult(bayesaverage)).append(","); | |||
| str.append(rank).append(","); | |||
| str.append(rank_wg).append(","); | |||
| str.append(numcomments).append(","); | |||
| str.append(numweights).append(","); | |||
| str.append(OutputResultHelper.floatToResult(averageweight)).append(","); | |||
| str.append(OutputResultHelper.floatToResult(stddev)).append(","); | |||
| str.append(OutputResultHelper.floatToResult(median)).append(","); | |||
| str.append(category).append(","); | |||
| str.append(mechanic).append(","); | |||
| OutputResultHelper.appendToResult(str, OutputResultHelper.getFirstIdListItem(designer)); | |||
| OutputResultHelper.appendToResult(str, OutputResultHelper.getFirstIdListItem(publisher)); | |||
| OutputResultHelper.appendToResult(str, OutputResultHelper.getFirstIdListItem(artist)); | |||
| OutputResultHelper.appendToResult(str, yearpublished); | |||
| OutputResultHelper.appendToResult(str, minplayers); | |||
| OutputResultHelper.appendToResult(str, maxplayers); | |||
| OutputResultHelper.appendToResult(str, playingtime); | |||
| OutputResultHelper.appendToResult(str, minplaytime); | |||
| OutputResultHelper.appendToResult(str, maxplaytime); | |||
| OutputResultHelper.appendToResult(str, age); | |||
| OutputResultHelper.appendToResult(str, usersrated); | |||
| OutputResultHelper.appendToResult(str, average); | |||
| OutputResultHelper.appendToResult(str, bayesaverage); | |||
| OutputResultHelper.appendToResult(str, rank); | |||
| OutputResultHelper.appendToResult(str, rank_wg); | |||
| OutputResultHelper.appendToResult(str, numcomments); | |||
| OutputResultHelper.appendToResult(str, numweights); | |||
| OutputResultHelper.appendToResult(str, averageweight); | |||
| OutputResultHelper.appendToResult(str, stddev); | |||
| OutputResultHelper.appendToResult(str, median); | |||
| OutputResultHelper.appendToResult(str, category); | |||
| OutputResultHelper.appendToResult(str, mechanic); | |||
| // owned,trading,wanting,wishing | |||
| str.append(owning).append(","); | |||
| str.append(trading).append(","); | |||
| str.append(wanting).append(","); | |||
| str.append(wishing).append(","); | |||
| OutputResultHelper.appendToResult(str, owning); | |||
| OutputResultHelper.appendToResult(str, trading); | |||
| OutputResultHelper.appendToResult(str, wanting); | |||
| OutputResultHelper.appendToResult(str, wishing); | |||
| // 1player,2player,3player,4player,5player,6player,7player,8player,9player,10player, | |||
| // 11player,12player,13player,14player,15player,16player,17player,18player,19player,20player, | |||
| for(Recommendation r : players) { | |||
| str.append(r.name()).append(","); | |||
| for(int i = 0; i < players.size(); ++i) { | |||
| Recommendation r = players.get(i); | |||
| if(r != null) { | |||
| str.append(r.name()); | |||
| } | |||
| str.append(","); | |||
| } | |||
| // description,exp, | |||
| str.append(description).append(","); | |||
| str.append(expansion).append(","); | |||
| OutputResultHelper.appendToResult(str, description); | |||
| OutputResultHelper.appendToResult(str, expansion); | |||
| // basegame,reimplement,reimplement_name,reimplemented,reimplemented_name, | |||
| // contains,contains_name,iscontained,iscontained_name,integration,integration_name, | |||
| // TODO: | |||
| // str.append(basegameId).append(","); | |||
| // str.append(reimplementId).append(","); | |||
| // str.append(reimplement_name).append(","); | |||
| @@ -143,23 +150,25 @@ public class ThingDetails { | |||
| // str.append(iscontained_name).append(","); | |||
| // str.append(integration).append(","); | |||
| // str.append(integration_name).append(","); | |||
| // str.append("0,,\"\",,\"\",,\"\",,\"\",,\"\""); | |||
| // price,expansions,domain,family,age_poll | |||
| str.append(price).append(","); | |||
| str.append(expansions).append(","); | |||
| str.append(domain).append(","); | |||
| str.append(family).append(","); | |||
| str.append(age_poll); | |||
| OutputResultHelper.appendToResult(str, price); | |||
| OutputResultHelper.appendToResult(str, expansions); | |||
| OutputResultHelper.appendToResult(str, domain); | |||
| OutputResultHelper.appendToResult(str, family); | |||
| str.append(OutputResultHelper.floatToResult(age_poll)); | |||
| return str.toString(); | |||
| } | |||
| public static String emptyReplacerLine() { | |||
| return ",,,,,,,,,,,0.0,0.0,,,0,0,0.0,0.0,0.0,\"\",\"\",,,,,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\"\",\"\",0.0,,\"\",\"\",0.0"; | |||
| } | |||
| public static String resultHeader() { | |||
| return "designer,publisher,artist,yearpublished,minplayers,maxplayers,playingtime,minplaytime,maxplaytime,age,usersrated,average,bayesaverage,rank,rank_wg,numcomments,numweights,averageweight,stddev,median,category,mechanic,1player,2player,3player,4player,5player,6player,7player,8player,9player,10player,11player,12player,13player,14player,15player,16player,17player,18player,19player,20player,description,exp,price,expansions,domain,family,age_poll"; | |||
| return "designer,publisher,artist,yearpublished,minplayers,maxplayers,playingtime,minplaytime,maxplaytime,age,usersrated,average,bayesaverage,rank,rank_wg,numcomments,numweights,averageweight,stddev,median,category,mechanic,owned,trading,wanting,wishing,1player,2player,3player,4player,5player,6player,7player,8player,9player,10player,11player,12player,13player,14player,15player,16player,17player,18player,19player,20player,description,exp,price,expansions,domain,family,age_poll"; | |||
| // not doing: basegame,reimplement,reimplement_name,reimplemented,reimplemented_name,contains,contains_name,iscontained,iscontained_name,integration,integration_name, | |||
| } | |||
| @@ -134,9 +134,10 @@ public class ThingProvider { | |||
| } | |||
| } | |||
| System.out.println(Thing.makeResultHeader()); | |||
| ArrayList<Thing> thingsWithDetails = bggApi.getThingDetails(ids); | |||
| for (Thing thing2 : thingsWithDetails) { | |||
| System.out.println(thing2.toResultTxtLine()); | |||
| for (Thing thing : thingsWithDetails) { | |||
| System.out.println(thing.toResultTxtLine()); | |||
| } | |||
| } | |||
| @@ -125,14 +125,16 @@ public class ThingUserData { | |||
| this.lastmodified = lastmodified; | |||
| } | |||
| public String toResultTextLine() { | |||
| StringBuilder str = new StringBuilder(); | |||
| str.append(OutputResultHelper.floatToResult(getRating())).append(","); | |||
| str.append(getComment()).append(","); | |||
| str.append(getNumPlays()).append(","); | |||
| public void appendToResult(StringBuilder str) { | |||
| OutputResultHelper.appendToResult(str, getRating()); | |||
| OutputResultHelper.appendToResult(str, getComment()); | |||
| OutputResultHelper.appendToResult(str, getNumPlays()); | |||
| // TODO: find out how to get userweight... | |||
| } | |||
| public String toString() { | |||
| StringBuilder str = new StringBuilder(); | |||
| appendToResult(str); | |||
| return str.toString(); | |||
| } | |||
| @@ -141,7 +143,7 @@ public class ThingUserData { | |||
| } | |||
| public static String resultHeader() { | |||
| return "userrating,comment,numplays"; | |||
| return "userrating,comment,numplays,"; | |||
| } | |||
| // public Float getWeight() { | |||
| @@ -1,14 +1,60 @@ | |||
| package xyz.veronie.bgg.result.internal; | |||
| import java.util.List; | |||
| import xyz.veronie.bgg.result.IdString; | |||
| public class OutputResultHelper { | |||
| public static String floatToResult(Float rating) { | |||
| if(rating == null) { | |||
| public static String floatToResult(Float f) { | |||
| if(f == null) { | |||
| return "N/A"; | |||
| } else { | |||
| return Float.toString(rating.floatValue()); | |||
| return Float.toString(f.floatValue()); | |||
| } | |||
| } | |||
| public static String getFirstIdListItem(List<IdString> list) { | |||
| if(list != null && list.size() > 0) { | |||
| return list.get(0).string; | |||
| } | |||
| return ""; | |||
| } | |||
| public static void appendToResult(StringBuilder str, String string) { | |||
| str.append("\""); | |||
| if(string != null) { | |||
| str.append(string); | |||
| } | |||
| str.append("\","); | |||
| } | |||
| public static void appendToResult(StringBuilder str, Integer i) { | |||
| if(i != null) { | |||
| str.append(Integer.toString(i)); | |||
| } | |||
| str.append(","); | |||
| } | |||
| public static void appendToResult(StringBuilder str, Float f) { | |||
| str.append(OutputResultHelper.floatToResult(f)).append(","); | |||
| } | |||
| public static void appendToResult(StringBuilder str, List<IdString> list) { | |||
| if(list == null) { | |||
| str.append(","); | |||
| return; | |||
| } | |||
| str.append("\""); | |||
| String nanDeckSeparator = ""; | |||
| for (IdString idString : list) { | |||
| str.append(nanDeckSeparator); | |||
| nanDeckSeparator = "\\13\\"; | |||
| str.append(idString.string); | |||
| } | |||
| str.append("\","); | |||
| } | |||
| } | |||
| @@ -106,6 +106,8 @@ public class LoadGameListDialog extends Dialog { | |||
| tableViewer.setInput(thingLists); | |||
| int selection = 0; | |||
| tableViewer.setSelection(new StructuredSelection(tableViewer.getElementAt(selection)), true); | |||
| selectedName = (String)tableViewer.getStructuredSelection().getFirstElement(); | |||
| tableViewer.addSelectionChangedListener(new ISelectionChangedListener() { | |||
| @Override | |||
| @@ -87,7 +87,7 @@ public class BggUserSourceFilter { | |||
| bottomComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); | |||
| Label infoLabel = new Label(bottomComposite, SWT.LEFT); | |||
| infoLabel.setText("Select which flags are used as filter. Filters follow 'AND' rule."); | |||
| infoLabel.setText("Select which flags are used as filter. Filters follow 'AND' rule for each game."); | |||
| GridData gdInfo = new GridData(SWT.FILL, SWT.FILL, true, false); | |||
| gdInfo.horizontalSpan = 2; | |||
| infoLabel.setLayoutData(gdInfo); | |||