Auto Cache Downloader Ruse
Hi, I'm new to coding in general and trying to learn... I've followed a couple of guides for the RusePS, and I'm now trying to make the cache automatically download. I could've packed the cache incorrectly, but if anyone has any tips it would be very appreciated.
this is the error message I'm getting.
Code:
Ruse-PS.Com replied HTTP code: 404
Ruse-PS.Com replied HTTP code: 404
Ruse-PS.Com replied HTTP code: 404
java.io.FileNotFoundException: C:\Users\austi\RSCache\AABnKcoSIM0ehgzNa1mZgDoZa?dl=1sprites.idx (The filename, directory name, or volume label syntax is incorrect)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at CacheDownloader.downloadFile(CacheDownloader.java:75)
at CacheDownloader.init(CacheDownloader.java:30)
at Client.startUp(Client.java:11755)
at RSApplet.run(RSApplet.java:155)
at Client.run(Client.java:8662)
at java.lang.Thread.run(Unknown Source)
my CacheDownloader code is
Code:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/**
* Enchanced cache downloader
* Handles cache downloading & unzipping
* @author Gabriel Hannason
*/
public class CacheDownloader {
public static void init() {
try {
for(CACHE_DOWNLOAD_FILES cacheFile : CACHE_DOWNLOAD_FILES.values()) {
boolean exists = new File(signlink.findcachedir() + cacheFile.identifier).exists();
if(!exists) {
int total = cacheFile.file.length;
int current = 1;
for(String file : cacheFile.file) {
downloadFile(cacheFile, file, current, total);
if(file.endsWith(".zip")) {
unzip(new File(signlink.findcachedir() + file));
}
current ++;
}
new File(signlink.findcachedir() + cacheFile.identifier).createNewFile();
}
}
} catch(Exception e) {
e.printStackTrace();
}
}
public static void downloadFile(CACHE_DOWNLOAD_FILES cacheFile, String file, int current, int total) throws IOException {
String fileURL = "https://www.dropbox.com/sh/kn68gwxktxf05mz/AABnKcoSIM0ehgzNa1mZgDoZa?dl=1" + file;
String downloadingText = Client.optimizeText(cacheFile.toString().toLowerCase());
URL url = new URL(fileURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn.addRequestProperty("User-Agent", "Mozilla/4.76");
int responseCode = httpConn.getResponseCode();
// always check HTTP response code first
if (responseCode == HttpURLConnection.HTTP_OK) {
String fileName = "";
String disposition = httpConn.getHeaderField("Content-Disposition");
if (disposition != null) {
// extracts file name from header field
int index = disposition.indexOf("filename=");
if (index > 0) {
fileName = disposition.substring(index + 10,
disposition.length() - 1);
}
} else {
// extracts file name from URL
fileName = fileURL.substring(fileURL.lastIndexOf("/") + 1,
fileURL.length());
}
// opens input stream from the HTTP connection
InputStream inputStream = httpConn.getInputStream();
String saveFilePath = signlink.findcachedir() + File.separator + fileName;
// opens an output stream to save into file
FileOutputStream outputStream = new FileOutputStream(saveFilePath);
int bytesRead = -1;
byte[] buffer = new byte[4096];
long startTime = System.currentTimeMillis();
int downloaded = 0;
long numWritten = 0;
int length = httpConn.getContentLength();
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
numWritten += bytesRead;
downloaded += bytesRead;
int percentage = (int)(((double)numWritten / (double)length) * 100D);
int downloadSpeed = (int) ((downloaded / 1024) / (1 + ((System.currentTimeMillis() - startTime) / 1000)));
String s = total > 1 ? "("+current+"/"+total+")" : "";
drawLoadingText(percentage, (new StringBuilder()).append("Downloading "+downloadingText+""+s+": "+percentage+"% ").append("@ "+downloadSpeed+"Kb/s").toString());
}
outputStream.close();
inputStream.close();
} else {
System.out.println("RSPS replied HTTP code: " + responseCode);
}
httpConn.disconnect();
}
private static void drawLoadingText(int amount, String text) {
Client.loadingPercentage = amount;
Client.loadingText = text;
}
private static void unzip(final File file) {
try {
InputStream in = new BufferedInputStream(new FileInputStream(file));
ZipInputStream zin = new ZipInputStream(in);
ZipEntry e;
while((e=zin.getNextEntry()) != null) {
if(e.isDirectory()) {
(new File(signlink.findcachedir() + e.getName())).mkdir();
} else {
if (e.getName().equals(file.getName())) {
unzipPartlyArchive(zin, file.getName());
break;
}
unzipPartlyArchive(zin, signlink.findcachedir() + e.getName());
}
}
zin.close();
file.delete();
} catch(Exception e) {}
}
/**
* Unzips a partly archive
* @Param zin The zip inputstream
* @Param s The location of the zip file
* @ThroWs IOException The method can throw an IOException.
*/
private static void unzipPartlyArchive(ZipInputStream zin, String s) throws Exception {
FileOutputStream out = new FileOutputStream(s);
drawLoadingText(100, "Unpacking data..");
byte [] b = new byte[1024];
int len = 0;
while ((len = zin.read(b)) != -1) {
out.write(b,0,len);
}
out.close();
}
enum CACHE_DOWNLOAD_FILES {
IMAGES(new String[]{"sprites.idx", "sprites.dat", "icon.png"}, "cache1loaded"),
CACHE(new String[]{"ruse.dat", "ruse.idx0", "ruse.idx1", "ruse.idx2", "ruse.idx3", "ruse.idx4", "ruse.idx5", "ruse.idx6"}, "cache2loaded"),
DATA(new String[]{"data.zip"}, "cache3loaded"),
;
CACHE_DOWNLOAD_FILES(String[] file, String identifier) {
this.file = file;
this.identifier = identifier;
}
private String[] file;
private String identifier;
}
}
I've made sure to put the dl=1 for automatic download.
Also, I will give you the Signlink just incase
Code:
// Decompiled by Jad v1.5.8f. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: signlink.java
import java.applet.Applet;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URL;
import javax.sound.midi.MidiChannel;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.sound.midi.ShortMessage;
import javax.sound.midi.Synthesizer;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
public final class signlink implements Runnable {
public static void startpriv(InetAddress inetaddress) {
threadliveid = (int) (Math.random() * 99999999D);
if (active) {
try {
Thread.sleep(500L);
} catch (Exception _ex) {
}
active = false;
}
socketreq = 0;
threadreq = null;
savereq = null;
urlreq = null;
socketip = inetaddress;
Thread thread = new Thread(new signlink());
thread.setDaemon(true);
thread.start();
while (!active)
try {
Thread.sleep(50L);
} catch (Exception _ex) {
}
}
enum Position {
LEFT, RIGHT, NORMAL
};
private final int EXTERNAL_BUFFER_SIZE = 524288; // 128Kb
private Position curPosition;
public void run() {
active = true;
String s = findcachedir();
try {
cache_dat = new RandomAccessFile(s + "ruse.dat", "rw");
for (int j = 0; j < 7; j++) {
cache_idx[j] = new RandomAccessFile(s + "ruse.idx" + j, "rw");
}
} catch (Exception exception) {
exception.printStackTrace();
}
for (int i = threadliveid; threadliveid == i;) {
if (socketreq != 0) {
try {
socket = new Socket(socketip, socketreq);
} catch (Exception _ex) {
socket = null;
}
socketreq = 0;
} else if (threadreq != null) {
Thread thread = new Thread(threadreq);
thread.setDaemon(true);
thread.start();
thread.setPriority(threadreqpri);
threadreq = null;
} else if (savereq != null) {
if (savebuf != null)
try {
FileOutputStream fileoutputstream = new FileOutputStream(s + savereq);
fileoutputstream.write(savebuf, 0, savelen);
fileoutputstream.close();
} catch (Exception _ex) {
}
if (waveplay) {
String wave = s + savereq;
waveplay = false;
AudioInputStream audioInputStream = null;
try {
audioInputStream = AudioSystem.getAudioInputStream(new File(wave));
} catch (UnsupportedAudioFileException e1) {
e1.printStackTrace();
return;
} catch (IOException e1) {
e1.printStackTrace();
return;
}
AudioFormat format = audioInputStream.getFormat();
SourceDataLine auline = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
try {
auline = (SourceDataLine) AudioSystem.getLine(info);
auline.open(format);
} catch (LineUnavailableException e) {
e.printStackTrace();
return;
} catch (Exception e) {
e.printStackTrace();
return;
}
if (auline.isControlSupported(FloatControl.Type.PAN)) {
FloatControl pan = (FloatControl) auline.getControl(FloatControl.Type.PAN);
if (curPosition == Position.RIGHT)
pan.setValue(1.0f);
else if (curPosition == Position.LEFT)
pan.setValue(-1.0f);
}
auline.start();
int nBytesRead = 0;
byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
try {
while (nBytesRead != -1) {
nBytesRead = audioInputStream.read(abData, 0, abData.length);
if (nBytesRead >= 0)
auline.write(abData, 0, nBytesRead);
}
} catch (IOException e) {
e.printStackTrace();
return;
} finally {
auline.drain();
auline.close();
}
}
if (midiplay) {
midi = s + savereq;
try {
if (music != null) {
music.stop();
music.close();
}
playMidi(midi);
} catch (Exception ex) {
ex.printStackTrace();
}
midiplay = false;
}
savereq = null;
} else if (urlreq != null) {
try {
System.out.println("urlstream");
urlstream = new DataInputStream((new URL(mainapp.getCodeBase(), urlreq)).openStream());
} catch (Exception _ex) {
urlstream = null;
}
urlreq = null;
}
try {
Thread.sleep(50L);
} catch (Exception _ex) {
}
}
}
/**
* Plays the specified midi sequence.
*
* @Param location
*/
private void playMidi(String location) {
music = null;
synthesizer = null;
sequence = null;
File midiFile = new File(location);
try {
sequence = MidiSystem.getSequence(midiFile);
music = MidiSystem.getSequencer();
music.open();
music.setSequence(sequence);
} catch (Exception e) {
System.err.println("Problem loading MIDI file.");
e.printStackTrace();
return;
}
if (music instanceof Synthesizer) {
synthesizer = (Synthesizer) music;
} else {
try {
synthesizer = MidiSystem.getSynthesizer();
synthesizer.open();
if (synthesizer.getDefaultSoundbank() == null) {
music.getTransmitter().setReceiver(MidiSystem.getReceiver());
} else {
music.getTransmitter().setReceiver(synthesizer.getReceiver());
}
} catch (Exception e) {
e.printStackTrace();
return;
}
}
music.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);
music.start();
}
/**
* Sets the volume for the midi synthesizer.
*
* @Param value
*/
public static void setVolume(int value) throws MidiUnavailableException {
int CHANGE_VOLUME = 7;
midiVolume = value;
synthesizer = MidiSystem.getSynthesizer();
if (synthesizer.getDefaultSoundbank() == null) {
try {
ShortMessage volumeMessage = new ShortMessage();
for (int i = 0; i < 16; i++) {
volumeMessage.setMessage(ShortMessage.CONTROL_CHANGE, i, CHANGE_VOLUME, midiVolume);
volumeMessage.setMessage(ShortMessage.CONTROL_CHANGE, i, 39, midiVolume);
MidiSystem.getReceiver().send(volumeMessage, -1);
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
MidiChannel[] channels = synthesizer.getChannels();
for (int c = 0; channels != null && c < channels.length; c++) {
channels[c].controlChange(CHANGE_VOLUME, midiVolume);
channels[c].controlChange(39, midiVolume);
}
}
}
public static Sequencer music = null;
public static Sequence sequence = null;
public static Synthesizer synthesizer;
public static String findcachedir() {
String cacheLoc = System.getProperty("user.home") + "/RSCache/"; //"./cache/";
File cacheDir = new File(cacheLoc);
if(!cacheDir.exists()) {
cacheDir.mkdir();
}
return cacheLoc;
}
public static synchronized Socket opensocket(int i) throws IOException {
for (socketreq = i; socketreq != 0;)
try {
Thread.sleep(50L);
} catch (Exception _ex) {
}
if (socket == null)
throw new IOException("could not open socket");
else
return socket;
}
public static synchronized DataInputStream openurl(String s) throws IOException {
for (urlreq = s; urlreq != null;)
try {
Thread.sleep(50L);
} catch (Exception _ex) {
}
if (urlstream == null)
throw new IOException("could not open: " + s);
else
return urlstream;
}
public static synchronized void startthread(Runnable runnable, int i) {
threadreqpri = i;
threadreq = runnable;
}
public static final synchronized boolean wavesave(byte abyte0[], int i) {
if (i > 0x1e8480) {
return false;
}
if (savereq != null) {
return false;
} else {
wavepos = (wavepos + 1) % 5;
savelen = i;
savebuf = abyte0;
waveplay = true;
savereq = "sound" + wavepos + ".wav";
return true;
}
}
public static final synchronized boolean wavereplay() {
if (savereq != null) {
return false;
} else {
savebuf = null;
waveplay = true;
savereq = "sound" + wavepos + ".wav";
return true;
}
}
public static final synchronized void midisave(byte abyte0[], int i) {
if (i > 0x1e8480) {
return;
}
if (savereq != null) {
return;
} else {
midipos = (midipos + 1) % 5;
savelen = i;
savebuf = abyte0;
midiplay = true;
savereq = "jingle" + midipos + ".mid";
return;
}
}
private signlink() {
}
public static RandomAccessFile cache_dat = null;
public static final RandomAccessFile[] cache_idx = new RandomAccessFile[7];
public static Applet mainapp = null;
private static boolean active;
private static int threadliveid;
private static InetAddress socketip;
private static int socketreq;
private static Socket socket = null;
private static int threadreqpri = 1;
private static Runnable threadreq = null;
private static String urlreq = null;
private static DataInputStream urlstream = null;
private static int savelen;
private static String savereq = null;
private static byte[] savebuf = null;
private static boolean midiplay;
private static int midipos;
public static String midi = null;
public static int midiVolume;
public static int fadeMidi;
private static boolean waveplay;
private static int wavepos;
public static int wavevol;
}
I have actually gotten a little further, it downloads some files but not the data file or image files. By deleting the dL=1 and adding a / at the end of the url.