Add captcha, auto generate config, and Spigot support

This commit is contained in:
Ghoti 2020-05-29 15:20:53 -05:00
parent ffd6e5978b
commit f7887de08f
38 changed files with 1205 additions and 286 deletions

View File

@ -1,19 +0,0 @@
#Change this to redefine the main command signifier character/String
Command-Signifier:-
#Automatically places spammers in spam mode
AllowSpamPunish:true
Channels-To-Not-Chatlog:ignore_me
#Bot token provided by Discord
Bot-Token:
#Normal channels will have messages with these words deleted by the bot
NaughtyList:piff
#Bot can automatically assign role upon user join
UseCustomDefaultRole:true
#Does nothing if UseCustomDefaultRole is off
DefaultRoleName:Standard

View File

@ -2,8 +2,8 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.fpghoti</groupId>
<artifactId>MrBouncer</artifactId>
<version>3.0</version>
<artifactId>Biscuit</artifactId>
<version>1.1</version>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<resources>
@ -27,7 +27,7 @@
<configuration>
<archive>
<manifest>
<mainClass>com.fpghoti.mrbouncer.MrBouncer</mainClass>
<mainClass>com.fpghoti.biscuit.Main</mainClass>
</manifest>
</archive>
</configuration>
@ -50,6 +50,14 @@
</plugins>
</build>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>bungeecord-repo</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>
<repository>
<id>oss.sonatype.org</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
@ -57,7 +65,7 @@
<repository>
<id>jcenter</id>
<name>jcenter-bintray</name>
<url>http://jcenter.bintray.com</url>
<url>https://jcenter.bintray.com</url>
</repository>
<repository>
<snapshots>
@ -68,6 +76,94 @@
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.15.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>commons-lang</artifactId>
<groupId>commons-lang</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
<exclusion>
<artifactId>gson</artifactId>
<groupId>com.google.code.gson</groupId>
</exclusion>
<exclusion>
<artifactId>bungeecord-chat</artifactId>
<groupId>net.md-5</groupId>
</exclusion>
<exclusion>
<artifactId>snakeyaml</artifactId>
<groupId>org.yaml</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.15.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>commons-lang</artifactId>
<groupId>commons-lang</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
<exclusion>
<artifactId>gson</artifactId>
<groupId>com.google.code.gson</groupId>
</exclusion>
<exclusion>
<artifactId>snakeyaml</artifactId>
<groupId>org.yaml</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.15-SNAPSHOT</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>bungeecord-config</artifactId>
<groupId>net.md-5</groupId>
</exclusion>
<exclusion>
<artifactId>bungeecord-event</artifactId>
<groupId>net.md-5</groupId>
</exclusion>
<exclusion>
<artifactId>bungeecord-protocol</artifactId>
<groupId>net.md-5</groupId>
</exclusion>
<exclusion>
<artifactId>netty-transport-native-unix-common</artifactId>
<groupId>io.netty</groupId>
</exclusion>
<exclusion>
<artifactId>bungeecord-chat</artifactId>
<groupId>net.md-5</groupId>
</exclusion>
<exclusion>
<artifactId>snakeyaml</artifactId>
<groupId>org.yaml</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>

38
pom.xml
View File

@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.fpghoti</groupId>
<artifactId>Biscuit</artifactId>
<version>ALPHA-0.1</version>
<version>1.1</version>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<resources>
@ -30,7 +30,7 @@
<configuration>
<archive>
<manifest>
<mainClass>com.fpghoti.biscuit.Biscuit</mainClass>
<mainClass>com.fpghoti.biscuit.Main</mainClass>
</manifest>
</archive>
</configuration>
@ -54,6 +54,14 @@
</plugins>
</build>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>bungeecord-repo</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>
<repository>
<id>oss.sonatype.org</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
@ -72,6 +80,25 @@
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.15.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.15.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.15-SNAPSHOT</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
@ -100,7 +127,12 @@
<dependency>
<groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId>
<version>4.0.0_46</version>
<version>4.1.1_155</version>
</dependency>
<dependency>
<groupId>com.github.cage</groupId>
<artifactId>cage</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>

View File

@ -1,5 +1,6 @@
package com.fpghoti.biscuit;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
@ -7,28 +8,48 @@ import java.util.Timer;
import org.slf4j.Logger;
import com.fpghoti.biscuit.commands.CommandManager;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.timer.BiscuitTimer;
import com.fpghoti.biscuit.user.PreUser;
import com.github.cage.Cage;
import com.github.cage.GCage;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.entities.TextChannel;
import net.dv8tion.jda.api.entities.User;
public class Biscuit {
private JDA jda;
private Logger logger;
private CommandManager commandManager;
private Timer timer;
private List<BiscuitTimer> timers;
private File captchaDir;
private Cage cage;
public Biscuit(JDA jda, Logger log) {
this.jda = jda;
this.logger = log;
commandManager = new CommandManager();
timer = new Timer();
timers = new ArrayList<BiscuitTimer>();
if(!Main.isPlugin) {
captchaDir = new File("captcha");
}else {
captchaDir = new File(PluginCore.plugin.getDataFolder(), "captcha");
}
captchaDir.mkdir();
cage = new GCage();
wipeCaptchaDir();
loadPreUsers();
}
public void log(String message) {
logger.info(message);
}
@ -36,24 +57,24 @@ public class Biscuit {
public void warn(String message) {
logger.warn(message);
}
public void error(String message) {
logger.error(message);
}
public JDA getJDA() {
return jda;
}
public CommandManager getCommandManager() {
return commandManager;
}
public void say(TextChannel channel, String message) {
channel.sendMessage(message).queue();
}
public void loadTimers() {
timer.cancel();
timer = new Timer();
@ -61,15 +82,53 @@ public class Biscuit {
timer.schedule(t,t.getDelay(), t.getPeriod());
}
}
public void addTimer(BiscuitTimer bt) {
timers.add(bt);
}
public void removeTimer(BiscuitTimer bt) {
timers.remove(bt);
}
public void wipeCaptchaDir() {
Main.log.info("Wiping captcha files...");
boolean good = true;
File[] files = captchaDir.listFiles();
for (File file : files){
if (!file.delete()){
good = false;
Main.log.error("Could not remove captcha file: " + file);
}
}
if(good) {
Main.log.info("All captcha files successfully removed!");
}else {
Main.log.error("Some captcha file(s) could not be removed!");
}
}
public Cage getCage() {
return this.cage;
}
private void loadPreUsers() {
for(Guild g : jda.getGuilds()) {
for(Member m : g.getMembers()) {
User u = m.getUser();
if(!PreUser.preUserExists(u)) {
if(m.getRoles().size() == 1) {
for(Role role : m.getRoles()){
if(role.getName().equalsIgnoreCase(PropertiesRetrieval.getDefaultRole())){
PreUser.users.add(new PreUser(u));
}
}
}
}
}
}
}
}

View File

@ -8,27 +8,36 @@ import org.slf4j.LoggerFactory;
import com.fpghoti.biscuit.commands.BaseCommand;
import com.fpghoti.biscuit.commands.CommandListener;
import com.fpghoti.biscuit.commands.client.AddCommand;
import com.fpghoti.biscuit.commands.client.ChanIDCommand;
import com.fpghoti.biscuit.commands.client.ChnameCommand;
import com.fpghoti.biscuit.commands.client.DivideCommand;
import com.fpghoti.biscuit.commands.client.DontNotifyCommand;
import com.fpghoti.biscuit.commands.client.HelpCommand;
import com.fpghoti.biscuit.commands.client.MultiplyCommand;
import com.fpghoti.biscuit.commands.client.NotSpammerCommand;
import com.fpghoti.biscuit.commands.client.NotifyCommand;
import com.fpghoti.biscuit.commands.client.PingCommand;
import com.fpghoti.biscuit.commands.client.PowerCommand;
import com.fpghoti.biscuit.commands.client.RecentSpammersCommand;
import com.fpghoti.biscuit.commands.client.ShutDownCommand;
import com.fpghoti.biscuit.commands.client.SoftMuteCommand;
import com.fpghoti.biscuit.commands.client.SquareRootCommand;
import com.fpghoti.biscuit.commands.client.SubtractCommand;
import com.fpghoti.biscuit.commands.client.UIDCommand;
import com.fpghoti.biscuit.commands.client.UnSoftMuteCommand;
import com.fpghoti.biscuit.commands.console.SayCommand;
import com.fpghoti.biscuit.commands.console.ShutdownConsoleCommand;
import com.fpghoti.biscuit.config.ConfigRetrieval;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.global.Properties;
import com.fpghoti.biscuit.listener.DMListener;
import com.fpghoti.biscuit.listener.JoinListener;
import com.fpghoti.biscuit.listener.MessageDeleteListener;
import com.fpghoti.biscuit.listener.MessageEditListener;
import com.fpghoti.biscuit.listener.MessageReceiveListener;
import com.fpghoti.biscuit.timer.task.BotMsgRemoveTimer;
import com.fpghoti.biscuit.timer.task.ChatCountTimer;
import com.fpghoti.biscuit.timer.task.DecrementTimer;
import com.fpghoti.biscuit.timer.task.FastMsgRemoveTimer;
import com.fpghoti.biscuit.timer.task.SlowMsgRemoveTimer;
import com.fpghoti.biscuit.timer.task.SoftMuteTimer;
@ -42,27 +51,31 @@ import net.dv8tion.jda.api.JDABuilder;
public class Main {
private static JDA jda;
public RollingFileAppender<String> we;
public SizeAndTimeBasedRollingPolicy<String> wes;
public static final Logger log = LoggerFactory.getLogger("ch.qos.logback.core.ConsoleAppender");
public static Scanner sc;
public static Biscuit biscuit;
public static boolean ready = false;
public static boolean isPlugin = false;
public static boolean shutdownStarted = false;
public static void main(String[] args){
ConfigRetrieval.generateConfig();
log.info("========================= Welcome to Biscuit =========================");
startJDA();
biscuit = new Biscuit(jda, log);
startCommandListener();
jda.addEventListener(new MessageReceiveListener());
jda.addEventListener(new MessageEditListener());
jda.addEventListener(new MessageDeleteListener());
jda.addEventListener(new JoinListener());
jda.addEventListener(new DMListener());
String link = "NULL";
Properties.naughtyList = ConfigRetrieval.getFromConfig("NaughtyList");
Properties.customdefaultrole = ConfigRetrieval.getFromConfig("UseCustomDefaultRole").equalsIgnoreCase("true");
@ -73,28 +86,36 @@ public class Main {
biscuit.addTimer(new FastMsgRemoveTimer());
biscuit.addTimer(new SlowMsgRemoveTimer());
biscuit.addTimer(new SoftMuteTimer());
biscuit.addTimer(new DecrementTimer());
biscuit.loadTimers();
List<BaseCommand> commands = biscuit.getCommandManager().getCommands();
//Client
commands.add(new HelpCommand());
commands.add(new PingCommand());
commands.add(new SoftMuteCommand());
commands.add(new UnSoftMuteCommand());
commands.add(new NotSpammerCommand());
commands.add(new RecentSpammersCommand());
commands.add(new ChanIDCommand());
commands.add(new ShutDownCommand());
commands.add(new UIDCommand());
commands.add(new ChnameCommand());
commands.add(new NotifyCommand());
commands.add(new DontNotifyCommand());
commands.add(new SquareRootCommand());
commands.add(new AddCommand());
commands.add(new SubtractCommand());
commands.add(new MultiplyCommand());
commands.add(new DivideCommand());
commands.add(new PowerCommand());
//Console
commands.add(new SayCommand());
commands.add(new ShutdownConsoleCommand());
link = "https://discordapp.com/oauth2/authorize?&client_id=" + jda.getSelfUser().getId() + "&scope=bot";
log.info("Connection successful!");
@ -103,8 +124,9 @@ public class Main {
log.info(link);
log.info("======================================================================");
log.info("CHAT LOGS BEGIN HERE:");
ready = true;
}
private static void startJDA() {
String token = PropertiesRetrieval.getToken();
log.info("Connecting bot to Discord.");
@ -122,23 +144,42 @@ public class Main {
shutdown();
}
}
private static void startCommandListener() {
sc = new Scanner(System.in);
CommandListener cl = new CommandListener();
cl.sc = sc;
cl.jda = jda;
jda.addEventListener(cl);
new Thread(cl).start();
}
public static void shutdown() {
log.info("Shutting down...");
sc.close();
System.exit(0);
if(!isPlugin) {
sc = new Scanner(System.in);
CommandListener cl = new CommandListener();
cl.sc = sc;
cl.jda = jda;
jda.addEventListener(cl);
new Thread(cl).start();
}else {
CommandListener cl = new CommandListener();
cl.jda = jda;
jda.addEventListener(cl);
}
}
public static Biscuit getBiscuit() {
return biscuit;
}
public static void shutdown() {
if(!shutdownStarted) {
shutdownStarted = true;
log.info("Shutting down...");
biscuit.wipeCaptchaDir();
if(jda != null) {
jda.shutdown();
}
if(!isPlugin) {
sc.close();
System.exit(0);
}
}
}
}

View File

@ -0,0 +1,40 @@
package com.fpghoti.biscuit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import com.fpghoti.biscuit.commands.CommandManager;
public class PluginCore extends JavaPlugin{
public static PluginCore plugin;
public void onEnable(){
plugin = this;
Main.isPlugin = true;
String[] args = {};
Main.main(args);
}
public void onDisable() {
Main.shutdown();
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
CommandManager m = Main.getBiscuit().getCommandManager();
if(m != null) {
if(sender instanceof Player) {
Player p = (Player)sender;
if(!p.hasPermission("biscuit.admin")) {
return false;
}
}
return m.dispatch(label,args);
}
return false;
}
}

View File

@ -21,7 +21,7 @@ public class CommandListener extends ListenerAdapter implements Runnable {
@Override
public void onMessageReceived(MessageReceivedEvent event){
if(!event.getAuthor().isBot() && event.getMessage().getContentDisplay().startsWith(PropertiesRetrieval.getCommandSignifier()) && event.getMessage().getAuthor().getId() != event.getJDA().getSelfUser().getId()){
log.info("True");
//log.info("True");
API.getBiscuit().getCommandManager().parse(event.getMessage().getContentRaw().toLowerCase(), event);
}
}

View File

@ -7,4 +7,5 @@ public abstract class ConsoleCommand extends BaseCommand{
public CommandType getType() {
return CommandType.CONSOLE;
}
}

View File

@ -0,0 +1,38 @@
package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.util.Util;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
public class AddCommand extends ClientCommand{
public AddCommand() {
name = "Add";
description = "Finds sum of two numbers.";
usage = PropertiesRetrieval.getCommandSignifier() + "add <Num1> <Num2>";
minArgs = 2;
maxArgs = 2;
identifiers.add("add");
}
@Override
public void execute(String[] args, MessageReceivedEvent event) {
Biscuit b = API.getBiscuit();
b.log(event.getAuthor().getName() + " issued a command: -add");
if(args[0] != null && Util.isDeciDigit(args[0]) && args[1] != null && Util.isDeciDigit(args[1])) {
double num = Double.parseDouble(args[0]);
double num2 = Double.parseDouble(args[1]);
String sum = Double.toString(num + num2);
String end = sum.substring(Math.max(sum.length() - 2, 0));
if(end.equals(".0")) {
sum = sum.replace(".0","");
}
event.getTextChannel().sendMessage(args[0] + " + " + args[1] + " is **" + sum + "**.").queue();
}
}
}

View File

@ -3,6 +3,7 @@ package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
@ -11,7 +12,7 @@ public class ChanIDCommand extends ClientCommand{
public ChanIDCommand() {
name = "Channel ID";
description = "Retrieves the channel ID.";
usage = "-chanid";
usage = PropertiesRetrieval.getCommandSignifier() + "chanid";
minArgs = 0;
maxArgs = 0;
identifiers.add("chanid");

View File

@ -3,6 +3,7 @@ package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.util.PermUtil;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
@ -12,7 +13,7 @@ public class ChnameCommand extends ClientCommand{
public ChnameCommand() {
name = "Channel Name";
description = "Retrieves the channel name.";
usage = "-chname";
usage = PropertiesRetrieval.getCommandSignifier() + "chname";
minArgs = 0;
maxArgs = 0;
identifiers.add("chname");

View File

@ -0,0 +1,39 @@
package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.util.Util;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
public class DivideCommand extends ClientCommand{
public DivideCommand() {
name = "Divide";
description = "Divides two numbers.";
usage = PropertiesRetrieval.getCommandSignifier() + "divide <Num 1> <Num 2>";
minArgs = 2;
maxArgs = 2;
identifiers.add("divide");
identifiers.add("div");
}
@Override
public void execute(String[] args, MessageReceivedEvent event) {
Biscuit b = API.getBiscuit();
b.log(event.getAuthor().getName() + " issued a command: -divide");
if(args[0] != null && Util.isDeciDigit(args[0]) && args[1] != null && Util.isDeciDigit(args[1])) {
double num = Double.parseDouble(args[0]);
double num2 = Double.parseDouble(args[1]);
String divide = Double.toString(num / num2);
String end = divide.substring(Math.max(divide.length() - 2, 0));
if(end.equals(".0")) {
divide = divide.replace(".0","");
}
event.getTextChannel().sendMessage(args[0] + " / " + args[1] + " is **" + divide + "**.").queue();
}
}
}

View File

@ -3,6 +3,7 @@ package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import net.dv8tion.jda.api.entities.Emote;
import net.dv8tion.jda.api.entities.Role;
@ -13,7 +14,7 @@ public class DontNotifyCommand extends ClientCommand{
public DontNotifyCommand() {
name = "Don't Notify";
description = "Puts user in Don't Notify status.";
usage = "-dontnotify";
usage = PropertiesRetrieval.getCommandSignifier() + "dontnotify";
minArgs = 0;
maxArgs = 0;
identifiers.add("dontnotify");
@ -26,7 +27,7 @@ public class DontNotifyCommand extends ClientCommand{
b.log(event.getAuthor().getName() + " issued a command: -dontnotify");
Role role = null;
for(Role r : event.getGuild().getRoles()) {
if(r.getName().toLowerCase().contains("don't notify")) {
if(r.getName().toLowerCase().contains(PropertiesRetrieval.getDontNotify())) {
role = r;
}
}
@ -37,7 +38,7 @@ public class DontNotifyCommand extends ClientCommand{
Emote done = null;
for(Emote e : event.getGuild().getEmotes()) {
if(e.getName().contains("ActionComplete")) {
if(e.getName().contains(PropertiesRetrieval.getDoneEmote())) {
done = e;
}
}

View File

@ -0,0 +1,65 @@
package com.fpghoti.biscuit.commands.client;
import java.util.List;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.commands.BaseCommand;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.util.Util;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
public class HelpCommand extends ClientCommand {
public HelpCommand() {
name = "Help";
description = "Pulls up help menu";
usage = PropertiesRetrieval.getCommandSignifier() + "help [Page #]";
minArgs = 0;
maxArgs = 1;
identifiers.add("help");
}
@Override
public void execute(String[] args, MessageReceivedEvent event) {
Biscuit biscuit = Main.getBiscuit();
int pg = 1;
if (args.length > 0) {
if(Util.isDigit(args[0])) {
pg = Integer.parseInt(args[0]);
}else {
event.getTextChannel().sendMessage("Usage: ``" + usage + "``").queue();
}
}
List<BaseCommand> commands = biscuit.getCommandManager().getCommands();
int pageCount = (int) Math.ceil((double) commands.size() / 8);
if (pg > pageCount) {
pg = pageCount;
}
event.getTextChannel().sendMessage("[" + Integer.toString(pg) + "/" + Integer.toString(pageCount) + "] **Bot Commands:**").queue();
String msg = "";
for (int i = 0; i < 8; i++) {
int index = (pg - 1) * 8 + i;
String line = "";
if (index < commands.size()) {
line = "**-** ``" + commands.get(index).getUsage() + "``";
}
if(!(index + 1 >= commands.size() || index == 7)) {
line = line + "\n";
}
if (index < commands.size()) {
msg = msg + line;
}
}
event.getTextChannel().sendMessage(msg).queue();
}
}

View File

@ -0,0 +1,39 @@
package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.util.Util;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
public class MultiplyCommand extends ClientCommand{
public MultiplyCommand() {
name = "Multiply";
description = "Multiplies two numbers.";
usage = PropertiesRetrieval.getCommandSignifier() + "multiply <Num1> <Num2>";
minArgs = 2;
maxArgs = 2;
identifiers.add("multiply");
identifiers.add("mul");
}
@Override
public void execute(String[] args, MessageReceivedEvent event) {
Biscuit b = API.getBiscuit();
b.log(event.getAuthor().getName() + " issued a command: -multiply");
if(args[0] != null && Util.isDeciDigit(args[0]) && args[1] != null && Util.isDeciDigit(args[1])) {
double num = Double.parseDouble(args[0]);
double num2 = Double.parseDouble(args[1]);
String prod = Double.toString(num * num2);
String end = prod.substring(Math.max(prod.length() - 2, 0));
if(end.equals(".0")) {
prod = prod.replace(".0","");
}
event.getTextChannel().sendMessage(args[0] + " x " + args[1] + " is **" + prod + "**.").queue();
}
}
}

View File

@ -3,6 +3,7 @@ package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.global.SpamRecords;
import com.fpghoti.biscuit.util.PermUtil;
@ -15,7 +16,7 @@ public class NotSpammerCommand extends ClientCommand{
public NotSpammerCommand() {
name = "Not Spammer";
description = "Delists user as spammer.";
usage = "-notspammer @<mention-user>";
usage = PropertiesRetrieval.getCommandSignifier() + "notspammer @<mention-user>";
minArgs = 1;
maxArgs = 1;
identifiers.add("notspammer");

View File

@ -3,6 +3,7 @@ package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import net.dv8tion.jda.api.entities.Emote;
import net.dv8tion.jda.api.entities.Role;
@ -13,7 +14,7 @@ public class NotifyCommand extends ClientCommand{
public NotifyCommand() {
name = "Notify";
description = "Puts user in Notify status.";
usage = "-notify";
usage = PropertiesRetrieval.getCommandSignifier() + "notify";
minArgs = 0;
maxArgs = 0;
identifiers.add("notify");
@ -26,7 +27,7 @@ public class NotifyCommand extends ClientCommand{
b.log(event.getAuthor().getName() + " issued a command: -notify");
Role role = null;
for(Role r : event.getGuild().getRoles()) {
if(r.getName().toLowerCase().contains("don't notify")) {
if(r.getName().toLowerCase().contains(PropertiesRetrieval.getDontNotify())) {
role = r;
}
}
@ -37,7 +38,7 @@ public class NotifyCommand extends ClientCommand{
Emote done = null;
for(Emote e : event.getGuild().getEmotes()) {
if(e.getName().contains("ActionComplete")) {
if(e.getName().contains(PropertiesRetrieval.getDoneEmote())) {
done = e;
}
}

View File

@ -3,6 +3,7 @@ package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
@ -11,7 +12,7 @@ public class PingCommand extends ClientCommand{
public PingCommand() {
name = "Ping";
description = "Pings the bot.";
usage = "-ping";
usage = PropertiesRetrieval.getCommandSignifier() + "ping";
minArgs = 0;
maxArgs = 0;
identifiers.add("ping");

View File

@ -0,0 +1,39 @@
package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.util.Util;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
public class PowerCommand extends ClientCommand{
public PowerCommand() {
name = "Power";
description = "Finds Num1 ^ Num2";
usage = PropertiesRetrieval.getCommandSignifier() + "power <Num1> <Num2>";
minArgs = 2;
maxArgs = 2;
identifiers.add("power");
identifiers.add("pow");
}
@Override
public void execute(String[] args, MessageReceivedEvent event) {
Biscuit b = API.getBiscuit();
b.log(event.getAuthor().getName() + " issued a command: -power");
if(args[0] != null && Util.isDeciDigit(args[0]) && args[1] != null && Util.isDeciDigit(args[1])) {
double num = Double.parseDouble(args[0]);
double num2 = Double.parseDouble(args[1]);
String pow = Double.toString( Math.pow(num,num2));
String end = pow.substring(Math.max(pow.length() - 2, 0));
if(end.equals(".0")) {
pow = pow.replace(".0","");
}
event.getTextChannel().sendMessage(args[0] + "^" + args[1] + " is **" + pow + "**.").queue();
}
}
}

View File

@ -3,6 +3,7 @@ package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.global.SpamRecords;
import net.dv8tion.jda.api.entities.User;
@ -13,7 +14,7 @@ public class RecentSpammersCommand extends ClientCommand{
public RecentSpammersCommand() {
name = "Recent Spammers";
description = "Retrieves a list of recent spammers.";
usage = "-recentspammers";
usage = PropertiesRetrieval.getCommandSignifier() + "recentspammers";
minArgs = 0;
maxArgs = 0;
identifiers.add("recentspammers");

View File

@ -1,32 +0,0 @@
package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.util.PermUtil;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
public class ShutDownCommand extends ClientCommand{
public ShutDownCommand() {
name = "Shut Down";
description = "Shuts down the bot.";
usage = "-shutdown";
minArgs = 0;
maxArgs = 0;
identifiers.add("shutdown");
}
@Override
public void execute(String[] args, MessageReceivedEvent event) {
Biscuit b = API.getBiscuit();
b.log(event.getAuthor().getName() + " issued a command: -shutdown");
if(PermUtil.isAdmin(event.getMember())) {
event.getTextChannel().sendMessage("Shutting down Mr. Bouncer...").queue();
}
}
}

View File

@ -3,6 +3,7 @@ package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.global.SpamRecords;
import com.fpghoti.biscuit.util.PermUtil;
@ -15,7 +16,7 @@ public class SoftMuteCommand extends ClientCommand{
public SoftMuteCommand() {
name = "Soft Mute";
description = "Soft mutes a user. In this state, they will only be able to send a message every two minutes.";
usage = "-softmute @<mention-user>";
usage = PropertiesRetrieval.getCommandSignifier() + "softmute @<mention-user>";
minArgs = 1;
maxArgs = 1;
identifiers.add("softmute");

View File

@ -0,0 +1,38 @@
package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.util.Util;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
public class SquareRootCommand extends ClientCommand{
public SquareRootCommand() {
name = "Square Root";
description = "Finds square root.";
usage = PropertiesRetrieval.getCommandSignifier() + "squareroot <Num>";
minArgs = 1;
maxArgs = 1;
identifiers.add("squareroot");
identifiers.add("sqrt");
}
@Override
public void execute(String[] args, MessageReceivedEvent event) {
Biscuit b = API.getBiscuit();
b.log(event.getAuthor().getName() + " issued a command: -squareroot");
if(args[0] != null && Util.isDeciDigit(args[0])) {
double num = Double.parseDouble(args[0]);
String root = Double.toString(Math.sqrt(num));
String end = root.substring(Math.max(root.length() - 2, 0));
if(end.equals(".0")) {
root = root.replace(".0","");
}
event.getTextChannel().sendMessage("The sqaure root of " + args[0] + " is **" + root + "**.").queue();
}
}
}

View File

@ -0,0 +1,39 @@
package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.util.Util;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
public class SubtractCommand extends ClientCommand{
public SubtractCommand() {
name = "Subtract";
description = "Subtracts two numbers.";
usage = PropertiesRetrieval.getCommandSignifier() + "subtract <Num1> <Num2>";
minArgs = 2;
maxArgs = 2;
identifiers.add("subtract");
identifiers.add("sub");
}
@Override
public void execute(String[] args, MessageReceivedEvent event) {
Biscuit b = API.getBiscuit();
b.log(event.getAuthor().getName() + " issued a command: -subtract");
if(args[0] != null && Util.isDeciDigit(args[0]) && args[1] != null && Util.isDeciDigit(args[1])) {
double num = Double.parseDouble(args[0]);
double num2 = Double.parseDouble(args[1]);
String sub = Double.toString(num - num2);
String end = sub.substring(Math.max(sub.length() - 2, 0));
if(end.equals(".0")) {
sub = sub.replace(".0","");
}
event.getTextChannel().sendMessage(args[0] + " - " + args[1] + " is **" + sub + "**.").queue();
}
}
}

View File

@ -3,6 +3,7 @@ package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.util.PermUtil;
import net.dv8tion.jda.api.entities.Member;
@ -14,7 +15,7 @@ public class UIDCommand extends ClientCommand{
public UIDCommand() {
name = "User ID";
description = "Retrieves a user's ID.";
usage = "-uid @<mention-user>";
usage = PropertiesRetrieval.getCommandSignifier() + "uid @<mention-user>";
minArgs = 1;
maxArgs = 1;
identifiers.add("uid");

View File

@ -3,6 +3,7 @@ package com.fpghoti.biscuit.commands.client;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ClientCommand;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.global.SpamRecords;
import com.fpghoti.biscuit.util.PermUtil;
@ -15,7 +16,7 @@ public class UnSoftMuteCommand extends ClientCommand{
public UnSoftMuteCommand() {
name = "Un Soft Mute";
description = "Removes a soft mute from a user.";
usage = "-unsoftmute @<mention-user>";
usage = PropertiesRetrieval.getCommandSignifier() + "unsoftmute @<mention-user>";
minArgs = 1;
maxArgs = 1;
identifiers.add("unsoftmute");

View File

@ -1,6 +1,7 @@
package com.fpghoti.biscuit.commands.console;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ConsoleCommand;
@ -9,14 +10,17 @@ import net.dv8tion.jda.api.entities.TextChannel;
public class SayCommand extends ConsoleCommand{
public SayCommand() {
name = "Say";
description = "Makes bot send message on specified channel.";
usage = "say <channel-name> <message>";
minArgs = 2;
maxArgs = 2000;
identifiers.add("say");
}
public SayCommand() {
name = "Say (Console)";
description = "Makes bot send message on specified channel.";
usage = "[CONSOLE] say <channel-name> <message>";
minArgs = 2;
maxArgs = 2000;
if(!Main.isPlugin) {
identifiers.add("say");
}
identifiers.add("bsay");
}
public void execute(String[] args) {
Biscuit b = API.getBiscuit();

View File

@ -0,0 +1,28 @@
package com.fpghoti.biscuit.commands.console;
import com.fpghoti.biscuit.Biscuit;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.api.API;
import com.fpghoti.biscuit.commands.ConsoleCommand;
public class ShutdownConsoleCommand extends ConsoleCommand{
public ShutdownConsoleCommand() {
name = "Shutdown (Console)";
description = "Shuts down the bot.";
usage = "[CONSOLE] shutdown";
minArgs = 0;
maxArgs = 0;
identifiers.add("shutdown");
}
public void execute(String[] args) {
Biscuit b = API.getBiscuit();
if(args.length == 0) {
Main.shutdown();
}else{
b.log("INCORRECT USAGE! TRY: say <channel-name> <message>");
}
}
}

View File

@ -1,54 +1,41 @@
package com.fpghoti.biscuit.config;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Properties;
import org.slf4j.Logger;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.PluginCore;
public class ConfigRetrieval {
static Logger log = Main.log;
public static void generateConfig(){
Properties prop = new Properties();
OutputStream output = null;
try {
FileInputStream inputStream =
new FileInputStream("config.properties");
inputStream.close();
}
catch(FileNotFoundException ex) {
log.info("config.ini missing...\nCreating file...");
try {
output = new FileOutputStream("config.properties");
prop.setProperty("Bot-Token", "");
prop.setProperty("AllowSpamPunish", "true");
prop.store(output, null);
} catch (IOException io) {
io.printStackTrace();
} finally {
if (output != null) {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void generateConfig() {
File config;
if(Main.isPlugin) {
config = new File(PluginCore.plugin.getDataFolder(), "config.properties");
if(!config.exists()) {
config.getParentFile().mkdir();
}
}else {
config = new File("config.properties");
}
catch(IOException ex) {
log.info("CANNOT READ CONFIG!");
if (!config.exists()) {
try {
Path path = config.toPath();
InputStream is = ConfigRetrieval.class.getClassLoader().getResourceAsStream("config.properties");
Files.copy( is, path);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@ -57,9 +44,17 @@ public class ConfigRetrieval {
Properties prop = new Properties();
InputStream input = null;
File config;
if(Main.isPlugin) {
config = new File(PluginCore.plugin.getDataFolder(), "config.properties");
}else {
config = new File("config.properties");
}
try {
input = new FileInputStream("config.properties");
input = new FileInputStream(config);
prop.load(input);
setting = prop.getProperty(property);
} catch (IOException ex) {

View File

@ -1,60 +1,54 @@
package com.fpghoti.biscuit.config;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import com.fpghoti.biscuit.util.Util;
public class PropertiesRetrieval {
public static String getToken(){
String token = "";
Properties prop = new Properties();
InputStream input = null;
try {
input = new FileInputStream("config.properties");
prop.load(input);
token = prop.getProperty("Bot-Token");
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return token;
return ConfigRetrieval.getFromConfig("Bot-Token");
}
public static String getCommandSignifier(){
String signifier = "";
Properties prop = new Properties();
InputStream input = null;
try {
input = new FileInputStream("config.properties");
prop.load(input);
signifier = signifier + prop.getProperty("Command-Signifier").charAt(0);
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return ConfigRetrieval.getFromConfig("Command-Signifier");
}
public static String getDoneEmote(){
return ConfigRetrieval.getFromConfig("Done-Emote");
}
public static String getDontNotify(){
return ConfigRetrieval.getFromConfig("Dont-Notify-Role");
}
public static boolean captchaEnabled(){
String value = ConfigRetrieval.getFromConfig("Captcha");
return value.equalsIgnoreCase("true");
}
public static String getCaptchaReward(){
return ConfigRetrieval.getFromConfig("Captcha-Reward-Role");
}
public static String getDefaultRole(){
return ConfigRetrieval.getFromConfig("DefaultRoleName");
}
public static boolean noCaptchaKick(){
String value = ConfigRetrieval.getFromConfig("No-Captcha-Kick");
return value.equalsIgnoreCase("true");
}
public static Integer noCaptchaKickTime(){
String value = ConfigRetrieval.getFromConfig("No-Captcha-Kick-Time");
if(!Util.isDigit(value)) {
return 0;
}
return signifier;
return Integer.parseInt(value);
}
public static boolean logChat(){
String value = ConfigRetrieval.getFromConfig("ChatLog");
return value.equalsIgnoreCase("true");
}
}

View File

@ -0,0 +1,128 @@
package com.fpghoti.biscuit.listener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.slf4j.Logger;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.PluginCore;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.user.PreUser;
import com.github.cage.Cage;
import net.dv8tion.jda.api.entities.ChannelType;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.PrivateChannel;
import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
public class DMListener extends ListenerAdapter{
Logger log = Main.log;
@Override
public void onMessageReceived(MessageReceivedEvent event){
if (event.isFromType(ChannelType.PRIVATE) && !event.getAuthor().isBot()) {
if(PropertiesRetrieval.logChat()) {
log.info( "NEW PRIVATE MESSAGE - MSGID: " + event.getMessageId() + "- @" + event.getAuthor().getName() + " " + event.getAuthor().getAsMention() + " - " + event.getMessage().getContentDisplay());
}
handleCaptcha(event);
}
}
private void handleCaptcha(MessageReceivedEvent event) {
PrivateChannel channel = event.getPrivateChannel();
User author = event.getAuthor();
if(PreUser.getPreUser(author) != null) {
PreUser preu = PreUser.getPreUser(author);
if(preu.getToken() == null || !event.getMessage().getContentDisplay().equals(preu.getToken())) {
if(preu.getToken() != null) {
channel.sendMessage("Sorry! That's not quite right! Please try again.").queue();
}
Main.log.info("Generating captcha challenge for user " + author.getName() + " " + author.getAsMention() + "...");
Cage cage = Main.getBiscuit().getCage();
preu.genToken();
OutputStream os;
try {
//os = new FileOutputStream("captcha/" + author.getId() + ".jpg", false);
if(!Main.isPlugin) {
os = new FileOutputStream("captcha/" + author.getId() + ".jpg", false);
}else {
File c = new File(PluginCore.plugin.getDataFolder(), "captcha/" + author.getId() + ".jpg");
os = new FileOutputStream(c, false);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
return;
}
try {
cage.draw(preu.getToken() , os);
} catch (IOException e) {
e.printStackTrace();
return;
} finally {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
return;
}
}
File captcha;
if(!Main.isPlugin) {
captcha = new File("captcha/" + author.getId() + ".jpg");
}else {
captcha = new File(PluginCore.plugin.getDataFolder(), "captcha/" + author.getId() + ".jpg");
}
channel.sendMessage("Respond with the exact text in this image (case-sensitive)").queue();
channel.sendFile(captcha).queue();
}else {
preu.setDone();
Main.log.info(author.getName() + " successfully completed a captcha challenge. Granting role.");
Role newrole = null;
Role defaultrole = null;
for(Guild g : preu.getGuilds()) {
for(Role r : g.getRoles()) {
if(r.getName().toLowerCase().contains(PropertiesRetrieval.getCaptchaReward().toLowerCase())) {
newrole = r;
}else if(r.getName().toLowerCase().contains(PropertiesRetrieval.getDefaultRole().toLowerCase())) {
defaultrole = r;
}
}
if(newrole == null) {
Main.log.error("Cannot find captcha reward role!");
return;
}
if(defaultrole == null) {
Main.log.error("Cannot find captcha default role!");
return;
}
Member member = g.getMemberById(author.getId());
g.addRoleToMember(member, newrole).queue();
g.removeRoleFromMember(member, defaultrole).queue();
preu.remove();
}
channel.sendMessage("Well done, " + author.getAsMention() + "!").queue();
}
}
}
}

View File

@ -3,9 +3,12 @@ package com.fpghoti.biscuit.listener;
import org.slf4j.Logger;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.global.Properties;
import com.fpghoti.biscuit.user.PreUser;
import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.guild.member.GuildMemberJoinEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
@ -15,7 +18,8 @@ public class JoinListener extends ListenerAdapter {
@Override
public void onGuildMemberJoin(GuildMemberJoinEvent event) {
log.info("MEMBER JOINED: " + event.getMember().getUser().getName());
User user = event.getMember().getUser();
log.info("MEMBER JOINED: " + user.getName() + " " + user.getAsMention());
if(Properties.customdefaultrole) {
if(!event.getMember().getUser().isBot()) {
log.info("Issuing a role..");
@ -30,6 +34,10 @@ public class JoinListener extends ListenerAdapter {
return;
}
if(PropertiesRetrieval.captchaEnabled()) {
new PreUser(event.getMember().getUser());
}
event.getGuild().addRoleToMember(event.getMember(), role).queue();
}

View File

@ -4,12 +4,14 @@ import org.slf4j.Logger;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.config.ConfigRetrieval;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.global.MessageQueue;
import com.fpghoti.biscuit.global.SpamRecords;
import com.fpghoti.biscuit.util.ChatFilter;
import com.fpghoti.biscuit.util.Util;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.ChannelType;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.exceptions.PermissionException;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
@ -18,96 +20,104 @@ public class MessageReceiveListener extends ListenerAdapter{
Logger log = Main.log;
/*TODO Cleanup*/
@Override
public void onMessageReceived(MessageReceivedEvent event){
if(Util.isLoggable(event.getTextChannel())) {
log.info( "NEW MSG - MSGID: " + event.getMessageId() + "- @" + event.getAuthor().getName() + " " + event.getAuthor().getAsMention() + " - CHANNEL: #" + event.getChannel().getName() + " - " + event.getMessage().getContentDisplay());
}
if(event.getAuthor().isBot() && event.getMessage().getContentRaw().contains("This message contains words not appropriate for this channel.") || (ChatFilter.isNaughty(event.getMessage().getContentDisplay()))){
MessageQueue.removemessages.put(event.getMessage().getId(), event.getTextChannel());
}
//staff channels do not need filtering, as the filter could actually be a hinderance
if(!event.getChannel().getName().toLowerCase().contains("staff") && ChatFilter.isNaughty(event.getMessage().getContentDisplay())){
String text = event.getMessage().getContentDisplay();
log.info("Removed Msg - REASON NAUGHTY WORD(S) - by " + event.getAuthor().getName() + ": " + text);
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + " This message contains words not appropriate for this channel.").complete();
MessageQueue.fastremovemessages.put(event.getMessage().getId(), event.getTextChannel());
}
if(!event.getAuthor().isBot() && !MessageQueue.chatssent.containsKey(event.getAuthor())){
MessageQueue.chatssent.put(event.getAuthor(), 0);
}
if(!event.getAuthor().isBot() && !MessageQueue.spammsgs.containsKey(event.getAuthor())){
MessageQueue.spammsgs.put(event.getAuthor(), 0);
}
if(!MessageQueue.chatssent10s.containsKey(event.getAuthor()) && SpamRecords.spammers.contains(event.getAuthor())){
MessageQueue.chatssent10s.put(event.getAuthor(), 0);
}
if(!MessageQueue.chatssent2m.containsKey(event.getAuthor()) && SpamRecords.softmute.contains(event.getAuthor())){
MessageQueue.chatssent2m.put(event.getAuthor(), 0);
}
if(!event.getAuthor().isBot()){
MessageQueue.spammsgs.put(event.getAuthor(), MessageQueue.spammsgs.get(event.getAuthor()) + 1);
MessageQueue.chatssent.put(event.getAuthor(), MessageQueue.chatssent.get(event.getAuthor()) + 1);
if(SpamRecords.softmute.contains(event.getAuthor())){
MessageQueue.chatssent2m.put(event.getAuthor(), MessageQueue.chatssent2m.get(event.getAuthor()) + 1);
if (event.isFromType(ChannelType.TEXT)) {
if(Util.isLoggable(event.getTextChannel())) {
if(PropertiesRetrieval.logChat()) {
log.info( "NEW MSG - MSGID: " + event.getMessageId() + "- @" + event.getAuthor().getName() + " " + event.getAuthor().getAsMention() + " - CHANNEL: #" + event.getChannel().getName() + " - " + event.getMessage().getContentDisplay());
}
}
if(SpamRecords.spammers.contains(event.getAuthor())){
MessageQueue.chatssent10s.put(event.getAuthor(), MessageQueue.chatssent10s.get(event.getAuthor()) + 1);
if(event.getAuthor().isBot() && event.getMessage().getContentRaw().contains("This message contains words not appropriate for this channel.") || (ChatFilter.isNaughty(event.getMessage().getContentDisplay()))){
MessageQueue.removemessages.put(event.getMessage().getId(), event.getTextChannel());
}
}
if(SpamRecords.softmute.contains(event.getAuthor()) && MessageQueue.chatssent2m.get(event.getAuthor()) > 1){
String text = event.getMessage().getContentDisplay();
log.info("Removed Msg - REASON SOFTMUTED - by " + event.getAuthor().getName() + ": " + text);
MessageQueue.fastremovemessages.put(event.getMessage().getId(), event.getTextChannel());
}
if(SpamRecords.spammers.contains(event.getAuthor())){
if(MessageQueue.chatssent10s.get(event.getAuthor()) > 1){
//staff channels do not need filtering, as the filter could actually be a hinderance
if(!event.getChannel().getName().toLowerCase().contains("staff") && ChatFilter.isNaughty(event.getMessage().getContentDisplay())){
String text = event.getMessage().getContentDisplay();
log.info("Removed Msg - REASON FLAGGED AS SPAM - by " + event.getAuthor().getName() + ": " + text);
log.info("Removed Msg - REASON NAUGHTY WORD(S) - by " + event.getAuthor().getName() + ": " + text);
event.getTextChannel().sendMessage(event.getAuthor().getAsMention() + " This message contains words not appropriate for this channel.").complete();
MessageQueue.fastremovemessages.put(event.getMessage().getId(), event.getTextChannel());
}
}
if(ConfigRetrieval.getFromConfig("AllowSpamPunish").equalsIgnoreCase("true")){
if(!event.getAuthor().isBot() && !SpamRecords.softmute.contains(event.getAuthor()) && !MessageQueue.chatssent.isEmpty() && MessageQueue.chatssent.get(event.getAuthor()) > 7){
if(!SpamRecords.spammers.contains(event.getAuthor())){
if(event.getGuild().getSelfMember().hasPermission(Permission.NICKNAME_MANAGE)){
try{
//ignores music channels so that music bots can operate normally
if(!event.getChannel().getName().toLowerCase().contains("music")){
if(SpamRecords.warnedspm.contains(event.getAuthor())){
MessageQueue.removemessages.put(event.getMessage().getId(), event.getTextChannel());
SpamRecords.spammers.add(event.getAuthor());
event.getTextChannel().sendMessage("*Flagging " + event.getAuthor().getAsMention() + " as spam!*").queue();
log.info("User " + event.getAuthor().getName() + " has been flagged as spam!");
}else{
MessageQueue.chatssent.remove(event.getAuthor());
SpamRecords.warnedspm.add(event.getAuthor());
event.getTextChannel().sendMessage("**STOP spamming, " + event.getAuthor().getAsMention() + "! You have been warned!**").queue();
log.info("User " + event.getAuthor().getName() + " has been warned for spam!");
}
}
}catch(PermissionException e){
log.info("Bot does not have permission to change the nick name of " + event.getAuthor().getName() + "!");
}
}
if(!event.getAuthor().isBot() && !MessageQueue.chatssent.containsKey(event.getAuthor())){
MessageQueue.chatssent.put(event.getAuthor(), 0);
}
if(!event.getAuthor().isBot() && !MessageQueue.spammsgs.containsKey(event.getAuthor())){
MessageQueue.spammsgs.put(event.getAuthor(), 0);
}
if(!MessageQueue.chatssent10s.containsKey(event.getAuthor()) && SpamRecords.spammers.contains(event.getAuthor())){
MessageQueue.chatssent10s.put(event.getAuthor(), 0);
}
if(!MessageQueue.chatssent2m.containsKey(event.getAuthor()) && SpamRecords.softmute.contains(event.getAuthor())){
MessageQueue.chatssent2m.put(event.getAuthor(), 0);
}
if(!event.getAuthor().isBot()){
MessageQueue.spammsgs.put(event.getAuthor(), MessageQueue.spammsgs.get(event.getAuthor()) + 1);
MessageQueue.chatssent.put(event.getAuthor(), MessageQueue.chatssent.get(event.getAuthor()) + 1);
if(SpamRecords.softmute.contains(event.getAuthor())){
MessageQueue.chatssent2m.put(event.getAuthor(), MessageQueue.chatssent2m.get(event.getAuthor()) + 1);
}
if(event.getGuild().getSelfMember().hasPermission(Permission.MESSAGE_MANAGE)){
if(SpamRecords.spammers.contains(event.getAuthor())){
MessageQueue.chatssent10s.put(event.getAuthor(), MessageQueue.chatssent10s.get(event.getAuthor()) + 1);
}
}
if(SpamRecords.softmute.contains(event.getAuthor()) && MessageQueue.chatssent2m.get(event.getAuthor()) > 1){
String text = event.getMessage().getContentDisplay();
log.info("Removed Msg - REASON SOFTMUTED - by " + event.getAuthor().getName() + ": " + text);
MessageQueue.fastremovemessages.put(event.getMessage().getId(), event.getTextChannel());
}
if(SpamRecords.spammers.contains(event.getAuthor())){
if(MessageQueue.chatssent10s.get(event.getAuthor()) > 1){
String text = event.getMessage().getContentDisplay();
log.info("Removed Msg - REASON FLAGGED AS SPAM - by " + event.getAuthor().getName() + ": " + text);
MessageQueue.fastremovemessages.put(event.getMessage().getId(), event.getTextChannel());
}
}
}
////// Listen for spammers
if(ConfigRetrieval.getFromConfig("AllowSpamPunish").equalsIgnoreCase("true")){
if(!event.getAuthor().isBot() && !SpamRecords.softmute.contains(event.getAuthor()) && !MessageQueue.chatssent.isEmpty() && MessageQueue.chatssent.get(event.getAuthor()) > 7){
if(!SpamRecords.spammers.contains(event.getAuthor())){
if(event.getGuild().getSelfMember().hasPermission(Permission.NICKNAME_MANAGE)){
try{
//ignores music channels so that music bots can operate normally
if(!event.getChannel().getName().toLowerCase().contains("music")){
if(SpamRecords.warnedspm.contains(event.getAuthor())){
MessageQueue.removemessages.put(event.getMessage().getId(), event.getTextChannel());
SpamRecords.spammers.add(event.getAuthor());
event.getTextChannel().sendMessage("*Flagging " + event.getAuthor().getAsMention() + " as spam!*").queue();
log.info("User " + event.getAuthor().getName() + " has been flagged as spam!");
}else{
MessageQueue.chatssent.remove(event.getAuthor());
SpamRecords.warnedspm.add(event.getAuthor());
event.getTextChannel().sendMessage("**STOP spamming, " + event.getAuthor().getAsMention() + "! You have been warned!**").queue();
log.info("User " + event.getAuthor().getName() + " has been warned for spam!");
}
}
}catch(PermissionException e){
log.info("Bot does not have permission to change the nick name of " + event.getAuthor().getName() + "!");
}
}
}
if(event.getGuild().getSelfMember().hasPermission(Permission.MESSAGE_MANAGE)){
MessageQueue.fastremovemessages.put(event.getMessage().getId(), event.getTextChannel());
}
}
}
/////
}
}
}

View File

@ -0,0 +1,22 @@
package com.fpghoti.biscuit.timer.task;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.timer.BiscuitTimer;
import com.fpghoti.biscuit.user.PreUser;
public class DecrementTimer extends BiscuitTimer{
public DecrementTimer(){
delay = (long) 0;
period = (long) 60*1000;
}
public void run() {
if(Main.ready) {
for(PreUser p : PreUser.users) {
p.decrementTime();
}
}
}
}

View File

@ -0,0 +1,120 @@
package com.fpghoti.biscuit.user;
import java.io.File;
import java.util.ArrayList;
import java.util.concurrent.CopyOnWriteArrayList;
import com.fpghoti.biscuit.Main;
import com.fpghoti.biscuit.PluginCore;
import com.fpghoti.biscuit.config.PropertiesRetrieval;
import com.fpghoti.biscuit.util.Util;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.User;
public class PreUser {
public static CopyOnWriteArrayList<PreUser> users = new CopyOnWriteArrayList<PreUser>();
public static PreUser getPreUser(User user) {
for(PreUser u : users) {
if(u.getUser().getId().equals(user.getId())) {
return u;
}
}
return null;
}
public static boolean preUserExists(User user) {
return getPreUser(user) != null;
}
private User user;
private String token;
private int timeLeft;
private boolean done;
public PreUser(User user) {
this.user = user;
this.token = null;
this.done = false;
this.timeLeft = PropertiesRetrieval.noCaptchaKickTime() + 1;
users.add(this);
}
public User getUser() {
return this.user;
}
public String getToken() {
return this.token;
}
//Going to use custom string gen for more char types in captcha
public void genToken() {
//token = Main.getBiscuit().getCage().getTokenGenerator().next();
token = Util.randomString(6);
}
public void setDone() {
this.done = true;
}
public void decrementTime() {
if(!shareGuild()) {
remove();
return;
}
if(!done) {
if(PropertiesRetrieval.noCaptchaKick()) {
timeLeft = timeLeft - 1;
if(timeLeft <= 0) {
for(Guild g : getGuilds()) {
Main.log.info(user.getName() + " " + user.getAsMention() + " waited too long to complete the captcha! Kicking...");
g.kick(user.getId()).queue();
remove();
}
}
}
}
}
public boolean shareGuild() {
JDA jda = Main.getBiscuit().getJDA();
for(Guild g : jda.getGuilds()) {
if(g.isMember(user)){
return true;
}
}
return false;
}
public ArrayList<Guild> getGuilds(){
ArrayList<Guild> guilds = new ArrayList<Guild>();
JDA jda = Main.getBiscuit().getJDA();
for(Guild g : jda.getGuilds()) {
if(g.isMember(user)){
guilds.add(g);
}
}
return guilds;
}
public void remove() {
setDone();
Main.log.info("Removing captcha data for user " + user.getName() + " " + user.getAsMention());
File captcha;
if(!Main.isPlugin) {
captcha = new File("captcha/" + user.getId() + ".jpg");
}else {
captcha = new File(PluginCore.plugin.getDataFolder(), "captcha/" + user.getId() + ".jpg");
}
token = null;
captcha.delete();
users.remove(this);
}
}

View File

@ -28,4 +28,36 @@ public class Util {
return a;
}
public static boolean isDigit(String s){
return s.matches("[0-9]+");
}
public static boolean isDeciDigit(String s){
int i = 0;
String s2 = "";
for(Character c : s.toCharArray()) {
if(!(i == 0 && c == '-')) {
s2 = s2 + c;
}
i++;
}
return s2.replace(".", "").matches("[0-9]+");
}
private static String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
public static String randomString(int size) {
Random rand = new Random();
if (size <= 0) {
return "";
}
String str = "";
for (int i = 0; i < size; i++) {
int ind = rand.nextInt(chars.length());
char rchar = chars.charAt(ind);
str = str + rchar;
}
return str;
}
}

View File

@ -0,0 +1,44 @@
#Change this to redefine the main command signifier character/String
Command-Signifier:-
#Set to false to disable chat logging
ChatLog:true
#Automatically places spammers in spam mode
AllowSpamPunish:true
Channels-To-Not-Chatlog:ignore_me
#Bot token provided by Discord
Bot-Token:
#Normal channels will have messages with these words deleted by the bot
NaughtyList:piff
#Bot can automatically assign role upon user join
UseCustomDefaultRole:true
#Does nothing if UseCustomDefaultRole is off
DefaultRoleName:Standard
#Emote to react with when action is complete
Done-Emote:ActionComplete
#Role to disable notifications
Dont-Notify-Role:dont_notify
#Set true to enable captcha
#Use with UseCustomDefaultRole enabled
#Will require user to have that role for captcha check
#Role will be replaced with reward role on clear
Captcha=false
#Reward this role when captcha cleared
Captcha-Reward-Role:cleared
#Kick if Captcha is not completed in a timely manner
No-Captcha-Kick:false
#Kick user after this number of minutes has passed without captcha clear
#Due to the way the countdown works, the kick may not happen until at most one minute after
No-Captcha-Kick-Time:10

View File

@ -0,0 +1,9 @@
name: Biscuit
author: Ghoti_Mayo
version: ${project.version}
main: com.fpghoti.biscuit.PluginCore
description: Discord bot. Also runs as a Spigot plugin.
commands:
bsay:
description: Send a message to a channel as a bot. Perm biscuit.admin
usage: /bsay <channel-name-without-#> <message>