String contents not being replaced within the same method as string declaration. (JDA)

Tags: , ,



I am trying to store a randomly generated string in a string variable to use for in for other things. Basically, it is a password generator that stores the password for use with commands that need it. The application seems to have problems with storing the password for later use though. Code and output vs expected below.

public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
    super.onGuildMessageReceived(event);

    String id = "discord userid String";
    long idlong = Long.parseLong(id);
    
    String generatedString = RandomStringUtils.random(15, true, true);
    StringBuilder stored = new StringBuilder(15);

   //password generator
    if (event.getMessage().getContentRaw().equalsIgnoreCase("!passwordgen")) {
        if (stored.toString().isEmpty() == true || idlong == 
        event.getMessage().getAuthor().getIdLong()) {
            stored.replace(0, 14, generatedString);

            User user = event.getMessage().getAuthor();
            user.openPrivateChannel().complete()
                .sendMessage("Your new password is: " + stored + ". You can change your password 
                in the future with !setpassword <currentpassword>.").queue();
            }
            else {
                event.getChannel().sendMessage("You do not have permission to generate a new password  
                and/or an initial password has already been set.").queue();
            }
        }
        
        //set password command      
        if (event.getMessage().getContentRaw().startsWith("!setpassword")) {    
            char[] chararr = event.getMessage().getContentRaw().toCharArray();
            
            for (int i = 0; i < chararr.length; i++) {
                if (chararr[i] == ' ') {
                    passwordkeyed += event.getMessage().getContentRaw().substring(13);
                }
            }
            
            if (passwordkeyed.equals(stored.toString()) && !(passwordkeyed.isEmpty())) {
                stored.replace(0, 14, generatedString); //replaces random password from !passwordgen 
               // with new random password
    
                event.getChannel().sendMessage("Stored: " + stored).queue();
                event.getChannel().sendMessage("Check your DMs!").queue();
                
                User user1 = event.getMessage().getAuthor();
                user1.openPrivateChannel().complete()
                    .sendMessage("Your new password is: " + stored).queue();  
            }
                if (!(passwordkeyed.equals(stored.toString()))) {
                event.getChannel().sendMessage("Incorrect password. Stored: " + stored).queue();
            }
            
                if (stored.toString().isEmpty()) {
                event.getChannel().sendMessage("Please use !passwordgen to generate an initial password.").queue();
            }
        }
}

For some reason, in the //password generator section, stored is replaced with a random string just fine but when you enter that password using the !setpassword command, stored is empty so it is like the replace method I used in the password generator section is not being saved even though the StringBuilder has the proper scope for the method. I’ve been trying to do this for a bit now. I have tried with String, StringBuilder, and StringBuffer to see if any had different results but all had the same output.

Output:

!passwordgen //discord bot command

Your new password is: h50uSKlrWa30Q40. You can change your password in the future with !setpassword 
<currentpassword>. //private message to whoever ran the command

!setpassword h50uSKlrWa30Q40 //discord bot command

Incorrect password. Stored:
Please use !passwordgen to generate an initial password.

Expected Output:

 !passwordgen //discord bot command

Your new password is: h50uSKlrWa30Q40. You can change your password in the future with !setpassword 
<currentpassword>. //private message to whoever ran the command

!setpassword h50uSKlrWa30Q40 //discord bot command

Stored: 2Fx8buVxpIEyNYX
Check your DMs!

Your new password is: 2Fx8buVxpIEyNYX //private message to whoever ran the command

In the back of my mind I am thinking it may be how I am generating the random password and storing it but I am not sure since this seems to be a problem with the string declaration itself and its scope

Answer

Try:

StringBuilder stored = new StringBuilder(15);

to

String stored = "";

OR

try to add this above the public void onGuildMessageReceived(GuildMessageReceivedEvent event):

private String Stored = "";

Everytime you want to use it, do this.Stored

See if it works then.

Also, try to add a statement to send in dms the current stored string at random points in the code this is what i call print–debugging to simply see when the value changes to reduce our search.



Source: stackoverflow