Skip to content

Commit ed9ee0e

Browse files
authored
Merge pull request #328 from GigiaJ/master
Clojrsb is going to happen
2 parents 9e3eee0 + 6899e0a commit ed9ee0e

File tree

10 files changed

+802
-400
lines changed

10 files changed

+802
-400
lines changed

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,9 @@ build/
22
.gradle/
33
OsrsBot.jar
44
.idea/
5+
6+
target/*
7+
.clj-kondo/*
8+
.lsp/*
9+
10+
output/*

partial-patch.sh

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
target_file="~/Code/OsrsBot/src/main/java/net/runelite/rsb/wrappers/client_wrapper/RSClient.java"
2+
lein run 2>&1 | while read -r line; do
3+
if echo "$line" | grep -q "return type void is not compatible with"; then
4+
type=$(echo "$line" | awk '{print $9}')
5+
fi
6+
if echo "$line" | grep -q "RSClient is not abstract and does not override abstract method"; then
7+
method=$(echo "$line" | awk '{print $13}')
8+
echo "public void $method { $method; }"
9+
sed -i '$ d' "$target_file"
10+
echo "public void $method { $method; }" >> "$target_file"
11+
echo "}" >> "$target_file"
12+
fi
13+
done
14+
15+
lein run 2>&1 | while read -r line; do
16+
if echo "$line" | grep -q "return type void is not compatible with"; then
17+
type=$(echo "$line" | awk '{print $8}')
18+
echo "public $type $method { $method; }"
19+
sed -i '$ d' "$target_file"
20+
sed -i '$ d' "$target_file"
21+
echo "public $type $method { return $method; }" >> "$target_file"
22+
echo "}" >> "$target_file"
23+
fi
24+
if echo "$line" | grep -q "RSClient is not abstract and does not override abstract method"; then
25+
method=$(echo "$line" | awk '{print $13}')
26+
27+
fi
28+
done
29+
30+
31+

project.clj

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
(defn get-runelite-version []
2+
())
3+
4+
(defproject OSRSB "0.0.1"
5+
:description "A revised bot client on RuneLite (for now)"
6+
:dependencies [[org.clojure/clojure "1.10.3"]
7+
[clj-http "3.12.3"]
8+
[org.clojure/core.async "1.7.701"]
9+
[com.cemerick/pomegranate "1.1.0"]
10+
[net.runelite/client "1.10.49"]
11+
[net.runelite/cache "1.10.49"]
12+
#_[org.projectlombok/lombok "1.18.32"]
13+
#_[javassist/javassist "3.12.1.GA"]
14+
#_[net.sf.jopt-simple/jopt-simple "5.0.4"]
15+
#_[com.github.joonasvali.naturalmouse/naturalmouse "2.0.3"]
16+
#_[com.github.OSRSB/OSRSBPlugin "main-SNAPSHOT"]]
17+
:repositories {"runelite" "https://repo.runelite.net"
18+
"jitpack" "https://jitpack.io"
19+
"central" "https://repo1.maven.org/maven2/"}
20+
:jvm-opts ["--add-opens=java.base/java.lang=ALL-UNNAMED"]
21+
:source-paths ["src/main/clojure"]
22+
#_:java-source-paths #_["src/main/java"]
23+
:javac-options ["-processor" "lombok.launch.AnnotationProcessorHider$AnnotationProcessor"]
24+
:main net.runelite.rsb.launcher.core)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
(ns net.runelite.rsb.launcher.application
2+
(:require [clojure.core.async :as async :refer [chan go <! <!! >!! close!]]
3+
[clojure.string :as str]
4+
[net.runelite.rsb.launcher.botlite :as botlite])
5+
(:import #_[net.runelite.rsb.botLauncher BotLite]))
6+
7+
(def bots [])
8+
9+
(defn get-classloader
10+
"Gets the classloader of an object."
11+
[obj]
12+
((.getClassLoader (.getClass obj))))
13+
14+
(defn get-bot
15+
"Retrieves the Bot for any object loaded in its client."
16+
[obj]
17+
(doseq [bot bots]
18+
(when (== (get-classloader obj) (get-classloader bot))
19+
bot)))
20+
21+
(defn add-bot
22+
""
23+
[show-ui]
24+
(let [bot (botlite/create-botlite-instance show-ui)]
25+
(println bot)
26+
(println "Test")
27+
#_(.launch bot (into-array String ["--bot-runelite" "--developer-mode"]))
28+
#_(conj bots bot)))
29+
30+
(defn command-line-listener
31+
"Handles command-line interfacing with the client.
32+
The REPL is likely to be more immediately useful in most cases."
33+
[]
34+
(go (loop [command (str/trim (read-line))]
35+
(case (first (str/split (str/lower-case command) #" "))
36+
"runscript" (println "runscript")
37+
"stopscript" (println "stopscript")
38+
"addbot" (do
39+
(println "Adding bot")
40+
(add-bot true))
41+
"checkstate" (println "checkstate")
42+
(println "Invalid command"))
43+
(recur (str/trim (read-line))))))
44+
45+
(defn start
46+
"Parses command-line arguments passed to the program and then passes the remaining
47+
to the command-line-listener method to continue handling the next inputs if applicable."
48+
[args]
49+
(println args)
50+
(cond
51+
(contains? args "--bot-runelite")
52+
(do
53+
(add-bot true)
54+
(command-line-listener))
55+
(contains? args "--salsa-bowl")
56+
(println "Random Behavior")
57+
#_(println "S")
58+
#_(.main Runelite (into-array String args))))
59+
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
(ns net.runelite.rsb.launcher.botlite
2+
(:require [clojure.core.async :as async :refer [chan go >! <! >!! close!]]
3+
[clj-http.client :as client]
4+
[clojure.java.shell :refer [sh]]
5+
[clojure.string :as str]
6+
[clojure.java.io :as io]
7+
[cemerick.pomegranate :as pomegranate]
8+
[cemerick.pomegranate.aether :as aether])
9+
(:import
10+
[clojure.lang DynamicClassLoader]
11+
[java.io File]))
12+
13+
(defn classloader-classpath [classloader]
14+
(->> (seq (.getURLs classloader))
15+
(map #(.getPath %))
16+
(clojure.string/join ":")))
17+
18+
(defn get-runelite-version []
19+
(let [url "http://repo.runelite.net/net/runelite/client/maven-metadata.xml"
20+
response (client/get url {:as :stream})]
21+
(with-open [reader (io/reader (:body response))]
22+
(some #(when (str/includes? % "<release>")
23+
(str/trim (str/replace % #"</?release>" "")))
24+
(line-seq reader)))))
25+
26+
(defn add-dependency [classloader group-id artifact-id version]
27+
(pomegranate/add-dependencies
28+
:classloader classloader
29+
:coordinates [[(symbol (str group-id "/" artifact-id)) version]]
30+
:repositories (merge aether/maven-central
31+
{"clojars" "https://repo.clojars.org/"
32+
"jitpack" "https://jitpack.io"
33+
"central" "https://repo1.maven.org/maven2/"
34+
"runelite" "https://repo.runelite.net"})))
35+
36+
37+
(defn find-lombok-jar [classloader]
38+
(->> (seq (.getURLs classloader))
39+
(map #(.getPath %))
40+
(filter #(re-matches #".*lombok-.*\.jar$" %))
41+
first))
42+
43+
44+
(defn compile-java-files [classloader]
45+
(spit "java-files.txt"
46+
(str/join "\n"
47+
(map #(.getPath %)
48+
(filter #(str/ends-with? (.getName %) ".java")
49+
(file-seq (io/file "src/main/java"))))))
50+
(let [lombok-jar (find-lombok-jar classloader)
51+
processorpath (if lombok-jar
52+
lombok-jar
53+
(throw (Exception. "Lombok JAR not found on classpath")))]
54+
(sh "javac" "-d" "output" "-cp" (classloader-classpath classloader) "-processorpath" processorpath "@java-files.txt")))
55+
56+
(defn handle-deps [classloader]
57+
(add-dependency classloader "net.runelite" "client" (get-runelite-version))
58+
(add-dependency classloader "net.runelite" "cache" (get-runelite-version))
59+
(add-dependency classloader "org.clojure" "clojure" "1.10.3")
60+
(add-dependency classloader "org.slf4j" "slf4j-simple" "1.7.36")
61+
(add-dependency classloader "org.projectlombok" "lombok" "1.18.32")
62+
(add-dependency classloader "com.github.joonasvali.naturalmouse" "naturalmouse" "2.0.3")
63+
(add-dependency classloader "com.github.OSRSB" "OSRSBPlugin" "main-SNAPSHOT")
64+
(add-dependency classloader "javassist" "javassist" "3.12.1.GA")
65+
(add-dependency classloader "net.sf.jopt-simple" "jopt-simple" "5.0.4"))
66+
67+
(defn instantiate-class [lc]
68+
(.newInstance lc))
69+
70+
(defn get-injector [lc]
71+
(let [injector (.getDeclaredField lc "injector")]
72+
(.setAccessible injector true)
73+
(.get injector nil)))
74+
75+
(def output-dir (File. "output"))
76+
77+
(defn list-all-dirs [dir]
78+
(let [dirs (file-seq dir)]
79+
(filter #(.isDirectory %) dirs)))
80+
81+
(defn add-dirs-to-classloader [classloader dirs]
82+
(doseq [dir dirs]
83+
(let [url (.toURL (.toURI dir))]
84+
(.addURL classloader url))))
85+
86+
(defn create-botlite-instance [show-ui]
87+
(let [class-name "net.runelite.rsb.botLauncher.BotLite"
88+
class-loader (DynamicClassLoader. (ClassLoader/getSystemClassLoader))
89+
deps (handle-deps class-loader)
90+
outputDeps (add-dirs-to-classloader class-loader (list-all-dirs output-dir))
91+
javaDeps (compile-java-files class-loader)
92+
loaded-class (.loadClass class-loader class-name)
93+
emptylite (instantiate-class loaded-class)
94+
test (.launch emptylite (into-array String ["--bot-runelite" "--developer-mode"]))
95+
botlite (.getInjectorInstance emptylite)]
96+
#_(.launch botlite (into-array String ["--bot-runelite" "--developer-mode"]))
97+
(.init botlite true)
98+
{:class-loader class-loader
99+
:loaded-class loaded-class
100+
:class-name class-name
101+
:empty-class emptylite
102+
:botlite botlite}))
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
(ns net.runelite.rsb.launcher.core
2+
(:require [clj-http.client :as client]
3+
[clojure.java.io :as io] [clojure.string :as str]
4+
[cemerick.pomegranate :as pomegranate]
5+
[cemerick.pomegranate.aether :as aether]
6+
[net.runelite.rsb.launcher.application :as app]
7+
)
8+
(:import [net.runelite.rsb.botLauncher Application])
9+
(:gen-class))
10+
11+
(defn get-runelite-version []
12+
(let [url "http://repo.runelite.net/net/runelite/client/maven-metadata.xml"
13+
response (client/get url {:as :stream})]
14+
(with-open [reader (io/reader (:body response))]
15+
(some #(when (str/includes? % "<release>")
16+
(str/trim (str/replace % #"</?release>" "")))
17+
(line-seq reader)))))
18+
19+
(defn add-dependency [group-id artifact-id version]
20+
(let [current-thread (Thread/currentThread)
21+
context-loader (.getContextClassLoader current-thread)]
22+
(try
23+
(.setContextClassLoader current-thread (clojure.lang.DynamicClassLoader. context-loader))
24+
(pomegranate/add-dependencies
25+
:coordinates [[(symbol (str group-id "/" artifact-id)) version]]
26+
:repositories (merge aether/maven-central
27+
{"clojars" "https://repo.clojars.org/"
28+
"runelite" "https://repo.runelite.net"}))
29+
(finally
30+
(.setContextClassLoader current-thread context-loader)))))
31+
32+
(defn handle-deps []
33+
(add-dependency "net.runelite" "client" (get-runelite-version))
34+
(add-dependency "net.runelite" "cache" (get-runelite-version))
35+
(add-dependency "org.projectlombok" "lombok" "1.18.24")
36+
(add-dependency "javassist" "javassist" "3.12.1.GA")
37+
(add-dependency "net.sf.jopt-simple" "jopt-simple" "5.0.4"))
38+
39+
(defn -main [& args]
40+
(handle-deps) ;; This will be used when we convert ALL code from Java and can do runtime compilation only
41+
(app/start (set args))
42+
#_(Application/main (into-array String args)))

src/main/java/net/runelite/rsb/botLauncher/Application.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,10 @@ public class Application {
2626
* @throws Throwable Any error that might be thrown
2727
*/
2828
public static void main(final String[] args) throws Throwable {
29-
JnREPL.startRepl();
3029
preParser = new ArgumentPreParser(args);
3130
if (preParser.contains("--bot-runelite")) {
3231
addBot(preParser.contains("--headless"));
33-
checkForCacheAndLoad();
32+
// checkForCacheAndLoad();
3433
CLIHandler.handleCLI();
3534
} else {
3635
net.runelite.client.RuneLite.main(args);

src/main/java/net/runelite/rsb/wrappers/client_wrapper/BaseClientWrapper.java

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package net.runelite.rsb.wrappers.client_wrapper;
22

33
import net.runelite.api.*;
4-
import net.runelite.api.Menu;
5-
import net.runelite.api.Point;
64
import net.runelite.api.annotations.Varp;
75
import net.runelite.api.clan.ClanChannel;
86
import net.runelite.api.clan.ClanSettings;
@@ -17,21 +15,31 @@
1715
import net.runelite.api.widgets.WidgetModalMode;
1816
import net.runelite.api.worldmap.MapElementConfig;
1917
import net.runelite.api.worldmap.WorldMap;
18+
import net.runelite.api.RuneLiteObjectController;
2019

2120
import javax.annotation.Nonnull;
2221
import javax.annotation.Nullable;
2322
import java.applet.Applet;
2423
import java.awt.*;
24+
import java.lang.reflect.Method;
2525
import java.util.EnumSet;
2626
import java.util.List;
2727
import java.util.Map;
2828
import java.util.function.IntPredicate;
29+
import com.jagex.oldscape.pub.OAuthApi;
30+
import com.jagex.oldscape.pub.OtlTokenRequester;
31+
import com.jagex.oldscape.pub.OtlTokenResponse;
32+
33+
34+
35+
2936

3037
/*
3138
Base class for wrapping runelite Client, along with some weird Applet shenanigans.
3239
*/
3340
@SuppressWarnings("removal")
34-
public abstract class BaseClientWrapper extends Applet implements Client {
41+
public abstract class BaseClientWrapper extends Applet implements Client, OAuthApi
42+
{
3543
public final Client wrappedClient;
3644

3745
public BaseClientWrapper(Client client) {
@@ -263,7 +271,7 @@ public int getScale() {
263271
}
264272

265273
@Override
266-
public Point getMouseCanvasPosition() {
274+
public net.runelite.api.Point getMouseCanvasPosition() {
267275
return wrappedClient.getMouseCanvasPosition();
268276
}
269277

@@ -1587,7 +1595,7 @@ public void setFreeCameraSpeed(int i) {
15871595
}
15881596

15891597
@Override
1590-
public Menu getMenu() {
1598+
public net.runelite.api.Menu getMenu() {
15911599
return wrappedClient.getMenu();
15921600
}
15931601

@@ -1620,4 +1628,34 @@ public WorldView getWorldView(int i) {
16201628
public WorldView getTopLevelWorldView() {
16211629
return wrappedClient.getTopLevelWorldView();
16221630
}
1631+
1632+
@Override
1633+
public Model applyTransformations(Model m, Animation animA, int frameA, Animation animB, int frameB) {
1634+
return wrappedClient.applyTransformations(m, animA, frameA, animB, frameB);
1635+
}
1636+
1637+
@Override
1638+
public void setDraw2DMask(int mask) {
1639+
wrappedClient.setDraw2DMask(mask);
1640+
}
1641+
1642+
@Override
1643+
public int getDraw2DMask() {
1644+
return wrappedClient.getDraw2DMask();
1645+
}
1646+
1647+
@Override
1648+
public List<MidiRequest> getActiveMidiRequests() {
1649+
return wrappedClient.getActiveMidiRequests();
1650+
}
1651+
1652+
@Override
1653+
public boolean isRuneLiteObjectRegistered(RuneLiteObjectController controller) {return wrappedClient.isRuneLiteObjectRegistered(controller);}
1654+
1655+
@Override
1656+
public void removeRuneLiteObject(RuneLiteObjectController controller) {wrappedClient.removeRuneLiteObject(controller);}
1657+
1658+
@Override
1659+
public void registerRuneLiteObject(RuneLiteObjectController controller) {wrappedClient.registerRuneLiteObject(controller);}
1660+
16231661
}

src/main/java/net/runelite/rsb/wrappers/client_wrapper/BaseWidgetWrapper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,4 +779,8 @@ public void setOnScrollWheelListener(Object... objects) {
779779
@Override
780780
public void clearActions() { wrappedWidget.clearActions(); }
781781

782+
783+
@Override
784+
public int[] getVarTransmitTrigger() { return wrappedWidget.getVarTransmitTrigger(); }
785+
782786
}

0 commit comments

Comments
 (0)