[AB-xxx] adding wikipedia and dictionary features

This commit is contained in:
Sheldan
2023-12-28 22:27:33 +01:00
parent 8924b75530
commit d4f07bd719
34 changed files with 850 additions and 8 deletions

View File

@@ -4,4 +4,6 @@ public class WebServicesSlashCommandNames {
public static final String YOUTUBE = "youtube";
public static final String URBAN = "urban";
public static final String WEATHER = "weather";
public static final String WIKIPEDIA = "wikipedia";
public static final String DICTIONARY = "dictionary";
}

View File

@@ -8,7 +8,9 @@ public enum WebserviceFeatureDefinition implements FeatureDefinition {
YOUTUBE("youtube"),
URBAN_DICTIONARY("urban"),
THREAD_READER("threadReader"),
OPEN_WEATHER_MAP("openWeatherMap");
OPEN_WEATHER_MAP("openWeatherMap"),
WIKIPEDIA("wikipedia"),
DICTIONARY("dictionary");
private String key;

View File

@@ -0,0 +1,16 @@
package dev.sheldan.abstracto.webservices.dictionaryapi.config;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import dev.sheldan.abstracto.webservices.config.WebserviceFeatureDefinition;
import org.springframework.stereotype.Component;
@Component
public class DictionaryApiFeatureConfig implements FeatureConfig {
@Override
public FeatureDefinition getFeature() {
return WebserviceFeatureDefinition.DICTIONARY;
}
}

View File

@@ -0,0 +1,21 @@
package dev.sheldan.abstracto.webservices.dictionaryapi.exception;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.templating.Templatable;
public class DictionaryApiRequestException extends AbstractoRunTimeException implements Templatable {
public DictionaryApiRequestException(Integer responseCode) {
super(String.format("Request failure towards dictionary api %s.", responseCode));
}
@Override
public String getTemplateName() {
return "dictionary_api_request_exception";
}
@Override
public Object getTemplateModel() {
return new Object();
}
}

View File

@@ -0,0 +1,20 @@
package dev.sheldan.abstracto.webservices.dictionaryapi.exception;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.templating.Templatable;
public class NoDictionaryApiDefinitionFoundException extends AbstractoRunTimeException implements Templatable {
public NoDictionaryApiDefinitionFoundException() {
super("No dictionary api definition found.");
}
@Override
public String getTemplateName() {
return "no_dictionary_api_definition_found_exception";
}
@Override
public Object getTemplateModel() {
return new Object();
}
}

View File

@@ -0,0 +1,22 @@
package dev.sheldan.abstracto.webservices.dictionaryapi.model;
import dev.sheldan.abstracto.webservices.dictionaryapi.model.api.DictionaryApiWordDefinition;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Builder
@Setter
public class WordDefinition {
private String definition;
private String example;
public static WordDefinition fromResponseDefinition(DictionaryApiWordDefinition responseItem) {
return WordDefinition
.builder()
.example(responseItem.getExample())
.definition(responseItem.getDefinition())
.build();
}
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.webservices.dictionaryapi.model;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Builder
@Setter
public class WordMeaning {
private String word;
private List<WordDefinition> definitions;
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.abstracto.webservices.dictionaryapi.model.api;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Builder
@Setter
public class DictionaryApiResponseItem {
private String word;
private String origin;
private List<DictionaryApiWordMeaning> meanings;
}

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.webservices.dictionaryapi.model.api;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class DictionaryApiWordDefinition {
private String definition;
private String example;
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.webservices.dictionaryapi.model.api;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@Builder
public class DictionaryApiWordMeaning {
private String partOfSpeech;
private List<DictionaryApiWordDefinition> definitions;
}

View File

@@ -0,0 +1,20 @@
package dev.sheldan.abstracto.webservices.dictionaryapi.model.template;
import dev.sheldan.abstracto.webservices.dictionaryapi.model.WordDefinition;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class DictionaryDefinition {
private String definition;
private String example;
public static DictionaryDefinition fromWordDefinition(WordDefinition definition) {
return DictionaryDefinition
.builder()
.example(definition.getExample())
.definition(definition.getDefinition())
.build();
}
}

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.webservices.dictionaryapi.model.template;
import lombok.Builder;
import lombok.Getter;
import java.util.List;
@Getter
@Builder
public class DictionaryMeaning {
private String word;
private List<DictionaryDefinition> definitions;
}

View File

@@ -0,0 +1,9 @@
package dev.sheldan.abstracto.webservices.dictionaryapi.service;
import dev.sheldan.abstracto.webservices.dictionaryapi.model.WordMeaning;
import java.io.IOException;
public interface DictionaryApiService {
WordMeaning getDefinitions(String query) throws IOException;
}

View File

@@ -0,0 +1,24 @@
package dev.sheldan.abstracto.webservices.wikipedia.config;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureDefinition;
import dev.sheldan.abstracto.webservices.config.WebserviceFeatureDefinition;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
public class WikipediaFeatureConfig implements FeatureConfig {
public static final String WIKIPEDIA_LANGUAGE_KEY_SYSTEM_CONFIG_KEY = "wikipediaLanguageKey";
@Override
public FeatureDefinition getFeature() {
return WebserviceFeatureDefinition.WIKIPEDIA;
}
@Override
public List<String> getRequiredSystemConfigKeys() {
return Arrays.asList(WIKIPEDIA_LANGUAGE_KEY_SYSTEM_CONFIG_KEY);
}
}

View File

@@ -0,0 +1,20 @@
package dev.sheldan.abstracto.webservices.wikipedia.exception;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.templating.Templatable;
public class NoWikipediaArticleFoundException extends AbstractoRunTimeException implements Templatable {
public NoWikipediaArticleFoundException() {
super("No wikipedia article found.");
}
@Override
public String getTemplateName() {
return "no_wikipedia_article_found_exception";
}
@Override
public Object getTemplateModel() {
return new Object();
}
}

View File

@@ -0,0 +1,21 @@
package dev.sheldan.abstracto.webservices.wikipedia.exception;
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
import dev.sheldan.abstracto.core.templating.Templatable;
public class WikipediaRequestException extends AbstractoRunTimeException implements Templatable {
public WikipediaRequestException(Integer responseCode) {
super(String.format("Request failure towards wikipedia %s.", responseCode));
}
@Override
public String getTemplateName() {
return "wikipedia_request_exception";
}
@Override
public Object getTemplateModel() {
return new Object();
}
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.webservices.wikipedia.model;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class WikipediaArticleSummary {
private String title;
private String summary;
private String fullURL;
}

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.webservices.wikipedia.model.api;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class WikipediaResponse {
private WikipediaResponseQuery query;
}

View File

@@ -0,0 +1,25 @@
package dev.sheldan.abstracto.webservices.wikipedia.model.api;
import com.google.gson.annotations.SerializedName;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.util.Map;
@Getter
@Setter
@Builder
public class WikipediaResponsePage {
@SerializedName("pageid")
private Long pageId;
private String title;
private String extract;
@SerializedName("fullurl")
private String fullUrl;
private Map<String, String> pageprops;
public boolean isDisambiguation() {
return pageprops != null && pageprops.containsKey("disambiguation");
}
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.webservices.wikipedia.model.api;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@Builder
public class WikipediaResponseQuery {
private List<WikipediaResponsePage> pages;
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.webservices.wikipedia.model.template;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class WikipediaArticleSummaryModel {
private String summary;
private String title;
private String fullURL;
}

View File

@@ -0,0 +1,9 @@
package dev.sheldan.abstracto.webservices.wikipedia.service;
import dev.sheldan.abstracto.webservices.wikipedia.model.WikipediaArticleSummary;
import java.io.IOException;
public interface WikipediaService {
WikipediaArticleSummary getSummary(String query, String language) throws IOException;
}