Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Command request: /claimtop to display claimblock balances like /baltop #15

Closed
NullCase opened this issue May 27, 2020 · 63 comments
Closed

Comments

@NullCase
Copy link

The command /baltop or /balancetop (essentials) will display all $ balances for players. I want to build /claimtop (alternatives /claimblocktop, /claimlisttop, other suggestions welcome).

/claimtop will display player balances using the same format as essentials /baltop but instead of $ it shows claim block balances.

Questions:
Is there anything about this update which causes unexpected problems?
Do you already have plans to build this into GriefPrevention?
What does essentials do well/poorly when getting /baltop data? (because it takes a while when you run the command, even for just 1000 players).

Funding is available

@RoboMWM
Copy link
Collaborator

RoboMWM commented May 27, 2020

Since you need to access the data of every single player, yes, this will take a while, similar to how Essentials does (it is also loading data for every single player in its folder).

I am not building this in GP, there is no need for this statistic.

I don't expect any issues if I manually (i.e., open files not through GP) open the files. I don't plan to change the structure of the playerdata files anytime soon.

@NullCase
Copy link
Author

Following up from the above:

OK, similar to essentials. It seems like there will be ways to optimize here, especially if Essentials is calling data for every player each time the command is used.

For example, I don't know if Essentials updates a list once in a while, stores it for when it's requested.

No need for it, naturally :)

And it sounds like if the data files change that'd muck things up.

@NullCase
Copy link
Author

It sounds like there's three or four steps here.

  • Aggregate the data to a list once in a while so it can be called quickly. Include a Sum total to call later.
  • Command /claimtop calls that list.
  • Formating: Match to Essentials with sum total blocks at the top, break up the list into pages with 10 players per page.
  • Whatever I've forgotten/some optimizations? For example, if a player calls the command twice in succession, run a full aggregate once to provide the latest data, then force a cooldown period so commands aren't laggy.

@RoboMWM
Copy link
Collaborator

RoboMWM commented May 28, 2020

To be honest, I wouldn't worry about attempting to optimize it. EssentialsX performs the lookup asynchronously, so it's of no impact to the server thread (i.e., it shouldn't ever show up in timings). I also don't know how often players on your server would be interested in such stats, especially relative to other commands.

The other two look fine.

@NullCase
Copy link
Author

Two are fine. OK Great.

Is this week a bad time for Dev work?

@RoboMWM
Copy link
Collaborator

RoboMWM commented May 28, 2020

Should be fine to get it to it shortly.

@RoboMWM
Copy link
Collaborator

RoboMWM commented May 28, 2020

So, is this the request?

As a player
When I execute /claimtop
Then I receive a list of players sorted by total amount of claimblocks in descending order
And is paginated with 10 players per page

@NullCase
Copy link
Author

That's it, and one thing (italicized)

As a player
When I execute /claimtop
Display total claimblocks at the top and a list of players sorted by total amount of claimblocks in descending order.
And it's 10 players per page.

For reference:
2020-05-28_01 47 40

@NullCase
Copy link
Author

Regarding formats, match everything from 'Ordering balances' down to 'Type /claimtop 2 to read the next page'

did I forget anything here?

RoboMWM added a commit that referenced this issue May 29, 2020
@NullCase
Copy link
Author

NullCase commented May 29, 2020

How do I find the jar to test it out? I don't have a link.

edit: In case it's not ready yet, just ignore this :) Because i do have this link and despite the name change, perhaps it'll show up here.

@RoboMWM
Copy link
Collaborator

RoboMWM commented May 29, 2020

Yea it's not ready, just a very very basic implementation of the featurem but feel free to test it out. By default it's set to disabled because I'm using that new command/config registration thingy and I believe I have that default to false for new features. And it only prints out the UUIDs and claimblock balances with no pagination. It should be sorted though.

@RoboMWM
Copy link
Collaborator

RoboMWM commented May 29, 2020

as for the jar, looks like appveyor doesn't recognize it if I rename the repo. So I already went ahead and made a new one in appveyor. Looks like it can't build rn, will fix that shortly. https://ci.appveyor.com/project/RoboMWM39862/claimclassifier/build/artifacts

@NullCase
Copy link
Author

With ClaimTopCommand: true
With [ClaimslistClassifier] Enabled ClaimTopCommand
As server operator, typing /claimtop produces: Unknown command.

2020-05-30_02 52 19

@RoboMWM
Copy link
Collaborator

RoboMWM commented May 31, 2020

Hmm, forgot I need to add it to plugin.yml to register the command.

@NullCase
Copy link
Author

will test tmr

@NullCase
Copy link
Author

NullCase commented Jun 1, 2020

Generated exception when typing claimtop in console:

[05:25:29] [Craft Scheduler Thread - 6/INFO]: Claimblock totals
--
[05:25:29] [Craft Scheduler Thread - 6/WARN]: [ClaimslistClassifier] Plugin ClaimslistClassifier v1.7.0 generated an exception while executing task 42
java.util.NoSuchElementException: null
at java.util.ArrayList$Itr.next(Unknown Source) ~[?:1.8.0_251]
at com.robomwm.claimslistclassifier.command.ClaimTopCommand$1.run(ClaimTopCommand.java:65) ~[?:?]
at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftTask.run(CraftTask.java:84) ~[patched_1.15.2.jar:git-Paper-318]
at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:54) ~[patched_1.15.2.jar:git-Paper-318]
at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22) ~[patched_1.15.2.jar:git-Paper-318]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:1.8.0_251]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:1.8.0_251]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_251]

Generated exception when typing /claimtop in game.

[05:25:47] [Server thread/INFO]: NullCase issued server command: /claimtop
[05:25:47] [Craft Scheduler Thread - 6/WARN]: [ClaimslistClassifier] Plugin ClaimslistClassifier v1.7.0 generated an exception while executing task 47
java.util.NoSuchElementException: null
at java.util.ArrayList$Itr.next(Unknown Source) ~[?:1.8.0_251]
at com.robomwm.claimslistclassifier.command.ClaimTopCommand$1.run(ClaimTopCommand.java:65) ~[?:?]
at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftTask.run(CraftTask.java:84) ~[patched_1.15.2.jar:git-Paper-318]
at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:54) ~[patched_1.15.2.jar:git-Paper-318]
at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22) ~[patched_1.15.2.jar:git-Paper-318]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:1.8.0_251]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:1.8.0_251]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_251]

@NullCase
Copy link
Author

NullCase commented Jun 1, 2020

@RoboMWM thanks for all your hard work here so far. I'm a bit run down so I'll take a couple days to rest now.

I'll look here again by Thursday to continue.

@NullCase
Copy link
Author

NullCase commented Jun 4, 2020

Hi @RoboMWM I was able to test yesterdays' update. here's the latest error logs. It loosks like this is just displaying for player ignore files.

[08:50:31] [Server thread/INFO]: NullCase issued server command: /claimtop
--
[08:50:32] [Craft Scheduler Thread - 3/WARN]: [ClaimslistClassifier] Skipping file 08493b4a-b0e0-4801-974f-83b36cc1e4be.ignore due to this ''Java-termed reason:''
[08:50:32] [Craft Scheduler Thread - 3/WARN]: java.util.NoSuchElementException
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at java.util.ArrayList$Itr.next(Unknown Source)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at com.robomwm.claimslistclassifier.command.ClaimTopCommand$1.run(ClaimTopCommand.java:66)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftTask.run(CraftTask.java:84)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:54)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at java.lang.Thread.run(Unknown Source)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: [ClaimslistClassifier] Skipping file 4a391bc8-91f1-46eb-8c55-45b50030c870.ignore due to this ''Java-termed reason:''
[08:50:32] [Craft Scheduler Thread - 3/WARN]: java.util.NoSuchElementException
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at java.util.ArrayList$Itr.next(Unknown Source)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at com.robomwm.claimslistclassifier.command.ClaimTopCommand$1.run(ClaimTopCommand.java:65)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftTask.run(CraftTask.java:84)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:54)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at java.lang.Thread.run(Unknown Source)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: [ClaimslistClassifier] Skipping file 6ac4761f-f9fe-417f-b7d4-90bb95ede34c.ignore due to this ''Java-termed reason:''
[08:50:32] [Craft Scheduler Thread - 3/WARN]: java.lang.NumberFormatException: For input string: "4dfe4d44-4db1-4874-92ac-bd761f297b84"
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at java.lang.NumberFormatException.forInputString(Unknown Source)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at java.lang.Integer.parseInt(Unknown Source)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at java.lang.Integer.parseInt(Unknown Source)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at com.robomwm.claimslistclassifier.command.ClaimTopCommand$1.run(ClaimTopCommand.java:66)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftTask.run(CraftTask.java:84)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at org.bukkit.craftbukkit.v1_15_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:54)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
[08:50:32] [Craft Scheduler Thread - 3/WARN]: 	at java.lang.Thread.run(Unknown Source)
[08:50:32] [Server thread/WARN]: Can't keep up! Is the server overloaded? Running 5442ms or 108 ticks behind


@NullCase
Copy link
Author

NullCase commented Jun 4, 2020

After further testing:

  • Claim block balances print with UUID, sorted by # of blocks.
  • It appears that all players are counted.

And just to remind myself later, after that is formatting. Basically matching everything Essentials does. It seems like they have everything that I want.

@RoboMWM
Copy link
Collaborator

RoboMWM commented Jun 4, 2020

Interesting, idk why some of the playerdata files aren't formatted as expected, but if it appears everyone's there then I guess it's good. I'll remove the debug messages there next build

@NullCase
Copy link
Author

NullCase commented Jun 5, 2020

Hi @RoboMWM

I have to delay testing possibly for two weeks or more. My computer has died following a lightning storm here. It'll take a bit of time to replace. After that I'll be back in business, as usual.

Is this going to cause any problems on your end?

@NullCase
Copy link
Author

NullCase commented Jun 5, 2020

regarding formating, here's a screenshot i took at the time. just disregard the auctions :)

2020-06-04_09 05 23

@RoboMWM
Copy link
Collaborator

RoboMWM commented Jun 6, 2020

ya that's how I expected it to look thanks. Will be a little while to work on pagination and I gotta find a good way to convert UUIDs to names, cuz I think if I use the Bukkit way, it's likely gonna do a web request to lookup the name if it isn't cached

@RoboMWM
Copy link
Collaborator

RoboMWM commented Jun 6, 2020

I guess if it matters, which would you like to see first, pagination or names first?

@NullCase
Copy link
Author

NullCase commented Jun 6, 2020

What one first... i don't know, whatever order makes sense on your end is great.

Also, in case you missed that note I'll be unavailable due to computer issues. could be a bit.

@NullCase
Copy link
Author

If you haven't already, pagination then names. So I can see in one glance what the formatting up top looks like.

I still can't load up MC to test anything yet. New PC is ordered.

@RoboMWM
Copy link
Collaborator

RoboMWM commented Jun 11, 2020

Yea, both are separate tasks with about equal estimated complexity. Will work on that first, thanks.

RoboMWM added a commit that referenced this issue Jun 20, 2020
@RoboMWM
Copy link
Collaborator

RoboMWM commented Jun 20, 2020

I switched the algorithm to use taskchain (a library for chaining asynchronous/synchronous tasks) so I can safely save the result for pagination. I haven't worked on the pagination command yet, but I have implemented the "first page" so idk if you're setup to test yet or not.

RoboMWM added a commit that referenced this issue Jul 12, 2020
@RoboMWM
Copy link
Collaborator

RoboMWM commented Jul 12, 2020

Mk, added colors and moved the sorting method to the async portion of the code. Please check to see if everything is as you like it to look. Also - what happens when you set the page number as 0 (and what behavior do you expect)?

What kind of risks do you expect by calling Server#getOfflinePlayer asynchronously?

Calling API methods asynchronously, if not supported or documented, is undefined - as in, who knows what may happen. Most of the Bukkit API is not safe to call asynchronously. There are some safe cases, though idk if this is one of them.

@NullCase
Copy link
Author

NullCase commented Jul 12, 2020

Everything looks good. It's fast. UUIDs still show (but it seems like you expect that).

2020-07-12_13 51 29

what happens when you set the page number as 0 (and what behavior do you expect)?

It seems like showing page 1 when 0 is requested will be fine. Here's what happens rn.

[13:53:04 WARN]: Unexpected exception while parsing console command "claimtop 0"
org.bukkit.command.CommandException: Unhandled exception executing command 'claimtop' in plugin ClaimslistClassifier v1.7.0-2dc990e
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[patched_1.16.1.jar:git-Paper-75]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:159) ~[patched_1.16.1.jar:git-Paper-75]
        at org.bukkit.craftbukkit.v1_16_R1.CraftServer.dispatchCommand(CraftServer.java:794) ~[patched_1.16.1.jar:git-Paper-75]
        at org.bukkit.craftbukkit.v1_16_R1.CraftServer.dispatchServerCommand(CraftServer.java:756) ~[patched_1.16.1.jar:git-Paper-75]
        at net.minecraft.server.v1_16_R1.DedicatedServer.handleCommandQueue(DedicatedServer.java:411) ~[patched_1.16.1.jar:git-Paper-75]
        at net.minecraft.server.v1_16_R1.DedicatedServer.b(DedicatedServer.java:378) ~[patched_1.16.1.jar:git-Paper-75]
        at net.minecraft.server.v1_16_R1.MinecraftServer.a(MinecraftServer.java:1212) ~[patched_1.16.1.jar:git-Paper-75]
        at net.minecraft.server.v1_16_R1.MinecraftServer.v(MinecraftServer.java:1000) ~[patched_1.16.1.jar:git-Paper-75]
        at net.minecraft.server.v1_16_R1.MinecraftServer.lambda$a$0(MinecraftServer.java:177) ~[patched_1.16.1.jar:git-Paper-75]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_251]
Caused by: java.lang.ArrayIndexOutOfBoundsException: -10
        at java.util.ArrayList.elementData(Unknown Source) ~[?:1.8.0_251]
        at java.util.ArrayList.get(Unknown Source) ~[?:1.8.0_251]
        at com.robomwm.claimslistclassifier.command.ClaimTopCommand.print(ClaimTopCommand.java:129) ~[?:?]
        at com.robomwm.claimslistclassifier.command.ClaimTopCommand.parseAndPrintPage(ClaimTopCommand.java:118) ~[?:?]
        at com.robomwm.claimslistclassifier.command.ClaimTopCommand.onCommand(ClaimTopCommand.java:52) ~[?:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[patched_1.16.1.jar:git-Paper-75]
        ... 9 more

@NullCase
Copy link
Author

Is it a problem if the .ignore files aren't printed to the console? I don't know, you might already have a plan for that. Just because it seems like they could really add up after a while.
console ignore file spam

@RoboMWM
Copy link
Collaborator

RoboMWM commented Jul 13, 2020

Interesting, didn't know you had some .ignore files in there. Ya, I can remove that message. Just didn't expect there to be any invalid files in there so I am kinda curious what the contents of those files are.

@NullCase
Copy link
Author

those files just have a players UUID and then list UUIDs of players they ignore.

@RoboMWM
Copy link
Collaborator

RoboMWM commented Jul 13, 2020

Oh... interesting. I thought GP used a dedicated ignore file. Guess he changed that or maybe it was always that way and I didn't realize that.

@NullCase
Copy link
Author

I first realized it at least as early as 2017. Prior to that i don't know.

RoboMWM added a commit that referenced this issue Jul 13, 2020
RoboMWM added a commit that referenced this issue Jul 13, 2020
RoboMWM added a commit that referenced this issue Jul 13, 2020
@NullCase
Copy link
Author

Tested the latest build:

  • Skip file still shows in console. I don't know anything more.
  • /claimtop 0 prints page 1 as intended.

test 7 14 2020

@RoboMWM
Copy link
Collaborator

RoboMWM commented Jul 15, 2020

Ok, thanks. I guess my quick file extension check didn't quite work. Will fix via a better known/supported library for that.

@RoboMWM
Copy link
Collaborator

RoboMWM commented Jul 15, 2020

As for names to UUIDs: it is not safe to run Bukkit#getOfflinePlayer asynchronously. From what I've read, it was (originally?) intended to be thread safe, but it is not. So here are some options:

  • Convert UUIDs to names from local server cache (easy).
    • Omit entries that are not present in cache, or
    • Keep entries not present in cache as their UUID, or
    • Keep entries not present in cache as "someone" (or other alias). (For reference, when a player is not present in GP's cache, which is the same as the server cache but only contains players that have been on the server in the past 90 days, will use this format: Someone(uuid))
  • Convert all UUIDs to names using Bukkit API
    • Players who are not present in the cache will cause some lag as the server reaches out to the Mojang API synchronously for a response for each request.
  • Convert all UUIDs asynchronously using the Mojang API (somewhat more difficult as I haven't done this before but the response should be easy to deal with + others have probably done this).
    • Downside is possible rate limiting
  • Convert all UUIDs asynchronously using some other online API (may be same as going to Mojang API, but ultimately depends on the API)

@NullCase
Copy link
Author

I don't know how the local server cache works. Do all MC servers have this? How do names get into the cache? How long are they held for? What's the downside of using the easy route (beside possibly incomplete name lists)

@RoboMWM
Copy link
Collaborator

RoboMWM commented Jul 17, 2020

Downside of easy route is just that, may be incomplete.

The local user cache exists in all servers, and its file can be found in your server's root directory as usercache.json. I'm not sure of the specifics, but I do know that all players who have logged in to the server are have their UUID->name info stored, within some determined range of time, in this file.

@NullCase
Copy link
Author

NullCase commented Jul 18, 2020

ok awesome. The easy route sounds best. Let's try that. (edit: it looks like Usernames survive for one month in usercache.json I like it).

For the 'someone' part let's have that specified in the configuration. Because then it doesn't have to be decided in advance.

Also, this might be annoying but I want to add one thing to this feature. What if we set up /claimtop as a permissioned command? 'claimclassifier.claimtop' or something. I don't know how the format works.

Because i'd like to specify in GroupManager what groups have /claimtop

@NullCase
Copy link
Author

It seems like this claimtop feature was more complicated than it appeared at first glance.

Is it a problem on your end? Like, if this kind of thing happens where you want to do one thing and end up having to do ten things.. I don't know if that's normal for coding work.

@RoboMWM
Copy link
Collaborator

RoboMWM commented Jul 21, 2020

It seems like this claimtop feature was more complicated than it appeared at first glance.

That's how things usually happen, but overall we're on track with what you posted here #15 (comment). Your steps don't fully account for technical "hurdles" e.g. converting offline players UUIDs to names (it does for some, if you consider the calculations happening asynchronously to avoid performance impact), but that's fine and not really something you need to know 100% about as the client/customer - just the complexity, as you state. (And I kinda did review the options and did an informal grading of complexity in that comment earlier, so no problems there.)

Idk the official agile methodologies, but I prefer doing little releases and seeing if the stuff is progressing to your liking instead of doing something all at once and then going back to change all sorts of things afterwards. I don't feel overwhelmed with this feature at all.

As for the 3 day delay that's just because I get busy and forget sometimes, especially after a weekend/beginning of the week. So it's ok to ping me on this from time to time if there's no activity, especially since you're a reliable client and nowhere near impatient. I do wish there was a better way for me to track stuff across all of my projects on GitHub - the new Notifications stuff is a bit closer - but if there was a way to have me view/sort all issues across all my projects would help me remember/attend to the stuff I'd like to finish instead of just visiting the various repos issues or going through my past notifications.

@NullCase
Copy link
Author

will test tmr. Thanks @RoboMWM

it sounds like little releases are best. Because I too don't want to go back and redo all sorts.

Enjoy your time. There's no rush on my end. As you say, no where near impatient. You were very clear at the outset 3-odd years ago that flexible time was critical.

Tracking on github... yeah it seems like a common problem. I sometimes also miss issue updates/posts and have to manually visit. Especially for older issues. Or closed issues..

@NullCase
Copy link
Author

when executing /claimtop it threw an exception.

[17:45:47 INFO]: NullCase issued server command: /claimtop
[17:45:48 ERROR]: [global] TaskChain Exception on com.robomwm.claimslistclassifier.command.ClaimTopCommand$$Lambda$5304/1318572203: java.lang.NoClassDefFoundError: org/apache/commons/io/FilenameUtils
[17:45:48 ERROR]: [global] Current Action Index was: 0
[17:45:48 WARN]: java.lang.Exception: java.lang.NoClassDefFoundError: org/apache/commons/io/FilenameUtils
[17:45:48 WARN]:        at com.robomwm.midnightportal.taskchain.TaskChain.handleError(TaskChain.java:1203)
[17:45:48 WARN]:        at com.robomwm.midnightportal.taskchain.TaskChain.access$600(TaskChain.java:57)
[17:45:48 WARN]:        at com.robomwm.midnightportal.taskchain.TaskChain$TaskHolder.run(TaskChain.java:1320)
[17:45:48 WARN]:        at com.robomwm.midnightportal.taskchain.TaskChain$TaskHolder.access$100(TaskChain.java:1266)
[17:45:48 WARN]:        at com.robomwm.midnightportal.taskchain.TaskChain.lambda$nextTask$18(TaskChain.java:1187)
[17:45:48 WARN]:        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[17:45:48 WARN]:        at java.util.concurrent.FutureTask.run(Unknown Source)
[17:45:48 WARN]:        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
[17:45:48 WARN]:        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
[17:45:48 WARN]:        at java.lang.Thread.run(Unknown Source)
[17:45:48 WARN]: Caused by: java.lang.NoClassDefFoundError: org/apache/commons/io/FilenameUtils
[17:45:48 WARN]:        at com.robomwm.claimslistclassifier.command.ClaimTopCommand.lambda$onCommand$1(ClaimTopCommand.java:86)
[17:45:48 WARN]:        at com.robomwm.midnightportal.taskchain.TaskChainTasks$GenericTask.run(TaskChainTasks.java:83)
[17:45:48 WARN]:        at com.robomwm.midnightportal.taskchain.TaskChain$TaskHolder.run(TaskChain.java:1312)
[17:45:48 WARN]:        ... 7 more
[17:45:48 WARN]: Caused by: java.lang.ClassNotFoundException: org.apache.commons.io.FilenameUtils
[17:45:48 WARN]:        at java.net.URLClassLoader.findClass(Unknown Source)
[17:45:48 WARN]:        at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:171)
[17:45:48 WARN]:        at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:100)
[17:45:48 WARN]:        at java.lang.ClassLoader.loadClass(Unknown Source)
[17:45:48 WARN]:        at java.lang.ClassLoader.loadClass(Unknown Source)
[17:45:48 WARN]:        ... 10 more

@RoboMWM
Copy link
Collaborator

RoboMWM commented Jul 23, 2020

It's actually easy to see issues you opened - the topmost bar menu link Issues will provide you that view. I just wish there was an option in that view to view all issues on all repos I'm the owner of/a member of.

For the error - I guess I do have to shade in the dependency... the other plugin I use this in I don't shade it, or at least I thought I didn't, so I guess I'll doublecheck that.

RoboMWM added a commit that referenced this issue Jul 23, 2020
@NullCase
Copy link
Author

@RoboMWM it looks like ClaimTop is done! $ sent.

Is there anything I'm forgetting here?

@RoboMWM
Copy link
Collaborator

RoboMWM commented Jul 23, 2020

Not aware of anything else to do for this. Thanks!

@NullCase
Copy link
Author

claimtop with names

@NullCase
Copy link
Author

Alright! It might be a little bit before I have more dev work, or the next job might be a smaller one. It's just because I had to replace my computer and will have to be more careful about future projects. Just a heads up.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants