diff --git a/SheepstarToolsV1/.idea/.gitignore b/SheepstarToolsV1/.idea/.gitignore
new file mode 100644
index 0000000..b58b603
--- /dev/null
+++ b/SheepstarToolsV1/.idea/.gitignore
@@ -0,0 +1,5 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/SheepstarToolsV1/.idea/SheepstarTools.iml b/SheepstarToolsV1/.idea/SheepstarTools.iml
new file mode 100644
index 0000000..6a147a6
--- /dev/null
+++ b/SheepstarToolsV1/.idea/SheepstarTools.iml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SheepstarToolsV1/.idea/discord.xml b/SheepstarToolsV1/.idea/discord.xml
new file mode 100644
index 0000000..30bab2a
--- /dev/null
+++ b/SheepstarToolsV1/.idea/discord.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SheepstarToolsV1/.idea/jsLibraryMappings.xml b/SheepstarToolsV1/.idea/jsLibraryMappings.xml
new file mode 100644
index 0000000..fa55301
--- /dev/null
+++ b/SheepstarToolsV1/.idea/jsLibraryMappings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SheepstarToolsV1/.idea/modules.xml b/SheepstarToolsV1/.idea/modules.xml
new file mode 100644
index 0000000..4b8515a
--- /dev/null
+++ b/SheepstarToolsV1/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SheepstarToolsV1/css/custom.css b/SheepstarToolsV1/css/custom.css
new file mode 100644
index 0000000..27e51df
--- /dev/null
+++ b/SheepstarToolsV1/css/custom.css
@@ -0,0 +1,17 @@
+body {
+ padding-top: 5rem;
+}
+
+.navbar-brand {
+ padding-left: 20px;
+}
+
+.form {
+ padding-right: 20px;
+}
+
+.starter-template {
+ padding: 3rem 1.5rem;
+ text-align: center;
+}
+
diff --git a/SheepstarToolsV1/index.html b/SheepstarToolsV1/index.html
new file mode 100644
index 0000000..400af6a
--- /dev/null
+++ b/SheepstarToolsV1/index.html
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+ Simple Sheepstar Controller
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Gift Options
+
+
+
+
+
+
Shop Options
+
+
+
+
+
+
+
User Options
+
+
+
+
+
Shortener Options
+
+
+
+
+
+
ApiKey Options
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SheepstarToolsV1/js/code.js b/SheepstarToolsV1/js/code.js
new file mode 100644
index 0000000..efe72e8
--- /dev/null
+++ b/SheepstarToolsV1/js/code.js
@@ -0,0 +1,130 @@
+function load() {
+ if (localStorage.getItem("api_url") != null) {
+ document.getElementById("api_url").value = localStorage.getItem("api_url");
+ }
+ if (localStorage.getItem("api_key") != null) {
+ document.getElementById("api_key").value = localStorage.getItem("api_key");
+ }
+}
+
+function save() {
+ localStorage.setItem("api_url", document.getElementById("api_url").value);
+ localStorage.setItem("api_key", document.getElementById("api_key").value);
+
+ sendSaveToast();
+}
+
+function sendSaveToast() {
+ const Toast = Swal.mixin({
+ toast: true,
+ position: 'top-end',
+ showConfirmButton: false,
+ timer: 3000,
+ timerProgressBar: true
+ })
+
+ Toast.fire({
+ icon: 'success',
+ title: 'Data saved successfully'
+ })
+}
+
+function sendRequest(type, endpoint, postData = {}) {
+ return $.ajax({
+ url: document.getElementById("api_url").value + "/" + endpoint,
+ type: type,
+ dataType: "json",
+ headers: {
+ Authorization: "Bearer " + document.getElementById("api_key").value
+ },
+ data: postData
+ }).then(result => {
+ handleResult(result);
+ }).catch(result => {
+ handleResult(result.responseJSON)
+ });
+}
+
+async function prepare(title, placeholder, confirm = "Execute") {
+ return await Swal.fire({
+ title: title,
+ input: "text",
+ inputPlaceholder: placeholder,
+ showCancelButton: true,
+ confirmButtonText: confirm,
+ showLoaderOnConfirm: true
+ });
+}
+
+function handleResult(result) {
+ console.log(result);
+ Swal.fire({
+ title: "Result received",
+ html: `${JSON.stringify(result, undefined, 1)}
`
+ });
+}
+
+async function createGift() {
+ let result = await prepare("Create gift", "Article ID");
+
+ if (result.isConfirmed) sendRequest("PUT", "gift", {articleID: result.value})
+}
+
+async function deleteGift() {
+ let result = await prepare("Delete gift", "Gift ID");
+
+ if (result.isConfirmed) sendRequest("DELETE", "gift/" + result.value)
+}
+
+async function getItems() {
+ let guild = await prepare("Show items", "Guild ID");
+
+ if (guild.isConfirmed) sendRequest("GET", "shop/?guildID=" +guild.value)
+}
+
+async function enableItem() {
+ let result = await prepare("Enable item", "Item ID", "Next");
+
+ if (!result.isConfirmed) return;
+
+ let guild = await prepare("Enable item", "Guild ID");
+
+ if (result.isConfirmed) sendRequest("PUT", "shop", {articleID: result.value, guildID: guild.value})
+}
+
+async function disableItem() {
+ let result = await prepare("Disable item", "Item ID", "Next");
+
+ if (!result.isConfirmed) return;
+
+ let guild = await prepare("Disable item", "Guild ID");
+
+ if (result.isConfirmed) sendRequest("DELETE", "shop", {articleID: result.value, guildID: guild.value})
+}
+
+
+async function getServer() {
+ sendRequest("GET", "user/guilds");
+}
+
+async function shortURL() {
+ let origin = await prepare("Short URL", "Original URL", "Next");
+
+ if (!origin.isConfirmed) return;
+
+ let custom = await prepare("Short URL", "Custom URL (leave empty for random)");
+
+ let optionalJSON = custom.value === "" ? {} : {custom_url: custom.value};
+
+ if (custom.isConfirmed) sendRequest("PUT", "link", {original_url: origin.value, ...optionalJSON})
+}
+
+async function deleteShortenURL() {
+ let origin = await prepare("Short URL", "Shorten Code");
+
+ if (origin.isConfirmed) sendRequest("DELETE", "link/"+origin.value)
+}
+
+async function createAPIKey() {
+ sendRequest("PUT", "apikey")
+}
\ No newline at end of file