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}))
0 commit comments