Levels, Added External Invite Link Blocking
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
@@ -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());
|
||||
}
|
||||
}
|
@@ -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());*/
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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 {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -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) {
|
||||
|
@@ -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();
|
||||
}
|
||||
|
||||
|
@@ -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());
|
||||
}
|
||||
}
|
||||
|
@@ -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());
|
||||
}
|
||||
}
|
||||
|
@@ -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.";
|
||||
}
|
||||
}
|
||||
|
@@ -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();
|
||||
}
|
||||
|
Reference in New Issue
Block a user