#AO-SDL updates

1 messages · Page 2 of 1

chilly ridge
#

That's just the default discord filter.

#

I'm sure if you give them a complaint ticket they'll consider it.

loud falcon
#

i'm not doing that

chilly ridge
#

I understand.

#

I won't either.

thick osprey
#

if im writing something Real™ like a driver or anything touching physical addresses

#

i would rather eat my own shit than touch rust or cpp

shrewd fox
#

oh damn there is a flutter app in ao-sdl

thick osprey
#

i've been told that rust's async i/o api is "really good actually"

#

c++ almost has one in cpp20

shrewd fox
#

hell nah rust async is terrible

terse bridge
#

chatgpt isn't getting paid to work on windows 11

thick osprey
#

the only language with async i/o that doesnt fucking suck is Go in my experience

thick osprey
#

ao-sdl has a multithreaded http server with an event loop as well as async network i/o for the client if you want an idea of what it looks like in cpp

loud falcon
#

go is a language for linkedin posters and bpd transgenders

thick osprey
#

is this true

loud falcon
#

only two people i knew who were go evangelists were the former and the latter

thick osprey
#

does rust have any sort of functioning bindings for vk/ogl yet

shrewd fox
thick osprey
#

or is it still "some guy in his basement made an ffi to the c api that doesnt load the driver fps properly or work at all"

#

wgpu is not bindings to vk/ogl

#

its a graphics library that uses them on the backend

shrewd fox
#

there is ash for vulkan

thick osprey
#

neat

#

is there anything for metal

#

or, for that matter, is there literally any obj-c ffi that isnt utter cock and ball torture

shrewd fox
#

good luck using objective c with rust

thick osprey
#

objc++ is bad enough

#

do you know how many times ive been burned by "ARC and stl containers dont play nice"

#

if you std::move an obj-c object the OS gets a wide shit eating grin and starts buffering up the crash report before you even run the app

shrewd fox
#

I have only ever used ARC for trying to mod geometry dash (because cocos2d-x has objc roots and it mainly uses ARC)

thick osprey
#

i still dont know what @autoreleasepool does and at this point i'm scared to ask

loud falcon
#

i had to learn an appreciable amount of ActionScript because a programmer who shall not be named wrote a bunch of nintendo ds graphics tooling in it for some godforsaken reason

thick osprey
#

isnt that literally the scripting language for adobe flash

loud falcon
#

Yes

#

It compiles to .swf

thick osprey
#

lol

#

the fact that objc++ works at all is just like

#

i have no words for it honestly

#

it feels so cursed

#
        std::string combined = shader->vertex_source() + "\n" + shader->fragment_source();
        NSString *src = [NSString stringWithUTF8String:combined.c_str()];
#

this is REAL code written by REAL macos developers

#
        id<MTLTexture> view() const { return (__bridge id<MTLTexture>)view_ref; }
        void set_view(id<MTLTexture> v) {
            if (view_ref)
                CFRelease(view_ref);
            view_ref = v ? CFRetain((__bridge CFTypeRef)v) : nullptr;
        }
#

statements dreamed up by the utterly insane

shrewd fox
#

all of this for metal support?

thick osprey
#

i mean

#

its either that or wrap it in a C API

#

or write the entire thing in swift

#

i could ship moltenvk but then

  1. i'd have to write a vulkan backend (i honestly need to do this anyways because ogl's global state shitpile doesnt play nice with qt, and also android support)
  2. i'd lose out on being able to do zero-copy "GPU" allocations and the memory usage would bloat to shit from the asset cache shadowing the "GPU" memory
  3. i have no idea what the runtime for that looks like and i honestly dont want to figure it out
  4. i kind of don't trust it fully
#

dont even get me started on ogl

#

cant believe it took like 20 years for AMD to say "ok enough is enough" with that flaming garbage pile

#

why the fuck is everything in global state? why does glBind exist at all? it already has opaque identifier tokens, how hard is it to just pass that into an idempotent api???

shrewd fox
thick osprey
noble drum
#

I do like Cargo too.

thick osprey
#

also

#

impeller operates at a higher level of abstraction

#

ao-sdl has a full 2D scene graph and compositor

#

i'd just be doing hacks to parse that structure and hand it off to impeller to just... create the same thing on its backend

shrewd fox
#

makes sense

thick osprey
#

have you dug into ao-sdl at all

#

it works very fundamentally differently from ao2

#

for example, the "renderer" is not made from form widgets

shrewd fox
#

that's how much I dug into ao-sdl

thick osprey
#

neat

#

main things its missing are:

  • the custom http implementation i added and the http/2 dualstacking via nghttp2
  • the entire server architecture
noble drum
#

I love that Qt OpenGL SceneGraph is so dogshit that it basically requires Vulkan.

loud falcon
thick osprey
#

idk if i put it in the architecture doc either but theres also a platform abstraction backend via link-time polymorphism

#

which used to just have some tiny helpers

#

but now the socket and poll apis live there too

noble drum
#

Given there are people out there who still think QMovie is not utter dogshit.

loud falcon
#

i should PR aolayer in to replace qmovie

thick osprey
#

i was using httplib but its server implementation is dogshit (one thread per client inside of a fixed-size thread pool)

noble drum
thick osprey
#

i also found some cheap header-only socket abstraction but it didnt support polling

#

so all of that converged and i had to just

#

write http

#

i think it works

#

i added unit tests against the core parts of the rfc

noble drum
#

I am still mesmerized by the fact that it just works

thick osprey
#

i didnt implement http/2 on the server side

#

i think its far more pragmatic to just let people sit caddy in front of it

#

for that reason i didnt bother with ssl on the server side either

noble drum
#

That's the defacto status quo on AO2 too.

#

Wether it's NGINX, Apache or Cloudflare

thick osprey
#

yeah, it just makes sense

#

handling ssl fucking sucks anyways

#

have you ever had to parse an os certificate store

noble drum
#

Yes

thick osprey
#

have you ever had to deal with the awful leaky abstraction that is OpenSSL BIO

noble drum
#

No.

#

Querying the certificate store is hell unless it's already a tool native to the OS

#

Powershell my beloved

thick osprey
#

dont even get me started on openssl

#

it was funny when i was statically linking it in the macos binary and it inflated to like 8MB because brew's openssl binary had like half a megabyte of precomputed data for an outdated chinese government encryption standard

#

it actually also includes the entire webp encoder because parsing animated webps requires some interface that lives in the encoder even though the decoder needs it

#

at least now macos uses Network.framework and linux/windows just dynamically link to openssl

#

cant do that in macos because shipping .dylibs is cursed and there is no system openssl

noble drum
#

At least the Qt frontend for the theme creators who want to go super granular is slowly taking shape.

thick osprey
#

theres also definitely a bug in the way that the asset cache image previewer in the debug window interacts with the pinning system and i think it might only exist on macos because on macos it has to blit the assets to a separate texture because of the way the objc semantics interact wi-

#

you know i dont think anyone here will understand or care

#

i barely do

#

its a miracle this codebase works at all

#

im a talentless vibecoder hack

#

i am gonna give up and start over again from scratch

noble drum
#

April first was yesterday.

thick osprey
#

what makes you think im joking

#

the secret is clean code and good architecture are a myth

#

look at anything of sufficient complexity

#

all you can do is try to make refactoring easier

#

i need to get ready for the launch on friday night

#

read: i need to make my sleep schedule intentionally worse

shrewd fox
thick osprey
#

yes

#

i mostly use it for documentation

#

it writes all of my commit messages bc otherwise theyd all be "added thing"

#

i also use it to write repetitive bullshit that is a waste of my time

loud falcon
#

just be like sd and insert inscrutable memes filled with swear words into the commit log forevermore

thick osprey
#

like, you think i'm writing this by hand? lol

shrewd fox
#

hell nah

noble drum
#

I think "updating a buncha files" is a valid commit message

#

Or swearing.

thick osprey
shrewd fox
thick osprey
#

yeah lol

#

i like claude code but its really stupid but its also really smart

#

i understand why people kneejerk react to it negatively

#

but also like, i feel like you're just wasting your own time at some point if you refuse to touch it on principle

noble drum
#

Never try to vibe code a SDL to Qt Frontend Migration!

thick osprey
#

in my job, writing code is maybe like

#

10-15% of what i do

#

writing code isnt the hard part

#

designing software is hard

shrewd fox
#

me personally I just use gemini to copy code when I'm so lazy

but I mostly write code by hand (unless it's boilerplate)

#

ai is GOATED in boilerplate

thick osprey
#

claude wrote basically all of the javadoc-style engine api docs

#

as well as the big fancy architecture docs

#

but not just freeform

#

it just turned my shitty all lowercase hyphenated lists into something useful

noble drum
thick osprey
#

i do most/all of the api design by hand

#

if things are sufficiently hairy (low level, concurrency, etc) i do it by hand

#

but idk what i really gain by implementing a function like

#

void RestRouter::dispatch(RestEndpoint& endpoint, const http::Request& req, http::Response& res) {
    // CORS headers are set globally via set_default_headers in bind().
    try {
        // Build RestRequest from http::Request (no lock needed — pure parsing)
        RestRequest rest_req;
        rest_req.method = req.method;
        rest_req.path = req.path;

        for (auto& [key, value] : req.path_params)
            rest_req.path_params[key] = value;

        for (auto& [key, value] : req.params)
            rest_req.query_params[key] = value;

        // Parse JSON body if present
        auto content_type = req.get_header_value("Content-Type");
        if (!req.body.empty() && content_type.find("application/json") != std::string::npos) {
            try {
                rest_req.body = nlohmann::json::parse(req.body);
            }
            catch (const nlohmann::json::parse_error&) {
                res.status = 400;
                res.set_content(R"({"reason":"Malformed JSON in request body"})", "application/json");
                return;
            }
        }

        // Extract bearer token
        auto auth_header = req.get_header_value("Authorization");
        if (auth_header.size() > 7 && auth_header.substr(0, 7) == "Bearer ") {
            rest_req.bearer_token = auth_header.substr(7);
        }

        // Single lock for auth + handler — prevents session from being
        // destroyed between the auth check and the handler call.
        RestResponse rest_res;
        {
            std::lock_guard lock(dispatch_mutex_);

            if (endpoint.requires_auth()) {
                if (rest_req.bearer_token.empty()) {
                    res.status = 401;
                    res.set_content(R"({"reason":"Missing session token"})", "application/json");
                    return;
                }
                if (!auth_func_) {
                    res.status = 500;
                    res.set_content(R"({"reason":"Server authentication is not configured"})", "application/json");
                    return;
                }

                rest_req.session = auth_func_(rest_req.bearer_token);
                if (!rest_req.session) {
                    res.status = 401;
                    res.set_content(R"({"reason":"Invalid or expired session token"})", "application/json");
                    return;
                }
                rest_req.session->touch();
            }

            rest_res = endpoint.handle(rest_req);
        }

        // Write response (outside lock — no game state access)
        res.status = rest_res.status;
        if (rest_res.status == 204 || rest_res.body.is_null()) {
            // No content
        }
        else {
            res.set_content(rest_res.body.dump(), rest_res.content_type);
        }
    }
    catch (const std::exception& e) {
        Log::log_print(ERR, "REST: exception in %s %s: %s", endpoint.method().c_str(), endpoint.path_pattern().c_str(),
                       e.what());
        res.status = 500;
        res.set_content(R"({"reason":"An internal server error occurred"})", "application/json");
    }
}
#

i just say like "write the dispatcher and wrap the access to shared state in a global lock" and describe the spec

shrewd fox
#

I don't really care if something is vibecoded
as long as the code quality is good

thick osprey
#

its easy to vibecode your way into unmaintainable monolithic useless slop

#

you have to know where to be opinionated, where to insert your taste and your voice, and wehre to tell it to shut up and change its approach

#

its like

#

working with a junior engineer who rote memorized every textbook

#

it will always reach for the naive implementation, the leaky abstraction, the god class, hit all of the same roadblocks as someone who doesnt know better

#

but if you constrain it properly it just makes you insanely fast

noble drum
#

It also helps a lot to do your research first to give it some initial guidance from the get go or you end up with parent.parent.parent.parent.parent.parent.parent.parent.parent in QML

shrewd fox
#

the people who will actually gain something from vibe coding is actual swes who know what they're doing

thick osprey
#

am i an actual swe shy

shrewd fox
#

you write code

thick osprey
#

i like baiting people into asking what i do for work because it feels like a credibility truth nuke

shrewd fox
#

what does that make you

thick osprey
#

HEY

#

YOU STOLE MY FAVORITE PART

shrewd fox
#

😶‍🌫️

thick osprey
shrewd fox
#

I've only ever seen that once lmao

I guess they are evolving and realized that maybe localhost isn't how you ship

#

they probably use vercel or something similar now

thick osprey
#

"shipping" is an illusion sold to you by aws

#

talk to me when you ship your code past the karman line

loud falcon
#

whereas "shipping" is the department of the rest of amazon

thick osprey
#

TRUE

shrewd fox
#

this is my first time I've seen a flight software engineer

#

I thought y'all were still stuck on Ada or something

thick osprey
#

i wish we did anything that sane

#

im gonna be the flight controller for the flight software seat on our next launch on friday night

#

its cool

#

i'm part of the go/no-go poll

#

i monitor 30 or so sats as they go through deployment and activation and LEOPs

#

triage any issues that show up

#

its fun

shrewd fox
#

one day I'll be that good

thick osprey
#

i feel like i just kind of lucked into this job myself

#

no degree and 3 years of industry experience

loud falcon
#

i wish i was a little bi t taller i wish i w as a baller

thick osprey
#

true

shrewd fox
#

I only have like 1 year of coding experience lol

thick osprey
#

ive been programming since

#

uh

#

idk it depends what you call programming

#

when i was like 8 i was making "games" in powerpoint using the silde-to-slide transitions sequencing

alpine acorn
#

What are your guys thoughts on haskell

thick osprey
#

i learned java when i was... 12 or 13?

shrewd fox
alpine acorn
#

It looks cool

thick osprey
#

i feel like you need a cs phd to understand the type system in haskell

loud falcon
#

i dont have an opinion on haskell because the only three languages i know are c++ python and wrightscript

alpine acorn
#

Phoenix wrightscript

loud falcon
#

Yes

shrewd fox
#

the type system in haskell is basically Turing complete

alpine acorn
#

My beloved

loud falcon
#

it's the scripting language for pywright

thick osprey
#

literally what it is

#

imo there are three kinds of programming languages

alpine acorn
shrewd fox
noble drum
#

In1 writes stuff in PyWright that feels forbiddden.

loud falcon
#

i wrote a brainfuck interpreter in it

alpine acorn
#

Lmao

shrewd fox
thick osprey
#
  • those that boil down to machine truth - you are given an abstract machine upon which you operate in an analagous manner to machine code. turing machines
  • those that boil down to abstraction-truth, the scheme, haskell, FP nonsense of the world, where you operate on the most pure and abstract math-nice things. lambda calculuses
  • data scientist baby glue - python, ruby, bash scripts, javascript
alpine acorn
#

Oh like a @hard wing

shrewd fox
#

with servant

loud falcon
noble drum
alpine acorn
loud falcon
shrewd fox
thick osprey
#

the perfect programming language already exists

#

and it was made at bell labs in the 70s

alpine acorn
#

Its

#

Python

#

. . .

thick osprey
#

the second best programming language is just a code generator for the best programming language that gives you things like "type safety" and "smart pointers" and "containers"

#

every C++ program can be described with an equivalent C program

noble drum
#

Templates:

thick osprey
#

templates are literally just "generate a type specific implementation of this for me automatically"

noble drum
#

Aren't they adding reflection to C++23?

alpine acorn
shrewd fox
alpine acorn
#

Zig 🌩️

shrewd fox
# alpine acorn

zig is the compiler that wouldn't compile your code just because the creator thinks you wrote shitty code

thick osprey
#

reflection is also just "what if the compiler generated specifiers as strings with a macro and did this type safely"

#

zig

noble drum
thick osprey
#

zig is worse C with worse opinions and a worse ecosystem

shrewd fox
noble drum
#

An unused function is a useless function

thick osprey
#

why make a "better C" when C already exists???

shrewd fox
alpine acorn
#

Iirc

shrewd fox
#

wait why don't people just upgrade their c++ versions to always be the latest

alpine acorn
#

Idk much ab zig

thick osprey
thick osprey
thick osprey
shrewd fox
#

oh yeah I forgot that compilers take decades to implement a standard fully

thick osprey
#

have you seen the C++ spec

shrewd fox
shrewd fox
alpine acorn
thick osprey
#

it uses the exact same code generator as C and C++ in clang

alpine acorn
#

Man all these people

#

Saying zig is faster than cpp

#

....

shrewd fox
#

MAYBE in some edge cases but I can't really see why

thick osprey
#

zig users on average know very little about programming

#

it seems to be more of an aesthetic lifestyle signal for a certain type of person

#

mostly obnoxious silicon valley hustle types on twitter in my experience

alpine acorn
shrewd fox
#

I do like zigs optional and result types

that's like honestly one of the most useful things ever

thick osprey
#

std::optional is right there

shrewd fox
#

zig is marketed as a better C not a better C++

alpine acorn
#

Ahh

thick osprey
#

true

#

NULL is right there

shrewd fox
#

NULL only works if your function returns a pointer

thick osprey
#

if youre not insane you can also implement a tagged union in a header in about 15 minutes

shrewd fox
thick osprey
alpine acorn
noble drum
alpine acorn
thick osprey
#

GIVE ME A LANGUAGE WITH:

  • the type and memory safety of C
  • the simplicity of C++
  • the generics of Golang
  • the compile times of Rust
  • the portability of an assembly language
  • the boilerplate of Java
  • the imperative flow control of SQL
  • the speed and package management infrastructure of Python
  • the ecosystem maturity and flexibility of Zig
  • the type system of Javascript
  • the security of PHP
  • the readability of Perl
alpine acorn
#

The stickers are cute though

alpine acorn
#

It does

#

Its called perl

thick osprey
thick osprey
alpine acorn
#

LOL

shrewd fox
#

Perl sucks

#

im being honest

#

write only language 😭

alpine acorn
#

Php and perl

#

Are the goats mf

thick osprey
#

3290!#(%1 jopweklf 3 @J()#3

#

sorry i was just writing a valid perl program

alpine acorn
#

I love cursed perl language

thick osprey
#

Ada is actually a great programming language

#

i first got exposed to it in, of all places, ACPI

shrewd fox
#

Ada is idk

#

I have no opinion on it because I never used it

thick osprey
#

well

#

ACPI isnt quite right

#

i was fucking around with ACPI which led me to coreboot's gfxinit

#

which is written in ada

terse bridge
shrewd fox
#

in coreboot????

thick osprey
#

yeah

#

gfxinit initializes the intel integrated graphics registers

thick osprey
terse bridge
#

so no

#

llvm doesn't do 8085

thick osprey
#

does llvm not support m68k

shrewd fox
alpine acorn
#

Zero is very beefy

thick osprey
#

i wonder what the automatic launch command sequencing tool for the SLS was written in

#

probably Ada

terse bridge
#

NXP doesn't have the m68k

thick osprey
#

i probably really shouldnt talk too much about it

shrewd fox
#

NDA?

terse bridge
#

probably Keil C

thick osprey
#

and, to some degree, ITAR

#

we dont use any ancient cursed hardware

terse bridge
#

8051 powers most modern usb3 hubs

shrewd fox
#

I have no idea what any of those mean

thick osprey
alpine acorn
#

Damn

shrewd fox
#

makes sense

thick osprey
#

EAR covers a lot

#

pretty much anything that touches space is by definition "specially designed" and falls under a blanked export control category, and theres a million more granular categories as well

#

ITAR is a bit more focused but

#

high speed high altitude gnss = ITAR

#

anything attached to a rocket that can go to space = ITAR

#

i will say

#

the thermal profiles

#

chips can literally freeze to death

shrewd fox
#

gigabit?
is this like Starlink where you give people internet from space

#

or something else

thick osprey
#

do keep it to yourself

alpine acorn
loud falcon
#

cyberdyne systems

thick osprey
#

i actually work for palantir

#

my new project is called the RacialProfileNazgul

shrewd fox
thick osprey
#

it gives local police forces the system from the minority report

#

this will generate so much shareholder value

shrewd fox
#

i have so much free time

#

im gonna compile ao-sdl

alpine acorn
#

Do it

#

Its easy enough

shrewd fox
#

yeah i already have experiencing dealing with c++ codebases that are agonizing to compile

#

oops forgot to clone with submodules

#

the hell is AOSDL_GENERATE_SCHEMAS

#

i aint installing a python package bro

alpine acorn
#

That is my sitting posture

#

Let me find that one meme

#

@thick osprey do you sit like this

noble drum
#

On build time it creates the shemas to use for server inbound packet validation

alpine acorn
#

🥺

alpine acorn
#

LMAO

#

It honestly built the ao2 client

shrewd fox
#

damn this takes ages

#

im only on 85%

alpine acorn
#

Try compiling the ao2 clients without claude

#

You will have fun

noble drum
#

Also Qt frontend progress.

#

Don't think I posted it here yet.

alpine acorn
#

OOO

shrewd fox
#

i will NEVER compile a codebase that uses qt

alpine acorn
#

LMFAO

thick osprey
noble drum
alpine acorn
noble drum
#

Qt is a perfectly fine development framework.

shrewd fox
#

no that aint a skill issue
im preserving my sanity

thick osprey
#

the script generates c++ from the openapi spec yaml to validate schemas on the rest api

alpine acorn
#

Qt creator as soon as I installed it

#

My pc runs like ass

thick osprey
#

you dont need it for the client or a non-prod server

alpine acorn
#

Even when. Its not running idk why.

#

Unless qt creator has background processes

noble drum
alpine acorn
#

On boot

#

By default

alpine acorn
#

:3

shrewd fox
alpine acorn
#

A headache.

#

I've had to build ao2..

shrewd fox
#

i understand why most desktop apps use electron

#

atleast its not miserable to compile 😭

alpine acorn
#

The ao client force integration requiring discord library is ass

#

It has to be in the same directory it sucks. It won't boot without it even if u get past the build process.

shrewd fox
alpine acorn
#

It hardcore requires it

alpine acorn
#

IT will still ask for it

#

And refuse to boot

#

Ao2 requires a discord library as a dependency which is stupid.

noble drum
#

Options are cached.

alpine acorn
#

Bruh

#

Fml

noble drum
#

It should not when Discord RPC is disabled.

alpine acorn
#

Its just time consuming

noble drum
#

Not really.

#

Setting up AOs stuff takes five minutes at most.

alpine acorn
#

Ao sdl

#

Has at least a cleaner build process

#

Which i like

#

But again there's no qt on it yet right

shrewd fox
#

yeah its imgui i believe

alpine acorn
#

Yeah

#

Imgui

#

Is based.

noble drum
#

Qt Frontend uses Qt, lol

#

It's just on a branch.

alpine acorn
#

Ahhh

shrewd fox
#

im so close

noble drum
#

It compiles all the same on SDL since we don't have a bass or discord link.

#

Those make it "harder"

alpine acorn
#

Im so thankful Bass.dll is gone

#

Miniaudio is a negger choice

#

Better

#

Sorry oh phone

shrewd fox
#

ive always hated bass because its nonfree software

alpine acorn
#

Mini audio is as open ans free

#

As u can get

#

And simple too

shrewd fox
#

soloud or miniaudio are both automatically better because its foss

alpine acorn
#

^^^^

shrewd fox
#

got it working

alpine acorn
#

Hell yeah

#

Good job

shrewd fox
#

how do yall test it
theres no singleplayer mode 😭

alpine acorn
#

Localhost

#

On akashi or something

#

Qt required

shrewd fox
#

i am NOT compiling akashi 😭

alpine acorn
#

LMFAO

#

There are binarys

shrewd fox
#

ok nvm

#

fine

alpine acorn
#

ON their release page

noble drum
#

Or WTP?

alpine acorn
#

Vanilla runs upstream akashi

#

Wtp runs a forked akashi both will give near enough h same results

#

Idk any other akashi server

shrewd fox
#

i just join some random server

alpine acorn
#

Yes

#

Use a vpn i wouldn't say every server is trustworthy

#

Just to be on the safe side.

thick osprey
alpine acorn
#

I MEANT

#

BETTER

#

IM ON PHONE

#

ONL

#

😭

#

I FAT FINGERED IT

shrewd fox
#

akashi doesnt have mac binaries

alpine acorn
#

Oh

#

Damn

#

Linux and Windows

shrewd fox
#

every day i get absolutely fucked over by apple

thick osprey
alpine acorn
#

Yeah

alpine acorn
#

**Akashi ** - sudo apt update && sudo apt install -y git build-essential cmake qt6-base-dev qt6-tools-dev qt6-websockets-dev && git clone https://github.com/AttorneyOnline/akashi && cd akashi && mkdir -p build && cd build && cmake .. -DCMAKE_BUILD_TYPE=Release && cmake --build . --config Release -- -j1

GitHub

C++ AO2 Server. Contribute to AttorneyOnline/akashi development by creating an account on GitHub.

thick osprey
shrewd fox
#

i hate tests

#

tests don't exist in my world

#

wait how do you exit a server in aosdl

alpine acorn
#

Disconnect button

noble drum
shrewd fox
#

oh lmao it was hidden

noble drum
alpine acorn
noble drum
shrewd fox
#

i have x86_64-darwin

noble drum
#

Now that at least two people own a god damn apple PC it's easier to test and develop against.

alpine acorn
#

Crapppe

#

Crapple

noble drum
shrewd fox
#

im not the only one getting shit on by apple??

noble drum
#

My MacBook to test Qt against Metal literally arrived yesterday.

shrewd fox
#

you'll feel my pain

noble drum
#

So far it has been nice.

#

MacOS is just a very uh... Opinionated Windows 11.

shrewd fox
#

macos is NOT opinionated windows 11

#

macos is just freebsd but babified for tech illiterate people

shrewd fox
#

gatekeeper sucks

noble drum
#

The 8GB RAM were a deal-breaker in the end.

terse bridge
shrewd fox
#

wget and unzip

noble drum
#

Bought mine used for 500-ish euro.

shrewd fox
terse bridge
#

git and cmake

shrewd fox
#

i wonder if akashi is on nixpkgs

#

nah im too lazy to maintain a nix package

noble drum
#

Akashi is not even hard to compile.

#

It only links to Qt

alpine acorn
#

Akashi is ez

#

Compared to client

noble drum
#

Core, Network, Websocket and Sql I think.

alpine acorn
#

Yeah

acoustic dune
#

Read a string from the user.
If at any point your code is unsafe, we power down your computer.

acoustic dune
shrewd fox
shrewd fox
#

google aint that bad 😭

acoustic dune
#

Ik, I just hate spyware lol

#

Whatever works for coding ig lol. Good luck.

acoustic dune
#

[They do make some useful apps and shit tho.]

shrewd fox
#

the only thing i dislike about flutter is how nested it feels
like here (note that this is not ao-sdl, this is my code)

#

everything is a widget™

terse bridge
#

i looked at the screenshot and thought wow i hate this
and then i remembered that webAOs ui.js looks very similiar

acoustic dune
thick osprey
alpine acorn
thick osprey
#

its just a cross platform mobile ui framework

alpine acorn
#

but so is like 99% of browsers

#

☠️

acoustic dune
#

curse of ra

alpine acorn
#

thisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthis

acoustic dune
thick osprey
#

I love these UML diagrams

terse bridge
#

What program did you use to draw it or did Claude do that

#

I used to do those with Dia but it takes effort to make them look nice

thick osprey
#

i didnt put these in the repo, they're just my personal notes

#

but if there is desire i can have claude make them prettier and add them

terse bridge
#

i asked because id have a good use for some nice looking diagrams

thick osprey
#

i just wrote these by hand in mermaid

thick osprey
copper heath
#

so basically just like cloudflare or something

thick osprey
#

even performance metrics on stuff that might impact future scalability

copper heath
#

seems a bit intrusive

thick osprey
#

all server state mutations are serialized through this lock, so it profiles it and shows it on a dashboard!

thick osprey
copper heath
#

it does look cool but i think the whole room thing is unneeded

#

like idk how that would help anyone

thick osprey
#

"how many players are in each area" is public info

copper heath
#

i do like the uptime and memory stuff

thick osprey
#

some of this data is for developer purposes, identifying performance bottlenecks

copper heath
#

and websocket stuff this is cool

thick osprey
#

you can fully customize the dashboards

#

so if you just wanna know like "how many moderators are online" or set up mod audit log queries, you can just see that

copper heath
thick osprey
#

i think a queryable live dashboard ui is much better ux than ssh and pick through logs...

noble drum
#

A lot of moderators ask for external measures to not always have to login as much

thick osprey
#

do you want fewer features?

#

i can stop adding features

copper heath
#

No. I'm more so just trying to think from AO as a whole.

#

If everything is external it will stop people from joining AO as much.

thick osprey
#

this is meant for server admins to look at

#

some of this info is really important for servers like vanilla that have a lot of mods and a lot of spam

copper heath
#

It is pretty sweet. I'm not going to lie.

#

But lately it feels like AO is heading towards a more gatekept closed community whether it be whitelists, or forcing discord integration and external factors. I guess my point is more so trying to say, I don't think the entire focus should just be external tools.

#

But I do like the idea of having a dashboard.

loud falcon
#

public servers have always been kind of a bad idea to be perfectly honest with you

#

it's like if you were playing D&D but with whatever randos happened to be in the game store that day

#

it's a recipe for clashes of expectations and drama

thick osprey
loud falcon
#

and yeah

#

users don't see this

copper heath
#

i mean yeah thats good

#

not saying it's not a useful feature

thick osprey
#

its not the "entire focus" its addressing major UX pain that makes running servers like vanilla practically impossible

loud falcon
#

im not really sure what you're saying exactly

thick osprey
#

if anything this will make AO more open

#

because it makes it easier for people to run servers without dealing with bullshit

valid stone
#

this will make AO more manageable and improve the efficacy of having an admin at all.

noble drum
#

It also is a funny joke for server owners to brag about their uptime, so even if some stuff is public it might just be minimal info for players.

wintry apex
#

I am seeing this just now, what does SDL bring to the table for AO?

valid stone
#

by not being restricted to only acting while having access to the server, you improve the ability to administrate.

loud falcon
#

Dude are you okay

valid stone
copper heath
#

I guess I'm more so trying to make a general point. If we have a public server list, shouldn't server owners expect trolls and random people? If they list on a public master server. They should know that it's open. So I guess another point I was more so thinking is like; it's a point towards AO as a whole. I've just noticed lately since more servers are becoming gatekept or private. Why are they still listing themselves on a public server list if there is a barrier of entry to get in the first place.

#

Maybe that's a different topic for another day. But it kinda is weird.

thick osprey
#

i just dont see what this has to do with metrics dashboards

loud falcon
#

Why are you making a general point about server culture in the thread for a program rewrite

copper heath
#

Valid point.

loud falcon
#

If you want to complain to someone you can complain to Wiso, he loves that

noble drum
#

I think overall the culture can improve when administrative tasks are easier to handle. Currently you invest a lot of energy to handle elements that should be easier.

loud falcon
#

^

copper heath
#

Makes sense, yeah.

loud falcon
#

moderation and maintenance are annoying so server owners don't do it as much as they really should

valid stone
#

frankly, scatterflower, a server with a UI that lets you kick, ban, etc. players without needing to open client would be ideal too.

copper heath
#

Then that becomes discord moderation with extra steps essentially.

loud falcon
#

fully featured web admin panels would make server owners cream their pants

noble drum
#

A lot of servers avoid being public because it's just so hard currently to moderatore.
Improvements like this make people more likely to invest the steps to go public

copper heath
#

If you aren't going to log on AO, you're just moderating from another service.

loud falcon
#

it's actually a bad thing that you have to launch ao2 to ban spammers when your players ping you about it

valid stone
#

Sometimes trolls have made it impossible to connect via client regardless, too.

loud falcon
#

it makes moderation more difficult

copper heath
#

Spam protection is an idea.

loud falcon
#

we have it

copper heath
#

Then what's the problem lol

valid stone
#

It's not foolproof.

loud falcon
#

what's your problem

valid stone
#

Making an admin's job easier = good

loud falcon
#

why are you so against quality of life for server administration

noble drum
#

I think we should cool this down slightly. We are edging on being accusational.

copper heath
#

None whatsoever. I'm not against it. I'm more so talking about privacy side of things and not making the eco system worse than it already is. If servers are relying on discord to moderate then something is wrong.

loud falcon
#

nothing you do on ao2 is private

copper heath
#

It can be.

loud falcon
#

it is an unencrypted protocol based on joining servers hosted by third parties

#

it is not and has never been private

valid stone
#

Anyhow, as said. The dashboard is exclusively for admins to view.

#

Ergo. Private.

#

It's on them if they choose to share metrics.

noble drum
#

It helps developers also troubleshoot issues with admins by giving info on the servers internal runtime without having to do complex steps.

copper heath
#

Yeah it's not a bad thing to have. I was just trying to make a point that we should do more for AO itself than solving core issues with external dependancys or platforms.

loud falcon
#

news flash the admins can already see your IP and messages because they own the machine you're connecting to and that's not a problem because it's a roleplaying tool

loud falcon
#

if you want secure channels of communication use signal or something

copper heath
#

It's an opinion. I'm allowed to have I think.

noble drum
loud falcon
#

yeah i mean i just think you're wrong

thick osprey
# valid stone frankly, scatterflower, a server with a UI that lets you kick, ban, etc. players...

a few thoughts here:

  • grafana can integrate alarming with webhooks which is super nice since discord has webhooks! so you could have an admin configure like "if the server restarts ping me in discord" or "if a chat is being flooded let me know"
  • i'm planning on adding some automod features that would report thru metrics to grafana. this could add integrated support for wiring modcalls to discord, letting admins know if someone is spamming slurs, etc
  • new protocol is RESTful so its pretty straightforward to make a web ui (or, hell, even some hidden endpoints grafana accesses thru the business forms plugin) to kick, ban, whatever people
  • kagami itself could expose webhooks to automate moderation actions from alarms surfaced by automod
valid stone
#

sister, solving these issues early in the rewrite's lifetime is necessary for a strong foundation. otherwise we've just made AO2.5

loud falcon
#

actually Tricky made that one

thick osprey
copper heath
thick osprey
#

the grafana instance is literally running on the same server

loud falcon
#

grafana is software it's not a third party platform

noble drum
copper heath
#

On first glance.

valid stone
#

eh?

noble drum
#

Qué?

thick osprey
#

i think theres a pretty massive gulf between "submit mod alerts to an arbitrary webhook (which may be discord) vs "force everything through discord for authentication and moderation" (which, btw, akashi already does half of that)

loud falcon
#

ao players when they want privacy but also don't want to authenticate ever

noble drum
#

Afaik the general consensus was that authentication is opt-in, but also a "have your cake and eat it to."

loud falcon
#

kid named raidensnake

copper heath
#

bleh

noble drum
#

So far on the moderation side we arey as far as I can tell, becoming less reliant on Discord beyond just simple notification Webhooks.

#

The grafana thing is just a QoL Dashboard for curios people and debugging. Afaik even optional too.

copper heath
#

as long as it stays that way then i think people will have no problems

loud falcon
#

you could also get an email with the same info instead of using discord for it

thick osprey
loud falcon
#

it's very easy to do that

noble drum
loud falcon
#

do not

thick osprey
#

i put a lot of work into getting this thing to perform well under heavy concurrent loads which is basically a necessity if we want this to be an asset server backend that servers a billion tiny files

loud falcon
#

leave poor akashi alone

#

don't make her into a mail server

copper heath
#

Get your forks out and lets get comitting mail.

valid stone
#

"kakashit"

#

/j

noble drum
terse bridge
#

kaka means poop in baby german

loud falcon
#

aov would bitch us out if they were forced to authenticate with anything

#

safe to say it's opt in

valid stone
#

aov would string us up in the town square by our innards

copper heath
loud falcon
#

i mean realistically they'd just be really annoying

copper heath
#

what did they add to it

thick osprey
#

this doesnt even show you peoples ip addrs/hdids

valid stone
#

idk i didn't check

loud falcon
valid stone
#

probably shit judging by the name

copper heath
#

mfw people make a fork but don't add anything

loud falcon
#

i think it was that clover person who contributed a bugfix once from their fork that I'm pretty sure they are violating gpl by not hosting somewhere. unless it's on gitlab or some such

valid stone
thick osprey
#

lol

#

im so glad i made ao-sdl MIT

thick osprey
#

someone could rip out half of the code and call it their own and refuse to share it, and honestly, i wouldnt give a shit

loud falcon
#

idk. i don't know any of the ao regulars anymore all the normal people left so now it's all roblox kids

thick osprey
#

too much pain with that happening in akashi/ao2 anyways

copper heath
#

if it is them they are a weirdo

thick osprey
#

this project is my gift to AO

#

and honestly

valid stone
loud falcon
#

not really an earned one

loud falcon
thick osprey
#

i dont believe many people in this community other than me are technically capable of making it better than i can

noble drum
#

Anyway, I scrolled up. Do i actually get to write an Automod/Mod asisstent?

thick osprey
#

i have some ideas for automod

valid stone
#

salautomod

loud falcon
#

German wants to write a robot cop what a surprise

copper heath
thick osprey
#

i sort of want to experiment with LLM-based automoderation but i feel like that would not be well received, and its probably too pricey anyways

copper heath
#

chatgpt mod my server

loud falcon
#

idk what HDF is they just appeared one day and now they're the largest server around

copper heath
#

does he know

loud falcon
#

chatgpt please roleplay as a moderator who wants to ban my opps

#

not a he

thick osprey
#

not just raw calls into chatgpt but more like word2vec style embeddings and quantitative sentiment analysis

#

i'm not so stupid that i would just like

copper heath
#

they sorry

thick osprey
#

pipe IC messages into chatgpt

loud falcon
#

not a they either

copper heath
#

i was just using he as gender neutral

#

she

loud falcon
#

ty

#

sorry i have to be annoying or people will just do it forever

noble drum
copper heath
#

Anyone who mentions Ruby gets the ban.

loud falcon
#

I've known like six people named that

thick osprey
valid stone
copper heath
#

??????????????

loud falcon
#

implying

thick osprey
#

implying

valid stone
#

mechahitler 2.

#

mechahitler 2 would like kids.

loud falcon
#

i famously don't like kids

valid stone
#

i know

#

you don't like anyone

loud falcon
#

that's not true

thick osprey
#

she likes me

valid stone
#

you like 1 person

loud falcon
#

i like saturday

thick osprey
#

see

loud falcon
#

i like salanto

valid stone
#

saturday is awesome

thick osprey
#

:D

loud falcon
#

i like you okay samevi

#

i don't really know you that well but you seem like a good egg

valid stone
#

i've never heard that before

loud falcon
#

i like plenty of people they just happen to be mostly not here LOL

valid stone
#

damn

noble drum
thick osprey
#

salanto is one of the good ones

valid stone
#

Salanto is baller

noble drum
#

why am I being singled out???

loud falcon
#

you're not

#

but you are pretty good

#

im a salanto fan

valid stone
#

🪭

loud falcon
#

even though we had stupid teenager beef like half a decade ago

noble drum
#

Lmaoooo

valid stone
#

beefnager

thick osprey
noble drum
valid stone
#

beeflanto

loud falcon
#

yeah when i was like 19 and i don't even remember why

#

i think it might have just been vibes honestly

#

or maybe i did something that I've since forgotten about

valid stone
#

maybe it was the stress of ao2

loud falcon
#

Certainly a factor!

thick osprey
#

im so glad that through sheer force of will i have excreted ao-sdl into existence

loud falcon
#

i was a case cafe moderator around then

thick osprey
#

im actually really excited about this project

loud falcon
#

it is very cool

thick osprey
#

i hope other people are too

loud falcon
#

i am excited

valid stone
#

i am also excited

loud falcon
#

i can't remember if i was 19 or if it was 2019

copper heath
#

its great stuff

loud falcon
#

if it was the latter then i would have been 17

valid stone
#

oh god poor 17 or 19 year old in1tiate

thick osprey
#

the whole server/caddy/grafana/prometheus stack is deployable via docker compose and all the config will exist in the repo

#

so someone with a vps can set the whole thing up with 3 commands

#

it will even set up tls certs for you automatically

copper heath
#

ah yeah caddy is automatic HTTPS

loud falcon
#

ok no on checking my dates it was definitely 2019. actual baby

thick osprey
#

which matters a LOT due to how asset fetching works

copper heath
#

Not as fast as nginx but it's still user friendly

thick osprey
#

the protocol and connection overhead is massive

#

i dont really trust nginx im not gonna lie, i never have

valid stone
copper heath
#

Is it because it logs IPS on default?

#

If that is why then yeah makes sense.

loud falcon
copper heath
#

I was just curious, sorry.

loud falcon
#

ao users when the mail carrier needs their address to deliver the mail

copper heath
#

I was just using IPS as a guess.

thick osprey
# copper heath Why?

the corporate ownership history, the very messy affair with Rambler, the company literally getting raided by russian police, the original author getting ousted, the new corporate owners being generally sketchy

copper heath
#

I didn't know it went that deep.

thick osprey
#

also caddy like, justworks™

#

it has basically no config needed

copper heath
#

Caddy is

#

🔥

#

Literally

thick osprey
#

it handles lets encrypt for you

copper heath
#

It's all built in.

#

It's chef kiss.

thick osprey
#

the deployables are nice

#

i hope people actually use them

#

my goal is that running this on a vps is literally "run these three commands"

#

running on your moms laptop is "download the .exe and double click"

#

it supports log sinks to both loki (managed by docker compose) and cloudwatch - simultaneously

#

just put the key in the config and it works

#

i have an implementation for the stupid aws request signing so i can hook into pretty much any aws api

#

some sick part of me wants to add in autoscaling

#

graceful, automatic scalability from mom's laptop to mom's credit card

copper heath
#

aws integration?

#

i have aws so what could you do w/ it

thick osprey
#

yeah, it can make requests to any aws service endpoint

copper heath
#

oooooooo

thick osprey
#

right now it supports logging to cloudwatch

copper heath
#

thats cool

thick osprey
#

autoscaling is possible

#

spin up new ECS workers and attach and remove them from an ALB

#

cloudfront autoconfig

#

manage the assets from S3

#

whatever you can dream of

#

web scale and mom's laptop in the same binary :o

copper heath
#

insane

thick osprey
#

getting inter-shard federation would be. a pretty massive technical undertaking. but its also not impossible; i'd basically just need to add a service discovery mechanism and some RPC for state sync

#

but honestly

#

i really do not want to think about distributed computing problems right now lol

#

the threading model is complicated enough

#

the entire stack is light enough to run on a t4g.nano

#

that's $3/month

#

i am not joking when i say i put a lot of work into high-concurrency performance

#

my http server basically has "goroutines in cpp from scratch"

#

with three different abstracted socket and poll api backends implemented via link-time polymorphism

#

:)

thick osprey
#

theres still a global lock on mutating server state, though

#

theres a reason i added profiling metrics to it

#

i don't trust it to scale

#

and i really dont know how im going to work through that one

#

i did some concurrency profiling earlier

#
saturday@Saturdays-MacBook-Air myapp % python3 concurrency_profiler.py -H https://canary.attorneyoffline.de -m 256 -r 500 --http1 
Target: https://canary.attorneyoffline.de
Requests per level: 500
Concurrency levels: [1, 2, 4, 8, 16, 32, 64, 128, 256]

Baseline: 327.3ms (HTTP/HTTP/1.1)

  c=   1  p50=   51.8ms  p95=   91.5ms  p99=  103.7ms  avg=   57.0ms  min=   37.2ms  max=  143.8ms  n=500
  c=   2  p50=   58.6ms  p95=   97.7ms  p99=  105.3ms  avg=   66.8ms  min=   35.4ms  max=  226.0ms  n=500
  c=   4  p50=   87.1ms  p95=  101.8ms  p99=  109.1ms  avg=   78.8ms  min=   39.6ms  max=  237.2ms  n=500
  c=   8  p50=   85.1ms  p95=   99.1ms  p99=  238.4ms  avg=   82.9ms  min=   35.0ms  max=  274.8ms  n=500
  c=  16  p50=   88.7ms  p95=  113.2ms  p99= 7665.2ms  avg=  174.5ms  min=   36.6ms  max= 8379.5ms  n=500
  c=  32  p50=   94.9ms  p95=  338.5ms  p99=18549.1ms  avg=  679.9ms  min=   40.7ms  max=18732.6ms  n=500
  c=  64  p50=   91.8ms  p95=13526.6ms  p99=28493.4ms  avg= 1600.1ms  min=   34.8ms  max=28519.5ms  n=487  err=13
  c= 128  p50=   93.8ms  p95=18685.3ms  p99=28761.4ms  avg= 1848.2ms  min=   37.6ms  max=28791.1ms  n=421  err=79
  c= 256  p50=  684.6ms  p95=25679.4ms  p99=25726.7ms  avg= 7691.3ms  min=  133.5ms  max=25726.7ms  n=84  err=416

--- RTT vs Concurrency (p50) ---

  c=   1 | #### 52ms
  c=   2 | ##### 59ms
  c=   4 | ####### 87ms
  c=   8 | ####### 85ms
  c=  16 | ####### 89ms
  c=  32 | ######## 95ms
  c=  64 | ######## 92ms
  c= 128 | ######## 94ms
  c= 256 | ############################################################ 685ms
#

this is with the httplib.h server

#

it just crumbles once you hit the threadpool size

#
saturday@Saturdays-MacBook-Air myapp % python3 concurrency_profiler.py -H http://localhost -m 16384
Target: http://localhost
Requests per level: 50
Concurrency levels: [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384]

Baseline: 5.2ms (HTTP/HTTP/1.1)

  c=   1  p50=    1.5ms  p95=    1.8ms  p99=    1.9ms  avg=    1.6ms  min=    1.4ms  max=    1.9ms  n=50
  c=   2  p50=    2.1ms  p95=    2.5ms  p99=    2.5ms  avg=    2.2ms  min=    1.8ms  max=    2.5ms  n=50
  c=   4  p50=    3.7ms  p95=    4.1ms  p99=    4.5ms  avg=    3.5ms  min=    1.9ms  max=    4.5ms  n=50
  c=   8  p50=    6.6ms  p95=    7.7ms  p99=    8.1ms  avg=    6.4ms  min=    2.3ms  max=    8.1ms  n=50
  c=  16  p50=   11.9ms  p95=   16.9ms  p99=   17.4ms  avg=   11.6ms  min=    2.1ms  max=   17.4ms  n=50
  c=  32  p50=   13.8ms  p95=   21.7ms  p99=   22.7ms  avg=   15.8ms  min=    9.3ms  max=   22.7ms  n=50
  c=  64  p50=   31.4ms  p95=   33.8ms  p99=   34.7ms  avg=   29.0ms  min=   17.2ms  max=   34.7ms  n=50
  c= 128  p50=   29.3ms  p95=   31.6ms  p99=   31.9ms  avg=   26.9ms  min=   12.4ms  max=   31.9ms  n=50
  c= 256  p50=   30.7ms  p95=   34.3ms  p99=   36.4ms  avg=   29.0ms  min=   19.2ms  max=   36.4ms  n=50
  c= 512  p50=   30.2ms  p95=   32.6ms  p99=   32.7ms  avg=   28.0ms  min=   19.4ms  max=   32.7ms  n=50
  c=1024  p50=   29.3ms  p95=   32.5ms  p99=   32.9ms  avg=   27.2ms  min=   16.2ms  max=   32.9ms  n=50
  c=2048  p50=   30.4ms  p95=   33.8ms  p99=   34.0ms  avg=   28.2ms  min=   18.7ms  max=   34.0ms  n=50
  c=4096  p50=   30.5ms  p95=   33.2ms  p99=   33.6ms  avg=   28.5ms  min=   18.4ms  max=   33.6ms  n=50
  c=8192  p50=   34.7ms  p95=   36.9ms  p99=   37.3ms  avg=   32.4ms  min=   22.7ms  max=   37.3ms  n=50
  c=16384  p50=   30.4ms  p95=   33.2ms  p99=   33.8ms  avg=   28.3ms  min=   17.4ms  max=   33.8ms  n=50

--- RTT vs Concurrency (p50) ---

  c=   1 | ## 2ms
  c=   2 | ### 2ms
  c=   4 | ###### 4ms
  c=   8 | ########### 7ms
  c=  16 | #################### 12ms
  c=  32 | ####################### 14ms
  c=  64 | ###################################################### 31ms
  c= 128 | ################################################## 29ms
  c= 256 | ##################################################### 31ms
  c= 512 | #################################################### 30ms
  c=1024 | ################################################## 29ms
  c=2048 | #################################################### 30ms
  c=4096 | #################################################### 30ms
  c=8192 | ############################################################ 35ms
  c=16384 | #################################################### 30ms
#

this is with my custom http server

#

http/2 is even better because you can multiplex everything on one socket

#

but

#

the server only speaks http/1.1 and relies on caddy to demux

#

its still more efficient at the transport/networking level (esp http/3)

#

and it makes a big difference

#

the local connection path has like no overhead since its just internal copies in the kernel (and tbh linux is probably smart enough to zero-copy loopback data)

#

oooh i should run the concurrency profiler with my new metrics

#
Target: https://canary.attorneyoffline.de/
Requests per level: 50
Concurrency levels: [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384]

Baseline: 76.7ms (HTTP/HTTP/2)

  c=   1  p50=   18.4ms  p95=   26.7ms  p99=   57.0ms  avg=   19.8ms  min=   15.2ms  max=   57.0ms  n=50
  c=   2  p50=   17.2ms  p95=   23.7ms  p99=   26.6ms  avg=   17.5ms  min=   13.8ms  max=   26.6ms  n=50
  c=   4  p50=   17.4ms  p95=   26.2ms  p99=   30.4ms  avg=   18.4ms  min=   14.5ms  max=   30.4ms  n=50
  c=   8  p50=   21.6ms  p95=   30.3ms  p99=   33.3ms  avg=   21.8ms  min=   14.0ms  max=   33.3ms  n=50
  c=  16  p50=   22.3ms  p95=   46.4ms  p99=   46.7ms  avg=   27.7ms  min=   14.1ms  max=   46.7ms  n=50
  c=  32  p50=   48.4ms  p95=   55.0ms  p99=   58.6ms  avg=   41.4ms  min=   18.4ms  max=   58.6ms  n=50
  c=  64  p50=   42.3ms  p95=   46.1ms  p99=   46.3ms  avg=   41.5ms  min=   29.1ms  max=   46.3ms  n=50
  c= 128  p50=   44.4ms  p95=   50.5ms  p99=   50.8ms  avg=   45.9ms  min=   36.2ms  max=   50.8ms  n=50
  c= 256  p50=   61.4ms  p95=   63.5ms  p99=   64.8ms  avg=   60.9ms  min=   38.8ms  max=   64.8ms  n=50
  c= 512  p50=   42.0ms  p95=   44.1ms  p99=   44.3ms  avg=   41.2ms  min=   32.9ms  max=   44.3ms  n=50
  c=1024  p50=   83.4ms  p95=   87.2ms  p99=   87.8ms  avg=   82.6ms  min=   54.8ms  max=   87.8ms  n=50
  c=2048  p50=   49.7ms  p95=   54.8ms  p99=   55.5ms  avg=   49.8ms  min=   26.0ms  max=   55.5ms  n=50
  c=4096  p50=   86.3ms  p95=  420.8ms  p99=  422.0ms  avg=  218.7ms  min=   79.3ms  max=  422.0ms  n=50
  c=8192  p50=  103.8ms  p95=  109.4ms  p99=  109.7ms  avg=  103.7ms  min=   87.0ms  max=  109.7ms  n=50
  c=16384  p50=   86.0ms  p95=   92.9ms  p99=   93.7ms  avg=   84.1ms  min=   41.5ms  max=   93.7ms  n=50

--- RTT vs Concurrency (p50) ---

  c=   1 | ########## 18ms
  c=   2 | ######### 17ms
  c=   4 | ########## 17ms
  c=   8 | ############ 22ms
  c=  16 | ############ 22ms
  c=  32 | ########################### 48ms
  c=  64 | ######################## 42ms
  c= 128 | ######################### 44ms
  c= 256 | ################################### 61ms
  c= 512 | ######################## 42ms
  c=1024 | ################################################ 83ms
  c=2048 | ############################ 50ms
  c=4096 | ################################################# 86ms
  c=8192 | ############################################################ 104ms
  c=16384 | ################################################# 86ms
#

never gonna get tired of that

acoustic dune
#

holy shit

thick osprey
#

ahhh my chudling global lock

acoustic dune
#

I'm confused by all this tech stuff ;-;

#

Mod Dashboard seems like a fucking brilliant idea though.

thick osprey
#

these dashboards are already helping me find bugs

#

fuck yes

noble drum
thick osprey
#

you heard me

noble drum
thick osprey
acoustic dune
#

what the fuck is a chudling

loud falcon
noble drum
#

Finally added some debug info to the Qt Frontend too:

thick osprey
#

With the completion of this last feature branch, I will be ending my work on the AO-SDL/kagami project. Thanks to everyone who showed interest. The source code remains available publicly under the MIT license.

shrewd fox
#

why is AO-SDL now archived on github

#

ohhhhh

#

i thought AO-SDL/kagami meant kagami (which is from AO-SDL) like its a filesystem

#

well rip
i wanted to add a color logger

terse bridge
#

wait what

chilly ridge
#

They did not.

copper heath
#

what hapepned

copper heath
#

But as someone who kept up with the project and the other people, I think it would be nice to know if it was because you lost interest or external factors that you can't/ won't go into for privacy/personal/security reasons?

#

Again we are all grateful for what you have done.

shrewd fox
#

yeah it felt pretty sudden
i thought it was going fine like 1-2 days ago

terse bridge
#

claude ran out of tokens

copper heath
#

That made me laugh.

shrewd fox
#

probably not

copper heath
#

once the usage resets

shrewd fox
#

who wants to fork

copper heath
#

i might

#

depends if it's truly done

shrewd fox
#

certainly not me because i have never touched the code

#

and im too lazy

shrewd fox
copper heath
#

ya i know

#

its awesome

#

i built it myself

#

and tried it

#

super fast streaming

shrewd fox
#

sad that AO-SDL is basically dead

i guess no more macos native ao lol

terse bridge
#

we have native macos ao

#

it's just really troublesome to install and no one cares

#

the iphone version is the more important one

chilly ridge
#

There is no need to speculate, if they want to share something, they will.

thick osprey
#

I realize it sucks to disappear and offer no explanation. I don't want to blame anyone or throw anyone under the bus, this decision is the confluence of a few things:

  1. Every attempt to make "new AO2" has failed because many of the people who are willing to contribute to development, frankly, do not get along well. I understand this, it is what it is, but inserting myself into these dynamics just stresses me out and makes me feel awful. I don't like to pick sides or upset people and I don't want to cause anyone harm or distress. I want to solve purely technical problems but I don't feel like I am able to focus on this
  2. AO's requirements conflict with what I want to design. The master server model has been completely abandoned elsewhere for a reason; it doesn't scale well and it creates fiefdoms within the community that fragment it and bring in a whole host of dynamics that (see reason #1) I want no part in.
  3. AO-SDL is very complex cross-platform software. I don't have the time or energy or hardware to test and chase down bugs in all 5(!) platforms it supports by myself and remain sane.
  4. Another problematic outcome of the complexity is that, somewhat selfishly, I only trust myself to make the design decisions that will shape the project to completion. While this can be quite rewarding, it is stressful, and I feel like I am implicitly signing myself up to run a project indefinitely I probably won't have the bandwidth for forever.
  5. Related to 3 and 4, I don't think I can design this software in a way that is going to make everyone happy. The features people want are often incoherent to me and I don't think I have the skills or patience to make design decisions around them that will satisfy what people want
#

I wrote an HTTP application server that uses copy-on-write semantics and immutable trie data structures with lock-free updates and spent hours optimizing the socket poll and worker pool architecture so that the server can seamlessly support tens of thousands of simultaneous connections. I am extremely proud of this, and in all honesty, it makes me ache a bit to know that it's going to be used to host at most maybe 30 users at a time. I don't know how to quite effectively communicate the feeling, but it kind of sucks. Maybe I just shouldn't have overengineered it. On the other hand, solving that problem was immensely rewarding in its own right.
And, I guess, that's the tension. The technical work is fun and I can motivate myself to do crazy things on that side, but then I take a step back and just feel..... disappointed, frustrated.

chilly ridge
#

Thank you for your contributions regardless of what ends up coming of it.

#

Your choice is understandable and is to be respected, the heads up on is vastly appreciated.

#

I can't imagine what it was like for you in any reasonable capacity in terms of the technical side, but every step towards the development of the program is a step that counts.

#

Thanks to those who have tried to build or contribuite via beta-testing and feedback as well. It is what it is.

chilly ridge
#

It continues to be what it is.

loud falcon
#

c'est la vie pour toujours

thick osprey
#

taps mic is this thing on?

#

everything i said above is still 100% true

#

but the fact remains, i cannot help myself

#

i am a sick person

shrewd fox
#

why is this open again?

#

wait what i guess ao-sdl isn't dead after all

#

fuck YES

shrewd fox
#

i've experienced it alot with my other smaller projects

thick osprey
#

kagami is now resistant to multiple types of DDoS/DoS/spam attacks out of the box, on a tiny server (1 cpu 512mb ram), without the need for cloudflare at all

loud falcon
#

lfg

valid stone
#

as much as i don't want to be the guy that pesters the dev about dumb crap, i must admit i'm getting pretty curious what the current scope for AO-SDL is, and whether or not features originally planned have been cut or set off to the side.

noble drum
#

(and evidence. I like better evidence.)

thick osprey
thick osprey
#

and new protocol means new assets system, content authoring tooling, and a publication framework

loud falcon
#

mochi

#

mochi is in scope

shrewd fox
thick osprey
#

container registry updates and SSM a lot less flaky and a lot more secure than ad hoc scripts
and a cloudformation template is a lot easier for someone to use than some deploy script
but, if anyone prefers, the deploy script also exists. its also possible to just build the binary and drop it on a bare box. nothing here requires using a cloud platform but the integration exists because it makes deployment orders of magnitude easier

#

to be fair kagami does log to cloudwatch…
but it can also log to loki. or a bare file

#

all of the cloud integration is opt-in only

noble drum
#

Your corporate overlords will be pleased.

alpine acorn
#

You don't appreciate what you have until you lose it.

#

So I thought I would just say that.

shrewd fox
#

jeff bezos will surely be happy about this

#

also thank god its one binary

#

i hate microservices
too hard to deploy

thick osprey
shrewd fox
#

true

thick osprey
#

ok i lied

#

technically its two binaries

#

it does setcap on a helper binary to set up the kernel ip bans with nftables

valid stone
#

feedback left here

noble drum
#

I swear Qt is playing pogo with me.

#

Compiles on MacOS
Does not compile on Windows
Compiles on Windows
Does not on MacOS

noble drum
#

Popout panels kinda work properly now, still need to see if I can fix their homing logic.

valid stone
noble drum
valid stone
noble drum
#

I would love to show it with a working render.

#

But OpenGL is busted as balls in Qt when using the SceneGraph.

#

So Windows gotta wait for Vulkan.

#

(it works fine on mac, lol.

#

Leaving me with this mess of a development pipeline.

#

(Yes, that's me working on Windows and Mac at the same time.)

valid stone
#

gg

thick osprey
# noble drum

i feel like rdp to windows feels nicer than vnc to macos. vnc is so slow

#

vnc is basically just streaming the entire desktop as a video

#

where rdp is doing semantic info + bitmaps as a fallback of sub-regions

alpine acorn
noble drum
alpine acorn
#

THIS IS AWESOME

#

the little menu

#

with the rooms

noble drum
#

. . . I was showing off that the dock panels finally behave correctly.

#

I was gonna split music and areas.

alpine acorn
#

this is greatt

noble drum
#

(Ignoring the warnings.)

chilly ridge
#

Looks nice.