From ae830013600c0b50ac261316712a4a111fb1eabc Mon Sep 17 00:00:00 2001 From: Sebastien Date: Fri, 14 Dec 2018 17:57:02 +0200 Subject: [PATCH] Add stats API --- src/main/java/net/Broken/BotListener.java | 5 +- src/main/java/net/Broken/Init.java | 13 +--- .../Broken/RestApi/MusicWebAPIController.java | 3 +- .../RestApi/UserManagerAPIController.java | 24 ++++++ .../Tools/UserManager/Stats/GuildStats.java | 34 +++++++++ .../UserManager/Stats/GuildStatsPack.java | 17 +++++ .../{ => Stats}/UserStatsUtils.java | 76 +++++++++++++------ 7 files changed, 133 insertions(+), 39 deletions(-) create mode 100644 src/main/java/net/Broken/Tools/UserManager/Stats/GuildStats.java create mode 100644 src/main/java/net/Broken/Tools/UserManager/Stats/GuildStatsPack.java rename src/main/java/net/Broken/Tools/UserManager/{ => Stats}/UserStatsUtils.java (76%) diff --git a/src/main/java/net/Broken/BotListener.java b/src/main/java/net/Broken/BotListener.java index ef7b53a..c3f496d 100644 --- a/src/main/java/net/Broken/BotListener.java +++ b/src/main/java/net/Broken/BotListener.java @@ -8,7 +8,7 @@ import net.Broken.Tools.Command.CommandParser; import net.Broken.Tools.EmbedMessageUtils; import net.Broken.Tools.Moderateur; import net.Broken.Tools.PrivateMessage; -import net.Broken.Tools.UserManager.UserStatsUtils; +import net.Broken.Tools.UserManager.Stats.UserStatsUtils; import net.Broken.audio.AudioM; import net.dv8tion.jda.core.EmbedBuilder; import net.dv8tion.jda.core.entities.*; @@ -78,7 +78,6 @@ public class BotListener extends ListenerAdapter { String message = guildPref.getWelcomeMessage(); message = message.replaceAll("@name", event.getMember().getAsMention()); logger.debug(message); -// "Salut "+event.getUser().getAsMention()+"! Ecris ton nom, prénom, ta promotion et ton groupe ici! Un admin te donnera accées a ton groupe!" chanel.sendMessage(message).complete(); } @@ -124,7 +123,7 @@ public class BotListener extends ListenerAdapter { public void onGuildVoiceJoin(GuildVoiceJoinEvent event) { super.onGuildVoiceJoin(event); if(!event.getMember().getUser().isBot()) - new UserStatsUtils.VoicePresenceCompter(event.getMember()).start(); + new UserStatsUtils.VoicePresenceCounter(event.getMember()).start(); } @Override diff --git a/src/main/java/net/Broken/Init.java b/src/main/java/net/Broken/Init.java index 05cbee2..b775937 100644 --- a/src/main/java/net/Broken/Init.java +++ b/src/main/java/net/Broken/Init.java @@ -1,32 +1,24 @@ package net.Broken; import net.Broken.DB.Entity.UserEntity; -import net.Broken.DB.Entity.UserStats; import net.Broken.DB.Repository.UserRepository; import net.Broken.RestApi.ApiCommandLoader; import net.Broken.Tools.Command.CommandLoader; import net.Broken.Tools.DayListener.DayListener; import net.Broken.Tools.DayListener.Listeners.DailyMadame; import net.Broken.Tools.DayListener.Listeners.ResetSpam; -import net.Broken.Tools.UserManager.UserStatsUtils; -import net.Broken.audio.Youtube.YoutubeTools; +import net.Broken.Tools.UserManager.Stats.UserStatsUtils; import net.dv8tion.jda.core.AccountType; 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.Guild; -import net.dv8tion.jda.core.entities.Member; -import net.dv8tion.jda.core.entities.RichPresence; -import net.dv8tion.jda.core.entities.impl.JDAImpl; -import net.dv8tion.jda.core.exceptions.RateLimitedException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.json.JSONObject; import org.springframework.context.ApplicationContext; import javax.security.auth.login.LoginException; -import java.io.IOException; import java.util.List; @@ -54,7 +46,8 @@ public class Init { logger.info("Connecting to Discord api..."); //connection au bot - jda = new JDABuilder(AccountType.BOT).setToken(token).setBulkDeleteSplittingEnabled(false).buildBlocking(); + jda = new JDABuilder(AccountType.BOT).setToken(token).setBulkDeleteSplittingEnabled(false).build(); + jda = jda.awaitReady(); MainBot.jda = jda; jda.setAutoReconnect(true); diff --git a/src/main/java/net/Broken/RestApi/MusicWebAPIController.java b/src/main/java/net/Broken/RestApi/MusicWebAPIController.java index 6dfad22..8a9bfaf 100644 --- a/src/main/java/net/Broken/RestApi/MusicWebAPIController.java +++ b/src/main/java/net/Broken/RestApi/MusicWebAPIController.java @@ -4,12 +4,11 @@ import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; import com.sedmelluq.discord.lavaplayer.track.AudioTrack; import net.Broken.DB.Entity.UserEntity; -import net.Broken.DB.Entity.UserStats; import net.Broken.DB.Repository.UserRepository; import net.Broken.MainBot; import net.Broken.RestApi.Data.*; import net.Broken.Tools.UserManager.Exceptions.UnknownTokenException; -import net.Broken.Tools.UserManager.UserStatsUtils; +import net.Broken.Tools.UserManager.Stats.UserStatsUtils; import net.Broken.Tools.UserManager.UserUtils; import net.Broken.audio.AudioM; import net.Broken.audio.GetVoiceChanels; diff --git a/src/main/java/net/Broken/RestApi/UserManagerAPIController.java b/src/main/java/net/Broken/RestApi/UserManagerAPIController.java index 830f696..21bfb2c 100644 --- a/src/main/java/net/Broken/RestApi/UserManagerAPIController.java +++ b/src/main/java/net/Broken/RestApi/UserManagerAPIController.java @@ -5,9 +5,12 @@ import net.Broken.DB.Entity.UserEntity; import net.Broken.DB.Repository.PendingUserRepository; import net.Broken.DB.Repository.UserRepository; import net.Broken.MainBot; +import net.Broken.RestApi.Data.CommandResponseData; import net.Broken.RestApi.Data.UserManager.*; import net.Broken.Tools.UserManager.Exceptions.*; import net.Broken.Tools.UserManager.Oauth; +import net.Broken.Tools.UserManager.Stats.GuildStatsPack; +import net.Broken.Tools.UserManager.Stats.UserStatsUtils; import net.Broken.Tools.UserManager.UserUtils; import net.dv8tion.jda.core.Permission; import net.dv8tion.jda.core.entities.Guild; @@ -151,6 +154,27 @@ public class UserManagerAPIController { } } + @RequestMapping(value = "/getStatsPack", method = RequestMethod.GET) + public ResponseEntity getStatsPack(@CookieValue(value = "token") String token, @RequestParam(value = "guild") String guildID){ + try{ + UserEntity user = userUtils.getUserWithApiToken(userRepository, token); + Guild guild = MainBot.jda.getGuildById(guildID); + if(guild == null ){ + logger.warn("Request whit no guild!"); + return new ResponseEntity(HttpStatus.BAD_REQUEST); + } + + return new ResponseEntity<>(UserStatsUtils.getINSTANCE().getStatPack(user, guildID), HttpStatus.OK); + + + + } catch (UnknownTokenException e) { + logger.info("Token check fail"); + return new ResponseEntity(HttpStatus.UNAUTHORIZED); + } + } + + diff --git a/src/main/java/net/Broken/Tools/UserManager/Stats/GuildStats.java b/src/main/java/net/Broken/Tools/UserManager/Stats/GuildStats.java new file mode 100644 index 0000000..443103c --- /dev/null +++ b/src/main/java/net/Broken/Tools/UserManager/Stats/GuildStats.java @@ -0,0 +1,34 @@ +package net.Broken.Tools.UserManager.Stats; + +public class GuildStats{ + public String userName; + + public long voiceTime; + public long voiceXp; + + public long messageCount; + public long messageXp; + + public long apiCount; + public long apiXp; + + public long total; + + + public GuildStats() { + } + + public GuildStats(String userName, long voiceTime, long messageCount, long apiCount) { + this.userName = userName; + this.voiceTime = voiceTime; + this.messageCount = messageCount; + this.apiCount = apiCount; + + + voiceXp = (long) (this.voiceTime * UserStatsUtils.XP_PER_VOICE_TIME); + messageXp = (long) (this.messageCount * UserStatsUtils.XP_PER_MESSAGE); + apiXp = (long) (this.apiCount * UserStatsUtils.XP_PER_API_COUNT); + total = voiceXp + messageXp + apiXp; + + } +} diff --git a/src/main/java/net/Broken/Tools/UserManager/Stats/GuildStatsPack.java b/src/main/java/net/Broken/Tools/UserManager/Stats/GuildStatsPack.java new file mode 100644 index 0000000..8553e6d --- /dev/null +++ b/src/main/java/net/Broken/Tools/UserManager/Stats/GuildStatsPack.java @@ -0,0 +1,17 @@ +package net.Broken.Tools.UserManager.Stats; + +import java.util.List; + +public class GuildStatsPack { + + + public int rank; + public GuildStats selfStats; + public List ranking; + + public GuildStatsPack(int rank, GuildStats selfStats, List ranking) { + this.rank = rank; + this.selfStats = selfStats; + this.ranking = ranking; + } +} diff --git a/src/main/java/net/Broken/Tools/UserManager/UserStatsUtils.java b/src/main/java/net/Broken/Tools/UserManager/Stats/UserStatsUtils.java similarity index 76% rename from src/main/java/net/Broken/Tools/UserManager/UserStatsUtils.java rename to src/main/java/net/Broken/Tools/UserManager/Stats/UserStatsUtils.java index 1333c9d..8f80836 100644 --- a/src/main/java/net/Broken/Tools/UserManager/UserStatsUtils.java +++ b/src/main/java/net/Broken/Tools/UserManager/Stats/UserStatsUtils.java @@ -1,4 +1,4 @@ -package net.Broken.Tools.UserManager; +package net.Broken.Tools.UserManager.Stats; import net.Broken.DB.Entity.UserEntity; import net.Broken.DB.Entity.UserStats; @@ -7,6 +7,7 @@ import net.Broken.DB.Repository.UserStatsRepository; import net.Broken.MainBot; import net.Broken.SpringContext; import net.Broken.Tools.UserManager.Exceptions.UnknownTokenException; +import net.Broken.Tools.UserManager.UserUtils; import net.dv8tion.jda.core.entities.Guild; import net.dv8tion.jda.core.entities.Member; import net.dv8tion.jda.core.entities.User; @@ -16,10 +17,16 @@ import org.springframework.context.ApplicationContext; import org.springframework.security.crypto.password.PasswordEncoder; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; public class UserStatsUtils { + static double XP_PER_VOICE_TIME = 0.1; + static double XP_PER_MESSAGE = 1; + static double XP_PER_API_COUNT = 1; + + private static UserStatsUtils INSTANCE = new UserStatsUtils(); @@ -82,7 +89,9 @@ public class UserStatsUtils { } - public void addMessageCount(Member member){ + + + public UserStats getGuildUserStats(Member member){ List userEntityList = userRepository.findByJdaId(member.getUser().getId()); UserEntity userEntity; if( userEntityList.size() == 0) @@ -96,7 +105,21 @@ public class UserStatsUtils { userStatsList = userStatsRepository.findByUserAndGuildId(userEntity, member.getGuild().getId()); } - UserStats userStats = userStatsList.get(0); + return userStatsList.get(0); + } + + public UserStats getGuildUserStats(UserEntity userEntity, String guildId){ + List userStatsList = userStatsRepository.findByUserAndGuildId(userEntity, guildId); + if(userStatsRepository.findByUserAndGuildId(userEntity, guildId).size() == 0){ + getUserStats(userEntity); + userStatsList = userStatsRepository.findByUserAndGuildId(userEntity, guildId); + } + return userStatsList.get(0); + } + + + public void addMessageCount(Member member){ + UserStats userStats = getGuildUserStats(member); userStats.setMessageCount(userStats.getMessageCount() + 1); userStatsRepository.save(userStats); @@ -106,12 +129,7 @@ public class UserStatsUtils { public void addApiCount(UserEntity userEntity, String guildId){ - List userStatsList = userStatsRepository.findByUserAndGuildId(userEntity, guildId); - if(userStatsRepository.findByUserAndGuildId(userEntity, guildId).size() == 0){ - getUserStats(userEntity); - userStatsList = userStatsRepository.findByUserAndGuildId(userEntity, guildId); - } - UserStats userStats = userStatsList.get(0); + UserStats userStats = getGuildUserStats(userEntity, guildId); userStats.setApiCommandCount(userStats.getApiCommandCount() + 1); userStatsRepository.save(userStats); @@ -120,19 +138,7 @@ public class UserStatsUtils { private void addVocalCount(Member member){ - List userEntityList = userRepository.findByJdaId(member.getUser().getId()); - UserEntity userEntity; - if( userEntityList.size() == 0) - userEntity = genUserEntity(member.getUser()); - else - userEntity = userEntityList.get(0); - - List userStatsList = userStatsRepository.findByUserAndGuildId(userEntity, member.getGuild().getId()); - if(userStatsList.size() == 0){ - getUserStats(userEntity); - userStatsList = userStatsRepository.findByUserAndGuildId(userEntity, member.getGuild().getId()); - } - UserStats userStats = userStatsList.get(0); + UserStats userStats = getGuildUserStats(member); userStats.setVocalTime(userStats.getVocalTime() + 10); userStatsRepository.save(userStats); @@ -149,9 +155,28 @@ public class UserStatsUtils { - public static class VoicePresenceCompter extends Thread{ + public GuildStatsPack getStatPack(UserEntity userEntity, String guildId){ + UserStats userStats = getGuildUserStats(userEntity, guildId); + GuildStats selfGuildStats = null; + + List allStats = userStatsRepository.findByGuildId(guildId); + List ranked = new ArrayList<>(); + for(UserStats stats : allStats){ + GuildStats temp = new GuildStats(stats.getUser().getName(), stats.getVocalTime(), stats.getMessageCount(), stats.getApiCommandCount()); + if(stats.getUser().getId().equals(userEntity.getId())){ + selfGuildStats = temp; + } + ranked.add(temp); + } + ranked.sort((guildStats, t1) -> (int) (guildStats.total - t1.total)); + + return new GuildStatsPack(ranked.indexOf(selfGuildStats) + 1 , selfGuildStats, ranked); + + } + + public static class VoicePresenceCounter extends Thread{ private Member member; - public VoicePresenceCompter(Member member){ + public VoicePresenceCounter(Member member){ this.member = member; } @@ -171,4 +196,7 @@ public class UserStatsUtils { } } } + + + }