#dev-general
1 messages · Page 507 of 1
hello. does this place have any developers?
anything non development isn't ran in docker lol
no
for development support, #development
i don't need development support. im just looking to hire one
see whats changed
Did discord change nonpfp users to be only purple now?
$ docker -doc lemmo.doc
i mean, it's blurple I think he means
you ever think about different perceptions of colour
How can I know your yellow is my yellow
it could be
Yea, he has a whole video about perception
link
but considering this is a light blue, i doubt it could it be considered purple
Greetings travelers.
🙂
Subscribe to Vsauce: http://bit.ly/POIaN7
Follow Michael Stevens: http://www.twitter.com/tweetsauce
http://facebook.com/VsauceGaming
All music by Jake Chudnow: http://www.youtube.com/jakechudnow
Tommy Edison (Blind guy on YouTube): http://bit.ly/rjyX7q
Color Blindness:
http://www.colourblindawareness.org/colour-blindness/
and
http://colorvis...
😦
don't think I've seen this one
😇
ah
idk where I heard about the perception thing
might've read it somewhere, or it might've just been a shower thought
but it's been in my head
lol
shower thoughts do be the deepest of them all
lol
lol
lol
lol
lol
lol
lol
what is the difference between ```kt
import kotlinx.coroutines.*
fun main(): Unit = runBlocking { // this: CoroutineScope
val job = launch {
repeat(1000) { i ->
println("job: I'm sleeping $i ...")
delay(500L)
}
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!")
job.cancel() // cancels the job
job.join() // waits for job's completion
println("main: Now I can quit.")
}
and kt
import kotlinx.coroutines.*
fun main(): Unit = runBlocking { // this: CoroutineScope
val job = launch {
repeat(1000) { i ->
println("job: I'm sleeping $i ...")
delay(500L)
}
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!")
job.cancel() // cancels the job
println("main: Now I can quit.")
}
since it produces the same output
repeat(1000)
delay(500L)
damn okay
cancel only stops the next continuation from executing, it cant really stop the current task itself, you're creating a new continuation on every delay. so with your delays you are cancelling approximately right after you print and schedule the delay on 3rd repeat, so there isnt anything to join rn, and the child task was scheduled, cancel kills this child task, and since there wasnt anything else to run. it just stops there, join makes sure that execution before the cancelled tasks have finished
wdym continuations?
Spicy callback
^
so it cancels the delay callback/continuation?
It cancells any children from the job you cancelled on
what are the children?
The compilers converts all suspensions to continuations
Why would it?
Join is used to wait if anything that isnt cancellable (currently executing) is running
So you know for sure that job is complete/cancelled completely
cancelling != interrupting/killing/terminating
ohhhhhhhh
that's what I'd think, imagine it like cancelling a BukkitTask, if the task is currently running, it will keep on running until it returns
then the scheduler goes "bruh no this is cancelled, gtfo" the next time it tries to run it
oh so if it's in the middle of printing, it'll wait until that's done, but it won't run delay?
that's what I'd think
bear in mind i have 0 experience with kotlin coroutines lmao
lol
right, I think I've finally decided on a DI framework
and it's not Koin or Guice
guice best
nah this is actually on top
constructor DI 😌
it's like Guice but supports Kotlin much better
it supports field injection as well (though it does say that constructor injection is preferred and this shouldn't be used) in the same way Koin does
it's like the ultimate DI framework
have a read of the wiki, lmk what you guys think of it
the only thing i know about DI is still passing values through constructors ;-;
functional DI 😌
haskell 🤢
@quiet depot maybe you should have a read, you probably know enough about this stuff to determine whether you think it's actually good or not
Shut it loser
☹️
looks very enterprisey
I find a library can really go 2 ways in java
it'll either have your regular, run of the mill names (guice)
or super enterprisey fuck off names (spring)
and honestly, I don't know what half the shit in enterprise means
yeah idk if it's good or not
I'm not reading an entire wiki to determine whether it's good or not either
cancel does nothing to prevent the current coroutine from resuming, you have to make it cancellable
except that after certain coroutines functions, like delay, there's already a check being done for you
yea i know, thats why it stops on delay
dude whose idea was it to make google apps script
my stupid connector literally works perfectly but it says it doesn't on the data studio page but there's no error in the execution log
like wow very helpful
New startup banner ;o
Oo
i absolutely love it
New image too I think
WOAH
Damn
That's SICK
early access program or somethin?
Absolutely SICK
the icon doesn't look good
the icon looks awesome!
Lol
class ServiceModule<T>(provider: KryptonServiceProvider<T>) : Module() {
init {
bind(provider.serviceClass).toInstance(provider.service)
}
}
```got a feeling this is actually gonna be god tier
being able to put these in the root scope and then allowing plugins to inject them
and I can even create plugin-specific bindings (e.g. PluginContext, Logger, etc.) because they can be scoped to that plugin only
Sad
oof
yeah I would update but all the plugins no worky
lol
lol
so I guess ill just be patient until i get a beautiful opening screen and icon
Only 3 so far, material icons, minecraft dev, and gittoolbox
i disabled mc dev and gittoolbox 🤡
the hek is gittoolboz
@InjectConstructor
class MyPlugin(private val server: Server) : Plugin() {
override fun initialize() {
// do things
}
}
```this actually looks kinda cool ngl
got annoyed by all the "edited by dkim19375 at blah" everywhere
what do you guys think of that style of plugin from now on?
dkim I’ve been using guice for longer than I haven’t
I definitely started using guice when I was at ur level of experience
so u can use it too
it’s not that hard
yeah it's not that hard
;-;
Toothpick is slightly more complicated but still pretty simple
Adds git information around the code, like who added each line and when
it's just understanding the encapsulation that may be a little difficult
i don't even know what it does yes i know its some DI library but i thought di is just putting values in constructors
just out of interest btw pig, does Guice support scoping like this?
here’s the tutorial I originally used https://www.spigotmc.org/threads/tutorial-spigot-plugins-dependency-injection.295218/
idk what that means bardy
give me an example
right, so imagine Toothpick like a tree, where the root scope is at the top, and it contains a few sub scopes inside of it
each sub scope is local to a plugin
and the root scope is accessible to all sub scopes
yes
but the sub scopes aren't accessible to the root scope
Toothpicks do come from trees
guice has this
lol
I think the only difference between Toothpick and Guice really then is that Toothpick has better Kotlin support
apart from that, they basically do the same thing
sorry my small brain just understood -6.14% of what you just said
dkim read the guide I linked
its what got me started on a journey of guice greatness
dkim it's literally just a tree
Uh @ocean quartz
is that intentional?
that the jetbrains annotations are set to compile only
Spigot contains annotations, no point in shading it
and the fact that it's 17.0 makes me think it is, since that's the ancient version they use
lol
also tf why do you depend on authlib in a GUI framework
im reading it, isn't it just a singleton handed by Guice
pretty much
Skulls
well, that's the easiest way to describe it
Oh
it's dependency injection but not done by you dkim
@Inject
private Bedwars plugin;
```vs ```java
private Bedwars plugin = Bedwars.getInstance();
```woohoo, we did the same as guice without an entire library
no
no
no
They aren't, they used to last year lol
Oh
bardy when u first started using di libraries
did u struggle to understand that for injections to be honoured, the class using injections had to be instantiated by the di library?
this is the first time I've kinda known what I'm doing when I'm using a DI library
and this is the second time I've ever used a DI library
Use this one, latest and with adventure support #development message
because most people I introduce to di libraries struggle immensely with that concept
nah ik how it works
i guess im not one of the lucky ones 😔
ik that I can give it an instance of something and then ask for that instance and it will annotation scan and inject that instance for me
thanks
lol
and go all why my blah no work
lol
i cba setting up the entire library to avoid using up 3 lines of extra code to make a constructor
ive been looking at examples of guice and i still dont understand how it works
lmao
Ktor, a web application framework for creating connected systems, now comes bundled in IntelliJ IDEA Ultimate.
😮
the difference is you just don’t call constructors manually
you don’t have to keep track of dependencies
guice does it for you
yeah that's the part that takes some getting used to for me
not calling the constructors myself
it’s not
until you learn it...
literally everything you've ever done is confusing until you learn it
stop acting like a child
it really helps keep things clean and separate
Dkim, remember you saying Kotlin was confusing, then you learned it and it wasn't anymore, it applies to basically everything
same with DIing through constructors lmao
I wonder if I should make you able to inject the set of online players 🤔
but in the examples in the spigot page, it uses ```java
@Inject private SimpleCommand command;
Any1 used dagger?
@old wyvern
dkim you can’t inject local variables
To kill people, yes
wait @ocean quartz it didnt seem to work. it says it cant find the dependency
but I’ve never encountered a case where you need to
only issue with that is that I have set a strict requirement for injection: nothing too generic that could have loads of instances
it doesn’t make sense to
Did you add the repository?
implementation("dev.triumphteam:triumph-gui:3.0.0-SNAPSHOT")
maven("https://repo.mattstudios.me/artifactory/")
and i put repo above dependencies
artifactory oof
sometimes i'd need to init instances in order (since theres code in the constructor that depends on other fields)
what
show me an example
mfgui > triumphgui 
generally you don’t want business logic in the constructor
as long as you have no circular dependencies, you are mostly fine
That should be correct hmm
??
triumpgui is the improved mfgui
Lol
guice will make you write code in a different way
where stupid shit like that shouldn’t happen
Better than nexus, doesn't require me to have a load of ram just to put small repositories in
this also means that it can be very difficult to migrate existing projects to guice because the way you write normal code & guice code is radically different
also, the issue with Krypton especially is that we need to instantiate constructors a lot of the time anyway because of the API
so the backend can't really change all that much lol
but it will be very useful on the API's end
yes but, ram wise, they both suck
for low ram usage, https://reposilite.com
Lightweight repository manager for Maven artifacts
it uses like 32MB
im trying to find a plugin that hooks to mcmmo that unlocks a command and let accesible to someone when he reaches mcmmo level 500 for example
is it a thing?
if someone knows smthing that could do that dm me or smthing
bardy check papi 3 if u need any inspiration
Artifactory requires just around 2GB
Also the website looks mmuch better
sir this is dev general
Huh, give me a second let me check something
i hate typescript
ok
working with an api that is not documented to me in my IDE is the worst thing I can imagine
probably better than python
at least python has documentation
@forest pecan Idk if it was something to do with it being snapshot, but i released a temporary version 3.0.0.0 (i know dumb) for you, once i fully release it I'll delete this version
Ok
aww
🥰
so it would be
implementation("dev.triumphteam:triumph-gui:3.0.0.0")
Yeah
then same repo
hm
> Could not find dev.triumphteam:triumph-gui:3.0.0.0.
Searched in the following locations:
- https://repo.maven.apache.org/maven2/dev/triumphteam/triumph-gui/3.0.0.0/triumph-gui-3.0.0.0.pom
- https://hub.spigotmc.org/nexus/content/repositories/snapshots/dev/triumphteam/triumph-gui/3.0.0.0/triumph-gui-3.0.0.0.pom
- https://libraries.minecraft.net/dev/triumphteam/triumph-gui/3.0.0.0/triumph-gui-3.0.0.0.pom
- https://jitpack.io/dev/triumphteam/triumph-gui/3.0.0.0/triumph-gui-3.0.0.0.pom
- https://repo.codemc.org/repository/maven-public/dev/triumphteam/triumph-gui/3.0.0.0/triumph-gui-3.0.0.0.pom
- https://oss.sonatype.org/content/repositories/snapshots/dev/triumphteam/triumph-gui/3.0.0.0/triumph-gui-3.0.0.0.pom
- https://repo.mattstudios.me/artifactory/dev/triumphteam/triumph-gui/3.0.0.0/triumph-gui-3.0.0.0.pom
thats weird
Let me delete from cache and try as well
Ok
Ooooo, i see the issue
It's missing public/ after the artifactory/ in the repository url lmao
Oh
I forgot to add it in the main message xD
stoopid
Yeah
I have suffered with it
idk TS but you can shoot me anyway
get in here
that worked
Nice
Where the fuck do i share my plugin if SpigotMC don't accept plugins based on the Paper API
gotta wait until Hangar comes around
paper forums 🙂 /s
😦
fuck
im not working on this plugin anymore
thats so annoying
now @compact perch is mentioning me telling me im level 18
not in the mood
So, I am working on a JDA implementation for my modularity thingy
What would be better, the JDA instance being this or a separate property?
probably separate property
Is the former even possible?
Hacky but possible, I'd make JdaApplication extend JdaImpl
doesn't seem worth it
man, Toothpick relies on annotation processing, which is gonna introduce a small amount of boilerplate telling people to add kapt and add the toothpick-compiler as a kapt dependency
I might make a Gradle plugin
like ```kotlin
plugins {
id("org.kryptonmc.krypton") version "0.22.1"
}
krypton {
version("0.22.1")
fileName("TestPlugin-${project.version}.jar") // could configure shadow automatically? (would default to that format)
configuration {
name(project.rootProject.name) // Defaults to this
main("me.bardy.plugin.TestPlugin")
version(project.version.toString()) // Defaults to this
description("My description") // optional
authors("BomBardyGamer", "BomBardyGamer") // optional
dependencies("TestCore", "TestExtras") // optional
}
}
Matt you're a lifesaver it works!!!
then that will configure literally everything you need
That's similar to my plugin, but instead of doing main() i annotate the main class and it'll auto find it
Ayy nice!
repositories? ✅
dependencies? ✅
plugin config? ✅
shadow? ✅
kotlin compiler? ✅
e.g. that will do this for you: ```kotlin
plugins {
kotlin("jvm") version "1.5.10"
kotlin("kapt") version "1.5.10"
id("com.github.johnrengelman.shadow") version "7.0.0"
}
repositories {
mavenCentral()
maven("https://libraries.minecraft.net/")
maven("https://repo.bristermitten.me/repository/maven-public/")
}
dependencies {
compileOnly("org.kryptonmc:krypton-api:$apiVersion")
compileOnly(kotlin("stdlib")) // override to stop the Kotlin plugin implementing it and making us shade it
kapt("com.github.stephanenicolas.toothpick:toothpick-compiler:3.1.0")
}
tasks {
withType<KotlinCompile> {
kotlinOptions.jvmTarget = "16"
}
withType<ShadowJar> {
archiveFileName.set(fileName)
}
}
sounds like a good idea, right?
what if i want to do that myself
sounds a little spoopy
or just not use the plugin
yeah, Gradle plugin
I wanna also have it auto-generate the plugin.conf with the options you give it
yeah dkim fuck off
maven lmao
kinda wanna make it implicitly clear that I don't give a fuck about Maven lol
implicitly or explicitly?
Because of the jda builder it won't look as clean as i wanted 😩
extension functions?
Omfg ive been working on this gradle + kotlin module thing for 2 or 3 weeks now and the answer was literally JUST to create a java sources root and put the module-info there... why...
lol
there's this one part of mock frameworks that i'm so confused by - for example, ```kt
when(variable.method()).thenReturn("a")
magic
._.
@prisma wave btw, add to your collection
what... am i looking at?
An image
wow thanks emilyy
oh yea yea
Someone using #showcase to post an image for #general-plugins
oh I thought they were proud of their documentation or something lmao
oh i already got it 😉
Noice
I might actually change the plugin system to make it use Sponge's plugin SPI
seems nicer, and easier to work with on the backend
bardy has recognized his inferiority compared to the Sponge devs
lol
I mean sponge is kinda op ngl
debating whether I like the plugin SPI though
minehraft SPI is the best
is it just me or does intellij only show the "Pull Requests" button sometimes? yesterday it was under the commit button, now it's gone
lol
time to use github.com 😩
what do you guys think btw? should I switch to using a Sponge/Velocity-like plugin loading mechanism or stick with the Bukkit/BungeeCord-like one?
BungeeCord: ```kotlin
class MyPlugin : Plugin() {
override fun onEnable() {
// stuff
}
}
Velocity: ```kotlin
@Plugin(id = "test-plugin", name = "TestPlugin", dependencies = [Dependency("test-core")])
class MyPlugin @Inject constructor(val server: ProxyServer, val logger: Logger) {
init {
// can do stuff here, but Velocity prefers you use the ProxyInitializeEvent
}
}
more like bungeedeath
though with us, instead of @Inject constructor, it would be @InjectConstructor on the class
or I could define my own annotation processor to not even require that annotation at all and just use @Plugin as the marker for this class
anyway, opinions?
teach me how to use toothpick
step 1: open your mouth
step 2: insert toothpick
step 3: slide between teeth
step 4: ???
step 5: profit
which is best for hosting a discord bot:
- CentOS
- Debian
- Fedora (i haven't heard of this before :p)
- Scientific (i haven't heard of this before either)
- Suse (same with this)
- Ubuntu
?
just decided to ask some people that might have more linux knowledge than me 😛
Bytecode fuckery
@half harness simplied slimjar a lot btw,
https://www.github.com/guilds-plugin/Guilds/tree/master/src%2Fmain%2Fjava%2Fme%2Fglaremasters%2Fguilds%2FGuilds.java
Check onLoad
o
and this works with java 16?
That looks great 😌
debian or ubuntu, preferably debian
hmm
CentOS is in the shitter cause Red Hat big dumb, Fedora is the user version of CentOS unfit for servers, OpenSUSE is cool but annoying, and I've never heard of Scientific
debian is where it's at though
it's basically Guice but based around scopes
though people do have hot takes on linux distros
You sure bout that?
Toothpick builds a scope tree
any distro that supports XMonad is perfect 😌
ohhh Xmonad is written in haskell
i was wondering why you liked it, cause I am an i3-gaps man myself
lol
lol
Lol
nice bit of anti-aliasing
yeah i was gonna say, before they invented text anti aliasing
is dependency injection with a framework actually feasible with per plugin class loaders?
or color schemes
with our current setup
why is the default mod key alt
Yes
WHAT
apparently it's actually a lot better than i3, according to clever guy in Dev den
Like unironically
not according to their own getting started page
unless they've never heard of a compositor?
¯\_(ツ)_/¯
according to clever guy in Dev den
BM asking BM:
yeah I went and looked and saw nothing but confusion about what the X windowing system even was
so seems like fake news to me
IT WASNT ME
Oh right
Oh yeah there is a unicorn in the dev den
Must've been Mister Britten
ah Ian Poggers
also what does he plan on doing with his windowing manager
i3 had too much customization for my needs
Ask him yourself
what channel
I use i3 with py3status, works fine for me lol
Uhu uhu BM, you can't hide from us
AAAAAAAA
😂 😂
FAKE
Ok I will look soon
wait hold on a minute
just trying to figure out if I'm smart or not
if you load a class with a class loader, all the classes you loaded with that loader will belong to that loader, right?
Indeed
I need to load the class with the app class loader though and load all the things it needs with my own PluginClassLoader
this is really annoying me
this is confusing
Wat
I basically want to load plugins on their own class loaders, but the DI framework I use uses Class.forName to resolve a generated factory class
and that uses the caller class, so the injection must be called under the context of the plugin class loader
Yes
but how tf do I do that?
Im not sure I understand your question
explain what specifically you don't get
You want to have injections ran in your plugin?
I want to be able to inject stuff into the constructor of a plugin
ah
You would take the deoendencies in it
And then use reflection to find the constructor and invoke it
so I should just ignore the DI framework here then?
since I'm not supposed to invoke an injected constructor myself
that's meant to be the job of the DI framework
also, I can't rely on the order that the injectable things are placed
Toothpick
it's, as the title says right there, a scope tree based DI library, and it uses AP to generate factory classes to use for instantiation rather than using reflection like Guice does
but it tries to resolve the factory classes with Class.forName, which when called with just a string, uses the caller class's class loader to resolve the class from, which is where the error comes from
Why didnt you use dagger instead?
ah so Guice would likely have the same issue here then?
Uh?
Dagger uses class gen
Guice uses reflection and class gen both
I've never had that issue
Guice is runtime classgen as much as possible afaik
ah
Probably
Id assume he needs an intermediary factory class to create it
maybe Guice uses the class loader of the provided class under the hood rather than using Class.forName which uses the caller class
I might just modify Toothpick to use the class loader of the provided object rather than no class loader which defaults to the caller class loader
for that matter you could just make it call either Class.forName(String, boolean, ClassLoader) or ClassLoader#loadClass(String) right?
yeah
aw neat neat
lmao
https://paste.lucyy.me/ubasuyomak#groovy here's the really weird publish thingy
Lucy's Pretty Pastebin
this is nicer than Guice though 😔
proof?
it just looks nicer and feels nicer
especially in Kotlin
yeah fuck this, I'll just use Guice
lmao
Install via cabal install hs-di.
[rating:2.0/3(n=1)]
val pluginClass = loader.loadClass(description.main).asSubclass(Plugin::class.java)
Guice.createInjector(GlobalModule(server), PluginModule(context)).getInstance(pluginClass)
```that should be enough right?
probably
should probably use a child injector here though
create 1 global injector, then a child injector for each pluginmodule
A story of 4 sentences, i love it
4 sentences?
In 4 sentences you completely changed your mind
wdym? like have an injector for the server and then create injectors from that server injector for the plugins?
yes
I've changed my mind about 5 times today
d;guice Injector#createChildInjecotr
Injector createChildInjector(Module... modules)```
Returns a new injector that inherits all state from this injector. All bindings, scopes, interceptors and type converters are inherited -- they are visible to the child injector. Elements of the child injector are not visible to its parent.
Just-in-time bindings created for child injectors will be created in an ancestor injector whenever possible. This allows for scoped instances to be shared between injectors. Use explicit bindings to prevent bindings from being shared with the parent injector.
No key may be bound by both an injector and one of its ancestors. This includes just-in-time bindings. The lone exception is the key for Injector.class, which is bound by each injector to itself.
lol
Ofc, he's the biggest guice lover
i really can't get used to the fact it's pronounced "juice"
same
how do you pronounce it then?
in my mind i say "goo-is".. ish, kinda, yes but not really
I pronounced it like "Guy-ce"
"juice"
you guys are weird
engine x 🌚
I've always pronounced it juice, even before I saw it said it's pronounced juice
English is weird
this reminds me of "gif" vs "jif" lol
Jif makes no sense
even though the creator of the format insists it's pronounced jif not gif
lol
but yeah, he's an idiot
lmao
Context is PluginContext(server=org.kryptonmc.krypton.KryptonServer@36ab5f43, folder=/mnt/windows/Users/callu/IdeaProjects/MineKraft/server-test/plugins/TestPlugin, description=PluginDescriptionFile(name=TestPlugin, main=me.bardy.plugin.TestPlugin, version=0.0.1, description=, authors=[], dependencies=[]), logger=[TestPlugin]:DEBUG in 251a69d7)
Injected server is org.kryptonmc.krypton.KryptonServer@36ab5f43
```omg finally, proper DI
If it's pronounced jif then I'll start saying jift as well
get rid of those ye ass debug messages
maybe you'll get some DI on your server
yeah I will lol
can someone help me read this crash report https://pastebin.com/736Hsft8
also, can someone please explain why IJ likes to complain that asFile doesn't work because java.io.File isn't on the CP
Sir this is dev general
female and kk
bind<PluginContext>().toInstance(context)
bind<Path>().toInstance(context.folder)
bind<PluginDescriptionFile>().toInstance(context.description)
bind<Logger>().toInstance(context.logger)
```probably not a good idea, unless using the child injector here protects me against conflicts
ma'am this is dev general
we dont discriminate
lol thx
you probably want #minecraft
wat
look
.
this is defined in the PluginModule
is it best for me to make them named?
but more importantly tryitandsee
annotatedWith(Names.named(pluginName)) lol
I think that's the workaround
that's what Velocity does iirc
actually no, that's for the global common module's plugin container instances
ah, Velocity uses a per plugin injector
so it uses Guice.createInjector per plugin
oh thats how ive always pronounced it
Pretty simple, non native English speakers wouldn't pronounce it as juice while natives would
oh
Wait what?
?
Isnt it supposed to actually be juice?
yes?
Juice has always been the most natural sounding pronunciation to me
U still updating DeluxeChat?
yes
i am personally updating it
last dev build seems to have been a month or 2 ago
so
lol
I'm finally removing the need to always provide the plugin context as a parameter to pass it to the super class
bit hacky on the backend having to use a map and a contextOf function but works fine lol
class TestPlugin @Inject constructor(commandManager: CommandManager) : Plugin() {
init {
commandManager.register(TestCommand())
}
}
```😌
where are dev builds?
And where are u updating it
could probably have Plugin be an interface now
he's messing with you btw
He's not updating it, you can find the dev builds if you head to #spigot-linking then #deluxechat
how 2 do that
^^
BM smh, that's just as bad as sending your wiki
what
ok done
pinned message in #deluxechat
#dev-general message this
smh
okay
that was possibly not good
but i gave a serious response afterwards
so
Ask the questions in #deluxechat
wonder if it's worth trying to make commands properly injectable or not
https://github.com/copper-leaf/kodiak okay well I just found something kinda cool
@quiet depot maybe you could look in to this, might be useful for multiplatform support, since it supports turning 4 different formats into the same JSON structure
are u implying that u pronounce GUI as gui
like gooey?
Mhm
😫
Oh nice
are you implying that you pronounce GIF as gif?
appending now works on 16 if you dont want to use isolated
mhm
I've known that for a while, implemented it once but it was a fuckmess
so i just gave up
Lol
lol
I referenced some work from openjpa
It does something similar with agents to get the intrumentation instance
ic
yes
imagine being one of those that pronounces GUI as "gooey" though amirite
yeah
man, the dev branch has so many breaking changes that I'm probably gonna merge in about 5 mins or so
I can't look at that pronunciation without remembering this song lmao
https://www.youtube.com/watch?v=jeo3an2M_Lo
DREAMLAND IS HERE. IT’S YOURS NOW. I’m feeling somewhere between absolute terror & super excitement. I really hope you enjoy it. can grab a copy / listen here: https://GlassAnimals.lnk.to/DreamlandAlbumYT
Instagram: https://www.instagram.com/glassanimals
Facebook: https://www.facebook.com/glassanimals/
Twitter: https://twitter.com/GlassAnimals
...

Lmao
oh jeez
You talking alone? lol
Why are you sending and deleting messages
resolved issue, and i deleted it because no one responded, assumed no one saw it so acting like nothing happened :))
Why are you sending and deleting messages
Matt, let's be realistic, it's dkim we're talking about
Fair
☹️
IJ without material icons is so ugly 😩
I use legacy icons
@obtuse gale I require your assistance 😩
Do you use https://github.com/hierynomus/license-gradle-plugin with gradle 7?
Ah, damn docs
yeah had to find that one out myself :P
why do you use double slash?
Fair
I'm not much of a block comment in general though
unless I want to comment out a specific section within a line
which isn't really a matter of taste either in that case
i use it there because I have to x)
Oh yeah, totally
Was just curious ;p
interrupted only by myself... procrastination 😔
classic communists
Lmao
what is that?
what is Continuation#suspendCoroutine? Curious because BM uses it and theres no much info (that i could find online) about it - https://github.com/TheDeveloperDen/DevDenBot/blob/master/src/main/kotlin/me/bristermitten/devdenbot/extensions/RestActions.kt
/**
* Obtains the current continuation instance inside suspend functions and suspends
* the currently running coroutine.
*
* In this function both [Continuation.resume] and [Continuation.resumeWithException] can be used either synchronously in
* the same stack-frame where the suspension function is run or asynchronously later in the same thread or
* from a different thread of execution. Subsequent invocation of any resume function will produce an [IllegalStateException].
*/
```and uh... i don't really get what this means
lmao
- what is a continuation:
Interface representing a continuation after a suspension point that returns a value of typeT.- what is a suspension point
- what is a stack frame
- "Subsequent invocation of any resume function will produce an IllegalStateException" what does this mean?
From what I understand basically if two coroutines are running on the same thread it'll be sequential, which means it can block it, when you suspend the coroutine it'll no longer block that thread
uhh
:))
wdym?
wait
oh
woat
Rollercoaster of emotions there
Discord just made my ping counter say 7 (on mobile) but I've gotten no new pings... I hate seeing that icon and not being able to fix it
Is there an easy way to convert a project to a multi module project and rename the original module?
@half harness probably a bit late to the party, but imagine coroutines as just a mess of callbacks. Every suspending function takes a continuation as an argument, which denotes where it should call back to after the execution of that function is complete.
Yeah continuations are spicy callbacks
is dkim doing guice yet
Coroutines are subroutines that can be suspended and resumed at any time, and the benefit to them is that the dispatcher can switch contexts with pretty much 0 overheas
Oh btw pig, Krypton uses Guice now :)
And also, did you see my ping?
Yeah
I had a look then forgot
I tried using it yesterday, was a bit annoying to get setup with, and the wiki is very under documented, but I think it works well once setup
It can turn 4 different documentation formats into the same JSON format
So you can say goodbye JSoup lol
don't think this solves the docdex problem
what is the DocDex problem?
well just the problem of implementing different doc formats
although I'll definitely have a look at the common format they're using
because I can probably steal that
Yeah lol
NBT serialization is a pain in the ass, I swear https://paste.helpch.at/qajiciqevo.yml (the format used by shopguiplus) https://paste.helpch.at/ifazinuzuf.kt
jesus fuck
That first one looks about right
Actual NBT is pure binary
The Minecraft Development plugin has a really good way of rendering NBT
Oh btw, how much do you guys think the Krypton API should have before I officially release 1.0 and remove the ability to make breaking changes to it
Interesting, but I guess it can read only .nbt files or whatever, right?
I need this for items
Is there an easy way to convert a project to a multi module project and rename the original module?
Yes
Create the modules you want, and just change the rootProject name in your settings.gradle
Just keep it on version 0.x indefinitely 
so do i need to make a new module as the root project? Cos I dont want the new modules to be inside the existing one
Nah, you can make modules anyway you want
dont they all nbeed to be inside a root module?
I'd focus on making the server actually work before releasing api, etc, lol
The root module is the project, so yes
does that normally have its own build.gradle and stuff like that?
idk if a multi module project is the best way either, basically there are 2 different things in the thing im making, theres the thing that runs on all the individual devices, and theres a admin website that runs on a host machine to configure everything,
I also need the website to be easy to setup in the first place, so idk if id need to make like an installer or smthn weird for the website
What's the differences:kt fun main() = runBlocking { blah } vskt fun main() = runBlocking { coroutineScope { blah } } vskt fun main() = runBlocking { coroutineScope { launch { blah } } } vskt fun main() = runBlocking { launch { blah } }
In this specific case basically no difference, since it's just one thing running, so doesn't matter how it is running
It would be a lot different if you added more to it
alright
what does coroutineScope do? Apparently kt fun main() { runBlocking { coroutineScope { delay(100L) println("a") } println("test") launch { println("blah") } } } and ```kt
fun main() {
runBlocking {
delay(100L)
println("a")
println("test")
launch {
println("blah")
}
}
}
Because you're running it blocking
The coroutineScope is to decide in which scope it should lunch the coroutine
wdym?
what would i have to do to make coroutineScope do something?
Wdym "do something"?
like here it prints the same thing
Because you're blocking
What do you want it to do?
see what coroutineScope does, and when I should use it
Youd normally only use it to get the scope in a suspend function
Otherwise you dont get the scope extensions
Dkim, the coroutineScope is just a scope, it's for you to launch coroutines etc
oh
Thats a different one matt
i see
these stickers get worse and worse
Ikr
Arent they paid now?
idk
Is this (basically) the same: kt fun main() { runBlocking { println("test") } } and ```kt
fun main() {
runBlocking {
launch {
println("test")
}
}
}
(nothing under & above launch)
Result wise, yes. What you're doing? no
alr
You're launching another task into the scope in the second one
mhm, so if i do delay() in launch, it won't affect outside of that launch? correct?
Yes
yES im finally understanding coroutines 🎉

lol
lol
Consumption of Oxygen is illegal and a punishable offense.
lol
As an easier way to view it
coroutineScope {
println("a")
launch {
delay(20L)
println("b")
}
println("c")
}
Would be the "same" as bukkit's
println("a")
Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, Runable {
println("b")
}, 20L)
println("c")
project.buildscript.dependencies.add("classpath", "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.10")
project.pluginManager.apply("org.jetbrains.kotlin.jvm")
is this how you're meant to add dependencies within plugins?
oooooo0000000oooooooo so launch just makes a new task/thingy
currently working on Krypton Gradle, and I wanna auto-add the Kotlin and Shadow plugins
Don't do that, it won't work correctly
what should I do instead?
usually we have a CoroutineScope(Dispatchers.Default/IO) somewhere, dkim, to provide the scope needed to launch a coroutine
Project#dependencies#add
Require people to do it, like hard depend or something
When a plugin applies an external plugin, it's just a pain in the ass, trust me, i tried adding shadow
ah yeah, that looks like it'll work
😌
that's just extra boilerplate I kinda don't really want though
guess it's not bad though, since then you can add the plugin yourself and customise the version
I definitely wanna set the API and the stdlib as compileOnly dependencies by default though
and I want that compileOnly for the stdlib to override the Kotlin plugin's one
what would the configuration name be btw?
compile classpath?
wait are you trying to add plugins? or just dependencies?
if plugins ^
alright
Having the plugin add another plugin was pretty buggy
Sometimes it worked, sometimes it didnt
adding the stdlib manually and overriding the plugin's version shouldn't be hard though right?
that won't exactly work for the Kotlin plugin or Shadow, since they're not built-ins
I'd need to add the dependency to the buildscript classpath first
ah yeah
Hello
hello obama
hello obama
Hello Kaliber and Yugi
hello trump
hello biden
In what?
That is a shame
I am very sorry to hear that dkim19375_02
☹️
Have you considered joining the US Army of the United States of America
That might be easier than Hypixel
🤨
🤨
That is not true
Prove it
What's Obama's last name
barack is his last name
It's Donald
Obama Donald?
Yes
you almost hit the officier
anyone know how to configure KotlinCompile from within an external plugin?
looked everywhere and can't find anything, and I can't access that class from within code
Barack Hussein Obama II
@serene cave @dusk holly Greetings, fellow presidents!
what in the fuck
Not mine
about 211 years old
i cannot believe this
u are all presidents at the same time 
I am the best
Ah, the presidents are back on top
That's a shame
We shall now lead helpchat to victory the same way as we led the americans through the civil war
😮 Another one
of the 3 presidents
Hello @minor oracle
trump does not wish to oblige 😔
😔
Cowardly trupm
thats one for the album
absolutely
Seems like someone wasnt ready to take on the responsibility
Greetings. fellow citizen.
what
he is always hiding from responsobiltiles!
probably playing golf
Hello my robotic citizen
trump does love his golf after all
@prisma wave is this worthy enough to be in the helpchat iforgotwhatitscalled
admins appear offline
way ahead of you
Goodbye dkim19375_02
Goodbye dkim19375_02
Have a nice day citizen
Farewell dkim
Our wonderful robotic friend is here as well. What a great day!
I nominate Barry#7877 for a presidental award
I second that nomination
wow Barry is president too
A robot for president, that's got some serious ramifications, Mr. Obama.
I resigned, I had a good run
Good
Great
Yes I do not think a robot president is a good idea, Mr Lincoln
It could be devastating for our society
This robot could start a war in a second
For reference: Avengers Age of Ultron (2015)
Robots do not know what is best for humanity
We do
Does Lincoln truly understand the ramifications of a robotic president? I fear his knowledge may be lacking due to the time he came from
lol
