02:19 < ws-client> For someone big on compatibility I sometimes have the feeling you want to break teeworlds compatibility just for the sake of it @heinrich5991 02:19 < ws-client> Every time I mention doing something the same way as teeworlds you shutdown and argue against me. 02:20 < ws-client> When I proposed to switch to standardized json for auto mappers like teeworlds does it you declined the proposal. 02:20 < ws-client> When I proposed the colored broadcast format from 0.7 you requested to not do it like teeworlds but use something more standardized like html. 02:56 < bridge> Agreed, too biased 02:59 < bridge> based 04:08 < bridge> whats the benefit of json for automappers btw 04:08 < bridge> why was it changed 04:10 < bridge> idk why it was changed but the benefit is that json is a standardized format. So you can work on it with existing tooling. Parse it with code using existing libraries. Have syntax highlight in your editor. Lint it with json checkers. 07:04 < bridge> gm 07:50 < bridge> https://github.com/BurntSushi/jiff 08:09 < bridge> but tbh the bench look sus, last time i did them they didnt optimize the loops away, seems like rust/llvm also improved in the last 1.5 years ^^ 08:11 < bridge> using something else than UTC except for UI display always sucks 08:11 < bridge> change my mind 😬 08:12 < bridge> it's just always trouble to think about timezones and shit xD 08:12 < bridge> and on UI display u can often simply do "to_system_time" 08:14 < bridge> storing time in future is pain :pepeW: 08:15 < bridge> when do you work on std::time module for your language 08:15 < bridge> we don't need time 😬 08:15 < bridge> tru 08:58 < bridge> but tbh the bench look sus, last time i did them they didnt optimize the loops away, seems like rust/llvm also improved in the last 1.5 years ^^ (should try playing around with black_box) 09:20 < bridge> @ryozuki have you ever seriously worked with the black_box function? 09:21 < bridge> hi jupstar 09:22 < bridge> ye 09:23 < bridge> i have to say i find it bit hard to directly understand wtf it is doing: 09:23 < bridge> 09:23 < bridge> e.g. 09:23 < bridge> ```rust 09:23 < bridge> 09:23 < bridge> let _ = std::hint::black_box(v); 09:23 < bridge> ``` 09:23 < bridge> 09:24 < bridge> vs 09:24 < bridge> 09:24 < bridge> ```rust 09:24 < bridge> let a = v; std::hint::black_box(a); 09:24 < bridge> ``` 09:24 < bridge> 09:24 < bridge> already produces significantly different results xD (ran it a few times only tho) 09:24 < bridge> 09:24 < bridge> ``` 09:24 < bridge> #iterate 09:24 < bridge> indexmap took 61ns: 09:24 < bridge> vec took 80ns: 09:24 < bridge> hashmap took 251ns: 09:24 < bridge> linked-hashmap took 141ns: 09:24 < bridge> fx hashmap took 240ns: 09:24 < bridge> indexmap (values only) took 80ns: 09:24 < bridge> linked-hashmap (with view) took 130ns: 09:24 < bridge> linked-hashmap (values only) took 120ns: 09:24 < bridge> fx hashmap (values only) took 190ns: 09:24 < bridge> ``` 09:24 < bridge> 09:24 < bridge> vs 09:24 < bridge> 09:24 < bridge> i have to say i find it bit hard to directly understand wtf it is doing: 09:24 < bridge> 09:24 < bridge> e.g. 09:24 < bridge> ```rust 09:24 < bridge> 09:24 < bridge> let _ = std::hint::black_box(v); 09:24 < bridge> ``` 09:24 < bridge> 09:25 < bridge> vs 09:25 < bridge> 09:25 < bridge> ```rust 09:25 < bridge> let a = v; std::hint::black_box(a); 09:25 < bridge> ``` 09:25 < bridge> 09:25 < bridge> already produces significantly different results xD (ran it a few times only tho) 09:25 < bridge> 09:25 < bridge> ``` 09:25 < bridge> #iterate 09:25 < bridge> indexmap took 131ns: 09:25 < bridge> vec took 120ns: 09:25 < bridge> hashmap took 340ns: 09:25 < bridge> linked-hashmap took 230ns: 09:25 < bridge> i have to say i find it bit hard to directly understand wtf it is doing: 09:25 < bridge> 09:25 < bridge> e.g. 09:25 < bridge> ```rust 09:25 < bridge> hello pro 09:26 < bridge> how are u pro 09:26 < bridge> I'm fine and you pro 09:27 < bridge> alright 09:27 < bridge> about to set up windows manager some more 09:48 < bridge> gm pros 09:48 < bridge> Is it atleast consistent that one is significantly slower? You probably should run this in a loop and take the mean until the mean stabilizes 09:51 < bridge> i ran it few times and the times are always similar, so yes one was slower 09:51 < bridge> and actually i'd have thought the second should be slower if at all 09:52 < bridge> that confuses me additionally... but maybe it's about that the second is not used as a result and stays unused or smth xd 09:53 < bridge> https://github.com/llvm/llvm-project/pull/84453 09:53 < bridge> epyc 09:53 < bridge> @learath2 have u ever analyzed cache misses and got any information out of it? 09:53 < bridge> i now know tablegen 09:53 < bridge> like actually improved stuff with the knowledge 09:53 < bridge> epyc coder moment 09:54 < bridge> Only once while messing around with trying to optimize ban lookups 09:55 < bridge> I didn’t exactly get better code but it made me understand why a certain idea that seemed promising performed like shit 😄 09:59 < bridge> Ah, the second one is completely wrong that’s why. You need to use a value that is blackboxed. In the second one you just black box sth then you do nothing with it 10:00 < bridge> sure but shouldnt black box still return the var volatile? 10:00 < bridge> You just discard what it returns 10:00 < bridge> in the first i also don't do anything with the result xD 10:00 < bridge> let _ = is easily a discard 10:01 < bridge> The assignment has to be done for the first one because the compiler probably can’t assume anything about _ even though it’s a discard label 10:38 < bridge> I don't know why they don't perform the same 10:38 < bridge> the first one drops `v` 10:38 < bridge> the second one moves `v` into `a` and then drops `a` 10:39 < bridge> I woulld have thought that it optimizes to the same code 11:23 < bridge> I'm guessing it simply can't drop v immediately because of some quirk of black_box that's not exactly intuitive 11:24 < bridge> To test my hypothesis I would just copy paste that line over and over. It should get worse and worse 11:29 < bridge> i'll leave it for now anyway. 11:29 < bridge> I have to focus on other things than micro benchmarks for now. 11:29 < bridge> 11:29 < bridge> But someday i want to watch a stream of @learath2 showing all tricks to find bottlenecks on linux. 11:29 < bridge> Be it over sampling for a certain amount of time, or benching the whole app or finding cache misses xdd 11:29 < bridge> 11:29 < bridge> I tried so many tools but never really found something insanely useful and often they are not really intuitive or easy to use 😄 11:29 < bridge> Perf is my beloved 11:42 < bridge> show code 11:42 < bridge> of how u use it 11:42 < bridge> more context 11:42 < bridge> black box is mainly to not let compiler inline and const propagate 11:42 < bridge> it just inside a iter().for_each 11:43 < bridge> why dont u put it in godbolt 11:43 < bridge> i am too lazy for now xd 11:43 < bridge> but ultimately, as the path says, its a hint 11:43 < bridge> yeah 11:43 < bridge> was just surprised 11:44 < bridge> maybe llvm dev ryo would be like: 11:44 < bridge> that is expected 11:44 < bridge> pew pew 11:44 < bridge> v is not copy right? 11:45 < bridge> yeah it's a reference 11:49 < bridge> @jupeyy_keks https://godbolt.org/z/W3nrW6Khc 11:49 < bridge> am i doing it correct? 11:49 < bridge> looks the same xd 11:49 < bridge> missing context 11:49 < bridge> yes 11:56 < bridge> @jupeyy_keks can you try `black_box(&result)` instead? 12:05 < bridge> it doesnt do a copy refering the ghost code in my editor if that is your assumption 12:06 < bridge> not sure if I understand you. `black_box(result)` has to move `result` around 12:06 < bridge> `black_box(&result)` doesn't have to do that 12:07 < bridge> but what is result in your example 12:07 < bridge> iter().for_each() gives a ref 12:07 < bridge> `let _ = hint::black_box(&v);` 12:07 < bridge> i never deref it 12:08 < bridge> ah 12:08 < bridge> but in any case, maybe i got simply unlucky and got a bad cpu core 12:08 < bridge> the bench results alter too heavily 12:08 < bridge> dont want to do science rn xd 12:09 < bridge> i keep fx hashmap in mind if i ever have a bottleneck in std hashmap 12:09 < bridge> and vec whenever possible 12:10 < bridge> and linked hashmap when i need OG data structure 12:10 < bridge> there's a difference between std hashmap and fx hashmap 12:10 < bridge> only thing i really hate about hashmaps is that their order is random 12:10 < bridge> std hashmap is resilient against evil data 12:10 < bridge> fx hashmap can suffer catastrophic slowdowns on evil data 12:10 < bridge> AFAIK 12:11 < bridge> not sure about linked hashmap 12:11 < bridge> and std hashmap does it by using some kind of RNG? 12:11 < bridge> i once read about that 12:12 < bridge> also the reason the order is never constant for a std hashmap 12:12 < bridge> it uses an RNG and a hash function that is resistant 12:13 < bridge> @heinrich5991 by the way, how is quic doin? 12:13 < bridge> got sidetracked into backcompat stuff 😦 12:13 < bridge> i see 12:13 < bridge> currently improving libtw2 support for extended items in snapshots 12:13 < bridge> hopefull that's the last thing necessary 12:13 < bridge> hopefully that's the last thing necessary 12:14 < bridge> already thought about master server integration? 12:15 < bridge> of quic? yes 12:15 < bridge> i wonder if we could also create certificates by the master server for quic servers somehow. 12:15 < bridge> 12:15 < bridge> it's at least partially a problem that you have to be part of the server list rn 😄 12:16 < bridge> but i also don't want to have servers to require certbots and stuff just to run 12:16 < bridge> yes, me too 12:16 < bridge> but requiring the public key of the server to connect sounds sane to me 12:16 < bridge> you can either get it from the mastersrv, or from your server hoster directly 12:17 < bridge> (it's printed in the server console) 12:17 < bridge> > server hoster directly 12:17 < bridge> > 12:17 < bridge> over https or what 12:17 < bridge> e.g. `ddnet-17+quic://127.0.0.1:8303#yourpublickeygoeshere` 12:17 < bridge> 127.0.0.1:8303 is not a DDraceNetwork or Community server. 12:17 < bridge> it's just part of the address 12:17 < bridge> e.g. `ddnet-17+quic://127.0.0.1:8303#severpublickeygoeshere` 12:17 < bridge> 127.0.0.1:8303 is not a DDraceNetwork or Community server. 12:17 < bridge> e.g. `ddnet-17+quic://127.0.0.1:8303#serverpublickeygoeshere` 12:17 < bridge> 127.0.0.1:8303 is not a DDraceNetwork or Community server. 12:18 < bridge> i dunno if i like that 12:18 < bridge> that sounds to easy to alter 12:18 < bridge> altered by who? 12:18 < bridge> well by an attacker 12:19 < bridge> if he sends it to you 12:19 < bridge> what can the attacker do? they can send you an arbitrary IP address and an arbitrary public key 12:19 < bridge> > server hoster directly 12:19 < bridge> 12:19 < bridge> ^ talking about this way 12:19 < bridge> previously, they person could already send you to an arbitrary IP address 12:20 < bridge> so the new thing is that they could change the key 12:20 < bridge> if they're on your network path, then they could pretend to be the correct server IP address but with the wrong public key 12:20 < bridge> yep 12:20 < bridge> if they're on your network path, then they could pretend to be a server with a known IP address but with the wrong public key 12:20 < bridge> on public wifi they could do MITM i'd say 12:21 < bridge> or some internet they control 12:21 < bridge> if you verify the IP address to be legitimate 12:21 < bridge> if the victim verifies the IP address to be legitimate 12:21 < bridge> otherwise the attacker could just send a wrong IP address 12:22 < bridge> but how does he verify that? 12:22 < bridge> if the attacker controls the routing 12:22 < bridge> yeye, I mean this is only an attack if the victim verifies the IP address to be legitimate 12:23 < bridge> ah ok 12:23 < bridge> otherwise the attacker could have just sent the victim to another IP address that the attacker controls directly, with no network access necessary 12:36 < bridge> i defs wonder how secure servers, that for example are not part of a community, are anyway 12:37 < bridge> the master server also only uses the IP of the https connection i guess 12:38 < bridge> or even without registering, maybe ppl still get scammed for connecting to a fake ddnet server 12:40 < bridge> but my idea kinda was the master server creates certificates for any server that wants one (by ip and the request's public key) 12:40 < bridge> 12:40 < bridge> then the client could verify that the server is real without requiring it in the URL 12:45 < bridge> reinventing the cert bot lmao 12:45 < bridge> just unsafer and no domains 12:50 < bridge> I found something cool, `git worktree add` you can check out any branch you want as a separate folder without disturbing your current work 13:01 < bridge> yea, I often use this 13:02 < bridge> idk what this adds, if the attacker owns the ip, he can get a certificate for it, if the attacker doesn't own the ip, what good is getting a client to route to it traffic that it can't even decrypt? 13:02 < bridge> it'd allow the client to connect to bare IPs 13:03 < bridge> this is assuming the masterserver's internet connction is more securer than the client's 13:03 < bridge> which isn't entirely unreasonable, but we currently use proxies for the masterserver which could intercept these requests 13:09 < bridge> Oh wait, I did not know quic would come with no connecting to bare ips anymore clause 😄 13:09 < bridge> the only problem is to verify that the server's public key belongs to it 13:10 < bridge> you can connect to bare IPs together with a pubkey in my scenario 13:10 < bridge> you can connect to bare IPs together with a pubkey in my impl 13:10 < bridge> Well ips I can type, pubkeys would be pretty challenging 13:11 < bridge> where do you get the IP address from? 13:11 < bridge> can you also copy-paste the pubkey from there? 13:11 < bridge> you could at least not say them out loud in teamspeak/dc anymore 😂 13:11 < bridge> ^^ 13:12 < bridge> I was planning to make the client fetch the public key from the mastersrv if the server is in the list 13:12 < bridge> but wouldn't work for local servers 13:12 < bridge> the LAN tab is also an open challenge 13:13 < bridge> How is this handled in the wild with other QUIC stuff? 13:13 < bridge> certificates 13:13 < bridge> publicly trusted certificates 13:13 < bridge> the server could be part of the client's process 13:13 < bridge> Local servers and LAN I would honestly just allow to be insecure, but I don't even know if QUIC is allowed to not be secure 13:13 < bridge> ok only for a local server 13:14 < bridge> the problem is that a local attacker could fake an online server into the server list ^^ 13:14 < bridge> the question is how secure our traffic must be anyway 13:14 < bridge> I'd try to make it as secure as possible, without compromising on usability too much 13:14 < bridge> e.g. it's very nice that chat will become encrypted using this 13:15 < bridge> client auth is defs neat for making sure rcon and stuff is secure 13:15 < bridge> How? I assume local servers would be in a reserved ip range. How could one register a server that appears to be from one of those? 13:16 < bridge> I guess the client could try to figure out the local network range and only allow servers from there 13:16 < bridge> sounds kinda tricky though 13:19 < bridge> Why is the masterserver allowing any reserved range to register? How is this attacker passing the challenge with a reserved ip? 13:20 < bridge> the victim sends a broadcast on the LAN. the attacker sends a packet back from 176.9.114.238 (ger2.ddnet.org) with their own public key. the client connects to 176.9.114.238 but with the wrong public key 13:20 < bridge> How is his packet even making it to us? I thought we were using the ip from the https connection 13:20 < bridge> the attacker intercepts the packets and has their own server 13:21 < bridge> I see 13:30 < bridge> ChillerDragon: have you ever tried https://github.com/Nheko-Reborn/nheko? 13:30 < bridge> ChillerDragon: have you ever tried ? 13:31 < bridge> i have it installed 13:31 < bridge> ChillerDragon: have you ever tried https://github.com/Nheko-Reborn/nheko ? 13:31 < bridge> ChillerDragon: have you ever tried https://github.com/Nheko-Reborn/nheko ? 13:31 < bridge> Is it good? :o 13:31 < bridge> it's fast 13:31 < bridge> looks similar to telegram 13:31 < bridge> oki thx 13:32 < bridge> if u want to use the search function in matrix, this client gives it to you at good speed 13:32 < bridge> all other clients take ages to decrypt older messages 13:32 < bridge> horrible experience xd 14:53 < bridge> today im getting my car 14:53 < bridge> :owo: 14:53 < bridge> gg 14:53 < bridge> whic 14:54 < bridge> i already said before but its volkswagen tcross 14:54 < bridge> inb4 critics 14:54 < bridge> xd 14:54 < bridge> from 2019 14:54 < bridge> das auto 14:54 < bridge> german engineering kek 14:54 < bridge> best engineering kek 14:54 < bridge> it has 46km 14:54 < bridge> i got it for 20k€ 14:54 < bridge> k 14:54 < bridge> ? 14:54 < bridge> second hand 14:54 < bridge> 46k or literally 46 14:55 < bridge> 46k km 14:55 < bridge> sorry 14:55 < bridge> xd 14:55 < bridge> ah 14:55 < bridge> im dumb 14:55 < bridge> xd 14:55 < bridge> xd 14:55 < bridge> 46 Mm :p 14:55 < bridge> that's very good tho 14:55 < bridge> ye 14:55 < bridge> its also fully equiped 14:55 < bridge> seat heating? 14:55 < bridge> ok idk about that 14:55 < bridge> xd 14:55 < bridge> it's so op in winter 14:55 < bridge> but 14:55 < bridge> i didnt know that existed 14:55 < bridge> what i really want for the first 5 minutes of driving in winter: steering wheel heater xdxd 14:56 < bridge> xd 14:56 < bridge> it exsists 14:56 < bridge> especially on motorcycles 14:56 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1264929058878390353/image.png?ex=669fa87c&is=669e56fc&hm=cfcb1e8fbd7e5ea9b0740a6cc1d1f389acd7b1192393425cd6a2f4619cdcf21f& 14:56 < bridge> this video shows this 14:56 < bridge> never had seat heating 14:56 < bridge> ??? 14:56 < bridge> so it probs has 14:56 < bridge> e 14:56 < bridge> ye 14:56 < bridge> i never had cars bro 14:56 < bridge> xd 14:56 < bridge> aaaa 14:56 < bridge> my first 14:56 < bridge> bro 14:56 < bridge> @ryozuki isnt barcelona super cool bcs it closes roads to let ppl play there instead of cars driving around 14:56 < bridge> seat heating is OP 14:56 < bridge> bruder 14:56 < bridge> boomer 14:57 < bridge> bruder 14:57 < bridge> ye on weekends in some places 14:57 < bridge> but main roads are open 14:57 < bridge> bruder matthäus 14:57 < bridge> i also think this car can drive in center barcelona 14:57 < bridge> because there is a law that high emission cars cant 14:57 < bridge> :o 14:58 < bridge> yea german car from 2019 should be fine 14:58 < bridge> https://www.zbe.barcelona/en/zones-baixes-emissions/vehicles-afectats.html 14:58 < bridge> > General information 14:58 < bridge> > 14:58 < bridge> > The vehicle categories affected by this restriction will be light vehicles including motorcycles and mopeds (L), cars (M1) without an environmental label: 14:58 < bridge> > 14:58 < bridge> > Pre-Euro 3 standard petrol cars (M1) (usually with pre-2000 license plates) and pre-Euro 4 standard diesel cars (with pre-2005 or 2006 license plates). 14:58 < bridge> > Pre-Euro 2 motorcycles and mopeds (category L) (usually with pre-2003 license plates). 14:58 < bridge> > From the 1 April 2021, pre-Euro 3 standard petrol vans (category N1) (usually with pre-2000 license plates) and pre-Euro 4 standard diesel vans (with pre-2005 or 2006 license plates). 14:58 < bridge> > From the 1 January 2022, pre-Euro 4 standard lorries (category N2 and N3) and light buses (M2) (usually with pre-2006 or 2007 license plates). 14:58 < bridge> > From the 1 July 2022, pre-Euro 4 standard heavier buses and coaches (M3) (usually with pre-2006 or 2007 license plates). 14:58 < bridge> yea 14:58 < bridge> even my 2011 audi has euro 4 or 5 14:58 < bridge> german cars are great at emission tests https://en.wikipedia.org/wiki/Volkswagen_emissions_scandal 14:58 < bridge> wait 14:58 < bridge> 😬 14:59 < bridge> 😬 14:59 < bridge> XD 14:59 < bridge> was just about to say "ur not referring to the scandal right?2 14:59 < bridge> was just about to say "ur not referring to the scandal right?" 14:59 < bridge> my parents have an EV, which i drove a few times. but i'd say generally you dont need a car if you only drive inside your city 14:59 < bridge> https://tenor.com/view/padme-gif-24474700 15:00 < bridge> apparently it has 115 g/km co2 15:00 < bridge> tja 15:01 < bridge> "tja" 15:01 < bridge> tja tja 15:02 < bridge> the world is burning hard 15:02 < bridge> :thonk: 15:02 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1264930567711883417/main-qimg-0a24b5b3d899ffdd051a1a93834277c6.png?ex=669fa9e4&is=669e5864&hm=f0cb122428a3969e6319ab5c5c679e39d5c996e27c6469fd1628e8211dc7d21c& 15:02 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1264930592760402001/83503041_3568805749827217_1958679973749325824_n.png?ex=669fa9ea&is=669e586a&hm=22b4b0d77584c4c050581604fe474123f7d2b593e721eccff1a64fa6e25d1022& 15:02 < bridge> yes 15:02 < bridge> that sums it up perfectly 15:02 < bridge> bcs i literally use it like that xD 15:03 < bridge> dictionary says "oh well" or "well" 15:03 < bridge> epyc meme moment 15:03 < bridge> What about naja? 15:03 < bridge> how do u pronounce tja? 15:03 < bridge> it sounds hard in spanish 15:03 < bridge> that is, when you think you are more clever than someone else 15:03 < bridge> like ja with a t 15:03 < bridge> but ja like a german says it right? XD 15:04 < bridge> ja 15:04 < bridge> https://translate.google.de/?sl=de&tl=en&text=tja&op=translate 15:04 < bridge> ja 15:04 < bridge> t-i-a, with a very short i 15:04 < bridge> ia 15:04 < bridge> ic 15:04 < bridge> 🫏 15:04 < bridge> esel 15:04 < bridge> naja, nicht wirklich 15:04 < bridge> a little bit 15:05 < bridge> Naja, or na ja can be translated to “well” and is an interjection, which means it's used to express a feeling. In the case of na ja, it's used to express either agreement or doubt. 15:05 < bridge> often u use it in the beginning to express disagreement 15:06 < bridge> doesn't have to be disagreement, can also just be "I'm thinking" 15:06 < bridge> like "couldn't we just" 15:06 < bridge> how do you do this? couldn't we just do xy 15:06 < bridge> naja, that's why i said "often" 15:06 < bridge> i'd always interpret it as passive aggressiveness 15:06 < bridge> default mode 💀 15:06 < bridge> these girls in my school, that suddenly started "naja du opfer" 15:06 < bridge> blablbal 15:06 < bridge> xd 15:06 < bridge> what about "eigentlich"? 15:07 < bridge> so ur interpreting naja as passive aggressiveness but not "du opfer"? 15:07 < bridge> sounds like a broken compass to me 15:07 < bridge> no that is true at least 15:07 < bridge> 🫠 15:07 < bridge> naja is not true? 15:07 < bridge> eigentlich has multiple meanings, kinda 15:07 < bridge> but it's like 15:07 < bridge> I can't imagine this in a conversation. Please give an example with context xd 15:08 < bridge> Eigentlich is eigentlich unnötig 15:08 < bridge> ye 15:08 < bridge> Ah I got it it's "actually" right? 15:09 < bridge> u sit in school.. normal class. 15:09 < bridge> 15:09 < bridge> You say something in a discussion. 15:09 < bridge> Perfect girl number 1, with only best marks: "Naja, also meine Quellen sagen da was ganz anderes, NICHT WAHR HERR LEHRER, DAFÜR BEKOMME ICH EINE 1+*" 15:09 < bridge> good enough? 15:09 < bridge> perfect 15:09 < bridge> Poor melon. He has to go through this 15:10 < bridge> but isnt he only teaching adults 15:10 < bridge> Not sure. They can be asses too 15:10 < bridge> Teero 15:10 < bridge> Say eichhörnchen 15:10 < bridge> Although they are there because they want to 15:11 < bridge> yeah.. i mean we only had like 2 girls that were like that anyway 15:12 < bridge> but they literally were like that xD 15:12 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1264933033962639360/voice-message.ogg?ex=669fac30&is=669e5ab0&hm=149c26ce78481572901a7802fc0d27fd5f60ebaf970dfbd34cadf4d40502f62d& 15:12 < bridge> r u german 15:12 < bridge> he is as german as you 15:13 < bridge> i am from portugal 15:13 < bridge> "eichhörnchen" 15:13 < bridge> portegal 15:14 < bridge> scheiß egal senegal 15:14 < bridge> from the whole word I just heard last letter n 😬 15:14 < bridge> Turn up your volume 15:14 < bridge> Ai has to speak up ff 15:14 < bridge> Ai has to speak up fr 15:14 < bridge> i'd say teeros pronounciation was really good 15:14 < bridge> many ppl cant say ch very clear 15:14 < bridge> they say SCH instead 15:15 < bridge> eitsch earntschen 15:15 < bridge> :justatest: 15:15 < bridge> tsch 15:15 < bridge> manschmal 15:15 < bridge> xD 15:16 < bridge> we all know that person 15:16 < bridge> sadly 15:16 < bridge> also funny are the "ebend" ppl 15:16 < bridge> - i agree 15:16 < bridge> - EBEND 15:16 < bridge> wat 15:17 < bridge> wat in the saarbrücken 15:18 < bridge> https://en.wiktionary.org/wiki/ebent 15:18 < bridge> Yea, i just didnt get the way jupeyy told it 15:18 < bridge> Never heard ebent before 15:18 < bridge> Only eben 15:19 < bridge> Haribo macht Kinder froh und Erwachsene ebend so 15:19 < bridge> please no 15:19 < bridge> Okay I remember 15:19 < bridge> now i have to watch ads 15:20 < bridge> You Fake portugeese 15:20 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1264935077612224604/image.png?ex=669fae17&is=669e5c97&hm=2f203267dacdf35f5956cc545ede83c86440336f2db9822970ee80049f17c8d6& 15:20 < bridge> thanks youtube 15:20 < bridge> ??????? 15:20 < bridge> wtf xD 15:20 < bridge> who trained this AI 15:21 < bridge> we 15:21 < bridge> sue google 15:21 < bridge> u 15:30 < bridge> can someone or some ai translate ty 15:31 < bridge> haribo (german brand for sweets) makes children happy, and adults, too 15:31 < bridge> it's the slogan of the haribo company 15:31 < bridge> https://en.wikipedia.org/wiki/Fn_key 15:31 < bridge> https://en.wikipedia.org/wiki/Haribo 15:31 < bridge> https://en.wikipedia.org/wiki/Haribo 15:32 < bridge> ohh 15:32 < bridge> i dont like sweets 15:32 < bridge> @jupeyy_keks ddnet should strive to be like llvm, 600 prs merged in 1 week 15:32 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1264938213710233702/image.png?ex=669fb103&is=669e5f83&hm=8ffbf56948916be7be741b33d9b12152550f0c5c4886fba610039ad3a45baef0& 15:32 < bridge> kek 15:33 < bridge> wtf 15:33 < bridge> llvm is massive 15:33 < bridge> also its a mono repo xd 15:33 < bridge> i always wonder why such projects magically work 15:33 < bridge> the testing infra must be really on point 15:33 < bridge> lots of tests 15:33 < bridge> ye 15:34 < bridge> https://llvm.org/docs/CommandGuide/lit.html 15:34 < bridge> lit - LLVM Integrated Tester 15:34 < bridge> https://llvm.org/docs/TestingGuide.html 15:35 < bridge> the rust repo itself also has amazing testing 15:35 < bridge> soon llvm 19 rc releases 15:35 < bridge> my tests often turn into benchmarks, bcs i dunno what to test xdd 15:36 < bridge> it has more code of mine :owo: :brownbear: 15:36 < bridge> but writing shit tests still isnt that bad actually. 15:36 < bridge> 15:36 < bridge> you still have to design your code to be modular enough to test it like that 15:36 < bridge> test that it works, test some edge cases you may know, and when u find a bug add a regression test so it doesnt happen 15:36 < bridge> if u feel fancy u can also do property based testing 15:36 < bridge> yeah but often it's not that easy 15:37 < bridge> https://altsysrq.github.io/proptest-book/ 15:37 < bridge> e.g. test that your client can connect to your server 15:37 < bridge> for a single algorithm it's easy ofc 15:37 < bridge> I don't know how to do UI tests, but e.g. firefox manages, so it must be possible 15:37 < bridge> i mean it's defs possible 15:37 < bridge> html is a clear standard 15:37 < bridge> but it kinda sounds annoying 15:38 < bridge> that's the thing. if you have a proper test setup, then it's not annoying 15:38 < bridge> i wonder if they "proof" the math 15:38 < bridge> so the question becomes how you get there 15:38 < bridge> or do tests like in different resolutions etc. 15:38 < bridge> because once you have the proper test setup, then writing tests is almost as easy as testing it manually, which is what you'd have to do anyway 15:39 < bridge> and this way, you don't have to test it manually over and over again 15:39 < bridge> yeah i dunno, if it would be so good, then firefox wouldnt still render stuff often different to chromium i guess xdd 15:39 < bridge> hm? that seems unrelated to the test suite 15:40 < bridge> you still need to fix bugs and implement features 15:40 < bridge> but tests give you a clear way to see where you are 15:40 < bridge> sure but that is the question, what do you actually test. 15:40 < bridge> 15:40 < bridge> you could test by taking screenshots (stupidly said) 15:40 < bridge> 15:40 < bridge> or actually test the "math" 15:40 < bridge> they also give u some level of confidence in that ur changes dont break stuff 15:40 < bridge> imho the most important feature xd 15:40 < bridge> you definitely also want to do screenshot-like testing in something like firefox 15:41 < bridge> and I'm sure firefox does that 15:41 < bridge> like testing an svg renderer 15:41 < bridge> for cargo, look at this beauty: https://github.com/rust-lang/cargo/blob/631b8774e512a69402a55367b4eb9c195220e404/tests/testsuite/cargo/help/stdout.term.svg 15:41 < bridge> yep 15:41 < bridge> Physics tests for ddnet would be nice to have. To actually know if any physics are changed by a pr 15:41 < bridge> it tests that the colored(!) output of `cargo --help` doesn't change 15:41 < bridge> there was a try for that 15:41 < bridge> wait what 15:42 < bridge> they test with a screenshot? XD 15:42 < bridge> lol 15:42 < bridge> ye 15:42 < bridge> xd 15:42 < bridge> interesting 15:42 < bridge> @zwelf2 is working on that 15:44 < bridge> but anyway, the more complex your app gets the harder it is to test stuff that isnt clearly separated (e.g. code that combines all your tested components) 15:44 < bridge> they can render `cargo`'s output to SVG, and then you can see in pull requests how `cargo`'s output changes 15:44 < bridge> so testing always hard task 15:45 < bridge> ideally, it's only the setup of the test framework that is hard 15:45 < bridge> not testing individual changes 15:45 < bridge> sure, but i'd assume that could work also with analyzing the output letters directly 15:45 < bridge> but it looks worse in PRs ^^ 15:45 < bridge> XD 15:45 < bridge> xd 15:46 < bridge> I mean it. it lets the reviewer quickly see whether the change was bad 15:46 < bridge> sure 15:46 < bridge> you might not spot this in a garbled output file 15:46 < bridge> sounds cool for sure 15:46 < bridge> i dunno if i'd have the motivation to proof our map rendering 15:46 < bridge> sounds very time consuming 15:48 < ws-client> @teero777 I have seen it dont remember trying it 15:50 < ws-client> @Jupstar ✪ 15:50 < ws-client> > these girls in my school, that suddenly started "naja du opfer" 15:50 < ws-client> xxxxxxxxxxD 16:01 < bridge> https://ddnet.org/ranks/ Is this data available in json format? 16:02 < bridge> the front page? currently no 16:02 < bridge> (I think() 16:02 < bridge> (I think) 16:05 < bridge> does anyone know a physical terminal that I can find cheap second hand? 16:10 < bridge> No, but It's available as a msgpack, http://ddnet.org/players.msgpack 16:10 < bridge> furo: ddstats.tw only server side rendering? 16:11 < bridge> furo: https://ddnet.org/players.msgpack ! 16:11 < bridge> the s of https was missing 16:12 < bridge> oh wow, didnt know we had that information available 16:12 < bridge> but msgpack is uff 16:13 < bridge> Yep 16:13 < bridge> just another serialization format. rust probably has support for it 16:13 < bridge> it does: https://github.com/3Hren/msgpack-rust 16:13 < bridge> iirc there is a serde "adapter" for it too 16:15 < bridge> Yep it's in that same repo 16:16 < bridge> how do I convert the msgpack to json to look at it? 16:18 < bridge> Well idk if there is a standard tool for it, but with the crate you linked it should be trivial to deserialize then serialize again to json 16:19 < bridge> I have the following Rust code to parse the msgpack file, but it kinda sucks. https://github.com/ddstats-tw/ddstats-web/blob/eef91a9be933f161b853fc923fcd5385c2ad8246/src/points.rs 16:19 < bridge> like 10 lines of rust 16:19 < bridge> want a command line tool. apparently there's https://aur.archlinux.org/packages/msgpack-tools, but it doesn't work for me 16:19 < bridge> imo if you do binary formats... you don't print field names 16:19 < bridge> msgpack is a slightly easier to parse binary json, it's nothing more 16:19 < bridge> I agree that this use of non-json seems suspect 16:19 < bridge> because if you're going to include the field names, you might as well just use JSON 16:20 < bridge> Especially if you are not going to ship it over the wire 16:20 < bridge> well, this is kinda shipped over the wire 16:20 < bridge> Where? I think we only write it to a file then just use it from there no? 16:20 < bridge> well, furo uses it 16:20 < bridge> ``` 16:20 < bridge> .cache/yay/msgpack-tools/src/msgpack-tools-0.6/contrib/rapidjson-99ba17bd66a85ec64a2f322b68c2b9c3b77a4391/include/rapidjson/document.h:319:82: error: assignment of read-only member ‘rapidjson::GenericStringRef::length’ 16:20 < bridge> 319 | GenericStringRef& operator=(const GenericStringRef& rhs) { s = rhs.s; length = rhs.length; } 16:21 < bridge> | ~~~~~~~^~~~~~~~~~~~ 16:21 < bridge> ``` 16:21 < bridge> presumably by downloading it 16:21 < bridge> Ah tbf the msgpack file we probably just exposed when people asked for it. IIRC it was never supposed to be external 16:21 < bridge> Idk who decided that would be the format for our internal cache though 16:21 < bridge> The DDNet discord bot also uses it. 16:21 < bridge> probably no one, deen just did it 16:23 < bridge> I don't believe it does. I remember distinctly that it calculated it's own cache tables, but maybe murpi changed that recently so not sure 16:24 < bridge> furo: I think this could be solved more cleanly https://github.com/ddstats-tw/ddstats-web/blob/eef91a9be933f161b853fc923fcd5385c2ad8246/src/points.rs#L68-L73 16:24 < bridge> could you maybe pass in a `Reader` instead of using the vector? 16:24 < bridge> wait. you're parsing the data multiple times 16:25 < bridge> why? ^^ 16:25 < bridge> https://github.com/ddstats-tw/ddstats-web/blob/eef91a9be933f161b853fc923fcd5385c2ad8246/src/points.rs#L141-L143 16:25 < bridge> Well, it has a script to parse it at least https://github.com/ddnet/ddnet-discordbot/blob/29c9c8fc9f76472390b6d30bda897cc68c5bd8d2/data/tools/convert_players_cache.py 16:25 < bridge> There is multiple msgpacks in the same file. It's really annoying to parse :( 16:25 < bridge> furo: also check out https://doc.rust-lang.org/std/fs/fn.read.html. you manually implement that operation 16:26 < bridge> Msgpacks only advantage over json imo is that every thing is length prefixed. Which we really don't use here. Perhaps we could stop using it but idk if the engineering effort to touch dozens of scripts that none of us know of the top of our heads is worth it 16:26 < bridge> Msgpacks only advantage over json imo is that everything is length prefixed. Which we really don't use here. Perhaps we could stop using it but idk if the engineering effort to touch dozens of scripts that none of us know of the top of our heads is worth it 16:26 < bridge> furo: you should probably just a) always parse all of it or b) split the file after downloading it 16:30 < bridge> if its between rust i would use bincode but i guess its smth ddnet provides right 16:30 < bridge> im missing context 16:30 < bridge> yes, it's our internal cache file of all ranks "ranked" 16:30 < bridge> it's supposed to be an interoperable format 16:30 < bridge> so language specific ones are kinda out already 16:31 < bridge> If I were to migrate it to something different I would probably go for sqlite or json 16:31 < bridge> It's well structured data, so it'd fit well in sqlite. Everyone and their mothers use json for everything, so json is also a good candidate 16:31 < bridge> sqlite3 probably has very bad write performance 16:32 < bridge> i rly want ddnet on psql 16:32 < bridge> i have a psql instance with 40gb of ram 😬 16:32 < bridge> completely unrelated 16:32 < bridge> we're talking about a data interchange format 16:32 < bridge> I really want to abstract away all SQL out of the ddnet source code, but yes unrelated 16:32 < bridge> yeah it was a side thought 16:32 < bridge> also deen wants it too 16:32 < bridge> for materialize 16:33 < bridge> wasn't materialize discarded before because it wouldn't really work out without MASSIVE changes? 16:33 < bridge> are we rly doing things okay if our queries take so much we need to cache so much? 16:33 < bridge> ddnet datasette is rly resource intensive 16:33 < bridge> and its basically ddnet in sqlite 16:33 < bridge> This is veering very very off-topic, but I guess the original discussion is kinda settled, we all agree that it probably shouldn't be msgpack 16:33 < bridge> what advantage would that give? 16:33 < bridge> 16:33 < bridge> i currently use sqlx, so i can implement both. but i don't really see any super obvious reason.. 16:33 < bridge> 16:33 < bridge> Also i hate databases xd 16:33 < bridge> :justatest: 16:34 < bridge> i heard mysql is faster in read-only operations 16:34 < bridge> for me psql is THE state of the art db 16:34 < bridge> and mysql is less bloated 16:34 < bridge> and materialize works only with psql iirc 16:34 < bridge> but as said i have no idea of databases 16:34 < bridge> i only know what i need to know 16:34 < bridge> it was discarded because deen imported our db and it required like 300gb of ram 16:34 < bridge> no nerd 16:34 < bridge> xd 16:34 < bridge> we nerds 16:34 < bridge> i am no db nerd 16:34 < bridge> **casually throws in surrealDB** 16:35 < bridge> your discord message is going to a db 16:35 < bridge> get dbed 16:35 < bridge> i know how to code SQL 16:35 < bridge> and shit 16:35 < bridge> psql is also SQL 16:35 < bridge> but the technical differences 16:35 < bridge> the only small change is the SERIAL type 16:35 < bridge> yes most stuff seems easy to port 16:35 < bridge> sorry for interrupting! important question inc. 16:35 < bridge> if you have any kind of software - would you choose base (e.g gtk) or Qt? i really don't understand the difference other than Qt beeing a different `Interface?` - i'm asking because i've seen it quite a few times now that both option's are offered and i'm not sure which libreoffice to choose :crythumbsup: 16:35 < bridge> and it also has featurs like json dbs 16:35 < bridge> and sqlx gives a general interface 16:35 < bridge> Ideally the ddnet server would just make an rpc call through some message queue `rpc ranks.Insert ...`. Then the message routing system would take responsibility for making that happen. We'd have whatever consumer we want on ddnet.org it could be psql, mariadb or whatever newfangled bigquery magic you want 16:36 < bridge> DDNet on ElasticSearch 16:36 < bridge> so i wonder if postgresql is really worth it 16:36 < bridge> like REALLY 16:36 < bridge> like vulkan vs opengl 16:36 < bridge> you probably want qt over gtk if you want good cross-platform support 16:36 < bridge> gtk feels more linuxy for me ut qt is ok 16:36 < bridge> gtk feels more linuxy for me but qt is ok 16:36 < bridge> i would say yes 16:36 < bridge> what are your requirements, anyway? what's the programming language you want to use? 16:36 < bridge> I would probably go for qt 16:37 < bridge> ok then please rewrite my sql to work with postgres 😬 16:37 < bridge> > Performance: For most workloads, the performance of Postgres and MySQL is comparable, with at most a 30% difference. MySQL has an advantage over Postgres for extremely write-intensive workloads, while PostgreSQL is faster when handling massive datasets, complicated queries, and read-write operations 16:37 < bridge> disclaimer: first entry ongoogle :Kek: 16:37 < bridge> c++, rust, and go i guess :P 16:37 < bridge> i read that write operations are faster in postgres and read-only faster in mysql xd 16:37 < bridge> c++ works well with qt 16:37 < bridge> internet is such a good source 16:37 < bridge> ask claude 16:37 < bridge> its the new HIP ai 16:38 < bridge> chatgpt gone 16:38 < bridge> rust and go probably suck either way for anything you'd like to attempt 16:38 < bridge> yeah Ewan uses it afair and i've seen his Qt IDE of sorts be pretty decent 16:38 < bridge> (wrt native-looking UI) 16:38 < bridge> > As a general rule, Postgres performs better for write-heavy workloads while MySQL performs better for read-heavy workloads... 16:38 < bridge> 3rd comment on a reddit post, so this is very hard to determine 😄 16:38 < bridge> we have read-heavy workloads 16:38 < bridge> @blaiszephyr with gtk u can do the UI design separated from code and language 16:38 < bridge> do you want cross-platform support? @blaiszephyr 16:38 < bridge> or only linux 16:39 < bridge> https://en.wikipedia.org/wiki/Glade_Interface_Designer 16:39 < bridge> nah it's a choice i wanna make for my nixOS config split across 2 pc's and a laptop 16:39 < bridge> One thing I love about postgres is it's documentation. So much better than mysql/mariadb imo 16:39 < bridge> One thing I love about postgres is its documentation. So much better than mysql/mariadb imo 16:39 < bridge> setting up a mariadb server was a lot easier for me than setting up a postgresql server 16:39 < bridge> the postgresql server also seemed to come with bad defaults 16:39 < bridge> @heinrich5991 when did u do that? 16:40 < bridge> idk, 5 years ago? 16:40 < bridge> i think things improved 16:40 < bridge> My experience was about completely identical last year 16:40 < bridge> hard to determine, easy to say 16:40 < bridge> if u fine tune psql i think its better 16:40 < bridge> it took furo 1 1/2 months to setup my DB access on ddstats.tw (psql) :kek: 16:40 < bridge> the V people always say that and the language sucks 16:40 < bridge> As in mariadb vs postgres was about the same amount of hassle 16:41 < bridge> psql and mariadb have bad defaults if ur server has more than 2gb of ram tbh 16:41 < bridge> xd 16:41 < bridge> Have I shared this here before? https://neon.tech/ completely useless for this discussion but quite elegant 16:41 < bridge> i dont trust serverless 16:41 < bridge> the server is somewhere 16:41 < bridge> https://wiki.archlinux.org/title/PostgreSQL#Restricts_access_rights_to_the_database_superuser_by_default 16:41 < bridge> 16:41 < bridge> what the fuck 16:42 < bridge> any local user can delete your whole DB by default 16:42 < bridge> that sounds like a really bad default 16:42 < bridge> :kek: 16:42 < bridge> local unix user 16:42 < bridge> I said local user 16:42 < bridge> The nice part is that the server that is somewhere doesn't have to be up all the time spending resources 16:42 < bridge> what do you want? 16:42 < bridge> but users have passwords 16:42 < bridge> that sums up the casual psql experience in my opinion 16:42 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1264955777299382423/image.png?ex=669fc15f&is=669e6fdf&hm=b88f47dba22886f8a2a325d69d6211a3a1e940234829bc4997df90370ace3a56& 16:42 < bridge> i never seen u say what the fuck before 16:42 < bridge> i got shocket ngl xD 16:42 < bridge> i got shocked ngl xD 16:42 < bridge> wdym? 16:42 < bridge> to connect with the user 16:43 < bridge> you need to use a password too 16:43 < bridge> psql defined one 16:43 < bridge> not unix 16:43 < bridge> the next section leads me to believe that passwords are optional by defaul 16:43 < bridge> the next section leads me to believe that passwords are optional by default 16:43 < bridge> > Require password for login 16:44 < bridge> if this is actually the case, the defaults are insane 16:44 < bridge> mariadb would not be able to get away with this 16:44 < bridge> I remember needing a password to access as the db superuser. Let me try 16:48 < bridge> i think they copied the example from the doc 16:48 < bridge> only thing struggled with was to create a secure connection to mysql 16:48 < bridge> 16:48 < bridge> and that mostly bcs rustls requires cert v3 to work, which the tutorial i found did not do lmao 16:48 < bridge> https://paste.pr0.tips/Et2 16:48 < bridge> the default installed uses "peer" iirc 16:48 < bridge> maybe debian injects saner defaults? 16:48 < bridge> i dont have one in hand 16:48 < bridge> https://www.postgresql.org/docs/current/auth-pg-hba-conf.html 16:48 < bridge> they just copiied the examples here 16:48 < bridge> it doesnt mean they come by default 16:49 < bridge> what comes by default? 16:49 < bridge> if you don't know, I better hope the defaults are very good 16:49 < bridge> if you don't know, I hope the defaults are very good 16:54 < bridge> Idk where archlinux got their config file, but mine was shipped with method `peer` on that line, which is safe 16:56 < bridge> (debian) 16:56 < bridge> ((pg 11) 16:56 < bridge> ((pg 11)) 16:56 < bridge> damn u old 16:59 < bridge> https://github.com/postgres/postgres/blob/master/src/backend/libpq/pg_hba.conf.sample this is the actual config upstream ships 17:01 < bridge> I couldn't figure out what `@remove-line-for-nolocal@` does 17:02 < bridge> https://github.com/postgres/postgres/blob/master/src/bin/initdb/initdb.c initdb handles those replacable tokens, so as long as your distro doesn't call it with insane arguments it should be fine 17:03 < bridge> Oh actually I see what went wrong there 17:03 < bridge> yet another beautiful day to run nix's garbage collector.. oh boy... 17:03 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1264961016782131231/image.png?ex=669fc640&is=669e74c0&hm=e5c8f6398b7bf6358452663f0be335d7b3b6799bd21534c824f58ced3b79ffb7& 17:04 < bridge> > Do not use trust unless you trust all local users on your system. trust is the default for ease of installation. 17:04 < bridge> I'm guessing arch doesn't pass any `-A` but debian does. So I guess this default is indeed insane but fixed by debian 17:04 < bridge> gentoo master race 17:13 < bridge> . 17:13 < bridge> I dug into it a bit debian uses a tool they made called `pg_createcluster` which calls `initdb` with a safe `-A` 17:16 < bridge> @jupeyy_keks im cryptography noob so i have some questions 17:17 < bridge> does a game server check the cert sent from user with just the account servers public key? 17:17 < bridge> i am too xd 17:18 < bridge> yes 17:18 < bridge> well my current implementation actually lets a game server download a cert of the account server 17:18 < bridge> heinrich wanted permanent keys.. i am not 100% sure about it 17:18 < bridge> since permanent is a subset of temporary, we can still "downgrade" to that 17:18 < bridge> so i just implemented it like that 17:19 < bridge> What sort of accounts did you end up making @jupeyy_keks? Any fancy features or did you just end up doing a central auth server with username-password? 17:19 < bridge> what exactly is the cert? 17:19 < bridge> https://discord.com/channels/252358080522747904/293493549758939136/1251290240383975515 17:19 < bridge> smth public? 17:20 < bridge> i basically did the idea heinrich proposed to me in a call 17:20 < bridge> using certs by the account server to verify the account ownership 17:20 < bridge> Ah cool, certs are nice 17:21 < bridge> simply speaking it certifies that someone owns something. 17:21 < bridge> 17:21 < bridge> so for example it can certify that you own a specific public key, additionally certs have extensions, so i can put the account_id into one and it certifies that you have the account id 17:21 < bridge> i mean like what private thing is stopping a game server from stealing a cert sent from user and using it on another server 17:21 < bridge> Did you finish btw? 17:21 < bridge> well that you own the private key to the public key 17:21 < bridge> u were in a call? :owoSmol: 17:21 < bridge> to be precise 17:21 < bridge> yep xd 17:22 < bridge> Asymmetric cryptography. You have the private key, the server has your public key and verifies that you own the private key using cryptoblackmagic 17:22 < bridge> i actually wanted to talk mostly about quic.. but we ended up talking mostly about accounts 17:22 < bridge> lmao 17:22 < bridge> i think last time i heard heinrich was in lexa teamspeak server playing dota 17:22 < bridge> laxa 17:22 < bridge> ye laxa 17:22 < bridge> ah ok 17:22 < bridge> i forgot the name :justatest: 17:22 < bridge> i remember learning abt the cryptoblackmagic mathematics itself but i just don't know how it's applied in actual scenarios :thonk: 17:22 < bridge> its just prime numbers 17:22 < bridge> ya ik 17:23 < bridge> The account server generates the certs? That sounds like the people with access to the account server would be able to steal accounts 17:23 < bridge> they would, defs 17:23 < bridge> yes. we're hosting the accounts server 17:23 < bridge> but it's controlled by ddnet 17:23 < bridge> i guess its all open source 17:24 < bridge> a very early version i uploaded before my holidays is open source 17:24 < bridge> the current lays on my pc, a VPS and my gitlab instance 17:24 < bridge> Could we perhaps have the client generate the private key? Why do we generate it on our side? 17:24 < bridge> xd 17:24 < bridge> the private key is generated on the client 17:24 < bridge> the cert doens't include the private key 17:24 < bridge> but that doesn't help, because the account server could just generate a new private key and sign a certficate for it 17:24 < bridge> Oh okay, so like a traditional certificate signing request 17:25 < bridge> will u have blacklists for certs? 17:25 < bridge> what does that mean? 17:25 < bridge> imagine u lost ur account and recover it by email, whats up with the old certs that still live 17:26 < bridge> if thats a posibility 17:26 < bridge> or u cant recover at all? 17:26 < bridge> A means of disabling a stolen private key 17:26 < bridge> they are only valid for a few hours 17:26 < bridge> few hours is a lot 17:26 < bridge> if nobody steals them they simply expire 17:26 < bridge> we'll have to figure out good certificate life times 17:26 < bridge> yes 17:26 < bridge> jwt is a good example of this 17:26 < bridge> Oh the certificates are ephemeral, hm 17:26 < bridge> in my current impl it's 1h 17:26 < bridge> also if the old cert is still valid 17:27 < bridge> the attack could theorically change the password or whathever? 17:27 < bridge> or is that only yb email 17:27 < bridge> by* 17:27 < bridge> no passwords 17:27 < bridge> or what about changing email 17:27 < bridge> how do you auth then 17:27 < bridge> that requires to verify the code of the old email 17:27 < bridge> key-pair 17:27 < bridge> but how u get a key pair 17:27 < bridge> a session has a key-pair. everytime you log in you get an email 17:28 < bridge> ah 17:28 < bridge> by email 17:28 < bridge> so email -> code -> code+ public key 17:28 < bridge> smth like that 17:28 < bridge> I guess that's sane. So any downstream 3rd party can check that the clients presented certificate is signed by our account server and verify ownership? 17:28 < bridge> yeah or steam or whatever 17:28 < bridge> the client downloads the key pair? 17:28 < bridge> yes 17:28 < bridge> no, it only uploads the public key 17:28 < bridge> so it makes the key pair? 17:29 < bridge> yes 17:29 < bridge> what does the email have? 17:29 < bridge> that lets u make a valid key pair? 17:29 < bridge> Did you end up doing any special format or are we using standard X.509 certificates? 17:29 < bridge> and how u make a good ux for it with the client? xD 17:29 < bridge> the email sends a code, the code verifies you own the email, the public key is your session ticket 17:29 < bridge> i can quickly show a very first version in ddpg 17:29 < bridge> it's not super fancy, but it works 17:30 < bridge> I have one concern, would there be a non-interactive way to refresh your certificate? 17:30 < bridge> i just fail to understand how u get from a email to a valid session in the client iself 17:30 < bridge> It would be super annoying to have to log in all the time 17:30 < bridge> u have to log in with email every hour? 17:30 < bridge> no you probs can refresh with the old pair 17:30 < bridge> ok 17:30 < bridge> it is always non-interactive 17:30 < bridge> or what do you mean 17:30 < bridge> Not if you need the email code every time 17:31 < bridge> Or can you use the expired certificate to get a new one? 17:31 < bridge> i guess the same email code can be used to make multiple certificates no 17:31 < bridge> i currently thought about checking every time if either: 17:31 < bridge> - user presses refresh on server browser (and the cert is reasonable old) 17:31 < bridge> - connects to a game server (and cert is old) 17:31 < bridge> no, it will always do a login by session, kinda 17:32 < bridge> So you connect to a game server, client notices the certificate is stale. What is the next step? From how I understood you so far it would need to get a new email code 17:33 < bridge> step by step: 17:33 < bridge> - insert email 17:33 < bridge> - read code from email 17:33 < bridge> - insert code 17:33 < bridge> - be happy 17:33 < bridge> 17:33 < bridge> nothing more to do 17:33 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1264968517447450664/image.png?ex=669fcd3c&is=669e7bbc&hm=a9e0a3b3181f8c8449e5cdf63685761fc79975323ff8e361cf915172c228f396& 17:33 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1264968517732794480/image.png?ex=669fcd3c&is=669e7bbc&hm=b99744f7e5041a905d35321684a83134f48494eb7f2e77b2bdae6ee05bcbe419& 17:33 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1264968517933858836/image.png?ex=669fcd3c&is=669e7bbc&hm=43a062b4eecbcf5e5c0e5f2eaa6fcc207ac5925585de59bb4499d99312e612a1& 17:33 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1264968518139510858/image.png?ex=669fcd3c&is=669e7bbc&hm=c43fd26fe1d1c095edf2977f588812b6588cf8e4941c633096089386d39ef233& 17:33 < bridge> the rest should™️ always be hidden for an end user, except maybe a name change on a game server 17:33 < bridge> I want to die. I spent 2 hours rebasing my PR. Some dude got a PR in before mine that changes a lot of stuff I touched. Now I need to rebase it again 17:33 < bridge> pair should refresh seamlessly 17:34 < bridge> in web stuff they use a session token and a refresh token 17:34 < bridge> hmm i think 1 hour is far too short then xd 17:34 < bridge> cert is old -> client asks for new cert using the active session (the session key-pair) -> gets new cert 17:34 < bridge> Rust fake ddnet client! Xd 17:34 < bridge> with the refresh u get the session token 17:34 < bridge> which lasts not much 17:34 < bridge> no no 17:34 < bridge> There is a separate session keypair? 17:34 < bridge> once you logged in, you stay logged in 17:34 < bridge> it's a valid session 17:34 < bridge> i mean even then, what if ur hopping servers a lot 17:34 < bridge> there are only session key-pairs 17:34 < bridge> nothing else 17:34 < bridge> the same cert can be used for ~1h 17:35 < bridge> before creating a new one automcatically 17:35 < bridge> Okay now I don't follow you anymore. You have a cert proving you own the account associated to an email. It expired, how would you get a new one without interaction? 17:36 < bridge> you have a session key-pair, which is basically your session token 17:36 < bridge> the account server remembers the keypair forever 17:36 < bridge> it validates your account 17:36 < bridge> it validates your account's session 17:36 < bridge> until you "log out" somehow 17:36 < bridge> then it won't sign new certificates for you 17:36 < bridge> if it lasts forever u run into the problem of increasingly big blacklists right? 17:36 < bridge> we can also last it for 1-2 years 17:36 < bridge> that's an impl detail 17:36 < bridge> point is, it wont just ask you every day 17:37 < bridge> i rly think it should rotate 17:37 < bridge> no. the accounts server maintains the mapping. revocatio nof that bit is instead 17:37 < bridge> ah ok i see 17:37 < bridge> So only when associating a public key with an email you need the interactive bit? 17:37 < bridge> no. the accounts server maintains the mapping. revocation of that bit is instead 17:37 < bridge> yes 17:37 < bridge> ah 17:37 < bridge> we can still think about that yes 17:37 < bridge> no. the accounts server maintains the mapping. revocation of that bit is instant 17:38 < bridge> a lot of other games check for ip/location too 17:38 < bridge> So as long as I don't lose that private key, I can keep getting new certificates, ok. Why do the certificates expire? Why do we think they are more likely to be stolen than the private key itself? 17:38 < bridge> i don't really think so 17:38 < bridge> that's why i could also imagine it lasting longer 17:38 < bridge> so that you can tell the account server that you want to log out 17:39 < bridge> yeah ok that too 17:39 < bridge> the certificates mostly make sure that DoSing the accounts server doesn't have as much impact 17:39 < bridge> Hm, isn't that just another command? Send a signed deassociate message and done 17:39 < bridge> that is super hard 17:39 < bridge> to all game servers? 17:39 < bridge> how would the game servers know? 17:40 < bridge> Ah are the gameservers caching this stuff? 17:40 < bridge> they don't need to cache anything with the certificates 17:40 < bridge> because the certs are always up-to-date 17:40 < bridge> i think it shouldnt last too long, but realistically the user might not directly notice the key loss, so a new cert for every game server connect would IMHO be overkill 17:40 < bridge> would only slow down connecting 17:40 < bridge> plus DoS-ability of the accounts server 17:41 < bridge> one question, how does the key pair store some vital account info, or does it require to check with the server always? a.k.a it has no claims for offline info right? 17:41 < bridge> in jwt its common for example to store claims, like the user id 17:41 < bridge> xd 17:41 < bridge> Ok, I see how it solves the caching issue and the accounts server being down. Why the expiry though? Can't the client just discard the certificate? It's the one logging out afterall 17:41 < bridge> sry i dont understand xd 17:41 < bridge> i also explained myself bad 17:41 < bridge> I'm guessing it's storing a unique userid given it's resistant to dos'ing of the account server 17:42 < bridge> the key pair stores nothing 17:42 < bridge> and i think it doesnt apply here i guess 17:42 < bridge> the certificate itself 17:42 < bridge> u always need to contact the acc server for info 17:42 < bridge> you can put stuff into the certificate 17:42 < bridge> no 17:42 < bridge> the cert by the account server stores info in an extension 17:42 < bridge> so getting an og username really matters :owo: 17:42 < bridge> if the cert stores the id we can also separate authing to getting user info 17:43 < bridge> Nice, so just a standard x.509 extension? 17:43 < bridge> we haven't talked about user names at all yet 17:43 < bridge> which makes this more resistant to ddos 17:43 < bridge> yes 17:43 < bridge> by separating the services right 17:43 < bridge> I think this is the one question I have remaining then. Other than that love it 17:44 < bridge> expiry so that we can think less about revocation 17:44 < bridge> what are the current options? 17:44 < bridge> user "loses" key, wants to log out 17:44 < bridge> ive seen normal usernames and user#0000 17:44 < bridge> and steam like names 17:44 < bridge> we haven't talked about it. we're talking about some technical stuff regarding accounts right now 17:44 < bridge> steam has a id and allows all names 17:44 < bridge> let's finish the technical discussion first 17:44 < bridge> i dont have more questions 17:45 < bridge> If the certificate and the private key are equally likely to be stolen (assumption by me). The cert expiring doesn't matter, no? 17:45 < bridge> if both are stolen but the cert is valid for ever, then u can fake it on any game server 17:45 < bridge> it matters. because the game server knows by the certificate that it's valid 17:45 < bridge> bcs the game server doesnt know about that the cert is invalid for this account 17:45 < bridge> it matters. because the game server knows by the certificate that the private key is associated to an account 17:46 < bridge> I see I see, no online verification of the certificate is needed this way 17:46 < bridge> it seems more like a q&a 17:46 < bridge> yes, that's the very nice property of this system 17:46 < bridge> but it's a technical Q&A without any "open design questions" 17:46 < bridge> you're starting an issue that people have very different opinions on. that will side-track any other discussion 17:47 < bridge> And I guess the validity duration is a balancing act between dos-proofness of the account server and the impact of a stolen cert 17:47 < bridge> correct 17:47 < bridge> the good thing is, it can be a config var on the account server 17:47 < bridge> so we can always change it 17:48 < bridge> yes 17:48 < bridge> just don't accidentially set it to infinity :lol: 17:48 < bridge> maybe i should clamp it to smth sane 17:48 < bridge> we can also have revocation lists, to make revocations instant in the optimal case of the acc server not being DoSed 17:48 < bridge> but that's an addon already 17:49 < bridge> yeah it's also IMHO harder in games that web service 17:49 < bridge> Yeah, not urgent. I doubt we'll have need for instant revocations that quickly 17:49 < bridge> it's also only "best effort", it doesn't really give us security guarantees 17:49 < bridge> sounds good, maybe ill live to see accounts in ddnet for real 17:49 < bridge> We can just put a large revoke list on cloudflare r2 or something 17:49 < bridge> well depends i guess, but that list must be updated quite often, and maybe shouldnt block new connections too much 17:49 < bridge> the revocation list doesn't need to be large if the cert validity is short ^^ 17:50 < bridge> another issue is registration in spam 17:50 < bridge> i guess a timeout by ip or smth? 17:50 < bridge> i can see sp someone making 100 accounts per second 17:50 < bridge> yep, pretty hard one, but realistically you can probably also create 50 accounts on gmail this week 17:50 < bridge> that is maybe easy to rate limit 17:51 < bridge> Q: If the account server does die longer than the cert validity, is there any way we can have some contingency so we can still associate ranks later? 17:51 < bridge> but generally creating lots of accounts in ~1 month is hard to prevent i guess 17:51 < bridge> Q: can they beat cloudflare? 17:51 < bridge> it could fall back to the public key hash 17:51 < bridge> which is also the sessions public key 17:51 < bridge> yes. ask the account server for public-key associations in the past 17:52 < bridge> but tbh even if all these ideas are cool 17:52 < bridge> we should get some stuff done 17:52 < bridge> well it seems you already have some stuff done, which is exciting 17:53 < bridge> i have the account stuff done yes, connecting to game servers is done 17:53 < bridge> 17:53 < bridge> now it's about storing ranks 17:53 < bridge> п 17:53 < bridge> I'm guessing there only remains the very tough discussion about ranks and names 😄 17:53 < bridge> since i dont have a ddnet implementation yet, this is bit trickier 17:53 < bridge> https://discord.com/channels/252358080522747904/1263223077077254165/1264965554360291381 17:53 < bridge> i went to the bathroom and back and got a question, can a game server fake you being someone else? 17:53 < bridge> here my top3 questions 17:53 < bridge> still open 17:53 < bridge> i guess it can fake u not being authed 17:53 < bridge> oh wait 17:53 < bridge> wrong post sry 17:53 < bridge> the clients don't authenticate against each other so far 17:54 < bridge> feel like thats a very heavy topic xd 17:54 < bridge> https://discord.com/channels/252358080522747904/1263223077077254165/1264959094981136384 17:54 < bridge> https://discord.com/channels/252358080522747904/1263223077077254165/1264959094981136384 17:54 < bridge> Is this something that can be implemented? Any ideas so far? It would be kinda nice if I could make sure you were you e.g. 17:54 < bridge> can probably be implemented 17:54 < bridge> but not right now 17:54 < bridge> Perhaps the gameserver can let clients advertise a small signed blob as extra client info? 17:55 < bridge> OTR? xd 17:55 < bridge> i thought it would be cool to have a community server, which handles friend lists, could initiate private communication etc. 17:55 < bridge> BUT only ideas 17:55 < bridge> nvm otr is not this 17:55 < bridge> hi deen 17:55 < bridge> feel like thats a very heavy topic xd (edit nvm wrong message linked at first) 17:55 < bridge> let's skip that as out-of-scope except that we note that it'd be possible 17:55 < bridge> I'm not saying it has to be right now, but the possibility of it would be quite important to me. So if the scheme doesn't allow this it might be the time to reconsider 17:55 < bridge> thats nice 17:55 < bridge> doesnt that still depend on the game server being up to date 17:56 < bridge> yes, it's possible. you can sign something, and then it's fine 17:56 < bridge> its also important because users arent tech savvy and with accounts they might thing it gives them enough confidence to trust another is real? 17:56 < bridge> This is enough for me 17:58 < bridge> i think ur second question depends on how names are handled 17:58 < bridge> if its unique ascii, then maybe a random username is better at first 18:02 < bridge> my point about that is also mostly about the question if a user should actively register or passivly. 18:02 < bridge> 18:02 < bridge> In theory the account server could also take a username, but then it could never be changed, bcs it would require all game servers to sync with the account server to prevent unique violations 18:02 < bridge> if they just join kog and have an account, so no rank is ever lost, they can still think about user names later 18:03 < bridge> the account server itself should probably deal with user IDs only 18:03 < bridge> Nameless tee 🥹 18:03 < bridge> 18:03 < bridge> How are you gonna hanlde uniqueness? Can't you just do like previous dc account, with some id? 18:03 < bridge> account names can be some profile feature 18:03 < bridge> we can still decide whether they should be unique or not 18:04 < bridge> hm so its kind of similar to ur 3rd q as well no? 18:04 < bridge> i know this might not be the best approach, but Blockworlds handles account's the way old minecraft servers used to, you have your name you can freely pick (e.g nameless tee) and a way to auth yourself as a user (e.g /login mel mel123) 18:05 < bridge> ah true 18:05 < bridge> i guess more profile information can be added later on as well ? 18:05 < bridge> like cheater tags 👹 18:07 < bridge> yes 18:07 < bridge> it's all orthogonal to the actual accounts implementation 18:15 < bridge> user id should definitly not be something user facing 18:15 < bridge> a uuid v7 18:16 < bridge> quick info: uuid v4 is what everyone used in dbs but v7 is better because its better time indexed 18:16 < bridge> :owo: 18:16 < bridge> Could someone implement #2640 please :owo: 18:16 < bridge> https://github.com/ddnet/ddnet/issues/2640 18:19 < bridge> Does it need to be a uuid? I can imagine just a normal id working fine, are we planning for other account providers? 18:20 < bridge> a normal ID might just work 18:20 < bridge> maybe we could encrypt it so that user enumeration isn't a thing 18:36 < bridge> why the dummy looks in different direction when you are paused than when you are not? 18:38 < bridge> it's a bug, I think 18:44 < bridge> identity federation, when? 18:45 < bridge> Check iF' City servers :troll: 18:47 < bridge> Is it a concern? Most that could be derived is the amount of registered accounts we have, right? I assume we'd make this public some other way anyway 18:48 < bridge> not sure. maybe it's of no concern 18:48 < bridge> uuids are great ._. 18:48 < bridge> opaque identifiers might make it easier on us, so that we don't have to care about a specific format 18:54 < bridge> https://devblogs.microsoft.com/oldnewthing/20240708-00/?p=109959 18:55 < bridge> C++ finds out that `void` might be a good first-class type 19:07 < bridge> You mean you have to use that command every time you join the server? Ah hell no 19:07 < bridge> I can't imagine any use of it except for using inside a union. Does the blogpost go into it 19:07 < bridge> I can't imagine any use of it except for using inside a union. Does the blogpost go into it? 19:08 < bridge> No, Auto Login, that was an example 19:08 < bridge> Or perhaps as an extra SFINAE toy 19:08 < bridge> e.g. mapping the result of a future 19:08 < bridge> I see 19:09 < bridge> basically anything where you want to treat return types generically 19:13 < bridge> Ah, I see it's use now. The Regular Void proposal demonstrates it much better than the blog-post (though monostate can't fix this directly) https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0146r1.html 19:14 < bridge> yes, regular void would be amazing for C++ 19:24 < bridge> Hello. We are developing bots for TeeSports servers and we want to use it as fng and colorcatch fight bots in future on our servers. 19:24 < bridge> 19:24 < bridge> What should we take into account to use them to avoid warnings and bans? 19:24 < bridge> 19:24 < bridge> Current bots you can see on `188.133.192.77:8303`. 19:24 < bridge> 19:24 < bridge> FYI: 19:24 < bridge> 1. We can scale bots depending on the task. For example: we can use just 2 bots or scale them to 16. Same for colorcatch: 2→64. 19:24 < bridge> 2. We use k8s for hosting servers and other TeeSports infra, so bots can join servers using k8s network (`10.244.0.0/16` in our cases). 19:24 < bridge> 3. We use Swarfey library to make bots 19:24 < bridge> 4. Bots can send messages and they can use weapon, move etc. 19:24 < bridge> 5. Bots listed on master servers now, so i deployed only 3 bots on our test server (join `188.133.182.77:8303` to see), but I can scale in easy (see 1st list item) 19:24 < bridge> 188.133.192.77:8303 is an official TeeSports (DDNet, Region: 🇷🇺) server. TeeSports isn't affiliated with DDNet. 19:25 < bridge> Quick join: 19:25 < bridge> don't list the bots in the masterserver 19:26 < bridge> Good, but how we can do it? 19:28 < bridge> what's your server based on? ddnet or teeworlds 0.6? 19:30 < bridge> fng — teeworlds 0.6 19:31 < bridge> ccatch — 0.6 19:31 < bridge> 19:31 < bridge> We have many modes. Some on 0.6, some on ddnet, done on old ddnet (S-DDRace, TeeWare), some — mixing (F-DDRace) 19:31 < bridge> fng — teeworlds 0.6 19:31 < bridge> ccatch — 0.6 19:31 < bridge> 19:31 < bridge> We have many modes. Some on 0.6, some on ddnet, done on old ddnet (S-DDRace, TeeWare), some — mixed (F-DDRace) 19:31 < bridge> fng — teeworlds 0.6 19:31 < bridge> ccatch — 0.6 19:31 < bridge> 19:31 < bridge> We have many modes. Some on 0.6, some on ddnet, some on old ddnet (S-DDRace, TeeWare), some — mixed (F-DDRace) 19:31 < bridge> change the server info you send to not include the bots 19:31 < bridge> wdym? 19:31 < bridge> make sure to decrease num players/num clients/max players/max client accordingly 19:32 < bridge> k i'll 19:32 < bridge> k i'll see 19:32 < bridge> https://github.com/teeworlds/teeworlds/blob/93f5bf632a3859e97d527fc93a26b6dced767fbc/src/engine/server/server.cpp#L1128 19:33 < bridge> here, you'll also need to skip the bots, not only the empty player slots 19:33 < bridge> and here, too: https://github.com/teeworlds/teeworlds/blob/93f5bf632a3859e97d527fc93a26b6dced767fbc/src/engine/server/server.cpp#L1092 19:33 < bridge> for the counts 19:35 < bridge> That's all what we should know? Maybe something else? 19:35 < bridge> that's all you need 19:35 < bridge> Big thanks. 20:03 < bridge> how to read dis? :justatest: 20:03 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1265006243035222221/image.png?ex=669ff05f&is=669e9edf&hm=88bb929c472b95ea5aa8006b6c890b2eb29c932b9f6548bf06653af206534613& 20:15 < bridge> try from top to bottom 20:15 < bridge> looks pretty evenly distributed 20:15 < bridge> but the performance is still ass 20:15 < bridge> check out the big chunks at the top 20:16 < bridge> isn't that like ram usage? 20:17 < bridge> everything is parse, wtf xD 20:17 < bridge> i clicked on allocs in pprof :kek: 20:17 < bridge> looks like go 20:17 < bridge> it is go 20:18 < bridge> might help to put less stuff into empty interfaces 20:18 < bridge> it's not my code :lol: 20:18 < bridge> if that's the case 20:19 < bridge> i just wanted to check mybe i can "fix" 1min file generation for library called "templ" 20:19 < bridge> or tool, whatever it is 20:20 < bridge> link? 20:20 < bridge> url 20:20 < bridge> https://github.com/a-h/templ 20:20 < bridge> all files take ~0.05s while 1 file take 50s 😬 20:22 < bridge> hm, ._. big project 20:22 < bridge> looks highly recursive at least from the flame graph 21:08 < bridge> All I had to do to fix it is.... use formatter 21:08 < bridge> 21:08 < bridge> Before 21:08 < bridge> ``` 21:08 < bridge> 55.97s user 1.43s system 112% cpu 50.871 total 21:08 < bridge> ``` 21:08 < bridge> 21:08 < bridge> After 21:08 < bridge> ``` 21:08 < bridge> 0.02s user 0.00s system 105% cpu 0.021 total 21:08 < bridge> ``` 21:10 < bridge> hm? 21:10 < bridge> formated file takes 0.02s 21:10 < bridge> unformatted 55.97 21:11 < bridge> there's command `templ fmt` to format `.templ` files 21:12 < bridge> that sounds super cursed 21:12 < bridge> how long does the formatting itself take? xd 21:12 < bridge> ~50s :lol: 21:12 < bridge> if it's under 55.95 seconds 21:12 < bridge> would still be worth it xD 21:21 < bridge> the heck 21:21 < bridge> looked at the code base a little bit, looks like someone's wet generics dream 21:22 < bridge> Don't look at my rust code :justatest: 21:27 < bridge> ah, it's your compiler 21:27 < bridge> why does it take longer on unformatted code? oO 21:28 < bridge> ah no, not your own compiler 21:28 < bridge> ill make an issue and ask there 21:28 < bridge> or at least ask them to mention that somewhere xd 21:29 < bridge> for last few days i was waiting 1 min after each time i saved templ file :pepeW: 22:22 < bridge> ima go off for today, see ya - nightynights 22:23 < bridge> nightynight 22:45 < bridge> it was because my code had `
` tag and formatter was changing it to `
`, so in unformatted version it was also trying to parse child of `br` tag, that's why it was taking so long 22:56 < bridge> sounds like a meh parser 22:56 < bridge> `
` is a tag that doesn't need closing 23:02 < bridge> so someone can do support ddnet for steamdeck? 23:03 < bridge> 🧙‍♂️ 23:03 < bridge> done 23:03 < bridge> it should normally just work 23:06 < bridge> it's just doesnt shows in steam while search idk why, but it works if u open it via link 23:07 < bridge> did you search ddnet or ddracenetwork? 23:08 < bridge> both ways 23:09 < bridge> ok weird 😄 23:14 < bridge> it's just not certified to work, but it does 23:19 < bridge> getting certified, when? 23:20 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1265055923542691931/image.png?ex=66a01ea3&is=669ecd23&hm=f5ee3ae45be0b5b3b92f0c27aa5a9fd6d13598076cd2bc2c8df794642c729235& 23:21 < bridge> very weird requirement xD 23:21 < bridge> just a matter of flipping options. but we don't fulfill their conditiojs, I think 23:21 < bridge> hm, interesting 🙂 23:22 < bridge> could be a big marketing boost 23:22 < bridge> could(TM) 23:22 < bridge> market share of steam deck is not significant enough i guess 23:24 < bridge> not significant in our player stats is probably significant 23:24 < bridge> linux has a marketshare of 2% 23:24 < bridge> 23:24 < bridge> inside these 2% are steam deck users 23:25 < bridge> I would not approach it from a linux share perspective but from a how many people got a steam deck and what's the probability among other games that they find us and play the game. 23:26 < bridge> i think ddnet sucks on controller xdd 23:26 < bridge> i even finished a map on it 23:26 < bridge> Roby 4 the steam team 23:26 < bridge> x) 23:26 < bridge> do u have a steam deck? 23:26 < bridge> no 23:27 < bridge> playing with the thought but I'm too cheap for that currently. 23:29 < bridge> maybe touch support improves the experience ._. 23:46 < bridge> when i start it just black screen XD 23:46 < bridge> the native build? 23:47 < bridge> yes 23:47 < bridge> do you know how to change config? 23:49 < bridge> nope 23:50 < bridge> do you know how to add start arguments for a steam app? 23:51 < bridge> yep 23:51 < bridge> #8389 apparently known issue at least 23:51 < bridge> https://github.com/ddnet/ddnet/issues/8389 23:51 < bridge> try 23:51 < bridge> ``` 23:51 < bridge> "gfx_fullscreen 0" 23:51 < bridge> ``` 23:51 < bridge> 23:51 < bridge> and make sure to include the quotes 23:53 < bridge> afterwards try 23:53 < bridge> ``` 23:53 < bridge> "gfx_backend OpenGL" 23:53 < bridge> ``` 23:54 < bridge> "Reported by cheese0613, using SteamOS (works with Arch)" 23:54 < bridge> 23:54 < bridge> maybe the steamos drivers are outdated/buggy?