Skip to content

Commit

Permalink
TibiaWikiApi 1.3.1 (#24)
Browse files Browse the repository at this point in the history
* start of new development iteration

* attempt to let the bot login

* Updating creature model with a new parameter.

* some changes

* Fix unittest (empty nodes are not sent anymore). Switching to forked jwiki version.

* Got login-in to work. Removed some misspellings in creatures.

* Reworked type parameter to templateType to prevent collision with type parameter of Item. Travis adjustment.

* Updating to correctly use Springs' dependency injection (resolves bug of logging in multiple times). Changing wiki url. Updating dependencies.

* Make the parsing of loot items smarter, since the rarity is sometimes given with uppercase text.

* Update jwiki version to 2.0.1

* preparing for release of version 1.3.1
  • Loading branch information
benjaminkomen authored Nov 10, 2018
1 parent 53c6b55 commit 122a8e8
Show file tree
Hide file tree
Showing 69 changed files with 480 additions and 217 deletions.
7 changes: 3 additions & 4 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
language: java

jdk:
- oraclejdk11
- openjdk8
- openjdk11

env:
- JAVA_VERSION=11

addons:
sonarcloud:
Expand All @@ -16,4 +15,4 @@ cache:
- '$HOME/.sonar/cache'

script:
- ./mvnw clean org.jacoco:jacoco-maven-plugin:prepare-agent install sonar:sonar -Djava.version=$JAVA_VERSION
- ./mvnw clean org.jacoco:jacoco-maven-plugin:prepare-agent install sonar:sonar -Djava.version=8
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ environment such as Git Bash. Now you can start the application by typing the fo
`java -jar target/TibiaWikiApi-1.0.0-SNAPSHOT.jar` while the current directory is the home folder of the project.
This process was tested with Maven 3.5.3 and Java 11

Alternatively and maybe easier, you can also execute: `mvn spring-boot:run` in your command line.

You can now access the REST resources using your browser or any REST client such as Postman or curl from your command line.
E.g. navigating to http://localhost:8080/corpses should give you a list of corpses.

Expand Down
18 changes: 5 additions & 13 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@

<groupId>com.tibiawiki</groupId>
<artifactId>TibiaWikiApi</artifactId>
<version>1.3.0-SNAPSHOT</version>
<version>1.3.1</version>
<packaging>jar</packaging>
<name>TibiaWikiApi</name>
<url>https://github.com/benjaminkomen/TibiaWikiApi</url>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

Expand All @@ -22,16 +22,15 @@
<slf4j.version>1.8.0-beta2</slf4j.version>
<json.version>20180813</json.version>
<lombok.version>1.18.2</lombok.version>
<jetbrains.version>16.0.2</jetbrains.version>
<jetbrains.version>16.0.3</jetbrains.version>
<streamex.version>0.6.7</streamex.version>
<junit.jupiter.version>5.3.1</junit.jupiter.version>
<mockito.version>2.0.2-beta</mockito.version>
<hamcrest.version>1.3</hamcrest.version>
<objenesis.version>2.6</objenesis.version>
<maven.surefire.plugin.version>2.22.0</maven.surefire.plugin.version>
<maven.compiler.plugin.version>3.8.0</maven.compiler.plugin.version>
<junit.platform.surefire.provider.version>1.2.0</junit.platform.surefire.provider.version>
<jwiki.version>1.6.0</jwiki.version>
<jwiki.version>2.0.1</jwiki.version>
<guava.version>26.0-jre</guava.version>
<ow2.asm.version>6.2.1</ow2.asm.version>
<swagger.jersey2.jaxrs.version>1.5.21</swagger.jersey2.jaxrs.version>
Expand Down Expand Up @@ -76,7 +75,7 @@

<!-- MediaWiki API -->
<dependency>
<groupId>fastily</groupId>
<groupId>benjaminkomen</groupId>
<artifactId>jwiki</artifactId>
<version>${jwiki.version}</version>
</dependency>
Expand Down Expand Up @@ -187,13 +186,6 @@
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.objenesis</groupId>
<artifactId>objenesis</artifactId>
<version>${objenesis.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public enum BestiaryClass implements Description {
HUMAN("Human"),
HUMANOID("Humanoid"),
LYCANTHROPE("Lycanthrope"),
LYCANTHROPE2("Lycantrophe"), // supposedly wrongly spelled
MAGICAL("Magical"),
MAMMAL("Mammal"),
PLANT("Plant"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

@SuppressWarnings("squid:S00115")
public enum BestiaryLevel {
Harmless,
Trivial,
Easy,
Medium,
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/com/tibiawiki/domain/enums/BestiaryOccurrence.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.tibiawiki.domain.enums;

import com.fasterxml.jackson.annotation.JsonValue;
import com.tibiawiki.domain.interfaces.Description;

public enum BestiaryOccurrence implements Description {

COMMON("Common"),
UNCOMMON("Uncommon"),
RARE("Rare"),
VERY_RARE("Very Rare");

private String description;

BestiaryOccurrence(String description) {
this.description = description;
}

@JsonValue
public String getDescription() {
return description;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@
import com.tibiawiki.domain.utils.TemplateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
* Conversion from Article to infoboxPartOfArticle.
*/
@Component
public class ArticleFactory {

private static final Logger log = LoggerFactory.getLogger(ArticleFactory.class);
Expand Down
60 changes: 33 additions & 27 deletions src/main/java/com/tibiawiki/domain/factories/JsonFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,31 @@
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
* Conversion from infoboxPartOfArticle to JSON.
*/
@Component
public class JsonFactory {

private static final Logger log = LoggerFactory.getLogger(JsonFactory.class);
private static final String OBJECT_TYPE = "type";
protected static final String OBJECT_TYPE_ACHIEVEMENT = "Achievement";
protected static final String OBJECT_TYPE_BOOK = "Book";
protected static final String OBJECT_TYPE_LOCATION = "Geography";
private static final String OBJECT_TYPE_HUNTING_PLACE = "Hunt";
protected static final String OBJECT_TYPE_KEY = "Key";
private static final String TEMPLATE_TYPE = "templateType";
protected static final String TEMPLATE_TYPE_ACHIEVEMENT = "Achievement";
protected static final String TEMPLATE_TYPE_BOOK = "Book";
protected static final String TEMPLATE_TYPE_LOCATION = "Geography";
private static final String TEMPLATE_TYPE_HUNTING_PLACE = "Hunt";
protected static final String TEMPLATE_TYPE_KEY = "Key";
private static final String SOUNDS = "sounds";
private static final String SPAWN_TYPE = "spawntype";
private static final String LOOT = "loot";
Expand All @@ -33,6 +40,7 @@ public class JsonFactory {
private static final String LOWER_LEVELS = "lowerlevels";
private static final List ITEMS_WITH_NO_DROPPEDBY_LIST = Arrays.asList("Gold Coin", "Platinum Coin");
private static final String INFOBOX_HEADER_PATTERN = "\\{\\{Infobox[\\s|_](.*?)[\\||\\n]";
private static final String RARITY_PATTERN = "(always|common|uncommon|semi-rare|rare|very rare|extremely rare)(|\\?)";
private static final String UNKNOWN = "Unknown";

/**
Expand All @@ -47,11 +55,11 @@ public JSONObject convertInfoboxPartOfArticleToJson(@Nullable final String infob
return new JSONObject();
}

final String objectType = getTemplateType(infoboxPartOfArticle);
final String templateType = getTemplateType(infoboxPartOfArticle);
String infoboxTemplatePartOfArticleSanitized = TemplateUtils.removeFirstAndLastLine(infoboxPartOfArticle);

// Do something special for Infobox Hunt input, to process the lowerlevels parameter
if (OBJECT_TYPE_HUNTING_PLACE.equals(objectType)) {
if (TEMPLATE_TYPE_HUNTING_PLACE.equals(templateType)) {
Optional<Map<String, String>> lowerLevelsOptional = TemplateUtils.extractLowerLevels(infoboxTemplatePartOfArticleSanitized);

if (lowerLevelsOptional.isPresent()) {
Expand All @@ -61,7 +69,7 @@ public JSONObject convertInfoboxPartOfArticleToJson(@Nullable final String infob
}

parametersAndValues.putAll(TemplateUtils.splitByParameter(infoboxTemplatePartOfArticleSanitized));
parametersAndValues.put(OBJECT_TYPE, objectType);
parametersAndValues.put(TEMPLATE_TYPE, templateType);
return enhanceJsonObject(new JSONObject(parametersAndValues));
}

Expand All @@ -85,12 +93,12 @@ protected String getTemplateType(@Nullable final String infoboxTemplatePartOfArt
@NotNull
protected JSONObject enhanceJsonObject(@NotNull JSONObject jsonObject) {

final String objectType = Optional.of(jsonObject)
.filter(j -> j.has(OBJECT_TYPE))
.map(j -> j.getString(OBJECT_TYPE))
final String templateType = Optional.of(jsonObject)
.filter(j -> j.has(TEMPLATE_TYPE))
.map(j -> j.getString(TEMPLATE_TYPE))
.orElse(UNKNOWN);

final String articleName = determineArticleName(jsonObject, objectType);
final String articleName = determineArticleName(jsonObject, templateType);

if (jsonObject.has(SOUNDS)) {
String soundsValue = jsonObject.getString(SOUNDS);
Expand All @@ -104,7 +112,7 @@ protected JSONObject enhanceJsonObject(@NotNull JSONObject jsonObject) {
jsonObject.put(SPAWN_TYPE, spawntypeArray);
}

if (jsonObject.has(LOOT) && !OBJECT_TYPE_HUNTING_PLACE.equals(objectType)) {
if (jsonObject.has(LOOT) && !TEMPLATE_TYPE_HUNTING_PLACE.equals(templateType)) {
String lootValue = jsonObject.getString(LOOT);
JSONArray lootTableArray = makeLootTableArray(lootValue);
jsonObject.put(LOOT, lootTableArray);
Expand Down Expand Up @@ -135,20 +143,20 @@ protected JSONObject enhanceJsonObject(@NotNull JSONObject jsonObject) {
* Usually the articleName is the value from the key 'name', but for books, locations or keys it is different.
*/
@NotNull
protected String determineArticleName(@Nullable JSONObject jsonObject, @Nullable String objectType) {
if (jsonObject == null || objectType == null || "".equals(objectType)) {
protected String determineArticleName(@Nullable JSONObject jsonObject, @Nullable String templateType) {
if (jsonObject == null || templateType == null || "".equals(templateType)) {
return UNKNOWN;
}

String articleName;
switch (objectType) {
case OBJECT_TYPE_BOOK:
switch (templateType) {
case TEMPLATE_TYPE_BOOK:
articleName = jsonObject.has("pagename") ? jsonObject.getString("pagename") : UNKNOWN;
break;
case OBJECT_TYPE_LOCATION:
case TEMPLATE_TYPE_LOCATION:
articleName = UNKNOWN;
break;
case OBJECT_TYPE_KEY:
case TEMPLATE_TYPE_KEY:
articleName = jsonObject.has("number") ? "Key " + jsonObject.getString("number") : UNKNOWN;
break;
default:
Expand Down Expand Up @@ -208,14 +216,12 @@ private JSONObject makeLootItemJsonObject(List<String> splitLootItem) {
Map<String, String> lootItemMap = new HashMap<>();

for (String lootItemPart : splitLootItem) {
if (Character.isUpperCase(lootItemPart.charAt(0))) {
lootItemMap.put("itemName", lootItemPart);
if (lootItemPart.toLowerCase().matches(RARITY_PATTERN)) {
lootItemMap.put("rarity", lootItemPart);
} else if (Character.isDigit(lootItemPart.charAt(0))) {
lootItemMap.put("amount", lootItemPart);
} else if (Character.isLowerCase(lootItemPart.charAt(0))) {
lootItemMap.put("rarity", lootItemPart);
} else {
log.warn("The text '{}' in Template:Loot Item could not be identified as item name, amount or rarity.", lootItemPart);
lootItemMap.put("itemName", lootItemPart);
}
}
return new JSONObject(lootItemMap);
Expand Down
Loading

0 comments on commit 122a8e8

Please sign in to comment.