diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..8c5be79 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "discord_comissions/OdysseyBot"] + path = discord_comissions/OdysseyBot + url = git@github.com:GyllieGyllie/OdysseyBot.git diff --git a/comissions/wildestbreeding/dependency-reduced-pom.xml b/comissions/wildestbreeding/dependency-reduced-pom.xml new file mode 100644 index 0000000..7bbb8dd --- /dev/null +++ b/comissions/wildestbreeding/dependency-reduced-pom.xml @@ -0,0 +1,83 @@ + + + 4.0.0 + net.gylliegyllie + wildestbreeding + 1.0 + + ${basedir}/src/main/java + clean install + + + . + true + ${basedir}/src/main/resources/ + + + WildestBreeding + + + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + + + + maven-shade-plugin + 2.1 + + + package + + shade + + + + + + maven-antrun-plugin + + + install + + run + + + + + + + + + org.spigotmc + spigot-api + 1.13.2-R0.1-SNAPSHOT + provided + + + commons-lang + commons-lang + + + json-simple + com.googlecode.json-simple + + + guava + com.google.guava + + + bungeecord-chat + net.md-5 + + + snakeyaml + org.yaml + + + + + + diff --git a/comissions/wildestbreeding/pom.xml b/comissions/wildestbreeding/pom.xml new file mode 100644 index 0000000..bcc2c08 --- /dev/null +++ b/comissions/wildestbreeding/pom.xml @@ -0,0 +1,78 @@ + + + 4.0.0 + + net.gylliegyllie + wildestbreeding + 1.0 + + + clean install + WildestBreeding + ${basedir}/src/main/java + + + . + true + ${basedir}/src/main/resources/ + + + + + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-shade-plugin + 2.1 + + + package + + shade + + + + + + maven-antrun-plugin + + + install + + run + + + + + + + + + + + + org.spigotmc + spigot-api + 1.13.2-R0.1-SNAPSHOT + provided + + + + + com.google.code.gson + gson + 2.8.5 + compile + + + + + \ No newline at end of file diff --git a/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/Plugin.java b/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/Plugin.java new file mode 100644 index 0000000..c87eecb --- /dev/null +++ b/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/Plugin.java @@ -0,0 +1,70 @@ +package net.gylliegyllie.wildestbreeding; + +import net.gylliegyllie.wildestbreeding.commands.AnimalFeedPacket; +import net.gylliegyllie.wildestbreeding.configuration.Configuration; +import net.gylliegyllie.wildestbreeding.listeners.BreedListener; +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.tags.CustomItemTagContainer; +import org.bukkit.inventory.meta.tags.ItemTagType; +import org.bukkit.plugin.java.JavaPlugin; + +public class Plugin extends JavaPlugin { + + private Configuration configuration; + + private NamespacedKey key = new NamespacedKey(this, "feed-type"); + + @Override + public void onEnable() { + + try { + this.configuration = new Configuration(this); + } catch (Exception e) { + e.printStackTrace(); + this.getServer().getLogger().severe("Failed to load configuration!"); + this.getServer().getPluginManager().disablePlugin(this); + return; + } + + this.getServer().getPluginManager().registerEvents(new BreedListener(this), this); + + this.getCommand("animalfeed").setExecutor(new AnimalFeedPacket(this)); + + this.getLogger().info("Wildest Breeding enabled!"); + } + + @Override + public void onDisable() { + + this.getLogger().info("Wildest Breeding disabled!"); + } + + public Configuration getConfiguration() { + return this.configuration; + } + + public void addCustomFlag(ItemStack item, String value) { + ItemMeta itemMeta = item.getItemMeta(); + + if (itemMeta != null) { + itemMeta.getCustomTagContainer().setCustomTag(this.key, ItemTagType.STRING, value); + item.setItemMeta(itemMeta); + } + } + + public String getCustomFlag(ItemStack item) { + ItemMeta itemMeta = item.getItemMeta(); + + if (itemMeta != null) { + CustomItemTagContainer container = itemMeta.getCustomTagContainer(); + + if (container.hasCustomTag(this.key, ItemTagType.STRING)) { + return container.getCustomTag(this.key, ItemTagType.STRING); + } + } + + return null; + } +} diff --git a/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/commands/AnimalFeedPacket.java b/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/commands/AnimalFeedPacket.java new file mode 100644 index 0000000..0ccd88e --- /dev/null +++ b/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/commands/AnimalFeedPacket.java @@ -0,0 +1,81 @@ +package net.gylliegyllie.wildestbreeding.commands; + +import net.gylliegyllie.wildestbreeding.Plugin; +import net.gylliegyllie.wildestbreeding.configuration.FeedConfig; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +public class AnimalFeedPacket implements CommandExecutor { + + private final Plugin plugin; + + public AnimalFeedPacket(Plugin plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String commandLabel, String[] args) { + if (args.length != 3) { + sender.sendMessage(ChatColor.BLUE + "Usage: /seedpacket "); + return true; + } + + Player player = this.plugin.getServer().getPlayer(args[0]); + + if (player == null) { + sender.sendMessage(ChatColor.RED + "Player not found!"); + return true; + } + + EntityType mob; + + try { + mob = EntityType.valueOf(args[1].toUpperCase()); + } catch (Exception ignore) { + sender.sendMessage(ChatColor.RED + "Invalid mob entered!"); + return true; + } + + if (!sender.hasPermission("animalfeed." + mob.name().toLowerCase())) { + sender.sendMessage(ChatColor.RED + "No permissions!"); + return true; + } + + FeedConfig config = this.plugin.getConfiguration().getForMob(mob); + + if (config == null) { + sender.sendMessage(ChatColor.RED + "No config found for given mob?"); + return true; + } + + int amount; + + try { + amount = Integer.valueOf(args[2]); + } catch (Exception ignore) { + sender.sendMessage(ChatColor.RED + "Invalid quantity entered!"); + return true; + } + + ItemStack itemStack = new ItemStack(config.packet, amount); + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.setDisplayName(ChatColor.AQUA + config.packetName); + itemStack.setItemMeta(itemMeta); + + this.plugin.addCustomFlag(itemStack, config.mob.name()); + + player.getInventory().addItem(itemStack); + + sender.sendMessage(ChatColor.GREEN + "Successfully given packets!"); + player.sendMessage(ChatColor.GREEN + "You have received " + amount + " " + config.packetName); + + return true; + } +} diff --git a/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/configuration/Configuration.java b/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/configuration/Configuration.java new file mode 100644 index 0000000..b4fc665 --- /dev/null +++ b/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/configuration/Configuration.java @@ -0,0 +1,71 @@ +package net.gylliegyllie.wildestbreeding.configuration; + +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import net.gylliegyllie.wildestbreeding.Plugin; +import org.bukkit.entity.EntityType; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Configuration { + + private final Gson GSON = (new GsonBuilder()).setPrettyPrinting().enableComplexMapKeySerialization().create(); + + private final Plugin plugin; + + private List configs; + + private Map mobMapping = new HashMap<>(); + + public Configuration(Plugin plugin) throws Exception { + this.plugin = plugin; + + File file = new File(plugin.getDataFolder(), "config.json"); + + if (!file.exists()) { + + file.getParentFile().mkdir(); + + try (InputStream in = plugin.getResource("config.json"); + OutputStream out = new FileOutputStream(file)) { + + byte[] buf = new byte[1024]; + int len; + + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + + } + } + + try (FileReader fileReader = new FileReader(file)) { + + Type listType = new TypeToken>(){}.getType(); + this.configs = GSON.fromJson(fileReader, listType); + + } + + for (FeedConfig config : this.configs) { + this.mobMapping.put(config.mob, config); + } + } + + public List getConfigs() { + return this.configs; + } + + public FeedConfig getForMob(EntityType mob) { + return this.mobMapping.get(mob); + } +} diff --git a/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/configuration/FeedConfig.java b/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/configuration/FeedConfig.java new file mode 100644 index 0000000..137ac46 --- /dev/null +++ b/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/configuration/FeedConfig.java @@ -0,0 +1,14 @@ +package net.gylliegyllie.wildestbreeding.configuration; + +import org.bukkit.Material; +import org.bukkit.entity.EntityType; + +public class FeedConfig { + + public EntityType mob; + public Material packet; + public String packetName; + public Integer breedCooldown; + public Integer breedChance; + +} diff --git a/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/listeners/BreedListener.java b/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/listeners/BreedListener.java new file mode 100644 index 0000000..0629b16 --- /dev/null +++ b/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/listeners/BreedListener.java @@ -0,0 +1,116 @@ +package net.gylliegyllie.wildestbreeding.listeners; + +import net.gylliegyllie.wildestbreeding.Plugin; +import net.gylliegyllie.wildestbreeding.configuration.FeedConfig; +import net.gylliegyllie.wildestbreeding.utils.MobUtil; +import org.bukkit.EntityEffect; +import org.bukkit.entity.Animals; +import org.bukkit.entity.Tameable; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityBreedEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class BreedListener implements Listener { + + private final Plugin plugin; + private final Random random = new Random(); + + private List breeding = new ArrayList<>(); + + public BreedListener(Plugin plugin) { + this.plugin = plugin; + + this.plugin.getServer().getScheduler().runTaskTimer(this.plugin, () -> { + new ArrayList<>(this.breeding).forEach(entity -> { + if (entity.isLoveMode()) { + entity.playEffect(EntityEffect.LOVE_HEARTS); + } else { + breeding.remove(entity); + } + }); + }, 20L, 20L); + } + + @EventHandler + public void onRightClickMob(PlayerInteractEntityEvent event) { + if (!MobUtil.TAMABLE.contains(event.getRightClicked().getType())) { + return; + } + + FeedConfig config = this.plugin.getConfiguration().getForMob(event.getRightClicked().getType()); + + if (config == null) { + return; + } + + ItemStack hand = event.getPlayer().getInventory().getItemInMainHand(); + + if (MobUtil.BREED_MATERIAL.get(event.getRightClicked().getType()).contains(hand.getType())) { + event.setCancelled(true); + return; + } + + if (!config.mob.name().equals(this.plugin.getCustomFlag(hand))) { + return; + } + + event.setCancelled(true); + + Animals animal = (Animals) event.getRightClicked(); + + boolean breedable = !animal.isLoveMode() && animal.isAdult() && animal.canBreed(); + + if (breedable && animal instanceof Tameable) { + breedable = ((Tameable) animal).isTamed(); + } + + if (breedable) { + animal.setLoveModeTicks(30 * 20); + animal.setBreedCause(event.getPlayer().getUniqueId()); + animal.playEffect(EntityEffect.LOVE_HEARTS); + + hand.setAmount(hand.getAmount() - 1); + event.getPlayer().getInventory().setItemInMainHand(hand); + + this.breeding.add(animal); + } + } + + @EventHandler + public void onBreed(EntityBreedEvent event) { + if (!MobUtil.TAMABLE.contains(event.getEntity().getType())) { + return; + } + + FeedConfig config = this.plugin.getConfiguration().getForMob(event.getEntity().getType()); + + if (config == null) { + return; + } + + int random = this.random.nextInt(100) + 1; + + Animals mother = (Animals) event.getMother(); + Animals father = (Animals) event.getFather(); + + if (random > config.breedChance) { + event.setCancelled(true); + mother.setLoveModeTicks(0); + father.setLoveModeTicks(0); + } + + mother.setBreed(false); + father.setBreed(false); + + this.plugin.getServer().getScheduler().runTaskLater(this.plugin, () -> { + mother.setBreed(true); + father.setBreed(true); + }, config.breedCooldown * 20); + } +} diff --git a/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/utils/MobUtil.java b/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/utils/MobUtil.java new file mode 100644 index 0000000..2ed753e --- /dev/null +++ b/comissions/wildestbreeding/src/main/java/net/gylliegyllie/wildestbreeding/utils/MobUtil.java @@ -0,0 +1,46 @@ +package net.gylliegyllie.wildestbreeding.utils; + +import org.bukkit.Material; +import org.bukkit.entity.EntityType; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MobUtil { + + public final static List TAMABLE = Arrays.asList( + EntityType.CHICKEN, + EntityType.COW, + EntityType.DONKEY, + EntityType.HORSE, + EntityType.LLAMA, + EntityType.MUSHROOM_COW, + EntityType.OCELOT, + EntityType.PARROT, + EntityType.PIG, + EntityType.RABBIT, + EntityType.SHEEP, + EntityType.TURTLE, + EntityType.WOLF + ); + + public final static Map> BREED_MATERIAL = new HashMap<>(); + + static { + BREED_MATERIAL.put(EntityType.HORSE, Arrays.asList(Material.GOLDEN_APPLE, Material.GOLDEN_CARROT)); + BREED_MATERIAL.put(EntityType.DONKEY, Arrays.asList(Material.GOLDEN_APPLE, Material.GOLDEN_CARROT)); + BREED_MATERIAL.put(EntityType.SHEEP, Collections.singletonList(Material.WHEAT)); + BREED_MATERIAL.put(EntityType.COW, Collections.singletonList(Material.WHEAT)); + BREED_MATERIAL.put(EntityType.MUSHROOM_COW, Collections.singletonList(Material.WHEAT)); + BREED_MATERIAL.put(EntityType.PIG, Arrays.asList(Material.CARROT, Material.POTATO, Material.BEETROOT)); + BREED_MATERIAL.put(EntityType.CHICKEN, Arrays.asList(Material.WHEAT_SEEDS, Material.PUMPKIN_SEEDS, Material.MELON_SEEDS, Material.BEETROOT_SEEDS, Material.NETHER_WART)); + BREED_MATERIAL.put(EntityType.WOLF, Collections.singletonList(Material.BONE)); + BREED_MATERIAL.put(EntityType.OCELOT, Arrays.asList(Material.COD, Material.SALMON, Material.PUFFERFISH, Material.TROPICAL_FISH)); + BREED_MATERIAL.put(EntityType.RABBIT, Arrays.asList(Material.DANDELION, Material.CARROT, Material.GOLDEN_CARROT)); + BREED_MATERIAL.put(EntityType.LLAMA, Collections.singletonList(Material.HAY_BLOCK)); + BREED_MATERIAL.put(EntityType.TURTLE, Collections.singletonList(Material.SEAGRASS)); + } +} diff --git a/comissions/wildestbreeding/src/main/resources/config.json b/comissions/wildestbreeding/src/main/resources/config.json new file mode 100644 index 0000000..4db3f41 --- /dev/null +++ b/comissions/wildestbreeding/src/main/resources/config.json @@ -0,0 +1,93 @@ +[ + { + "mob": "CHICKEN", + "packet": "PAPER", + "packetName": "Chicken Feed", + "breedCooldown": 300, + "breedChance": 100 + }, + { + "mob": "COW", + "packet": "PAPER", + "packetName": "Cow Feed", + "breedCooldown": 300, + "breedChance": 100 + }, + { + "mob": "DONKEY", + "packet": "PAPER", + "packetName": "Donkey Feed", + "breedCooldown": 300, + "breedChance": 100 + }, + { + "mob": "HORSE", + "packet": "PAPER", + "packetName": "Horse Feed", + "breedCooldown": 300, + "breedChance": 100 + }, + { + "mob": "LLAMA", + "packet": "PAPER", + "packetName": "Llama Feed", + "breedCooldown": 300, + "breedChance": 100 + }, + { + "mob": "MUSHROOM_COW", + "packet": "PAPER", + "packetName": "Mooshroom Feed", + "breedCooldown": 300, + "breedChance": 100 + }, + { + "mob": "OCELOT", + "packet": "PAPER", + "packetName": "Ocelot Feed", + "breedCooldown": 300, + "breedChance": 100 + }, + { + "mob": "PARROT", + "packet": "PAPER", + "packetName": "Parrot Feed", + "breedCooldown": 300, + "breedChance": 100 + }, + { + "mob": "PIG", + "packet": "PAPER", + "packetName": "Pig Feed", + "breedCooldown": 300, + "breedChance": 100 + }, + { + "mob": "RABBIT", + "packet": "PAPER", + "packetName": "Rabbit Feed", + "breedCooldown": 300, + "breedChance": 100 + }, + { + "mob": "SHEEP", + "packet": "PAPER", + "packetName": "Sheep Feed", + "breedCooldown": 300, + "breedChance": 100 + }, + { + "mob": "TURTLE", + "packet": "PAPER", + "packetName": "Turtle Feed", + "breedCooldown": 300, + "breedChance": 100 + }, + { + "mob": "WOLF", + "packet": "PAPER", + "packetName": "Wolf Feed", + "breedCooldown": 300, + "breedChance": 100 + } +] \ No newline at end of file diff --git a/comissions/wildestbreeding/src/main/resources/plugin.yml b/comissions/wildestbreeding/src/main/resources/plugin.yml new file mode 100644 index 0000000..57a19ee --- /dev/null +++ b/comissions/wildestbreeding/src/main/resources/plugin.yml @@ -0,0 +1,11 @@ +name: WildestBreeding +author: GyllieGyllie +main: net.gylliegyllie.wildestbreeding.Plugin +version: 1.0 +description: Commission for WildestPartnership | Breeding overhaul +api-version: 1.13 +commands: + animalfeed: + permission: animalfeed.use + usage: /animalfeed + description: give a player animal feed \ No newline at end of file diff --git a/creator_games/grpc/dependency-reduced-pom.xml b/creator_games/grpc/dependency-reduced-pom.xml new file mode 100644 index 0000000..72aa4e5 --- /dev/null +++ b/creator_games/grpc/dependency-reduced-pom.xml @@ -0,0 +1,127 @@ + + + 4.0.0 + io.winnertakesall + grpc + GRPC + 1.0-SNAPSHOT + + ${basedir}/src/main/proto + + + kr.motd.maven + os-maven-plugin + 1.5.0.Final + + + clean install + + + . + true + ${basedir}/src/main/resources/ + + + + + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + + + + org.xolstice.maven.plugins + protobuf-maven-plugin + 0.5.1 + + + + compile + compile-custom + + + + + com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier} + grpc-java + io.grpc:protoc-gen-grpc-java:1.11.0:exe:${os.detected.classifier} + + + + maven-shade-plugin + 2.2 + + + package + + shade + + + + + com.google.guava + com.google.common + io.grpc:grpc-netty-shaded + io.grpc:grpc-core + io.grpc:grpc-context + com.google.code.gson:gson + com.google.errorprone:error_prone_annotations + com.google.code.findbugs:jsr305 + io.opencensus:opencensus-api + io.opencensus:opencensus-contrib-grpc-metrics + io.grpc:grpc-protobuf + com.google.protobuf:protobuf-java + com.google.protobuf:protobuf-java-util + com.google.api.grpc:proto-google-common-protos + io.grpc:grpc-protobuf-lite + io.grpc:grpc-stub + + + + + com.google.common + ${project.groupId}.${project.artifactId}.shaded.com.google.common + + + + + + */** + + + + + + + + + maven-resources-plugin + 2.6 + + + copy-resources-dashboard + validate + + copy-resources + + + ${basedir}/../Website/_grpc + + + src/main/proto/ + true + + + + + + + + + + UTF-8 + + + diff --git a/creator_games/grpc/pom.xml b/creator_games/grpc/pom.xml new file mode 100644 index 0000000..d064d40 --- /dev/null +++ b/creator_games/grpc/pom.xml @@ -0,0 +1,174 @@ + + + 4.0.0 + + net.gylliegyllie.creatorgames + grpc + 1.0-SNAPSHOT + GRPC + jar + + + UTF-8 + + + + + io.grpc + grpc-netty-shaded + 1.12.0 + compile + + + + io.grpc + grpc-protobuf + 1.12.0 + compile + + + + io.grpc + grpc-stub + 1.12.0 + compile + + + + com.google.guava + guava + 20.0 + compile + + + + + clean install + ${basedir}/src/main/proto + + + + . + true + ${basedir}/src/main/resources/ + + + + + + kr.motd.maven + os-maven-plugin + 1.5.0.Final + + + + + + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + + + + + org.xolstice.maven.plugins + protobuf-maven-plugin + 0.5.1 + + + com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier} + grpc-java + io.grpc:protoc-gen-grpc-java:1.11.0:exe:${os.detected.classifier} + + + + + + compile + compile-custom + + + + + + + maven-shade-plugin + 2.2 + + + + package + + shade + + + + + + com.google.guava + com.google.common + io.grpc:grpc-netty-shaded + io.grpc:grpc-core + io.grpc:grpc-context + com.google.code.gson:gson + com.google.errorprone:error_prone_annotations + com.google.code.findbugs:jsr305 + io.opencensus:opencensus-api + io.opencensus:opencensus-contrib-grpc-metrics + io.grpc:grpc-protobuf + com.google.protobuf:protobuf-java + com.google.protobuf:protobuf-java-util + com.google.api.grpc:proto-google-common-protos + io.grpc:grpc-protobuf-lite + io.grpc:grpc-stub + + + + + + com.google.common + ${project.groupId}.${project.artifactId}.shaded.com.google.common + + + + + + + */** + + + + + + + + + + maven-resources-plugin + 2.6 + + + copy-resources-dashboard + validate + + copy-resources + + + ${basedir}/../website/_grpc + + + src/main/proto/ + true + + + + + + + + + \ No newline at end of file diff --git a/creator_games/grpc/src/main/proto/common.proto b/creator_games/grpc/src/main/proto/common.proto new file mode 100644 index 0000000..87317c6 --- /dev/null +++ b/creator_games/grpc/src/main/proto/common.proto @@ -0,0 +1,61 @@ +syntax = "proto3"; + +// Creates independent Java class files for each top-level message +option java_multiple_files = true; + +// Java package to place generated Java class files in +option java_package = "net.gylliegyllie.creatorgames.grpc.common"; + +message SuccessResponse { + bool success = 1; +} + +message ExtendedSuccessResponse { + bool success = 1; + string message = 2; +} + +message ExtendedRepeatedSuccessResponse { + bool success = 1; + repeated string message = 2; +} + +message Empty {} + +message Season { + int32 season = 1; +} + +message Streamer { + string name = 1; + string link = 2; + int64 raised = 3; + int64 donations = 4; + bool dead = 5; + bool caster = 6; + string charity = 7; + int32 season = 8; + bool winner = 9; + string team = 10; +} + +message DonationItem { + int64 id = 1; + string name = 2; + string description = 3; + int32 price = 4; + bool positive = 5; + bool dead = 6; + bool buyable = 7; + int32 season = 8; + int32 last_round = 9; +} + +message Donation { + string name = 1; + string comment = 2; + string streamer = 3; + string item = 4; + int32 amount = 5; + int32 season = 6; +} \ No newline at end of file diff --git a/creator_games/grpc/src/main/proto/plugin_service.proto b/creator_games/grpc/src/main/proto/plugin_service.proto new file mode 100644 index 0000000..fc297a0 --- /dev/null +++ b/creator_games/grpc/src/main/proto/plugin_service.proto @@ -0,0 +1,104 @@ +syntax = "proto3"; + +// Creates independent Java class files for each top-level message +option java_multiple_files = true; + +// Java package to place generated Java class files in +option java_package = "net.gylliegyllie.creatorgames.grpc.pluginservice"; + +service PluginService { + rpc DonationStream(stream Message) returns (stream Message) {} +} + +message Message { + MessageType type = 1; + string streamer = 2; + + // Donations + string donator = 3; + string message = 4; + double amount = 5; + Drop drop = 6; + + // Game info + int64 start_time = 7; + int32 round = 8; +} + +enum MessageType { + NEW_DONATION = 0; + PLAYER_DIED = 1; + START_TIME = 2; + ROUND_CHANGE = 3; +} + +enum Drop { + + // Season 2 + STEAK_2 = 0; + BOOK_1 = 1; + ARROW_12 = 2; + EXP_BOTTLE_8 = 3; + GOLDEN_APPLE_1 = 4; + TNT_1 = 5; + DIAMOND_ORE_1 = 6; + GLOWSTONE_BLOCK_1 = 7; + STRING_5 = 8; + HEALTH = 9; + ENCHANT_TABLE_1 = 10; + BLAZE_ROD_1 = 11; + FORTUNE_2_BOOK_1 = 12; + EFF_3_DIA_PICK_1 = 13; + MELON_BLOCK_1 = 14; + FIRE_ASPECT_BOOK_1 = 15; + DEPTH_STRIDER_BOOK_1 = 16; + FEATHER_FALLING_BOOK_1 = 17; + FIRE = 18; + COBBLESTONE = 19; + ZOMBIES = 20; + DOORS = 21; + CREEPER = 22; + POISON = 23; + TELEPORT = 24; + RIP_BOOTS = 25; + RIP_HELMET = 26; + RIP_PANTS = 27; + RIP_CHESTPLATE = 28; + OBSIDIAN = 29; + RIP_HELD_ITEM = 30; + + // Global + FREE_DONATION = 31; + + // Season 3 + S3_STEAK = 32; + S3_OAK = 33; + S3_STONE = 34; + S3_NEXT = 35; + S3_DIAMOND = 36; + S3_EARLY = 37; + S3_ZOMBIES = 38; + S3_CREEPER = 39; + S3_SLOW_BLIND = 40; + S3_MINING_FAT = 41; + S3_FREEZE = 42; + + // Season 4 + S4_FIREWORK = 43; + S4_BREAD = 44; + S4_COBBLESTONE = 45; + S4_GOLDEN_CARROT = 46; + S4_EXP_BOTTLE = 47; + S4_WATER_BUCKET = 48; + S4_OAK_SAPLING = 49; + S4_LAPIS_ORE = 50; + S4_BONE = 51; + S4_SUGAR_CANE = 52; + S4_FEATHER = 53; + S4_LAVA_BUCKET = 54; + S4_GRASS_BLOCKS = 55; + S4_IRON_PICK = 56; + S4_SPEED = 57; + S4_HASTE = 58; + S4_COW_EGG = 59; +} diff --git a/creator_games/grpc/src/main/proto/service.proto b/creator_games/grpc/src/main/proto/service.proto new file mode 100644 index 0000000..6fc9082 --- /dev/null +++ b/creator_games/grpc/src/main/proto/service.proto @@ -0,0 +1,98 @@ +syntax = "proto3"; + +import "common.proto"; + +// Creates independent Java class files for each top-level message +option java_multiple_files = true; + +// Java package to place generated Java class files in +option java_package = "net.gylliegyllie.creatorgames.grpc.wtaservice"; + +service WTAService { + rpc GetGlobalInfo (Season) returns (GetGlobalInfoRes) {} + + rpc GetStreamers (Season) returns (GetStreamersRes) {} + + rpc GetStreamer (GetStreamerReq) returns (GetStreamerRes) {} + + rpc GetItems (Season) returns (GetItemsRes) {} + + rpc GetItem (GetItemReq) returns (GetItemRes) {} + + rpc GetDonation (GetDonationReq) returns (GetDonationRes) {} + + rpc CreatePayment (CreatePaymentReq) returns (CreatePaymentRes) {} + + rpc ApprovedPayment (ApprovedPaymentReq) returns (ApprovedPaymentRes) {} +} + +message GetGlobalInfoRes { + bool success = 1; + int64 raised = 2; + int64 donations = 3; + Donation latest = 4; + Donation highest = 5; +} + +message GetStreamersRes { + bool success = 1; + repeated Streamer streamers = 2; +} + +message GetStreamerReq { + string name = 1; + int32 season = 2; +} + +message GetStreamerRes { + bool success = 1; + Streamer streamer = 2; +} + +message GetItemsRes { + bool success = 1; + repeated DonationItem items = 2; +} + +message GetItemReq { + int64 id = 1; + int32 season = 2; +} + +message GetItemRes { + bool success = 1; + DonationItem item = 2; +} + +message GetDonationReq { + string order_id = 1; +} + +message GetDonationRes { + bool success = 1; + Donation donation = 2; +} + +message CreatePaymentReq { + string streamer = 1; + int64 id = 2; + string name = 3; + string message = 4; + int32 amount = 5; + int32 season = 6; + string ip = 7; +} + +message CreatePaymentRes { + bool success = 1; + string message = 2; + string order_id = 3; +} + +message ApprovedPaymentReq { + string order_id = 1; +} + +message ApprovedPaymentRes { + bool success = 1; +} \ No newline at end of file diff --git a/creator_games/website/_assets/controllers/buy.controller.js b/creator_games/website/_assets/controllers/buy.controller.js new file mode 100644 index 0000000..417e67a --- /dev/null +++ b/creator_games/website/_assets/controllers/buy.controller.js @@ -0,0 +1,101 @@ +$.when( $.ready ).then(function() { + + document.querySelectorAll(".required") + .forEach(function (el) { + el.addEventListener('input', function(event) { + var allFilled = true; + document.querySelectorAll(".required").forEach(function(el1) { + if (!el1.value || el1.value === "") { + allFilled = false; + } + }); + + if (allFilled) { + $("#paypal-button-container").css("display", "block"); + } else { + $("#paypal-button-container").css("display", "none"); + } + }); + }); + + paypal.Buttons({ + createOrder: function() { + + var errorDom = $("#alert"); + + errorDom.html(""); + errorDom.css("display", "none"); + + var username = $("#username")[0].value; + var message = $("#message")[0].value; + + if (username.length > 50) { + errorDom.html("Name cannot be longer than 50 characters!"); + errorDom.css("display", "block"); + throw "Failed to create payment"; + } + + var amount = 0; + + var amountDom = $("#amount"); + + if (amountDom && amountDom[0]) { + amount = Number(amountDom[0].value); + + if (amount < 1) { + errorDom.html("Please provide an amount of minimum $1"); + errorDom.css("display", "block"); + throw "Failed to create payment"; + } + + if (amount % 1 > 0) { + errorDom.html("Only round values allowed for the amount (for example $1, $5 not $1.5 or $5.5)"); + errorDom.css("display", "block"); + throw "Failed to create payment"; + } + } + + var jqXHR = $.ajax({ + url: window.location.href, + type: 'POST', + data: { + name: username, + message: message, + amount: amount + }, + async: false + }); + + if (jqXHR.status !== 200) { + errorDom.html("Internal Error!"); + errorDom.css("display", "block"); + throw "Failed to create payment"; + } + + console.log(jqXHR); + var json = JSON.parse(jqXHR.responseText); + + if (!json.success) { + errorDom.html(json.message); + errorDom.css("display", "block"); + throw "Failed to create payment: " + json.message; + } + + return json.orderID; + }, + onApprove: function(data) { + $('.loading').css("display", "block"); + + $.ajax({ + url: "/buy/approve", + type: "POST", + data: { + orderID: data.orderID + }, + complete: function() { + window.location = "/payed/" + data.orderID; + } + }); + } + }).render('#paypal-button-container'); +}); diff --git a/creator_games/website/_assets/controllers/event.controller.js b/creator_games/website/_assets/controllers/event.controller.js new file mode 100644 index 0000000..f490a53 --- /dev/null +++ b/creator_games/website/_assets/controllers/event.controller.js @@ -0,0 +1,101 @@ +$.when( $.ready ).then(function() { + // Initial load + getStreamers(); + + // Update every minute + setInterval(getStreamers, 30 * 1000); +}); + +function getStreamers() { + var season = $("#season-id")[0].value; + + $.ajax({ + url: "/api/streamers/" + season, + type: 'GET', + responseType: 'application/json', + success: function (result) { + + result = JSON.parse(result); + console.log(result); + + if (!result.success) { + return; + } + + var streamerdiv = $("#streamers"); + streamerdiv.html(""); + + if (result.streamers.length === 0) { + streamerdiv.html("Streamerlist not available yet!"); + return; + } + + var row = null, column, card, media, user, head, headimage, name, nameh, names, dead, deadimage, buttonrow, buttondiv, buttona, button; + + for (var i = 0; i < result.streamers.length; i++) { + var streamer = result.streamers[i]; + + // First create new row if needed + if (i % 4 === 0) { + if (row !== null) { + streamerdiv.append(row); + } + + row = $("
").addClass("row").addClass("streamers"); + } + + column = $("
").addClass("col-md-3"); + card = $("
").addClass("card"); + media = $("
").addClass("media"); + + user = $("
").addClass("row").addClass("padding-top"); + head = $("
").addClass("col-md-3").addClass("nobox"); + headimage = $("").addClass("media-object").attr("src", "https://cravatar.eu/helmavatar/" + streamer.name + "?size=80"); + name = $("
").addClass("col-md-6").addClass("streamer-name"); + nameh = $("

").addClass("media-heading"); + names = $("").html(streamer.name).append(" ").append("
").append("$").append(streamer.raised); + + nameh.append(names); + name.append(nameh); + + head.append(headimage); + + user.append(head).append(name); + + if (streamer.winner) { + dead = $("
").addClass("col-md-3").addClass("nobox").addClass("skull"); + deadimage = $("").addClass("media-object").attr("src", "./img/winner.png").attr("title", "This streamer won the game."); + dead.append(deadimage); + user.append(dead); + } else if (streamer.dead) { + dead = $("
").addClass("col-md-3").addClass("nobox").addClass("skull"); + deadimage = $("").addClass("media-object").attr("src", "./img/skull.png").attr("title", "This streamer has died."); + dead.append(deadimage); + user.append(dead); + } else if (streamer.caster) { + dead = $("
").addClass("col-md-3").addClass("nobox").addClass("skull"); + deadimage = $("").addClass("media-object").attr("src", "./img/mic.png").attr("title", "This streamer is shoutcasting the event."); + dead.append(deadimage); + user.append(dead); + } + + buttonrow = $("
").addClass("row"); + buttondiv = $("
").addClass("col-md-12"); + buttona = $("").attr("href", "/streamer/" + streamer.name); + button = $("
+
+ <% } else { %> +

No recent videos

+ <% } %> + +
+ + +<% include _globals/footer.ejs %> + + + + + + \ No newline at end of file diff --git a/stellar/website/_frontend/map.ejs b/stellar/website/_frontend/map.ejs new file mode 100644 index 0000000..7f841b4 --- /dev/null +++ b/stellar/website/_frontend/map.ejs @@ -0,0 +1,33 @@ + + + +<% include _globals/head.ejs %> + + + +<% include _globals/header.ejs %> + +
+ +
+
+
+
+
+ +

Stellar SMP

+
+
+
+
+
+ + + +
+ +<% include _globals/footer.ejs %> + + + + \ No newline at end of file diff --git a/stellar/website/_frontend/members.ejs b/stellar/website/_frontend/members.ejs new file mode 100644 index 0000000..2f39acd --- /dev/null +++ b/stellar/website/_frontend/members.ejs @@ -0,0 +1,146 @@ + + + +<% include _globals/head.ejs %> + + + +<% include _globals/header.ejs %> + +
+ +
+
+
+
+
+ +

Stellar SMP

+
+
+
+
+
+ +
+ +
+ +
+

New SMP Members

+ +
+ +
+ +
+ +
+ +
+

SMP Members

+ +
    + <% for (var i = 0; i < members.length; i++) { %> + +
  • + +
    + + + <%= members[i].name %> + +
    + +
    + + <% if (members[i].instagram && members[i].instagram !== "") { %> + + + + <% } %> + + <% if (members[i].twitter && members[i].twitter !== "") { %> + + + + <% } %> + + <% if (members[i].youtube && members[i].youtube !== "") { %> + + + + <% } %> + + <% if (members[i].mixer && members[i].mixer !== "") { %> + + mixer + + <% } %> + + <% if (members[i].twitch && members[i].twitch !== "") { %> + + + + <% } %> + +
    +
  • + + <% } %> +
+ +
+ +
+ +
+
+ +<% include _globals/footer.ejs %> + + + + \ No newline at end of file diff --git a/stellar/website/app.js b/stellar/website/app.js new file mode 100644 index 0000000..a7262ad --- /dev/null +++ b/stellar/website/app.js @@ -0,0 +1,74 @@ +const express = require('express'); +const path = require('path'); +const logger = require('morgan'); +const rfs = require('rotating-file-stream'); +const mysql = require('mysql'); + +const twitchThread = require('./_backend/threads/twitchThread'); +const youtubeThread = require('./_backend/threads/youtubeThread'); +const renderer = require('./_backend/util/renderer'); + +let pool = mysql.createPool({ + connectionLimit : 20, + host : global.gConfig.sql.host, + port : global.gConfig.sql.port, + user : global.gConfig.sql.user, + password : global.gConfig.sql.pass, + database : global.gConfig.sql.database +}); +global.sql = pool; + +const app = express(); + +// Setup express +app.set('views', path.join(__dirname, '_frontend')); +app.set('view engine', 'ejs'); +app.use(express.json()); +app.use(express.urlencoded({ extended: false })); +app.use(express.static(path.join(__dirname, '_assets'))); + +// create a rotating write stream +const accessLogStream = rfs('access.log', { + interval: '1d', // rotate daily + path: path.join(__dirname, 'log') +}); +app.use(logger(':req[x-forwarded-for] | [:date[iso]] | :method :url :status | :referrer | :user-agent', { stream: accessLogStream })); +app.use(logger(':req[x-forwarded-for] | [:date[iso]] | :method :url :status')); + +app.use('/', require('./_backend/index')); +app.use('/members', require('./_backend/members')); +app.use('/map', require('./_backend/map')); +app.use('/api', require('./_backend/api')); + +app.use(function(req, res) { + if (req.method === "GET") { + renderer.render(req, res, '404', { + title: 'Stellar SMP - 404' + }); + } else { + res.writeHead(404); + res.end(); + } +}); + +app.use(function(err, req, res, next){ + console.error(err); + + if (req.method === "GET") { + renderer.renderError(req, res, 'Internal Web Error'); + } else { + res.status(500); + res.render('Internal Error'); + } +}); + +module.exports = app; + +twitchThread.start(); +youtubeThread.start(); + +process.on('SIGINT', () => { + console.info('Stopping webserver.'); + global.sql.end(); + process.exit(0); +}); \ No newline at end of file diff --git a/stellar/website/bin/main.js b/stellar/website/bin/main.js new file mode 100644 index 0000000..d20cee2 --- /dev/null +++ b/stellar/website/bin/main.js @@ -0,0 +1,37 @@ +const _ = require('lodash'); + +// module variables +const config = require('../config.json'); +const defaultConfig = config.development; + +process.argv.forEach((val) => { + if (val.startsWith("environment=")) { + const environment = val.replace("environment=", "") || 'development'; + const environmentConfig = config[environment]; + global.gConfig = _.merge(defaultConfig, environmentConfig); + } else { + global.gConfig = defaultConfig; + } +}); + + +const app = require('../app'); +const http = require('http'); + +const server = http.createServer(app); + +if (global.gConfig.production) { + console.log(" "); + console.log(" "); + console.log(" --------------------------------"); + console.log(" | |"); + console.log(" | RUNNING IN PRODUCTION MODE |"); + console.log(" | |"); + console.log(" --------------------------------"); + console.log(" "); + console.log(" "); +} + +server.listen(global.gConfig.node_port, () => { + console.log(`Connected on port ${global.gConfig.node_port}.`); +}); \ No newline at end of file diff --git a/stellar/website/compile.sh b/stellar/website/compile.sh new file mode 100644 index 0000000..096177c --- /dev/null +++ b/stellar/website/compile.sh @@ -0,0 +1 @@ +tar -cvzf Website.tar.gz _assets/ _backend/ _frontend/ bin/ app.js config.json package.json \ No newline at end of file diff --git a/stellar/website/package-lock.json b/stellar/website/package-lock.json new file mode 100644 index 0000000..25ef4bb --- /dev/null +++ b/stellar/website/package-lock.json @@ -0,0 +1,500 @@ +{ + "name": "stellarsmp_website", + "version": "1.0.0-beta", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz", + "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "express-async-handler": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/express-async-handler/-/express-async-handler-1.1.4.tgz", + "integrity": "sha512-HdmbVF4V4w1q/iz++RV7bUxIeepTukWewiJGkoCKQMtvPF11MLTa7It9PRc/reysXXZSEyD4Pthchju+IUbMiQ==" + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "lodash": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.13.tgz", + "integrity": "sha512-vm3/XWXfWtRua0FkUyEHBZy8kCPjErNBT9fJx8Zvs+U6zjqPbTUOpkaoum3O5uiA8sm+yNMHXfYkTUHFoMxFNA==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "moment-timezone": { + "version": "0.5.25", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.25.tgz", + "integrity": "sha512-DgEaTyN/z0HFaVcVbSyVCUU6HeFdnNC3vE4c9cgu2dgMTvjBUBdBzWfasTBmAW45u5OIMeCJtU8yNjM22DHucw==", + "requires": { + "moment": ">= 2.9.0" + } + }, + "morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mysql": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.17.1.tgz", + "integrity": "sha512-7vMqHQ673SAk5C8fOzTG2LpPcf3bNt0oL3sFpxPEEFp1mdlDcrLK0On7z8ZYKaaHrHwNcQ/MTUz7/oobZ2OyyA==", + "requires": { + "bignumber.js": "7.2.1", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rotating-file-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rotating-file-stream/-/rotating-file-stream-1.4.1.tgz", + "integrity": "sha512-80lz0OFYQ5p2ncW5RFq1TgxZmoNGlIhhDWhUQE9XNGYkrOH3fENdA1kMLaN0C7L9igRmCgnFd3NWgRRXVnV5tA==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + } + } +} diff --git a/stellar/website/package.json b/stellar/website/package.json new file mode 100644 index 0000000..2e4e9b4 --- /dev/null +++ b/stellar/website/package.json @@ -0,0 +1,31 @@ +{ + "name": "stellarsmp_website", + "version": "1.0.0-beta", + "description": "Stellar SMP Website", + "main": "app.js", + "scripts": { + "start": "node bin/main" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/GyllieGyllie/Public-Plugins.git" + }, + "author": "GyllieGyllie", + "bugs": { + "url": "https://github.com/GyllieGyllie/Public-Plugins/issues" + }, + "homepage": "https://github.com/GyllieGyllie/Public-Plugins#readme", + "dependencies": { + "ejs": "^2.6.1", + "express": "^4.16.4", + "express-async-handler": "^1.1.4", + "http-errors": "^1.7.1", + "lodash": "^4.17.13", + "moment": "^2.23.0", + "moment-timezone": "^0.5.23", + "morgan": "^1.9.1", + "mysql": "^2.17.1", + "node-fetch": "^2.3.0", + "rotating-file-stream": "^1.4.0" + } +}