Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions REFERENCE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Reference Implementation

This library includes a reference implementation that can be used as a starting point for integrating Achievables into your own project. The reference implementation provides a CLI (Command Line Interface) for registering Achievables, submitting Events, and tracking achievement progress.

## Components

The reference implementation consists of the following components:

1. `ReferencePlayer` - A simple implementation of the `AchievablePlayer` interface
2. `ReferenceAchievableManager` - An implementation of the `AchievableManager` interface with in-memory storage
3. `TestEvent` - A simple event for testing
4. `AchievablesCLI` - A CLI application for interacting with the Achievables system

## Using the CLI

To run the reference implementation:

```
java -cp achievables.jar us.mcparks.achievables.reference.AchievablesCLI
```

### Available Commands

- `help` - Show the help message
- `exit`, `quit` - Exit the application
- `register <file>` - Register an achievable from a BIGAL file
- `list` - List all registered achievables
- `player add <id> <name>` - Add a player
- `player list` - List all players
- `player remove <id>` - Remove a player
- `event <type> <player> <data>` - Submit an event
- `status <player>` - Show achievement status for a player
- `state <player> <uuid>` - Show state for a player and achievable

### Example Usage

1. Start the CLI
2. Add a player:
```
> player add player1 Alice
```
3. Register an achievable from a BIGAL file:
```
> register example.bigal
```
4. Submit events:
```
> event TestEvent player1 "Test data"
```
5. Check player's achievement status:
```
> status player1
```
6. Check player's state for a specific achievable:
```
> state player1 <uuid>
```

## Using in Your Own Project

You can use the reference implementation as a starting point for your own implementation:

1. Extend `ReferencePlayer` or create your own `AchievablePlayer` implementation
2. Use `ReferenceAchievableManager` directly or as a reference for implementing your own manager
3. Create your own event types for your specific application needs

## Example BIGAL Script

An example BIGAL script is included at `src/main/java/us/mcparks/achievables/reference/example.bigal`. This script defines a simple achievable that tracks counters for events.
24 changes: 23 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
plugins {
id 'java-library'
id 'groovy'
id "io.freefair.lombok" version "6.6.3"
}

tasks.withType(JavaCompile) {
Expand All @@ -15,6 +14,13 @@ tasks.withType(GroovyCompile) {
options.encoding = 'UTF-8'
}

test {
useJUnitPlatform()
testLogging {
events "passed", "skipped", "failed"
}
}

java {
toolchain {
languageVersion = JavaLanguageVersion.of(8)
Expand All @@ -36,6 +42,14 @@ sourceSets {
srcDirs = ['src/main/groovy', 'src/main/java']
}
}
test {
java {
srcDirs = ['src/test/java']
}
groovy {
srcDirs = ['src/test/groovy']
}
}
}

dependencies {
Expand All @@ -45,4 +59,12 @@ dependencies {
compileOnly 'org.jetbrains:annotations:24.0.0'
implementation 'org.codehaus.groovy:groovy-all:3.0.12'
implementation 'com.google.guava:guava:32.0.0-jre'

// Testing dependencies
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
testImplementation 'org.junit.platform:junit-platform-suite-api:1.8.2'
testRuntimeOnly 'org.junit.platform:junit-platform-suite-engine:1.8.2'
testImplementation 'org.mockito:mockito-core:4.5.1'
testImplementation 'org.mockito:mockito-junit-jupiter:4.5.1'
}
12 changes: 12 additions & 0 deletions run-tests.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/bin/bash

# Compile the test files directly
echo "Compiling tests..."
javac -d /tmp/reference-tests -cp \
"/home/runner/work/Achievables/Achievables/build/classes/groovy/main:/home/runner/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-api/5.8.2/4c21029217adf07e4c0d0c5e192b6bf610c94bdc/junit-jupiter-api-5.8.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-commons/1.8.2/32c8b8617c1342376fd5af2053da6410d8866861/junit-platform-commons-1.8.2.jar" \
/home/runner/work/Achievables/Achievables/src/test/java/us/mcparks/achievables/reference/ReferenceCoreTests.java

# Run the tests
echo "Running tests..."
java -cp "/tmp/reference-tests:/home/runner/work/Achievables/Achievables/build/classes/groovy/main:/home/runner/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-api/5.8.2/4c21029217adf07e4c0d0c5e192b6bf610c94bdc/junit-jupiter-api-5.8.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-commons/1.8.2/32c8b8617c1342376fd5af2053da6410d8866861/junit-platform-commons-1.8.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-engine/5.8.2/c598b4328d2f397194d11df3b1648d68d7d990e3/junit-jupiter-engine-5.8.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-engine/1.8.2/b737de09f19864bd136805c84df7999a142fec29/junit-platform-engine-1.8.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.opentest4j/opentest4j/1.2.0/28c11eb91f9b6d8e200631d46e20a7f407f2a046/opentest4j-1.2.0.jar" \
org.junit.platform.console.ConsoleLauncher --class-path /tmp/reference-tests --scan-class-path
2 changes: 2 additions & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
rootProject.name = 'Achievables'
include 'standalone-tests'
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.control.customizers.ImportCustomizer
import us.mcparks.achievables.dsl.meta.AchievableWithMeta
import us.mcparks.achievables.dsl.meta.MetaBuilder
import us.mcparks.achievables.dsl.meta.DefaultMetaBuilder
import us.mcparks.achievables.groovy.BigAlAchievable
import us.mcparks.achievables.dsl.v1_0.AchievementDslV0
import us.mcparks.achievables.utils.GroovyEvaluator
Expand Down Expand Up @@ -98,7 +99,7 @@ public final class BigalsIntegratedGroovyAchievementLanguage {
static GroovyEvaluator bigalEvaluator = createEvaluator("${AchievementDslV0.class.getName()}")
static GroovyEvaluator versionEvaluator = createEvaluator("${VersionDsl.class.getName()}")

static Supplier<MetaBuilder<?>> metaBuilderSupplier = MetaBuilder::new
static Supplier<MetaBuilder<?>> metaBuilderSupplier = DefaultMetaBuilder::new

static GroovyEvaluator createEvaluator(String... classNames) {
def importCustomizer = new ImportCustomizer()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package us.mcparks.achievables.dsl.meta

interface AchievableMeta {

String getName()
String getDescription()
}
38 changes: 38 additions & 0 deletions src/main/groovy/us/mcparks/achievables/dsl/meta/MetaBuilder.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,42 @@ package us.mcparks.achievables.dsl.meta

interface MetaBuilder<T extends AchievableMeta> {
T build();
}

class DefaultMetaBuilder implements MetaBuilder<AchievableMeta> {
private String name = ""
private String description = ""

void name(String name) {
this.name = name
}

void description(String description) {
this.description = description
}

@Override
AchievableMeta build() {
return new SimpleAchievableMeta(name, description)
}

static class SimpleAchievableMeta implements AchievableMeta {
private final String name
private final String description

SimpleAchievableMeta(String name, String description) {
this.name = name
this.description = description
}

@Override
String getName() {
return name
}

@Override
String getDescription() {
return description
}
}
}
Loading