Skip to content
This repository was archived by the owner on Feb 9, 2022. It is now read-only.

Commit 9d7d734

Browse files
ExplvExplv
authored andcommitted
- Fix OSRSPriceGuide failed cast from Long
- Add PlaceholderTextField - Add RSUnits class for conversion from / to units like 1.5k, 2.45m, etc. - Add RSUnitField, enabling users to use rs units for GE price / quantity, or resource task quantity.
1 parent 4978886 commit 9d7d734

File tree

10 files changed

+207
-22
lines changed

10 files changed

+207
-22
lines changed

AIO/src/org/aio/activities/grand_exchange/GEItem.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ public class GEItem {
77
private final int price;
88

99
public GEItem(final String name, final int quantity, final int price) {
10-
1110
this.name = name;
1211
this.quantity = quantity;
1312
this.price = price;

AIO/src/org/aio/activities/grand_exchange/price_guide/OSRSPriceGuide.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,23 @@ public static Optional<Integer> getPrice(final int itemID) {
3232

3333
JSONObject itemJSON = (JSONObject) json.get("item");
3434
JSONObject currentPriceData = (JSONObject) itemJSON.get("current");
35-
int currentPrice = parsePriceStr((String) currentPriceData.get("price"));
35+
36+
Object currentPriceObj = currentPriceData.get("price");
37+
38+
int currentPrice;
39+
40+
if (currentPriceObj instanceof String) {
41+
currentPrice = parsePriceStr((String) currentPriceData.get("price"));
42+
} else if (currentPriceObj instanceof Long){
43+
currentPrice = ((Long) currentPriceObj).intValue();
44+
} else {
45+
currentPrice = (int) currentPriceObj;
46+
}
3647

3748
return Optional.of(currentPrice);
3849
}
3950
} catch (Exception e) {
51+
e.printStackTrace();
4052
System.out.println("Failed to get price from RuneScape api");
4153
}
4254
return Optional.empty();
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package org.aio.gui.fields;
2+
3+
import javax.swing.*;
4+
import javax.swing.text.Document;
5+
import java.awt.*;
6+
7+
@SuppressWarnings("serial")
8+
public class PlaceholderTextField extends JTextField {
9+
10+
private String placeholder;
11+
12+
public PlaceholderTextField() {
13+
}
14+
15+
public PlaceholderTextField(
16+
final Document pDoc,
17+
final String pText,
18+
final int pColumns) {
19+
super(pDoc, pText, pColumns);
20+
}
21+
22+
public PlaceholderTextField(final int pColumns) {
23+
super(pColumns);
24+
}
25+
26+
public PlaceholderTextField(final String pText) {
27+
super(pText);
28+
}
29+
30+
public PlaceholderTextField(final String pText, final int pColumns) {
31+
super(pText, pColumns);
32+
}
33+
34+
public String getPlaceholder() {
35+
return placeholder;
36+
}
37+
38+
@Override
39+
protected void paintComponent(final Graphics pG) {
40+
super.paintComponent(pG);
41+
42+
if (placeholder == null || placeholder.length() == 0 || getText().length() > 0) {
43+
return;
44+
}
45+
46+
final Graphics2D g = (Graphics2D) pG;
47+
g.setRenderingHint(
48+
RenderingHints.KEY_ANTIALIASING,
49+
RenderingHints.VALUE_ANTIALIAS_ON);
50+
g.setColor(getDisabledTextColor());
51+
g.drawString(placeholder, getInsets().left, pG.getFontMetrics()
52+
.getMaxAscent() + getInsets().top);
53+
}
54+
55+
public void setPlaceholder(final String s) {
56+
placeholder = s;
57+
}
58+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package org.aio.gui.fields;
2+
3+
4+
import org.aio.util.RSUnits;
5+
6+
import javax.swing.*;
7+
import java.awt.*;
8+
import java.awt.event.KeyAdapter;
9+
import java.awt.event.KeyEvent;
10+
11+
public class RSUnitField extends PlaceholderTextField {
12+
public RSUnitField() {
13+
addKeyListener(new KeyAdapter() {
14+
@Override
15+
public void keyReleased(final KeyEvent e) {
16+
validateField();
17+
}
18+
});
19+
20+
setInputVerifier(new InputVerifier() {
21+
@Override
22+
public boolean verify(final JComponent input) {
23+
return validateField();
24+
}
25+
});
26+
27+
setPlaceholder("100 / 1.2k / etc.");
28+
}
29+
30+
public long getValue() {
31+
return RSUnits.formattedToValue(getText().trim());
32+
}
33+
34+
private boolean validateField() {
35+
if (getText().trim().isEmpty()) {
36+
setBorder(BorderFactory.createLineBorder(Color.RED));
37+
return false;
38+
}
39+
40+
String text = getText().trim();
41+
42+
if (!RSUnits.UNIT_PATTERN.matcher(text).matches()) {
43+
setBorder(BorderFactory.createLineBorder(Color.RED));
44+
return false;
45+
}
46+
47+
setBorder(BorderFactory.createLineBorder(Color.BLACK));
48+
return true;
49+
}
50+
}

AIO/src/org/aio/gui/task_panels/GETaskPanel.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
import org.aio.activities.grand_exchange.price_guide.RSBuddyPriceGuide;
1010
import org.aio.gui.fields.ItemField;
1111
import org.aio.gui.fields.NumberField;
12+
import org.aio.gui.fields.RSUnitField;
1213
import org.aio.tasks.GrandExchangeTask;
1314
import org.aio.tasks.Task;
1415
import org.aio.tasks.TaskType;
16+
import org.aio.util.RSUnits;
1517
import org.json.simple.JSONObject;
1618

1719
import javax.swing.*;
@@ -28,8 +30,8 @@ public class GETaskPanel implements TaskPanel {
2830
private JPanel mainPanel;
2931
private JComboBox<GEMode> typeSelector;
3032
private ItemField itemNameField;
31-
private JTextField itemQuantityField;
32-
private JTextField itemPriceField;
33+
private RSUnitField itemQuantityField;
34+
private RSUnitField itemPriceField;
3335
private JCheckBox waitForCompletion;
3436

3537
GETaskPanel() {
@@ -63,13 +65,13 @@ public void keyReleased(final KeyEvent e) {
6365

6466
controls.add(new JLabel("Quantity:"));
6567

66-
itemQuantityField = new NumberField();
67-
itemQuantityField.setColumns(5);
68+
itemQuantityField = new RSUnitField();
69+
itemQuantityField.setColumns(10);
6870
controls.add(itemQuantityField);
6971

7072
controls.add(new JLabel("Price:"));
7173

72-
itemPriceField = new NumberField();
74+
itemPriceField = new RSUnitField();
7375
itemPriceField.setColumns(10);
7476
controls.add(itemPriceField);
7577

@@ -95,7 +97,7 @@ private void updatePriceField() {
9597
final Optional<Integer> price = getPrice(itemName, geMode);
9698

9799
if (price.isPresent()) {
98-
SwingUtilities.invokeLater(() -> itemPriceField.setText(String.valueOf(price.get())));
100+
SwingUtilities.invokeLater(() -> itemPriceField.setText(RSUnits.valueToFormatted(price.get())));
99101
} else {
100102
SwingUtilities.invokeLater(() -> itemPriceField.setText(""));
101103
}
@@ -132,10 +134,17 @@ public JPanel getPanel() {
132134
@Override
133135
public Task toTask() {
134136
GEMode geMode = (GEMode) typeSelector.getSelectedItem();
135-
GEItem geItem = new GEItem(itemNameField.getText(), Integer.parseInt(itemQuantityField.getText()), Integer.parseInt(itemPriceField.getText()));
137+
138+
GEItem geItem = new GEItem(
139+
itemNameField.getText(),
140+
(int) itemQuantityField.getValue(),
141+
(int) itemPriceField.getValue()
142+
);
143+
136144
if (geMode == GEMode.BUY) {
137145
return new GrandExchangeTask(new GEBuyActivity(geItem), geMode, geItem, waitForCompletion.isSelected());
138146
}
147+
139148
return new GrandExchangeTask(new GESellActivity(geItem), geMode, geItem, waitForCompletion.isSelected());
140149
}
141150

AIO/src/org/aio/gui/task_panels/ResourceTaskPanel.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.aio.gui.fields.ItemField;
44
import org.aio.gui.fields.NumberField;
5+
import org.aio.gui.fields.RSUnitField;
56
import org.aio.tasks.ResourceTask;
67
import org.aio.tasks.Task;
78
import org.aio.tasks.TaskType;
@@ -16,7 +17,7 @@ public class ResourceTaskPanel implements TaskPanel {
1617

1718
private JPanel mainPanel;
1819
private ItemField resourceField;
19-
private JTextField quantityField;
20+
private RSUnitField quantityField;
2021
private ActivitySelectorPanel activitySelectorPanel;
2122

2223
ResourceTaskPanel(){
@@ -36,7 +37,7 @@ public class ResourceTaskPanel implements TaskPanel {
3637

3738
bottomControls.add(new JLabel("Quantity of item:"));
3839

39-
quantityField = new NumberField();
40+
quantityField = new RSUnitField();
4041
quantityField.setColumns(5);
4142
bottomControls.add(quantityField);
4243

@@ -57,7 +58,7 @@ public Task toTask() {
5758
return new ResourceTask(
5859
activitySelectorPanel.getActivityPanel().toActivity(),
5960
resourceField.getText(),
60-
Integer.parseInt(quantityField.getText())
61+
(int) quantityField.getValue()
6162
);
6263
}
6364

AIO/src/org/aio/paint/Paint.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.aio.paint;
22

33
import org.aio.tasks.Task;
4+
import org.aio.util.RSUnits;
45
import org.aio.util.SkillTracker;
56
import org.osbot.rs07.Bot;
67
import org.osbot.rs07.api.ui.Skill;
@@ -158,8 +159,8 @@ private void drawSkillsInfo(Graphics2D g) {
158159
skill.toString(),
159160
skillTracker.getLevel(skill),
160161
skillTracker.getGainedLevels(skill),
161-
formatValue(skillTracker.getGainedXP(skill)),
162-
formatValue(skillTracker.getGainedXPPerHour(skill)));
162+
RSUnits.valueToFormatted(skillTracker.getGainedXP(skill)),
163+
RSUnits.valueToFormatted(skillTracker.getGainedXPPerHour(skill)));
163164
g.drawString(output, x, y);
164165
y += 20;
165166
}
@@ -206,10 +207,4 @@ private String formatTime(long ms) {
206207
s %= 60;
207208
return String.format("%02d:%02d:%02d", h, m, s);
208209
}
209-
210-
private String formatValue(long val) {
211-
return val > 1_000_000 ? String.format("%.2fm", ((float) val / 1_000_000)) :
212-
val > 1_000 ? String.format("%.2fk", ((float) val / 1_000)) :
213-
Long.toString(val);
214-
}
215210
}

AIO/src/org/aio/script/AIO.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
@ScriptManifest(author = "Explv", name = "Explv's AIO " + AIO.VERSION, info = "AIO", version = 0, logo = "http://i.imgur.com/58Zz0fb.png")
3030
public class AIO extends Script {
3131

32-
static final String VERSION = "v2.0.1";
32+
static final String VERSION = "v2.1.0";
3333

3434
private Gui gui;
3535
private Paint paint;

AIO/src/org/aio/tasks/GrandExchangeTask.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.aio.activities.grand_exchange.GEActivity;
44
import org.aio.activities.grand_exchange.GEItem;
55
import org.aio.activities.grand_exchange.GEMode;
6+
import org.aio.util.RSUnits;
67
import org.osbot.rs07.api.GrandExchange;
78

89
public class GrandExchangeTask extends Task {
@@ -65,7 +66,13 @@ public boolean isComplete() {
6566

6667
@Override
6768
public String toString() {
68-
return String.format("Grand Exchange task: %s %d %s for %d each", geMode.toString(), geItem.getQuantity(), geItem.getName(), geItem.getPrice());
69+
return String.format(
70+
"Grand Exchange task: %s %s %s for %s each",
71+
geMode.toString(),
72+
RSUnits.valueToFormatted(geItem.getQuantity()),
73+
geItem.getName(),
74+
RSUnits.valueToFormatted(geItem.getPrice())
75+
);
6976
}
7077

7178
@Override

AIO/src/org/aio/util/RSUnits.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.aio.util;
2+
3+
import java.util.*;
4+
import java.util.regex.Pattern;
5+
6+
public class RSUnits {
7+
8+
public static final Pattern UNIT_PATTERN = Pattern.compile("^\\d+(?:(?:\\.\\d+[kmb])|[kmb])?$");
9+
10+
private static final Map<Character, Integer> suffixMultipliers;
11+
static {
12+
// Use a LinkedHashMap to maintain insertion order (largest denomination first)
13+
Map<Character, Integer> suffixMultipliersTemp = new LinkedHashMap<>();
14+
15+
suffixMultipliersTemp.put('b', 1_000_000_000);
16+
suffixMultipliersTemp.put('m', 1_000_000);
17+
suffixMultipliersTemp.put('k', 1_000);
18+
19+
suffixMultipliers = Collections.unmodifiableMap(suffixMultipliersTemp);
20+
}
21+
22+
public static long formattedToValue(String formattedValue) {
23+
formattedValue = formattedValue.trim();
24+
25+
formattedValue = formattedValue.toLowerCase();
26+
27+
char suffix = formattedValue.charAt(formattedValue.length() - 1);
28+
29+
// If no suffix exists, assume it is already in GP
30+
if (!suffixMultipliers.containsKey(suffix)) {
31+
return Integer.parseInt(formattedValue);
32+
}
33+
34+
String valueNoSuffix = formattedValue.substring(0, formattedValue.length() - 1);
35+
36+
double valueDouble = Double.parseDouble(valueNoSuffix);
37+
38+
valueDouble = valueDouble * suffixMultipliers.get(suffix);
39+
40+
return (long) valueDouble;
41+
}
42+
43+
public static String valueToFormatted(final long value) {
44+
for (Character suffix : suffixMultipliers.keySet()) {
45+
Integer multiplier = suffixMultipliers.get(suffix);
46+
47+
if (value > multiplier) {
48+
return String.format("%.2f" + suffix, ((double) value / multiplier));
49+
}
50+
}
51+
52+
return Long.toString(value);
53+
}
54+
}

0 commit comments

Comments
 (0)