74 Commits
Author SHA1 Message Date
AlexStewartCode 3c67bf65d3 Update README.md 2020-09-29 02:53:34 -04:00
AlexStewartCode 984a081ccf Update README.md 2020-09-29 02:53:18 -04:00
AlexStewartCode 270b945408 Update README.md 2020-09-29 02:50:19 -04:00
Alex Stewart fb0d5de6e3 Merge branch 'develop' 2020-09-29 02:48:01 -04:00
Alex Stewart 6ddb0fc532 =Update for Beans
Fixes and updates for beans
2020-09-29 02:42:01 -04:00
Alex Stewart 20a16f2c74 WIP on role system 2020-08-06 21:07:14 -04:00
Alex Stewart 67f1e083e9 Updated Music Commands with new Jar
Jar was out of date and caused errors.
2020-07-29 21:23:39 -04:00
Alex Stewart b917a3b4ee =Fixed Bug#7 Tagging multiple people using !trade results in wrong error
Fixed, added check for multiple users being tagged.
2020-03-27 03:08:44 -04:00
Alex Stewart 39abf08b35 =Fixed Bug #4 Bot will not respond when choosing between nonitems
Fixed, edited in cheeky response when finding an empty string
2020-03-27 03:04:37 -04:00
Alex Stewart d86adaf3e2 =Fixed Bug #10 GetSauce command incorrect output
Fixed multiple issues, stemming from change of E6 API
2020-03-27 02:54:33 -04:00
Alex Stewart cab2370f89 Merge branch 'master' into develop 2020-03-27 02:23:06 -04:00
Alex Stewart d0d2b9498d Merge branch 'develop' 2020-03-27 02:23:00 -04:00
Alex Stewart 4c4835e342 =Fixed Bug #6 Roll improperly formats when providing single number
Edited roll function, array index had incorrect variable assigned
2020-03-27 02:22:37 -04:00
Matthew Cech 844edc8084 = Grammar issue 2020-03-26 17:53:47 -07:00
Matthew Cech 2981a7bdc4 Merge branch 'master' into develop 2020-03-26 17:47:28 -07:00
Matthew Cech 6ff38f09eb + Added check for edge case of backtick escape.
Added concept for only trimming ends, tho it remains commented out.
2020-03-26 17:46:47 -07:00
Matthew Cech ef4b216cb3 Merge remote-tracking branch 'origin/master' 2020-03-26 16:49:50 -07:00
Matthew Cech 0d3c16c4da = Updated boop conditions to not track people booping other people 2020-03-26 16:49:42 -07:00
Alex Stewart 99e3566188 =E6 bug fixes
E6 changed Json request and response
Edited to mirror those changes
2020-03-26 02:53:20 -04:00
Alex Stewart 0728370bf2 =Edited Font system 2020-03-05 22:29:35 -05:00
Alex Stewart fa5057ea9e Merge remote-tracking branch 'origin/master' 2020-02-26 02:59:48 -05:00
Alex Stewart 02f9b09199 =Edited Bean Command to incorporate image 2020-02-26 02:59:44 -05:00
Matthew Cech 9ec1198969 Merge remote-tracking branch 'origin/master' 2020-02-25 21:12:01 -08:00
Matthew Cech dc56532ed0 + Added additional checks for colors 2020-02-25 21:11:56 -08:00
Alex Stewart 22f8e0b9df =Fix for GetSauce Command
Fixed issue #2
2020-02-25 21:07:51 -05:00
Alex Stewart 3e48056b15 Merge remote-tracking branch 'origin/master' 2020-02-25 18:26:59 -05:00
Alex Stewart 6be6bd4033 Auto stash before merge of "master" and "origin/master" 2020-02-25 18:25:17 -05:00
Matthew Cech 462f23274e + Added nanoHTTPD library 2020-02-25 15:19:12 -08:00
Matthew Cech 1a2366f5ee + Added hex verification 2020-02-21 11:22:20 -08:00
Matthew Cech a77725791a + Added flippable trade command arguments 2020-02-21 11:14:06 -08:00
Matthew Cech c0f0b16892 + Added trade back in and regenerated config file 2020-02-21 11:06:46 -08:00
Matthew Cech d5346b3727 = re-adding start style 2020-02-09 21:21:35 -08:00
Matthew Cech 26b258bdcb = Fixed music 2020-02-09 21:12:11 -08:00
Matthew Cech bcc7959c00 = Merging 2020-02-09 21:06:37 -08:00
Matthew Cech de2f3f4515 Iterative 2020-02-09 20:56:10 -08:00
Matthew Cech c8061770ed Merge branch 'develop' 2020-02-09 20:44:22 -08:00
Matthew Cech 10c0fa58b2 Merge remote-tracking branch 'origin/master' into develop 2020-02-09 20:11:00 -08:00
Alex 35c74e89f4 Merge branch 'develop' 2020-02-09 23:07:15 -05:00
Alex 2c6091a258 Merge branch 'master' into develop 2020-02-09 23:07:06 -05:00
Alex 86d7e58838 =Youtube Fixes 2020-02-09 23:06:45 -05:00
Alex 0d4015fff0 youtube fix 2020-01-16 03:16:27 -05:00
Alex 3a03793124 Youtube Progress 2020-01-15 01:51:23 -05:00
Alex 46cf6f8c97 Bug Fixes with Music playing 2019-12-18 03:07:52 -05:00
Rin a63afd3a2b Merge remote-tracking branch 'origin/develop' into develop 2019-12-16 01:50:18 -05:00
Matthew Cech d15336f4b6 Merge remote-tracking branch 'origin/develop' into develop 2019-11-02 19:32:51 -08:00
Matthew Cech d63a531a81 Merge branch 'feature/cleanup' into develop 2019-11-02 19:32:12 -08:00
Matthew Cech c8af9da196 Merge remote-tracking branch 'origin/feature/cleanup' into feature/cleanup 2019-11-02 19:31:45 -08:00
Matthew Cech 595b1e3958 = clarified mode with note in key 2019-11-02 19:31:39 -08:00
Matthew Cech d6fd5ae436 = clarified mode with note in key 2019-11-02 19:31:02 -08:00
Matthew Cech 74a5750824 = Updated config 2019-11-02 19:29:02 -08:00
Matthew Cech 7f2251732e = Configs updating 2019-11-02 19:13:26 -08:00
Matthew Cech ee60721897 Merge branch 'master' into feature/cleanup 2019-11-02 11:00:40 -07:00
Alex d656ccb323 Merge branch 'hotfix/slowmerge' 2019-10-19 03:37:06 -04:00
Alex 6e7b6fce29 Merge branch 'hotfix/slowmerge' into develop 2019-10-19 03:37:06 -04:00
Alex 55487a017e =Bug fixes 2019-10-19 03:36:52 -04:00
Alex c7ed9785dc Merge branch 'hotfix/slowmerge' into develop 2019-10-19 03:35:52 -04:00
Alex 7b179b10ee =Music bug fixes
-Playlist not loading correctly
2019-10-19 03:35:43 -04:00
Alex bd1bcc1bd3 =Bug fix 2019-10-19 02:59:18 -04:00
Alex 462bb58ead =Fixing Youtube Player 2019-10-19 02:56:11 -04:00
Alex 6a84f3759a =Updates 2019-10-18 03:11:01 -04:00
Matthew Cech dfbf646abc = synced item tweak 2019-10-18 00:08:23 -07:00
Matthew Cech 12e0ec98bd = Swapped to sync object 2019-10-18 00:04:38 -07:00
Matthew Cech 0ff71abfb0 = Player isolation 2019-10-18 00:00:39 -07:00
Matthew Cech 94a3f1afcd = Condensed track scheduler 2019-10-17 23:37:44 -07:00
Matthew Cech 4d36bb0cb9 = Condensed managers and handler 2019-10-17 23:33:14 -07:00
Matthew Cech 248814b9e3 = Condense, iterative 2019-10-17 23:31:06 -07:00
Matthew Cech a1fa8b29b2 = Condensed main shapsnot 2019-10-17 23:22:29 -07:00
Matthew Cech 4ed18b8acc = main migrate 2019-10-17 22:55:49 -07:00
Matthew Cech afb27df33d gitflow-hotfix-stash: slowmerge 2019-10-17 22:39:56 -07:00
Alex 8cfa25a51b =Synchronized response String 2019-10-18 00:39:33 -04:00
Alex bbbb138f5e =Work on Music command 2019-10-18 00:36:20 -04:00
Alex 343308c433 Merge remote-tracking branch 'origin/master' 2019-10-13 23:23:53 -04:00
Rin 52fdaefe75 =Music updates and image sourcing 2019-10-13 23:23:44 -04:00
Matthew Cech a73fca7851 Merge branch 'hotfix/dance' 2019-09-12 22:15:34 -07:00
91 changed files with 2372 additions and 2055 deletions
+3 -1
View File
@@ -24,7 +24,9 @@
<classpathentry kind="lib" path="lib/commons-collections4-4.3.jar"/> <classpathentry kind="lib" path="lib/commons-collections4-4.3.jar"/>
<classpathentry kind="lib" path="lib/commons-lang3-3.9.jar"/> <classpathentry kind="lib" path="lib/commons-lang3-3.9.jar"/>
<classpathentry kind="lib" path="lib/commons-text-1.6.jar"/> <classpathentry kind="lib" path="lib/commons-text-1.6.jar"/>
<classpathentry kind="lib" path="lib/google-http-client-1.32.0.jar"/>
<classpathentry kind="lib" path="lib/google-api-services-youtube-v3-rev212-1.25.0.jar"/> <classpathentry kind="lib" path="lib/google-api-services-youtube-v3-rev212-1.25.0.jar"/>
<classpathentry kind="lib" path="lib/lavaplayer-1.3.19.jar"/> <classpathentry kind="lib" path="lib/nanohttpd-2.3.1.jar"/>
<classpathentry kind="lib" path="G:/Shared/Coding/Java/workspace/ProKitty/lib/LavaPlayerJar-1.3.50-jar-with-dependencies.jar"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

+18 -7
View File
@@ -1,4 +1,5 @@
"Type","Key","Value" "Type","Key","Value"
"Globals","mode (dev or release)","dev"
"Localized Commands","beans","" "Localized Commands","beans",""
"Localized Commands","benchmark, bench","" "Localized Commands","benchmark, bench",""
"Localized Commands","bet","" "Localized Commands","bet",""
@@ -16,10 +17,12 @@
"Localized Commands","dbstats","" "Localized Commands","dbstats",""
"Localized Commands","defaultdance","" "Localized Commands","defaultdance",""
"Localized Commands","derp","" "Localized Commands","derp",""
"Localized Commands","dew","" "Localized Commands","derpi",""
"Localized Commands","e6",""
"Localized Commands","e621","" "Localized Commands","e621",""
"Localized Commands","eightball, 8ball","" "Localized Commands","eightball, 8ball",""
"Localized Commands","fetch","" "Localized Commands","fetch",""
"Localized Commands","getsauce",""
"Localized Commands","givebeans","" "Localized Commands","givebeans",""
"Localized Commands","help","" "Localized Commands","help",""
"Localized Commands","indicator","" "Localized Commands","indicator",""
@@ -47,9 +50,9 @@
"Localized Commands","stats","" "Localized Commands","stats",""
"Localized Commands","teey","" "Localized Commands","teey",""
"Localized Commands","tony, stark, dontfeelgood, dontfeelsogood","tony, stark, dontfeelgood, dontfeelsogood, snap" "Localized Commands","tony, stark, dontfeelgood, dontfeelsogood","tony, stark, dontfeelgood, dontfeelsogood, snap"
"Localized Commands","tradebeans, trade",""
"Localized Commands","tweet","" "Localized Commands","tweet",""
"Localized Commands","vote","" "Localized Commands","vote",""
"Localized Commands","weh",""
"Localized Commands","wolfram","" "Localized Commands","wolfram",""
"Localized Commands","work","" "Localized Commands","work",""
"Localized Commands","yeet","" "Localized Commands","yeet",""
@@ -62,7 +65,7 @@
"Localized Strings","BetBeansInfo","Allows you to bet your beans, set your amount after the command! Warning! House always wins!nSets of 3 will get 2x, 4 will get 10x, and 5 will get 1000x" "Localized Strings","BetBeansInfo","Allows you to bet your beans, set your amount after the command! Warning! House always wins!nSets of 3 will get 2x, 4 will get 10x, and 5 will get 1000x"
"Localized Strings","BetBeansLose","Sorry, you didn't win, try again!" "Localized Strings","BetBeansLose","Sorry, you didn't win, try again!"
"Localized Strings","BetBeansLowBet","Please bet with at least 20 beans!" "Localized Strings","BetBeansLowBet","Please bet with at least 20 beans!"
"Localized Strings","BetBeansMinThreshold","50" "Localized Strings","BetBeansMinThreshold",""
"Localized Strings","BetBeansNotEnough","You don't have enough beans!" "Localized Strings","BetBeansNotEnough","You don't have enough beans!"
"Localized Strings","BetBeansNotValid","That's not a valid bet!" "Localized Strings","BetBeansNotValid","That's not a valid bet!"
"Localized Strings","BetBeansWin","You won %s beans!" "Localized Strings","BetBeansWin","You won %s beans!"
@@ -110,9 +113,10 @@
"Localized Strings","DBFlushInfo","Takes all objects queued for the database and writes them to the database, then says how many were written." "Localized Strings","DBFlushInfo","Takes all objects queued for the database and writes them to the database, then says how many were written."
"Localized Strings","DBStatsInfo","Shows current statistics for the database" "Localized Strings","DBStatsInfo","Shows current statistics for the database"
"Localized Strings","DefaultDanceInfo","y'all know forknife, get ready to dance, or make a friend dance with @!" "Localized Strings","DefaultDanceInfo","y'all know forknife, get ready to dance, or make a friend dance with @!"
"Localized Strings","DewInfo","A fun little dev experiment!" "Localized Strings","DerpiError",""
"Localized Strings","DoWorkFinished","I finished with my work! :D" "Localized Strings","DoWorkFinished","I finished with my work! :D"
"Localized Strings","DoWorkInfo","Occupies a core for a few seconds" "Localized Strings","DoWorkInfo","Occupies a core for a few seconds"
"Localized Strings","E6Blacklisted","I can't show that image ;3; (it may be blacklisted)"
"Localized Strings","EightBallError","Hmm? You'll need to ask a question!" "Localized Strings","EightBallError","Hmm? You'll need to ask a question!"
"Localized Strings","EightBallInfo","Answers a yes or no question! Warning: Kitty can not actually tell the future, she claims no responsibility for any lion mauling, lack of lottery wins, or felony charges." "Localized Strings","EightBallInfo","Answers a yes or no question! Warning: Kitty can not actually tell the future, she claims no responsibility for any lion mauling, lack of lottery wins, or felony charges."
"Localized Strings","EightBallMaybe1","Reply hazy, try again." "Localized Strings","EightBallMaybe1","Reply hazy, try again."
@@ -143,6 +147,7 @@
"Localized Strings","FetchInfo","Throw a custom emote and I'll try to bring it back.... maybe" "Localized Strings","FetchInfo","Throw a custom emote and I'll try to bring it back.... maybe"
"Localized Strings","FetchRunAway","*Runs away and doesn't return for a long time*" "Localized Strings","FetchRunAway","*Runs away and doesn't return for a long time*"
"Localized Strings","FetchStare","*Stares at %s*" "Localized Strings","FetchStare","*Stares at %s*"
"Localized Strings","GetSauceInfo",""
"Localized Strings","GiveBeansInfo","Gives beans to the mentioned users!" "Localized Strings","GiveBeansInfo","Gives beans to the mentioned users!"
"Localized Strings","GiveBeansInvalid","That's not a valid number!" "Localized Strings","GiveBeansInvalid","That's not a valid number!"
"Localized Strings","GiveBeansNoneMentioned","You didn't mention anyone!" "Localized Strings","GiveBeansNoneMentioned","You didn't mention anyone!"
@@ -182,7 +187,11 @@
"Localized Strings","MapVersion","Using mapgen v0.1" "Localized Strings","MapVersion","Using mapgen v0.1"
"Localized Strings","MapWidth","" "Localized Strings","MapWidth",""
"Localized Strings","ModInfo","Mod is a super command for admin or mod use only!\n\t`mod ban @user` will ban a user from the server\n\t`mod kick @user` will kick the user from the server" "Localized Strings","ModInfo","Mod is a super command for admin or mod use only!\n\t`mod ban @user` will ban a user from the server\n\t`mod kick @user` will kick the user from the server"
"Localized Strings","MusicAddTrack",""
"Localized Strings","MusicInfo","" "Localized Strings","MusicInfo",""
"Localized Strings","MusicVolChanged","Volume set to %s!"
"Localized Strings","MusicVolCurrent","Volume is at %s!"
"Localized Strings","MusicVolOOB",""
"Localized Strings","PerishInfo","Adds a red, 'a n g e r y' overlay to your icon or the icon of a friend you mentioned" "Localized Strings","PerishInfo","Adds a red, 'a n g e r y' overlay to your icon or the icon of a friend you mentioned"
"Localized Strings","PingInfo","Will respond with Pong!" "Localized Strings","PingInfo","Will respond with Pong!"
"Localized Strings","PingResponse","Pong!" "Localized Strings","PingResponse","Pong!"
@@ -238,13 +247,13 @@
"Localized Strings","TeeyInfo","Teey yourself back into existance, or teey a friend with @!" "Localized Strings","TeeyInfo","Teey yourself back into existance, or teey a friend with @!"
"Localized Strings","TradeBeansInfo","Give your friends some of your beans! Just don't forget to @ them!" "Localized Strings","TradeBeansInfo","Give your friends some of your beans! Just don't forget to @ them!"
"Localized Strings","TradeBeansIntParseError","That's not a real number! D:" "Localized Strings","TradeBeansIntParseError","That's not a real number! D:"
"Localized Strings","TradeBeansMultipleUsersTagged",""
"Localized Strings","TradeBeansNoTargetError","Don't forget to tag who you want to give the beans to!" "Localized Strings","TradeBeansNoTargetError","Don't forget to tag who you want to give the beans to!"
"Localized Strings","TradeBeansNotEnoughError","You can't give more beans than you have!" "Localized Strings","TradeBeansNotEnoughError","You can't give more beans than you have!"
"Localized Strings","TradeBeansStealingBeans","Hey %s! Stealing is wrong! Let's see how you like it! *steals 10 beans*" "Localized Strings","TradeBeansStealingBeans","Hey %s! Stealing is wrong! Let's see how you like it! *steals 10 beans*"
"Localized Strings","TradeBeansSuccess","%s gave %s %s beans!" "Localized Strings","TradeBeansSuccess","%s gave %s %s beans!"
"Localized Strings","TweetError","Tweet command failed!" "Localized Strings","TweetError","Tweet command failed!"
"Localized Strings","TweetInfo","Kitty will tweet to her personal twitter account" "Localized Strings","TweetInfo","Kitty will tweet to her personal twitter account"
"Localized Strings","WehInfo","Weh"
"Localized Strings","WolframError","Something went wrong!" "Localized Strings","WolframError","Something went wrong!"
"Localized Strings","WolframInfo","Will query wolframalpha with your question and give a full image output of the answer" "Localized Strings","WolframInfo","Will query wolframalpha with your question and give a full image output of the answer"
"Localized Strings","WolframNoArgs","You need to provide some arguments!" "Localized Strings","WolframNoArgs","You need to provide some arguments!"
@@ -272,10 +281,12 @@
"Command Enabler","dbstats","1" "Command Enabler","dbstats","1"
"Command Enabler","defaultdance","1" "Command Enabler","defaultdance","1"
"Command Enabler","derp","1" "Command Enabler","derp","1"
"Command Enabler","dew","1" "Command Enabler","derpi","1"
"Command Enabler","e6","1"
"Command Enabler","e621","1" "Command Enabler","e621","1"
"Command Enabler","eightball, 8ball","1" "Command Enabler","eightball, 8ball","1"
"Command Enabler","fetch","1" "Command Enabler","fetch","1"
"Command Enabler","getsauce","1"
"Command Enabler","givebeans","1" "Command Enabler","givebeans","1"
"Command Enabler","guildroleadd","1" "Command Enabler","guildroleadd","1"
"Command Enabler","guildroleallowed","1" "Command Enabler","guildroleallowed","1"
@@ -314,9 +325,9 @@
"Command Enabler","stats","1" "Command Enabler","stats","1"
"Command Enabler","teey","1" "Command Enabler","teey","1"
"Command Enabler","tony, stark, dontfeelgood, dontfeelsogood","1" "Command Enabler","tony, stark, dontfeelgood, dontfeelsogood","1"
"Command Enabler","tradebeans, trade","1"
"Command Enabler","tweet","1" "Command Enabler","tweet","1"
"Command Enabler","vote","1" "Command Enabler","vote","1"
"Command Enabler","weh","1"
"Command Enabler","wolfram","1" "Command Enabler","wolfram","1"
"Command Enabler","work","1" "Command Enabler","work","1"
"Command Enabler","yeet","1" "Command Enabler","yeet","1"
1 Type Key Value
2 Globals mode (dev or release) dev
3 Localized Commands beans
4 Localized Commands benchmark, bench
5 Localized Commands bet
17 Localized Commands dbstats
18 Localized Commands defaultdance
19 Localized Commands derp
20 Localized Commands dew derpi
21 Localized Commands e6
22 Localized Commands e621
23 Localized Commands eightball, 8ball
24 Localized Commands fetch
25 Localized Commands getsauce
26 Localized Commands givebeans
27 Localized Commands help
28 Localized Commands indicator
50 Localized Commands stats
51 Localized Commands teey
52 Localized Commands tony, stark, dontfeelgood, dontfeelsogood tony, stark, dontfeelgood, dontfeelsogood, snap
53 Localized Commands tradebeans, trade
54 Localized Commands tweet
55 Localized Commands vote
Localized Commands weh
56 Localized Commands wolfram
57 Localized Commands work
58 Localized Commands yeet
65 Localized Strings BetBeansInfo Allows you to bet your beans, set your amount after the command! Warning! House always wins!nSets of 3 will get 2x, 4 will get 10x, and 5 will get 1000x
66 Localized Strings BetBeansLose Sorry, you didn't win, try again!
67 Localized Strings BetBeansLowBet Please bet with at least 20 beans!
68 Localized Strings BetBeansMinThreshold 50
69 Localized Strings BetBeansNotEnough You don't have enough beans!
70 Localized Strings BetBeansNotValid That's not a valid bet!
71 Localized Strings BetBeansWin You won %s beans!
113 Localized Strings DBFlushInfo Takes all objects queued for the database and writes them to the database, then says how many were written.
114 Localized Strings DBStatsInfo Shows current statistics for the database
115 Localized Strings DefaultDanceInfo y'all know forknife, get ready to dance, or make a friend dance with @!
116 Localized Strings DewInfo DerpiError A fun little dev experiment!
117 Localized Strings DoWorkFinished I finished with my work! :D
118 Localized Strings DoWorkInfo Occupies a core for a few seconds
119 Localized Strings E6Blacklisted I can't show that image ;3; (it may be blacklisted)
120 Localized Strings EightBallError Hmm? You'll need to ask a question!
121 Localized Strings EightBallInfo Answers a yes or no question! Warning: Kitty can not actually tell the future, she claims no responsibility for any lion mauling, lack of lottery wins, or felony charges.
122 Localized Strings EightBallMaybe1 Reply hazy, try again.
147 Localized Strings FetchInfo Throw a custom emote and I'll try to bring it back.... maybe
148 Localized Strings FetchRunAway *Runs away and doesn't return for a long time*
149 Localized Strings FetchStare *Stares at %s*
150 Localized Strings GetSauceInfo
151 Localized Strings GiveBeansInfo Gives beans to the mentioned users!
152 Localized Strings GiveBeansInvalid That's not a valid number!
153 Localized Strings GiveBeansNoneMentioned You didn't mention anyone!
187 Localized Strings MapVersion Using mapgen v0.1
188 Localized Strings MapWidth
189 Localized Strings ModInfo Mod is a super command for admin or mod use only!\n\t`mod ban @user` will ban a user from the server\n\t`mod kick @user` will kick the user from the server
190 Localized Strings MusicAddTrack
191 Localized Strings MusicInfo
192 Localized Strings MusicVolChanged Volume set to %s!
193 Localized Strings MusicVolCurrent Volume is at %s!
194 Localized Strings MusicVolOOB
195 Localized Strings PerishInfo Adds a red, 'a n g e r y' overlay to your icon or the icon of a friend you mentioned
196 Localized Strings PingInfo Will respond with Pong!
197 Localized Strings PingResponse Pong!
247 Localized Strings TeeyInfo Teey yourself back into existance, or teey a friend with @!
248 Localized Strings TradeBeansInfo Give your friends some of your beans! Just don't forget to @ them!
249 Localized Strings TradeBeansIntParseError That's not a real number! D:
250 Localized Strings TradeBeansMultipleUsersTagged
251 Localized Strings TradeBeansNoTargetError Don't forget to tag who you want to give the beans to!
252 Localized Strings TradeBeansNotEnoughError You can't give more beans than you have!
253 Localized Strings TradeBeansStealingBeans Hey %s! Stealing is wrong! Let's see how you like it! *steals 10 beans*
254 Localized Strings TradeBeansSuccess %s gave %s %s beans!
255 Localized Strings TweetError Tweet command failed!
256 Localized Strings TweetInfo Kitty will tweet to her personal twitter account
Localized Strings WehInfo Weh
257 Localized Strings WolframError Something went wrong!
258 Localized Strings WolframInfo Will query wolframalpha with your question and give a full image output of the answer
259 Localized Strings WolframNoArgs You need to provide some arguments!
281 Command Enabler dbstats 1
282 Command Enabler defaultdance 1
283 Command Enabler derp 1
284 Command Enabler dew derpi 1
285 Command Enabler e6 1
286 Command Enabler e621 1
287 Command Enabler eightball, 8ball 1
288 Command Enabler fetch 1
289 Command Enabler getsauce 1
290 Command Enabler givebeans 1
291 Command Enabler guildroleadd 1
292 Command Enabler guildroleallowed 1
325 Command Enabler stats 1
326 Command Enabler teey 1
327 Command Enabler tony, stark, dontfeelgood, dontfeelsogood 1
328 Command Enabler tradebeans, trade 1
329 Command Enabler tweet 1
330 Command Enabler vote 1
Command Enabler weh 1
331 Command Enabler wolfram 1
332 Command Enabler work 1
333 Command Enabler yeet 1
Binary file not shown.
+22
View File
@@ -0,0 +1,22 @@
function plugin(message, user)
local index;
local concat;
if(string.find(message, "https://derpicdn.net/img"))then
if(string.find(message, "view/"))then
index = string.find(message, "/[^/]*$");
return "!derpi ID:" .. string.sub(message, index + 1, string.find(message, ".[^.]*$")-1);
else
if(string.find(message, "download/"))then
index = string.find(message, "_");
concat = string.sub(message, 0, index-1);
return "!derpi ID:" .. string.sub(concat, string.find(message, "/[^/]*$") + 1);
else
index = string.find(message, "/[^/]*$");
concat = string.sub(message, 0, index - 1);
index = string.find(concat, "/[^/]*$");
return "!derpi ID:" .. string.sub(concat, index + 1);
end
end
end
end
+8
View File
@@ -0,0 +1,8 @@
function plugin(message, user)
if(string.find(message, "https://static1.e621.net/data") or string.find(message, "https://static1.e926.net/data"))then
if(string.find(message, " "))then
message = string.sub(message, 0, string.find(message, " "));
end
return "!e6 md5:" .. string.sub(message, string.find(message, "/[^/]*$") + 1 ,string.find(message, ".[^.]*$") - 1);
end
end
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -2,11 +2,11 @@ package commands.benchmark;
import java.util.List; import java.util.List;
import commands.benchmark.core.BenchmarkCommand; import core.benchmark.BenchmarkCommand;
import commands.benchmark.core.BenchmarkEntry; import core.benchmark.BenchmarkEntry;
import commands.benchmark.core.BenchmarkFormattable; import core.benchmark.BenchmarkFormattable;
import commands.benchmark.core.BenchmarkInput; import core.benchmark.BenchmarkInput;
import commands.benchmark.core.BenchmarkManager; import core.benchmark.BenchmarkManager;
public class BenchmarkCommandCompare extends BenchmarkCommand public class BenchmarkCommandCompare extends BenchmarkCommand
{ {
@@ -2,11 +2,7 @@ package commands.benchmark;
import java.util.List; import java.util.List;
import commands.benchmark.core.BenchmarkCommand; import core.benchmark.*;
import commands.benchmark.core.BenchmarkEntry;
import commands.benchmark.core.BenchmarkFormattable;
import commands.benchmark.core.BenchmarkInput;
import commands.benchmark.core.BenchmarkManager;
public class BenchmarkCommandFind extends BenchmarkCommand public class BenchmarkCommandFind extends BenchmarkCommand
{ {
@@ -2,11 +2,11 @@ package commands.benchmark;
import java.util.List; import java.util.List;
import commands.benchmark.core.BenchmarkCommand; import core.benchmark.BenchmarkCommand;
import commands.benchmark.core.BenchmarkEntry; import core.benchmark.BenchmarkEntry;
import commands.benchmark.core.BenchmarkFormattable; import core.benchmark.BenchmarkFormattable;
import commands.benchmark.core.BenchmarkInput; import core.benchmark.BenchmarkInput;
import commands.benchmark.core.BenchmarkManager; import core.benchmark.BenchmarkManager;
import dataStructures.KittyEmbed; import dataStructures.KittyEmbed;
import java.awt.Color; import java.awt.Color;
-43
View File
@@ -1,43 +0,0 @@
package commands.dew;
import commands.dew.core.impl.DewCore;
import core.Command;
import core.LocStrings;
import core.SubCommandFramework;
import dataStructures.KittyChannel;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.Response;
import dataStructures.UserInput;
public class CommandDew extends Command
{
public static DewCore core;
SubCommandFramework framework = new SubCommandFramework();
@Override
public String getHelpText() { return LocStrings.stub("DewInfo"); }
@Override
public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res)
{
framework.run(guild, channel, user, input).Call(res);
}
public CommandDew(KittyRole level, KittyRating rating)
{
super(level, rating);
core = new DewCore(framework);
framework.addCommand("luatest", new CommandDewLuaTest(KittyRole.Dev, KittyRating.Safe));
framework.addCommand("realm", new CommandDewRealm(KittyRole.Dev, KittyRating.Safe));
framework.addCommand("w", new CommandDewInput("w", KittyRole.Dev, KittyRating.Safe));
framework.addCommand("a", new CommandDewInput("a", KittyRole.Dev, KittyRating.Safe));
framework.addCommand("s", new CommandDewInput("s", KittyRole.Dev, KittyRating.Safe));
framework.addCommand("d", new CommandDewInput("d", KittyRole.Dev, KittyRating.Safe));
framework.addCommand("capture", new CommandDewCapture(KittyRole.Dev, KittyRating.Safe));
}
}
-28
View File
@@ -1,28 +0,0 @@
package commands.dew;
import commands.dew.adapter.KittyAdapterDewPlayer;
import commands.dew.core.impl.DewCore;
import core.SubCommand;
import core.SubCommandFormattable;
import dataStructures.KittyChannel;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.UserInput;
public class CommandDewCapture extends SubCommand
{
public CommandDewCapture(KittyRole roleLevel, KittyRating contentRating)
{
super(roleLevel, contentRating);
}
@Override
public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input)
{
KittyAdapterDewPlayer player = DewCore.getOrCreate(user);
DewCore.playersCaptured.add(player);
return null;//new SubCommandFormattable("captured input for " + user.name);
}
}
-41
View File
@@ -1,41 +0,0 @@
package commands.dew;
import commands.dew.adapter.KittyAdapterDewPlayer;
import commands.dew.core.impl.DewCore;
import core.SubCommand;
import core.SubCommandFormattable;
import dataStructures.KittyChannel;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.UserInput;
public class CommandDewInput extends SubCommand
{
String letter = "";
public CommandDewInput(String letter, KittyRole roleLevel, KittyRating contentRating)
{
super(roleLevel, contentRating);
this.letter = letter.toLowerCase();
}
@Override
public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input)
{
KittyAdapterDewPlayer player = DewCore.getOrCreate(user);
int x = player.getRealmX();
int y = player.getRealmY();
switch(letter)
{
case "w": player.setRealmPos(x, y - 1); break;
case "a": player.setRealmPos(x - 1, y); break;
case "s": player.setRealmPos(x, y + 1); break;
case "d": player.setRealmPos(x + 1, y); break;
}
return new SubCommandFormattable(DewCore.drawWorld(player));
}
}
-67
View File
@@ -1,67 +0,0 @@
package commands.dew;
import java.util.UUID;
import commands.dew.core.data.*;
import commands.dew.core.impl.DewLuaCore;
import core.SubCommand;
import core.SubCommandFormattable;
import dataStructures.KittyChannel;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.UserInput;
public class CommandDewLuaTest extends SubCommand
{
public CommandDewLuaTest(KittyRole roleLevel, KittyRating contentRating)
{
super(roleLevel, contentRating);
}
private String asCodeBlock(String string)
{
return "```lua\n" + string + "```";
}
private String asCodeLine(String string)
{
return "`" + string + "`";
}
@Override
public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input)
{
String out = "";
try
{
out += "**Testing writing...\n**";
DewRealm m = new DewRealm();
m.id = UUID.randomUUID().toString();
String out1 = DewLuaCore.toLua(m);
out += asCodeBlock(out1);
String out2 = DewLuaCore.toLua(new DewMovementInfo());
out += asCodeBlock(out2);
out += "**Testing Reading...**\n";
DewRealm map = new DewRealm();
DewLuaCore.fromLua(map, out1);
out += "ID from 1st write: " + asCodeLine(map.id) + "\n";
DewMovementInfo move = new DewMovementInfo();
DewLuaCore.fromLua(move, out2);
out += "Qualified type test: " + asCodeLine(move.toString()) + "\n";
}
catch (Exception e)
{
e.printStackTrace(System.err);
}
return new SubCommandFormattable(out);
}
}
-31
View File
@@ -1,31 +0,0 @@
package commands.dew;
import commands.dew.adapter.KittyAdapterDewPlayer;
import commands.dew.core.impl.DewCore;
import core.SubCommand;
import core.SubCommandFormattable;
import dataStructures.KittyChannel;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.UserInput;
public class CommandDewRealm extends SubCommand
{
public CommandDewRealm(KittyRole roleLevel, KittyRating contentRating)
{
super(roleLevel, contentRating);
}
@Override
public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input)
{
KittyAdapterDewPlayer player = DewCore.getOrCreate(user);
String out = DewCore.drawWorld(player);
return new SubCommandFormattable(out);
}
}
@@ -1,71 +0,0 @@
package commands.dew.adapter;
import commands.dew.core.api.IDewPlayer;
import commands.dew.core.data.DewRealm;
import dataStructures.KittyUser;
public class KittyAdapterDewPlayer implements IDewPlayer
{
private KittyUser user;
private String realmID;
private int x;
private int y;
public KittyAdapterDewPlayer(DewRealm realm, KittyUser user, int x, int y)
{
this.user = user;
this.realmID = realm.id;
this.x = x;
this.y = y;
}
public String getVisual()
{
return user.name.length() >= 1 ? user.name.substring(0, 1) : "@";
}
public boolean isUser(KittyUser user)
{
return user.uniqueID == user.uniqueID;
}
public void setRealmPos(int x, int y)
{
this.x = x;
this.y = y;
}
////////////////////////////
// Interface requirements //
////////////////////////////
@Override
public String getName()
{
return user.name;
}
@Override
public String getUniqueID()
{
return user.uniqueID;
}
@Override
public String getCurrentRealmID()
{
return realmID;
}
@Override
public int getRealmX()
{
return x;
}
@Override
public int getRealmY()
{
return y;
}
}
-5
View File
@@ -1,5 +0,0 @@
package commands.dew.core.api;
public interface IDewCore {
}
@@ -1,6 +0,0 @@
package commands.dew.core.api;
public interface IDewEntity
{
public String getUniqueID();
}
@@ -1,6 +0,0 @@
package commands.dew.core.api;
public interface IDewLuaCore
{
}
@@ -1,6 +0,0 @@
package commands.dew.core.api;
public interface IDewLuaSerializable<T>
{
// Type info for derived class encoded in T
}
@@ -1,19 +0,0 @@
package commands.dew.core.api;
// Commands are standalone pieces of data that contain only structures.
// Each command is simplistic and represents an action in the game world.
// Format:
/*
return
{
name="SomeCommand",
data={
-- some object here --
}
}
*/
public interface IDewMessage<T>
{
public String getMessageName();
public T getData();
}
@@ -1,9 +0,0 @@
package commands.dew.core.api;
public interface IDewPlayer extends IDewEntity
{
public String getName();
public String getCurrentRealmID();
public int getRealmX();
public int getRealmY();
}
@@ -1,18 +0,0 @@
package commands.dew.core.data;
public enum DewMapTile
{
// Assign multiples of 2 for flag purposes
Default(0), Grass(1), Tree(2);
private final int value;
private DewMapTile(int value)
{
this.value = value;
}
public int getValue()
{
return value;
}
}
@@ -1,11 +0,0 @@
package commands.dew.core.data;
import commands.dew.core.api.IDewLuaSerializable;
// Treat all data objects as structs for the purposes of this.
public class DewMovementInfo implements IDewLuaSerializable<DewMovementInfo>
{
public String entityID;
public int x;
public int y;
}
-9
View File
@@ -1,9 +0,0 @@
package commands.dew.core.data;
import commands.dew.core.api.IDewLuaSerializable;
public final class DewRealm implements IDewLuaSerializable<DewRealm>
{
public String id = "0";
public int[][] map = new int[12][24]; // [Rows][Columns]
}
-174
View File
@@ -1,174 +0,0 @@
package commands.dew.core.impl;
import java.util.ArrayList;
import java.util.List;
import commands.dew.adapter.KittyAdapterDewPlayer;
import commands.dew.core.data.DewMapTile;
import commands.dew.core.data.DewRealm;
import core.SubCommandFormattable;
import core.SubCommandFramework;
import dataStructures.KittyChannel;
import dataStructures.KittyGuild;
import dataStructures.KittyUser;
import dataStructures.Response;
import dataStructures.UserInput;
import utils.GlobalLog;
import utils.LogFilter;
public class DewCore
{
// TODO: Make realm and players both per-realm
public static String responseHeader = "[Dewdrop Forest]";
public static DewRealm realm;
public static List<KittyAdapterDewPlayer> players;
public static List<KittyAdapterDewPlayer> playersCaptured;
private static SubCommandFramework framework;
public DewCore(SubCommandFramework framework)
{
DewCore.framework = framework;
DewCore.realm = new DewRealm();
DewCore.players = new ArrayList<KittyAdapterDewPlayer>();
DewCore.playersCaptured = new ArrayList<KittyAdapterDewPlayer>();
for(int y = 0; y < realm.map.length; ++y)
{
for(int x = 0; x < realm.map[y].length; ++x)
{
realm.map[y][x] = DewMapTile.Grass.getValue();
}
}
}
// Returns false if not captured, true if captured.
public static boolean ProcessIfCaptured(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput baseInput, Response res)
{
// Search for a captured player.
KittyAdapterDewPlayer player = null;
for(KittyAdapterDewPlayer p : playersCaptured)
{
if(p.getUniqueID() == user.uniqueID)
{
player = p;
break;
}
}
// If we didn't find that the person is captured, return false since we don't need to do anything.
if(player == null)
return false;
// See if we run anything - also, check to see if we need to exit.
boolean didRun = false;
try
{
UserInput toEdit = new UserInput(baseInput);
String key = toEdit.message.toLowerCase().trim();
toEdit.key = key;
toEdit.args = key;
switch(key)
{
case "cap":
case "capture":
case "uncapture":
case "stop":
case "quit":
case "exit":
playersCaptured.remove(player);
return false;
}
SubCommandFormattable f = framework.run(guild, channel, user, toEdit);
if(f != null)
{
Response.GetLastMessage((String last) -> {
if(last.contains(responseHeader))
Response.EditLastMessage(f.resString);
});
didRun = true;
}
}
catch(Exception e)
{
GlobalLog.error(LogFilter.Command, e);
}
if(didRun)
{
baseInput.deleteOriginInput();
}
return didRun;
}
public static KittyAdapterDewPlayer getOrCreate(KittyUser user)
{
for(KittyAdapterDewPlayer player : players)
{
if(player.getUniqueID() == user.uniqueID)
{
return player;
}
}
KittyAdapterDewPlayer player = new KittyAdapterDewPlayer(realm, user, 10, 10);
players.add(player);
return player;
}
public static String drawWorld(KittyAdapterDewPlayer player)
{
// Build empty world buffer
String[][] worldBuffer = new String[realm.map.length][realm.map[0].length];
// Build world
for(int y = 0; y < realm.map.length; ++y)
{
for(int x = 0; x < realm.map[y].length; ++x)
{
switch(DewMapTile.values()[realm.map[y][x]])
{
case Grass:
worldBuffer[y][x] = ",";
break;
default:
worldBuffer[y][x] = " ";
break;
}
}
}
// Build players
for(KittyAdapterDewPlayer p : players)
{
worldBuffer[p.getRealmY()][p.getRealmX()] = p.getVisual();
}
// Draw world
String out = "";
out += responseHeader + "\n";
out += "**Realm ID - ** `" + realm.id + "`\n";
for(int y = 0; y < worldBuffer.length; ++y)
{
out += "`";
for(int x = 0; x < worldBuffer[y].length; ++x)
{
out += worldBuffer[y][x];
}
out += "`";
out += "\n";
}
out += "**Stats**\n";
out += "`Player Name` - `" + player.getName() + "`\n";
out += "`Player Icon` - `" + player.getVisual() + "`\n";
return out;
}
}
-153
View File
@@ -1,153 +0,0 @@
package commands.dew.core.impl;
import java.lang.reflect.Field;
import org.luaj.vm2.Globals;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.Varargs;
import org.luaj.vm2.lib.jse.JsePlatform;
import commands.dew.core.api.IDewLuaCore;
import commands.dew.core.api.IDewLuaSerializable;
public class DewLuaCore implements IDewLuaCore
{
private static Globals globalLuaCore = null;
public static String toLua(IDewLuaSerializable<?> item)
{
return toLua(item, 0);
}
private static String tab(int num)
{
String line = "";
for(int i = 0; i < num; ++i)
line += "\t";
return line;
}
public static String toLua(IDewLuaSerializable<?> item, int tabs)
{
String out = tab(tabs) + "return {\n";
// Set up type information
out += tab(tabs + 1) + "type=\"" + item.getClass().getTypeName() + "\",\n";
// Set up data information
out += tab(tabs + 1) + "data={\n";
// Write data
Field[] fields = item.getClass().getDeclaredFields();
for(int i = 0; i < fields.length; ++i)
{
Field current = fields[i];
try
{
String line = "";
String fieldType = current.getType().toString().toLowerCase();
line += tab(tabs + 2);
line += current.getName() + "=";
switch(fieldType)
{
case "int":
line += "" + current.get(item);
break;
case "class java.lang.string":
String content = (String)current.get(item);
if(content == null || content.length() == 0)
line += "\"\"";
else
line += "\"" + content + "\"";
break;
// wrong name
case "dewmaptile ":
line += "\"" + current.get(item).toString() + "\"";
break;
default:
line += "nil";
System.err.print("Type could not be foramtted as lua: " + fieldType + "\n");
break;
}
// If we're not the last line, add a comma.
if(i != fields.length - 1)
line += ",";
out += line + "\n";
}
catch (Exception e)
{
e.printStackTrace(System.err);
}
}
out += tab(tabs + 1) + "}\n";
out += tab(tabs)+ "}\n";
return out;
}
@SuppressWarnings({ "unchecked" })
public static <T> void fromLua(T obj, String lua)
{
if(globalLuaCore == null)
{
globalLuaCore = JsePlatform.standardGlobals();
}
LuaValue luaResult = globalLuaCore.load(lua).call();
String type = luaResult.get("type").toString();
try
{
LuaValue data = luaResult.get("data");
Class<T> concreteClass = (Class<T>) Class.forName(type);
for(Field field : concreteClass.getDeclaredFields())
{
String name = field.getName();
LuaValue value = data.get(name);
if(!value.isnil())
{
String fieldType = field.getType().toString().toLowerCase();
switch(fieldType)
{
case "int":
field.set(obj, value.toint());
break;
case "class java.lang.string":
field.set(obj, value.toString());
break;
// Not the right name
case "dewmaptile":
default:
System.err.print("Could not set field of type: " + fieldType + "\n");
break;
}
}
else
{
System.err.println("Field was not in lua: " + name);
}
}
}
catch (Exception e)
{
e.printStackTrace(System.err);
}
}
}
@@ -1,8 +0,0 @@
package commands.dew.core.messages;
import commands.dew.core.api.IDewLuaSerializable;
public class DewMessageMovement implements IDewLuaSerializable<DewMessageMovement>
{
}
+111 -2
View File
@@ -1,8 +1,25 @@
package commands.general; package commands.general;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import core.Command; import core.Command;
import core.Constants;
import core.LocStrings; import core.LocStrings;
import dataStructures.*; import dataStructures.KittyChannel;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.Response;
import dataStructures.UserInput;
public class CommandBeansShow extends Command public class CommandBeansShow extends Command
{ {
@@ -15,7 +32,15 @@ public class CommandBeansShow extends Command
public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res)
{ {
if(input.mentions == null) if(input.mentions == null)
res.send(String.format(LocStrings.stub("BeansShowDisplay"), user.getBeans())); {
//res.send("" + user.getBeans());
try {
res.sendFile(combineImages(user.getBeans()), "png");
} catch (IOException e) {
e.printStackTrace();
}
// res.send(String.format(LocStrings.stub("BeansShowDisplay"), user.getBeans()));
}
else else
{ {
String mentionedBeans = ""; String mentionedBeans = "";
@@ -26,4 +51,88 @@ public class CommandBeansShow extends Command
res.send(String.format(LocStrings.stub("BeansShowMentioned"), mentionedBeans)); res.send(String.format(LocStrings.stub("BeansShowMentioned"), mentionedBeans));
} }
} }
private File combineImages(long beans) throws IOException
{
// Acquire images
BufferedImage imageBase = ImageIO.read(new File(Constants.AssetDirectory + "beans/BeansBG.png"));
BufferedImage thouBean = ImageIO.read(new File(Constants.AssetDirectory + "beans/thouBean.png"));
BufferedImage hunBean = ImageIO.read(new File(Constants.AssetDirectory + "beans/hunBean.png"));
BufferedImage tenBean = ImageIO.read(new File(Constants.AssetDirectory + "beans/tenBean.png"));
BufferedImage oneBean = ImageIO.read(new File(Constants.AssetDirectory + "beans/oneBean.png"));
final int baseWidth = imageBase.getWidth();
final int baseHeight = imageBase.getHeight();
long calcBean = beans;
long thousands = beans / 1000;
calcBean = beans % 1000;
long hundreds = (calcBean / 100);
calcBean = calcBean % 100;
long tens = (calcBean / 10);
calcBean = calcBean % 10;
long ones = calcBean;
BufferedImage beanImage = new BufferedImage(baseWidth, baseHeight, BufferedImage.TYPE_INT_ARGB);
Graphics beanGraphics = beanImage.getGraphics();
Rectangle rect = new Rectangle(0, 0, baseWidth, baseHeight);
beanGraphics.drawImage(imageBase,0,0,null);
for(int i = 0; i < ones; i++)
{
int x = (int)(Math.random() * (baseWidth - oneBean.getWidth())) + 1;
int y = (int)(Math.random() * (baseHeight - oneBean.getHeight())) + 1;
beanGraphics.drawImage(oneBean, x, y, null);
}
for(int i = 0; i < tens; i++)
{
int x = (int)(Math.random() * (baseWidth - tenBean.getWidth())) + 1;
int y = (int)(Math.random() * (baseHeight - tenBean.getHeight())) + 1;
beanGraphics.drawImage(tenBean, x, y, null);
}
for(int i = 0; i < hundreds; i++)
{
int x = (int)(Math.random() * (baseWidth - hunBean.getWidth())) + 1;
int y = (int)(Math.random() * (baseHeight - hunBean.getHeight())) + 1;
beanGraphics.drawImage(hunBean, x, y, null);
}
for(int i = 0; i < thousands; i++)
{
int x = (int)(Math.random() * (baseWidth - thouBean.getWidth())) + 1;
int y = (int)(Math.random() * (baseHeight - thouBean.getHeight())) + 1;
beanGraphics.drawImage(thouBean, x, y, null);
}
try {
@SuppressWarnings("unused")
Font font = null;
font = Font.createFont(Font.TRUETYPE_FONT, new File(Constants.AssetDirectory +"fonts/B612Mono-Regular.ttf"));
} catch (Exception e)
{
}
Font beanFont = new Font("font", Font.BOLD, 45);
beanGraphics.setFont(beanFont);
drawCenteredString(beanGraphics, "YOU HAVE", rect, beanFont, .25);
drawCenteredString(beanGraphics, "" + beans, rect, beanFont, .5);
drawCenteredString(beanGraphics, "BEANS!", rect, beanFont, .75);
ImageIO.write(beanImage, "PNG", new File("beanImage.png"));
return new File("beanImage.png");
}
private void drawCenteredString(Graphics beanGraphics, String text, Rectangle rect, Font font, double segment)
{
FontMetrics metrics = beanGraphics.getFontMetrics(font);
int x = rect.x + (rect.width - metrics.stringWidth(text)) / 2;
int y = (int)(rect.y + ((rect.height - metrics.getHeight()) * segment) + metrics.getAscent());
beanGraphics.drawString(text, x, y);
}
} }
@@ -1,9 +1,9 @@
package commands.benchmark; package commands.general;
import commands.benchmark.core.BenchmarkFormattable;
import commands.benchmark.core.BenchmarkFramework;
import core.Command; import core.Command;
import core.LocStrings; import core.LocStrings;
import core.benchmark.BenchmarkFormattable;
import core.benchmark.BenchmarkFramework;
import dataStructures.KittyChannel; import dataStructures.KittyChannel;
import dataStructures.KittyGuild; import dataStructures.KittyGuild;
import dataStructures.KittyRating; import dataStructures.KittyRating;
+3 -2
View File
@@ -20,7 +20,7 @@ public class CommandBetBeans extends Command
{ {
String call = ""; String call = "";
int min = 50; int min = 20;
int bet = 0; int bet = 0;
int win = 0; int win = 0;
@@ -36,7 +36,8 @@ public class CommandBetBeans extends Command
} }
catch (Exception e) catch (Exception e)
{ {
GlobalLog.log(LogFilter.Command, "Betting took place, but a value was not specified in the config file so 50 was used as the minimum bet threshold. Consider specifying BetBeansMinThreshold."); GlobalLog.log(LogFilter.Command, "Betting took place, but a value was not specified in the config file "
+ "so 50 was used as the minimum bet threshold. Consider specifying BetBeansMinThreshold.");
} }
try try
+3 -2
View File
@@ -68,22 +68,23 @@ public class CommandBoop extends Command
{ {
if(input.mentions == null) if(input.mentions == null)
{ {
// No one is booped, just the bot!
boopTracker.applyBoop(); boopTracker.applyBoop();
res.send(String.format(LocStrings.stub("BoopStandard"), user.name, boopTracker.howMany())); res.send(String.format(LocStrings.stub("BoopStandard"), user.name, boopTracker.howMany()));
} }
else else
{ {
// When someone boops one other person
if(input.mentions.length == 1) if(input.mentions.length == 1)
{ {
boopTracker.applyBoop();
res.send(String.format(LocStrings.stub("BoopPerson"), user.name, input.mentions[0].name)); res.send(String.format(LocStrings.stub("BoopPerson"), user.name, input.mentions[0].name));
return; return;
} }
// A number of people have been booped
String booped = ""; String booped = "";
for(int i = 0; i < input.mentions.length; i++) for(int i = 0; i < input.mentions.length; i++)
{ {
boopTracker.applyBoop();
if(i < input.mentions.length-1) if(i < input.mentions.length-1)
booped += input.mentions[i].name + ", "; booped += input.mentions[i].name + ", ";
else else
+9 -1
View File
@@ -27,12 +27,20 @@ public class CommandChoose extends Command
String [] choices = input.args.split(","); String [] choices = input.args.split(",");
if(choices.length == 1) if(choices.length <= 1)
{ {
res.send(LocStrings.stub("ChooseOne")); res.send(LocStrings.stub("ChooseOne"));
return; return;
} }
for(int i = 0; i < choices.length; i ++)
{
if (choices[i].equals(""))
{
choices[i] = "KittyBot is the best!";
}
}
res.send(String.format(LocStrings.stub("ChooseChoice"), (choices[(int) (Math.random()*choices.length)]).toString())); res.send(String.format(LocStrings.stub("ChooseChoice"), (choices[(int) (Math.random()*choices.length)]).toString()));
} }
} }
+1 -21
View File
@@ -31,28 +31,8 @@ public class CommandColor extends Command
@Override @Override
public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res)
{ {
if(input.args == null || input.args.length() == 0)
{
res.send(LocStrings.stub("ColorNotSearchable"));
return;
}
String toFind = null;
String[] split = input.args.split(" ");
if(split.length >= 1)
toFind = split[0];
// First, try and parse out the color to make sure we can even get it. // First, try and parse out the color to make sure we can even get it.
ColorData colorData = null; ColorData colorData = theColorAPI.lookupHex(input.args);
if(toFind == null)
{
colorData = theColorAPI.lookupHex(input.args.trim());
}
else
{
colorData = theColorAPI.lookupHex(toFind.trim());
}
// Verify the color was even found // Verify the color was even found
if(colorData == null) if(colorData == null)
+72
View File
@@ -0,0 +1,72 @@
package commands.general;
import core.Command;
import core.LocStrings;
import dataStructures.KittyChannel;
import dataStructures.KittyEmbed;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.Response;
import dataStructures.UserInput;
import network.NetworkDerpi;
public class CommandDerpi extends Command
{
NetworkDerpi searcher = new NetworkDerpi();
KittyEmbed response;
// Required constructor
public CommandDerpi(KittyRole level, KittyRating rating) { super(level, rating); }
@Override
public String getHelpText() { return "Will search derpibooru for the tags entered, if KittyBot's content filter allows it"; }
@Override
public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res)
{
if(guild.contentRating == KittyRating.Filtered)
{
try
{
response = searcher.getDerpi(input.args.replace(',', ' ') + " safe").output();
res.send(response);
}
catch(Exception e)
{
res.send(LocStrings.stub("DerpiError"));
}
}
else
{
if(input.args == null || input.args.length() == 0)
res.send("DerpiNoSearchError");
else
{
response = searcher.getDerpi(input.args).output();
try
{
res.send(response);
}
catch(Exception e)
{
res.send(LocStrings.stub("DerpiError"));
}
}
}
if(input.args.startsWith("ID:"))
{
response = searcher.getDerpiByID(input.args.substring(input.args.indexOf(':'))).output();
try
{
res.send(response);
}
catch(Exception e)
{
res.send(LocStrings.stub("DerpiError"));
}
}
}
}
+71
View File
@@ -0,0 +1,71 @@
package commands.general;
import core.Command;
import core.LocStrings;
import dataStructures.*;
import network.NetworkE6;
public class CommandE6 extends Command
{
NetworkE6 searcher = new NetworkE6();
KittyEmbed response;
GenericImage image;
public CommandE6(KittyRole level, KittyRating rating) { super(level, rating); }
@Override
public String getHelpText()
{
String toRet = "Will search e6";
toRet += "21 for the tags entered, if KittyBot's content filter allows it";
return toRet;
}
@Override
public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res)
{
if(guild.contentRating == KittyRating.Filtered)
{
image = searcher.getE6(input.args + " rating:safe", "");
try
{
response = image.output();
}
catch(Exception e)
{
res.send(LocStrings.stub("E6Blacklisted"));
return;
}
try
{
if(response.bodyImageURL == null)
{
Exception e = new Exception();
throw e;
}
res.send(response);
}
catch(Exception e)
{
res.send(LocStrings.stub("E6Blacklisted"));
}
}
else
{
if(input.args == null || input.args.length() == 0)
res.send("E6NoSearchError");
else
{
try
{
response = searcher.getE6(input.args, "").output();
res.send(response);
}
catch(Exception e)
{
res.send(LocStrings.stub("E6Blacklisted"));
}
}
}
}
}
+35
View File
@@ -0,0 +1,35 @@
package commands.general;
import core.Command;
import core.LocStrings;
import dataStructures.KittyChannel;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.Response;
import dataStructures.UserInput;
import network.NetworkSauceNAO;
public class CommandGetSauce extends Command
{
NetworkSauceNAO sauce = new NetworkSauceNAO();
public CommandGetSauce(KittyRole level, KittyRating rating) { super(level, rating); }
@Override
public String getHelpText() { return LocStrings.stub("GetSauceInfo"); };
@Override
public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res)
{
try
{
res.send(sauce.getSauce(input.args).output());
}
catch(Exception e)
{
res.send("Image not found");
}
}
}
+18 -15
View File
@@ -7,8 +7,6 @@ import java.util.Stack;
import core.Command; import core.Command;
import core.LocStrings; import core.LocStrings;
import dataStructures.*; import dataStructures.*;
import utils.GlobalLog;
import utils.LogFilter;
public class CommandRoll extends Command public class CommandRoll extends Command
{ {
@@ -24,7 +22,9 @@ public class CommandRoll extends Command
{ {
KittyEmbed embed = new KittyEmbed(); KittyEmbed embed = new KittyEmbed();
embed.title = user.name +"'s roll!"; embed.title = user.name +"'s roll!";
System.out.println("HERE");
embed.descriptionText = rollDice(input.args); embed.descriptionText = rollDice(input.args);
System.out.println("THERE");
Random numGen = new Random(user.name.hashCode()); Random numGen = new Random(user.name.hashCode());
float hue = numGen.nextFloat(); float hue = numGen.nextFloat();
float sat = .7f; float sat = .7f;
@@ -34,7 +34,6 @@ public class CommandRoll extends Command
} }
catch(Exception e) catch(Exception e)
{ {
GlobalLog.error(LogFilter.Command, e);
res.send(LocStrings.stub("RollError")); res.send(LocStrings.stub("RollError"));
} }
} }
@@ -44,10 +43,11 @@ public class CommandRoll extends Command
Stack<Integer> values = new Stack<Integer>(); Stack<Integer> values = new Stack<Integer>();
Stack<Character> operators = new Stack<Character>(); Stack<Character> operators = new Stack<Character>();
String steps = ""; String steps = "";
for(int i = 0; i < thing.length(); i ++) for(int i = 0; i < thing.length(); i ++)
{ {
char current = thing.charAt(i); char current = thing.charAt(i);
System.out.println("ROLLING");
switch(current) switch(current)
{ {
case '+': case '+':
@@ -125,9 +125,12 @@ public class CommandRoll extends Command
{ {
steps += "\n" + calculate(values, operators); steps += "\n" + calculate(values, operators);
} }
if(steps != "")
{
return "Roll```" + thing + "```" + "Steps```" + steps + "```" + "Final value ```" + values.pop() +"```"; return "Roll```" + thing + "```" + "Steps```" + steps + "```" + "Final value ```" + values.pop() +"```";
} }
return "That's not a roll that's just " + values.pop() +"!";
}
private String calculate(Stack<Integer> nums, Stack<Character> operators) private String calculate(Stack<Integer> nums, Stack<Character> operators)
@@ -173,18 +176,18 @@ public class CommandRoll extends Command
private int[] roll(int first, int second) private int[] roll(int first, int second)
{ {
int numberOfDice = first; int roll = 0;
int diceSideCount = second; int dice = first;
int [] rolls = new int[numberOfDice]; int sides = second;
int [] rolls = new int [dice];
GlobalLog.log("number: " + numberOfDice + " diceSides: " + diceSideCount); if(dice < 1)
if(numberOfDice < 1)
return new int[0]; return new int[0];
for(int i = 0; dice > i; i ++)
for(int i = 0; i < numberOfDice; i++) {
rolls[i] = (int)(Math.random() * diceSideCount + 1); roll = (int)(Math.random() * sides) + 1;
rolls[i] = roll;
}
return rolls; return rolls;
} }
+15 -1
View File
@@ -25,16 +25,30 @@ public class CommandTradeBeans extends Command
res.send(LocStrings.stub("TradeBeansNoTargetError")); res.send(LocStrings.stub("TradeBeansNoTargetError"));
return; return;
} }
if(input.mentions.length > 1)
{
res.send(LocStrings.stub("TradeBeansMultipleUsersTagged"));
return;
}
int beans = 0; int beans = 0;
try {
try
{
beans = Integer.parseInt(input.args.split(" ")[0]); beans = Integer.parseInt(input.args.split(" ")[0]);
} }
catch (NumberFormatException e) catch (NumberFormatException e)
{
try
{
beans = Integer.parseInt(input.args.split(" ")[1]);
}
catch(Exception eInner)
{ {
res.send(LocStrings.stub("TradeBeansIntParseError")); res.send(LocStrings.stub("TradeBeansIntParseError"));
return; return;
} }
}
if(user.getBeans() < beans) if(user.getBeans() < beans)
{ {
-29
View File
@@ -1,29 +0,0 @@
package commands.general;
import core.Command;
import core.LocStrings;
import dataStructures.KittyChannel;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.Response;
import dataStructures.UserInput;
public class CommandWeh extends Command {
public String getHelpText() { return LocStrings.stub("WehInfo"); }
public CommandWeh(KittyRole roleLevel, KittyRating contentRating) {
super(roleLevel, contentRating);
// TODO Auto-generated constructor stub
}
@Override
// The format for reutrning an emoji is: <:name:ID#>
public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res)
{
res.send("<:weh:548301646929723393>");
}
}
+8 -1
View File
@@ -2,6 +2,7 @@ package commands.music;
import core.Command; import core.Command;
import core.LocStrings; import core.LocStrings;
import core.SubCommandFormattable;
import core.SubCommandFramework; import core.SubCommandFramework;
import dataStructures.*; import dataStructures.*;
@@ -13,6 +14,11 @@ public class CommandMusicMain extends Command
super(level, rating); super(level, rating);
framework.addCommand("join", new SubCommandJoin(KittyRole.General, KittyRating.Safe)); framework.addCommand("join", new SubCommandJoin(KittyRole.General, KittyRating.Safe));
framework.addCommand("leave", new SubCommandLeave(KittyRole.General, KittyRating.Safe)); framework.addCommand("leave", new SubCommandLeave(KittyRole.General, KittyRating.Safe));
framework.addCommand("add", new SubCommandAddTrack(KittyRole.General, KittyRating.Safe));
framework.addCommand("skip", new SubCommandSkip(KittyRole.General, KittyRating.Safe));
framework.addCommand("stop", new SubCommandStop(KittyRole.General, KittyRating.Safe));
framework.addCommand("playlist", new SubCommandPlaylist(KittyRole.General, KittyRating.Safe));
framework.addCommand("volume", new SubCommandVolume(KittyRole.General, KittyRating.Safe));
} }
@Override @Override
@@ -21,6 +27,7 @@ public class CommandMusicMain extends Command
@Override @Override
public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res) public void onRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input, Response res)
{ {
framework.run(guild, channel, user, input).Call(res); SubCommandFormattable scf = framework.run(guild, channel, user, input);
scf.Call(res);
} }
} }
+13 -1
View File
@@ -1,5 +1,6 @@
package commands.music; package commands.music;
import core.LocStrings;
import core.SubCommand; import core.SubCommand;
import core.SubCommandFormattable; import core.SubCommandFormattable;
import dataStructures.KittyChannel; import dataStructures.KittyChannel;
@@ -8,14 +9,25 @@ import dataStructures.KittyRating;
import dataStructures.KittyRole; import dataStructures.KittyRole;
import dataStructures.KittyUser; import dataStructures.KittyUser;
import dataStructures.UserInput; import dataStructures.UserInput;
import network.NetworkYoutube;
public class SubCommandAddTrack extends SubCommand public class SubCommandAddTrack extends SubCommand
{ {
public SubCommandAddTrack(KittyRole level, KittyRating rating) { super(level, rating); } public SubCommandAddTrack(KittyRole level, KittyRating rating) { super(level, rating); }
NetworkYoutube YT = new NetworkYoutube();
@Override @Override
public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input) public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input)
{ {
return null; //Get track from Youtube
String video = input.args;
if(!(video.startsWith("https://www.youtube") || video.startsWith("https://www.youtu.be")))
{
video = YT.getYT(video);
}
guild.audio.playVideo(video);
return new SubCommandFormattable(String.format(LocStrings.stub("MusicAddTrack"), video));
} }
} }
@@ -0,0 +1,38 @@
package commands.music;
import java.util.ArrayList;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import core.SubCommand;
import core.SubCommandFormattable;
import dataStructures.KittyChannel;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.UserInput;
public class SubCommandPlaylist extends SubCommand
{
public SubCommandPlaylist(KittyRole roleLevel, KittyRating contentRating) {super(roleLevel, contentRating); }
@Override
public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input)
{
ArrayList <AudioTrack> playlist = guild.audio.getPlaylist();
String stringPlaylist = "";
for(AudioTrack track : playlist)
{
stringPlaylist += (playlist.indexOf(track) + 1) + ": " + track.getInfo().title + "\n";
}
if(stringPlaylist.equals(""))
{
return new SubCommandFormattable("Nothing Queued!");
}
return new SubCommandFormattable(stringPlaylist);
}
}
+23
View File
@@ -0,0 +1,23 @@
package commands.music;
import core.SubCommand;
import core.SubCommandFormattable;
import dataStructures.KittyChannel;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.UserInput;
public class SubCommandSkip extends SubCommand
{
public SubCommandSkip(KittyRole level, KittyRating rating) { super(level, rating); }
{
}
@Override
public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input)
{
return new SubCommandFormattable(guild.audio.skipVideo(guild.audio.player));
}
}
+23
View File
@@ -0,0 +1,23 @@
package commands.music;
import core.SubCommand;
import core.SubCommandFormattable;
import dataStructures.KittyChannel;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.UserInput;
public class SubCommandStop extends SubCommand
{
public SubCommandStop(KittyRole roleLevel, KittyRating contentRating) {super(roleLevel, contentRating);}
@Override
public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input)
{
return new SubCommandFormattable(guild.audio.stopPlayer(guild.audio.player));
}
}
+42
View File
@@ -0,0 +1,42 @@
package commands.music;
import core.LocStrings;
import core.SubCommand;
import core.SubCommandFormattable;
import dataStructures.KittyChannel;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyUser;
import dataStructures.UserInput;
public class SubCommandVolume extends SubCommand
{
public SubCommandVolume(KittyRole level, KittyRating rating) { super(level, rating); }
{
}
@Override
public SubCommandFormattable OnRun(KittyGuild guild, KittyChannel channel, KittyUser user, UserInput input)
{
int newVol = guild.audio.getVolume(guild.audio.player);
if(input.args != null)
{
try
{
newVol = Integer.parseInt(input.args);
if(newVol > 100 || newVol <1)
{
return new SubCommandFormattable(String.format(LocStrings.stub("MusicVolOOB")));
}
guild.audio.changeVolume(guild.audio.player, newVol);
}
catch(Exception e)
{
return new SubCommandFormattable(String.format(LocStrings.stub("MusicVolCurrent"), newVol));
}
}
return new SubCommandFormattable(String.format(LocStrings.stub("MusicVolChanged"), newVol));
}
}
+5 -4
View File
@@ -4,9 +4,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map.Entry; import java.util.Map.Entry;
import commands.benchmark.CommandBenchmark;
import commands.characters.CommandCharacterMain; import commands.characters.CommandCharacterMain;
import commands.dew.CommandDew;
import commands.general.*; import commands.general.*;
import commands.guildrole.CommandGuildRoleMain; import commands.guildrole.CommandGuildRoleMain;
import commands.mod.CommandModMain; import commands.mod.CommandModMain;
@@ -64,7 +62,6 @@ public class CommandManager
this.register(LocCommands.stub("tweet"), new CommandTweet(KittyRole.Dev, KittyRating.Safe)); this.register(LocCommands.stub("tweet"), new CommandTweet(KittyRole.Dev, KittyRating.Safe));
this.register(LocCommands.stub("dbflush"), new CommandDBFlush(KittyRole.Dev, KittyRating.Safe)); this.register(LocCommands.stub("dbflush"), new CommandDBFlush(KittyRole.Dev, KittyRating.Safe));
this.register(LocCommands.stub("dbstats"), new CommandDBStats(KittyRole.Dev, KittyRating.Safe)); this.register(LocCommands.stub("dbstats"), new CommandDBStats(KittyRole.Dev, KittyRating.Safe));
this.register(LocCommands.stub("dew"), new CommandDew(KittyRole.Dev, KittyRating.Safe));
// Admin // Admin
this.register(LocCommands.stub("rating"), new CommandRating(KittyRole.Admin, KittyRating.Safe)); this.register(LocCommands.stub("rating"), new CommandRating(KittyRole.Admin, KittyRating.Safe));
@@ -110,7 +107,11 @@ public class CommandManager
this.register(LocCommands.stub("poll"), new CommandPollMain(KittyRole.General, KittyRating.Safe)); this.register(LocCommands.stub("poll"), new CommandPollMain(KittyRole.General, KittyRating.Safe));
this.register(LocCommands.stub("music"), new CommandMusicMain(KittyRole.General, KittyRating.Safe)); this.register(LocCommands.stub("music"), new CommandMusicMain(KittyRole.General, KittyRating.Safe));
this.register(LocCommands.stub("defaultdance"), new CommandDefaultDance(KittyRole.General, KittyRating.Safe)); this.register(LocCommands.stub("defaultdance"), new CommandDefaultDance(KittyRole.General, KittyRating.Safe));
this.register(LocCommands.stub("weh"), new CommandWeh(KittyRole.General, KittyRating.Safe)); this.register(LocCommands.stub("getsauce"), new CommandGetSauce(KittyRole.General, KittyRating.Safe));
this.register(LocCommands.stub("tradebeans, trade"), new CommandTradeBeans(KittyRole.General, KittyRating.Safe));
this.register(LocCommands.stub("e6"), new CommandE6(KittyRole.General, KittyRating.Filtered));
this.register(LocCommands.stub("derpi"), new CommandDerpi(KittyRole.General, KittyRating.Filtered));
} }
// Allows the command manager to keep track of a command. Takes a pair (the un-localized and localzied commands) // Allows the command manager to keep track of a command. Takes a pair (the un-localized and localzied commands)
+1
View File
@@ -28,6 +28,7 @@ public class Config
sections = new Vector<IConfigSection>(); sections = new Vector<IConfigSection>();
// Add all sections // Add all sections
sections.add(new ConfigGlobals());
sections.add(new LocCommands()); sections.add(new LocCommands());
sections.add(new LocStrings()); sections.add(new LocStrings());
sections.add(new CommandEnabler()); sections.add(new CommandEnabler());
+68
View File
@@ -0,0 +1,68 @@
package core;
import java.util.ArrayList;
import java.util.List;
import dataStructures.KittyStartupMode;
import utils.GlobalLog;
// Want to add a single item to the config file? This is where that lives.
public class ConfigGlobals implements IConfigSection
{
// Defined const variables
public static final String header = "Globals";
public static ConfigGlobals instance;
// A pile of variables being manually tracked/serialized to the config file
private static final String startupStyleKey = "mode (dev or release)";
private KittyStartupMode startupStyleValue = KittyStartupMode.Dev;
// Constructor
public ConfigGlobals()
{
if(instance == null)
instance = this;
else
GlobalLog.error("Attempted to initialize a second config globals! Probably don't do this!");
}
@Override
public String getSectionTitle()
{
return header;
}
public static KittyStartupMode getStartupMode()
{
return instance.startupStyleValue;
}
@Override
public void consume(List<ConfigItem> pairs)
{
for(int i = 0; i < pairs.size(); ++i)
{
String key = pairs.get(i).key;
String value = pairs.get(i).value;
// Parse startup style
if(key.equalsIgnoreCase(startupStyleKey))
{
startupStyleValue = KittyStartupMode.Dev;
if(value.equalsIgnoreCase(KittyStartupMode.Release.name()))
startupStyleValue = KittyStartupMode.Release;
}
}
}
@Override
public List<ConfigItem> produce()
{
List<ConfigItem> items = new ArrayList<ConfigItem>();
items.add(new ConfigItem(getSectionTitle(), startupStyleKey, startupStyleValue.name().toLowerCase()));
return items;
}
}
+3 -3
View File
@@ -6,9 +6,9 @@ import utils.StringUtils;
// perform any parsing past naming columns, and just holds the raw data. // perform any parsing past naming columns, and just holds the raw data.
public class ConfigItem public class ConfigItem
{ {
public String type; public String type; // The section this specific key/value pair belongs to. This almost certainly will appear in multiple places.
public String key; public String key; // A unique key for a given lookup value for the specified section. Keys, within sections, are unique.
public String value; public String value; // The value assocaited with the key.
public static final int items = 3; public static final int items = 3;
public static final String[] header = {"Type","Key","Value"}; public static final String[] header = {"Type","Key","Value"};
+2 -2
View File
@@ -11,7 +11,7 @@ import dataStructures.Pair;
public class LocCommands extends BaseLocFile implements IConfigSection public class LocCommands extends BaseLocFile implements IConfigSection
{ {
// Defined const variables // Defined const variables
public static final String HeaderName = "Localized Commands"; public static final String header = "Localized Commands";
public static final String function = "LocCommands.stub"; public static final String function = "LocCommands.stub";
// Instance // Instance
@@ -20,7 +20,7 @@ public class LocCommands extends BaseLocFile implements IConfigSection
// Constructor // Constructor
public LocCommands() public LocCommands()
{ {
super(HeaderName, function); super(header, function);
GlobalLog.log(LogFilter.Core, "Initializing " + this.getClass().getSimpleName()); GlobalLog.log(LogFilter.Core, "Initializing " + this.getClass().getSimpleName());
+42 -10
View File
@@ -7,22 +7,37 @@ import java.util.concurrent.Semaphore;
import javax.security.auth.login.LoginException; import javax.security.auth.login.LoginException;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
//import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; //import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
//import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager; //import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
import core.lua.PluginManager; import core.lua.PluginManager;
import dataStructures.*; import dataStructures.KittyChannel;
import dataStructures.KittyCore;
import dataStructures.KittyGuild;
import dataStructures.KittyRating;
import dataStructures.KittyRole;
import dataStructures.KittyStartupMode;
import dataStructures.KittyUser;
import main.Main; import main.Main;
import net.dv8tion.jda.core.AccountType; import net.dv8tion.jda.core.AccountType;
import net.dv8tion.jda.core.JDA; import net.dv8tion.jda.core.JDA;
import net.dv8tion.jda.core.JDABuilder; import net.dv8tion.jda.core.JDABuilder;
import net.dv8tion.jda.core.entities.*; import net.dv8tion.jda.core.entities.Emote;
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.User;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
import offline.Ref; import offline.Ref;
import utils.AdminControl; import utils.AdminControl;
//import utils.AudioUtils; //import utils.AudioUtils;
import utils.GlobalLog; import utils.GlobalLog;
import utils.LogFilter; import utils.LogFilter;
import utils.audio.AudioUtils;
// NOTE(wisp): Isolated factory to assist with storage and caching if needed. // NOTE(wisp): Isolated factory to assist with storage and caching if needed.
// This also minimizes the number of places JDA interacts with our codebase. // This also minimizes the number of places JDA interacts with our codebase.
@@ -55,7 +70,7 @@ public class ObjectBuilderFactory
private static CommandManager commandManager; private static CommandManager commandManager;
//Audio track manager //Audio track manager
// private static AudioPlayerManager audioPlayer = new DefaultAudioPlayerManager(); private static AudioPlayerManager playerManager = new DefaultAudioPlayerManager();
// Localization classes - these are singletons, but should be initialized before almost all other // Localization classes - these are singletons, but should be initialized before almost all other
// things so their inclusion in the factory is to ensure they're started at the correct time. // things so their inclusion in the factory is to ensure they're started at the correct time.
@@ -90,6 +105,9 @@ public class ObjectBuilderFactory
database = null; database = null;
stats = null; stats = null;
AudioSourceManagers.registerRemoteSources(playerManager);
AudioSourceManagers.registerLocalSource(playerManager);
// Start by reading from things that are external. Because // Start by reading from things that are external. Because
// we require these things to be resolved before the rest of the application, // we require these things to be resolved before the rest of the application,
// we place them here. // we place them here.
@@ -124,8 +142,10 @@ public class ObjectBuilderFactory
List<Emote> emotes = event.getGuild().getEmotes(); List<Emote> emotes = event.getGuild().getEmotes();
ArrayList<String> emotesString = new ArrayList<String>(); ArrayList<String> emotesString = new ArrayList<String>();
HashMap<Long, KittyChannel> channels = new HashMap<Long, KittyChannel>();
String emote; String emote;
String emoteFix; String emoteFix;
channels.put(Long.getLong(uid), extractChannel(event));
for(int i = 0; i < emotes.size(); i++) for(int i = 0; i < emotes.size(); i++)
{ {
emote = emotes.get(i).toString(); emote = emotes.get(i).toString();
@@ -147,7 +167,8 @@ public class ObjectBuilderFactory
else else
{ {
// Construct a new guild with defaults // Construct a new guild with defaults
guild = new KittyGuild(uid, new AdminControl(event.getGuild()), emotesString); guild = new KittyGuild(uid, new AdminControl(event.getGuild()), emotesString,
new AudioUtils(event.getGuild(), playerManager), channels);
DatabaseManager.instance.globalRegister(guild); DatabaseManager.instance.globalRegister(guild);
guildCache.put(uid, guild); guildCache.put(uid, guild);
} }
@@ -156,6 +177,8 @@ public class ObjectBuilderFactory
return guild; return guild;
} }
// Explicitly locks: guildCache // Explicitly locks: guildCache
public static KittyRole extractRole(GuildMessageReceivedEvent event) public static KittyRole extractRole(GuildMessageReceivedEvent event)
{ {
@@ -205,14 +228,13 @@ public class ObjectBuilderFactory
public static KittyChannel extractChannel(GuildMessageReceivedEvent event) public static KittyChannel extractChannel(GuildMessageReceivedEvent event)
{ {
lazyInit(); lazyInit();
String channelID = event.getChannel().getId(); String channelID = event.getChannel().getId();
String guildID = event.getGuild().getId();
KittyChannel channel = null; KittyChannel channel = null;
synchronized(channelCache) synchronized(channelCache)
{ {
KittyChannel cachedChannel = channelCache.get(channelID); KittyChannel cachedChannel = channelCache.get(channelID);
boolean mature;
if(cachedChannel != null) if(cachedChannel != null)
{ {
@@ -220,8 +242,8 @@ public class ObjectBuilderFactory
} }
else else
{ {
KittyGuild cachedGuild = guildCache.get(guildID); mature = event.getChannel().isNSFW();
channel = new KittyChannel(channelID, cachedGuild); channel = new KittyChannel(channelID, mature);
channelCache.put(channelID, channel); channelCache.put(channelID, channel);
} }
} }
@@ -365,8 +387,18 @@ public class ObjectBuilderFactory
{ {
lazyInit(); lazyInit();
kitty = new JDABuilder(AccountType.BOT).setToken(Ref.TestToken).buildBlocking(); // Determine token based on config. Default to test token.
kitty.getPresence().setGame(Game.playing("with digital yarn")); String tokenToUse = Ref.TestToken;
if(ConfigGlobals.getStartupMode() == KittyStartupMode.Release)
tokenToUse = Ref.Token;
if(ConfigGlobals.getStartupMode() == KittyStartupMode.PoguRelease)
tokenToUse = Ref.PoguToken;
// Construct bot based on token
kitty = new JDABuilder(AccountType.BOT)
.setToken(tokenToUse).buildBlocking();
kitty.getPresence().setGame(Game.playing("with a laser pointer"));
kitty.addEventListener(new Main()); kitty.addEventListener(new Main());
return new KittyCore(kitty); return new KittyCore(kitty);
+1 -6
View File
@@ -7,7 +7,6 @@ import dataStructures.KittyGuild;
import dataStructures.KittyUser; import dataStructures.KittyUser;
import dataStructures.UserInput; import dataStructures.UserInput;
import utils.GlobalLog; import utils.GlobalLog;
import utils.LogFilter;
public class SubCommandFramework public class SubCommandFramework
{ {
@@ -42,14 +41,10 @@ public class SubCommandFramework
} }
catch(Exception e) catch(Exception e)
{ {
GlobalLog.error(LogFilter.Command, e);
String help = Stats.instance.getHelpText(input.key); String help = Stats.instance.getHelpText(input.key);
if(help != null) if(help != null)
return new SubCommandFormattable(help); return new SubCommandFormattable(help);
return new SubCommandFormattable("Something has gone very wrong.");
return new SubCommandFormattable("Whoops! Internal subcommand error!");
} }
} }
} }
@@ -1,4 +1,4 @@
package commands.benchmark.core; package core.benchmark;
public abstract class BenchmarkCommand public abstract class BenchmarkCommand
{ {
@@ -1,4 +1,4 @@
package commands.benchmark.core; package core.benchmark;
public class BenchmarkEntry public class BenchmarkEntry
{ {
@@ -1,4 +1,4 @@
package commands.benchmark.core; package core.benchmark;
import dataStructures.KittyEmbed; import dataStructures.KittyEmbed;
import dataStructures.Response; import dataStructures.Response;
@@ -1,4 +1,4 @@
package commands.benchmark.core; package core.benchmark;
import java.util.HashMap; import java.util.HashMap;
import commands.benchmark.*; import commands.benchmark.*;
@@ -1,4 +1,4 @@
package commands.benchmark.core; package core.benchmark;
import utils.StringUtils; import utils.StringUtils;
@@ -1,4 +1,4 @@
package commands.benchmark.core; package core.benchmark;
import utils.GlobalLog; import utils.GlobalLog;
@@ -1,4 +1,4 @@
package commands.benchmark.core; package core.benchmark;
import java.time.Instant; import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
@@ -1,4 +1,4 @@
package commands.benchmark.core; package core.benchmark;
public enum BenchmarkType public enum BenchmarkType
{ {
+31 -14
View File
@@ -1,40 +1,57 @@
package dataStructures; package dataStructures;
// This is a structure representing an image reponse for handing around. import java.awt.Color;
// This is a structure representing an image response for handing around.
public class GenericImage public class GenericImage
{ {
private String artist; private KittyEmbed response= new KittyEmbed();
private String postURL;
private String imageURL;
public GenericImage(String artist, String postURL, String imageURL) public GenericImage(String artist, String postURL, String imageURL)
{ {
this.artist = artist; response.authorText = null;
this.postURL = postURL; response.color = new Color(0,0,0);
this.imageURL = imageURL;
} }
public void editArtist(String artist) public void editArtist(String artist)
{ {
this.artist = artist; response.authorText = artist;
}
public void editAuthorImage(String URL)
{
response.authorImage = URL;
} }
public void editPostURL(String postURL) public void editPostURL(String postURL)
{ {
this.postURL = postURL; response.authorLink = postURL;
} }
public void editImageURL(String imageURL) public void editImageURL(String imageURL)
{ {
this.imageURL = imageURL; response.imageURL = imageURL;
} }
public String toString() public void editDescriptionText(String score)
{ {
if(imageURL.isEmpty()) response.descriptionText = score;
}
public void editFooterText(String tags)
{ {
return "I couldn't find anything! Please try again!"; response.footerText = tags;
} }
return "Artist: " + artist + "\n<" + postURL.trim() + ">\n" + imageURL;
public KittyEmbed output()
{
return response;
}
public boolean isValid()
{
if(response.title != null)
return true;
return false;
} }
} }
+4 -20
View File
@@ -1,31 +1,15 @@
package dataStructures; package dataStructures;
//import core.DatabaseTrackedObject;
public class KittyChannel //extends DatabaseTrackedObject public class KittyChannel
{ {
public String uniqueID; public String uniqueID;
public KittyGuild guild; public boolean mature;
//public KittyRating rating; public KittyChannel(String uniqueID, boolean mature)
//public bool isVoice;
public KittyChannel(String uniqueID, KittyGuild guild)
{ {
//super(uniqueID); //super(uniqueID);
this.uniqueID = uniqueID; this.uniqueID = uniqueID;
this.guild = guild; this.mature = false;
} }
// @Override
// public String serialize()
// {
// return "";
// }
//
// @Override
// public void deSerialzie(String string)
// {
//
// }
} }
+13 -4
View File
@@ -1,11 +1,12 @@
package dataStructures; package dataStructures;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import core.DatabaseManager; import core.DatabaseManager;
import core.DatabaseTrackedObject; import core.DatabaseTrackedObject;
import utils.AdminControl; import utils.AdminControl;
import utils.AudioUtils; import utils.audio.AudioUtils;
// Context for a given guild for kittybot. Primarily designed to hold guild-specific settings. // Context for a given guild for kittybot. Primarily designed to hold guild-specific settings.
public class KittyGuild extends DatabaseTrackedObject public class KittyGuild extends DatabaseTrackedObject
@@ -21,6 +22,7 @@ public class KittyGuild extends DatabaseTrackedObject
public ArrayList<String> hasVoted = new ArrayList<String>(); public ArrayList<String> hasVoted = new ArrayList<String>();
public ArrayList<String> emoji = new ArrayList<String>(); public ArrayList<String> emoji = new ArrayList<String>();
public ArrayList <KittyPoll> choices = new ArrayList<KittyPoll>(); public ArrayList <KittyPoll> choices = new ArrayList<KittyPoll>();
public HashMap <Long, KittyChannel> channels;
public AdminControl control; public AdminControl control;
public AudioUtils audio; public AudioUtils audio;
public ArrayList <KittyUser> raffleUsersUnchosen = new ArrayList<KittyUser>(); public ArrayList <KittyUser> raffleUsersUnchosen = new ArrayList<KittyUser>();
@@ -42,8 +44,10 @@ public class KittyGuild extends DatabaseTrackedObject
} }
// Default content for a guild // Default content for a guild
public KittyGuild(String uniqueID, AdminControl adminControl, ArrayList <String> emoji) public KittyGuild(String uniqueID, AdminControl adminControl, ArrayList <String> emoji,
AudioUtils audio, HashMap<Long, KittyChannel> channels)
{ {
super(uniqueID); super(uniqueID);
this.uniqueID = uniqueID; this.uniqueID = uniqueID;
roleList = new KittyTrackedVector(roleListName, uniqueID); roleList = new KittyTrackedVector(roleListName, uniqueID);
@@ -54,11 +58,14 @@ public class KittyGuild extends DatabaseTrackedObject
this.contentRating = KittyRating.Safe; this.contentRating = KittyRating.Safe;
this.polling = false; this.polling = false;
this.emoji = emoji; this.emoji = emoji;
this.audio = audio;
this.channels = channels;
setCommandIndicator("!"); setCommandIndicator("!");
} }
// Explicit constructor // Explicit constructor
public KittyGuild(String commandIndicator, KittyRating contentRating, KittyUser guildOwner, String uniqueID) public KittyGuild(String commandIndicator, KittyRating contentRating, KittyUser guildOwner,
String uniqueID, AudioUtils audio, HashMap<Long, KittyChannel> channels)
{ {
super(uniqueID); super(uniqueID);
this.uniqueID = uniqueID; this.uniqueID = uniqueID;
@@ -70,6 +77,8 @@ public class KittyGuild extends DatabaseTrackedObject
this.contentRating = contentRating; this.contentRating = contentRating;
this.polling = false; this.polling = false;
this.guildOwner = guildOwner; this.guildOwner = guildOwner;
this.audio = audio;
this.channels = channels;
} }
public String startPoll(String poll) public String startPoll(String poll)
@@ -123,7 +132,7 @@ public class KittyGuild extends DatabaseTrackedObject
{ {
if(!raffleUsersChosen.contains(user) && !raffleUsersUnchosen.contains(user) && user.getBeans() > raffleCost && raffling) if(!raffleUsersChosen.contains(user) && !raffleUsersUnchosen.contains(user) && user.getBeans() > raffleCost && raffling)
{ {
user.changeBeans(raffleCost); user.changeBeans(-raffleCost);
raffleUsersUnchosen.add(user); raffleUsersUnchosen.add(user);
return true; return true;
} }
+18
View File
@@ -0,0 +1,18 @@
package dataStructures;
public enum KittyStartupMode
{
Dev(1), Release(2), PoguRelease(3);
private final int value;
private KittyStartupMode(int value)
{
this.value = value;
}
public int getValue()
{
return value;
}
}
@@ -1,6 +0,0 @@
package dataStructures;
public class KittyTrackedResponse
{
// TODO: Fill this out!
}
+14 -75
View File
@@ -2,14 +2,11 @@ package dataStructures;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.util.function.Consumer;
import net.dv8tion.jda.core.JDA; import net.dv8tion.jda.core.JDA;
import net.dv8tion.jda.core.MessageBuilder; import net.dv8tion.jda.core.MessageBuilder;
import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.entities.TextChannel; import net.dv8tion.jda.core.entities.TextChannel;
import net.dv8tion.jda.core.events.message.guild.*; import net.dv8tion.jda.core.events.message.guild.*;
import net.dv8tion.jda.core.requests.restaction.MessageAction;
import net.dv8tion.jda.core.EmbedBuilder; import net.dv8tion.jda.core.EmbedBuilder;
import utils.GlobalLog; import utils.GlobalLog;
import utils.LogFilter; import utils.LogFilter;
@@ -19,9 +16,6 @@ import utils.LogFilter;
// commands aren't exposed to the GuildMessageReceivedEvent then we should be fine. // commands aren't exposed to the GuildMessageReceivedEvent then we should be fine.
public class Response public class Response
{ {
// Last message
private static Message lastSentMessage = new MessageBuilder().append(" ").build();
// Variables // Variables
private GuildMessageReceivedEvent event; private GuildMessageReceivedEvent event;
private final int discordMessageMax = 2000; private final int discordMessageMax = 2000;
@@ -81,7 +75,7 @@ public class Response
File thumbImage = new File(thumbName); File thumbImage = new File(thumbName);
if(thumbImage.exists()) if(thumbImage.exists())
{ {
respond(event.getChannel().sendFile(thumbImage, thumbName, message.build())); event.getChannel().sendFile(thumbImage, thumbName, message.build()).queue();
} }
} }
else else
@@ -89,7 +83,7 @@ public class Response
if(embedInfo.thumbnailURL != null) if(embedInfo.thumbnailURL != null)
embed.setThumbnail(embedInfo.thumbnailURL); embed.setThumbnail(embedInfo.thumbnailURL);
respond(event.getChannel().sendMessage(embed.build())); event.getChannel().sendMessage(embed.build()).queue();
} }
} }
@@ -99,11 +93,11 @@ public class Response
GlobalLog.log(LogFilter.Response, "Sending response: " + toRespondWith); GlobalLog.log(LogFilter.Response, "Sending response: " + toRespondWith);
if(toRespondWith.length() > discordMessageMax) if(toRespondWith.length() > discordMessageMax)
{ {
respond(event.getChannel().sendMessage(toRespondWith.substring(0, kittyMessageMax) + "\n\nI think that's enough!")); event.getChannel().sendMessage(toRespondWith.substring(0, kittyMessageMax) + "\n\nI think that's enough!").queue();
} }
else else
{ {
respond(event.getChannel().sendMessage(toRespondWith)); event.getChannel().sendMessage(toRespondWith).queue();
} }
} }
@@ -114,11 +108,11 @@ public class Response
channel = kitty.getTextChannelById(Long.parseLong(channelID)); channel = kitty.getTextChannelById(Long.parseLong(channelID));
if(toRespondWith.length() > discordMessageMax) if(toRespondWith.length() > discordMessageMax)
{ {
respond(channel.sendMessage(toRespondWith.substring(0, kittyMessageMax) + "\n\nI think that's enough!")); channel.sendMessage(toRespondWith.substring(0, kittyMessageMax) + "\n\nI think that's enough!").queue();
} }
else else
{ {
respond(channel.sendMessage(toRespondWith)); channel.sendMessage(toRespondWith).queue();
} }
} }
@@ -128,11 +122,11 @@ public class Response
GlobalLog.log(LogFilter.Response, "Sending immediate response: " + toRespondWith); GlobalLog.log(LogFilter.Response, "Sending immediate response: " + toRespondWith);
if(toRespondWith.length() > discordMessageMax) if(toRespondWith.length() > discordMessageMax)
{ {
respondImmediate(event.getChannel().sendMessage(toRespondWith.substring(0, kittyMessageMax) + "\n\nI think that's enough!")); event.getChannel().sendMessage(toRespondWith.substring(0, kittyMessageMax) + "\n\nI think that's enough!");
} }
else else
{ {
respondImmediate(event.getChannel().sendMessage(toRespondWith)); event.getChannel().sendMessage(toRespondWith).complete();
} }
} }
@@ -140,75 +134,20 @@ public class Response
public void sendFile(File toRespondWith, String extension) public void sendFile(File toRespondWith, String extension)
{ {
GlobalLog.log(LogFilter.Response, "Sending file response"); GlobalLog.log(LogFilter.Response, "Sending file response");
respond(event.getChannel().sendFile(toRespondWith, "return." + extension)); event.getChannel().sendFile(toRespondWith, "return." + extension).queue();
} }
// Queues an input stream response to the channel that issued the command. // Queues an input stream response to the channel that issued the command.
public void sendFile(InputStream in, String extension) public void sendFile(InputStream in, String extension)
{ {
GlobalLog.log(LogFilter.Response, "Sending input stream response"); GlobalLog.log(LogFilter.Response, "Sending input stream response");
respond(event.getChannel().sendFile(in, "return." + extension)); event.getChannel().sendFile(in, "return." + extension).queue();
} }
//////////////////////// //Sends Kittybot as an object
// Message Management // //WARNING: THIS WILL EDIT THE ENTIRE BOT, DO NOT USE LIGHTLY
//////////////////////// public JDA getKitty()
// Blast that message out and don't do anything else on this thread until sent.
// BLOCKING
protected void respondImmediate(MessageAction toSend)
{ {
synchronized(lastSentMessage) return kitty;
{
lastSentMessage = toSend.complete();
}
}
// thread-safe assignment. Assignment may technically be out of order, so keep that in mind.
// ASYNC
protected void respond(MessageAction toSend)
{
toSend.submit().whenComplete((msg, err) -> {
synchronized(lastSentMessage)
{
lastSentMessage = msg;
}
});
}
// BLOCKING
public static String GetLastMessage()
{
synchronized(lastSentMessage)
{
if(lastSentMessage == null)
return null;
return lastSentMessage.getContentRaw();
}
}
// ASYNC
public static void GetLastMessage(Consumer<String> consumer)
{
synchronized(lastSentMessage)
{
if(lastSentMessage == null)
return;
consumer.accept(lastSentMessage.getContentRaw());
}
}
// BLOCKING
public static void EditLastMessage(String newContent)
{
synchronized(lastSentMessage)
{
if(lastSentMessage != null)
{
lastSentMessage.editMessage(newContent).queue();
}
}
} }
} }
-21
View File
@@ -4,7 +4,6 @@ import java.util.List;
import core.ObjectBuilderFactory; import core.ObjectBuilderFactory;
import net.dv8tion.jda.core.entities.Member; import net.dv8tion.jda.core.entities.Member;
import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
public class UserInput public class UserInput
@@ -15,7 +14,6 @@ public class UserInput
public KittyUser [] mentions; public KittyUser [] mentions;
private boolean isValid; private boolean isValid;
public String message; public String message;
private Message internalJDAMessage;
// NOTE(wisp): Designed to parse a string as it's constructed. // NOTE(wisp): Designed to parse a string as it's constructed.
// If a user enters the command "!ping some stuff here :D" // If a user enters the command "!ping some stuff here :D"
@@ -27,7 +25,6 @@ public class UserInput
// The CommandIndicator and spaces between the key and args are dropped. // The CommandIndicator and spaces between the key and args are dropped.
public UserInput(GuildMessageReceivedEvent event, KittyGuild guildContext) public UserInput(GuildMessageReceivedEvent event, KittyGuild guildContext)
{ {
this.internalJDAMessage = event.getMessage();
String toParse = event.getMessage().getContentRaw(); String toParse = event.getMessage().getContentRaw();
message = toParse; message = toParse;
@@ -64,18 +61,6 @@ public class UserInput
} }
} }
// Copy Constructor
public UserInput(UserInput other)
{
this.key = other.key;
this.args = other.args;
this.mentions = other.mentions;
this.isValid = other.isValid;
this.message = other.message;
this.internalJDAMessage = other.internalJDAMessage;
}
// Used for injecting direct commands from plugins // Used for injecting direct commands from plugins
public UserInput(String input, KittyGuild contextGuild) public UserInput(String input, KittyGuild contextGuild)
{ {
@@ -90,12 +75,6 @@ public class UserInput
return isValid; return isValid;
} }
// This deletes the input that was originally sent
public void deleteOriginInput()
{
internalJDAMessage.delete().queue();
}
// Finds first whitespace in the string // Finds first whitespace in the string
private int findFirstWhitespace(String str) private int findFirstWhitespace(String str)
{ {
+20 -9
View File
@@ -1,10 +1,21 @@
package main; package main;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.security.auth.login.LoginException; import javax.security.auth.login.LoginException;
import commands.dew.core.impl.DewCore; import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame;
import core.CharacterManager; import core.CharacterManager;
import core.CommandEnabler; import core.CommandEnabler;
import core.CommandManager; import core.CommandManager;
@@ -22,9 +33,13 @@ import dataStructures.UserInput;
import net.dv8tion.jda.core.AccountType; import net.dv8tion.jda.core.AccountType;
import net.dv8tion.jda.core.JDA; import net.dv8tion.jda.core.JDA;
import net.dv8tion.jda.core.JDABuilder; import net.dv8tion.jda.core.JDABuilder;
import net.dv8tion.jda.core.entities.Game; import net.dv8tion.jda.core.audio.AudioSendHandler;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.TextChannel;
import net.dv8tion.jda.core.entities.VoiceChannel;
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.core.hooks.ListenerAdapter; import net.dv8tion.jda.core.hooks.ListenerAdapter;
import net.dv8tion.jda.core.managers.AudioManager;
import offline.Ref; import offline.Ref;
import utils.GlobalLog; import utils.GlobalLog;
@@ -43,6 +58,7 @@ public class Main extends ListenerAdapter
private static PluginManager pluginManager; private static PluginManager pluginManager;
private static CharacterManager charManager; private static CharacterManager charManager;
// Initialization and setup // Initialization and setup
public static void main(String[] args) throws InterruptedException, LoginException, Exception public static void main(String[] args) throws InterruptedException, LoginException, Exception
{ {
@@ -90,10 +106,6 @@ public class Main extends ListenerAdapter
if(!Superintendent.perCommandUpkeepPre(pluginManager)) if(!Superintendent.perCommandUpkeepPre(pluginManager))
return; return;
// TODO: Condense outer if somehow...
if(!DewCore.ProcessIfCaptured(guild, channel, user, input, response))
{
// Attempt to spin up a command. If the command doesn't exist. // Attempt to spin up a command. If the command doesn't exist.
// Run plugins right before invoking the commands but after all other setup. // Run plugins right before invoking the commands but after all other setup.
if(commandManager.invokeOnNewThread(guild, channel, user, input, response) == false) if(commandManager.invokeOnNewThread(guild, channel, user, input, response) == false)
@@ -106,7 +118,8 @@ public class Main extends ListenerAdapter
{ {
if(pluginOutput.get(i).startsWith("!")) if(pluginOutput.get(i).startsWith("!"))
{ {
commandManager.invokeOnNewThread(guild, channel, user, new UserInput(pluginOutput.get(i).substring(1), guild), response); commandManager.invokeOnNewThread(guild, channel, user,
new UserInput(pluginOutput.get(i).substring(1), guild), response);
} }
else else
{ {
@@ -116,8 +129,6 @@ public class Main extends ListenerAdapter
} }
} }
}
// Run any upkeep in post we need to // Run any upkeep in post we need to
if(!Superintendent.perCommandUpkeepPost(kittyCore, databaseManager)) if(!Superintendent.perCommandUpkeepPost(kittyCore, databaseManager))
return; return;
-1
View File
@@ -2,7 +2,6 @@ package main;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import commands.dew.core.impl.DewCore;
import core.Config; import core.Config;
import core.DatabaseManager; import core.DatabaseManager;
import core.RPManager; import core.RPManager;
+30 -3
View File
@@ -6,13 +6,40 @@ public class NetworkColiru
{ {
public String compileCPlusPlus(String query) public String compileCPlusPlus(String query)
{ {
// Escape characters that need escaping. // Escape characters that need escaping - mostly whitespace.
// Primarily types of whitespace.
query = query.replace("\\n", "\\\\n"); query = query.replace("\\n", "\\\\n");
query = query.replace("\\t", "\\\\t"); query = query.replace("\\t", "\\\\t");
query = query.replace("\n", "\\n"); query = query.replace("\n", "\\n");
query = query.replace("\"", "\\\""); query = query.replace("\"", "\\\"");
query = query.replace("\t", "\\t"); query = query.replace("\t", "\\t");
query = query.replace("`", "");
// // replace backticks on only the edges of the string.
// StringBuilder s = new StringBuilder(query);
//
// for(int i = 0; i < s.length(); ++i)
// {
// if(s.charAt(i) != '`')
// break;
//
// s.setCharAt(i, ' ');
// }
//
// for(int i = s.length() - 1; i >= 0; --i)
// {
// if(s.charAt(i) != '`')
// break;
//
// s.setCharAt(i, ' ');
// }
//
// query = s.toString().trim();
// Determine if the query is effectively empty or not. If it is, don't attempt to compile it.
if(query.trim().length() == 0)
{
return "I can't compile nothing!";
}
// Send the compilation request! // Send the compilation request!
String result = HTTPUtils.sendPOSTRequest("http://coliru.stacked-crooked.com/compile" String result = HTTPUtils.sendPOSTRequest("http://coliru.stacked-crooked.com/compile"
@@ -21,7 +48,7 @@ public class NetworkColiru
// If we got a valid response... // If we got a valid response...
if(!result.isEmpty()) if(!result.isEmpty())
{ {
result = "Here's what happened when I went to compiled that! \n```" + result + "```"; result = "Here's what happened when I went to compile that! \n```" + result + "```";
} }
return result; return result;
+80 -6
View File
@@ -7,13 +7,14 @@ import utils.*;
public class NetworkDerpi public class NetworkDerpi
{ {
private final String mainURL = "https://derpibooru.org/search.json?q="; private final String mainURL = "https://derpibooru.org/api/v1/json/search/images?q=";
private static final Gson jsonParser_ = new Gson(); private static final Gson jsonParser_ = new Gson();
private class DerpiResponseObject private class DerpiResponseObject
{ {
public String image; public String image;
public String tags; public String tags;
public String score;
} }
private class InitialRequest private class InitialRequest
@@ -23,22 +24,41 @@ public class NetworkDerpi
public GenericImage getDerpi(String query) public GenericImage getDerpi(String query)
{ {
String res;
GenericImage image = new GenericImage(" ", " ", " "); GenericImage image = new GenericImage(" ", " ", " ");
query = query.trim(); query = query.trim();
query = query.replace(" ", ","); query = query.replace(" ", ",");
String res = HTTPUtils.sendGETRequest(mainURL + query + "&random_image=1&key=" + Ref.derpiKey); System.out.println(mainURL + query + "&sf=random&key=" + Ref.derpiKey);
if(query.startsWith("ID:"))
{
res = HTTPUtils.sendGETRequest("https://derpibooru.org/api/v1/json/images/" + query.substring(3));
}
else
{
res = HTTPUtils.sendGETRequest(mainURL + query + "&sf=random&key=" + Ref.derpiKey);
}
System.out.println(res);
if(res != null) if(res != null)
{ {
InitialRequest obj;
// Use class evaluation on an array of the response object to be able to hold multiple. // Use class evaluation on an array of the response object to be able to hold multiple.
InitialRequest obj = jsonParser_.fromJson(res, InitialRequest.class); try
{
obj = jsonParser_.fromJson(res, InitialRequest.class);
}
catch(Exception e)
{
return null;
}
if(res != null) if(res != null)
{ {
String res2 = HTTPUtils.sendGETRequest("https://derpibooru.org/" + obj.id + ".json"); String res2 = HTTPUtils.sendGETRequest("https://derpibooru.org/" + obj.id + ".json");
image.editPostURL("<https://derpibooru.org/" + obj.id +">"); image.editPostURL("https://derpibooru.org/" + obj.id);
DerpiResponseObject imageObj = jsonParser_.fromJson(res2, DerpiResponseObject.class); DerpiResponseObject imageObj = jsonParser_.fromJson(res2, DerpiResponseObject.class);
image.editImageURL("https:" + imageObj.image.substring(0, imageObj.image.indexOf('_')) + imageObj.image.substring(imageObj.image.lastIndexOf('.'))); image.editImageURL("https:" + imageObj.image.substring(0, imageObj.image.indexOf('_')) +
imageObj.image.substring(imageObj.image.lastIndexOf('.')));
if(imageObj.tags.contains("artist:")) if(imageObj.tags.contains("artist:"))
{ {
String [] sepTags = imageObj.tags.split(","); String [] sepTags = imageObj.tags.split(",");
@@ -54,8 +74,20 @@ public class NetworkDerpi
artists += sepTags[i].substring(sepTags[i].indexOf(":")+1); artists += sepTags[i].substring(sepTags[i].indexOf(":")+1);
} }
} }
image.editAuthorImage("https://derpicdn.net/favicon.ico");
image.editArtist(artists); image.editArtist(artists);
String tags = "";
for(int i = 0; i < sepTags.length && i < 15; i++)
{
if(!sepTags[i].contains("artist:"))
{
tags += sepTags[i];
}
}
image.editFooterText("[Tags]" + tags);
image.editDescriptionText("Score: " + imageObj.score);
} }
else else
{ {
@@ -66,4 +98,46 @@ public class NetworkDerpi
return image; return image;
} }
public GenericImage getDerpiByID(String id)
{
GenericImage image = new GenericImage(" ", " ", " ");
String artists = "";
image.editAuthorImage("https://derpicdn.net/favicon.ico");
String res;
try
{
res = HTTPUtils.sendGETRequest("https://derpibooru.org/" + id + ".json");
}
catch(Exception e)
{
return null;
}
DerpiResponseObject imageObj = jsonParser_.fromJson(res, DerpiResponseObject.class);
if(imageObj.tags.contains("artist:"))
{
String [] sepTags = imageObj.tags.split(",");
for(int i = 0; i < sepTags.length; i++)
{
if(sepTags[i].contains("artist:"))
{
if(!artists.equals(""))
{
artists += " and ";
}
artists += sepTags[i].substring(sepTags[i].indexOf(":")+1);
}
}
}
if(artists != "")
image.editArtist(artists);
else
image.editArtist("Artist Unknown!");
image.editFooterText("[Tags]" + imageObj.tags);
image.editDescriptionText("Score: " + imageObj.score);
image.editImageURL("https:" + imageObj.image.substring(0, imageObj.image.indexOf('_')) +
imageObj.image.substring(imageObj.image.lastIndexOf('.')));
return image;
}
} }
+218
View File
@@ -0,0 +1,218 @@
package network;
import com.google.gson.Gson;
import dataStructures.GenericImage;
import offline.Ref;
import utils.HTTPUtils;
/**
* This is the e621 request class, designed for form and parse requests that
* use the e621 API, and is entirely static.
*
* If you ever find this class randomly not working,
* it may be a good idea to make sure the user agent string is set in
* HTTPUtils to something other than a browser emulating string, or the default
* java one.
*
* @author Wisp
* Edited by Rin
*/
public class NetworkE6
{
///////////////////////////////////////
// Internal JSON class and variables //
//////////////////////////////////.////
private static final Gson jsonParser_ = new Gson();
private static final String API_ROOT = "https://e621.net/posts.json?";
private static int maxSearchResults_ = 10;
private static String[] blacklist = Ref.e621Blacklist;
private class E6ResponseObject
{
// public variables matching the case and the type we want for JSON.
// There are many more fields, but if we don't provide some it just
// doesn't bother parsing them.
public E6ResponseObjectPost [] posts;
}
private class E6ResponseObjectPost
{
public String id;
public String [] sources;
public String[] pools;
public String rating;
public E6ResponseObjectFile file;
public E6ResponseObjectScore score;
public E6ResponseObjectTags tags;
public E6ResponseObjectRelationships relationships;
}
private class E6ResponseObjectFile
{
public String url;
}
private class E6ResponseObjectScore
{
public String total;
}
private class E6ResponseObjectTags
{
public String[] general;
public String[] artist;
}
private class E6ResponseObjectRelationships
{
public String has_children;
public String[] children;
}
////////////////////
// Static methods //
////////////////////
// Requests a specific image, then returns a few.
public GenericImage getE6(String input, String sauceNaoDependant)
{
GenericImage image = new GenericImage("","","");
boolean blacklisted;
// Clean up request and replace problematic characters for the query string.
input = input.trim();
input = input.replace("+", "%2B");
input = input.replace(" ", "%20");
// Configure and send request. Note: Random ordering added as first
// tag by default. User-provided tags, therefore, will override it.
// If order:score is provided, that will be honored over order:random.
String res = HTTPUtils.sendGETRequest(API_ROOT + "tags=order:random%20" + input + "&limit=" + maxSearchResults_);
if(res != null)
{
// Use class evaluation on an array of the response imageObject to be able to hold multiple.
E6ResponseObject imageObj = jsonParser_.fromJson(res, E6ResponseObject.class);
// For now, we really just wanna display images and their source.
// Append them all separately to a response string w/ some flavor text.
if(imageObj.posts.length < 1)
{
}
else
{
for(int i = 0; i < imageObj.posts.length; ++i)
{
String [] TagsList = imageObj.posts[i].tags.general;
blacklisted = false;
for(int j = 0; j < blacklist.length; j++)
{
for(int k = 0; k < TagsList.length; k ++)
{
if(TagsList[k].equals(blacklist[j]))
{
System.out.println("BLACKLISTED " + blacklist[j]);
blacklisted = true;
}
}
}
if(blacklisted)
{
return null;
}
// We will always have a file URL. That's a given.
image.editImageURL(imageObj.posts[i].file.url);
image.editPostURL("https://e621.net/posts/" + imageObj.posts[i].id);
if(imageObj.posts[i].tags.artist.length > 0)
{
String artists = imageObj.posts[i].tags.artist[0];
for(int j = 1; j < imageObj.posts[i].tags.artist.length; j++)
artists += ", " + imageObj.posts[i].tags.artist[j];
image.editArtist(artists);
}
else
image.editArtist("Artist Not Found!");
image.editAuthorImage("https://e621.net/favicon.ico");
String sources = "";
if(imageObj.posts[i].sources != null)
{
for(int k = 0; k < imageObj.posts[i].sources.length; k ++)
{
if(!imageObj.posts[i].sources[k].endsWith(imageObj.posts[i].file.url.substring(imageObj.posts[i].file.url.lastIndexOf('.'))))
{
String source = imageObj.posts[i].sources[k];
if(source.contains("//www."))
{
source = source.substring(source.indexOf(".") + 1);
source = source.substring(0, source.indexOf('.'));
}
else
{
source = source.substring(source.indexOf("/") + 2);
source = "[" + source.substring(0, source.indexOf('.')) + "]";
if(source.equals("[pbs]"))
{
source = "[twitter-cdn]";
}
}
sources += " [" + source + "](" + imageObj.posts[i].sources[k] + ") ";
}
}
if(sources.equals(""))
{
sources = " Source not listed";
}
if(sauceNaoDependant.equals(""))
{
image.editDescriptionText("Score: " + imageObj.posts[i].score.total + "\n**Source:**" + sources);
}
else
{
image.editDescriptionText(sauceNaoDependant + "\nScore: " + imageObj.posts[i].score.total + "\n**Source:**" + sources);
}
}
else
{
image.editDescriptionText("Score: " + imageObj.posts[i].score.total);
}
String descTags = "";
if(imageObj.posts[i].tags.general.length > 15)
{
for(int o = 0; o < 15; o++)
{
descTags += imageObj.posts[i].tags.general[o] + ", ";
}
image.editFooterText("[Tags] " + descTags + " etc.");
}
else
{
for(int o = 0; o < imageObj.posts[i].tags.general.length - 1; o++)
{
descTags += imageObj.posts[i].tags.general[o] + ", ";
}
descTags += imageObj.posts[i].tags.general[imageObj.posts[i].tags.general.length-1] + "";
image.editFooterText("[Tags] " + descTags);
}
if(image.output().authorText != null)
{
return image;
}
}
}
}
return image;
}
}
-104
View File
@@ -1,104 +0,0 @@
package network;
import com.google.gson.Gson;
import dataStructures.GenericImage;
import offline.Ref;
import utils.*;
/**
* This is the e621 request class, designed for form and parse requests that
* use the e621 API, and is entirely static.
*
* If you ever find this class randomly not working,
* it may be a good idea to make sure the user agent string is set in
* HTTPUtils to something other than a browser emulating string, or the default
* java one.
*
* @author Wisp
* Edited by Rin
*/
public class NetworkE621
{
///////////////////////////////////////
// Internal JSON class and variables //
//////////////////////////////////.////
private static final Gson jsonParser_ = new Gson();
private static final String API_ROOT = "https://e621.net/post/index.json?";
private static int maxSearchResults_ = 10;
private static String[] blacklist = Ref.e621Blacklist;
private class E621ResponseObject
{
// public varaibles matching the case and the type we want for JSON.
// There are many more fields, but if we don't provide some it just
// doesn't bother parsing them.
public String file_url;
public String id;
public String tags;
public String [] artist;
}
////////////////////
// Static methods //
////////////////////
// Requests a specific image, then returns a few.
public GenericImage getE621(String input)
{
GenericImage image = new GenericImage("","","");
boolean blacklisted;
// Clean up request and replace problematic characters for the query string.
input = input.trim();
input = input.replace("+", "%2B");
input = input.replace(" ", "%20");
// Configure and send request. Note: Random ordering added as first
// tag by default. User-provided tags, therefore, will override it.
// If order:score is provided, that will be honored over order:random.
String res = HTTPUtils.sendPOSTRequest(API_ROOT
, "tags=order:random%20" + input + "&limit=" + maxSearchResults_);
if(res != null)
{
// Use class evaluation on an array of the response imageObject to be able to hold multiple.
E621ResponseObject[] imageObj = jsonParser_.fromJson(res, E621ResponseObject[].class);
// For now, we really just wanna display images and their source.
// Append them all separately to a response string w/ some flavor text.
if(imageObj.length < 1)
{
}
else
{
for(int i = 0; i < imageObj.length; ++i)
{
blacklisted = false;
for(int j = 0; j < blacklist.length; j++)
{
if(imageObj[i].tags.contains(blacklist[j]))
{
blacklisted = true;
}
}
if(blacklisted)
{
continue;
}
// We will always have a file URL. That's a given.
image.editImageURL(imageObj[i].file_url);
image.editPostURL("https://e621.net/post/show/" + imageObj[i].id);
if(imageObj[i].artist.length > 0)
image.editArtist(imageObj[i].artist[0]);
else
image.editArtist("Artist Not Found!");
}
}
}
return image;
}
}
+56
View File
@@ -0,0 +1,56 @@
package network;
import java.util.List;
import com.google.gson.Gson;
import dataStructures.GenericImage;
import offline.Ref;
import utils.HTTPUtils;
public class NetworkSauceNAO
{
private static final Gson jsonParser_ = new Gson();
private static final String API_ROOT = "https://saucenao.com/search.php?dbmask=268435456&output_type=2&numres=10&api_key=" + Ref.SauceNAOKey +"&url=";
NetworkE6 e6Sauce = new NetworkE6();
private class SauceNAOResponseObject
{
List<SauceNAOResult> results;
}
private class SauceNAOResult
{
SauceNAOData data;
SauceNAOHeader header;
}
private class SauceNAOHeader
{
double similarity;
}
private class SauceNAOData
{
String [] ext_urls;
}
public GenericImage getSauce(String input)
{
double similarity;
input = input.trim();
input = input.replace("+", "%2B");
input = input.replace(" ", "%20");
String res = HTTPUtils.sendGETRequest(API_ROOT + input);
SauceNAOResponseObject sauce = jsonParser_.fromJson(res, SauceNAOResponseObject.class);
String sauceUrl = sauce.results.get(0).data.ext_urls[0];
similarity = sauce.results.get(0).header.similarity;
if(sauceUrl.startsWith("https://e621.net/post/show/"))
{
return e6Sauce.getE6("id:" + sauceUrl.substring(27), "Confidence: " + similarity + "%");
}
GenericImage unknown = new GenericImage("", "","");
return unknown;
}
}
+28 -1
View File
@@ -73,9 +73,36 @@ public class NetworkTheColorAPI
public ColorData lookupHex(String hex) public ColorData lookupHex(String hex)
{ {
if(hex == null)
return null;
hex = hex.replace("#", "").trim();
int len = hex.length();
if(len == 0)
return null;
// Verify we're either a full or half length color. Intermediate colors not supported.
// Alpha is also not supported.
if(len != 6 && len != 3)
return null;
try try
{ {
hex = hex.replace("#", ""); String hexUpper = hex.toUpperCase();
// Verify the number is hex.
for(int i = 0; i < hexUpper.length(); ++i)
{
char current = hexUpper.charAt(i);
Boolean isValidNum = current >= '0' && current <= '9';
Boolean isValidChar = current >= 'A' && current <= 'F';
// If it's not a valid character or a valid number, return null/
if(!isValidNum && !isValidChar)
return null;
}
String response = HTTPUtils.sendGETRequest("https://www.thecolorapi.com/id?hex=" + hex); String response = HTTPUtils.sendGETRequest("https://www.thecolorapi.com/id?hex=" + hex);
ColorData data = jsonParser.fromJson(response, ColorData.class); ColorData data = jsonParser.fromJson(response, ColorData.class);
+45 -3
View File
@@ -1,14 +1,56 @@
package network; package network;
import com.google.api.services.youtube.YouTube; import java.util.List;
import com.google.gson.Gson;
import offline.Ref; import offline.Ref;
import utils.HTTPUtils;
public class NetworkYoutube public class NetworkYoutube
{ {
private static YouTube youtube; ///////////////////////////////////////
// Internal JSON class and variables //
//////////////////////////////////.////
public NetworkYoutube() //https://www.youtube.com/watch?v=
private static final Gson jsonParser_ = new Gson();
private static final String API_ROOT = "https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=10&q=";
// Use this as the base
public class YTOuter
{ {
List<YTInner> items;
}
public class YTInner
{
YTID id;
YTSnippet snippet;
}
public class YTID
{
String videoId;
}
public class YTSnippet
{
String title;
String description;
}
public String getYT(String input)
{
input = input.trim();
input = input.replace("+", "%2B");
input = input.replace(" ", "%20");
String res = HTTPUtils.sendGETRequest(API_ROOT + input +
"&order=viewCount&type=video&topicId=%2Fm%2F04rlf&videoDefinition=high&key=" + Ref.youtube);
YTOuter videoObj = jsonParser_.fromJson(res, YTOuter.class);
return "https://www.youtube.com/watch?v=" + videoObj.items.get(0).id.videoId;
} }
} }
-48
View File
@@ -1,48 +0,0 @@
package utils;
/***
* https://developers.google.com/youtube/v3/code_samples/code_snippets?apix_params=%7B%22part%22%3A%22snippet%22%2C%22maxResults%22%3A25%2C%22q%22%3A%22surfing%22%7D
* https://github.com/sedmelluq/LavaPlayer#jda-integration
* https://ci.dv8tion.net/job/JDA/javadoc/net/dv8tion/jda/core/entities/VoiceChannel.html
* https://developers.google.com/youtube/registering_an_application#Create_API_Keys
*/
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.VoiceChannel;
import net.dv8tion.jda.core.managers.AudioManager;
public class AudioUtils
{
private Guild guild;
AudioManager audio;
AudioPlayer player;
public AudioUtils(Guild guild)
{
this.guild = guild;
audio = guild.getAudioManager();
}
public boolean joinChannel(String channelName)
{
VoiceChannel channel = null;
channel = guild.getVoiceChannelsByName(channelName, true).get(0);
if(channel != null)
{
audio.openAudioConnection(channel);
return true;
}
return false;
}
public boolean leaveChannel()
{
if(audio.isConnected())
{
audio.closeAudioConnection();
return true;
}
return false;
}
}
+6 -16
View File
@@ -1,7 +1,6 @@
package utils; package utils;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.text.DateFormat; import java.text.DateFormat;
@@ -29,27 +28,18 @@ public class GlobalLog
GlobalLog.log(LogFilter.Util, "Finished initializing logging system"); GlobalLog.log(LogFilter.Util, "Finished initializing logging system");
} }
private static void write(String status, LogFilter filter, String body, PrintStream stream) private static void write(String status, LogFilter filter, String body)
{ {
String logLine = "[" + status + "] " + "[" + filter.name() + "] " + body; String logLine = "[" + status + "] " + "[" + filter.name() + "] " + body;
outputLog.write(logLine + "\n"); outputLog.write(logLine + "\n");
outputLog.flush(); outputLog.flush();
stream.println(logLine); System.out.println(logLine);
} }
public static void log(LogFilter filter, String msg) { write(log, filter, msg, System.out); } public static void log(LogFilter filter, String msg) { write(log, filter, msg); }
public static void warn(LogFilter filter, String msg) { write(warn, filter, msg, System.out); } public static void warn(LogFilter filter, String msg) { write(warn, filter, msg); }
public static void error(LogFilter filter, String msg) { write(error, filter, msg, System.err); System.err.println(msg); System.err.flush(); } public static void error(LogFilter filter, String msg) { write(error, filter, msg); System.err.println(msg); System.err.flush(); }
public static void error(LogFilter filter, Exception e) public static void fatal(LogFilter filter, String msg) throws Exception { write(fatal, filter, msg); throw new Exception(msg); }
{
write(error, filter, e.toString(), System.err);
e.printStackTrace(outputLog);
e.printStackTrace(System.err);
outputLog.flush();
System.err.flush();
}
public static void fatal(LogFilter filter, String msg) throws Exception { write(fatal, filter, msg, System.out); throw new Exception(msg); }
public static void log(String msg) { log(LogFilter.Debug, msg); } public static void log(String msg) { log(LogFilter.Debug, msg); }
public static void warn(String msg) { warn(LogFilter.Debug, msg); } public static void warn(String msg) { warn(LogFilter.Debug, msg); }
+188
View File
@@ -0,0 +1,188 @@
package utils.audio;
import java.util.ArrayList;
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame;
import net.dv8tion.jda.core.audio.AudioSendHandler;
import net.dv8tion.jda.core.entities.Guild;
import net.dv8tion.jda.core.entities.VoiceChannel;
import net.dv8tion.jda.core.managers.AudioManager;
public class AudioUtils
{
private Guild guild;
public AudioManager am;
public final AudioPlayer player;
public final AudioPlayerManager playerManager;
private ArrayList <AudioTrack> playlist = new ArrayList<AudioTrack>();
public AudioUtils(Guild guild, AudioPlayerManager playerManager)
{
player = playerManager.createPlayer();
this.playerManager = playerManager;
this.guild = guild;
am = guild.getAudioManager();
}
public boolean joinChannel(String channelName)
{
VoiceChannel channel = null;
channel = guild.getVoiceChannelsByName(channelName, true).get(0);
if(channel != null)
{
am.openAudioConnection(channel);
return true;
}
return false;
}
public boolean leaveChannel()
{
if(am.isConnected())
{
am.closeAudioConnection();
return true;
}
return false;
}
public class AudioPlayerSendHandler implements AudioSendHandler
{
private final AudioPlayer audioPlayer;
private AudioFrame lastFrame;
public AudioPlayerSendHandler(AudioPlayer audioPlayer)
{
this.audioPlayer = audioPlayer;
}
@Override
public boolean canProvide()
{
lastFrame = audioPlayer.provide();
return lastFrame != null;
}
@Override public byte[] provide20MsAudio()
{
return lastFrame.getData();
}
@Override public boolean isOpus()
{
return true;
}
}
public class SmallAudio implements AudioLoadResultHandler
{
private SmallAudio(AudioPlayer player)
{
}
@Override public void loadFailed(FriendlyException arg0) { }
@Override public void noMatches() { }
@Override public void playlistLoaded(AudioPlaylist arg0) { }
@Override
public void trackLoaded(AudioTrack track)
{
synchronized(playlist)
{
playlist.add(track);
}
}
}
public String playVideo(String videoURL)
{
guild.getAudioManager().setSendingHandler(new AudioPlayerSendHandler(player));
playerManager.loadItemOrdered(player, videoURL, new SmallAudio(player));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
if(player.getPlayingTrack() == null)
{
MusicController control = new MusicController(player, playlist);
control.start();
}
return null;
}
public int getVolume(AudioPlayer player)
{
return player.getVolume();
}
public void changeVolume(AudioPlayer player, int newVol)
{
player.setVolume(newVol);
}
public String skipVideo(AudioPlayer player)
{
player.stopTrack();
return "Skipped";
}
public String stopPlayer(AudioPlayer player)
{
playlist.clear();
player.stopTrack();
return "Stopped";
}
public ArrayList<AudioTrack> getPlaylist()
{
return playlist;
}
}
class MusicController extends Thread
{
AudioPlayer player;
private ArrayList <AudioTrack> playlist;
public MusicController(AudioPlayer player, ArrayList <AudioTrack> playlist)
{
this.player = player;
this.playlist = playlist;
}
@Override
public void run()
{
try {
Thread.sleep(5000);
} catch (InterruptedException e) {}
AudioTrack nowPlaying = null;
do
{
if(!playlist.isEmpty() || nowPlaying != null)
{
if(player.getPlayingTrack() == null)
{
if(playlist.isEmpty())
nowPlaying = null;
else
{
nowPlaying = playlist.get(0);
playlist.remove(0);
}
player.startTrack(nowPlaying, false);
}
}
}
while(!playlist.isEmpty() || player.getPlayingTrack() != null);
}
}
+56
View File
@@ -0,0 +1,56 @@
package utils.audio;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
/**
* This class schedules tracks for the audio player. It contains the queue of tracks.
*/
public class TrackScheduler extends AudioEventAdapter {
private final AudioPlayer player;
private final BlockingQueue<AudioTrack> queue;
/**
* @param player The audio player this scheduler uses
*/
public TrackScheduler(AudioPlayer player) {
this.player = player;
this.queue = new LinkedBlockingQueue<>();
}
/**
* Add the next track to queue or play right away if nothing is in the queue.
*
* @param track The track to play or add to queue.
*/
public void queue(AudioTrack track)
{
// Calling startTrack with the noInterrupt set to true will start the track only if nothing is currently playing. If
// something is playing, it returns false and does nothing. In that case the player was already playing so this
// track goes to the queue instead.
if (!player.startTrack(track, true)) {
queue.offer(track);
}
}
/**
* Start the next track, stopping the current one if it is playing.
*/
public void nextTrack() {
// Start the next track, regardless of if something is already playing or not. In case queue was empty, we are
// giving null to startTrack, which is a valid argument and will simply stop the player.
player.startTrack(queue.poll(), false);
}
@Override
public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) {
// Only start the next track if the end reason is suitable for it (FINISHED or LOAD_FAILED)
if (endReason.mayStartNext) {
nextTrack();
}
}
}