Skip to content
Open
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
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -75,4 +75,5 @@ node_modules/
# Application specific
/logs/
/tmp/
/cache/
/cache/
.claude/settings.local.json
44 changes: 16 additions & 28 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
plugins {
kotlin("jvm") version "2.1.0"
java
`maven-publish`
}

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(24))
languageVersion.set(JavaLanguageVersion.of(25))
}
}

Expand All @@ -24,49 +23,38 @@ version = "2.0.0-SNAPSHOT"
repositories {
mavenLocal()
mavenCentral()
maven {
setUrl("https://nexus.botwithus.net/repository/maven-snapshots/")
}
}

dependencies {
implementation("net.botwithus.api:api:1.+")
implementation("net.botwithus.imgui:imgui:1.+")
implementation("org.projectlombok:lombok:1.18.26")
implementation("com.botwithus:api:1.0-SNAPSHOT")
implementation("com.google.code.gson:gson:2.10.1")

// Logging dependencies
implementation("org.slf4j:slf4j-api:2.0.9")
testImplementation(platform("org.junit:junit-bom:5.10.0"))
testImplementation("org.junit.jupiter:junit-jupiter")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

publishing {
repositories {
maven {
url = if (project.version.toString().endsWith("SNAPSHOT")) {
uri("https://nexus.botwithus.net/repository/maven-snapshots/")
} else {
uri("https://nexus.botwithus.net/repository/maven-releases/")
}
credentials {
username = System.getenv("MAVEN_REPO_USER")
password = System.getenv("MAVEN_REPO_PASS")
}
}
}
tasks.test {
useJUnitPlatform()
}

publishing {
publications {
create<MavenPublication>("mavenJava") {
from(components["java"])

pom {
name.set("BotWithUs XAPI")
description.set("Extended API framework for BotWithUs RuneScape 3 bot development")

properties.set(mapOf(
"maven.compiler.source" to "24",
"maven.compiler.target" to "24"
"maven.compiler.source" to "25",
"maven.compiler.target" to "25"
))
}
}
}
}
repositories {
mavenLocal()
}
}
6 changes: 6 additions & 0 deletions src/main/java/net/botwithus/rs3/minimenu/Interactive.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package net.botwithus.rs3.minimenu;

public interface Interactive {
int interact(int optionIndex);
int interact(String optionText);
}
15 changes: 15 additions & 0 deletions src/main/java/net/botwithus/scripts/Info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package net.botwithus.scripts;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Info {
String name() default "";
String author() default "";
String version() default "1.0";
String description() default "";
}
12 changes: 12 additions & 0 deletions src/main/java/net/botwithus/ui/workspace/ExtInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package net.botwithus.ui.workspace;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ExtInfo {
String value() default "";
}
13 changes: 13 additions & 0 deletions src/main/java/net/botwithus/ui/workspace/Workspace.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package net.botwithus.ui.workspace;

public class Workspace {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package net.botwithus.ui.workspace;

public interface WorkspaceExtension {
default void onDraw(Workspace workspace) {
}
}
101 changes: 101 additions & 0 deletions src/main/java/net/botwithus/xapi/XApi.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package net.botwithus.xapi;

import com.botwithus.bot.api.Client;
import com.botwithus.bot.api.GameAPI;
import com.botwithus.bot.api.ScriptContext;

import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Supplier;
import java.util.stream.Collectors;

public final class XApi {

private static final ThreadLocal<ScriptContext> CONTEXT = new ThreadLocal<>();
private static final ThreadLocal<GameAPI> CURRENT_API = new ThreadLocal<>();

private XApi() {
}

public static void bind(ScriptContext context) {
ScriptContext value = Objects.requireNonNull(context, "context");
CONTEXT.set(value);
CURRENT_API.set(value.getGameAPI());
}

public static void bind(GameAPI api) {
CURRENT_API.set(Objects.requireNonNull(api, "api"));
}

public static void clear() {
CURRENT_API.remove();
CONTEXT.remove();
}

public static ScriptContext context() {
ScriptContext context = CONTEXT.get();
if (context == null) {
throw new IllegalStateException("No active ScriptContext is bound to the current thread");
}
return context;
}

public static GameAPI api() {
GameAPI api = CURRENT_API.get();
if (api != null) {
return api;
}
return context().getGameAPI();
}

public static GameAPI api(String clientName) {
return client(clientName)
.map(Client::getGameAPI)
.orElseThrow(() -> new IllegalArgumentException("Unknown client: " + clientName));
}

public static Optional<Client> client(String clientName) {
return context().getClientProvider().getClient(clientName);
}

public static Collection<Client> clients() {
return context().getClientProvider().getClients();
}

public static Map<String, GameAPI> apis() {
return clients().stream().collect(Collectors.toUnmodifiableMap(Client::getName, Client::getGameAPI));
}

public static <T> T using(GameAPI api, Supplier<T> action) {
Objects.requireNonNull(api, "api");
Objects.requireNonNull(action, "action");
GameAPI previous = CURRENT_API.get();
CURRENT_API.set(api);
try {
return action.get();
} finally {
if (previous == null) {
CURRENT_API.remove();
} else {
CURRENT_API.set(previous);
}
}
}

public static void using(GameAPI api, Runnable action) {
using(api, () -> {
action.run();
return null;
});
}

public static com.botwithus.bot.api.event.EventBus events() {
return context().getEventBus();
}

public static com.botwithus.bot.api.isc.MessageBus messageBus() {
return context().getMessageBus();
}
}
48 changes: 48 additions & 0 deletions src/main/java/net/botwithus/xapi/game/BwuWorld.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package net.botwithus.xapi.game;

import com.botwithus.bot.api.GameAPI;
import com.botwithus.bot.api.model.LoginState;
import com.botwithus.bot.api.model.World;
import net.botwithus.xapi.XApi;

import java.util.Collections;
import java.util.List;

public final class BwuWorld {

private BwuWorld() {
}

public static World getCurrent(GameAPI api) {
return api.getCurrentWorld();
}

public static World getCurrent() {
return getCurrent(XApi.api());
}

public static List<World> getAll(GameAPI api) {
List<World> worlds = api.queryWorlds(true);
return worlds == null ? Collections.emptyList() : worlds;
}

public static List<World> getAll() {
return getAll(XApi.api());
}

public static void hop(GameAPI api, int worldId) {
api.setWorld(worldId);
}

public static void hop(int worldId) {
hop(XApi.api(), worldId);
}

public static LoginState getLoginState(GameAPI api) {
return api.getLoginState();
}

public static LoginState getLoginState() {
return getLoginState(XApi.api());
}
}
Loading