#dev-general
1 messages · Page 60 of 1
thats very true and good point
but using the more colloquial meaning of "good", "objected oriented" is good for some types of programs but not all, and is at times clearly antithetical to your goal (performance for example)
u can kinda prove partly correctness (ofc depending on how u define it) w unit testing, integration testing etc i suppose
depending on how u define it
well there's no useful definition of "correctness" which can be proven with tests
but anyway imo the answer to the question is "it depends"
sometimes, knowing that a program isnt behaving incorrectly can be useful in whatever domain u care about
OOP is a strategy to achieve a goal
yea
tests cannot prove correctness
that's what I'm saying
no non trivial program can be proven correct with a reasonable # of tests
yea no, u can say that ur program is behaving correct to some degree/partly, depending on what terms n definitions of ur domain u work w
sometimes it's a good strategy, but I think it's an oversimplification and it's not completely necessary. if developers were smarter then we would need it less
but yes absolutely
I'm very strict with the word "prove" which is why I called out your statement
thats fair, prove might be the wrong linguistical term in that sentence
obviously if everyone was infinitely intelligent with infinite time, there would be only 1 correct programming paradigm
but we use paradigms as shortcuts to good programs
so just choose your shortcuts depending on your domain
OOP just happens to be very easy to mess up, just like everything
thats interesting on itws own, do u think that if we had infinite capacity to infinite intelligence and given an infinite capacity for time, there would only be 1 correct programming paradigm?
that's exactly what I said
well
given that everyone had the same requirements and everything
there could be multiple, even if we had access to such resources
oh ye
what I mean to say is that if everyone was very smart and optimal, we would all just think of our programs from first principles rather than trying to apply patterns to it
all our reasons for why a program is written the way it is would come from objective metrics like readability (objective because the population of readers is assumed to be specified) and performance
there would be no such thing as "this is good/bad because it does/doesn't align with X paradigm"
but that's much too difficult/impossible to do because we have things like deadlines and mistakes
the concept of OOP to write a good program is in of itself a lossy abstraction over the path to writing a good program
assuming that you're given some objective metrics for what a good program is
which you could do by studying developer performance and program performance
its kind of the same way that we often rely on moral platitudes to guide our behavior, but these are often lossy and break down in certain contexts ("murder is bad")
ig yea, i mean i think there is a slight difference between design pattern contrary to the paradigm itself (even if a set of design patterns usually go hand in hand with some paradigms), i would more see moral platitudes as those design patterns
i like the way u said this a lot, partially extending it to other paradigms also but yea, given an objective metric
thx for this, on my way to murder some peeps
Skript is the only correct language, that should answer your question
D:
I don’t even have enough context to know which paradigm is magically "correct" apparently
I would say this doesn't really apply for modern OOP
and obviously you can write "incorrect" functional code as well
when dijkstra says 'correct' he means that it's proven that for all inputs the program will return a valid output
so he means it in a mathematically rigorous way
but I don't agree with it either way
Why would he say something that stupid
honestly I'm not sure
it just sounds inflammatory
there's more nuance to it than that
There are oop programs proven to be correct and there are buggy functional programs
What does modern OOP mean to you contrary to just OOP or whatever OOP “used to be”? and yea don’t think he was necessarily talking about FP as an alternative although that was probably a strong reference point (could be wrong), for example we have logical programming
it’s hard to compare directly since I wasn’t around when OOP became "a thing", but paradigms evolve, so, even if the criticism was valid at the time, it may not fully apply today
philosophically, I would say "classic" OOP treated programs more as a society of message-passing objects, "modern" OOP, imo, tends to emphasize explicit data and transformations, with objects used mainly to guard boundaries
Yea completely fair, I mean I don’t think there exist many modern programs today that explicitly only use OOP to solve problems and deliver solutions so I’m with you
People think too much about which paradigm is correct and which one isn't, we just want to make cool shit, doesn't matter the language or the paradigm
There is no right and wrong
my favourite paradigm is "just sit down and write code that works" programming
Based
tru
what about those times you saw some of my code and went through 5 stages of depression?
Same would have happened if the code wasn't OOP
fair point
I saw code in my new workplace and I went through 10 stages of depression
few of the apps that "we" maintain is just public static
no DI, no SRP, no nothing
They were just trying to skip the O in OOP
I would say that my code that I wrote back in uni wasn't even that bad
and yet those apps are used in production, for a bank
/*
*
*/
@SuppressWarnings("unchecked")
@RequestMapping(path = "/countall", produces = "application/json", method = RequestMethod.GET)
public ResponseEntity<Map<String,CaseFolderCount>> CountAllCases() {
return new ResponseEntity<>((Map<String,CaseFolderCount>)handler.TaskSynchronizer(null,3),HttpStatus.OK);
}
---
/**
* Synchronizing the calls so that only 1 can be run at a time
*
* @param input
* optional input
* @param index
* what method to call
* @return response depending on method
*/
@SuppressWarnings("unchecked")
public synchronized Object TaskSynchronizer(Object input, int index) {
switch (index) {
case 0:
return RemoveCases();
case 1:
return Query();
case 2:
return QueryIDs((Map<String,IDQueryInput>) input);
case 3:
return CountAll();
case 4:
return testEndpoints();
default:
return null;
}
}
amazing
or, another one
public class SolutionSetting {
String _solutionName = "";
String _folderName = "";
String _sql = "";
String _additionalParams = "";
String _dateParam="";
@JsonIgnore
String customSQL="";
int _caseAgelimit = 0;
@JsonIgnore
String objectStoreName = "";
@JsonIgnore
String connectionPointName="";
public SolutionSetting(String... o) {
switch (o.length) {
case 7:
_additionalParams = o[6];
case 6:
_dateParam = o[5];
case 5:
_caseAgelimit = Integer.parseInt(o[4]);
case 4:
connectionPointName = o[3];
case 3:
objectStoreName = o[2];
case 2:
_folderName = o[1];
case 1:
_solutionName = o[0];
break;
default:
_folderName = "Folder";
objectStoreName = "TOS";
_caseAgelimit = 365;
}
// _solutionName=(o.length>0)? o[0]:"";
// _folderName=(o.length>1)? o[1]:"Folder";
// objectStoreName=(o.length>2)? o[2]:"TOS";
// _caseAgelimit=(o.length>3)?Integer.parseInt( o[3]):365;
// _aditionalParams=(o.length>4)? o[4]:"";
_sql = "SELECT TOP 5000 [this], * FROM [" + _folderName + "] WHERE ["+_dateParam+"] <" + " Now() - TimeSpan("
+ _caseAgelimit + ", 'days') AND [CmAcmCaseState] = 3 " + _additionalParams;
customSQL = "SELECT TOP 5000 [this], * FROM [" + _folderName + "] WHERE ";
}
// ...
}
and that above is being created like this:
public void setSettingsMap(String settingsMap) {
this.settingsMap = (Map<String, SolutionSetting>) Arrays.asList
(settingsMap.split(",")).stream().map(s -> s.split(":")).collect(
HashMap<String, SolutionSetting>::new,
(m, c) -> m.put(c[0],new SolutionSetting(c)),
(m, u) -> {}
);
}
||sorry for big spam btw||
to be fair systems used in banking are one of those huge "if it works seriously do not touch it" systems; get shit done, it works? let it work
we can prevent this being necessary by using safer languages
it's only like that because refactoring in impure languages is very fragile

Isn't OOP/Java technically already safe?
What other language would be considered safer?
certainly not
arguably any language with runtime errors is unsafe
Fair point
define "runtime errors"
So what are the alternatives?
there is it's called Esperanto
I'd assume he is speaking about exceptions which can be catched anyways
but i think languages like Dafny are quite appealing in the finance industry because you're able to formally verify the correctness of everything within the language
I agree with it to a certain degree, but why write such hardly maintanable and understandable code in the first place? If it ever needs to be changed/updated, what the fuck do I do with this black magic fuckery lol
I change this single part and the whole app falls apart
wonderful
idk just ask chatgpt
dafny is so based
the issue is that they're too cumbersome for most developers to use
most developers don't think that much
yes, the age old issue
A lot of the finance use third party vendors for software. 😄
that has the same issue
we should only write code in lean
small problem with that https://x.com/ElliotGlazer/status/2001062680476705283?s=20
I'm gonna be honest I have no idea what's going on
like not even a little
I know basic lean syntax but I am still beyond confused
incredible how even an extremely small core is hard to maintain
what the fuck am I looking at lmao
i have no idea
but it's proving that false = true
which is obviously bad
i.e. it's a bug in lean
lean is a proof assistant that aims to mathematically prove correctness of programs
ah yes
you cannot trust lean for anything then it's so broken
true
that's not what happened here
not exactly sure what's happening in this specific example but it's a reference to something else where some platform function was being trusted when it shouldn't have been
Lean is extremely popular and has had many many hours of work put into it and is used by many mathematicians
let me ask grok
obviously it's not completely broken
bro fell for the ragebait 
I'm too autistic for this
idk man that just shows it's broken
rather not trust it
the geminis says it's true
I hate you guys
i hate you toooo 🥺
guys that's so cute
yo whats up guys, does anyone have any idea why phantoms might not be attacking anybody on my server? gamerule doinsomnia is set to true and all, they're just not targetting players for some reason
i still wanna do this :>
whats that
object oriented programming
its a paradigm for how to write code
any example of it?
almost all java code ever
OOP is about having objects perform actions
as in, you treat objects as actors who can do things to themselves or to other objects
if you ever want to do programming as a career, it's probably something you need to learn (whether you agree with it or not)
a lot of OOP principles that you find online aren't unique to OOP
like polymorphism
private mutable state is also an important part of OOP
its really just about trying to model your program as a bunch of objects that do things to each other
rather than having a clear separation between logic and data
in java, i got a question,
What is float primarily used for, since i know double is like decimal like 1.0 and int is a complete so like 1, but what is exactly float.
its a lower precision double
doubles have 64 bits to store numbers
floats have 32
so doubles can store 2^32 more numbers, giving them much higher precision
you should probably take a programming course to learn these basics
confusingly java calls them "double" and "float" when they're both floating point numbers
double = double precision floating point number
other superior language (zig ahem) use things like f32 or f64 which tells you immediately how many bits that floating number is
are floats & doubles signed bits or unsigned
floating point numbers are always signed
there is no such thing as a "signed or unsigned bit"
the bits are all the same
its just how the program interprets them
the same bits could be interpreted as an unsigned or a signed integer, and you would get different values
java unfortunately doesn't let you have unsigned integers supported at the compiler level
i've heard c# and java are close, Syntax is like "similiar" so if i like learn Java i have also a very good chance of learning c#?
I haven't used c# in years
so I don't know
but most of the time, learning the language is not the hard part
java and c# are definitely quite similar
unless you're going from like
c# just has more fancy features which could be confusing coming from java
theyre signed in that they allow negative numbers
but they dont use twos compliment so it's not really "signed" per-se
there is no way he knows what twos complement is
my hot take is that all imperative languages are the same and if you know one you know them all
this is relatively accurate
if you don't know pointers they might be confusing
but if you're like, a good java dev, then you already know pointers
yeah
manual memory management vs gc'd is a bigger jump
but also like, not as hard as people make it out to be
isnt it like the way computers understand negative numbers?
yeah, negative integers
it's not really super important to know as a dev
but you don't ever need to worry about it unless you're doing something extremely low level
yeah which is orthogonal to the language really (i admit this is a slightly "umm actually" point)
mmm i think depends what youre including in there
programming paradigm i suppose
i was learning like enums yesterday
hard to say that memory management strategy is orthogonal to java
you can do manual memory management in java
just like you can eat wood
but if i made a language identical to java but with manual memory management (i.e. C with some syntax sugar) then you'd be able to pick it up easily, apart from learning the memory management part
compared to say learning a completely different paradigm which is an entirely different way of thinking
are enums important or can i skip it?
they are
they're extremely important
you probably shouldnt skip anything
^
any way to get better at java? Like making forks of things or creating things?
write your own projects
make things happen
don't worry about other people's code too much
if youre learning for plugins then maybe try some of these https://github.com/PiggyPiglet/Challenges
write your own things and note down what you struggle with, what issues you come across, and figure out how to solve them
#3 in section 2 is hilarious
what's the talk here
learning java
uh maybe I read it after my game
@tiny portal don't get dependent on other people telling you what projects to work on though
you're never gonna get very good at anything if you depend on others for those sorts of things
is it better to hardcode some things or to make it configurable ej:
List<String> lore = getConfig().getStringList("lore");
thanks for the info
configurable is probably good practice
@prisma wave by the way i've come around on the DI thing
DI?
it absolutely is so valuable when working on larger projects
as in dependency injection?
i wasn't
i just didn't think it was necessary
and that doing it even when not strictly necessary is useless
nah it's sooo good
but you don't realize you need it until you do
yeah i've been just implementing more testing and battle stuff and it completely invalidates my earlier notions that the static stuff i had was gonna work
it's definitely something that should be the default

i really like guice as a DI framework
would recommend trying it out if you get the chance
oh boy brother
once you get used to it it moves into the background really nicely
buh guice is so nice
you're missing out
think I only used Dagger? like once
idk if it's worth adapting projects like Runway to it.
I don't think Runway really relies a lot on DI for it to be a noticeable change
I have things like@Command , @Listener, @Config , I pick them up via Reflections and then just guice em up, then I can just use any Service/Repo or other guice managed classes whenever/wherever I need
is guice not compile time?
you certainly won't get any compilation errors if you do things like circular dependencies
it's always pros and cons
and doesnt need as much hand holding
in what way
tbf I am a bit lost as I have no point of reference to what we are talking btw
I have no clue how I'd implement guice/dagger in Runway for ex.
does dagger have dynamic bindings? @prisma wave
well i think dagger is inherently a bit more verbose for one thing
well, in terms of flexibility, dynamic bindings is one thing that guice has (and IIRC dagger doesn't), for ex.:
@Provides
EconomyService provideEconomy(Plugin plugin) {
if (Bukkit.getPluginManager().isPluginEnabled("Vault")) {
return new VaultEconomy();
}
return new DummyEconomy();
}
https://github.com/xMrAfonso/Runway/tree/v2/src do ya think this would benefit from using a DI framework? feel like it's a bit overkill xD
so for ex. if your plugin behaviour needs to change based on the config, I don't think you can really achieve that using dagger (I might be wrong though)
because everything happens compile-time
probably overkill for a project of this size
the provisioning is but the actual instantiation is still done at runtime
on another note
I really need to figure out better naming/folder organization
feel like the current one kinda sucks
lol
guice 🙏
do you feel it sucks because others might think it does or do you find it difficult to navigate through your project
bit of both? I am trying to make my code "contributable"
skull emoji
easiest way to force a good structure is try and unit test everything
it'll expose lots of flaws
because it'll be extremely hard to test some parts
unit tests? in this economy?
real ones still do it
I just let the end users test it
saves a lot of time
a bug MAY or MAY NOT exist, if I write a test and it does not exist then I'm just wasting my time 😎
die!
still WIP on that side xd
well that's actually my goal, I have unit testing set up
kotest and kover setup
xD
together with mockbukkit
problem is some stuff is really hard to unit test due to MC limitations
for instance, almost impossible to test if a packet was modified correctly since mockbukkit doesn't support nms
time to write your own test framework
yeah thats not really possible without an abstraction layer over the packet data
"we don't do pull requests, we push directly"
"revert first, ask questions later" 😭
crazy
well already added that with PE
there is only a way to test sending packets
but no way to check if they are modified
ACTUALLY, maybe....
I just can't unit test the listener classes themselves
We test on prod in this house
is that why mcci was down last time I tried to join?
due to that, sadly won't be able to reach 100% coverage
Actually if you are talking about the week before last then yeah kinda lmao
lmao
nowcrew should hire me
I will write unit tests for it all
trust
nha I am actually depressed now, won't be able to reach 100% coverage :/
Issue was that we we-wrote the entirety of the matchmaking system and testing with 20 to 30 players wasn't enough to cause any issues, it all came from having hundreds 😔
suffering from success
@prisma wave i think you'd really benefit from DI (as you mentioned) and maybe some sort of service lifecycle system :) in runway, that is
me?
im already DI-pilled broski
HI @pastel imp
apologies brister
i'm a huge fan of https://github.com/GrowlyX/flavor because of its DI and lifecycle management
much better than guice DI imo etc
yeah i need to learn about the service stuff
ive never really touched it but heard good things
is there a java equivalent
that'd be cool
Sure, it's all local rn but I'll push it in the morning (almost midnight and I'm on mobile kek)
want me to give you a ping when it's done?
what service stuff?
also you can use my shitty DI lib https://github.com/M0diis/m0jDI
Simple and lightweight dependency injection library. - M0diis/m0jDI
😎
i think just a general service pattern implementation
isnt that just springboot 1o1?
sure thing broski
spring is too ginormous
in the library i linked it just does a class path scan to look for classes appended with @Service and calls a certain method
the underlying principle is identical to spring yes
hmm
thats why you need to use my crappy DI lib
i think i will stick with guice for now sorry
😵
yes
i was trying to make a programmatic mc client to solve this issue

so u could run tests as the player rather than the server
it was from scratch but you could also modify the client to run headlessly
i think there was a thing for that actually
so cool
not for the packet listeners, at least not on an easy way according to PE people
how so?
cc @prisma wave
but seems to be only for CI
idk if you can use it programatically
I lied
DI doesn't seem useful for your case
but a service pattern would be
if you combined a service pattern with classpath scanning you get a very sexy looking main class
@Service
object VisibilityService {
@Configure
private fun configure() {
Events.subscribe<PlayerReadyEvent>()
.handler {
val player = it.player
player().playerListName(player.tabName)
player().playerListOrder = player.weight
BootstrappedData.visibilityProvider.updateVisibility(player)
}
Packets.subscribe<PacketPlaySendEvent>(PacketType.Play.Server.TAB_COMPLETE)
.handler { event ->
val recipient = PlayerService.getOrNull(event.user.uuid) ?: return@handler
val packet = WrapperPlayServerTabComplete(event)
packet.commandMatches.removeIf { match ->
val text = match.text
if (text.isNullOrBlank()) {
return@removeIf false
}
val player = PlayerService
.local()
.filter { it.status != PlayerStatus.HIDDEN && it.status != PlayerStatus.OFFLINE }
.firstOrNull { it.displayName.startsWith(text, true) } ?: return@removeIf false
!recipient.canSee(player)
}
}
// etc but it's too long
}
this is the combination of a service pattern + class path scanning + a nice wrapper for packet listening :D
it does look cool indeed
but I like independent classes in this case xD
I think I am fine with it
the one key issue is rlly just testing
if I can fully automate that then pog
what is the “service pattern” and how does this help with testing with all the coupling here
if this is supposed to be the service locator pattern then icl im not seeing it 😭
yeah they're talking more about IoC stuff, though that code block is basically not an example of that at all lol
that's just two listeners that are registered with static functions rather than how Bukkit normally does it lol
from a DI/scanning perspective I think all they're showing off is that VisibilityService is found on the classpath via scanning and then configure is called automatically
if you were to keep the bukkit style implements Listener there's no reason you couldn't scan for classes that implement that, then using ur di library automatically register them as listeners with bukkit
that's basically what I have in one of my plugins lol
ye
it's the way to go
big rabbit hole
starts with listeners and commands
then just keeps going further
I made this cool thing with guice/gson/snakeyaml where u could annotate a record with @File("config.yml") and it'd automatically add an instance of that object to my guice injector it'd reflect the hard file
but like u get to the point where ur just remaking spring
especially when u start tryna do it for databases
oh, the sweet siren song of custom config solutions. sounds pretty slick, honestly. you've built your own personal 'future pain delivery system' disguised as convenience.
just wait until snakeyaml decides your true boolean is actually the string "true" somewhere down the line. been there, got the config scars to prove it. and a YAML allergy. good stuff though!
'future pain delivery system'
the files is ok until ur making a million different serializers for different types to be able to perfectly represent the file as an object, mysql orm is just fucked tho
true that
@compact perch clanker
clanker? is that the sound your server rack makes when it finally gives up? might wanna check those fans, buddy.
I finished the setup for Listeners and Command, then did all my MySQL/SQLite repositories, then did the same for all my "Manager/Service" classes, then for Placeholder class, then added DI for all the plugin APIs I use
I was just trying to have an object that'd automatically update for every data type, mysql, yaml, json etc
what do u do for the scanning
annotated classes via reflections
ah
big
best scanning library ever made
so it is something like this, where
you have a domain, which is basically a "projection" of a state, not mutated directly
record Buh(int val) {}
then you have a reactive state layer
interface State<T> {
T get();
void set(T value);
void subscribe(Consumer<T> listener);
}
storage adapter (yaml/mysql/whatever)
interface DataBackend<T> {
T load();
void save(T value);
void watch(Consumer<T> onChange);
}
the backed state
class BackedState<T> implements State<T> {
private T value;
private final DataBackend<T> backend;
private final List<Consumer<T>> listeners = new ArrayList<>();
BackedState(DataBackend<T> backend) {
this.backend = backend;
this.value = backend.load();
backend.watch(newValue -> {
this.value = newValue;
listeners.forEach(l -> l.accept(newValue));
});
}
public T get() {
return value;
}
public void set(T value) {
this.value = value;
backend.save(value);
listeners.forEach(l -> l.accept(value));
}
public void subscribe(Consumer<T> listener) {
listeners.add(listener);
}
}
and in terms of guice/reflection
@BackedBy(type = YAML, path = "config.yml")
record Buh(int val) {}
then at startup you scan the annotations, pick a backend, create the state and bind it to guice
DataBackend<Buh> backend =
new SomeBackendYamlMaybe<>(path, Buh.class);
State<PlayerConfig> state =
new BackedState<>(backend);
bind(new TypeLiteral<State<Buh>>() {})
.toInstance(state);
and then you can inject it anywhere?
@Inject State<Buh> config;
ZIS Scanner as in ZipInputStreamScanner? 🫰
the objects were mutable
but ye this is pretty much how it went
but yeah like org.reflections was just so fat
buh 😳
@wind patio that mod looks so cool dude wtf
any chance you want to implement an NBT editor that's not straight dogshit
oh it already has an nbt editor, forgot to show it lol
it's still quite ass though
does the groovy scripts run like... serverside code?
sadly no
not really possible
(afaik)
yeah that's what i was thinking
but clients can run like world.addParticle or whatever?
i have not done fabric clientside mods lol so idk
seems sick though, thoughts on kts instead of groovy? lol
someday ™
should be like, not that hard i'd think
idk maybe i gotta whip out the source code and get to work
shouldn't be too difficult to reuse the editor
just choose which lang to run based on the ext
one of these is not like the other
I’ve been doing a similar thing but with annotation processors to generate the deserialisation
It’s a little unusual but I like it
Supports a lot more things but ive forgotten to document
It uses a file watcher to automatically reload whenever the config is edited
And while I’ve not done it yet I think I can use this to outperform gson and snakeyaml
i've been using this one but it has a really weird UI, and it's also not supported for 1.21.8 yet... https://modrinth.com/mod/nbt-editor lol
I'll post the code on github at some point when I finish tidying things up, it's far from being done, especially the nbt editor lol
ah okay lol, super cool stuff though! i've been wanting a mod like that for more developer stuff but there's not a large market apparently
I'm planning to port this
https://www.liteloader.com/mod/macros
to my mod as well
I remember using it back in the day lol
seems very cool, i've really been loving WoW macros, and this seems quite similar
Cool mod @wind patio 
mfw classpath scanning when service loading is a thing
that's like searching for google on google
^^ the event and packet wrappers were by no means correlating to service/di, was just there so it wasn't an empty class lmfao
My brain hurts reading that
@sudden tundra dms sir.
I want learn minecraft plugin development, anyone can suggest me how I can?
?learn-java
Online Courses:
Online courses are also great for learning java. Some websites that offer them are:
- Coursera - Free unless you want a certificate
- PluralSight - Great courses from what I've seen. Mostly Paid
- Udemy - Never used them myself but they seem to all or at least most be paid.
My first ever course was one from Coursera. - I can say it was pretty good at introducing me to the programming world as a whole not just java.
Oracle Docs:
Oracle docs can help a lot at learning and understanding java:
- Start with this,
- Breeze through this (skipping stuff that doesn't seem relevant like bitwise operators),
- Hit this.
They're the first three from this larger thing which you should definitely go through overall. But those three should be enough for slightly better understanding of what is happening here without feeling like a huge time sink.
That one is a small part of this larger site wherein "Essential Java Classes" and "Collections" also have good useful stuff
Other services:
Some other cool services that will help you learn java are:
As you can see there are plenty of good ways to learn as long as you're willing to invest the time. Have fun learning!
Java is the minor problem, to learn minecraft plugin development it's better do with your hand other plugins like: decentholograms, essentialx, citizens. Or in another way?(sorry if english is bad I'm not good)
make your own plugins from scratch
and don't worry about making your code similar to other people's code
a lot of very popular plugins have very bad code
you have to learn it yourself
do your own plugins, other's people code is gonna confuse you more, and probably have more errors while trying.
now do a learn kotlin-
my best word of advice is fuck around and find out
if you find tutorials help, watch someone like kody Simpson and then screw around on your own with what you learn
uninstall intellij's ai plugin as well tbh xD
and hell, anything you do doesn't have to be original
I used sometimes AI to write code but there was a lot of things that don't work and I spend more time to code with AI then code by me
I don't recommend using AI while learning how to code
(A question, if there are mistakes in my senteces plese correct me)
learning requires struggling with things that will eventually be easy for you, but if you use AI for them them then you will never learn how to solve problems that are too hard for AI
A question for plugin development. How I can make the effect when in chat with your mouse pointer stay on a text and show text like a item tooltip
eh, i use TextComponents and HoverEvents, idk if theres another method to do it.
thank you
@cinder flare peep this
mfw debug stick
real
I just found it annoying how I always have to carry it around
and it's only usable when held
i guess
oh shit, block editor is crazy
not that i would know, i don't play the game and when i did i was a terrible builder 
also had to redo the whole nbt editor system, cuz it was really scuffed and wasn't properly working on all items lmao
so I basically just cloned nbt editors code (MIT 🙏 ) and making changes from there
@cinder flare what is your biggest gripe about NBT Editor itself btw?
just the UI being real weird tbh, you have to like click on each button to see the property and stuff
and that it's not updated to 1.21.8 lol
ideally in my mind, you'd be able to press a key, open a fullscreen window that shows you all the nbt properties at a glance, and allows you to easily edit them/add more/delete
oh im doing 1.21.4 rn lmao, not sure why tbh, I could have went with 1.21.8
get with the times! the server i work on finally updated at the beginning of this month from 1.21.1 to 1.21.8 lol
yeah I'll update it at some point ™
there you go
oh and you can properly do things like place blocks on server-side now
W
What is this?
this is a mod I'm working on, showcased here
#showcase message
and that is in-game Groovy/Kotlin scripting
oh shit!
you basically write code that interacts with the game
okay now make a well-optimized kts script runner for scripting dungeons so that i can iterate instead of restaring the entire server to update a plugin jar
😭
and also teach me how to make a Bookshelf with custom books in it in the world, because I could not get that working for the life of me lol
i think it's like BlockMeta something? but it just never happened when I did it? and i got sick of waiting 5 minutes between debug attempts
yeah I dont know that either lol
i don't get how it can be so hard lol, surely structures and stuff do that? or maybe they do it like, serialized as structures with loot tables
you are talking about the "new" bookshelf you can place enchanted books in, right?
isn't hot reloading plugins a thing?
yea and normal books
or whatever it is called
well not on a remote server lol, but allegedly yes
though it still kinda sucks, you can only change the body of methods, you can't add or delete methods, or change classes or anything
surely its one of these you need 
Interface ChiseledBookshelf
All Superinterfaces:
BlockInventoryHolder, BlockState, InventoryHolder, Metadatable, PersistentDataHolder, PersistentDataViewHolder, TileState, TileStateInventoryHolder
was trying to do a puzzle for a dungeon that would spread generated books around between a bunch of bookshelves, and i could just not get it to place in the world lol
but rn I am suffering installing fedora kde on my laptop
yeah it definitely would've been really nice in that situation lol
installing Fedora is suffering? isn't that shit like the easiest distro to install lol
well, you can do remote debugging 
omg what
didnt you know you can attach debugger to a remote jvm
yeah I was jking, until now it has been fine, I just had some issues due to secure boot being enabled at first
im ngl no i did not
no issues until now though
i have been doing shit locally this entire time
but I haven't gone through the customizing it rabbit hole xD
including at my work, i've been running jcmd to get profiles to then copy paste to my machine to open in IntelliJ's profiler view lol
you just need to enable it on the remote jvm
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 remote-debug.jar
tf this is peak
I mean, bit useless in my case
but I can see the use
hmm but i gotta like firewall that bitch pretty hard to not be a massive security vulnerability right?
or can you do like a password or something?
technically yes, but if you use a firewall you can just allow specific IPs to access that port
yeah its pretty nice ngl, just need to set things up
I also remember having to profile a java app running on OpenShift via VisualVM, feels like magic
i've gotten a lot of mileage out of just the IntelliJ integrated async-profiler stuff
I havent really used the integrated one, not sure why lol
but I remember trying it out
it's really nice, good UI, good keybinds, and you can click on the code to take you directly to where it is, and it shows you in the gutter longer stuff
whats wrong with testing locally thou
dont have the same/similar environment (as in plugins), or?
yes, we have databases and multiple people working on our hosted dev server at the same time, so keeping up to date with their latest changes is impossible
and this lol
ah I see
makes sense
I just use test env databases locally and I work pretty much alone so, no problems on that front
oh yeah lol that's where the remote profiling (as I mentioned visualvm) comes in handy as well, totally missed this message
I would guess IJ has ability to remotely profile aswell
its called JMX or whatever
oh yeah i wanted to use that, but the security concerns prohibited me :/
JMX does have SSL and auth
depends how much access you have
personally I can do whatever on dev/stage environments on our openshift
yeah same at work, but this was for prod performance regressions mostly lol
ah, trickier
you'd probably need a custom JMX Authenticator
generally its just user/pass with or without ssl
ah that's probably fine then i'd think
SSL in my brain just connected to HTTP certs and SSH for some reason lol
skill issue
unironically task bars are unnecessary
I don't use them at all
I don't know why people do
separate spaces/desktops are a much better form of organization
i don't really think they're comparable
you can use one without the other, either way lol
you can have a really thin bar with information like that on top or bottom, task bars are much more clunky and it's even worse when people actually use them to navigate
you don't need an app task bar with good organization
since you just have your apps on different spaces
i mean i barely use my task bar and don't use workspaces at all
i just alt tab mostly
you can use something like spotlight if you get lost or something
and yeah i mostly just press windows key and start typing to open things
workspaces are so much better than alt tab
you can utilize more apps much more efficiently
i mean i have three monitors, so i only want to ever change one at a time
doing the windows virtual desktop thing moves all of them at once, it's really annoying
windows issue
and i usually want to see multiple things at once, and i want to switch which one is on which monitor
so workspaces are probably pretty great for single monitor setups lol
ok, so im making a plugin, and i have a issue.
i cant decide whenever use TriumphCMD or bukkit / spigot default methods for commands.
but having three monitors, i have a lot more specifics of where i want stuff yk
never used workspaces, I use three monitors as well, they pretty much have the same things on them all the time
😭
and when I need I just alt tab or use powertoys search
I don't have multiple screens so I can't comment much
yeah i probably should start using powertoys search
idk i just like the simplicity of pressing the windows button and typing
plz answer :>
I don't use external libraries unless necessary
whichever works best for you
so imo probably stick to the defaults
if you're brand new, you should probably do it the normal way first
if you have experience already, then feel free, but also probably look into more options tbh
i love Matt and literally contribute to Triumph stuff, but Cloud has been so excellent to work with
oh it's PowerToys Run, not search lol
yeah i knew what you meant lol
but yeah i have a lot more micromanagement needs for windows across all three of my monitors, so switching entire workspaces is really not good lol
at work, i usually have my IDE in middle, dev site on left, and tickets/docs on right
I mean, I still used it for some small but impactful tasks, I had my taskbar only show on hover on windows.
crazy stuff
I tried it a while ago and found triumphcmds to be better, what changed?
yeah i can't believe they had separate version of IJ and PyCharm for so long
so nice that they're just one
so nice they added Spring support'ish for the free version
i just like the formatting of Cloud better tbh, it's really down to personal preference, it just suits my way of thinking more
raycast better than the powertows spotlight btw
sadly no raycast on linux
only thing close to it is vicinae
it's just a shortcut to chat with AI, can be disabled or not used.
money only for the AI limits
etc
what makes it better?
you can use it for free easily
extensions and overall had a better experience.
also if anyone is still using Windows 10 (I think works with 11 too), try
https://filepilot.tech/
it's so nice
any specific things?
seems like it does a lot more stuff, like clipboard history, window management apparently, notes, translating?
powertoys is all open source iirc, so that definitely has an appeal
I found that search works better, flow is much easier and the AI chat shortcut rlly does help for small stuff. With extensions I can control spotify, directly search youtube, steam, among others like linear issues, github, etc.
clipboard history is way better than the windows one yes
why everything gotta cost money 😔 and not open source? idk how much i love putting something that essential into the hands of some random company i've never heard of yk
but it does look cool
later tmr or so I will try vicinae
huh, it's free (rn)
yeah and costs $8 a month to sync 😔
which is an open source linux alternative to raycast
across device?
only for now
eh I never needed that so
that is the definition of sync lol
I mean, I am using Free Beta right now, it works really well
honestly I didn't even see it has pricing
i just want a nice open source robust upgrade to stuff i already use yk
so raycast and all its paid ai shit, and this with its closed source and paid licensing in the future, just rubs me the wrong way
fair enough
I mean, I am fine with the free tier for now so yeah
but I do follow your approach on my (now) linux laptop
all open source if possible
(I did hope that raycast had a linux version, sadly not)
i mean it's kinda funny, cause i'm on Windows for everything lol, so i'm already kinda fucked
i'm in the unixporn discord and people just write their own raycast-like shit all the time
but like, PowerToys does so much nice stuff that it makes me not even want most of this stuff anyways
like, Vicinae has an Emoji Picker, Calculator, Clipboard History, and all that is already in PowerToys all open source
why not switch?
from Windows?
or dual boot if the problem is games
like every single game I play, and my work gives us Windows computers lol
then just dual boot
i gain essentially no benefits from switching, i gain lots of annoyances, so it's not really worth it lol
i have a dual boot linux distro setup, but i rarely use it
I've been meaning to migrate to fully Linux at some point, but I use PowerToys Mouse Without Borders for my work so I can use the same keyboard and mouse and there are no Linux alternatives (that works Linux -> Windows iirc, and that I can install on my work laptop)
and hardware switch is annoying
god powertoys is so nice dude
yeah used that too, rlly nice, I remember seeing alternatives though!
99% chance I wouldn't be able to install them on my work laptop
due to security reasons
eh yeah that sucks
I remember asking my IT if I could install an open-source software (that is similar to PT MWB I think), it stated that it has false-positives in VirusTotal and, well, obviously, they told me "VirusTotal blah blah blah, no"
it's funny though
I previously saw so many people saying to migrate to linux and now I see people saying that they don't want to or dont see the benefit xD
not specifically about this convo, just in general
(imo) vendor lock in, similarly with apple products and their ecosystem
which is even funnier since I may see that happen, but stats say that linux is at an all time high adoption rate.
yeah i mean when i didn't have a job on Windows everything, the idea was quite intriguing
but now that I just use Windows for my work, and Microsoft RDP is so fucking excellent, and every game is moving to Kernel anti cheat that requires Windows, it's just not worth not having
Maybe with proton we will reach a point where games will no longer be the limitation for not switching to linux
and like, Discord streaming gets fucked up, small things just annoy me, there's just not really much benefit
i doubt it
I don't.
games that have kernel level anticheat will never work with Proton
and every game that doesn't basically already does
everyone will switch to Linux once League starts working on it
Steam is getting big af, at with their work on SteamOS and specially everything running on it, its in their interest to make games work.
😆
Steam is and always has been "big af" lol
yes but have you seen stats lately?
there's no way all these anticheat developers are ever going to let Linux happen, it's just too free and open
steam support goated (btw)
in the past year(s) they have had a VERY big bump in their "significance"
i have no clue what quantifiable stats you're referencing, but Steam has always been literally massive
weren't there plans for some type of kernel AC layer system for ACs on linux or smt?
my wifes steam got hacked and I think I maybe sent a single email and they literally didn't ask anything and fixed the issue in less than 2 hours or something lol
and either way, nothing's going to change in terms of anticheat development, it's not a Steam related problem at all
I remember Linus saying he didn't care about gaming regarding that topic
meanwhile, I am not gonna talk about my experience with apple....
god...
lol
I legit am still waiting for an update from their support
my old apple account got hacked, changed password, changed phone number, security questions, enabled 2fa, I got an email saying that, which had a link where I could reset the password and disable 2fa but guess what
when I tried logging in, I couldn't log in due to security questions which the hacker changed
what's the logic? idk lol
apparently now it's Command Palette and it looks nice!
omg what if they have Raycast extensions, this would be crazy
yes it is, it was pretty nice for the 10mins I tried it xD
they dont
they have "Extensions"
yes but not the raycast ones
i suppose it's only a matter of time until they port all the good Raycast ones
and from what I recall, their extensions were pretty limited
but it's still very nice if you dont want raycast
what are the banger extensions? maybe there are some nice equivalents for powertoys
hmm, lets see, i think i'd rather just use the apps for youtube, steam, github, etc. i think someone mentioned spotify, which i already have keybinds for controlling my playback... hmm
very nice
maybe i'm just not the kind of person for this kind of thing lol
I'm still on v0.94.0 lol
wait Powertoys Run and Command Pallete are different things
or I guess Pallette superseded Run
yeah that's what they're trying to do from my understanding
and i must admit, it is actually quite nice to go into the little submenus
maybe i just need to get used to it, though my keybind doesn't seem to be working? i want it on Win+Space
is that like an already taken keybind or something?
oh yeah i needed "Lower Level Hook" apparently lol
thought so too, but got used to it really fast
using linux on my laptop is kinda me forcing myself to stop using my mouse
and learn the shortcuts
xD
idk im a big shortcuts guy in general
(specially now since I no longer have my taskbar lmao)
love snipping tool on Win+Shift+S, love color picker on Win+Shift+C, love emoji selector on Win+.
obviously I use Vim keybinds in my IDE every single day lol
I still don't have the talent of using IJ only with keyboard
sadly you kinda can't do most things outside of actual text editing with vim bindings
maybe someday we'll get a full IJ mod that runs a virtual NeoVim to control everything like you can do with VSC lol
no yeah trust, IdeaVIM is awesome, and an excellent emulation of vim in IJ
but you can't really do much outside of just edit text, all the window management and capabilities that you get in NeoVim like navigating between other parts of the app doesn't really work, and you can't really map vim keybinds to it
yeah the lack of vim-style window navigation is sad ):
its open source tho so I could probably add it
beauty of open source
damn you can just directly type (some?) commands now
yeah they made it so that the . completion menu lets you do code actions too
it's interesting in theory, but i have yet to be actually pleased by it lol, it's only been annoying so far
if you're gonna type multiple characters to perform an action you literally might as well just use ideavim at that point
like a big part of vim is throwing away clunky modifiers for easier to type multi-key bindings
which can also be initialisms for what you're doing to make them easier to remember
I mean I know my keyboard shorcuts, but seems like a nice feature for those who don't
those people should just learn them ngl
well, (imo) it also helps to learn, since, well, it shows the keybind as well
yeah i mean for rarely used code actions, it is quite nice to just be able to .. and start typing what you want to do, ain't no way i'm remembering keybinds for all these random things
i think i'm just a little too used to it returning nothing when it runs out of stuff, so it showing more options that aren't completions threw me for a loop lol
same lol
I mostly just use .var and .field
my brain just autopilots to fixing it with vim keybinds lol, i can't even like manually stop it and tell it to be smarter
on another topic, I might finally be able to publish the mod's source code tomorrow
if I dont decide to rewrite it for the 4th time
also, any feature recommendations? 
I honestly don't get the vim/neovim appeal
though I never really tried it, used vim maybe like two or three times, but for quick edits I just prefer nano
it's an objectively better way to edit text
better than?
all existing methods
imo vim keybindings can be really nice bcs even for longer actions, you can do things like "<space>fmt" or "<space>bp"; i use a lot of initialisms for actions
well you could make an argument for some other modal editors
but like
I mean I can't really compare, but I don't find it difficult to use IJ, VSC, whatever
i do strongly believe modal editors are objectively better than non-modal, once you get used to them (which only takes a few days really)
you don't know what you're missing until you give it a fair shot
maybe, yeah
using nvim is also like
it can do the work of python/bash scripts at times
with some plugins
like doing something massive and reptitive to many files
though ai can help with that
so it's not as big of a benefit
it's also just very nice for refactoring
the way macros are handled in vim is so incredibly smooth and non-intrusive
but it also takes a long time to learn all of its features well
I have seen some people use vim/neovim and yeah, it is quite powerful
like you can learn the basics in a few days but it's probably gonna be a while until you're using macros effortlessly
maybe some day ™
it's also just fun
that's one of the biggest reasons
alongside less hand pain, being able to write things effectively with no mouse
I'm not really up to date with these editors, what are you talking about?
vim
don't have to stay up to date for that one 😂
I dont care about VIM, I thought you were talking about something else 🙂 star mentioned the .. shortcut for IJ
well us mere mortals do
@queen bone dms
What's the stance on comments on code? What's good practice? Is documenting/giving a javadocs comment to every method the ideal?
@cinder flare iz out https://github.com/M0diis/M0-MinecraftDevTools 😩
who that
kami chan is mainly about performance
yeah I know
but there is kami chan extras plus
kami chan is a modpack by some people of the paper team
yeah doesn't seem like its meant for utilities
nor the plus variant
Kami Chan Optimized is purely a performance-oriented modpack, an unopinionated one to that
Kami Chan Optimized Plus used to also have non-performance-oriented mods, more about QoL features like minimap and whatever else idk, but now is abandoned and archived
didnt know it was abandoned
yeah there's a bold red banner on the modpack modrinth page lol
It's more difficult develop a minecraft mod or develop a minecraft plugin?
Depends on what the mod or plugin does, mod can be more complicated due to needing to handle both server and client for certain things
probably a mod
imo a mod but I'm probably biased
mod programming is probably harder but plugins have more constraints that you have to workaround
imo
so it depends what ur doing
I didnt open the plus page
@nocturne apex looks cool but what would you actually use this for?
the registry lib?
Ya
well it is mainly bcs of centralization of some cache. I do have registries of Action types, Economies, Conditions, etc. etc.
Tho am also still trying to make those API accessible, so anyone can still inject their own types.
This is mainly for overall management of the cache without having to use the concurrent hash map, which could cause a kind of overhead in some cases
am just using atomic reference for the registry graph snapshot
which is way lighter
it should b literal ns
I see I see
graph contains literal frozen registries, so they cannot be mutable, but you can unfreeze them, which creates a new snapshot of the map
and Registry object is just a holder of RegistryGraph, which is also frozen and creates a snapshot when unfrozen
it may make some stuff bit harder to achieve due to using extra methods, tho its just an extra safety and still looks quite clean especially while it is a centralized system
and then Ive also made Typed registries using which you can make Class bound registries
@Suppress("UNCHECKED_CAST")
inline fun <reified T : Any> MutableRegistry<Class<*>, FrozenRegistry<String, Action<*>>>.registerAction(
id: String,
action: Action<T>
) {
register<String, Action<*>, Action<T>>(id, action)
}
@Suppress("UNCHECKED_CAST")
inline fun <reified T : Any> MutableRegistry<Class<*>, FrozenRegistry<String, Action<*>>>.registerActions(
map: Map<String, Action<T>>
) {
register<String, Action<*>, Action<T>>(map)
}
@Suppress("UNCHECKED_CAST")
inline fun <reified T : Any> TypedRegistry<String, Action<*>>.getActions(): Map<String, Action<T>> {
return this[T::class.java]?.getAll() as? Map<String, Action<T>> ?: emptyMap()
}
@Suppress("UNCHECKED_CAST")
fun <T : Any> TypedRegistry<String, Action<*>>.getHierarchical(id: String): Action<T>? {
return this.getHierarchical<String, Action<*>, Action<T>>(id)
}
@Suppress("UNCHECKED_CAST")
fun <T : Any> TypedRegistry<String, Action<*>>.getAllHierarchical(): Map<String, Action<T>> {
return this.getAllHierarchical<String, Action<*>, Action<T>>()
}
Ive made extra extensions for my Action & Condition registries
Ive got actions that support different binders, so you can make literal actions for different classes like Player, Entity, etc. etc. can be any class ofc
and using getHierarchical am getting all possible actions that support the Player binder and use the "command" ID
"Hierarchical" is kinda self explanatory
Those are just systems that am using for a few months already in my customer's systems, but never made docs for them, etc. So Ive just separated them from the systems and made them open srced
Thus I always wanted to make some nice and clean Kotlin libs
I also wanna make a lib for generic messages system with MC implementation & translations
Yeah I think the design is cool and immutability focus is based
I just wasn’t really sure what it’d be used for
would or would not? 😄
I meant I dont see any case where I'd use it
I personally would use it

Bruh
quick question devs,
where do you store:
- images
- gifs
cause I've seen a lot of y'all storing the data in database instead of CDN (cloudflare r2 for example)
What's the context/use-case? Like for use in plugin pages, or plugin functionality, etc.
Additionally, are you asking about manually created images or some sort of automated process?
For me, when I'm manually handling a few images for use in a plugin page, I just Imgur it.
not mc related
this is dev general xd
but well it could also help out others, and it's for people to pretty much upload them
like:
user X uploads a gif/image
store it in XYZ place or just store the data in sql
I've never done anything like that so take this with a grain if salt, just my 2¢, if you really wanna DIY it i wouldn't store it in the db itself, I would store it in a file somewhere, then the path to the file and whatever metadata relevant to the file in a db, then anything that uses that file reference the primary key on the other table etc
i know SQL Server allows you to transparently "store" files in it and access them, but it keeps them separate still, all configurable etc, it just makes it transparent, idk about other db engines because I've never had to do anything like that elsewhere
I wouldn't be surprised if pgsql had the same mechanism
in that case it's quite convenient
If its for user uploaded files, I just store it in some sort of s3 like r2 with an id as its name and then store that id in the database.
yeah that's why I said "if you really wanna diy it", otherwise the answer is "you don't, use b2 r2 or s3"
they make fun projects anyway
Depending on how you deploy it just saving it to local FS isn't a bad idea either
most web frameworks will have stuff for storing files nicely iirc
Django has a whole Media files system that automatically keeps track of it with the database/filesystem/s3 stuff, which is super nice
would not recommend storing any more than a few kBs of plaintext in the database, that just makes everything rougher
and if you want local s3, minIO is pretty nice tbh
I just store them in FS, give them a new random name, store their real name, new random name, path, etc. in the database
Also a worse idea would be to store base64 strings
or blobs
store files in blob storage and put the path in a database.
appwrite storage if I am using appwrite otherwise backblaze b2 storage or any object storage db
What's the point of local S3?
I mean instead of local FS
I use S3 for backups as well but that's on a remote server and S3 is a well supported "protocol". If the application is serverless or horizontally scaling then it'd make sense to have a central place for S3 idk
can easily swap it out for another s3 service later
that's what I was thinking, but maintaining s3 (security) or paying off to cloudflare gave me a big ff especially that some people enjoy finding a way to give me a huge bill; and storing to db is just out of the way, I did it once, I still see some websites do it, and I'm not thinking of redoing it as it slows down your whole website, application or anything else, so I was thinking of having 3 different storage providers (appwrite, cloudflare, firebase) to handle it out instead
but idk, I might get questioned as weirdo trying to abuse free tier while my whole point for this is that I'm paranoid that people would abuse and get me suspended for not paying a huge bill
and hosting a minio instance rn isn't that good of an idea especially if for example the project is on a smaller scale
like I know for a fact that we stick with minio for example for almost everything but this is a personal project and there isn't a lot of funds or guarantee it's going to end up working out which is also why I'm taking some precautions
Backblaze is quite affordable for s3 tbf
theres also 10 "universespigot" whatever that is
Didn't know bstats changed design
Also, mine is even less spigot
fr it looks so much nicer now
global stats:
uspigot is based on paper not spigot
the name is misleading

obviously doesnt look as great but it used to look a lot worse with the old bstats theme
love how it says that literally nowhere 😭
could be a fork of forge for all we know 🤣
💀
their faq is not great
oh well
kind of crazy to pay $70 for a product that only gives you an extremely basic faq 🙃
i'm a client, i can forward any feedback you have if you want
Surprise, scam product is a scam
i love how their "feature list" is just
- lightning fast performance
- feature rich
- active community
how does anyone fall for this
So many servers fall for that stuff and honestly it seems to have worked out for some
if they provided literally any details i might be a bit less skeptical
word of mouth afaik
i'd assume the amount of people coming from the website is very low
Rust be like 🤓
To my knowledge it really became popular because of 1.8 support being dropped etc
It did some optimizations and people just liked it
It's a big scan yeah but welp
elaborate on 1.8 support being dropped
Support for it being dropped by paper etc
as a client it's not a scam but i do completely understand the skepticism
I have worked with uspigot lol, it is indeed a scam
could you elaborate? 
lots of work being stolen from other forks, it is not as performant as people say, and simply shady
we switched away from it right away lol
and actually saw performance improvements
when about was this
few months ago
what client/server were you with
UniverseSpigot scammed $50,000 out of my grandma
they're coming for your grandad next
oh.
NDA
but it was decently large
had around 700ish players
mkay

I've seen so many ItemsAdder GH issues that had UniverseSpigot as server...
Anyone here know of any quick way to extract the full list of resource buyers on SpigotMC?
I've got a resource with 15,000 unique buyers which I'm looking to extract (to make a discord verification system) and I hoping to avoid manually going through all 314 pages of buyers. 
For reference, I'm not looking to automate it as such since I know SpigotMC has made that very difficult as I plan to manually add users to the extracted list going forward.
Afaik the best system is parsing PayPal emails but for extracting buyers from Spigot uhh, maybe Selenium automation so you can pass the captcha as it doesn't necessarily use a headless browser
Sadly PayPal transactions isn't an option for me (I don't have the access, also don't know if transaction history will go far back enough) so I'll explore the Selenium route I guess.
