From 2aca1551efb6e683434c5625bcdaccbb44a776c7 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Fri, 7 Jul 2017 02:22:44 +0200 Subject: [PATCH 1/8] Probably done with DiscordConnectedPlayer --- .../discordplugin/DiscordConnectedPlayer.java | 1852 +---------------- .../listeners/MCChatListener.java | 36 +- .../playerfaker/DiscordFakePlayer.java | 721 +++++++ .../playerfaker/DiscordHumanEntity.java | 59 +- .../playerfaker/DiscordInventory.java | 212 ++ .../playerfaker/DiscordPlayerInventory.java | 105 + 6 files changed, 1079 insertions(+), 1906 deletions(-) create mode 100644 src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java create mode 100644 src/main/java/buttondevteam/discordplugin/playerfaker/DiscordInventory.java create mode 100644 src/main/java/buttondevteam/discordplugin/playerfaker/DiscordPlayerInventory.java diff --git a/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java b/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java index 0ac9e14..a669d0d 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java @@ -1,1854 +1,16 @@ package buttondevteam.discordplugin; -import java.net.InetSocketAddress; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; import java.util.UUID; -import org.bukkit.Achievement; -import org.bukkit.Effect; -import org.bukkit.EntityEffect; -import org.bukkit.GameMode; -import org.bukkit.Instrument; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Note; -import org.bukkit.Particle; -import org.bukkit.Server; -import org.bukkit.Sound; -import org.bukkit.SoundCategory; -import org.bukkit.Statistic; -import org.bukkit.WeatherType; -import org.bukkit.World; -import org.bukkit.advancement.Advancement; -import org.bukkit.advancement.AdvancementProgress; -import org.bukkit.attribute.Attribute; -import org.bukkit.attribute.AttributeInstance; -import org.bukkit.block.Block; -import org.bukkit.block.PistonMoveReaction; -import org.bukkit.conversations.Conversation; -import org.bukkit.conversations.ConversationAbandonedEvent; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.entity.Projectile; -import org.bukkit.entity.Villager; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.inventory.EntityEquipment; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.inventory.InventoryView.Property; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.MainHand; -import org.bukkit.inventory.Merchant; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.map.MapView; -import org.bukkit.metadata.MetadataValue; -import org.bukkit.permissions.Permission; -import org.bukkit.permissions.PermissionAttachment; -import org.bukkit.permissions.PermissionAttachmentInfo; -import org.bukkit.plugin.Plugin; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.util.Vector; +import buttondevteam.discordplugin.playerfaker.DiscordFakePlayer; +import sx.blah.discord.handle.obj.IChannel; +import sx.blah.discord.handle.obj.IUser; -public class DiscordConnectedPlayer implements Player { +public class DiscordConnectedPlayer extends DiscordFakePlayer { + private static int nextEntityId = 0; - @Override - public void closeInventory() { - } - - @Override - public int getCooldown(Material arg0) { - return 0; - } - - @Override - public Inventory getEnderChest() { - // TODO Auto-generated method stub - return null; - } - - @Override - public int getExpToLevel() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public GameMode getGameMode() { - // TODO Auto-generated method stub - return null; - } - - @Override - public PlayerInventory getInventory() { - // TODO Auto-generated method stub - return null; - } - - @Override - public ItemStack getItemInHand() { - // TODO Auto-generated method stub - return null; - } - - @Override - public ItemStack getItemOnCursor() { - // TODO Auto-generated method stub - return null; - } - - @Override - public MainHand getMainHand() { - // TODO Auto-generated method stub - return null; - } - - @Override - public String getName() { - // TODO Auto-generated method stub - return null; - } - - @Override - public InventoryView getOpenInventory() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Entity getShoulderEntityLeft() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Entity getShoulderEntityRight() { - // TODO Auto-generated method stub - return null; - } - - @Override - public int getSleepTicks() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public boolean hasCooldown(Material arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isBlocking() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isHandRaised() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isSleeping() { - // TODO Auto-generated method stub - return false; - } - - @Override - public InventoryView openEnchanting(Location arg0, boolean arg1) { - // TODO Auto-generated method stub - return null; - } - - @Override - public InventoryView openInventory(Inventory arg0) { - // TODO Auto-generated method stub - return null; - } - - @Override - public void openInventory(InventoryView arg0) { - // TODO Auto-generated method stub - - } - - @Override - public InventoryView openMerchant(Villager arg0, boolean arg1) { - // TODO Auto-generated method stub - return null; - } - - @Override - public InventoryView openMerchant(Merchant arg0, boolean arg1) { - // TODO Auto-generated method stub - return null; - } - - @Override - public InventoryView openWorkbench(Location arg0, boolean arg1) { - // TODO Auto-generated method stub - return null; - } - - @Override - public void setCooldown(Material arg0, int arg1) { - // TODO Auto-generated method stub - - } - - @Override - public void setGameMode(GameMode arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setItemInHand(ItemStack arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setItemOnCursor(ItemStack arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setShoulderEntityLeft(Entity arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setShoulderEntityRight(Entity arg0) { - // TODO Auto-generated method stub - - } - - @Override - public boolean setWindowProperty(Property arg0, int arg1) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean addPotionEffect(PotionEffect arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean addPotionEffect(PotionEffect arg0, boolean arg1) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean addPotionEffects(Collection arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public Collection getActivePotionEffects() { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean getCanPickupItems() { - // TODO Auto-generated method stub - return false; - } - - @Override - public EntityEquipment getEquipment() { - // TODO Auto-generated method stub - return null; - } - - @Override - public double getEyeHeight() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public double getEyeHeight(boolean arg0) { - // TODO Auto-generated method stub - return 0; - } - - @Override - public Location getEyeLocation() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Player getKiller() { - // TODO Auto-generated method stub - return null; - } - - @Override - public double getLastDamage() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public List getLastTwoTargetBlocks(HashSet arg0, int arg1) { - // TODO Auto-generated method stub - return null; - } - - @Override - public List getLastTwoTargetBlocks(Set arg0, int arg1) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Entity getLeashHolder() throws IllegalStateException { - // TODO Auto-generated method stub - return null; - } - - @Override - public List getLineOfSight(Set arg0, int arg1) { - // TODO Auto-generated method stub - return null; - } - - @Override - public int getMaximumAir() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public int getMaximumNoDamageTicks() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public int getNoDamageTicks() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public PotionEffect getPotionEffect(PotionEffectType arg0) { - // TODO Auto-generated method stub - return null; - } - - @Override - public int getRemainingAir() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public boolean getRemoveWhenFarAway() { - // TODO Auto-generated method stub - return false; - } - - @Override - public Block getTargetBlock(HashSet arg0, int arg1) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Block getTargetBlock(Set arg0, int arg1) { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean hasAI() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean hasLineOfSight(Entity arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean hasPotionEffect(PotionEffectType arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isCollidable() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isGliding() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isLeashed() { - // TODO Auto-generated method stub - return false; - } - - @Override - public void removePotionEffect(PotionEffectType arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setAI(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setCanPickupItems(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setCollidable(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setGliding(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setLastDamage(double arg0) { - // TODO Auto-generated method stub - - } - - @Override - public boolean setLeashHolder(Entity arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void setMaximumAir(int arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setMaximumNoDamageTicks(int arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setNoDamageTicks(int arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setRemainingAir(int arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setRemoveWhenFarAway(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public AttributeInstance getAttribute(Attribute arg0) { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean addPassenger(Entity arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean addScoreboardTag(String arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean eject() { - // TODO Auto-generated method stub - return false; - } - - @Override - public int getEntityId() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public float getFallDistance() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public int getFireTicks() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public double getHeight() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public EntityDamageEvent getLastDamageCause() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Location getLocation() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Location getLocation(Location arg0) { - // TODO Auto-generated method stub - return null; - } - - @Override - public int getMaxFireTicks() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public List getNearbyEntities(double arg0, double arg1, double arg2) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Entity getPassenger() { - // TODO Auto-generated method stub - return null; - } - - @Override - public List getPassengers() { - // TODO Auto-generated method stub - return null; - } - - @Override - public PistonMoveReaction getPistonMoveReaction() { - // TODO Auto-generated method stub - return null; - } - - @Override - public int getPortalCooldown() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public Set getScoreboardTags() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Server getServer() { - // TODO Auto-generated method stub - return null; - } - - @Override - public int getTicksLived() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public EntityType getType() { - // TODO Auto-generated method stub - return null; - } - - @Override - public UUID getUniqueId() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Entity getVehicle() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Vector getVelocity() { - // TODO Auto-generated method stub - return null; - } - - @Override - public double getWidth() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public World getWorld() { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean hasGravity() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isCustomNameVisible() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isDead() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isEmpty() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isGlowing() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isInsideVehicle() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isInvulnerable() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isOnGround() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isSilent() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isValid() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean leaveVehicle() { - // TODO Auto-generated method stub - return false; - } - - @Override - public void playEffect(EntityEffect arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void remove() { - // TODO Auto-generated method stub - - } - - @Override - public boolean removePassenger(Entity arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean removeScoreboardTag(String arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void setCustomNameVisible(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setFallDistance(float arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setFireTicks(int arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setGlowing(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setGravity(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setInvulnerable(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setLastDamageCause(EntityDamageEvent arg0) { - // TODO Auto-generated method stub - - } - - @Override - public boolean setPassenger(Entity arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void setPortalCooldown(int arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setSilent(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setTicksLived(int arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setVelocity(Vector arg0) { - // TODO Auto-generated method stub - - } - - @Override - public boolean teleport(Location arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean teleport(Entity arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean teleport(Location arg0, TeleportCause arg1) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean teleport(Entity arg0, TeleportCause arg1) { - // TODO Auto-generated method stub - return false; - } - - @Override - public List getMetadata(String arg0) { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean hasMetadata(String arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void removeMetadata(String arg0, Plugin arg1) { - // TODO Auto-generated method stub - - } - - @Override - public void setMetadata(String arg0, MetadataValue arg1) { - // TODO Auto-generated method stub - - } - - @Override - public void sendMessage(String arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void sendMessage(String[] arg0) { - // TODO Auto-generated method stub - - } - - @Override - public PermissionAttachment addAttachment(Plugin arg0) { - // TODO Auto-generated method stub - return null; - } - - @Override - public PermissionAttachment addAttachment(Plugin arg0, int arg1) { - // TODO Auto-generated method stub - return null; - } - - @Override - public PermissionAttachment addAttachment(Plugin arg0, String arg1, boolean arg2) { - // TODO Auto-generated method stub - return null; - } - - @Override - public PermissionAttachment addAttachment(Plugin arg0, String arg1, boolean arg2, int arg3) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Set getEffectivePermissions() { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean hasPermission(String arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean hasPermission(Permission arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isPermissionSet(String arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isPermissionSet(Permission arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void recalculatePermissions() { - // TODO Auto-generated method stub - - } - - @Override - public void removeAttachment(PermissionAttachment arg0) { - // TODO Auto-generated method stub - - } - - @Override - public boolean isOp() { - // TODO Auto-generated method stub - return false; - } - - @Override - public void setOp(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public String getCustomName() { - // TODO Auto-generated method stub - return null; - } - - @Override - public void setCustomName(String arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void damage(double arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void damage(double arg0, Entity arg1) { - // TODO Auto-generated method stub - - } - - @Override - public double getHealth() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public double getMaxHealth() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public void resetMaxHealth() { - // TODO Auto-generated method stub - - } - - @Override - public void setHealth(double arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setMaxHealth(double arg0) { - // TODO Auto-generated method stub - - } - - @Override - public T launchProjectile(Class arg0) { - // TODO Auto-generated method stub - return null; - } - - @Override - public T launchProjectile(Class arg0, Vector arg1) { - // TODO Auto-generated method stub - return null; - } - - @Override - public void abandonConversation(Conversation arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void abandonConversation(Conversation arg0, ConversationAbandonedEvent arg1) { - // TODO Auto-generated method stub - - } - - @Override - public void acceptConversationInput(String arg0) { - // TODO Auto-generated method stub - - } - - @Override - public boolean beginConversation(Conversation arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isConversing() { - // TODO Auto-generated method stub - return false; - } - - @Override - public long getFirstPlayed() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public long getLastPlayed() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public Player getPlayer() { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean hasPlayedBefore() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isBanned() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isOnline() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isWhitelisted() { - // TODO Auto-generated method stub - return false; - } - - @Override - public void setWhitelisted(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public Map serialize() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Set getListeningPluginChannels() { - // TODO Auto-generated method stub - return null; - } - - @Override - public void sendPluginMessage(Plugin arg0, String arg1, byte[] arg2) { - // TODO Auto-generated method stub - - } - - @Override - public void awardAchievement(Achievement arg0) { - // TODO Auto-generated method stub - - } - - @Override - public boolean canSee(Player arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void chat(String arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void decrementStatistic(Statistic arg0) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void decrementStatistic(Statistic arg0, int arg1) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void decrementStatistic(Statistic arg0, Material arg1) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void decrementStatistic(Statistic arg0, EntityType arg1) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void decrementStatistic(Statistic arg0, Material arg1, int arg2) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void decrementStatistic(Statistic arg0, EntityType arg1, int arg2) { - // TODO Auto-generated method stub - - } - - @Override - public InetSocketAddress getAddress() { - // TODO Auto-generated method stub - return null; - } - - @Override - public AdvancementProgress getAdvancementProgress(Advancement arg0) { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean getAllowFlight() { - // TODO Auto-generated method stub - return false; - } - - @Override - public Location getBedSpawnLocation() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Location getCompassTarget() { - // TODO Auto-generated method stub - return null; - } - - @Override - public String getDisplayName() { - // TODO Auto-generated method stub - return null; - } - - @Override - public float getExhaustion() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public float getExp() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public float getFlySpeed() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public int getFoodLevel() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public double getHealthScale() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public int getLevel() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public String getLocale() { - // TODO Auto-generated method stub - return null; - } - - @Override - public String getPlayerListName() { - // TODO Auto-generated method stub - return null; - } - - @Override - public long getPlayerTime() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public long getPlayerTimeOffset() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public WeatherType getPlayerWeather() { - // TODO Auto-generated method stub - return null; - } - - @Override - public float getSaturation() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public Scoreboard getScoreboard() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Entity getSpectatorTarget() { - // TODO Auto-generated method stub - return null; - } - - @Override - public int getStatistic(Statistic arg0) throws IllegalArgumentException { - // TODO Auto-generated method stub - return 0; - } - - @Override - public int getStatistic(Statistic arg0, Material arg1) throws IllegalArgumentException { - // TODO Auto-generated method stub - return 0; - } - - @Override - public int getStatistic(Statistic arg0, EntityType arg1) throws IllegalArgumentException { - // TODO Auto-generated method stub - return 0; - } - - @Override - public int getTotalExperience() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public float getWalkSpeed() { - // TODO Auto-generated method stub - return 0; - } - - @Override - public void giveExp(int arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void giveExpLevels(int arg0) { - // TODO Auto-generated method stub - - } - - @Override - public boolean hasAchievement(Achievement arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void hidePlayer(Player arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void incrementStatistic(Statistic arg0) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void incrementStatistic(Statistic arg0, int arg1) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void incrementStatistic(Statistic arg0, Material arg1) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void incrementStatistic(Statistic arg0, EntityType arg1) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void incrementStatistic(Statistic arg0, Material arg1, int arg2) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void incrementStatistic(Statistic arg0, EntityType arg1, int arg2) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public boolean isFlying() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isHealthScaled() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isPlayerTimeRelative() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isSleepingIgnored() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isSneaking() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isSprinting() { - // TODO Auto-generated method stub - return false; - } - - @Override - public void kickPlayer(String arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void loadData() { - // TODO Auto-generated method stub - - } - - @Override - public boolean performCommand(String arg0) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void playEffect(Location arg0, Effect arg1, int arg2) { - // TODO Auto-generated method stub - - } - - @Override - public void playEffect(Location arg0, Effect arg1, T arg2) { - // TODO Auto-generated method stub - - } - - @Override - public void playNote(Location arg0, byte arg1, byte arg2) { - // TODO Auto-generated method stub - - } - - @Override - public void playNote(Location arg0, Instrument arg1, Note arg2) { - // TODO Auto-generated method stub - - } - - @Override - public void playSound(Location arg0, Sound arg1, float arg2, float arg3) { - // TODO Auto-generated method stub - - } - - @Override - public void playSound(Location arg0, String arg1, float arg2, float arg3) { - // TODO Auto-generated method stub - - } - - @Override - public void playSound(Location arg0, Sound arg1, SoundCategory arg2, float arg3, float arg4) { - // TODO Auto-generated method stub - - } - - @Override - public void playSound(Location arg0, String arg1, SoundCategory arg2, float arg3, float arg4) { - // TODO Auto-generated method stub - - } - - @Override - public void removeAchievement(Achievement arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void resetPlayerTime() { - // TODO Auto-generated method stub - - } - - @Override - public void resetPlayerWeather() { - // TODO Auto-generated method stub - - } - - @Override - public void resetTitle() { - // TODO Auto-generated method stub - - } - - @Override - public void saveData() { - // TODO Auto-generated method stub - - } - - @Override - public void sendBlockChange(Location arg0, Material arg1, byte arg2) { - // TODO Auto-generated method stub - - } - - @Override - public void sendBlockChange(Location arg0, int arg1, byte arg2) { - // TODO Auto-generated method stub - - } - - @Override - public boolean sendChunkChange(Location arg0, int arg1, int arg2, int arg3, byte[] arg4) { - // TODO Auto-generated method stub - return false; - } - - @Override - public void sendMap(MapView arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void sendRawMessage(String arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void sendSignChange(Location arg0, String[] arg1) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void sendTitle(String arg0, String arg1) { - // TODO Auto-generated method stub - - } - - @Override - public void sendTitle(String arg0, String arg1, int arg2, int arg3, int arg4) { - // TODO Auto-generated method stub - - } - - @Override - public void setAllowFlight(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setBedSpawnLocation(Location arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setBedSpawnLocation(Location arg0, boolean arg1) { - // TODO Auto-generated method stub - - } - - @Override - public void setCompassTarget(Location arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setDisplayName(String arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setExhaustion(float arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setExp(float arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setFlySpeed(float arg0) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void setFlying(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setFoodLevel(int arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setHealthScale(double arg0) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void setHealthScaled(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setLevel(int arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setPlayerListName(String arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setPlayerTime(long arg0, boolean arg1) { - // TODO Auto-generated method stub - - } - - @Override - public void setPlayerWeather(WeatherType arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setResourcePack(String arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setResourcePack(String arg0, byte[] arg1) { - // TODO Auto-generated method stub - - } - - @Override - public void setSaturation(float arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setScoreboard(Scoreboard arg0) throws IllegalArgumentException, IllegalStateException { - // TODO Auto-generated method stub - - } - - @Override - public void setSleepingIgnored(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setSneaking(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setSpectatorTarget(Entity arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setSprinting(boolean arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setStatistic(Statistic arg0, int arg1) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void setStatistic(Statistic arg0, Material arg1, int arg2) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void setStatistic(Statistic arg0, EntityType arg1, int arg2) { - // TODO Auto-generated method stub - - } - - @Override - public void setTexturePack(String arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setTotalExperience(int arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void setWalkSpeed(float arg0) throws IllegalArgumentException { - // TODO Auto-generated method stub - - } - - @Override - public void showPlayer(Player arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void spawnParticle(Particle arg0, Location arg1, int arg2) { - // TODO Auto-generated method stub - - } - - @Override - public void spawnParticle(Particle arg0, Location arg1, int arg2, T arg3) { - // TODO Auto-generated method stub - - } - - @Override - public void spawnParticle(Particle arg0, double arg1, double arg2, double arg3, int arg4) { - // TODO Auto-generated method stub - - } - - @Override - public void spawnParticle(Particle arg0, double arg1, double arg2, double arg3, int arg4, T arg5) { - // TODO Auto-generated method stub - - } - - @Override - public void spawnParticle(Particle arg0, Location arg1, int arg2, double arg3, double arg4, double arg5) { - // TODO Auto-generated method stub - - } - - @Override - public void spawnParticle(Particle arg0, Location arg1, int arg2, double arg3, double arg4, double arg5, - T arg6) { - // TODO Auto-generated method stub - - } - - @Override - public void spawnParticle(Particle arg0, Location arg1, int arg2, double arg3, double arg4, double arg5, - double arg6) { - // TODO Auto-generated method stub - - } - - @Override - public void spawnParticle(Particle arg0, double arg1, double arg2, double arg3, int arg4, double arg5, double arg6, - double arg7) { - // TODO Auto-generated method stub - - } - - @Override - public void spawnParticle(Particle arg0, Location arg1, int arg2, double arg3, double arg4, double arg5, - double arg6, T arg7) { - // TODO Auto-generated method stub - - } - - @Override - public void spawnParticle(Particle arg0, double arg1, double arg2, double arg3, int arg4, double arg5, - double arg6, double arg7, T arg8) { - // TODO Auto-generated method stub - - } - - @Override - public void spawnParticle(Particle arg0, double arg1, double arg2, double arg3, int arg4, double arg5, double arg6, - double arg7, double arg8) { - // TODO Auto-generated method stub - - } - - @Override - public void spawnParticle(Particle arg0, double arg1, double arg2, double arg3, int arg4, double arg5, - double arg6, double arg7, double arg8, T arg9) { - // TODO Auto-generated method stub - - } - - @Override - public void stopSound(Sound arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void stopSound(String arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void stopSound(Sound arg0, SoundCategory arg1) { - // TODO Auto-generated method stub - - } - - @Override - public void stopSound(String arg0, SoundCategory arg1) { - // TODO Auto-generated method stub - - } - - @Override - public void updateInventory() { - // TODO Auto-generated method stub - - } - - @Override - public Spigot spigot() { - // TODO Auto-generated method stub - return null; + public DiscordConnectedPlayer(IUser user, IChannel channel, UUID uuid) { + super(user, channel, nextEntityId++, uuid); } } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index cb1011f..366626e 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -5,7 +5,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.UUID; +import java.util.function.BiFunction; import java.util.function.Consumer; +import java.util.function.Supplier; import java.util.stream.Collectors; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -127,7 +129,8 @@ public class MCChatListener implements Listener, IListener } public static final HashMap UnconnectedSenders = new HashMap<>(); - public static final HashMap ConnectedSenders = new HashMap<>(); + public static final HashMap ConnectedSenders = new HashMap<>(); + public static final HashMap OnlineSenders = new HashMap<>(); public static short ListC = 0; public static void resetLastMessage() { @@ -216,21 +219,28 @@ public class MCChatListener implements Listener, IListener } } - private DiscordSenderBase getSender(IChannel channel, final IUser author, DiscordPlayer dp) { + @SuppressWarnings("unchecked") + private DiscordSenderBase getSender(IChannel channel, final IUser author, + DiscordPlayer dp) { final DiscordSenderBase dsender; - Player mcp = null; // Offline players can't really run commands, or can they? No, they can't, really. + final Player mcp; final String cid; - if ((cid = dp.getConnectedID(TBMCPlayer.class)) != null // Connected? - && (mcp = Bukkit.getPlayer(UUID.fromString(cid))) != null) { // Execute as ingame player - if (!ConnectedSenders.containsKey(author.getStringID())) - ConnectedSenders.put(author.getStringID(), new DiscordPlayerSender(author, channel, mcp)); - dsender = ConnectedSenders.get(author.getStringID()); - } else { + BiFunction, Supplier, DiscordSenderBase> getsender = (senders, maker) -> { + if (!senders.containsKey(author.getStringID())) + senders.put(author.getStringID(), maker.get()); + return senders.get(author.getStringID()); + }; + if ((cid = dp.getConnectedID(TBMCPlayer.class)) != null) { // Connected? + if ((mcp = Bukkit.getPlayer(UUID.fromString(cid))) != null) // Online? - Execute as ingame player + dsender = getsender.apply((HashMap) OnlineSenders, + () -> (T) new DiscordPlayerSender(author, channel, mcp)); + else // Offline + dsender = getsender.apply((HashMap) ConnectedSenders, + () -> (T) new DiscordConnectedPlayer(author, channel, UUID.fromString(cid))); + } else { // Not connected TBMCPlayer p = dp.getAs(TBMCPlayer.class); - if (!UnconnectedSenders.containsKey(author.getStringID())) - UnconnectedSenders.put(author.getStringID(), - new DiscordSender(author, channel, p == null ? null : p.PlayerName().get())); // Display the playername, if found - dsender = UnconnectedSenders.get(author.getStringID()); + dsender = getsender.apply((HashMap) UnconnectedSenders, + () -> (T) new DiscordSender(author, channel, p == null ? null : p.PlayerName().get())); // Display the playername, if found } return dsender; } diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java new file mode 100644 index 0000000..d3db793 --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java @@ -0,0 +1,721 @@ +package buttondevteam.discordplugin.playerfaker; + +import java.net.InetSocketAddress; +import java.util.*; + +import org.bukkit.*; +import org.bukkit.advancement.Advancement; +import org.bukkit.advancement.AdvancementProgress; +import org.bukkit.conversations.Conversation; +import org.bukkit.conversations.ConversationAbandonedEvent; +import org.bukkit.entity.*; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.map.MapView; +import org.bukkit.plugin.Plugin; +import org.bukkit.scoreboard.Scoreboard; + +import buttondevteam.discordplugin.DiscordPlugin; +import sx.blah.discord.handle.obj.IChannel; +import sx.blah.discord.handle.obj.IUser; + +public class DiscordFakePlayer extends DiscordHumanEntity implements Player { + protected DiscordFakePlayer(IUser user, IChannel channel, int entityId, UUID uuid) { + super(user, channel, entityId, uuid); + } + + @Override + public String getName() { + return user.getName(); + } + + @Override + public EntityType getType() { + return EntityType.PLAYER; + } + + @Override + public String getCustomName() { + return user.getName(); + } + + @Override + public void setCustomName(String name) { + } + + @Override + public boolean isConversing() { + + return false; + } + + @Override + public void acceptConversationInput(String input) { + } + + @Override + public boolean beginConversation(Conversation conversation) { + return false; + } + + @Override + public void abandonConversation(Conversation conversation) { + } + + @Override + public void abandonConversation(Conversation conversation, ConversationAbandonedEvent details) { + } + + @Override + public boolean isOnline() { + return true;// Let's pretend + } + + @Override + public boolean isBanned() { + return false; + } + + @Override + public boolean isWhitelisted() { + return true; + } + + @Override + public void setWhitelisted(boolean value) { + } + + @Override + public Player getPlayer() { + return this; + } + + @Override + public long getFirstPlayed() { + return 0; + } + + @Override + public long getLastPlayed() { + return 0; + } + + @Override + public boolean hasPlayedBefore() { + return false; + } + + @Override + public Map serialize() { + return new HashMap<>(); + } + + @Override + public void sendPluginMessage(Plugin source, String channel, byte[] message) { + } + + @Override + public Set getListeningPluginChannels() { + return Collections.emptySet(); + } + + @Override + public String getDisplayName() { + return user.getNicknameForGuild(DiscordPlugin.mainServer); + } + + @Override + public void setDisplayName(String name) { + } + + @Override + public String getPlayerListName() { + return getName(); + } + + @Override + public void setPlayerListName(String name) { + } + + @Override + public void setCompassTarget(Location loc) { + } + + @Override + public Location getCompassTarget() { + return new Location(Bukkit.getWorlds().get(0), 0, 0, 0); + } + + @Override + public InetSocketAddress getAddress() { + return null; + } + + @Override + public void sendRawMessage(String message) { + sendMessage(message); + } + + @Override + public void kickPlayer(String message) { + } + + @Override + public void chat(String msg) { + Bukkit.getPluginManager() + .callEvent(new AsyncPlayerChatEvent(true, this, msg, new HashSet<>(Bukkit.getOnlinePlayers()))); + } + + @Override + public boolean performCommand(String command) { + return Bukkit.getServer().dispatchCommand(this, command); + } + + @Override + public boolean isSneaking() { + return false; + } + + @Override + public void setSneaking(boolean sneak) { + } + + @Override + public boolean isSprinting() { + return false; + } + + @Override + public void setSprinting(boolean sprinting) { + } + + @Override + public void saveData() { + } + + @Override + public void loadData() { + } + + @Override + public void setSleepingIgnored(boolean isSleeping) { + } + + @Override + public boolean isSleepingIgnored() { + return false; + } + + @Override + public void playNote(Location loc, byte instrument, byte note) { + } + + @Override + public void playNote(Location loc, Instrument instrument, Note note) { + } + + @Override + public void playSound(Location location, Sound sound, float volume, float pitch) { + } + + @Override + public void playSound(Location location, String sound, float volume, float pitch) { + } + + @Override + public void playSound(Location location, Sound sound, SoundCategory category, float volume, float pitch) { + } + + @Override + public void playSound(Location location, String sound, SoundCategory category, float volume, float pitch) { + } + + @Override + public void stopSound(Sound sound) { + } + + @Override + public void stopSound(String sound) { + } + + @Override + public void stopSound(Sound sound, SoundCategory category) { + } + + @Override + public void stopSound(String sound, SoundCategory category) { + } + + @Override + public void playEffect(Location loc, Effect effect, int data) { + } + + @Override + public void playEffect(Location loc, Effect effect, T data) { + } + + @Override + public void sendBlockChange(Location loc, Material material, byte data) { + } + + @Override + public boolean sendChunkChange(Location loc, int sx, int sy, int sz, byte[] data) { + return false; + } + + @Override + public void sendBlockChange(Location loc, int material, byte data) { + } + + @Override + public void sendSignChange(Location loc, String[] lines) throws IllegalArgumentException { + } + + @Override + public void sendMap(MapView map) { + } + + @Override + public void updateInventory() { + } + + @Override + public void awardAchievement(@SuppressWarnings("deprecation") Achievement achievement) { + } + + @Override + public void removeAchievement(@SuppressWarnings("deprecation") Achievement achievement) { + } + + @Override + public boolean hasAchievement(@SuppressWarnings("deprecation") Achievement achievement) { + return false; + } + + @Override + public void incrementStatistic(Statistic statistic) throws IllegalArgumentException { + } + + @Override + public void decrementStatistic(Statistic statistic) throws IllegalArgumentException { + } + + @Override + public void incrementStatistic(Statistic statistic, int amount) throws IllegalArgumentException { + + } + + @Override + public void decrementStatistic(Statistic statistic, int amount) throws IllegalArgumentException { + + } + + @Override + public void setStatistic(Statistic statistic, int newValue) throws IllegalArgumentException { + + } + + @Override + public int getStatistic(Statistic statistic) throws IllegalArgumentException { + + return 0; + } + + @Override + public void incrementStatistic(Statistic statistic, Material material) throws IllegalArgumentException { + + } + + @Override + public void decrementStatistic(Statistic statistic, Material material) throws IllegalArgumentException { + + } + + @Override + public int getStatistic(Statistic statistic, Material material) throws IllegalArgumentException { + + return 0; + } + + @Override + public void incrementStatistic(Statistic statistic, Material material, int amount) throws IllegalArgumentException { + + } + + @Override + public void decrementStatistic(Statistic statistic, Material material, int amount) throws IllegalArgumentException { + + } + + @Override + public void setStatistic(Statistic statistic, Material material, int newValue) throws IllegalArgumentException { + + } + + @Override + public void incrementStatistic(Statistic statistic, EntityType entityType) throws IllegalArgumentException { + + } + + @Override + public void decrementStatistic(Statistic statistic, EntityType entityType) throws IllegalArgumentException { + + } + + @Override + public int getStatistic(Statistic statistic, EntityType entityType) throws IllegalArgumentException { + + return 0; + } + + @Override + public void incrementStatistic(Statistic statistic, EntityType entityType, int amount) + throws IllegalArgumentException { + + } + + @Override + public void decrementStatistic(Statistic statistic, EntityType entityType, int amount) { + + } + + @Override + public void setStatistic(Statistic statistic, EntityType entityType, int newValue) { + + } + + @Override + public void setPlayerTime(long time, boolean relative) { + + } + + @Override + public long getPlayerTime() { + + return 0; + } + + @Override + public long getPlayerTimeOffset() { + + return 0; + } + + @Override + public boolean isPlayerTimeRelative() { + + return false; + } + + @Override + public void resetPlayerTime() { + + } + + @Override + public void setPlayerWeather(WeatherType type) { + + } + + @Override + public WeatherType getPlayerWeather() { + + return null; + } + + @Override + public void resetPlayerWeather() { + + } + + @Override + public void giveExp(int amount) { + + } + + @Override + public void giveExpLevels(int amount) { + + } + + @Override + public float getExp() { + + return 0; + } + + @Override + public void setExp(float exp) { + + } + + @Override + public int getLevel() { + + return 0; + } + + @Override + public void setLevel(int level) { + + } + + @Override + public int getTotalExperience() { + + return 0; + } + + @Override + public void setTotalExperience(int exp) { + + } + + @Override + public float getExhaustion() { + + return 0; + } + + @Override + public void setExhaustion(float value) { + + } + + @Override + public float getSaturation() { + + return 0; + } + + @Override + public void setSaturation(float value) { + + } + + @Override + public int getFoodLevel() { + + return 0; + } + + @Override + public void setFoodLevel(int value) { + + } + + @Override + public Location getBedSpawnLocation() { + return null; + } + + @Override + public void setBedSpawnLocation(Location location) { + } + + @Override + public void setBedSpawnLocation(Location location, boolean force) { + } + + @Override + public boolean getAllowFlight() { + return false; + } + + @Override + public void setAllowFlight(boolean flight) { + } + + @Override + public void hidePlayer(Player player) { + } + + @Override + public void showPlayer(Player player) { + } + + @Override + public boolean canSee(Player player) { // Nobody can see them + return false; + } + + @Override + public boolean isFlying() { + return false; + } + + @Override + public void setFlying(boolean value) { + } + + @Override + public void setFlySpeed(float value) throws IllegalArgumentException { + } + + @Override + public void setWalkSpeed(float value) throws IllegalArgumentException { + } + + @Override + public float getFlySpeed() { + return 0; + } + + @Override + public float getWalkSpeed() { + return 0; + } + + @Override + public void setTexturePack(String url) { + } + + @Override + public void setResourcePack(String url) { + } + + @Override + public void setResourcePack(String url, byte[] hash) { + } + + @Override + public Scoreboard getScoreboard() { + return null; + } + + @Override + public void setScoreboard(Scoreboard scoreboard) throws IllegalArgumentException, IllegalStateException { + } + + @Override + public boolean isHealthScaled() { + return false; + } + + @Override + public void setHealthScaled(boolean scale) { + } + + @Override + public void setHealthScale(double scale) throws IllegalArgumentException { + } + + @Override + public double getHealthScale() { + return 1; + } + + @Override + public Entity getSpectatorTarget() { + return null; + } + + @Override + public void setSpectatorTarget(Entity entity) { + } + + @Override + public void sendTitle(String title, String subtitle) { + } + + @Override + public void sendTitle(String title, String subtitle, int fadeIn, int stay, int fadeOut) { + } + + @Override + public void resetTitle() { + } + + @Override + public void spawnParticle(Particle particle, Location location, int count) { + } + + @Override + public void spawnParticle(Particle particle, double x, double y, double z, int count) { + + + } + + @Override + public void spawnParticle(Particle particle, Location location, int count, T data) { + + + } + + @Override + public void spawnParticle(Particle particle, double x, double y, double z, int count, T data) { + + + } + + @Override + public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, + double offsetZ) { + + + } + + @Override + public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, + double offsetY, double offsetZ) { + + + } + + @Override + public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, + double offsetZ, T data) { + + + } + + @Override + public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, + double offsetY, double offsetZ, T data) { + + + } + + @Override + public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, + double offsetZ, double extra) { + + + } + + @Override + public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, + double offsetY, double offsetZ, double extra) { + + + } + + @Override + public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, + double offsetZ, double extra, T data) { + + + } + + @Override + public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, + double offsetY, double offsetZ, double extra, T data) { + + + } + + @Override + public AdvancementProgress getAdvancementProgress(Advancement advancement) { // TODO: Test + return null; + } + + @Override + public String getLocale() { + + return null; + } + + @Override + public Player.Spigot spigot() { + return new Player.Spigot(); + } +} diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordHumanEntity.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordHumanEntity.java index eab863b..26d220f 100644 --- a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordHumanEntity.java +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordHumanEntity.java @@ -6,16 +6,10 @@ import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Villager; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; +import org.bukkit.inventory.*; import org.bukkit.inventory.InventoryView.Property; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.MainHand; -import org.bukkit.inventory.Merchant; -import org.bukkit.inventory.PlayerInventory; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; @@ -25,15 +19,18 @@ public abstract class DiscordHumanEntity extends DiscordLivingEntity implements super(user, channel, entityId, uuid); } + private PlayerInventory inv = new DiscordPlayerInventory(this); + @Override - public PlayerInventory getInventory() { // TODO - return null; + public PlayerInventory getInventory() { + return inv; } + private Inventory enderchest = new DiscordInventory(this); + @Override public Inventory getEnderChest() { - // TODO Auto-generated method stub - return null; + return enderchest; } @Override @@ -47,159 +44,125 @@ public abstract class DiscordHumanEntity extends DiscordLivingEntity implements } @Override - public InventoryView getOpenInventory() { - // TODO Auto-generated method stub + public InventoryView getOpenInventory() { // TODO: Test return null; } @Override public InventoryView openInventory(Inventory inventory) { - // TODO Auto-generated method stub return null; } @Override public InventoryView openWorkbench(Location location, boolean force) { - // TODO Auto-generated method stub return null; } @Override public InventoryView openEnchanting(Location location, boolean force) { - // TODO Auto-generated method stub return null; } @Override public void openInventory(InventoryView inventory) { - // TODO Auto-generated method stub - } @Override public InventoryView openMerchant(Villager trader, boolean force) { - // TODO Auto-generated method stub return null; } @Override public InventoryView openMerchant(Merchant merchant, boolean force) { - // TODO Auto-generated method stub return null; } @Override public void closeInventory() { - // TODO Auto-generated method stub - } @Override - public ItemStack getItemInHand() { - // TODO Auto-generated method stub + public ItemStack getItemInHand() { // TODO: Test all ItemStack methods return null; } @Override public void setItemInHand(ItemStack item) { - // TODO Auto-generated method stub - } @Override public ItemStack getItemOnCursor() { - // TODO Auto-generated method stub return null; } @Override public void setItemOnCursor(ItemStack item) { - // TODO Auto-generated method stub - } @Override public boolean hasCooldown(Material material) { - // TODO Auto-generated method stub return false; } @Override public int getCooldown(Material material) { - // TODO Auto-generated method stub return 0; } @Override public void setCooldown(Material material, int ticks) { - // TODO Auto-generated method stub - } @Override public boolean isSleeping() { - // TODO Auto-generated method stub return false; } @Override public int getSleepTicks() { - // TODO Auto-generated method stub return 0; } @Override public GameMode getGameMode() { - // TODO Auto-generated method stub - return null; + return GameMode.SPECTATOR; } @Override public void setGameMode(GameMode mode) { - // TODO Auto-generated method stub - } @Override public boolean isBlocking() { - // TODO Auto-generated method stub return false; } @Override public boolean isHandRaised() { - // TODO Auto-generated method stub return false; } @Override public int getExpToLevel() { - // TODO Auto-generated method stub return 0; } @Override public Entity getShoulderEntityLeft() { - // TODO Auto-generated method stub return null; } @Override public void setShoulderEntityLeft(Entity entity) { - // TODO Auto-generated method stub - } @Override public Entity getShoulderEntityRight() { - // TODO Auto-generated method stub return null; } @Override public void setShoulderEntityRight(Entity entity) { - // TODO Auto-generated method stub - } } diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordInventory.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordInventory.java new file mode 100644 index 0000000..f8f9886 --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordInventory.java @@ -0,0 +1,212 @@ +package buttondevteam.discordplugin.playerfaker; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.ListIterator; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.HumanEntity; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +public class DiscordInventory implements Inventory { + public DiscordInventory(DiscordHumanEntity holder) { + this.holder = holder; + } + + @Override + public int getSize() { + return 0; + } + + @Override + public int getMaxStackSize() { + return 0; + } + + @Override + public void setMaxStackSize(int size) { + } + + @Override + public String getName() { + return "Player inventory"; + } + + @Override + public ItemStack getItem(int index) { + return null; + } + + @Override + public HashMap addItem(ItemStack... items) throws IllegalArgumentException { // Can't add anything + return new HashMap<>( + IntStream.range(0, items.length).mapToObj(i -> i).collect(Collectors.toMap(i -> i, i -> items[i]))); + } + + @Override + public HashMap removeItem(ItemStack... items) throws IllegalArgumentException { + return new HashMap<>( + IntStream.range(0, items.length).mapToObj(i -> i).collect(Collectors.toMap(i -> i, i -> items[i]))); + } + + @Override + public ItemStack[] getContents() { + return new ItemStack[0]; + } + + @Override + public void setContents(ItemStack[] items) throws IllegalArgumentException { + if (items.length > 0) + throw new IllegalArgumentException("This inventory does not support items"); + } + + @Override + public ItemStack[] getStorageContents() { + return new ItemStack[0]; + } + + @Override + public void setStorageContents(ItemStack[] items) throws IllegalArgumentException { + if (items.length > 0) + throw new IllegalArgumentException("This inventory does not support items"); + } + + @Override + public boolean contains(int materialId) { + return false; + } + + @Override + public boolean contains(Material material) throws IllegalArgumentException { + return false; + } + + @Override + public boolean contains(ItemStack item) { + return false; + } + + @Override + public boolean contains(int materialId, int amount) { + return false; + } + + @Override + public boolean contains(Material material, int amount) throws IllegalArgumentException { + return false; + } + + @Override + public boolean contains(ItemStack item, int amount) { + return false; + } + + @Override + public boolean containsAtLeast(ItemStack item, int amount) { + return false; + } + + @Override + public HashMap all(int materialId) { + return new HashMap<>(); + } + + @Override + public HashMap all(Material material) throws IllegalArgumentException { + return new HashMap<>(); + } + + @Override + public HashMap all(ItemStack item) { + return new HashMap<>(); + } + + @Override + public int first(int materialId) { + return -1; + } + + @Override + public int first(Material material) throws IllegalArgumentException { + return -1; + } + + @Override + public int first(ItemStack item) { + return -1; + } + + @Override + public int firstEmpty() { + return -1; + } + + @Override + public void remove(int materialId) { + } + + @Override + public void remove(Material material) throws IllegalArgumentException { + } + + @Override + public void remove(ItemStack item) { + } + + @Override + public void clear(int index) { + } + + @Override + public void clear() { + } + + @Override + public List getViewers() { + return new ArrayList<>(0); + } + + @Override + public String getTitle() { + return "Player inventory"; + } + + @Override + public InventoryType getType() { + return InventoryType.PLAYER; + } + + private ListIterator iterator = new ArrayList(0).listIterator(); + + @Override + public ListIterator iterator() { + return iterator; + } + + @Override + public ListIterator iterator(int index) { + return iterator; + } + + @Override + public Location getLocation() { + return holder.getLocation(); + } + + @Override + public void setItem(int index, ItemStack item) { + } + + private HumanEntity holder; + + @Override + public HumanEntity getHolder() { + return holder; + } +} diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordPlayerInventory.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordPlayerInventory.java new file mode 100644 index 0000000..447cbcd --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordPlayerInventory.java @@ -0,0 +1,105 @@ +package buttondevteam.discordplugin.playerfaker; + +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +public class DiscordPlayerInventory extends DiscordInventory implements PlayerInventory { + public DiscordPlayerInventory(DiscordHumanEntity holder) { + super(holder); + } + + @Override + public ItemStack[] getArmorContents() { + return new ItemStack[0]; + } + + @Override + public ItemStack[] getExtraContents() { + return new ItemStack[0]; + } + + @Override + public ItemStack getHelmet() { + return null; + } + + @Override + public ItemStack getChestplate() { + return null; + } + + @Override + public ItemStack getLeggings() { + return null; + } + + @Override + public ItemStack getBoots() { + return null; + } + + @Override + public void setArmorContents(ItemStack[] items) { + } + + @Override + public void setExtraContents(ItemStack[] items) { + } + + @Override + public void setHelmet(ItemStack helmet) { + } + + @Override + public void setChestplate(ItemStack chestplate) { + } + + @Override + public void setLeggings(ItemStack leggings) { + } + + @Override + public void setBoots(ItemStack boots) { + } + + @Override + public ItemStack getItemInMainHand() { + return null; + } + + @Override + public void setItemInMainHand(ItemStack item) { + } + + @Override + public ItemStack getItemInOffHand() { + return null; + } + + @Override + public void setItemInOffHand(ItemStack item) { + } + + @Override + public ItemStack getItemInHand() { + return null; + } + + @Override + public void setItemInHand(ItemStack stack) { + } + + @Override + public int getHeldItemSlot() { + return 0; + } + + @Override + public void setHeldItemSlot(int slot) { + } + + @Override + public int clear(int id, int data) { + return 0; + } +} From 9e85883e34b3085f4b94b8f9d601ff40f1973968 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sat, 8 Jul 2017 02:13:56 +0200 Subject: [PATCH 2/8] Mostly fixed permissions (now it's recursing) --- pom.xml | 18 +++- .../playerfaker/DiscordEntity.java | 23 +---- .../playerfaker/DiscordFakePlayer.java | 23 +++-- .../playerfaker/VaultPermissibleBase.java | 88 +++++++++++++++++++ 4 files changed, 118 insertions(+), 34 deletions(-) create mode 100644 src/main/java/buttondevteam/discordplugin/playerfaker/VaultPermissibleBase.java diff --git a/pom.xml b/pom.xml index 9960a2d..a326fcd 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ - src/main/java + src/main/java src @@ -131,6 +131,10 @@ projectlombok.org http://projectlombok.org/mavenrepo + + pex-repo + http://pex-repo.aoeu.xyz + @@ -188,5 +192,17 @@ 1.16.16 provided + + ru.tehkode + PermissionsEx + 1.23.1 + provided + + + org.bukkit + bukkit + + + diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordEntity.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordEntity.java index b17048a..cd643de 100644 --- a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordEntity.java +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordEntity.java @@ -1,31 +1,19 @@ package buttondevteam.discordplugin.playerfaker; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; +import java.util.*; -import org.bukkit.Bukkit; -import org.bukkit.EntityEffect; -import org.bukkit.Location; -import org.bukkit.Server; -import org.bukkit.World; +import org.bukkit.*; import org.bukkit.block.PistonMoveReaction; import org.bukkit.entity.Entity; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.metadata.MetadataValue; -import org.bukkit.permissions.PermissibleBase; -import org.bukkit.permissions.ServerOperator; import org.bukkit.plugin.Plugin; import org.bukkit.util.Vector; import buttondevteam.discordplugin.DiscordSenderBase; import lombok.Getter; import lombok.Setter; -import lombok.experimental.Delegate; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; @@ -40,12 +28,7 @@ public abstract class DiscordEntity extends DiscordSenderBase implements Entity private HashMap metadata = new HashMap(); - @Delegate - private PermissibleBase perm = new PermissibleBase(new ServerOperator() { - private @Getter @Setter boolean op; - }); - - private Location location; + private Location location = new Location(Bukkit.getWorlds().get(0), 0, 0, 0); private Vector velocity; private final int entityId; private EntityDamageEvent lastDamageCause; diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java index d3db793..9f45372 100644 --- a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java @@ -2,7 +2,6 @@ package buttondevteam.discordplugin.playerfaker; import java.net.InetSocketAddress; import java.util.*; - import org.bukkit.*; import org.bukkit.advancement.Advancement; import org.bukkit.advancement.AdvancementProgress; @@ -15,14 +14,23 @@ import org.bukkit.plugin.Plugin; import org.bukkit.scoreboard.Scoreboard; import buttondevteam.discordplugin.DiscordPlugin; +import lombok.experimental.Delegate; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; public class DiscordFakePlayer extends DiscordHumanEntity implements Player { protected DiscordFakePlayer(IUser user, IChannel channel, int entityId, UUID uuid) { super(user, channel, entityId, uuid); + /* + * try { perm = new PEXPermissible(this, (PermissionsExPlugin) Bukkit.getPluginManager().getPlugin("PermissionsEx")); } catch (ExecutionException | InterruptedException e) { + * e.printStackTrace(); } + */ + perm = new VaultPermissibleBase(this); } + @Delegate + private VaultPermissibleBase perm; + @Override public String getName() { return user.getName(); @@ -120,7 +128,7 @@ public class DiscordFakePlayer extends DiscordHumanEntity implements Player { @Override public String getDisplayName() { - return user.getNicknameForGuild(DiscordPlugin.mainServer); + return user.getDisplayName(DiscordPlugin.mainServer); } @Override @@ -632,75 +640,64 @@ public class DiscordFakePlayer extends DiscordHumanEntity implements Player { @Override public void spawnParticle(Particle particle, double x, double y, double z, int count) { - } @Override public void spawnParticle(Particle particle, Location location, int count, T data) { - } @Override public void spawnParticle(Particle particle, double x, double y, double z, int count, T data) { - } @Override public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ) { - } @Override public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ) { - } @Override public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ, T data) { - } @Override public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, T data) { - } @Override public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ, double extra) { - } @Override public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra) { - } @Override public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ, double extra, T data) { - } @Override public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data) { - } @Override diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/VaultPermissibleBase.java b/src/main/java/buttondevteam/discordplugin/playerfaker/VaultPermissibleBase.java new file mode 100644 index 0000000..733bd4c --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/VaultPermissibleBase.java @@ -0,0 +1,88 @@ +package buttondevteam.discordplugin.playerfaker; + +import java.util.Collections; +import java.util.Set; + +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.bukkit.permissions.Permissible; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.permissions.PermissionAttachmentInfo; +import org.bukkit.plugin.Plugin; + +import buttondevteam.discordplugin.DiscordPlugin; + +public class VaultPermissibleBase implements Permissible { + private Player player; + private OfflinePlayer op; + + public VaultPermissibleBase(Player player) { + this.player = player; + op = Bukkit.getOfflinePlayer(player.getUniqueId()); + } + + @Override + public boolean isPermissionSet(String name) { + return DiscordPlugin.perms.playerHas(player, name); + } + + @Override + public boolean isPermissionSet(Permission perm) { + return DiscordPlugin.perms.playerHas(player, perm.getName()); + } + + @Override + public boolean hasPermission(String inName) { + return DiscordPlugin.perms.playerHas(player, inName); + } + + @Override + public boolean hasPermission(Permission perm) { + return DiscordPlugin.perms.playerHas(player, perm.getName()); + } + + @Override + public boolean isOp() { + return op.isOp(); + } + + @Override + public void setOp(boolean value) { + op.setOp(value); + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value) { + return null; + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin) { + return null; + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value, int ticks) { + return null; + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin, int ticks) { + return null; + } + + @Override + public void removeAttachment(PermissionAttachment attachment) { + } + + @Override + public void recalculatePermissions() { + } + + @Override + public Set getEffectivePermissions() { + return Collections.emptySet(); + } +} From d2467210dd246e5a1dd8f65093286e6a47f4e1b3 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sun, 9 Jul 2017 02:49:18 +0200 Subject: [PATCH 3/8] I HAVE A PLAN! (A todo list) --- .../playerfaker/DiscordFakePlayer.java | 16 ++-- .../playerfaker/VaultPermissibleBase.java | 88 ------------------- 2 files changed, 10 insertions(+), 94 deletions(-) delete mode 100644 src/main/java/buttondevteam/discordplugin/playerfaker/VaultPermissibleBase.java diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java index 9f45372..09ecf9b 100644 --- a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java @@ -9,11 +9,16 @@ import org.bukkit.conversations.Conversation; import org.bukkit.conversations.ConversationAbandonedEvent; import org.bukkit.entity.*; import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.map.MapView; +import org.bukkit.permissions.PermissibleBase; +import org.bukkit.permissions.ServerOperator; import org.bukkit.plugin.Plugin; import org.bukkit.scoreboard.Scoreboard; import buttondevteam.discordplugin.DiscordPlugin; +import lombok.Getter; +import lombok.Setter; import lombok.experimental.Delegate; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; @@ -21,15 +26,14 @@ import sx.blah.discord.handle.obj.IUser; public class DiscordFakePlayer extends DiscordHumanEntity implements Player { protected DiscordFakePlayer(IUser user, IChannel channel, int entityId, UUID uuid) { super(user, channel, entityId, uuid); - /* - * try { perm = new PEXPermissible(this, (PermissionsExPlugin) Bukkit.getPluginManager().getPlugin("PermissionsEx")); } catch (ExecutionException | InterruptedException e) { - * e.printStackTrace(); } - */ - perm = new VaultPermissibleBase(this); + perm = new PermissibleBase(new ServerOperator() { + private @Getter @Setter boolean op; + }); + Bukkit.getPluginManager().callEvent(new PlayerJoinEvent(this, "Discord fake player joined")); } @Delegate - private VaultPermissibleBase perm; + private PermissibleBase perm; @Override public String getName() { diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/VaultPermissibleBase.java b/src/main/java/buttondevteam/discordplugin/playerfaker/VaultPermissibleBase.java deleted file mode 100644 index 733bd4c..0000000 --- a/src/main/java/buttondevteam/discordplugin/playerfaker/VaultPermissibleBase.java +++ /dev/null @@ -1,88 +0,0 @@ -package buttondevteam.discordplugin.playerfaker; - -import java.util.Collections; -import java.util.Set; - -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; -import org.bukkit.permissions.Permissible; -import org.bukkit.permissions.Permission; -import org.bukkit.permissions.PermissionAttachment; -import org.bukkit.permissions.PermissionAttachmentInfo; -import org.bukkit.plugin.Plugin; - -import buttondevteam.discordplugin.DiscordPlugin; - -public class VaultPermissibleBase implements Permissible { - private Player player; - private OfflinePlayer op; - - public VaultPermissibleBase(Player player) { - this.player = player; - op = Bukkit.getOfflinePlayer(player.getUniqueId()); - } - - @Override - public boolean isPermissionSet(String name) { - return DiscordPlugin.perms.playerHas(player, name); - } - - @Override - public boolean isPermissionSet(Permission perm) { - return DiscordPlugin.perms.playerHas(player, perm.getName()); - } - - @Override - public boolean hasPermission(String inName) { - return DiscordPlugin.perms.playerHas(player, inName); - } - - @Override - public boolean hasPermission(Permission perm) { - return DiscordPlugin.perms.playerHas(player, perm.getName()); - } - - @Override - public boolean isOp() { - return op.isOp(); - } - - @Override - public void setOp(boolean value) { - op.setOp(value); - } - - @Override - public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value) { - return null; - } - - @Override - public PermissionAttachment addAttachment(Plugin plugin) { - return null; - } - - @Override - public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value, int ticks) { - return null; - } - - @Override - public PermissionAttachment addAttachment(Plugin plugin, int ticks) { - return null; - } - - @Override - public void removeAttachment(PermissionAttachment attachment) { - } - - @Override - public void recalculatePermissions() { - } - - @Override - public Set getEffectivePermissions() { - return Collections.emptySet(); - } -} From a85b7f9a2d31e914735785dbe180cf66c153b55e Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sun, 9 Jul 2017 21:30:37 +0200 Subject: [PATCH 4/8] Continued work on mcchat --- .../discordplugin/commands/MCChatCommand.java | 4 ++-- .../listeners/MCChatListener.java | 18 ++++++++++++++++-- .../discordplugin/listeners/MCListener.java | 13 +++++++++++-- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java b/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java index e25092c..6d8f736 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java @@ -16,13 +16,13 @@ public class MCChatCommand extends DiscordCommandBase { @Override public void run(IMessage message, String args) { if (!message.getChannel().isPrivate()) { - message.reply("This command can only be issued while DMing the bot."); + message.reply("This command can only be issued in a direct message with the bot."); return; } try (final DiscordPlayer user = DiscordPlayer.getUser(message.getAuthor().getStringID(), DiscordPlayer.class)) { PlayerData mcchat = user.minecraftChat(); mcchat.set(!mcchat.get()); - MCChatListener.privateMCChat(message.getChannel(), mcchat.get()); + MCChatListener.privateMCChat(message.getChannel(), mcchat.get(), message.getAuthor(), user); message.reply("Minecraft chat " + (mcchat.get() // ? "enabled. Use '" + message.getClient().getOurUser().mention() + " mcchat' (with the mention) to disable." // diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 366626e..caacc2d 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -13,6 +13,8 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; import buttondevteam.discordplugin.*; import buttondevteam.lib.*; @@ -123,8 +125,20 @@ public class MCChatListener implements Listener, IListener */ private static ArrayList lastmsgPerUser = new ArrayList(); - public static boolean privateMCChat(IChannel channel, boolean start) { - return start ? lastmsgPerUser.add(new LastMsgData(channel)) + public static boolean privateMCChat(IChannel channel, boolean start, IUser user, DiscordPlayer dp) { + if (start) { + val sender = new DiscordConnectedPlayer(user, channel, + UUID.fromString(dp.getConnectedID(TBMCPlayer.class))); + ConnectedSenders.put(user.getStringID(), sender); + if (!OnlineSenders.containsKey(user.getStringID()))// If the player is online, that takes precedence + Bukkit.getPluginManager().callEvent(new PlayerJoinEvent(sender, "")); + } else { + val sender = ConnectedSenders.remove(user.getStringID()); + if (!OnlineSenders.containsKey(user.getStringID()))// If the player is online, that takes precedence + Bukkit.getPluginManager().callEvent(new PlayerQuitEvent(sender, "")); + } + return start // + ? lastmsgPerUser.add(new LastMsgData(channel)) // : lastmsgPerUser.removeIf(lmd -> lmd.channel.getLongID() == channel.getLongID()); } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java index 89af699..8dbec53 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java @@ -1,6 +1,5 @@ package buttondevteam.discordplugin.listeners; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -10,7 +9,9 @@ import org.bukkit.event.server.ServerCommandEvent; import com.earth2me.essentials.CommandSource; +import buttondevteam.discordplugin.DiscordConnectedPlayer; import buttondevteam.discordplugin.DiscordPlayer; +import buttondevteam.discordplugin.DiscordPlayerSender; import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.discordplugin.commands.ConnectCommand; import buttondevteam.lib.TBMCCoreAPI; @@ -24,7 +25,12 @@ import sx.blah.discord.util.MissingPermissionsException; public class MCListener implements Listener { @EventHandler public void onPlayerJoin(TBMCPlayerJoinEvent e) { - final Player p = Bukkit.getPlayer(e.GetPlayer().getUUID()); + if (e.getPlayer() instanceof DiscordConnectedPlayer) + return; // Don't show the joined message for the fake player + final Player p = e.getPlayer(); + DiscordPlayer dp = e.GetPlayer().getAs(DiscordPlayer.class); + // if(dp!=null) //TODO + // MCChatListener.OnlineSenders.put(dp.getDiscordID(), new DiscordPlayerSender(DiscordPlugin.dc.getUserByID(Long.parseLong(dp.getDiscordID()), channel, player)) if (ConnectCommand.WaitingToConnect.containsKey(e.GetPlayer().PlayerName().get())) { IUser user = DiscordPlugin.dc .getUserByID(Long.parseLong(ConnectCommand.WaitingToConnect.get(e.GetPlayer().PlayerName().get()))); @@ -39,6 +45,9 @@ public class MCListener implements Listener { @EventHandler public void onPlayerLeave(TBMCPlayerQuitEvent e) { + if (MCChatListener.OnlineSenders.entrySet() + .removeIf(entry -> entry.getValue().getUniqueId().equals(e.getPlayer().getUniqueId()))) + ; // TODO DiscordPlugin.sendMessageToChannel(DiscordPlugin.chatchannel, e.GetPlayer().PlayerName().get() + " left the game"); } From abe8af501e37c0742d580331d1e0ffa25c14b6f1 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Mon, 10 Jul 2017 14:28:04 +0200 Subject: [PATCH 5/8] I HAVE A MORE WORKED OUT PLAN --- .../listeners/MCChatListener.java | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index caacc2d..e97cefe 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -126,22 +126,37 @@ public class MCChatListener implements Listener, IListener private static ArrayList lastmsgPerUser = new ArrayList(); public static boolean privateMCChat(IChannel channel, boolean start, IUser user, DiscordPlayer dp) { - if (start) { - val sender = new DiscordConnectedPlayer(user, channel, - UUID.fromString(dp.getConnectedID(TBMCPlayer.class))); - ConnectedSenders.put(user.getStringID(), sender); - if (!OnlineSenders.containsKey(user.getStringID()))// If the player is online, that takes precedence - Bukkit.getPluginManager().callEvent(new PlayerJoinEvent(sender, "")); - } else { - val sender = ConnectedSenders.remove(user.getStringID()); - if (!OnlineSenders.containsKey(user.getStringID()))// If the player is online, that takes precedence - Bukkit.getPluginManager().callEvent(new PlayerQuitEvent(sender, "")); + TBMCPlayer mcp = dp.getAs(TBMCPlayer.class); + if (mcp != null) { // If the accounts aren't connected, can't make a connected sender + val p = Bukkit.getPlayer(mcp.getUUID()); + if (start) { + val sender = new DiscordConnectedPlayer(user, channel, mcp.getUUID()); + ConnectedSenders.put(user.getStringID(), sender); + if (p == null)// If the player is online, that takes precedence + Bukkit.getPluginManager().callEvent(new PlayerJoinEvent(sender, "")); + } else { + val sender = ConnectedSenders.remove(user.getStringID()); + if (p == null)// If the player is online, that takes precedence + Bukkit.getPluginManager().callEvent(new PlayerQuitEvent(sender, "")); + } } return start // ? lastmsgPerUser.add(new LastMsgData(channel)) // : lastmsgPerUser.removeIf(lmd -> lmd.channel.getLongID() == channel.getLongID()); } + // + // ......................DiscordSender....DiscordConnectedPlayer.DiscordPlayerSender + // Offline public chat......x............................................ + // Online public chat.......x...........................................x + // Offline private chat.....x.......................x.................... + // Online private chat......x.......................x...................x + // If online and enabling private chat, don't login + // If leaving the server and private chat is enabled (has ConnectedPlayer), call login in a task on lowest priority + // If private chat is enabled and joining the server, logout the fake player on highest priority + // If online and disabling private chat, don't logout + // The maps may not contain the senders except for DiscordPlayerSender + public static final HashMap UnconnectedSenders = new HashMap<>(); public static final HashMap ConnectedSenders = new HashMap<>(); public static final HashMap OnlineSenders = new HashMap<>(); From a501d9d457615de476321da27f5829ad5c6bf7cb Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Wed, 12 Jul 2017 00:00:19 +0200 Subject: [PATCH 6/8] Lot of bugfixes and improvements for mcchat #12 (PM support should be finished) #13 works In no particular order: Fixed duplicate responses, messages, wrong quit/join event calls, made the private chat enabled state only persist until the server is restarted, testing message always appears in PMs, added separate senders for public and private chat, sending all kinds of messages to private chat as well, adjusted message for non-whitelisted cmds, changed a lot on sender getting etc. 1-2 hours of sleep, then work, then programming in the morning, more sleep, more programming throughout the day. --- .../discordplugin/DiscordPlayer.java | 11 ++- .../discordplugin/DiscordPlugin.java | 3 +- .../discordplugin/commands/MCChatCommand.java | 19 +++-- .../listeners/CommandListener.java | 9 +- .../listeners/MCChatListener.java | 83 ++++++++++--------- .../discordplugin/listeners/MCListener.java | 45 ++++++---- .../playerfaker/DiscordFakePlayer.java | 2 - 7 files changed, 97 insertions(+), 75 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlayer.java b/src/main/java/buttondevteam/discordplugin/DiscordPlayer.java index 48d957a..ec7863c 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlayer.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlayer.java @@ -1,12 +1,13 @@ package buttondevteam.discordplugin; +import buttondevteam.discordplugin.listeners.MCChatListener; import buttondevteam.lib.player.ChromaGamerBase; -import buttondevteam.lib.player.PlayerData; import buttondevteam.lib.player.UserClass; @UserClass(foldername = "discord") public class DiscordPlayer extends ChromaGamerBase { private String did; + // private @Getter @Setter boolean minecraftChatEnabled; public DiscordPlayer() { } @@ -17,7 +18,11 @@ public class DiscordPlayer extends ChromaGamerBase { return did; } - public PlayerData minecraftChat() { - return data(false); + /** + * Returns true if player has the private Minecraft chat enabled. For setting the value, see + * {@link MCChatListener#privateMCChat(sx.blah.discord.handle.obj.IChannel, boolean, sx.blah.discord.handle.obj.IUser, DiscordPlayer)} + */ + public boolean isMinecraftChatEnabled() { + return MCChatListener.isMinecraftChatEnabled(this); } } diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index 2517692..8c446e3 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -256,7 +256,8 @@ public class DiscordPlugin extends JavaPlugin implements IListener { if (channel == chatchannel) MCChatListener.resetLastMessage(); // If this is a chat message, it'll be set again final String content = TBMCCoreAPI.IsTestServer() && channel != chatchannel || channel == botroomchannel // Both are the same for testing - ? "*The following message is from a test server*\n" + message : message; + || channel.isPrivate() // + ? "*The following message is from a test server*\n" + message : message; return perform( () -> embed == null ? channel.sendMessage(content) : channel.sendMessage(content, embed, false)); } catch (Exception e) { diff --git a/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java b/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java index 6d8f736..a629eda 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java @@ -1,9 +1,9 @@ package buttondevteam.discordplugin.commands; import buttondevteam.discordplugin.DiscordPlayer; +import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.discordplugin.listeners.MCChatListener; import buttondevteam.lib.TBMCCoreAPI; -import buttondevteam.lib.player.PlayerData; import sx.blah.discord.handle.obj.IMessage; public class MCChatCommand extends DiscordCommandBase { @@ -16,17 +16,18 @@ public class MCChatCommand extends DiscordCommandBase { @Override public void run(IMessage message, String args) { if (!message.getChannel().isPrivate()) { - message.reply("This command can only be issued in a direct message with the bot."); + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "This command can only be issued in a direct message with the bot."); return; } try (final DiscordPlayer user = DiscordPlayer.getUser(message.getAuthor().getStringID(), DiscordPlayer.class)) { - PlayerData mcchat = user.minecraftChat(); - mcchat.set(!mcchat.get()); - MCChatListener.privateMCChat(message.getChannel(), mcchat.get(), message.getAuthor(), user); - message.reply("Minecraft chat " + (mcchat.get() // - ? "enabled. Use '" + message.getClient().getOurUser().mention() - + " mcchat' (with the mention) to disable." // - : "disabled.")); + boolean mcchat = !user.isMinecraftChatEnabled(); + MCChatListener.privateMCChat(message.getChannel(), mcchat, message.getAuthor(), user); + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "Minecraft chat " + (mcchat // + ? "enabled. Use '" + message.getClient().getOurUser().mention() + + " mcchat' (with the mention) to disable." // + : "disabled.")); } catch (Exception e) { TBMCCoreAPI.SendException("Error while setting mcchat for user" + message.getAuthor().getName(), e); } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java index 8313ffa..ddad886 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -59,13 +59,10 @@ public class CommandListener { if (event.getMessage().getAuthor().isBot()) return; final IChannel channel = event.getMessage().getChannel(); - if (!channel.getStringID().equals(DiscordPlugin.botchannel.getStringID()) - && (!channel.isPrivate() || DiscordPlugin.checkIfSomeoneIsTestingWhileWeArent())) + if (!channel.getStringID().equals(DiscordPlugin.botchannel.getStringID())) return; if (channel.getStringID().equals(DiscordPlugin.chatchannel.getStringID())) return; // The chat code already handles this - Right now while testing botchannel is the same as chatchannel - if (DiscordPlayer.getUser(event.getAuthor().getStringID(), DiscordPlayer.class).minecraftChat().get()) // Let the MCChatListener handle it - return; event.getMessage().getChannel().setTypingStatus(true); // Fun runCommand(event.getMessage(), true); } @@ -84,8 +81,8 @@ public class CommandListener { DiscordPlugin.sendMessageToChannel(event.getMessage().getChannel(), serverReadyStrings[next]); } if (!event.getMessage().getChannel().isPrivate() // - || DiscordPlayer.getUser(event.getAuthor().getStringID(), DiscordPlayer.class).minecraftChat() - .get() + || DiscordPlayer.getUser(event.getAuthor().getStringID(), DiscordPlayer.class) + .isMinecraftChatEnabled() || DiscordPlugin.checkIfSomeoneIsTestingWhileWeArent()) return; if (event.getMessage().getAuthor().isBot()) diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index e97cefe..dfeb248 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -4,11 +4,12 @@ import java.awt.Color; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; -import java.util.UUID; -import java.util.function.BiFunction; +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Collectors; +import java.util.stream.Stream; + import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -75,7 +76,7 @@ public class MCChatListener implements Listener, IListener final IUser iUser = data.channel.getUsersHere().stream() .filter(u -> u.getLongID() != u.getClient().getOurUser().getLongID()).findFirst().get(); // Doesn't support group DMs final DiscordPlayer user = DiscordPlayer.getUser(iUser.getStringID(), DiscordPlayer.class); - if (user.minecraftChat().get() && e.shouldSendTo(getSender(data.channel, iUser, user))) + if (user.isMinecraftChatEnabled() && e.shouldSendTo(getSender(data.channel, iUser, user))) doit.accept(data); } } // TODO: Author URL @@ -132,11 +133,11 @@ public class MCChatListener implements Listener, IListener if (start) { val sender = new DiscordConnectedPlayer(user, channel, mcp.getUUID()); ConnectedSenders.put(user.getStringID(), sender); - if (p == null)// If the player is online, that takes precedence + if (p == null)// Player is offline - If the player is online, that takes precedence Bukkit.getPluginManager().callEvent(new PlayerJoinEvent(sender, "")); } else { val sender = ConnectedSenders.remove(user.getStringID()); - if (p == null)// If the player is online, that takes precedence + if (p == null)// Player is offline - If the player is online, that takes precedence Bukkit.getPluginManager().callEvent(new PlayerQuitEvent(sender, "")); } } @@ -145,7 +146,6 @@ public class MCChatListener implements Listener, IListener : lastmsgPerUser.removeIf(lmd -> lmd.channel.getLongID() == channel.getLongID()); } - // // ......................DiscordSender....DiscordConnectedPlayer.DiscordPlayerSender // Offline public chat......x............................................ // Online public chat.......x...........................................x @@ -155,10 +155,21 @@ public class MCChatListener implements Listener, IListener // If leaving the server and private chat is enabled (has ConnectedPlayer), call login in a task on lowest priority // If private chat is enabled and joining the server, logout the fake player on highest priority // If online and disabling private chat, don't logout - // The maps may not contain the senders except for DiscordPlayerSender + // The maps may not contain the senders for UnconnectedSenders + public static boolean isMinecraftChatEnabled(DiscordPlayer dp) { + return lastmsgPerUser.stream().anyMatch( + lmd -> ((IPrivateChannel) lmd.channel).getRecipient().getStringID().equals(dp.getDiscordID())); + } + + /** + * May contain P<DiscordID> as key for public chat + */ public static final HashMap UnconnectedSenders = new HashMap<>(); public static final HashMap ConnectedSenders = new HashMap<>(); + /** + * May contain P<DiscordID> as key for public chat + */ public static final HashMap OnlineSenders = new HashMap<>(); public static short ListC = 0; @@ -166,12 +177,18 @@ public class MCChatListener implements Listener, IListener (lastmsgdata == null ? lastmsgdata = new LastMsgData(DiscordPlugin.chatchannel) : lastmsgdata).message = null; // Don't set the whole object to null, the player and channel information should } // be preserved + public static void sendSystemMessageToChat(String msg) { + DiscordPlugin.sendMessageToChannel(DiscordPlugin.chatchannel, msg); + for (LastMsgData data : lastmsgPerUser) + DiscordPlugin.sendMessageToChannel(data.channel, msg); + } + @Override // Discord public void handle(MessageReceivedEvent event) { val author = event.getMessage().getAuthor(); val user = DiscordPlayer.getUser(author.getStringID(), DiscordPlayer.class); if (!event.getMessage().getChannel().getStringID().equals(DiscordPlugin.chatchannel.getStringID()) - && !(event.getMessage().getChannel().isPrivate() && user.minecraftChat().get() + && !(event.getMessage().getChannel().isPrivate() && user.isMinecraftChatEnabled() && !DiscordPlugin.checkIfSomeoneIsTestingWhileWeArent())) return; resetLastMessage(); @@ -200,12 +217,13 @@ public class MCChatListener implements Listener, IListener if (dsender instanceof DiscordSender && !Arrays.stream(UnconnectedCmds) .anyMatch(s -> cmd.equals(s) || cmd.startsWith(s + " "))) { // Command not whitelisted - dsender.sendMessage( // TODO - "Sorry, you need to be online on the server and have your accounts connected, you can only access these commands:\n" - + Arrays.stream(UnconnectedCmds).map(uc -> "/" + uc) - .collect(Collectors.joining(", ")) - + "\nTo connect your accounts, use @ChromaBot connect in " - + DiscordPlugin.botchannel.mention()); + dsender.sendMessage("Sorry, you can only access these commands:\n" + + Arrays.stream(UnconnectedCmds).map(uc -> "/" + uc).collect(Collectors.joining(", ")) + + (user.getConnectedID(TBMCPlayer.class) == null + ? "\nTo access your commands, first please connect your accounts, using @ChromaBot connect in " + + DiscordPlugin.botchannel.mention() + + "\nThen you can access all of your regular commands (even offline) in private chat: DM me `mcchat`!" + : "\nYou can access all of your regular commands (even offline) in private chat: DM me `mcchat`!")); return; } if (lastlist > 5) { @@ -248,29 +266,18 @@ public class MCChatListener implements Listener, IListener } } - @SuppressWarnings("unchecked") - private DiscordSenderBase getSender(IChannel channel, final IUser author, - DiscordPlayer dp) { - final DiscordSenderBase dsender; - final Player mcp; - final String cid; - BiFunction, Supplier, DiscordSenderBase> getsender = (senders, maker) -> { - if (!senders.containsKey(author.getStringID())) - senders.put(author.getStringID(), maker.get()); - return senders.get(author.getStringID()); - }; - if ((cid = dp.getConnectedID(TBMCPlayer.class)) != null) { // Connected? - if ((mcp = Bukkit.getPlayer(UUID.fromString(cid))) != null) // Online? - Execute as ingame player - dsender = getsender.apply((HashMap) OnlineSenders, - () -> (T) new DiscordPlayerSender(author, channel, mcp)); - else // Offline - dsender = getsender.apply((HashMap) ConnectedSenders, - () -> (T) new DiscordConnectedPlayer(author, channel, UUID.fromString(cid))); - } else { // Not connected - TBMCPlayer p = dp.getAs(TBMCPlayer.class); - dsender = getsender.apply((HashMap) UnconnectedSenders, - () -> (T) new DiscordSender(author, channel, p == null ? null : p.PlayerName().get())); // Display the playername, if found - } - return dsender; + /** + * This method will find the best sender to use: if the player is online, use that, if not but connected then use that etc. + */ + private DiscordSenderBase getSender(IChannel channel, final IUser author, DiscordPlayer dp) { + val key = (channel.isPrivate() ? "" : "P") + author.getStringID(); + return Stream.>>of( // https://stackoverflow.com/a/28833677/2703239 + () -> Optional.ofNullable(OnlineSenders.get(key)), // Find first non-null + () -> Optional.ofNullable(ConnectedSenders.get(author.getStringID())), // This doesn't support it + () -> Optional.ofNullable(UnconnectedSenders.get(key)), () -> { + val dsender = new DiscordSender(author, channel); + UnconnectedSenders.put(key, dsender); + return Optional.of(dsender); + }).map(Supplier::get).filter(Optional::isPresent).map(Optional::get).findFirst().get(); } } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java index 8dbec53..dc7fcad 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java @@ -1,10 +1,13 @@ package buttondevteam.discordplugin.listeners; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.server.ServerCommandEvent; import com.earth2me.essentials.CommandSource; @@ -16,6 +19,7 @@ import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.discordplugin.commands.ConnectCommand; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.player.*; +import lombok.val; import net.ess3.api.events.*; import sx.blah.discord.handle.obj.IRole; import sx.blah.discord.handle.obj.IUser; @@ -23,14 +27,22 @@ import sx.blah.discord.util.DiscordException; import sx.blah.discord.util.MissingPermissionsException; public class MCListener implements Listener { - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onPlayerJoin(TBMCPlayerJoinEvent e) { if (e.getPlayer() instanceof DiscordConnectedPlayer) return; // Don't show the joined message for the fake player final Player p = e.getPlayer(); DiscordPlayer dp = e.GetPlayer().getAs(DiscordPlayer.class); - // if(dp!=null) //TODO - // MCChatListener.OnlineSenders.put(dp.getDiscordID(), new DiscordPlayerSender(DiscordPlugin.dc.getUserByID(Long.parseLong(dp.getDiscordID()), channel, player)) + if (dp != null) { + val user = DiscordPlugin.dc.getUserByID(Long.parseLong(dp.getDiscordID())); + MCChatListener.OnlineSenders.put(dp.getDiscordID(), + new DiscordPlayerSender(user, user.getOrCreatePMChannel(), p)); + MCChatListener.OnlineSenders.put("P" + dp.getDiscordID(), + new DiscordPlayerSender(user, DiscordPlugin.chatchannel, p)); + MCChatListener.ConnectedSenders.values().stream() + .filter(s -> s.getUniqueId().equals(e.getPlayer().getUniqueId())).findAny() + .ifPresent(dcp -> Bukkit.getPluginManager().callEvent(new PlayerQuitEvent(dcp, ""))); + } if (ConnectCommand.WaitingToConnect.containsKey(e.GetPlayer().PlayerName().get())) { IUser user = DiscordPlugin.dc .getUserByID(Long.parseLong(ConnectCommand.WaitingToConnect.get(e.GetPlayer().PlayerName().get()))); @@ -38,18 +50,20 @@ public class MCListener implements Listener { + " do /discord accept"); p.sendMessage("§bIf it wasn't you, do /discord decline"); } - DiscordPlugin.sendMessageToChannel(DiscordPlugin.chatchannel, - e.GetPlayer().PlayerName().get() + " joined the game"); + MCChatListener.sendSystemMessageToChat(e.GetPlayer().PlayerName().get() + " joined the game"); MCChatListener.ListC = 0; } - @EventHandler + @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerLeave(TBMCPlayerQuitEvent e) { - if (MCChatListener.OnlineSenders.entrySet() - .removeIf(entry -> entry.getValue().getUniqueId().equals(e.getPlayer().getUniqueId()))) - ; // TODO - DiscordPlugin.sendMessageToChannel(DiscordPlugin.chatchannel, - e.GetPlayer().PlayerName().get() + " left the game"); + if (e.getPlayer() instanceof DiscordConnectedPlayer) + return; // Only care about real users + MCChatListener.OnlineSenders.entrySet() + .removeIf(entry -> entry.getValue().getUniqueId().equals(e.getPlayer().getUniqueId())); + MCChatListener.ConnectedSenders.values().stream() + .filter(s -> s.getUniqueId().equals(e.getPlayer().getUniqueId())).findAny() + .ifPresent(dcp -> Bukkit.getPluginManager().callEvent(new PlayerJoinEvent(dcp, ""))); + MCChatListener.sendSystemMessageToChat(e.GetPlayer().PlayerName().get() + " left the game"); } @EventHandler @@ -70,16 +84,15 @@ public class MCListener implements Listener { @EventHandler(priority = EventPriority.LOW) public void onPlayerDeath(PlayerDeathEvent e) { - DiscordPlugin.sendMessageToChannel(DiscordPlugin.chatchannel, e.getDeathMessage()); + MCChatListener.sendSystemMessageToChat(e.getDeathMessage()); } @EventHandler public void onPlayerAFK(AfkStatusChangeEvent e) { - if (e.isCancelled()) + if (e.isCancelled() || !e.getAffected().getBase().isOnline()) return; - DiscordPlugin.sendMessageToChannel(DiscordPlugin.chatchannel, - DiscordPlugin.sanitizeString(e.getAffected().getBase().getDisplayName()) + " is " - + (e.getValue() ? "now" : "no longer") + " AFK."); + MCChatListener.sendSystemMessageToChat(DiscordPlugin.sanitizeString(e.getAffected().getBase().getDisplayName()) + + " is " + (e.getValue() ? "now" : "no longer") + " AFK."); } @EventHandler diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java index 09ecf9b..729c873 100644 --- a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java @@ -9,7 +9,6 @@ import org.bukkit.conversations.Conversation; import org.bukkit.conversations.ConversationAbandonedEvent; import org.bukkit.entity.*; import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.map.MapView; import org.bukkit.permissions.PermissibleBase; import org.bukkit.permissions.ServerOperator; @@ -29,7 +28,6 @@ public class DiscordFakePlayer extends DiscordHumanEntity implements Player { perm = new PermissibleBase(new ServerOperator() { private @Getter @Setter boolean op; }); - Bukkit.getPluginManager().callEvent(new PlayerJoinEvent(this, "Discord fake player joined")); } @Delegate From fd14bf195483a9e781a8997402a27a03d2fc8475 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Thu, 13 Jul 2017 00:58:05 +0200 Subject: [PATCH 7/8] FINISHED mcchat! #12 #13 Vanilla commands are supported as well Now it'll send the command output to the player as well, if ran on Discord Minecraft chat sending to Discord made async Started using CraftBukkit Updated Travis config according to that --- .travis.yml | 24 +++- deploy.sh | 10 ++ pom.xml | 6 + .../discordplugin/DiscordConnectedPlayer.java | 8 +- .../discordplugin/DiscordPlayerSender.java | 21 +++- .../discordplugin/IMCPlayer.java | 9 ++ .../listeners/MCChatListener.java | 92 ++++++++------- .../playerfaker/DiscordFakePlayer.java | 7 +- .../playerfaker/VanillaCommandListener.java | 110 ++++++++++++++++++ 9 files changed, 230 insertions(+), 57 deletions(-) create mode 100644 deploy.sh create mode 100644 src/main/java/buttondevteam/discordplugin/IMCPlayer.java create mode 100644 src/main/java/buttondevteam/discordplugin/playerfaker/VanillaCommandListener.java diff --git a/.travis.yml b/.travis.yml index bf018d2..8e4a89e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,26 @@ +cache: + directories: + - $HOME/.m2/repository/org/bukkit/craftbukkit +before_install: | # Wget BuildTools and run if cached folder not found + if [ ! -d "$HOME/.m2/repository/org/bukkit/craftbukkit/1.12-R0.1-SNAPSHOT" ]; then + wget -O BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar +# grep so that download counts don't appear in log files + - java -jar BuildTools.jar --rev 1.12 | grep -vE "[^/ ]*/[^/ ]*\s*KB\s*$" | grep -v "^\s*$" + fi language: java jdk: - oraclejdk8 - \ No newline at end of file +sudo: true +deploy: + # deploy develop to the staging environment + - provider: script + script: chmod +x deploy.sh && sh deploy.sh staging + on: + branch: dev + skip_cleanup: true + # deploy master to production + - provider: script + script: chmod +x deploy.sh && sh deploy.sh production + on: + branch: master + skip_cleanup: true diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..606423b --- /dev/null +++ b/deploy.sh @@ -0,0 +1,10 @@ +#!/bin/sh +FILENAME=$(find target/ -maxdepth 1 ! -name '*original*' -name '*.jar') +echo Found file: $FILENAME + +if [ $1 = 'production' ]; then +echo Production mode +echo $UPLOAD_KEY > upload_key +chmod 400 upload_key +yes | scp -B -i upload_key -o StrictHostKeyChecking=no $FILENAME travis@server.figytuna.com:/minecraft/main/plugins +fi diff --git a/pom.xml b/pom.xml index a326fcd..c6ea957 100644 --- a/pom.xml +++ b/pom.xml @@ -150,6 +150,12 @@ 1.12-R0.1-SNAPSHOT provided + + org.spigotmc + spigot + 1.12-R0.1-SNAPSHOT + provided + com.github.austinv11 Discord4j diff --git a/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java b/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java index a669d0d..c10f13b 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordConnectedPlayer.java @@ -3,14 +3,18 @@ package buttondevteam.discordplugin; import java.util.UUID; import buttondevteam.discordplugin.playerfaker.DiscordFakePlayer; +import buttondevteam.discordplugin.playerfaker.VanillaCommandListener; +import lombok.Getter; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; -public class DiscordConnectedPlayer extends DiscordFakePlayer { - private static int nextEntityId = 0; +public class DiscordConnectedPlayer extends DiscordFakePlayer implements IMCPlayer { + private static int nextEntityId = 10000; + private @Getter VanillaCommandListener vanillaCmdListener; public DiscordConnectedPlayer(IUser user, IChannel channel, UUID uuid) { super(user, channel, nextEntityId++, uuid); + vanillaCmdListener = new VanillaCommandListener<>(this); } } diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.java b/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.java index 3edf995..97c3aef 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.java @@ -31,20 +31,33 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.Scoreboard; import org.bukkit.util.Vector; +import buttondevteam.discordplugin.playerfaker.VanillaCommandListener; +import lombok.Getter; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; @SuppressWarnings("deprecation") -public class DiscordPlayerSender extends DiscordSenderBase implements Player { +public class DiscordPlayerSender extends DiscordSenderBase implements IMCPlayer { protected Player player; - // protected @Delegate(excludes = ProjectileSource.class) Player player; - // protected @Delegate(excludes = { ProjectileSource.class, Permissible.class }) Player player; - // protected @Delegate(excludes = { ProjectileSource.class, CommandSender.class }) Player player; + private @Getter VanillaCommandListener vanillaCmdListener; public DiscordPlayerSender(IUser user, IChannel channel, Player player) { super(user, channel); this.player = player; + vanillaCmdListener = new VanillaCommandListener(this); + } + + @Override + public void sendMessage(String message) { + player.sendMessage(message); + super.sendMessage(message); + } + + @Override + public void sendMessage(String[] messages) { + player.sendMessage(messages); + super.sendMessage(messages); } @Override diff --git a/src/main/java/buttondevteam/discordplugin/IMCPlayer.java b/src/main/java/buttondevteam/discordplugin/IMCPlayer.java new file mode 100644 index 0000000..e52539d --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/IMCPlayer.java @@ -0,0 +1,9 @@ +package buttondevteam.discordplugin; + +import org.bukkit.entity.Player; + +import buttondevteam.discordplugin.playerfaker.VanillaCommandListener; + +public interface IMCPlayer> extends Player { + VanillaCommandListener getVanillaCmdListener(); +} diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index dfeb248..5160f05 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -18,6 +18,7 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import buttondevteam.discordplugin.*; +import buttondevteam.discordplugin.playerfaker.VanillaCommandListener; import buttondevteam.lib.*; import buttondevteam.lib.chat.Channel; import buttondevteam.lib.chat.TBMCChatAPI; @@ -36,50 +37,53 @@ public class MCChatListener implements Listener, IListener return; if (e.getSender() instanceof DiscordSender || e.getSender() instanceof DiscordPlayerSender) return; - synchronized (this) { - final String authorPlayer = DiscordPlugin.sanitizeString(e.getSender() instanceof Player // - ? ((Player) e.getSender()).getDisplayName() // - : e.getSender().getName()); - final EmbedBuilder embed = new EmbedBuilder().withAuthorName(authorPlayer).withDescription(e.getMessage()) - .withColor(new Color(e.getChannel().color.getRed(), e.getChannel().color.getGreen(), - e.getChannel().color.getBlue())); - if (e.getSender() instanceof Player) - embed.withAuthorIcon("https://minotar.net/avatar/" + ((Player) e.getSender()).getName() + "/32.png"); - final long nanoTime = System.nanoTime(); - Consumer doit = lastmsgdata -> { - final EmbedObject embedObject = embed.build(); - String msg = lastmsgdata.channel.isPrivate() ? DiscordPlugin.sanitizeString(e.getChannel().DisplayName) - : ""; - if (lastmsgdata.message == null || lastmsgdata.message.isDeleted() - || !authorPlayer.equals(lastmsgdata.message.getEmbeds().get(0).getAuthor().getName()) - || lastmsgdata.time / 1000000000f < nanoTime / 1000000000f - 120 - || !lastmsgdata.mcchannel.ID.equals(e.getChannel().ID)) { - lastmsgdata.message = DiscordPlugin.sendMessageToChannel(lastmsgdata.channel, msg, embedObject); - lastmsgdata.time = nanoTime; - lastmsgdata.mcchannel = e.getChannel(); - lastmsgdata.content = embedObject.description; - } else - try { - lastmsgdata.content = embedObject.description = lastmsgdata.content + "\n" - + embedObject.description;// The message object doesn't get updated - final LastMsgData _lastmsgdata = lastmsgdata; - DiscordPlugin.perform(() -> _lastmsgdata.message.edit(msg, embedObject)); - } catch (MissingPermissionsException | DiscordException e1) { - TBMCCoreAPI.SendException("An error occured while editing chat message!", e1); - } - }; - if (e.getChannel().equals(Channel.GlobalChat)) - doit.accept( - lastmsgdata == null ? lastmsgdata = new LastMsgData(DiscordPlugin.chatchannel) : lastmsgdata); + Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, () -> { + synchronized (this) { + final String authorPlayer = DiscordPlugin.sanitizeString(e.getSender() instanceof Player // + ? ((Player) e.getSender()).getDisplayName() // + : e.getSender().getName()); + final EmbedBuilder embed = new EmbedBuilder().withAuthorName(authorPlayer) + .withDescription(e.getMessage()).withColor(new Color(e.getChannel().color.getRed(), + e.getChannel().color.getGreen(), e.getChannel().color.getBlue())); + if (e.getSender() instanceof Player) + embed.withAuthorIcon( + "https://minotar.net/avatar/" + ((Player) e.getSender()).getName() + "/32.png"); + final long nanoTime = System.nanoTime(); + Consumer doit = lastmsgdata -> { + final EmbedObject embedObject = embed.build(); + String msg = lastmsgdata.channel.isPrivate() + ? DiscordPlugin.sanitizeString(e.getChannel().DisplayName) : ""; + if (lastmsgdata.message == null || lastmsgdata.message.isDeleted() + || !authorPlayer.equals(lastmsgdata.message.getEmbeds().get(0).getAuthor().getName()) + || lastmsgdata.time / 1000000000f < nanoTime / 1000000000f - 120 + || !lastmsgdata.mcchannel.ID.equals(e.getChannel().ID)) { + lastmsgdata.message = DiscordPlugin.sendMessageToChannel(lastmsgdata.channel, msg, embedObject); + lastmsgdata.time = nanoTime; + lastmsgdata.mcchannel = e.getChannel(); + lastmsgdata.content = embedObject.description; + } else + try { + lastmsgdata.content = embedObject.description = lastmsgdata.content + "\n" + + embedObject.description;// The message object doesn't get updated + final LastMsgData _lastmsgdata = lastmsgdata; + DiscordPlugin.perform(() -> _lastmsgdata.message.edit(msg, embedObject)); + } catch (MissingPermissionsException | DiscordException e1) { + TBMCCoreAPI.SendException("An error occured while editing chat message!", e1); + } + }; + if (e.getChannel().equals(Channel.GlobalChat)) + doit.accept(lastmsgdata == null ? lastmsgdata = new LastMsgData(DiscordPlugin.chatchannel) + : lastmsgdata); - for (LastMsgData data : lastmsgPerUser) { - final IUser iUser = data.channel.getUsersHere().stream() - .filter(u -> u.getLongID() != u.getClient().getOurUser().getLongID()).findFirst().get(); // Doesn't support group DMs - final DiscordPlayer user = DiscordPlayer.getUser(iUser.getStringID(), DiscordPlayer.class); - if (user.isMinecraftChatEnabled() && e.shouldSendTo(getSender(data.channel, iUser, user))) - doit.accept(data); + for (LastMsgData data : lastmsgPerUser) { + final IUser iUser = data.channel.getUsersHere().stream() + .filter(u -> u.getLongID() != u.getClient().getOurUser().getLongID()).findFirst().get(); // Doesn't support group DMs + final DiscordPlayer user = DiscordPlayer.getUser(iUser.getStringID(), DiscordPlayer.class); + if (user.isMinecraftChatEnabled() && e.shouldSendTo(getSender(data.channel, iUser, user))) + doit.accept(data); + } } - } // TODO: Author URL + }); // TODO: Author URL } private static class LastMsgData { @@ -235,7 +239,7 @@ public class MCChatListener implements Listener, IListener dsender.sendMessage("Stop it. You know the answer."); lastlist = 0; } else - Bukkit.dispatchCommand(dsender, cmd); + VanillaCommandListener.runBukkitOrVanillaCommand(dsender, cmd); lastlistp = (short) Bukkit.getOnlinePlayers().size(); } else { if (dmessage.length() == 0 && event.getMessage().getAttachments().size() == 0) @@ -273,7 +277,7 @@ public class MCChatListener implements Listener, IListener val key = (channel.isPrivate() ? "" : "P") + author.getStringID(); return Stream.>>of( // https://stackoverflow.com/a/28833677/2703239 () -> Optional.ofNullable(OnlineSenders.get(key)), // Find first non-null - () -> Optional.ofNullable(ConnectedSenders.get(author.getStringID())), // This doesn't support it + () -> Optional.ofNullable(ConnectedSenders.get(key)), // This doesn't support the public chat, but it'll always return null for it () -> Optional.ofNullable(UnconnectedSenders.get(key)), () -> { val dsender = new DiscordSender(author, channel); UnconnectedSenders.put(key, dsender); diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java index 729c873..69e8126 100644 --- a/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/DiscordFakePlayer.java @@ -11,13 +11,10 @@ import org.bukkit.entity.*; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.map.MapView; import org.bukkit.permissions.PermissibleBase; -import org.bukkit.permissions.ServerOperator; import org.bukkit.plugin.Plugin; import org.bukkit.scoreboard.Scoreboard; import buttondevteam.discordplugin.DiscordPlugin; -import lombok.Getter; -import lombok.Setter; import lombok.experimental.Delegate; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; @@ -25,9 +22,7 @@ import sx.blah.discord.handle.obj.IUser; public class DiscordFakePlayer extends DiscordHumanEntity implements Player { protected DiscordFakePlayer(IUser user, IChannel channel, int entityId, UUID uuid) { super(user, channel, entityId, uuid); - perm = new PermissibleBase(new ServerOperator() { - private @Getter @Setter boolean op; - }); + perm = new PermissibleBase(Bukkit.getOfflinePlayer(uuid)); } @Delegate diff --git a/src/main/java/buttondevteam/discordplugin/playerfaker/VanillaCommandListener.java b/src/main/java/buttondevteam/discordplugin/playerfaker/VanillaCommandListener.java new file mode 100644 index 0000000..3355478 --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/playerfaker/VanillaCommandListener.java @@ -0,0 +1,110 @@ +package buttondevteam.discordplugin.playerfaker; + +import java.util.Arrays; + +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_12_R1.CraftServer; +import org.bukkit.craftbukkit.v1_12_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_12_R1.command.VanillaCommandWrapper; +import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +import buttondevteam.discordplugin.DiscordSenderBase; +import buttondevteam.discordplugin.IMCPlayer; +import lombok.Getter; +import lombok.val; +import net.minecraft.server.v1_12_R1.ChatMessage; +import net.minecraft.server.v1_12_R1.CommandException; +import net.minecraft.server.v1_12_R1.EnumChatFormat; +import net.minecraft.server.v1_12_R1.IChatBaseComponent; +import net.minecraft.server.v1_12_R1.ICommandListener; +import net.minecraft.server.v1_12_R1.MinecraftServer; +import net.minecraft.server.v1_12_R1.World; + +public class VanillaCommandListener> implements ICommandListener { + private @Getter T player; + private Player bukkitplayer; + + /** + * This constructor will only send raw vanilla messages to the sender in plain text. + * + * @param player + * The Discord sender player (the wrapper) + */ + public VanillaCommandListener(T player) { + this.player = player; + this.bukkitplayer = null; + } + + /** + * This constructor will send both raw vanilla messages to the sender in plain text and forward the raw message to the provided player. + * + * @param player + * The Discord sender player (the wrapper) + * @param bukkitplayer + * The Bukkit player to send the raw message to + */ + public VanillaCommandListener(T player, Player bukkitplayer) { + this.player = player; + this.bukkitplayer = bukkitplayer; + if (!(bukkitplayer instanceof CraftPlayer)) + throw new ClassCastException("bukkitplayer must be a Bukkit player!"); + } + + @Override + public MinecraftServer C_() { + return ((CraftServer) Bukkit.getServer()).getServer(); + } + + @Override + public boolean a(int oplevel, String cmd) { + // return oplevel <= 2; // Value from CommandBlockListenerAbstract, found what it is in EntityPlayer - Wait, that'd always allow OP commands + return oplevel == 0 || player.isOp(); + } + + @Override + public String getName() { + return player.getName(); + } + + @Override + public World getWorld() { + return ((CraftWorld) player.getWorld()).getHandle(); + } + + @Override + public void sendMessage(IChatBaseComponent arg0) { + player.sendMessage(arg0.toPlainText()); + if (bukkitplayer != null) + ((CraftPlayer) bukkitplayer).getHandle().sendMessage(arg0); + } + + public static boolean runBukkitOrVanillaCommand(DiscordSenderBase dsender, String cmdstr) { + val cmd = ((CraftServer) Bukkit.getServer()).getCommandMap().getCommand(cmdstr.split(" ")[0].toLowerCase()); + if (!(dsender instanceof Player) || !(cmd instanceof VanillaCommandWrapper)) + return Bukkit.dispatchCommand(dsender, cmdstr); // Unconnected users are treated well in vanilla cmds + + if (!(dsender instanceof IMCPlayer)) + throw new ClassCastException( + "dsender needs to implement IMCPlayer to use vanilla commands as it implements Player."); + + IMCPlayer sender = (IMCPlayer) dsender; // Don't use val on recursive interfaces :P + + val vcmd = (VanillaCommandWrapper) cmd; + if (!vcmd.testPermission(sender)) + return true; + + ICommandListener icommandlistener = sender.getVanillaCmdListener(); + String[] args = cmdstr.split(" "); + args = Arrays.copyOfRange(args, 1, args.length); + try { + vcmd.dispatchVanillaCommand(sender, icommandlistener, args); + } catch (CommandException commandexception) { + // Taken from CommandHandler + ChatMessage chatmessage = new ChatMessage(commandexception.getMessage(), commandexception.getArgs()); + chatmessage.getChatModifier().setColor(EnumChatFormat.RED); + icommandlistener.sendMessage(chatmessage); + } + return true; + } +} From 73af37f21472b4d10c4495db4820660c3d60ccec Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Thu, 13 Jul 2017 01:05:02 +0200 Subject: [PATCH 8/8] Fixed .travis.yml ofc --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8e4a89e..003f9f9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,8 +4,8 @@ cache: before_install: | # Wget BuildTools and run if cached folder not found if [ ! -d "$HOME/.m2/repository/org/bukkit/craftbukkit/1.12-R0.1-SNAPSHOT" ]; then wget -O BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar -# grep so that download counts don't appear in log files - - java -jar BuildTools.jar --rev 1.12 | grep -vE "[^/ ]*/[^/ ]*\s*KB\s*$" | grep -v "^\s*$" + # grep so that download counts don't appear in log files + java -jar BuildTools.jar --rev 1.12 | grep -vE "[^/ ]*/[^/ ]*\s*KB\s*$" | grep -v "^\s*$" fi language: java jdk: