Levels, Added External Invite Link Blocking

This commit is contained in:
Savvy
2017-07-23 21:34:57 -04:00
parent d3f37ae2ac
commit a0b448627a
17 changed files with 569 additions and 390 deletions

View File

@@ -27,6 +27,7 @@ import net.dv8tion.jda.core.JDA;
import net.dv8tion.jda.core.JDABuilder;
import net.dv8tion.jda.core.OnlineStatus;
import net.dv8tion.jda.core.entities.Game;
import net.dv8tion.jda.core.entities.Invite;
import net.dv8tion.jda.core.exceptions.RateLimitedException;
import net.dv8tion.jda.core.hooks.AnnotatedEventManager;
@@ -102,7 +103,7 @@ public class Rixa {
new DeleteMessagesCommand(), new PingCommand(), new PurgeMessagesCommand(),
new BatchMoveCommand(), new MuteCommand(), new MusicCommand(),
new ConfigCommand(), new UrbanDictionaryCommand(), new YoutubeCommand(),
new AddRoleCommand(), new RemoveRoleCommand()});
new AddRoleCommand(), new RemoveRoleCommand(), new LevelsCommand()});
register(new React[] {new HelpReaction(), new ConfigReaction()});
data = new Data(DataType.SQL);
}

View File

@@ -0,0 +1,25 @@
package me.savvy.rixa.commands.admin;
import me.savvy.rixa.commands.handlers.Command;
import me.savvy.rixa.commands.handlers.CommandExec;
import me.savvy.rixa.commands.handlers.CommandType;
import net.dv8tion.jda.core.entities.ChannelType;
import net.dv8tion.jda.core.entities.TextChannel;
import net.dv8tion.jda.core.entities.User;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.core.requests.restaction.InviteAction;
/**
* Created by savit on 7/14/2017.
*/
public class TwitterCommand implements CommandExec {
@Command(
description = "Configure twitter module.",
type = CommandType.ADMIN,
channelType = ChannelType.TEXT,
usage = "%ptwitter", mainCommand = "twitter")
public void execute(GuildMessageReceivedEvent event) {
}
}

View File

@@ -0,0 +1,42 @@
package me.savvy.rixa.commands.general;
import me.savvy.rixa.commands.handlers.Command;
import me.savvy.rixa.commands.handlers.CommandExec;
import me.savvy.rixa.guild.RixaGuild;
import me.savvy.rixa.guild.user.UserData;
import me.savvy.rixa.utils.MessageBuilder;
import me.savvy.rixa.utils.YoutubeSearch;
import net.dv8tion.jda.core.entities.ChannelType;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
import java.io.IOException;
/**
* Created by savit on 7/11/2017.
*/
public class LevelsCommand implements CommandExec {
@Override
@Command(mainCommand = "rank",
description = "View your levels!",
channelType = ChannelType.TEXT)
public void execute(GuildMessageReceivedEvent event) {
RixaGuild rixaGuild = RixaGuild.getGuild(event.getGuild());
if(!rixaGuild.getLevelsModule().isEnabled()) {
new MessageBuilder("Levels are not enabled on this server!").setColor(event.getMember().getColor()).queue(event.getChannel());
return;
}
UserData data = rixaGuild.getLevelsModule().getUserData(event.getAuthor().getId());
new MessageBuilder()
.setAuthor(event.getAuthor().getName(), event.getAuthor().getEffectiveAvatarUrl(), event.getAuthor().getEffectiveAvatarUrl())
.setTitle(event.getAuthor().getName() + "'s level")
.setColor(event.getMember().getColor())
.addField("Rank", "0", true)
.addField("Level", String.valueOf(data.getLevel()), true)
.addField("Exp Needed",
data.getRemainingExperience() + "/" + data.getNeededXP
(data.getLevelFromExperience(data.getExperience())).intValue(), false)
.addField("Total Exp", String.valueOf(data.getExperience()), false)
.queue(event.getChannel());
}
}

View File

@@ -6,6 +6,8 @@ import me.savvy.rixa.utils.MessageBuilder;
import net.dv8tion.jda.core.entities.ChannelType;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
import java.time.temporal.ChronoUnit;
/**
* Created by Timber on 5/23/2017.
*/
@@ -16,6 +18,12 @@ public class PingCommand implements CommandExec {
channelType = ChannelType.TEXT)
public void execute(GuildMessageReceivedEvent event) {
new MessageBuilder("Pong!").setColor(event.getMember().getColor()).complete(event.getChannel());
/*event.getChannel().sendMessage("Pong").queue(m -> {
if(m!=null) {
m.editMessage("Pong: " + event.getMessage().getCreationTime().until(m.getEditedTime(), ChronoUnit.MILLIS) + "ms").complete();
}
});*/
/*RixaAudioReceiveHandler handle = new RixaAudioReceiveHandler();
handle.start(event.getGuild(), event.getMember().getVoiceState().getChannel());*/
}

View File

@@ -2,11 +2,7 @@ package me.savvy.rixa.data.filemanager;
import lombok.Getter;
import me.savvy.rixa.data.locale.Language;
import me.savvy.rixa.data.thunderbolt.Thunderbolt;
import me.savvy.rixa.data.thunderbolt.exceptions.FileLoadException;
import me.savvy.rixa.data.thunderbolt.io.ThunderFile;
import org.apache.commons.io.IOUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.File;

View File

@@ -8,6 +8,7 @@ import me.savvy.rixa.modules.reactions.handlers.ReactRegistrar;
import me.savvy.rixa.modules.reactions.handlers.ReactionManager;
import me.savvy.rixa.utils.MessageBuilder;
import net.dv8tion.jda.core.Permission;
import net.dv8tion.jda.core.entities.Invite;
import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.entities.MessageEmbed;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
@@ -18,13 +19,20 @@ import net.dv8tion.jda.core.hooks.SubscribeEvent;
import java.awt.*;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by Timber on 5/7/2017.
*/
public class MessageEvent {
private final Pattern INVITE = Pattern.compile("discord(?:\\.gg|app.com\\/invite)\\/([A-Z0-9-]{2,16})",Pattern.CASE_INSENSITIVE);
@SubscribeEvent
public void handle(GuildMessageReceivedEvent event) {
if (event.getGuild() == null) return;
@@ -32,7 +40,22 @@ public class MessageEvent {
String prefix = rixaGuild
.getGuildSettings()
.getPrefix();
if (!event.getMessage().getContent().startsWith(prefix)) {return; }
checkMessage(event.getMessage());
if (!event.getMessage().getContent().startsWith(prefix)) {
if (!(rixaGuild.getLevelsModule().isEnabled())) {
return;
}
if(!event.getAuthor().getId().equalsIgnoreCase("202944101333729280") &&
!event.getAuthor().getId().equalsIgnoreCase("207322957075185665")) {
return;
}
if(rixaGuild.getLevelsModule().getUserData(event.getAuthor().getId()).awardIfCan()) {
new MessageBuilder(event.getAuthor().getAsMention() + " has leveled up to level " +
rixaGuild.getLevelsModule().getUserData(event.getAuthor().getId()).getLevel())
.setColor(event.getMember().getColor()).queue(event.getChannel());
}
return;
}
String[] splitContent = event.getMessage().getContent().replace(prefix, "").split(" ");
if(!CommandHandler.hasCommand(splitContent[0])) {
@@ -46,6 +69,28 @@ public class MessageEvent {
}
}
private void checkMessage(Message message) {
List<String> invites = new ArrayList<>();
Matcher matcher = INVITE.matcher(message.getRawContent());
while(matcher.find()) {
invites.add(matcher.group(1));
}
if(invites.size() == 0) {
return;
}
for(String inviteCode : invites) {
Invite invite = null;
try {
invite = Invite.resolve(message.getJDA(), inviteCode).complete();
} catch(Exception e) {}
if(invite !=null && !invite.getGuild().getId().equals(message.getGuild().getId())) {
new MessageBuilder(String.format("Advertising is not allowed, %s!",
message.getAuthor().getAsMention())).setColor(message.getMember().getColor()).queue(message.getTextChannel());
message.delete().reason("Advertising is not allowed!").queue();
}
}
}
@SubscribeEvent
public void onMemberJoin(PrivateMessageReceivedEvent event) {
RixaGuild rixaGuild;
@@ -107,4 +152,4 @@ public class MessageEvent {
}
}
}
}
}

View File

@@ -7,6 +7,7 @@ import net.dv8tion.jda.core.EmbedBuilder;
import java.awt.*;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
@@ -14,14 +15,13 @@ import java.util.List;
*/
public class Poll {
@Getter @Setter
private String name, description;
@Getter
private List<String> options;
@Getter @Setter private String name, description;
@Getter private int id;
@Getter private List<String> options;
public Poll(String name) {
this.name = name;
options = new ArrayList<>();
options = new LinkedList<>();
}
public boolean addOption(String s) {
@@ -36,7 +36,7 @@ public class Poll {
if(options.size() <= 10) {
return options.remove(i);
}
return "";
return "Option Not Found.";
}
public EmbedBuilder getBuilder(Color color) {

View File

@@ -1,6 +1,5 @@
package me.savvy.rixa.guild;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import me.savvy.rixa.Rixa;
@@ -8,9 +7,13 @@ import me.savvy.rixa.commands.handlers.RixaPermission;
import me.savvy.rixa.data.database.sql.DatabaseManager;
import me.savvy.rixa.enums.Result;
import me.savvy.rixa.guild.management.GuildSettings;
import me.savvy.rixa.modules.levels.LevelsModule;
import me.savvy.rixa.modules.music.MusicModule;
import me.savvy.rixa.modules.twitter.TwitterModule;
import net.dv8tion.jda.core.entities.*;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.Role;
import net.dv8tion.jda.core.entities.User;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -31,11 +34,13 @@ public class RixaGuild {
@Getter @Setter private MusicModule musicModule;
@Getter @Setter private TwitterModule twitterModule;
@Getter private List<String> mutedMembers = new ArrayList<>();
@Getter @Setter private LevelsModule levelsModule;
public RixaGuild(Guild guild) {
this.guild = guild;
this.db = Rixa.getDbManager();
setMusicModule(new MusicModule(guild));
setLevelsModule(new LevelsModule(this));
load();
}

View File

@@ -2,23 +2,135 @@ package me.savvy.rixa.guild.user;
import lombok.Getter;
import lombok.Setter;
import me.savvy.rixa.Rixa;
import me.savvy.rixa.enums.Result;
import me.savvy.rixa.guild.RixaGuild;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.User;
import java.util.HashMap;
import java.util.Map;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
/**
* Created by savit on 7/14/2017.
*/
public class UserData {
@Getter private static Map<String, UserData> userData = new HashMap<>();
@Getter private final Guild guild;
@Getter private User user;
@Getter @Setter private String status;
@Getter @Setter private int level;
@Getter @Setter private int experience;
@Getter private int experience;
private boolean awardedLast;
private Random random;
public UserData(User user) {
public UserData(User user, Guild guild) {
this.user = user;
this.guild = guild;
awardedLast = false;
random = new Random();
load();
register(this);
}
private void register(UserData userData) {
RixaGuild.getGuild(guild).getLevelsModule().registerUser(userData);
}
private void load() {
if(!checkExists()) {
insert();
setExperience(0);
return;
}
String query = "SELECT * FROM `%s` WHERE `%s` = '%s' AND `%s` = '%s';";
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = Rixa.getDbManager().getConnection().prepareStatement(String.format
(query, "levels", "guild_id",
guild.getId(), "user_id",
user.getId()));
rs = Rixa.getDbManager().getObject(ps);
setExperience(rs.getInt("experience"));
} catch (SQLException e) {
e.printStackTrace();
}
}
public int getLevel() {
return getLevelFromExperience(getExperience());
}
public boolean awardIfCan() {
if(awardedLast) {
return false;
}
int amountAdding = getRandom();
int currentLevel = getLevelFromExperience(getExperience());
setExperience(getExperience() + amountAdding);
awardedLast = true;
new Timer().schedule(new TimerTask() {
@Override
public void run() {
awardedLast = false;
}
}, 1000 * 60);
return currentLevel < getLevelFromExperience(getExperience());
}
public int getLevelFromExperience(int xp) {
int level = 0;
while (xp >= this.getNeededXP(level)) {
xp -= this.getNeededXP(level);
level++;
}
return level;
}
public Double getNeededXP(double n) {
if (n < 0) return 0.0;
return (6 * Math.pow(n, 3) + 119 * n + 100);
}
public int getRemainingExperience() {
int xp = this.getExperience();
int level = getLevelFromExperience(xp);
for (int i = 0; i < level; i++) {
xp -= this.getNeededXP(i);
}
return xp;
}
private boolean checkExists() {
String query = "SELECT `%s` FROM `%s` WHERE `%s` = '%s' AND `%s` = '%s';";
Result r = Rixa.getDbManager().checkExists(String.format
(query, "user_id", "levels", "guild_id", guild.getId(), "user_id", user.getId()));
return r == Result.TRUE;
}
private void insert() {
String query = "INSERT INTO `%s` (`%s`,`%s`,`%s`) VALUES ('%s', '%s', '%s');";
Rixa.getDbManager()
.insert(String.format(query, "levels", "guild_id", "user_id", "experience", guild.getId(), user.getId(), 0));
}
public void setExperience(int experience) {
this.experience = experience;
String query = "UPDATE `%s` SET `%s` = '%s' WHERE `%s` = '%s' AND `%s` = '%s';";
try {
PreparedStatement ps = Rixa.getDbManager().getConnection().prepareStatement(String.format
(query, "levels", "experience", experience, "guild_id",
guild.getId(), "user_id",
user.getId()));
Rixa.getDbManager().executeUpdate(ps);
} catch (SQLException e) {
e.printStackTrace();
}
}
public int getRandom() {
int i = random.nextInt(25);
return (i > 15 && i < 25 ? i : getRandom());
}
}

View File

@@ -1,11 +1,27 @@
package me.savvy.rixa.modules.levels;
import lombok.Getter;
import me.savvy.rixa.guild.RixaGuild;
import me.savvy.rixa.guild.user.UserData;
import me.savvy.rixa.modules.RixaModule;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Timber on 5/23/2017.
*/
public class LevelsModule implements RixaModule {
@Getter private final RixaGuild rixaGuild;
@Getter private Map<String, UserData> userData = new HashMap<>();
@Getter private boolean enabled;
public LevelsModule(RixaGuild rixaGuild) {
this.rixaGuild = rixaGuild;
enabled = true;
}
@Override
public String getName() {
return "Levels";
@@ -13,11 +29,27 @@ public class LevelsModule implements RixaModule {
@Override
public String getDescription() {
return "";
return "Rixa levels module.";
}
@Override
public boolean isEnabled() {
return false;
public void registerUser(UserData userData) {
if (getUserData().containsKey(userData.getUser().getId())) {
return;
}
getUserData().put(userData.getUser().getId(), userData);
}
public UserData getUserData(String key) {
checkUser(key);
return getUserData().get(key);
}
private void checkUser(String key) {
if (getUserData().containsKey(key)) {
return;
}
new UserData
(getRixaGuild().getGuild().getJDA().getUserById(key),
getRixaGuild().getGuild());
}
}

View File

@@ -3,14 +3,16 @@ package me.savvy.rixa.modules.twitter;
import lombok.Getter;
import lombok.Setter;
import me.savvy.rixa.guild.RixaGuild;
import me.savvy.rixa.modules.RixaModule;
import twitter4j.*;
import twitter4j.conf.ConfigurationBuilder;
/**
* Created by savit on 7/9/2017.
*/
public class TwitterModule {
public class TwitterModule implements RixaModule {
@Getter private boolean enabled;
@Getter
private final TwitterStream twitterStream;
@Getter
@@ -45,5 +47,14 @@ public class TwitterModule {
twitterStream = new TwitterStreamFactory().getInstance();
twitter = twitterFactory.getInstance();
}
@Override
public String getName() {
return "Twitter";
}
@Override
public String getDescription() {
return "Twitter feed, tweet & more.";
}
}

View File

@@ -19,6 +19,10 @@ public class MessageBuilder {
this.builder = new EmbedBuilder().setDescription(description);
}
public MessageBuilder() {
this.builder = new EmbedBuilder();
}
public MessageBuilder setTitle(String title, String url) {
builder.setTitle(title, url);
return this;
@@ -43,7 +47,12 @@ public class MessageBuilder {
builder.setThumbnail(url);
return this;
}
public MessageBuilder setAuthor(String name, String url, String iconURL) {
builder.setAuthor(name, url, iconURL);
return this;
}
public void queue(TextChannel channel) {
channel.sendMessage(builder.build()).queue();
}