Vaerys_Dawn

Level up code

Mar 28th, 2018
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.53 KB | None | 0 0
  1.     final static Logger logger = LoggerFactory.getLogger(PixelHandler.class);
  2.  
  3.     private static final ScheduledExecutorService selfDestruct = Executors.newSingleThreadScheduledExecutor();
  4.  
  5.     /***
  6.      * Handler for performing pixel decay.
  7.      *
  8.      * @param content a wrapper around the Guild API object that contains extra information about the guild.
  9.      * @param user    the profile object for the user that is having decay tested.
  10.      */
  11.     public static void doDecay(GuildObject content, ProfileObject user) {
  12.         long days = user.daysDecayed(content);
  13.         if (7 > days) {
  14.             long decay;
  15.             user.setCurrentLevel(PixelHandler.xpToLevel(user.getXP()));
  16.             //modifiable min and max decay days needs to be implemented.
  17.             if (days > 15) {
  18.                 //plateaued xp decay
  19.                 decay = (long) ((15 - 7) * (Globals.avgMessagesPerDay * content.config.xpRate * content.config.xpModifier) / 8);
  20.             } else if (days > 90) {
  21.                 // kill the xp after 90 days of absences
  22.                 decay = (long) ((90 - 7) * (Globals.avgMessagesPerDay * content.config.xpRate * content.config.xpModifier) / 8);
  23.             } else {
  24.                 //normal xp decay formula
  25.                 decay = (long) ((days - 7) * (Globals.avgMessagesPerDay * content.config.xpRate * content.config.xpModifier) / 8);
  26.             }
  27.             //half decay if you turn you xp gain off but only if it is voluntary
  28.             if (user.getSettings().contains(UserSetting.NO_XP_GAIN)) decay = decay / 2;
  29.             //half decay for patreon supporters
  30.             if (user.getUser(content).isPatron) decay = decay / 2;
  31.             //reward handlers
  32.             if (PixelHandler.getRewardCount(content, user.getUserID()) != 0) {
  33.                 long pseudoLevel = xpToLevel(user.getXP() + 120);
  34.                 RewardRoleObject rewardRole = content.config.getCurrentReward(pseudoLevel);
  35.                 if (rewardRole != null) {
  36.  
  37.                     long rewardFloor = rewardRole.getXp() - 100;
  38.                     if (user.getXP() > rewardFloor) {
  39.                         user.setXp(user.getXP() - decay);
  40.                         // your total xp should never reach below 0;
  41.                         if (user.getXP() < 0) {
  42.                             user.setXp(0);
  43.                         }
  44.                         //decay should never lower your total xp below the reward floor.
  45.                         if (user.getXP() < rewardFloor) {
  46.                             user.setXp(rewardFloor);
  47.                         }
  48.                         //if user is at level floor add setting.
  49.                         if (user.getXP() == rewardFloor && !user.getSettings().contains(HIT_LEVEL_FLOOR)) {
  50.                             user.getSettings().add(HIT_LEVEL_FLOOR);
  51.                         }
  52.                     }
  53.                     //if your days away is a multiple of 30 you should be checked if you are at the
  54.                     //reward floor, if you are reward decay occurs
  55.                     if (days % 30 == 0 && user.getXP() == rewardFloor) {
  56.                         user.setXp(user.getXP() - 100);
  57.                     }
  58.                 }
  59.             }
  60.         }
  61.     }
  62.  
  63.     /***
  64.      * Handler for performing automatic role allocation
  65.      *
  66.      * @param id      the user ID of the user that is having their roles checked.
  67.      * @param content a wrapper around the Guild API object that contains extra information about the guild.
  68.      */
  69.     public static void checkUsersRoles(long id, GuildObject content) {
  70.         //do code.
  71.         ProfileObject userObject = content.users.getUserByID(id);
  72.         if (userObject == null) {
  73.             return;
  74.         }
  75.         if (userObject.getSettings().contains(DENY_AUTO_ROLE)) return;
  76.  
  77.         IUser user = Globals.getClient().getUserByID(userObject.getUserID());
  78.         if (user == null) {
  79.             return;
  80.         }
  81.         List<IRole> userRoles = user.getRolesForGuild(content.get());
  82.         //remove all rewardRoles to prep for checking.
  83.         ListIterator iterator = userRoles.listIterator();
  84.         while (iterator.hasNext()) {
  85.             IRole role = (IRole) iterator.next();
  86.             if (content.config.isRoleReward(role.getLongID())) {
  87.                 iterator.remove();
  88.             }
  89.         }
  90.         //add all roles that the user should have.
  91.         ArrayList<RewardRoleObject> allRewards = content.config.getAllRewards(userObject.getCurrentLevel());
  92.         for (RewardRoleObject r : allRewards) {
  93.             userRoles.add(r.getRole(content));
  94.         }
  95.         //add the top ten role if they should have it.
  96.         IRole topTenRole = content.get().getRoleByID(content.config.topTenRoleID);
  97.         if (topTenRole != null) {
  98.             long rank = PixelHandler.rank(content.users, content.get(), user.getLongID());
  99.             if (rank <= 10 && rank > 0) {
  100.                 userRoles.add(topTenRole);
  101.             }
  102.         }
  103.         //only do a role update if the role count changes
  104.         List<IRole> currentRoles = user.getRolesForGuild(content.get());
  105.         if (!currentRoles.containsAll(userRoles) || currentRoles.size() != userRoles.size()) {
  106.             RequestHandler.roleManagement(user, content.get(), userRoles);
  107.         }
  108.     }
  109.  
  110.     /***
  111.      * handler for granting users pixels.
  112.      *
  113.      * @param object the container for all relevant API content.
  114.      */
  115.     public static void grantXP(CommandObject object) {
  116.         //bots don't get XP
  117.         if (object.user.get().isBot()) return;
  118.  
  119.         //creates a profile for the user if they don't already have one.
  120.         ProfileObject user = new ProfileObject(object.user.longID);
  121.         if (object.guild.users.getUserByID(object.user.longID) == null) {
  122.             object.guild.users.getProfiles().add(user);
  123.         } else {
  124.             user = object.guild.users.getUserByID(object.user.longID);
  125.         }
  126.  
  127.         user.lastTalked = object.message.getTimestamp().toEpochSecond();
  128.  
  129.         //ony do xp checks if module is true
  130.         if (!object.guild.config.modulePixels) return;
  131.         if (!object.guild.config.xpGain) return;
  132.  
  133.         //user setting no xp gain
  134.         if (user.getSettings().contains(NO_XP_GAIN) || user.getSettings().contains(DENIED_XP)) return;
  135.  
  136.         //role xp denying
  137.         IRole xpDenied = object.guild.getXPDeniedRole();
  138.         if (xpDenied != null && object.user.roles.contains(xpDenied)) return;
  139.  
  140.         //you can only gain xp once per min
  141.         if (object.guild.getSpokenUsers().contains(object.user.longID)) return;
  142.  
  143.         //messages that might be considered commands should be ignored.
  144.         List<String> deniedPrefixes = new ArrayList<>(object.guild.config.getXpDeniedPrefixes());
  145.         deniedPrefixes.add(object.guild.config.getPrefixCommand());
  146.         deniedPrefixes.add(object.guild.config.getPrefixCC());
  147.         for (String s : deniedPrefixes) {
  148.             if (object.message.get().getContent().startsWith(s)) {
  149.                 return;
  150.             }
  151.         }
  152.  
  153.         //you must have typed at least 10 chars to gain xp and doesn't contain an image.
  154.         if (object.message.get().getContent().length() < 10 &&
  155.                 object.message.get().getAttachments().isEmpty()) return;
  156.  
  157.         //you cannot gain xp in an xpDenied channel
  158.         if (object.channel.settings.contains(ChannelSetting.XP_DENIED)) return;
  159.  
  160.  
  161.         //gives them their xp.
  162.         user.addXP(object.guild.config);
  163.  
  164.         // check level cap, don't grant xp to level-capped users
  165.         if (user.getXP() >= Constants.PIXELS_CAP) user.setXp(Constants.PIXELS_CAP);
  166.  
  167.         //adds to the list of users who have spoken in the last min
  168.         object.guild.getSpokenUsers().add(object.user.longID);
  169.  
  170.         //check the level up state of the user.
  171.         handleLevelUp(user, object);
  172.     }
  173.  
  174.     /***
  175.      * Handler for user level ups.
  176.      *
  177.      * @param user   the user that leveled up.
  178.      * @param object the container for all relevant API content.
  179.      */
  180.     private static void handleLevelUp(ProfileObject user, CommandObject object) {
  181.         RewardRoleObject reward = null;
  182.  
  183.         //get next level xp
  184.         long nextLevelxp = xpToLevel(user.getCurrentLevel() + 1);
  185.  
  186.         //sanity check the level
  187.         if (user.getCurrentLevel() == -1) {
  188.             user.setCurrentLevel(xpToLevel(user.getXP()));
  189.             return;
  190.         }
  191.  
  192.         //check if the user actually leveled up
  193.         if (user.getXP() < nextLevelxp) return;
  194.         user.levelUp();
  195.  
  196.         //check if the user ranked up
  197.         for (RewardRoleObject r : object.guild.config.getRewardRoles()) {
  198.             if (r.getLevel() == user.getCurrentLevel()) {
  199.                 reward = r;
  200.                 break;
  201.             }
  202.         }
  203.         //if denyAutoRole remove Reward.
  204.         if (user.getSettings().contains(DENY_AUTO_ROLE)) reward = null;
  205.  
  206.         //logging
  207.         object.guild.sendDebugLog(object, "PIXELS", reward != null ? "RANKUP" : "LEVELUP", user.getCurrentLevel() + "");
  208.  
  209.         //handle reactions
  210.         handleReactions(user, object);
  211.  
  212.         //handle level up messages
  213.         handleMessage(user, object, reward);
  214.  
  215.         //check user's roles for rank up purposes
  216.         checkUsersRoles(user.getUserID(), object.guild);
  217.     }
  218.  
  219.     /***
  220.      * Handles the sending of the level up message
  221.      *
  222.      * @param user   the user that leveled up.
  223.      * @param object the container for all relevant API content.
  224.      * @param reward reward object that contains info on the reward they have received.
  225.      */
  226.     private static void handleMessage(ProfileObject user, CommandObject object, RewardRoleObject reward) {
  227.         UserSetting defaultOverride = object.guild.config.defaultLevelMode;
  228.         UserSetting userState = user.getLevelState();
  229.         boolean rankedUp = reward != null;
  230.         IChannel levelChannel = object.guild.getChannelByType(ChannelSetting.LEVEL_UP);
  231.         IChannel currentChannel = object.channel.get();
  232.         IChannel dmChannel = object.user.getDmChannel();
  233.         IMessage levelMessage = null;
  234.  
  235.         //force override
  236.         if (userState == null || defaultOverride == DONT_SEND_LVLUP || defaultOverride == SEND_LVLUP_DMS) {
  237.             userState = defaultOverride;
  238.         }
  239.  
  240.         //get custom level up message.
  241.         StringHandler levelUpMessage = new StringHandler(object.guild.config.levelUpMessage);
  242.  
  243.         //handle level up tags
  244.         for (TagObject t : TagList.getType(TagType.LEVEL)) {
  245.             levelUpMessage.setContent(t.handleTag(levelUpMessage.toString(), object, ""));
  246.         }
  247.  
  248.         //build rank up message
  249.         if (rankedUp) {
  250.             levelUpMessage.replace("%s", "");
  251.             if (user.getSettings().contains(HIT_LEVEL_FLOOR)) {
  252.                 levelUpMessage.appendFront("Welcome Back.\n");
  253.                 levelUpMessage.append("\nYour **@%s** role has been returned to you.");
  254.                 user.getSettings().remove(HIT_LEVEL_FLOOR);
  255.             } else {
  256.                 levelUpMessage.append("\nYou have been granted the **@%s** role for reaching this level.");
  257.             }
  258.             levelUpMessage.format(reward.getRole(object).getName());
  259.         }
  260.  
  261.         //do send message
  262.         switch (userState) {
  263.             case SEND_LVLUP_CURRENT_CHANNEL:
  264.                 levelMessage = sendLevelMessage(levelUpMessage.toString(), currentChannel, rankedUp, false);
  265.             case SEND_LVLUP_RANK_CHANNEL:
  266.                 if (levelChannel == null) {
  267.                     levelMessage = sendLevelMessage(levelUpMessage.toString(), currentChannel, rankedUp, false);
  268.                 } else {
  269.                     sendLevelMessage(levelUpMessage.toString(), levelChannel, rankedUp, true);
  270.                 }
  271.             case SEND_LVLUP_DMS:
  272.                 sendLevelMessage(levelUpMessage.toString(), dmChannel, rankedUp, true);
  273.         }
  274.  
  275.         //self destruct level messages
  276.         if (levelMessage != null) {
  277.             selfDestruct(levelMessage, user, object);
  278.         }
  279.     }
  280.  
  281.     /***
  282.      * Helper method to send a level up message.
  283.      *
  284.      * @param message  the message to be sent
  285.      * @param channel  the channel the message should be sent to.
  286.      * @param isRankUp weather the rank or level up gif should be used.
  287.      * @param doGif    weather the gif should be displayed.
  288.      * @return the message that was sent.
  289.      */
  290.     private static IMessage sendLevelMessage(String message, IChannel channel, boolean isRankUp, boolean doGif) {
  291.         return doGif ?
  292.                 (RequestHandler.sendEmbededImage(message, isRankUp ? Constants.RANK_UP_IMAGE_URL : Constants.LEVEL_UP_IMAGE_URL, channel).get()) :
  293.                 (RequestHandler.sendMessage(message, channel).get());
  294.     }
  295.  
  296.     /***
  297.      * Handler for attaching reactions to the message that leveled the user up.
  298.      *
  299.      * @param user   the user that leveled up
  300.      * @param object the container for all relevant API content.
  301.      */
  302.     private static void handleReactions(ProfileObject user, CommandObject object) {
  303.         if (user.getSettings().contains(UserSetting.NO_LEVEL_UP_REACTIONS)) return;
  304.         if (object.guild.config.levelUpReaction.equalsIgnoreCase("null")) return;
  305.         ReactionEmoji emoji;
  306.  
  307.         //get Emoji
  308.         try {
  309.             long emojiID = Long.parseUnsignedLong(object.guild.config.levelUpReaction);
  310.             emoji = ReactionEmoji.of(object.client.getEmojiByID(emojiID));
  311.         } catch (NumberFormatException e) {
  312.             emoji = ReactionEmoji.of(object.guild.config.levelUpReaction);
  313.         }
  314.  
  315.         //send error if the reaction failed
  316.         if (emoji == null) {
  317.             IChannel adminChannel = object.guild.getChannelByType(ChannelSetting.ADMIN);
  318.             if (adminChannel == null) adminChannel = object.channel.get();
  319.             RequestHandler.sendMessage("> The current emoji set to be used for level up reactions is invalid and needs to be updated.", adminChannel);
  320.             return;
  321.         }
  322.  
  323.         //add the reaction
  324.         RequestHandler.addReaction(object.message, emoji);
  325.     }
  326.  
  327.     /***
  328.      * Helper method to self destruct messages after a certain time.
  329.      *
  330.      * @param message the message to be deleted.
  331.      * @param user    the user that level up message.
  332.      */
  333.     private static void selfDestruct(IMessage message, ProfileObject user, CommandObject object) {
  334.         if (object.guild.config.selfDestructLevelUps) {
  335.             selfDestruct.schedule(() -> RequestHandler.deleteMessage(message), user.getCurrentLevel() == 1 ? 2 : 1, TimeUnit.MINUTES);
  336.         }
  337.     }
Advertisement
Add Comment
Please, Sign In to add comment