diff --git a/.classpath b/.classpath index 7c63137..148f4f1 100644 --- a/.classpath +++ b/.classpath @@ -14,5 +14,6 @@ + diff --git a/commands.config b/commands.config index ff56f10..e2280cb 100644 --- a/commands.config +++ b/commands.config @@ -9,6 +9,9 @@ buildhelp=1 c++, g++, cplus, cpp=1 catch=1 charactercreate=1 +charactereditbio=1 +charactereditname=1 +characterediturl=1 choose=1 color, colour=1 crouton=1 @@ -43,6 +46,7 @@ roll=1 rpend=1 rpg=1 rpstart=1 +searchcharacter=1 showpoll=1 shutdown=1 stats=1 diff --git a/lib/fuzzywuzzy-1.2.0.jar b/lib/fuzzywuzzy-1.2.0.jar new file mode 100644 index 0000000..a94b728 Binary files /dev/null and b/lib/fuzzywuzzy-1.2.0.jar differ diff --git a/locCommands.config b/locCommands.config index 26a3701..3a35955 100644 --- a/locCommands.config +++ b/locCommands.config @@ -7,6 +7,7 @@ benchmark, bench= rating= poll= rafflespin= +charactereditURL= bet= guildrolelist= stats= @@ -31,6 +32,7 @@ tony, stark, dontfeelgood, dontfeelsogood= role= raffleend= ping= +charactereditbio= roll= blur= choose= @@ -38,6 +40,7 @@ rpstart= guildrolenotallowed= perish, thenperish= teey= +searchcharacter= dbstats= rafflestart= beans= @@ -50,6 +53,7 @@ rpg= tweet= charactercreate= help= +charactereditname= fetch= crouton= invite= diff --git a/locStrings.config b/locStrings.config index cfe7b88..f5358b0 100644 --- a/locStrings.config +++ b/locStrings.config @@ -89,6 +89,13 @@ RaffleEndSuccess= RaffleEndInfo= RaffleEndFailure=I don't think there's one going! +[CommandCharacterSearch] +CharacterSearchNoCharacterFound=Couldn't find a character with that name or ID! +CharacterSearchMultipleCharacterHeader=I found a couple characters with that name, use `charactersearch UniqueID` with their Unique ID to find them! +CharacterSearchMultipleCharacter=%s is owned by %s. Unique ID is `%s` +CharacterSearchOneCharacter=I found one character with that name! \n Owner: %s | Name: %s | Bio: %s | Ref: <%s> | Unique ID: `%s` +CharacterSearchInfo=Find a character with their name or Unique ID! `charactersearch name` or `charactersearch UniqueID` + [CommandColor] ColorInfo= @@ -126,6 +133,13 @@ PollShowChoices=And the choices are:\n [CommandHelpBuilder] HelpBuilderInfo=Emit help for all commands as formatted HTML +[CommandCharacterEditURL] +CharacterEditURLInfo= +CharacterEditURLNotValid= +CharacterEditURLSuccess= +CharacterEditURLNotAuth= +CharacterEditURLIDNotValid= + [CommandRPG] RPGInfo=Admin+ command only right now - experimental text RPG! Format is !rpg RPGInvalid=Invalid RPG Command! @@ -178,6 +192,13 @@ RaffleStartInfo= HelpInfo=Lets you look up specific commands, or get a link to a list of all commands. HelpDisplay=You can get help with a specific command by typing `!help command`!\nGeneral Commands: `boop, roll, choose, help, info, vote, results, showpoll, wolfram, cplus, java, beans, role, bet, yeet` +[CommandCharacterEditBio] +CharacterEditBioSuccess= +CharacterEditBioIDNotValid= +CharacterEditBioNotAuth= +CharacterEditBioInfo= +CharacterEditBioNotValid= + [CommandTweet] TweetInfo=Kitty will tweet to her personal twitter account TweetError=Tweet command failed! @@ -188,6 +209,13 @@ GuildRoleAddFailure=Failed to add %s to %s GuildRoleAddNotAllowed=You are not allowed to add %s! GuildRoleAddInfo=Add a role to yourself! +[CommandCharacterEditName] +CharacterEditNameInfo= +CharacterEditNameNotValid= +CharacterEditNameIDNotValid= +CharacterEditNameSuccess= +CharacterEditNameNotAuth= + [CommandColiru] ColiruError=Please provide some c++ code to attempt to compile! ColiruInfo=Will try to compile any c++ code you put in! Supports up to C++14 standard, uses g++. @@ -202,10 +230,10 @@ YeetInfo=Yeet yourself or yeet a friend with @! CroutonInfo=Crouton [CommandCharacterCreate] -CharacterCreateDuplicate= -CharacterCreateInfo= -CharacterCreateSuccess= -CharacterCreateNullInfo= +CharacterCreateDuplicate=You can't create a character with the same name! +CharacterCreateInfo=Create a character for kitty to hold onto for you! `createcharacter name, shortbio, refURL` +CharacterCreateSuccess=You successfully created a character! +CharacterCreateNullInfo=There's not enough info! [CommandTeey] TeeyInfo=Teey yourself back into existance, or teey a friend with @! diff --git a/src/commands/CommandCharacterCreate.java b/src/commands/CommandCharacterCreate.java index 2ab4c07..12a22c5 100644 --- a/src/commands/CommandCharacterCreate.java +++ b/src/commands/CommandCharacterCreate.java @@ -13,7 +13,7 @@ import dataStructures.UserInput; public class CommandCharacterCreate extends Command { -public CommandCharacterCreate(KittyRole level, KittyRating rating) { super(level, rating); } + public CommandCharacterCreate(KittyRole level, KittyRating rating) { super(level, rating); } @Override public String HelpText() { return LocStrings.Stub("CharacterCreateInfo"); } @@ -33,6 +33,5 @@ public CommandCharacterCreate(KittyRole level, KittyRating rating) { super(level return; } res.Call(LocStrings.Stub("CharacterCreateDuplicate")); - - } + } } \ No newline at end of file diff --git a/src/commands/CommandCharacterEditBio.java b/src/commands/CommandCharacterEditBio.java new file mode 100644 index 0000000..52b57c7 --- /dev/null +++ b/src/commands/CommandCharacterEditBio.java @@ -0,0 +1,38 @@ +package commands; + +import core.CharacterManager; +import core.Command; +import core.LocStrings; +import dataStructures.*; + +public class CommandCharacterEditBio extends Command +{ + public CommandCharacterEditBio(KittyRole level, KittyRating rating) { super(level, rating); } + + @Override + public String HelpText() { return LocStrings.Stub("CharacterEditBioInfo"); } + + @Override + public void OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) + { + try + { + Long.parseLong(input.args.split(" ")[0]); + } + catch(Exception e) + { + res.Call(LocStrings.Stub("CharacterEditBioNotValid")); + return; + } + KittyCharacter character = CharacterManager.instance.searchCharacter(input.args.split(" ")[0]).get(0); + if(character.getOwner().equals(user)) + { + CharacterManager.instance.editBio(character, input.args.substring(input.args.indexOf(' '))); + res.Call(LocStrings.Stub("CharacterEditBioSuccess")); + } + else + { + res.Call(LocStrings.Stub("CharacterEditBioNotAuth")); + } + } +} \ No newline at end of file diff --git a/src/commands/CommandCharacterEditName.java b/src/commands/CommandCharacterEditName.java new file mode 100644 index 0000000..0fadb64 --- /dev/null +++ b/src/commands/CommandCharacterEditName.java @@ -0,0 +1,38 @@ +package commands; + +import core.CharacterManager; +import core.Command; +import core.LocStrings; +import dataStructures.*; + +public class CommandCharacterEditName extends Command +{ + public CommandCharacterEditName(KittyRole level, KittyRating rating) { super(level, rating); } + + @Override + public String HelpText() { return LocStrings.Stub("CharacterEditNameInfo"); } + + @Override + public void OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) + { + try + { + Long.parseLong(input.args.split(" ")[0]); + } + catch(Exception e) + { + res.Call(LocStrings.Stub("CharacterEditNameNotValid")); + return; + } + KittyCharacter character = CharacterManager.instance.searchCharacter(input.args.split(" ")[0]).get(0); + if(character.getOwner().equals(user)) + { + CharacterManager.instance.editName(character, input.args.substring(input.args.indexOf(' '))); + res.Call(LocStrings.Stub("CharacterEditNameSuccess")); + } + else + { + res.Call(LocStrings.Stub("CharacterEditNameNotAuth")); + } + } +} \ No newline at end of file diff --git a/src/commands/CommandCharacterEditURL.java b/src/commands/CommandCharacterEditURL.java new file mode 100644 index 0000000..887468a --- /dev/null +++ b/src/commands/CommandCharacterEditURL.java @@ -0,0 +1,38 @@ +package commands; + +import core.CharacterManager; +import core.Command; +import core.LocStrings; +import dataStructures.*; + +public class CommandCharacterEditURL extends Command +{ + public CommandCharacterEditURL(KittyRole level, KittyRating rating) { super(level, rating); } + + @Override + public String HelpText() { return LocStrings.Stub("CharacterEditURLInfo"); } + + @Override + public void OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) + { + try + { + Long.parseLong(input.args.split(" ")[0]); + } + catch(Exception e) + { + res.Call(LocStrings.Stub("CharacterEditURLNotValid")); + return; + } + KittyCharacter character = CharacterManager.instance.searchCharacter(input.args.split(" ")[0]).get(0); + if(character.getOwner().equals(user)) + { + CharacterManager.instance.editRefImage(character, input.args.substring(input.args.indexOf(' '))); + res.Call(LocStrings.Stub("CharacterEditURLSuccess")); + } + else + { + res.Call(LocStrings.Stub("CharacterEditURLNotAuth")); + } + } +} \ No newline at end of file diff --git a/src/commands/CommandCharacterSearch.java b/src/commands/CommandCharacterSearch.java new file mode 100644 index 0000000..56ce5a6 --- /dev/null +++ b/src/commands/CommandCharacterSearch.java @@ -0,0 +1,40 @@ +package commands; + +import java.util.ArrayList; + +import core.CharacterManager; +import core.Command; +import core.LocStrings; +import dataStructures.*; + +public class CommandCharacterSearch extends Command +{ + public CommandCharacterSearch(KittyRole level, KittyRating rating) { super(level, rating); } + + @Override + public String HelpText() { return LocStrings.Stub("CharacterSearchInfo"); } + + @Override + public void OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) + { + ArrayList characters = CharacterManager.instance.searchCharacter(input.args); + if(characters.size() < 1) + { + res.Call(LocStrings.Stub("CharacterSearchNoCharacterFound")); + return; + } + if(characters.size() > 1) + { + res.Call(LocStrings.Stub("CharacterSearchMultipleCharacterHeader")); + for(KittyCharacter character:characters) + { + res.Call(String.format(LocStrings.Stub("CharacterSearchMultipleCharacter"), character.getName(), character.getOwner().name, character.getUID())); + } + return; + } + else + { + res.Call(String.format(LocStrings.Stub("CharacterSearchOneCharacter"), characters.get(0).getOwner().name, characters.get(0).getName(), characters.get(0).getBio(), characters.get(0).getRefImage(), characters.get(0).getUID())); + } + } +} \ No newline at end of file diff --git a/src/core/CharacterManager.java b/src/core/CharacterManager.java index caa40ed..cdfb770 100644 --- a/src/core/CharacterManager.java +++ b/src/core/CharacterManager.java @@ -1,15 +1,19 @@ package core; +import java.util.ArrayList; import java.util.Vector; import dataStructures.KittyCharacter; +import dataStructures.KittyTrackedLong; import dataStructures.KittyUser; +import me.xdrop.fuzzywuzzy.FuzzySearch; import utils.GlobalLog; import utils.LogFilter; public class CharacterManager { - public static CharacterManager instance; + public static CharacterManager instance; + KittyTrackedLong uniqueID = new KittyTrackedLong("CharacterIDCounter", ""); private Vector characters = new Vector(); public CharacterManager() @@ -25,6 +29,33 @@ public class CharacterManager } } + public ArrayList searchCharacter(String query) + { + ArrayList chars = new ArrayList(); + try + { + long UID = Long.parseLong(query); + for(KittyCharacter character:characters) + { + if(character.getUID() == UID) + { + chars.add(character); + break; + } + } + }catch(Exception e) + { + for(KittyCharacter character:characters) + { + if(FuzzySearch.ratio(query.toLowerCase(), character.getName().toLowerCase()) > 60) + { + chars.add(character); + } + } + } + return chars; + } + public boolean addCharacter(KittyUser user, String name, String bio, String refImage) { for(KittyCharacter character:characters) @@ -35,45 +66,29 @@ public class CharacterManager } } - characters.add(new KittyCharacter(user, name, bio, refImage)); + characters.add(new KittyCharacter(user, name, bio, refImage, uniqueID.Get())); + uniqueID.Add(1); return true; } - public boolean removeCharacter(KittyUser user, String name) + public void removeCharacter(KittyCharacter character, String name) { - for(KittyCharacter character:characters) - { - if(character.getName().equals(name) && character.getOwner().discordID.equals(user.discordID)) - { - characters.remove(character); - return true; - } - } - return false; + characters.remove(character); } - public boolean editRefImage(KittyUser user, String name, String refImage) + public void editRefImage(KittyCharacter character, String refImage) { - for(KittyCharacter character:characters) - { - if(character.getName().equals(name) && character.getOwner().discordID.equals(user.discordID)) - { - return character.editRefImage(user, refImage); - } - } - return false; + character.editRefImage(refImage); } - public boolean editBio(KittyUser user, String name, String bio) + public void editBio(KittyCharacter character, String bio) { - for(KittyCharacter character:characters) - { - if(character.getName().equals(name) && character.getOwner().discordID.equals(user.discordID)) - { - return character.editBio(user, bio); - } - } - return false; + character.editBio(bio); + } + + public void editName(KittyCharacter character, String name) + { + character.editName(name); } } diff --git a/src/core/ObjectBuilderFactory.java b/src/core/ObjectBuilderFactory.java index 5fee819..e0e3398 100644 --- a/src/core/ObjectBuilderFactory.java +++ b/src/core/ObjectBuilderFactory.java @@ -424,6 +424,10 @@ public class ObjectBuilderFactory manager.Register(LocCommands.Stub("benchmark, bench"), new CommandBenchmark(KittyRole.General, KittyRating.Safe)); manager.Register(LocCommands.Stub("rafflejoin"), new CommandRaffleJoin(KittyRole.General, KittyRating.Safe)); manager.Register(LocCommands.Stub("charactercreate"), new CommandCharacterCreate(KittyRole.General, KittyRating.Safe)); + manager.Register(LocCommands.Stub("searchcharacter"), new CommandCharacterSearch(KittyRole.General, KittyRating.Safe)); + manager.Register(LocCommands.Stub("charactereditbio"), new CommandCharacterEditBio(KittyRole.General, KittyRating.Safe)); + manager.Register(LocCommands.Stub("charactereditname"), new CommandCharacterEditName(KittyRole.General, KittyRating.Safe)); + manager.Register(LocCommands.Stub("charactereditURL"), new CommandCharacterEditURL(KittyRole.General, KittyRating.Safe)); manager.Register(LocCommands.Stub("leaderboard"), new CommandLeaderboard(KittyRole.General, KittyRating.Safe)); manager.Register(LocCommands.Stub("color, colour"), new CommandColor(KittyRole.General, KittyRating.Safe)); @@ -504,4 +508,4 @@ public class ObjectBuilderFactory return userCache.size(); } } -} +} \ No newline at end of file diff --git a/src/dataStructures/KittyCharacter.java b/src/dataStructures/KittyCharacter.java index 7865d3d..affef8b 100644 --- a/src/dataStructures/KittyCharacter.java +++ b/src/dataStructures/KittyCharacter.java @@ -6,43 +6,30 @@ public class KittyCharacter private String name; private String bio; private String refImage; + private long uniqueID; - public KittyCharacter(KittyUser owner, String name, String bio, String refImage) + public KittyCharacter(KittyUser owner, String name, String bio, String refImage, long uniqueID) { this.owner = owner; this.name = name; this.bio = bio; this.refImage = refImage; + this.uniqueID = uniqueID; } - - private boolean allowedToEdit(KittyUser editor) + public void editBio(String bio) { - if(editor.identifier.equals(owner.identifier)) - { - return true; - } - return false; + this.bio = bio; } - public boolean editBio(KittyUser editor, String bio) + public void editRefImage(String refImage) { - if(allowedToEdit(editor)) - { - this.bio = bio; - return true; - } - return false; + this.refImage = refImage; } - public boolean editRefImage(KittyUser editor, String refImage) + public void editName(String name) { - if(allowedToEdit(editor)) - { - this.refImage = refImage; - return true; - } - return false; + this.name = name; } public KittyUser getOwner() @@ -65,6 +52,11 @@ public class KittyCharacter return refImage; } + public long getUID() + { + return uniqueID; + } + public String toString() { return name + " " + bio + " " + refImage;