00:17 < bridge> [ddnet] With heinrich5991's upcoming HTTP master server (https://github.com/ddnet/ddnet/pull/3772, https://master1.ddnet.tw/ddnet/15/servers.json) we now also archive the player statistics: https://ddnet.tw/stats/master/ Maybe someone has a good use for that data already. 00:49 < bridge> [ddnet] this is not the best way to read C declarations btw, there is only one rule and it's "declaration follows use" 00:51 < bridge> [ddnet] i.e. try to imagine that the declaration tells you how to use it 00:51 < bridge> [ddnet] (*abc)[10] pointer to array 00:52 < bridge> [ddnet] *abc[10] == *(abc[10]) array of pointers 00:57 < bridge> [ddnet] if I asked you what you'd prefer to write the HTTP masterserver API for servers in, you'd probably say go out of python, go, rust? @Learath2 00:57 < bridge> [ddnet] go has the disadvantage (for me) that I don't know it well 01:30 < bridge> [ddnet] @heinrich5991 I don't know go well enough to suggest it for anything tbf 01:30 < bridge> [ddnet] I know this would be a decent usecase for it tho 01:31 < bridge> [ddnet] I think rust is our best bet here 08:31 < bridge> [ddnet] Oh oh i want to do it 09:58 < bridge> [ddnet] ok maybe scraping todays data, which is not zipped all into 1 file is a bad idea 09:58 < bridge> [ddnet] takes forever 09:58 < bridge> [ddnet] ```rust 09:59 < bridge> [ddnet] Captures( 09:59 < bridge> [ddnet] { 09:59 < bridge> [ddnet] 0: Some( 09:59 < bridge> [ddnet] "href=\"01_03_39.json\"", 09:59 < bridge> [ddnet] ), 09:59 < bridge> [ddnet] "hour": Some( 09:59 < bridge> [ddnet] "01", 09:59 < bridge> [ddnet] ), 09:59 < bridge> [ddnet] "minute": Some( 09:59 < bridge> [ddnet] "03", 09:59 < bridge> [ddnet] ), 09:59 < bridge> [ddnet] "second": Some( 09:59 < bridge> [ddnet] "39", 09:59 < bridge> [ddnet] ), 09:59 < bridge> [ddnet] }, 09:59 < bridge> [ddnet] ) 09:59 < bridge> [ddnet] ^C 09:59 < bridge> [ddnet] 09:59 < bridge> [ddnet] teeserverinfo on ξ‚  master [?] is πŸ“¦ v0.1.0 via πŸ¦€ v1.52.1 took 2m16s 09:59 < bridge> [ddnet] ``` 09:59 < bridge> [ddnet] only 1 hour and 2 mins already xd 10:12 < bridge> [ddnet] @TsFreddie whats the state of #3826 10:12 < bridge> [ddnet] https://github.com/ddnet/ddnet/pull/3826 10:13 < bridge> [ddnet] did nuborn still say something? 10:44 < bridge> [ddnet] concurrent players yesterday from the http master data 10:44 < bridge> [ddnet] https://cdn.discordapp.com/attachments/293493549758939136/844495638224830514/players_yesterday.png 10:45 < bridge> [ddnet] https://cdn.discordapp.com/attachments/293493549758939136/844495990609674260/players_yesterday.png 10:45 < bridge> [ddnet] concurrent players yesterday from the http master data, fixed xd 10:46 < bridge> [ddnet] here is the data which can be used for gnuplot 10:46 < bridge> [ddnet] https://cdn.discordapp.com/attachments/293493549758939136/844496189650108416/data.dat 11:14 < bridge> [ddnet] https://cdn.discordapp.com/attachments/293493549758939136/844503198177558538/data.png 11:26 < bridge> [ddnet] @Nouaa did -fsigned-char solve ur issue btw? 11:26 < bridge> [ddnet] i also remember now where why i knew about it, 11:27 < bridge> [ddnet] someone used to use raspberry for fng source: 11:27 < bridge> [ddnet] https://github.com/Jupeyy/teeworlds-fng2-mod/pull/1 11:27 < bridge> [ddnet] 11:27 < bridge> [ddnet] and then i told him to use fsigned-char and it solved his issue 11:35 < bridge> [ddnet] Works fine as-is. Can be better with a custom message or netobj, but I didn't got the time to do it. 11:35 < bridge> [ddnet] ok so nuborn was fine with it? 11:36 < bridge> [ddnet] Ye, the only thing he pointed out is the evolve thing which I took out already. And the lack of better way of sending tunezone tunings which is the "could be better" part 11:36 < bridge> [ddnet] If you haven't find anything weird with it, then it is probably fine 12:32 < bridge> [ddnet] @Ryozuki cool 12:43 < bridge> [ddnet] Depends on the tool you use. HTTP2 is absolutely required if you want to scrape thousands of small files (2.6 GB uncompressed here): 12:43 < bridge> [ddnet] ``` 12:43 < bridge> [ddnet] Downloaded: 9140 files, 269.61M bytes, 0 redirects, 0 errors 12:43 < bridge> [ddnet] wget2 -m -p -np https://ddnet.tw/stats/master/2021-05-19/ 26.11s user 17.92s system 153% cpu 28.619 total 12:43 < bridge> [ddnet] ``` 13:01 < bridge> [ddnet] i see 13:20 < bridge> [ddnet] with pretick weak hook & bounce works without breaking ddrace apparently: 13:20 < bridge> [ddnet] https://github.com/Jupeyy/ddnet/commit/55f5da8655f552f47e46c9d35c808e071ecb7937 13:20 < bridge> [ddnet] and should fix both hook and bounce, if im not mistaken 13:21 < bridge> [ddnet] with somebody needs it for local server or smth 13:24 < bridge> [ddnet] tbh I don't really know anything about writing HTTP APIs in rust 13:41 < bridge> [ddnet] what does the api need to do? 13:52 < bridge> [ddnet] yes thanks 13:52 < bridge> [ddnet] game servers will register themselves via this API. they'll send their server info, the masterserver will have to verify that port forwarding is done correctly, and then add it to the list of servers 13:52 < bridge> [ddnet] if the masterserver doesn't hear from a server in say 90 seconds, it gets dropped from the list 14:04 < bridge> [ddnet] I mean if you have to, we can do python, but please for the love of god atleast not django 14:10 < bridge> [ddnet] I see what you mean with python (deployment problems), I guess it'll not be python 14:10 < bridge> [ddnet] if it were python, it'd probably be flask or so 14:10 < bridge> [ddnet] Flask is fairly lean so I’d be okay with that 14:12 < bridge> [ddnet] Js does fairly well with this kind of real time work btw, if you want to take a look there 14:13 < bridge> [ddnet] With typescript it’s much less cancerous than it used to be. Though you are still running on node which is very meh 15:07 < bridge> [ddnet] so, the port forwarding verification, does this use a protocol that already exists i guess, the old way of getting server info via udp? 15:08 < bridge> [ddnet] i want to try to create it in rust, using https://docs.rs/warp/0.3.1/warp/ as the http server, its rly simple and clean 15:09 < bridge> [ddnet] but if anyone else prefers to do it themselves or in another lang just tell so i dont do this for no reason 15:34 < bridge> [ddnet] here is a quick setup to see how it looks https://gist.github.com/edg-l/efcc9b399a32f65c6676a747b0971459#file-ddnet-http-master-warp-rs 15:34 < bridge> [ddnet] and making a post with json works ez 15:34 < bridge> [ddnet] https://cdn.discordapp.com/attachments/293493549758939136/844568804574363688/unknown.png 15:39 < bridge> [ddnet] https://media.tenor.com/images/fded7d4a23c6948c267901e5ef83021f/tenor.gif 15:39 < bridge> [ddnet] :feelsbadman: 15:42 < bridge> [ddnet] i gotta find the ping protocol 15:51 < bridge> [ddnet] I'm also interested in doing it ^^ 15:52 < bridge> [ddnet] I thought the register info might look something like this: 15:52 < bridge> [ddnet] ```json 15:52 < bridge> [ddnet] { 15:53 < bridge> [ddnet] "info": { 15:53 < bridge> [ddnet] "clients": [ 15:53 < bridge> [ddnet] { 15:53 < bridge> [ddnet] "name": "heinrich5991", 15:53 < bridge> [ddnet] "clan": "", 15:53 < bridge> [ddnet] "country": null, 15:53 < bridge> [ddnet] "score": 123, 15:53 < bridge> [ddnet] "team": -1 15:53 < bridge> [ddnet] } 15:53 < bridge> [ddnet] ], 15:53 < bridge> [ddnet] "max_players": 64, 15:53 < bridge> [ddnet] "max_clients": 64, 15:53 < bridge> [ddnet] "passworded": false, 15:53 < bridge> [ddnet] "game_type": "DDRaceNetwork", 15:53 < bridge> [ddnet] "name": "DDNet RUS - Moderate [DDraceNetwork]", 15:53 < bridge> [ddnet] "map": { 15:53 < bridge> [ddnet] "name": "Sunreal", 15:53 < bridge> [ddnet] "sha256": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", 15:53 < bridge> [ddnet] "size": 12345 15:53 < bridge> [ddnet] }, 15:53 < bridge> [ddnet] "version": "0.6.4, 11.2.1" 15:53 < bridge> [ddnet] }, 15:53 < bridge> [ddnet] "port": 1234, 15:53 < bridge> [ddnet] "secret": "abcdef" 15:53 < bridge> [ddnet] } 15:53 < bridge> [ddnet] ``` 15:53 < bridge> [ddnet] where "info" is some free-form JSON object that is then hosted by us 15:54 < bridge> [ddnet] "port" is required because we don't know which port the server is hosted on 15:54 < bridge> [ddnet] "secret" would be used so the game server can recognize that it's the master server trying to probe the server 15:55 < bridge> [ddnet] also, the game server would probably try to register via ipv4 and ipv6 alternatingly, so the master server can learn both IP addresses 15:55 < bridge> [ddnet] i just send it as an example, since i dont know anything about how the request looks, nor the response nor the ping protocol 15:55 < bridge> [ddnet] sent* 15:56 < bridge> [ddnet] ah 15:56 < bridge> [ddnet] it was more an example to show if u like the library used for the http 15:56 < bridge> [ddnet] ah πŸ™‚ 15:56 < bridge> [ddnet] looks similar to flask I guess πŸ™‚ 15:56 < bridge> [ddnet] we will probs not use closures tho, since rust doesnt allow async closures yet, we can convert it to a function like this 15:56 < bridge> [ddnet] https://cdn.discordapp.com/attachments/293493549758939136/844574337683423242/unknown.png 15:57 < bridge> [ddnet] yes i find it super simple library 15:57 < bridge> [ddnet] and serde magick makes this so ez 15:58 < bridge> [ddnet] free form as in the server sends whathever it wants? 15:59 < bridge> [ddnet] even if it doesnt make sense to tw? 15:59 < bridge> [ddnet] yes 15:59 < bridge> [ddnet] the idea would be that it's the client imposing constraints on the JSON 15:59 < bridge> [ddnet] so it's the same as before, game servers get to send whatever they want. I'd like to have it this way so mods can experiment with new fields etc. 16:00 < bridge> [ddnet] yeah i find it good too 16:00 < bridge> [ddnet] well we need to limit the size of the body ofc 16:00 < bridge> [ddnet] yes 16:00 < bridge> [ddnet] to some kilobytes, probaby 16:01 < bridge> [ddnet] so, should we create a repo? 16:01 < bridge> [ddnet] this way we dont lose track of this 16:01 < bridge> [ddnet] and if we dont we probs will never get started 16:01 < bridge> [ddnet] I don't think a repo helps with that 16:02 < bridge> [ddnet] hmm 16:02 < bridge> [ddnet] but it helps collaborate 16:02 < bridge> [ddnet] or you want to do it alone? 16:02 < bridge> [ddnet] i dont mind 16:05 < bridge> [ddnet] hm. I think I'd prefer to do the start myself. @Ryozuki let's create a ddnet issue so we can discuss the details? 16:05 < bridge> [ddnet] okay 16:22 < bridge> [ddnet] apparently we should move the ddnet freenode channel to libera.chat or so 16:23 < bridge> [ddnet] @heinrich5991 btw can we take the chance and add skins to the master server api? 16:23 < bridge> [ddnet] so servers that support it allow showing skins in server details xd 16:24 < bridge> [ddnet] with the free-form JSON, this will be just a PR by you away 16:25 < bridge> [ddnet] cool, would probs look cool ^^ 16:27 < bridge> [ddnet] πŸ‘€ 16:45 < bridge> [ddnet] is there some freenode drama? 16:45 < bridge> [ddnet] https://www.kline.sh/ 16:45 < bridge> [ddnet] "freenode now belongs to Andrew Lee, and I'm leaving for a new network." 16:46 < bridge> [ddnet] freenode staff is leaving, they dont like this hostile takeover 16:46 < bridge> [ddnet] i dont see why we should keep that channel 16:48 < bridge> [ddnet] even ##C is talking about this 16:50 < bridge> [ddnet] "freenode IRC network purchased by VPN company PIA" 17:00 < bridge> [ddnet] hehe im the first in #ddnet on libera.chat 17:00 < bridge> [ddnet] does it even matter for publicly hosted chats? 17:01 < bridge> [freenode] I am using it from matrix right now. I won't mind discarding the channel if we set up a native matrix bridge (https://t2bot.io/discord/) 17:03 < bridge> [freenode] I would be happy about a native matrix bridge in general ^^ 17:05 < bridge> [ddnet] how does it look from either side? 17:06 < bridge> [ddnet] currently, we get [bot] [freenode] Zwelf[m] as your username 17:07 < bridge> [freenode] Currently I am logged in with my matrix account @zwelf:matrix.org and joined the room #freenode_#ddnet:matrix.org since matrix.org bridges all freenode channels 17:08 < bridge> [ddnet] I mean the t2bot.io, how does it look from both sides 17:08 < bridge> [ddnet] would the messages get bridged further to IRC by matterbridge? 17:09 < bridge> [freenode] I think only if messages from the bridge bot get relayed (they are marked as bot messages) 17:09 < bridge> [ddnet] im spreading the word of rust in liberachat 17:10 < bridge> [ddnet] I think we should indeed get out of freenode, we never really used it much anyway 17:10 < bridge> [ddnet] :monkalaugh: 17:10 < bridge> [ddnet] https://cdn.discordapp.com/attachments/293493549758939136/844592774708068382/unknown.png 17:11 < bridge> [ddnet] I checked the list of staffers that jumped ship and they are all people I mostly trust, if they jumped ship it’s too late for freenode ltd. 17:11 < bridge> [ddnet] yes one of them is the oldest staff member from freenode 17:12 < bridge> [ddnet] md, chris, edk are all people I’ve interacted with, very sensible people whose views I mostly tend to agree with 17:14 < bridge> [ddnet] we should probably get a replacement for the matrix users 17:14 < bridge> [ddnet] maybe I can set up matterbridge to also bridge to matrix 17:17 < bridge> [ddnet] people are spamming for cloak, and there is a madlad named cloak, the pings he must be receiving 17:17 < bridge> [ddnet] πŸ˜„ 17:36 < bridge> [ddnet] lmao angry bots spamming the freenode server 17:36 < bridge> [ddnet] :monkaS: 17:36 < bridge> [ddnet] https://cdn.discordapp.com/attachments/293493549758939136/844599426067464222/unknown.png 17:42 < bridge> [ddnet] im witnessing a live ddos 17:42 < bridge> [ddnet] https://cdn.discordapp.com/attachments/293493549758939136/844600847001190420/unknown.png 17:42 < bridge> [ddnet] holy shit 17:42 < bridge> [ddnet] watching a irc network be created is fun :monkalaugh: 17:57 < bridge> [ddnet] Lol 17:57 < bridge> [ddnet] Attacking freenode cuz nobody answered your question in #ffmpeg 18:13 < bridge> [ddnet] ```ddnet2 echo '\"' 18:13 < bridge> [ddnet] \" 18:13 < bridge> [ddnet] ddnet2 echo '\\"' 18:13 < bridge> [ddnet] \"``` 18:13 < bridge> [ddnet] Will god one day smite this evil thing called posix shell quoting? 18:22 < bridge> [ddnet] Please send help 18:22 < bridge> [ddnet] How do I escape a string to be used within double quotes? 18:27 < bridge> [ddnet] @Learath2 ``` 18:27 < bridge> [ddnet] echo -e '\\"' 18:27 < bridge> [ddnet] \" 18:27 < bridge> [ddnet] ``` 18:27 < bridge> [ddnet] ? 18:27 < bridge> [ddnet] hmm 18:28 < bridge> [ddnet] I output one escaped string, now I need to "unescape" it so that I can use it in a script 18:28 < bridge> [ddnet] ``` 18:28 < bridge> [ddnet] echo -e \"hello\" 18:28 < bridge> [ddnet] "hello" 18:28 < bridge> [ddnet] ``` 18:28 < bridge> [ddnet] is this wat u want 18:29 < bridge> [ddnet] `'ban ip.ip.ip.ip -1 "bad'\''[guy\"\\. Until May 20 16:05 UTC" # Learath2#2281: Learath2'` this evaluates to the single string `ban ip.ip.ip.ip -1 "bad'[guy\"\. Until May 20 16:05 UTC" # Learath2#2281: Learath2`. Now I need to escape this again before I can pass it along with `ssh $i.ddnet.tw "echo '$1' > servers/servers/*.fifo"` 18:30 < bridge> [ddnet] discord makes this hard to understand xd 18:30 < bridge> [ddnet] I used backticks so those are literally what I have at hand 18:30 < bridge> [ddnet] discord shouldn't be stealing any \ 18:31 < bridge> [ddnet] do u rly need to escape it? 18:31 < bridge> [ddnet] echo without -e doesnt interpret anything 18:31 < bridge> [ddnet] echo $1 18:31 < bridge> [ddnet] Currently I'm getting an unmatched quote 18:31 < bridge> [ddnet] hm, let me try to replace it with a echo -e, maybe the echo is indeed eating some of it 18:32 < bridge> [ddnet] nah, I honestly have no idea what is happening 18:37 < bridge> [ddnet] `ssh ger2.ddnet.tw 'echo -e '\''ban ip.ip.ip.ip -1 "bad'\''[guy\"\\. Until May 20 16:05 UTC" # Learath2#2281: Learath2'\'' > servers/servers/*.fifo'` this is what gets called and apparently has an unmatched quote 18:37 < bridge> [ddnet] dquote* 18:38 < bridge> [ddnet] `echo -e 'ban 78.46.174.82 -1 "bad'[guy\"\. Until May 20 16:05 UTC" # Learath2#2281: Learath2` this is what's left after the local shell escapes once 18:39 < bridge> [ddnet] :monkaS: 18:39 < bridge> [ddnet] @Learath2 u left he ip 18:39 < bridge> [ddnet] rip the user 18:39 < bridge> [ddnet] :pepeH: 18:40 < bridge> [ddnet] whatever it's my server 18:41 < bridge> [ddnet] the single quote in there is breaking it 18:44 < bridge> [ddnet] pff, `echo ${1:q}` worked instead of `echo '$1'` mostly because I couldn't find how tf one is supposed to escape a string that's about to go between single quotes 18:45 < bridge> [ddnet] can't believe anyone actually enjoys using this mess 18:47 < bridge> [ddnet] @Learath2 does '$1' even expand the argument? 18:48 < bridge> [ddnet] i think '$1' doesnt interpret $1 as a thing 18:48 < bridge> [ddnet] u need "$!" 18:48 < bridge> [ddnet] "$1" 18:48 < bridge> [ddnet] * 18:48 < bridge> [ddnet] iirc 18:48 < bridge> [ddnet] well im no bash expert 18:48 < bridge> [ddnet] double quotes used inside single quotes disable their special meaning and vice versa 18:49 < bridge> [ddnet] https://cdn.discordapp.com/attachments/293493549758939136/844617703951302686/unknown.png 18:49 < bridge> [ddnet] yes im right 18:49 < bridge> [ddnet] It's much more sophisticated than that, single quotes disable everything, dquotes only disable some things 18:49 < bridge> [ddnet] You would be if not for the fact that this entire thing was within dqotes 18:49 < bridge> [ddnet] rip 18:51 < bridge> [ddnet] `timeout 30 ssh $i.ddnet.tw "echo '$1' > servers/servers/*.fifo"` was the entire line here quotes have no meaning so $1 would get expanded, but since this will get executed on a remote shell that will expand the entire thing again 18:52 < bridge> [ddnet] The quotes there were meant to prevent expansion, but when $1 contains a quote you end up with a mess 18:52 < bridge> [ddnet] @Learath2 OH 18:52 < bridge> [ddnet] maybe put everything in '' 18:52 < bridge> [ddnet] when u send the command 18:52 < bridge> [ddnet] and it expands in ssh 18:52 < bridge> [ddnet] only there 18:53 < bridge> [ddnet] ah nvm 18:53 < bridge> [ddnet] so I either needed a way to escape $1 to be suitable within quotes (didn't find any), so I got rid of the quotes and instead used `${1:q}` directly because that's the only escaping capability I found documented 18:53 < bridge> [ddnet] u probs need to expand it locally 18:53 < bridge> [ddnet] ``` 18:53 < bridge> [ddnet] cat mess.txt | ssh $i.ddnet.tw 'cat > servers/servers/*.fifo' 18:53 < bridge> [ddnet] ``` 18:53 < bridge> [ddnet] does that rly work 18:53 < bridge> [ddnet] it should πŸ˜„ 18:53 < bridge> [ddnet] Yep, that was going to be my solution in about 15 minutes 18:54 < bridge> [ddnet] gg 20:10 < bridge> [freenode] heinrich5991: now I understand your question :). This is how it looks like https://github.com/Half-Shot/matrix-appservice-discord/blob/develop/screenshot.png (from the readme of the project, on the discord side bridged users talk with `matrixuser [bot]` and on the matrix side `discorduser (Discord)` is talking. 20:12 < bridge> [freenode] okay, misread the screenshot... on the matrix side `discorduser` is talking (without the "(Discord)") 20:30 < bridge> [ddnet] d 21:08 < bridge> [ddnet] https://twitter.com/Hetzner_Online/status/1394957824749457409 21:08 < bridge> [ddnet] :monkaS: 21:08 < bridge> [ddnet] https://cdn.discordapp.com/attachments/293493549758939136/844652684794920960/unknown.png 21:15 < bridge> [ddnet] I added 0.7 servers to the https masters 21:15 < bridge> [ddnet] for more statistics 21:16 < bridge> [ddnet] also, if some 0.7 client wants to use it, they can have a fast serverlist now 21:24 < bridge> [ddnet] my hetzner vps is 3 years old :monkaS: 21:24 < bridge> [ddnet] https://cdn.discordapp.com/attachments/293493549758939136/844656655370289173/unknown.png 21:24 < bridge> [ddnet] i wonder if they do hardware upgrades 21:26 < bridge> [ddnet] let's hope cryptocurrencies die soon 21:27 < bridge> [ddnet] i think i dont mind the crypto itself but the computing cost they have is nonsensical kinda 21:27 < bridge> [ddnet] maybe only the environmentally unfriendly ones 21:27 < bridge> [ddnet] yea 21:27 < bridge> [ddnet] that 21:28 < bridge> [ddnet] https://coincarboncap.com/ 21:29 < bridge> [ddnet] 101kg of CO2 per transaction on bitcoin 21:29 < bridge> [ddnet] insane 21:29 < bridge> [ddnet] isn't Chia supposed to be eco-friendly? 21:29 < bridge> [ddnet] it wears the ssd and bandwidth i guess 21:30 < bridge> [ddnet] it makes sense for them to not want clients who make use of full resources all times 21:30 < bridge> [ddnet] i found it here https://news.ycombinator.com/item?id=27212239 21:35 < bridge> [ddnet] We'd be losing probably the longest chain of trust ever generated along with the death of bitcoin, so we should probably be careful what we wish for πŸ˜› 21:57 < bridge> [ddnet] lel joshua treudler the biggest troll :feelspepoman: 22:20 < bridge> [ddnet] why is it that if I hold the hammer in frieze and hit my partner, he will fly further than if I did not clamp the hummer in frieze? 22:20 < bridge> [ddnet] why is it that if I hold the hammer in frieze and hit my partner, he will fly further than if I did not hold hammer in frieze? 22:20 < bridge> [ddnet] why is it that if I hold the hammer in freeze and hit my partner, he will fly further than if I did not hold hammer in freeze? 22:21 < bridge> [ddnet] cuz u hammer him 22:22 < bridge> [ddnet] I mean if I just hit it it won't fly far 22:23 < bridge> [ddnet] i mean the frozen tee holding hammers u 22:23 < bridge> [ddnet] there was a change to make this always happen 22:24 < bridge> [ddnet] He doesn't hit me 22:24 < bridge> [ddnet] idk what u mean then 22:25 < bridge> [ddnet] https://cdn.discordapp.com/attachments/293493549758939136/844672188984066058/External.demo 22:26 < bridge> [ddnet] can u download demo? or I can fraps it 22:56 < bridge> [ddnet] Great, thanks 23:16 < bridge> [ddnet] anyone multeasymap? 23:47 < bridge> [ddnet] https://youtu.be/jW18jxDNutQ