Added discord support (#11)

This commit is contained in:
Seth 2017-12-29 11:12:47 -07:00 committed by Lemon
parent 1871451ed6
commit 6a09b23331
10 changed files with 371 additions and 15 deletions

62
pom.xml
View File

@ -73,91 +73,98 @@
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
<version>3.6</version> <version>3.6</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>commons-io</groupId> <groupId>commons-io</groupId>
<artifactId>commons-io</artifactId> <artifactId>commons-io</artifactId>
<version>2.5</version> <version>2.5</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<version>1.16.18</version> <version>1.16.18</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId> <artifactId>spigot-api</artifactId>
<version>1.12-pre5-SNAPSHOT</version> <version>1.12-pre5-SNAPSHOT</version>
<scope>compile</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.Pravian</groupId> <groupId>com.github.Pravian</groupId>
<artifactId>Aero</artifactId> <artifactId>Aero</artifactId>
<version>2.1-SNAPSHOT</version> <version>2.1-SNAPSHOT</version>
<scope>system</scope> <scope>provided</scope>
<systemPath>${project.basedir}/lib/aero-2.1-SNAPSHOT.jar</systemPath>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.TotalFreedom</groupId> <groupId>com.github.TotalFreedom</groupId>
<artifactId>BukkitTelnet</artifactId> <artifactId>BukkitTelnet</artifactId>
<version>4.5-pre1</version> <version>4.5-pre1</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.ess3</groupId> <groupId>net.ess3</groupId>
<artifactId>Essentials</artifactId> <artifactId>Essentials</artifactId>
<version>2.13.1</version> <version>2.13.1</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.sk89q</groupId> <groupId>com.sk89q</groupId>
<artifactId>worldguard</artifactId> <artifactId>worldguard</artifactId>
<version>6.2</version> <version>6.2</version>
<scope>system</scope> <scope>provided</scope>
<systemPath>${project.basedir}/lib/worldguard-6.2.jar</systemPath>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.TotalFreedom.TF-WorldEdit</groupId> <groupId>com.github.TotalFreedom.TF-WorldEdit</groupId>
<artifactId>worldedit-bukkit</artifactId> <artifactId>worldedit-bukkit</artifactId>
<version>6.1.0-TF</version> <version>6.1.0-TF</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.TotalFreedom.TF-WorldEdit</groupId> <groupId>com.github.TotalFreedom.TF-WorldEdit</groupId>
<artifactId>worldedit-core</artifactId> <artifactId>worldedit-core</artifactId>
<version>6.1.0-TF</version> <version>6.1.0-TF</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.coreprotect</groupId> <groupId>net.coreprotect</groupId>
<artifactId>CoreProtect</artifactId> <artifactId>CoreProtect</artifactId>
<version>2.14.2</version> <version>2.14.2</version>
<scope>system</scope> <scope>provided</scope>
<systemPath>${project.basedir}/lib/CoreProtect_2.14.2.jar</systemPath>
</dependency> </dependency>
<dependency> <dependency>
<groupId>me.libraryaddict</groupId> <groupId>me.libraryaddict</groupId>
<artifactId>LibsDisguise</artifactId> <artifactId>LibsDisguise</artifactId>
<version>9.4.0-SNAPSHOT</version> <version>9.4.0-SNAPSHOT</version>
<scope>system</scope> <scope>provided</scope>
<systemPath>${project.basedir}/lib/LibsDisguises.jar</systemPath>
</dependency> </dependency>
<dependency> <dependency>
<groupId>minecraft.server</groupId> <groupId>minecraft.server</groupId>
<artifactId>Spigot</artifactId> <artifactId>Spigot</artifactId>
<version>1.12</version> <version>1.12</version>
<scope>system</scope> <scope>provided</scope>
<systemPath>${project.basedir}/lib/minecraft_server.jar</systemPath> </dependency>
<dependency>
<groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId>
<version>3.4.0_317-withDependencies</version>
</dependency> </dependency>
</dependencies> </dependencies>
@ -184,7 +191,7 @@
<target>1.7</target> <target>1.7</target>
</configuration> </configuration>
</plugin> </plugin>
<!-- Antrun --> <!-- Antrun -->
<plugin> <plugin>
<artifactId>maven-antrun-plugin</artifactId> <artifactId>maven-antrun-plugin</artifactId>
@ -294,6 +301,35 @@
</items> </items>
</configuration> </configuration>
</plugin> </plugin>
<!-- Maven jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<outputDirectory>target/generated-sources</outputDirectory>
</configuration>
</plugin>
<!-- Maven shade -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<outputFile>target/${project.name}.jar</outputFile>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
</plugins> </plugins>
</build> </build>

View File

@ -25,6 +25,7 @@ import me.totalfreedom.totalfreedommod.bridge.WorldEditBridge;
import me.totalfreedom.totalfreedommod.caging.Cager; import me.totalfreedom.totalfreedommod.caging.Cager;
import me.totalfreedom.totalfreedommod.command.CommandLoader; import me.totalfreedom.totalfreedommod.command.CommandLoader;
import me.totalfreedom.totalfreedommod.config.MainConfig; import me.totalfreedom.totalfreedommod.config.MainConfig;
import me.totalfreedom.totalfreedommod.discord.Discord;
import me.totalfreedom.totalfreedommod.freeze.Freezer; import me.totalfreedom.totalfreedommod.freeze.Freezer;
import me.totalfreedom.totalfreedommod.fun.ItemFun; import me.totalfreedom.totalfreedommod.fun.ItemFun;
import me.totalfreedom.totalfreedommod.fun.Jumppads; import me.totalfreedom.totalfreedommod.fun.Jumppads;
@ -79,6 +80,7 @@ public class TotalFreedomMod extends AeroPlugin<TotalFreedomMod>
public PlayerList pl; public PlayerList pl;
public Announcer an; public Announcer an;
public ChatManager cm; public ChatManager cm;
public Discord dc;
public BanManager bm; public BanManager bm;
public PermbanList pm; public PermbanList pm;
public ProtectArea pa; public ProtectArea pa;
@ -176,6 +178,7 @@ public class TotalFreedomMod extends AeroPlugin<TotalFreedomMod>
pl = services.registerService(PlayerList.class); pl = services.registerService(PlayerList.class);
an = services.registerService(Announcer.class); an = services.registerService(Announcer.class);
cm = services.registerService(ChatManager.class); cm = services.registerService(ChatManager.class);
dc = services.registerService(Discord.class);
bm = services.registerService(BanManager.class); bm = services.registerService(BanManager.class);
pm = services.registerService(PermbanList.class); pm = services.registerService(PermbanList.class);
pa = services.registerService(ProtectArea.class); pa = services.registerService(ProtectArea.class);

View File

@ -40,6 +40,9 @@ public class Admin implements ConfigLoadable, ConfigSavable, Validatable
@Getter @Getter
@Setter @Setter
private String loginMessage = null; private String loginMessage = null;
@Getter
@Setter
private String discordID = null;
public static final String CONFIG_FILENAME = "admins.yml"; public static final String CONFIG_FILENAME = "admins.yml";
@ -65,7 +68,8 @@ public class Admin implements ConfigLoadable, ConfigSavable, Validatable
.append("- Last Login: ").append(FUtil.dateToString(lastLogin)).append("\n") .append("- Last Login: ").append(FUtil.dateToString(lastLogin)).append("\n")
.append("- Custom Login Message: ").append(loginMessage).append("\n") .append("- Custom Login Message: ").append(loginMessage).append("\n")
.append("- Rank: ").append(rank.getName()).append("\n") .append("- Rank: ").append(rank.getName()).append("\n")
.append("- Is Active: ").append(active); .append("- Is Active: ").append(active).append("\n")
.append("- Discord ID: ").append(discordID).append("\n");
return output.toString(); return output.toString();
} }
@ -88,6 +92,7 @@ public class Admin implements ConfigLoadable, ConfigSavable, Validatable
ips.addAll(cs.getStringList("ips")); ips.addAll(cs.getStringList("ips"));
lastLogin = FUtil.stringToDate(cs.getString("last_login")); lastLogin = FUtil.stringToDate(cs.getString("last_login"));
loginMessage = cs.getString("login_message", null); loginMessage = cs.getString("login_message", null);
discordID = cs.getString("discord_id", null);
} }
@Override @Override
@ -100,6 +105,7 @@ public class Admin implements ConfigLoadable, ConfigSavable, Validatable
cs.set("ips", Lists.newArrayList(ips)); cs.set("ips", Lists.newArrayList(ips));
cs.set("last_login", FUtil.dateToString(lastLogin)); cs.set("last_login", FUtil.dateToString(lastLogin));
cs.set("login_message", loginMessage); cs.set("login_message", loginMessage);
cs.set("discord_id", discordID);
} }
public boolean isAtLeast(Rank pRank) public boolean isAtLeast(Rank pRank)

View File

@ -0,0 +1,49 @@
package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.admin.Admin;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.ChatColor;
import java.util.Random;
@CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "Link your discord account to your minecraft account", usage = "/<command>")
public class Command_linkdiscord extends FreedomCommand
{
@Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{
if (!plugin.dc.enabled)
{
msg("The discord verification system is currently disabled.", ChatColor.RED);
return true;
}
Admin admin = plugin.al.getAdmin(playerSender);
if (admin.getDiscordID() != null)
{
msg("Your minecraft account is already linked to a discord account.", ChatColor.RED);
return true;
}
if (plugin.dc.LINK_CODES.containsValue(admin))
{
msg("Your linking code is " + ChatColor.GREEN + plugin.dc.getCodeForAdmin(admin), ChatColor.AQUA);
}
else
{
String code = "";
Random random = new Random();
for (int i = 0; i < 5; i++)
{
code += random.nextInt(10);
}
plugin.dc.LINK_CODES.put(code, admin);
msg("Your linking code is " + ChatColor.GREEN + code, ChatColor.AQUA);
}
return true;
}
}

View File

@ -0,0 +1,34 @@
package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.admin.Admin;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.ChatColor;
@CommandPermissions(level = Rank.SUPER_ADMIN, source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "Unlink your discord account to your minecraft account", usage = "/<command>")
public class Command_unlinkdiscord extends FreedomCommand
{
@Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{
if (!plugin.dc.enabled)
{
msg("The discord verification system is currently disabled.", ChatColor.RED);
return true;
}
Admin admin = plugin.al.getAdmin(playerSender);
if (admin.getDiscordID() == null)
{
msg("Your minecraft account is not linked to a discord account.", ChatColor.RED);
return true;
}
admin.setDiscordID(null);
msg("Your minecraft account has been successfully unlinked from the discord account.", ChatColor.GREEN);
return true;
}
}

View File

@ -0,0 +1,88 @@
package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.util.FUtil;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.ChatColor;
import java.util.Random;
import java.util.Date;
import net.pravian.aero.util.Ips;
@CommandPermissions(level = Rank.IMPOSTOR, source = SourceType.ONLY_IN_GAME)
@CommandParameters(description = "Sends a verification code to the player, or the player can input the sent code.", usage = "/<command> [code]")
public class Command_verify extends FreedomCommand
{
@Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{
if (!plugin.dc.enabled)
{
msg("The discord verification system is currently disabled", ChatColor.RED);
return true;
}
if (!plugin.al.isAdminImpostor(playerSender))
{
msg("You are not an imposter, therefore you do not need to verify.", ChatColor.RED);
return true;
}
Admin admin = plugin.al.getEntryByName(playerSender.getName());
if (admin.getDiscordID() == null)
{
msg("You do not have a discord account linked to your minecraft account, please verify the manual way.", ChatColor.RED);
return true;
}
if (args.length < 1)
{
String code = "";
Random random = new Random();
for (int i = 0; i < 10; i++)
{
code += random.nextInt(10);
}
plugin.dc.VERIFY_CODES.add(code);
plugin.dc.bot.getUserById(admin.getDiscordID()).openPrivateChannel().complete().sendMessage("A user with the ip `" + Ips.getIp(playerSender) + "` has sent a verification request. Please run the following in-game command: `/verify " + code + "`").complete();
msg("A verification code has been sent to your account, please copy the code and run /verify <code>", ChatColor.GREEN);
}
else
{
String code = args[0];
if (!plugin.dc.VERIFY_CODES.contains(code))
{
msg("You have entered an invalid verification code", ChatColor.RED);
return true;
}
else
{
plugin.dc.VERIFY_CODES.remove(code);
FUtil.bcastMsg(playerSender.getName() + " has verified themself!", ChatColor.GOLD);
FUtil.adminAction(ConfigEntry.SERVER_NAME.getString(), "Readding " + admin.getName() + " to the staff list", true);
if (playerSender != null)
{
admin.setName(playerSender.getName());
admin.addIp(Ips.getIp(playerSender));
}
admin.setActive(true);
admin.setLastLogin(new Date());
plugin.al.save();
plugin.al.updateTables();
final FPlayer fPlayer = plugin.pl.getPlayer(playerSender);
if (fPlayer.getFreezeData().isFrozen())
{
fPlayer.getFreezeData().setFrozen(false);
msg("You have been unfrozen.");
}
}
}
return true;
}
}

View File

@ -44,6 +44,8 @@ public enum ConfigEntry
SERVER_BAN_URL(String.class, "server.ban_url"), SERVER_BAN_URL(String.class, "server.ban_url"),
SERVER_PERMBAN_URL(String.class, "server.permban_url"), SERVER_PERMBAN_URL(String.class, "server.permban_url"),
// //
DISCORD_TOKEN(String.class, "discord.token"),
//
ADMINLIST_CLEAN_THESHOLD_HOURS(Integer.class, "adminlist.clean_threshold_hours"), ADMINLIST_CLEAN_THESHOLD_HOURS(Integer.class, "adminlist.clean_threshold_hours"),
ADMINLIST_CONSOLE_IS_SENIOR(Boolean.class, "adminlist.console_is_senior"), ADMINLIST_CONSOLE_IS_SENIOR(Boolean.class, "adminlist.console_is_senior"),
// //

View File

@ -0,0 +1,96 @@
package me.totalfreedom.totalfreedommod.discord;
import com.google.common.base.Strings;
import me.totalfreedom.totalfreedommod.discord.MessageListener;
import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import net.dv8tion.jda.core.JDA;
import net.dv8tion.jda.core.JDABuilder;
import net.dv8tion.jda.core.entities.MessageChannel;
import net.dv8tion.jda.core.AccountType;
import net.dv8tion.jda.core.exceptions.RateLimitedException;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import javax.security.auth.login.LoginException;
public class Discord extends FreedomService
{
public static HashMap<String, Admin> LINK_CODES = new HashMap<>();
public static List<String> VERIFY_CODES = new ArrayList();
public static JDA bot = null;
public static Boolean enabled = false;
public Discord(TotalFreedomMod plugin)
{
super(plugin);
}
public void startBot()
{
if (!Strings.isNullOrEmpty(ConfigEntry.DISCORD_TOKEN.getString()))
{
enabled = true;
}
else
{
enabled = false;
return;
}
if (bot != null)
{
for (Object object : bot.getRegisteredListeners())
{
bot.removeEventListener(object);
}
}
try
{
bot = new JDABuilder(AccountType.BOT).setToken(ConfigEntry.DISCORD_TOKEN.getString()).addEventListener(new MessageListener()).setAudioEnabled(false).setAutoReconnect(true).buildBlocking();
FLog.info("Discord verification bot has successfully enabled!");
}
catch (LoginException e)
{
FLog.warning("An invalid token for the discord verification bot, the bot will not enable.");
}
catch (RateLimitedException e)
{
FLog.warning("The discord verification bot was ratelimited trying to login, please try again later.");
}
catch (IllegalArgumentException | InterruptedException e)
{
FLog.warning("Discord verification bot failed to start.");
}
}
@Override
protected void onStart()
{
startBot();
}
public static String getCodeForAdmin(Admin admin)
{
for (String code: LINK_CODES.keySet())
{
if (LINK_CODES.get(code).equals(admin))
{
return code;
}
}
return null;
}
@Override
protected void onStop()
{
if (bot != null)
{
bot.shutdown();
}
FLog.info("Discord verification bot has successfully shutdown.");
}
}

View File

@ -0,0 +1,29 @@
package me.totalfreedom.totalfreedommod.discord;
import me.totalfreedom.totalfreedommod.admin.Admin;
import net.dv8tion.jda.core.events.message.priv.PrivateMessageReceivedEvent;
import net.dv8tion.jda.core.hooks.ListenerAdapter;
public class MessageListener extends ListenerAdapter
{
public void onPrivateMessageReceived(PrivateMessageReceivedEvent event)
{
if (!event.getAuthor().getId().equals(Discord.bot.getSelfUser().getId()))
{
// Handle link code
if (event.getMessage().getContentRaw().matches("[0-9][0-9][0-9][0-9][0-9]"))
{
String code = event.getMessage().getRawContent();
if (Discord.LINK_CODES.get(code) != null)
{
Admin admin = Discord.LINK_CODES.get(code);
admin.setDiscordID(event.getMessage().getAuthor().getId());
Discord.LINK_CODES.remove(code);
event.getChannel().sendMessage("Link successful. Now this Discord account is linked with the Minecraft account `" + admin.getName() + "`.\n "
+ "Now when you are an impostor on the server, you may use `/verify` to verify.").complete();;
}
}
}
}
}

View File

@ -27,6 +27,11 @@ server:
# URL players should appeal for permanent bans at # URL players should appeal for permanent bans at
permban_url: http://bit.ly/TF_PermBan permban_url: http://bit.ly/TF_PermBan
# Discord
discord:
# If you do not have a token, make a bot account and get one at https://discordapp.com/developers/applications/me
token: ''
# Admin list # Admin list
adminlist: adminlist:
@ -36,6 +41,12 @@ adminlist:
# Give the default CONSOLE senior admin privileges. # Give the default CONSOLE senior admin privileges.
# Handy in development environments. # Handy in development environments.
console_is_senior: true console_is_senior: true
# CoreProtect
coreprotect:
auto_wipe: false
file_limit: 5000
# ForceIP configuration # ForceIP configuration
forceip: forceip:
@ -47,7 +58,6 @@ forceip:
# The kick message sent to players when logging in with the wrong hostname # The kick message sent to players when logging in with the wrong hostname
kickmsg: You have been kicked from the server - Please connect using %address% kickmsg: You have been kicked from the server - Please connect using %address%
# Blocking certain events # Blocking certain events
allow: allow:
fire_place: false fire_place: false
@ -58,6 +68,9 @@ allow:
water_place: false water_place: false
tnt_minecarts: false tnt_minecarts: false
explosions: false explosions: false
redstone: true
fireworks: false
frostwalker: false
# Blocked commands: # Blocked commands:
# #