From 34cb26d29bade072b3e69a4566b6c6075f4452d4 Mon Sep 17 00:00:00 2001 From: James Munson Date: Mon, 24 Jun 2019 14:24:34 -0700 Subject: [PATCH] Added house host to api Signed-off-by: James Munson --- .../runelite/http/api/chat/ChatClient.java | 86 +++++++++++++++++++ .../net/runelite/http/api/chat/House.java | 47 ++++++++++ .../http/service/chat/ChatController.java | 40 +++++++++ .../http/service/chat/ChatService.java | 49 +++++++++++ 4 files changed, 222 insertions(+) create mode 100644 http-api/src/main/java/net/runelite/http/api/chat/House.java diff --git a/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java b/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java index a1cf234e28..4a38327bbe 100644 --- a/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java +++ b/http-api/src/main/java/net/runelite/http/api/chat/ChatClient.java @@ -324,4 +324,90 @@ public class ChatClient { return LAYOUT_VALIDATOR.test(layout); } + + public House[] getHosts(int world, String location) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("hosts") + .addQueryParameter("world", Integer.toString(world)) + .addQueryParameter("location", location) + .build(); + + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + if (!response.isSuccessful()) + { + throw new IOException("Unable to look up hosts!"); + } + + InputStream in = response.body().byteStream(); + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), House[].class); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + } + + public boolean submitHost(int world, String location, House house) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("hosts") + .addQueryParameter("world", Integer.toString(world)) + .addQueryParameter("location", location) + .addQueryParameter("owner", house.getOwner()) + .addQueryParameter("guildedAltar", Boolean.toString(house.isGuildedAltarPresent())) + .addQueryParameter("occultAltar", Boolean.toString(house.isOccultAltarPresent())) + .addQueryParameter("spiritTree", Boolean.toString(house.isSpiritTreePresent())) + .addQueryParameter("fairyRing", Boolean.toString(house.isFairyRingPresent())) + .addQueryParameter("wildernessObelisk", Boolean.toString(house.isWildernessObeliskPresent())) + .addQueryParameter("repairStand", Boolean.toString(house.isRepairStandPresent())) + .addQueryParameter("combatDummy", Boolean.toString(house.isCombatDummyPresent())) + .build(); + + Request request = new Request.Builder() + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + return response.isSuccessful(); + } + } + + public boolean removeHost(int world, String location, House house) throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() + .addPathSegment("chat") + .addPathSegment("hosts") + .addQueryParameter("world", Integer.toString(world)) + .addQueryParameter("location", location) + .addQueryParameter("owner", house.getOwner()) + .addQueryParameter("guildedAltar", Boolean.toString(house.isGuildedAltarPresent())) + .addQueryParameter("occultAltar", Boolean.toString(house.isOccultAltarPresent())) + .addQueryParameter("spiritTree", Boolean.toString(house.isSpiritTreePresent())) + .addQueryParameter("fairyRing", Boolean.toString(house.isFairyRingPresent())) + .addQueryParameter("wildernessObelisk", Boolean.toString(house.isWildernessObeliskPresent())) + .addQueryParameter("repairStand", Boolean.toString(house.isRepairStandPresent())) + .addQueryParameter("combatDummy", Boolean.toString(house.isCombatDummyPresent())) + .addQueryParameter("remove", Boolean.toString(true)) + .build(); + + Request request = new Request.Builder() + .post(RequestBody.create(null, new byte[0])) + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + { + return response.isSuccessful(); + } + } } diff --git a/http-api/src/main/java/net/runelite/http/api/chat/House.java b/http-api/src/main/java/net/runelite/http/api/chat/House.java new file mode 100644 index 0000000000..5ae614e129 --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/chat/House.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2019, Spedwards + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.http.api.chat; + +import lombok.Data; +import net.runelite.http.api.RuneLiteAPI; + +@Data +public class House +{ + private String owner; + private boolean guildedAltarPresent; + private boolean occultAltarPresent; + private boolean spiritTreePresent; + private boolean fairyRingPresent; + private boolean wildernessObeliskPresent; + private boolean repairStandPresent; + private boolean combatDummyPresent; + + @Override + public String toString() + { + return RuneLiteAPI.GSON.toJson(this); + } +} \ No newline at end of file diff --git a/http-service/src/main/java/net/runelite/http/service/chat/ChatController.java b/http-service/src/main/java/net/runelite/http/service/chat/ChatController.java index 52f9a69ee9..f5d32d93bc 100644 --- a/http-service/src/main/java/net/runelite/http/service/chat/ChatController.java +++ b/http-service/src/main/java/net/runelite/http/service/chat/ChatController.java @@ -26,6 +26,7 @@ package net.runelite.http.service.chat; import java.util.regex.Pattern; import com.google.common.base.Strings; +import net.runelite.http.api.chat.House; import net.runelite.http.service.util.exception.NotFoundException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -65,4 +66,43 @@ public class ChatController } return layout; } + + @PostMapping("/hosts") + public void submitHost(@RequestParam int world, @RequestParam String location, @RequestParam String owner, + @RequestParam boolean guildedAltar, @RequestParam boolean occultAltar, + @RequestParam boolean spiritTree, @RequestParam boolean fairyRing, + @RequestParam boolean wildernessObelisk, @RequestParam boolean repairStand, + @RequestParam boolean combatDummy, + @RequestParam(required = false, defaultValue = "false") boolean remove) + { + if (!location.equals("Rimmington") && !location.equals("Yanille")) + { + return; + } + + House house = new House(); + house.setOwner(owner); + house.setGuildedAltarPresent(guildedAltar); + house.setOccultAltarPresent(occultAltar); + house.setSpiritTreePresent(spiritTree); + house.setFairyRingPresent(fairyRing); + house.setWildernessObeliskPresent(wildernessObelisk); + house.setRepairStandPresent(repairStand); + house.setCombatDummyPresent(combatDummy); + + if (remove) + { + chatService.removeHost(world, location, house); + } + else + { + chatService.addHost(world, location, house); + } + } + + @GetMapping("/hosts") + public House[] getHosts(@RequestParam int world, @RequestParam String location) + { + return chatService.getHosts(world, location); + } } diff --git a/http-service/src/main/java/net/runelite/http/service/chat/ChatService.java b/http-service/src/main/java/net/runelite/http/service/chat/ChatService.java index 66d895ccfb..ebce4c49a0 100644 --- a/http-service/src/main/java/net/runelite/http/service/chat/ChatService.java +++ b/http-service/src/main/java/net/runelite/http/service/chat/ChatService.java @@ -25,7 +25,10 @@ package net.runelite.http.service.chat; import java.time.Duration; +import java.util.List; import net.runelite.http.api.chat.ChatClient; +import net.runelite.http.api.RuneLiteAPI; +import net.runelite.http.api.chat.House; import net.runelite.http.service.util.redis.RedisPool; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -68,4 +71,50 @@ public class ChatService jedis.setex("layout." + name, (int) EXPIRE.getSeconds(), layout); } } + + public void addHost(int world, String location, House house) + { + String houseJSON = house.toString(); + + String key = "hosts.w" + Integer.toString(world) + "." + location; + + try (Jedis jedis = jedisPool.getResource()) + { + jedis.rpush(key, houseJSON); + } + } + + public House[] getHosts(int world, String location) + { + List json; + String key = "hosts.w" + Integer.toString(world) + "." + location; + + try (Jedis jedis = jedisPool.getResource()) + { + json = jedis.lrange(key, 0, 25); + } + + if (json.isEmpty()) + { + return null; + } + + House[] hosts = new House[json.size()]; + for (int i = 0; i < json.size(); i++) + { + hosts[i] = RuneLiteAPI.GSON.fromJson(json.get(i), House.class); + } + return hosts; + } + + public void removeHost(int world, String location, House house) + { + String json = house.toString(); + String key = "hosts.w" + Integer.toString(world) + "." + location; + + try (Jedis jedis = jedisPool.getResource()) + { + jedis.lrem(key, 0, json); + } + } }