Guild icon
DDraceNetwork
Development / developer
Development discussion. Logged to https://ddnet.tw/irclogs/ Connected with DDNet's IRC channel, Matrix room and GitHub repositories — IRC: #ddnet on Quakenet | Matrix: #ddnet-developer:matrix.org GitHub: https://github.com/ddnet
Between 2020-12-08 00:00:00Z and 2020-12-09 00:00:00Z
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 07:31:13Z
well deen i guess someone has to prepare something for next advent that looks like aoc but is secretly ddnet issues
Avatar
[quakenet] deen BOT 2020-12-08 07:35:46Z
Hohoho, please fix bug #1234
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 08:09:13Z
lmao
Avatar
Fixes #3355 Works around https://github.com/google/googletest/issues/3040.

Checklist

  • [ ] Tested the change ingame
  • [ ] Provided screenshots if it is a visual change
  • [ ] Tested in combination with possibly related configuration options
  • [ ] Written a unit test if it works standalone, system.c especially
  • [ ] Considered possible null pointers and out of bounds array indexing
  • [ ] Changed no physics that affect existing maps
  • [ ] Tested the change with [ASan+UBSan or ...
Avatar
@deen https://github.com/ddnet/ddnet/pull/3387 fixes CI. deletes two tests (EXPECT_STREQs) that were brittle anyway and would have to be kept in sync with the code
Fixes #3355 Works around google/googletest#3040. Checklist Tested the change ingame Provided screenshots if it is a visual change Tested in combination with possibly related configuration optio...
09:43
i used the same answer
Avatar
acc=1532
Avatar
oh damn
Avatar
you accidentally put acc=
Avatar
i copied wrong
09:43
thanks to that i wasted 30 mins
09:43
staring at my screen
Avatar
oof
Avatar
I was trying to implement it in sed, but full programming in sed is more annoying than in perl
Avatar
How to increment a number for example: https://www.gnu.org/software/sed/manual/sed.html#DOCF9
sed, a stream editor
Avatar
ouch
Avatar
Will there be a webgl verwion of ddnet ?
Avatar
there was one, but it got outdated
09:54
not if nobody works on it
Avatar
and the servers don't run with websockets support atm
09:55
@mohsen7s https://github.com/eeeee/ddnet this is it
DDraceNetwork, a mod of Teeworlds. Contribute to eeeee/ddnet development by creating an account on GitHub.
09:55
if you want to work on it, some people recently got it building again. the coolest thing would be a demo viewer in browser
Avatar
@deen lol its 5 years old code
10:03
490a436 Remove failing blocklist_driver tests - heinrich5991 59cbc01 Bump minimum CMake version from 2.8 to 2.8.12 - heinrich5991 abd2a54 Bump to gtest from a commit SHA to 1.10.1 - heinrich5991 037b928 Manually patch gtest to allow CMake version 2.8.12...3.19.1 - heinrich5991 56a90c2 Merge #3387 - bors[bot]
Avatar
why do you support CMake 2.8? isn't that heavily deprecated? there's even no official documentation for versions below 3.0
Avatar
@Comrade not sure if we actually build with it. but in theory for centos 6&7
10:10
here's the official docs for 2.8.12: https://cmake.org/cmake/help/v2.8.12/cmake.html
Avatar
oh, didn't know that
10:11
10:12
CMakeLists.txt with more than 2000 lines 😦
Avatar
See older versions below.
10:29
yes, sorry for that
10:29
sorry for the 2000 lines I mean
Avatar
i think CMake is like C++ - it's very hard to write clean code in it, especially when you try to maintain compatibility with legacy tools
Avatar
but does it really need clean code? it'd be best if you didn't even need to touch it ^^
Avatar
it should be clean, otherwise we can go back to autotools 😄
Avatar
no, autotools doesn't work because it has poor windows support
10:32
I didn't choose cmake because it was "clean" or whatever
10:32
but because it was popular and well-supported by tooling
Avatar
yes, it's de facto standard build system for C++
10:34
i think build scripts should be as clean as possible, so anyone can check what it actually does
Avatar
with ninja and make you can print out what they actually do I think
10:34
ninja -v or make VERBOSE=1
10:35
helped me debug issues in the past
Avatar
yes, but i mean checking it before actual building
10:36
for example, there are some configuration variables and you need to dig through that huge CMakeLists.txt to see what they do
Avatar
hmm. my flippant answer would be: if you want to have configuration options, the cmakelists is going to be long. so why do you want to set options that are not documented in the readme?
Avatar
aren't there some useful options that are not documented?
Avatar
idk. right now it seems to me that you want conflicting things: a) short cmakelists.txt with b) many options
Avatar
i think it's possible to have both
Avatar
got an example?
10:41
of a "good" cmakelists?
Avatar
if you remove all that code used by legacy version of CMake...
10:43
here's one of mine, but it's Windows-only project, so it's incomparable with DDNet https://github.com/ccomrade/c1-launcher/blob/master/CMakeLists.txt
10:44
not sure if it's really a good one 😄
Avatar
by my naive counting, this reduces the line count by 54 lines
10:44
dropping support for older cmake
10:44
2660 → 2606
Avatar
let's see
Avatar
I removed all if(POLICY) branches that aren't executed and the if statements themselves, plus all if(CMAKE_VERSION) branches that do not match the current version, plus the if statements themselves
Avatar
i think if you get rid all those variables holding list of C++ source files, it should reduce line count as well
10:51
in newer CMake you can add sources to target on-the-fly with target_sources (edited)
10:54
but you're right that line count can't reduced that much because it's just complex project with a lot of things
10:55
it's only the beginning of CMakeLists.txt that looks so messy, the rest is quite readable (edited)
10:56
ideally, there should be no functions in CMake, but it's not always possible
11:03
Avatar
that would drop support for debian, unfortunately @Ryozuki
Avatar
Debian has CMake 3.13
Avatar
oh indeed, wow
Avatar
why r we supporting 2.8?
Avatar
This would drop support building DDNet with CMake from the following repositories: Distro | Released | Full support | Maintenance support until -------------+----------+--------------+-------...
Avatar
i dont get why we want to support centos-7
11:07
this is a game we are talking about, u should expect to have a updated system
Avatar
I guess the question is rather whether the dropped support gives us anything worthwhile in return
11:07
if not, we might as well support it
11:07
its probably only 1 or 2 people
11:07
using that
11:07
or maybe even 0
Avatar
it seems CentOS 7 really has only CMake 2.8
11:08
what a shame
Avatar
maintainability is a valid concern for dropping old version
11:08
s
11:08
but gaining nothing for dropping support doesn't seem sensible to me
Avatar
sudo yum install epel-release sudo yum install cmake3 [optional] sudo yum remove cmake sudo ln -s /usr/bin/cmake3 /usr/bin/cmake
11:08
u can install cmake 3 on centos-7
Avatar
dropping legacy code is valid reason i think, but it requires additional work
Avatar
only if that legacy code is stopping you from doing anything, or being a pain to work with
11:09
the pkg is called cmake3
Avatar
dropping legacy code for the sake of dropping legacy code doesn't seem valid to me
11:09
@Ryozuki make a new survey which cmake versions are supported where and do a PR
11:10
This would drop support building DDNet with CMake from the following repositories: Distro | Released | Full support | Maintenance support until -------------+----------+--------------+-------...
11:10
EPEL seems to be some third-party repository
Avatar
cmake3-3.17.3-3.el7.x86_64.rpm
11:11
11:11
official it says
Avatar
How do I install the extra repositories such as Fedora EPEL repo on a Red Hat Enterprise Linux server version 7.x or CentOS Linux server version 7.x?
Avatar
i would say its common to use EPEL
11:11
in centos
Avatar
I don't know anyone runnign centos, can't comment
11:11
but i would never run cmake 2.8
Avatar
how can you say that it's common then?
Avatar
because its what i would do
11:11
common sense
11:12
i always enable backports
11:12
in debian
Avatar
I don't
Avatar
no wonder companies like Adobe don't want to port their software to Linux when it's such a mess 😄
11:17
but proprietary software is bad anyway
Avatar
Has a short diff to the original code before a4f13ed4a85a4a2b. Supersedes #3353. Thanks for the idea, @timakro.

Checklist

  • [ ] Tested the change ingame
  • [ ] Provided screenshots if it is a visual change
  • [ ] Tested in combination with possibly related configuration options
  • [ ] Written a unit test if it works standalone, system.c especially
  • [ ] Considered possible null pointers and out of bounds array indexing
  • [ ] Changed no physics that affect existing maps
  • [ ] ...
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:36:13Z
+1
Avatar
Not like windows is soooo much better. The only thing they do well is keeping forward compatibility
11:43
I have like 5 versions of msvcrt and 5 versions of vcr++. With 4 build configurations, so that's 40 runtimes any piece of code could be running on
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:44:46Z
macos masterrace
11:44
lul
Avatar
The only reason adobe or any other company doesn't port to linux is MONEY. For profit corporations only care about maximizing shareholder profits
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:45:08Z
no adobe is just evil
11:45
xd
Avatar
yes, it's so sad that money controls everything
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:45:51Z
its only sad if u poor
Avatar
macOS is indeed pretty good at backwards and forwards compatibility. They really have a great idea there with the has_feature. But the problem there is the framework compatibility shims
11:46
The frameworks behave differently depending on your deployment target
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:46:54Z
well my macbook had many struggles staying compatible with my i mobile devices lol
Avatar
maintaining backward compatibility is a nice thing, but it has its drawbacks
11:47
just look at WinAPI 😄
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:47:17Z
just look at 0.6
Avatar
Hard part is forward compatibility anyway
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:48:16Z
isnt rust claiming to have gud forward compability
Avatar
Winapi is a sad state of affairs, idk why people enjoy it
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:48:36Z
because it has win in the name
Avatar
Like everything about windows at it's core it's actually decent
11:49
E.g. the ntkernel is actually fairly well designed and stable
Avatar
that's questionable - using UTF-16 everywhere internally is not so good idea i think
11:50
but it was designed more than 20 years ago, so we can't really blame it for that decision
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:50:07Z
\n\r
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:50:21Z
xd
11:50
see so complicated
Avatar
that's another good example
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:50:28Z
already messed it up
Avatar
I agree a lot of the backwards compat can be dropped
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:51:06Z
only good thing was clippy
Avatar
But that will create bugs, which will break the illusion that windows is stable
11:51
So they instead have layers upon layers of compatibility
11:51
Did you know that Windows doesn't actually even use UTF16?
Avatar
really?
Avatar
It uses a non compliant mess internally to support their "codepages"
11:53
Whenever I hear the word codepage I feel like we are operating a ww2 submarine
Avatar
isn't so called ANSI string using some codepage always converted to UTF-16 when you call some WinAPI function?
Avatar
https://devblogs.microsoft.com/commandline/windows-command-line-unicode-and-utf-8-output-text-buffer/ I think I linked this here before, this explains the history of this mess rather well
In this post, we’ll discuss the improvements we’ve been making to the Windows Console’s internal text buffer, enabling it to better store and handle Unicode and UTF-8 text. Posts in the Windows Command-Line series: This list will be updated as more posts are published: Command-Line Backgrounder The Evolution of the Windows Command-Line Inside th...
Avatar
Avatar
[quakenet] ChillerDragon
isnt rust claiming to have gud forward compability
it uses "editions" for that
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:53:59Z
ye
11:54
that thing
Avatar
and modern rust compilers can compile old editions i think
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:54:26Z
sounded cool
Avatar
I'm not sure I like either solution for compilers
Avatar
@heinrich5991 I still don't get what's up with your alternative fixes for alloc of 0 and why there are so many changes. Couldn't we just keep the old commit and do --- a/src/game/editor/io.cpp +++ b/src/game/editor/io.cpp @@ -560,6 +560,10 @@ int CEditorMap::Save(class IStorage *pStorage, const char *pFileName) df.AddItem(MAPITEMTYPE_ENVPOINTS, 0, TotalSize, pPoints); free(pPoints); } + else + { + df.AddItem(MAPITEMTYPE_ENVPOINTS, 0, 0, NULL); + } // finish the data file df.Finish(); (edited)
Avatar
not sounded, sounds*
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:55:15Z
well i heard it a while ago
Avatar
rust can have fast dev thanks to this
Avatar
I don't mind letting old code only be compiled by old compilers, but what about compiler bugs?
Avatar
a modern rust compiler can compile old editions and maybe even fix bugs
11:56
i dont know much tho
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:56:03Z
yeee
11:56
sounds fun and all but $ [ "${BASH_VERSINFO:-0}" -ge 4 ] && echo "bash supports associative arrays" is still supirior ofc
Avatar
But that means you need to carry around legacy cruft and even emulate bugs sometimes
11:56
im sure they have this well thought
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:57:01Z
rust fanboi
Avatar
Just to be clear: most features will be available on all editions. People using any edition of Rust will continue to see improvements as new stable releases are made. In some cases however, mainly when new keywords are added, but sometimes for other reasons, there may be new features that are only available in later editions. You only need to upgrade if you want to take advantage of such features.
Avatar
All compilers do it. Clang and gcc need to keep support for almost 2 decades of c and C++ standards
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 11:57:47Z
@fokkonaut
Avatar
Ah Rust seems to gate features, that might be a better compromise
Avatar
@Learath2 Windows command line has to deal with those codepages for sure, but when your code calls, for example, CreateFileA, it internally converts your string to UTF-16 and forwards it to CreateFileW that does the actual syscall, so everything is in UTF-16 internally
Avatar
Afaik its ucs2 for W too
Avatar
well, yes, it's not real UTF-16 probably 😄
Avatar
Fixed width
Avatar
exactly
12:01
sizeof (wchar_t) returns 2 on Windows while it returns 4 everywhere else 😄
12:01
what a mess
Avatar
My mantra is, if you are using a wchar, you are probably doing sth wrong
Avatar
good mantra 😄
12:02
UTF-8 for the win
Avatar
my mantra is dont use windows
12:02
sadSnail
Avatar
If only we could get mainstream adoption of linux :P
12:03
Won't happen without the flatpak bloar gettinf much much more popular
Avatar
oh no 😄
Avatar
Bloat*
Avatar
isn't Flatpak basically reinventing Windows with additional security due to sandboxing?
Avatar
Very similar, it packs every dependency though so it's even larger
Avatar
Windows apps have to carry most of its dependencies as well
Avatar
Critically windows apps dont carry msvcrt
12:07
Flatpaks carry libc iirc
12:08
Oh, btw has anyone seen qubesos?
12:09
Sounds like a great idea if you have a threadripper or a xeon workstation with many cores
12:09
Especially since kvm is blazing fast
Avatar
@timakro nice bible u writing there
12:10
👀
Avatar
@Learath2 it does full virtualization, right?
Avatar
@Comrade yep, sounds like the best attempt at privacy so far
Avatar
i think it's just a waste of performance because containers can do the same with lower performance impact (shared kernel etc) (edited)
Avatar
I like apples approach on iOS too, they really know how to do sandboxes well
12:12
Problem with containers is that they are just not as safe
Avatar
even full virtualization is not safe 😄
12:12
VM escape is real thing
12:13
but yes, containers are slightly safe always
Avatar
Well ofc, but find a bug in kvm and you'll be compromising a whole lot of hosters infrastructures
Avatar
*slightly less safe
Avatar
Containers are much better nowadays though
Avatar
docker and its loads of gb per container
Avatar
Docker is fail 😄
Avatar
God I hate docker
Avatar
systemd-nspawn is the way
12:14
(no flame war today) 😄
Avatar
LXC itself is nice, I wish someone else would implement the interface
Avatar
When the rust club is here I might as well ask a question. For todays advent puzzle I have a program counter variable pc which should probably be of type usize because it indexes the vector of instructions and I compare it to the length of the vector of instructions. But I want to add ani32 to pc which can be negative. I don't want to fail silently on conversions, thus I can't use as. How should I solve this? I have 2 solutions in mind: 1. When adding to pc convert pc to i32 first and then the result back to usize like this pc = usize::try_from(i32::try_from(pc).unwrap() + x).unwrap() 2. Make pc an i32 instead and everywhere were I need usize writeusize::try_from(pc).unwrap()
Avatar
declare it as i32
12:16
and cast it
12:16
pc as usize
12:16
when indexing
12:16
i do that
12:17
pc as usize
12:17
ah
12:17
ah
12:17
u dont want as
12:17
but i think its not a problem in this puzzle
12:18
o
12:18
l
12:18
lol
12:19
12:19
sadSnail
Avatar
yeah whatever I should do that
12:20
but why does rust make the unsafe option the nice and short one to write and for TryInto you even need to import stuff first
Avatar
well u need to import that trait
Avatar
put it in prelude
Avatar
i dont think its common enough
Avatar
for i in &mut instr { if let Instr::ACC(a) = *i { *i = Instr::NOP(a); } else if let Instr::NOP(a) = *i { *i = Instr::ACC(a); } if let SimResult::Term(acc) = simulate(&instr) { println!("Found solution, accumulator is {}", acc); } } error[E0502]: cannot borrow `instr` as immutable because it is also borrowed as mutable --> src/main.rs:62:48 | 56 | for i in &mut instr { | ---------- | | | mutable borrow occurs here | mutable borrow later used here ... 62 | if let SimResult::Term(acc) = simulate(&instr) { | ^^^^^^ immutable borrow occurs here
12:28
I never really understood why those strict borrow rules. Thread safety I guess, but I have no threads ... (edited)
Avatar
wats instr
Avatar
a Vec<Instr>
Avatar
try instr.iter()
12:30
and put the &mut in the i
12:30
iirc
12:30
ah
12:30
@time
12:30
@timakro iter_mut()
12:31
Avatar
It's the same
Avatar
remove the &
12:31
in the simulate
12:31
hmm
Avatar
I want to borrow though
Avatar
try it
Avatar
It takes &Instr?
12:32
sry
12:32
&Vec<Instr>
12:32
I can ofc iterate over the indices
12:32
I doubt I'll ever be able to write rust and be sure that it compiles
12:33
It's more like trial and error
Avatar
u just dont know well enough how the borrow stuff works
12:33
can u send me the code u have
Avatar
I guess spoiled by other languages, I'll never get used to those borrow restrictions
12:34
It's not that I can't make it work, just thinking of the best/idiomatic solution
Avatar
well if u dont have the will to do so i guess
12:34
yeah and i want to try to show u
12:36
i guess this is what u want to achieve right
12:43
Ok, I just iterated over the indices now and solved the puzzle 🥳
12:43
But I still want to understand the purpose of the borrow rules. That would be the only way for me to learn them
12:44
I never got behind the purpose really
Avatar
@timakro
12:44
yeah iterating with indices and using get_mut is the best choice here
Avatar
because I need to swap it back later anyways I'm just indexing now
12:46
for i in 0..instr.len() { if let Instr::JMP(a) = instr[i] { instr[i] = Instr::NOP(a); } else if let Instr::NOP(a) = instr[i] { instr[i] = Instr::JMP(a); } if let SimResult::Term(acc) = simulate(&instr) { println!("Found solution, accumulator is {}", acc); } if let Instr::JMP(a) = instr[i] { instr[i] = Instr::NOP(a); } else if let Instr::NOP(a) = instr[i] { instr[i] = Instr::JMP(a); } }
12:47
idk why i prefer using .get instead of indexing directly
12:48
u can handle the error
Avatar
Well, this example from the book really blew my mind let mut v = vec![1, 2, 3, 4, 5]; let first = &v[0]; v.push(6); println!("The first element is: {}", first); I was like why doesn't it compile. But the explanation is
The code in Listing 8-7 might look like it should work: why should a reference to the first element care about what changes at the end of the vector? This error is due to the way vectors work: adding a new element onto the end of the vector might require allocating new memory and copying the old elements to the new space, if there isn’t enough room to put all the elements next to each other where the vector currently is. In that case, the reference to the first element would be pointing to deallocated memory. The borrowing rules prevent programs from ending up in that situation.
That's awesome. But in my situation above I don't see a problem. Sure the scope of the loop can mutate the Vector, but it can't do that while the function is running, because well, the function is running
Avatar
this is why rust isnt a easy language
12:49
i also fighted against the borrow checker
12:49
xdd
12:49
and sometimes still do
12:49
but i still like it
12:52
12:52
i once struggled with this xd
Avatar
Day 8 was fun
13:07
but too simple
Avatar
Well last year you expanded quite a bit on your "computer" over the days, I guess it'll be like that again
Avatar
well this is not our computer
13:09
its a kid gameboy
13:09
i doubt we will be with the kid longer
13:09
xd
Avatar
we might snatch it 😛
Avatar
@timakro you can opt into "single threaded, etc." by wrapping your copyable type in a Cell
Avatar
I don't quite like my solution today but didn't really feel like cleaning it up
Avatar
it has set and get which only take a constant reference
Avatar
i should look more into Cell
13:11
til
Avatar
@timakro my diff is very small to the original code, before deen changed it
Avatar
Oh btw @heinrich5991 we can build with cmake 2.8 there were two broken things and I fixed them 😛
Avatar
oh interesting
13:13
these are the only two lines that I changed
Avatar
@heinrich5991 Oh, didn't see that's the point, I agree then
Avatar
@heinrich5991 why cell and not refcell?
Avatar
@Ryozuki because it plays nicer with copyable types
13:13
no panicking functions
Avatar
Shareable mutable containers exist to permit mutability in a controlled manner, even in the presence of aliasing. Both Cell<T> and RefCell<T> allow doing this in a single-threaded way. However, neither Cell<T> nor RefCell<T> are thread safe (they do not implement Sync). If you need to do aliasing and mutation between multiple threads it is possible to use Mutex, RwLock or atomic types.
13:13
nice
13:14
so this is what cell stuff is for
13:14
very useful
Avatar
it's a bit annoying to use, because it doesn't has first-class language support
13:16
btw, you never need x.iter() or x.iter_mut() in the parameter of a for loop @Ryozuki. use &x or &mut x instead
Avatar
why not
13:16
is there a difference
Avatar
no difference, but I think the rust style is using the latter
Avatar
Well the compiler is smart enough to figure it out for you, you usually let it
Avatar
i thought the style was using iter()
13:20
they dont show that here
Avatar
interesting. the Vec doc uses & though
13:23
I can't find anything about that right now. I assumed it was the other way around because the &/&mut syntax was explicitly introduced after the other syntax already existed
Avatar
i think iter is more explicit
Avatar
I think & is shorter :D
Avatar
RFCs for changes to Rust. Contribute to rust-lang/rfcs development by creating an account on GitHub.
13:25
oof, that is old. rust used to change a lot back then 😄
Avatar
All database results are now derived from ISqlResult, to store the synchronization variable there. All accesses to results were changed in score.cpp (s/pData->m_pResult/pResult/g) causing a rather big diff. This was necessary, since the database worker has to access the result for each query to notify when a query is complete.

Checklist

  • [ ] Tested the change ingame (already some queries with sqlite, but not all yet)
  • [ ] Provided screenshots if it is a visual change
  • [ ] ...
17:24
b256250 Synchronize database thread via atomic_bool instead of use_count from shared pointer - Zwelf 1e599f6 Merge #3390 - bors[bot]
Avatar
fb7a33d Add FreeBSD instructions - def- 4c08a61 Merge #3386 - bors[bot]
Avatar
that switch is smart
18:47
POGGIES
Avatar
oof. implicit fallthrough
18:54
bad deen
Avatar
implicit fallthrough ❤️
Avatar
@Learath2 any reason to not use explicit fallthrough?
Avatar
prettier :P\
Avatar
// fallthrough
19:27
Avatar
// Durchfall
Avatar
[quakenet] ChillerDragon BOT 2020-12-08 19:36:27Z
oof :D
19:38
lul github darkmode rlsd
19:39
rip all the ppl who bought some 3rd party software :D
Avatar
was it released
19:51
omg
19:51
true
19:51
insane
19:51
so many years
19:51
for this
19:51
19:54
it's dark
Avatar
finally...
Avatar
PogU 👉🏼 🌃 (edited)
Avatar
white themes suck
Exported 390 message(s)