Hello Rust people! I'm building a social system for video games called Warhorse.
I wasn't sure if this was appropriate for code review because I'm asking for more than just code review here.
Summary
Think Steam-like friends list, parties, chat, etc. I'm targeting small teams and one man armies to help make their lives easier, particularly the Bevy community although this will be engine-agnostic.
I understand there is Nakama and Epic Online Services, as well as Amazon GameLift and Steam itself, however I am also planning on supporting the browser too. If you're launching a game that you want to be supported on multiple launchers or have a complete standalone system, I'm building it for you (also having fun while I do it, too).
I'm looking for just general input, whatever I can get out of this community in regards to my crate(s) I'm building up. Code review, architecture review, the stack, etc.
I chose Rust mostly so I can continue learning it, but I also think a compiled language really helps keep the energy footprint low, as server hosting costs is very important for this niche I'm targeting.
Even just feedback on the general idea itself from a non-technical perspective is valuable. Or if you just wanna hype me up, I'm here for it too.
Here's the link to the workspace as it stands: https://github.com/BrianWiz/warhorse
About me
I'm a web developer recently turned full-time game developer. I've never worked for big tech or large teams, I've always been a near 1 man show in small non profits. Beyond games, I've never really architected something this big before. I'm also ~1 year into Rust just off spare time. I'm strong-intermediate to senior level in my field with C++.
Anyway, ugh dude nobody cares...!
The Stack
So far I've kept it all within Rust, with the exception of experimenting with some C++ <-> Rust FFI.
Server (warhorse_server)
axum
socketioxide
as the main communication layer. For those who don't know,socketioxide
is a Rust port ofsocket.io
, which is a whole convenience system wrapped around the WebSockets protocol. It has things like application level acknowledgements, rooms, and the main developer is working on a Redis adapter which from my understanding will allow me to scale horizontally if needed. I chose this system because I think it reads really well, but I think the thing that worries me the most is scalability. Is it the right choice?
Client (warhorse_client)
rust-socketio
Client GUI (warhorse_overlay):
- Currently only supports Windows, I overlay a
dioxus
app over a game window. I've tested with Unreal, Bevy and VSCode (yeah, as the game :P) - I chose
dioxus
because I'm trying to keep it within Rust and it lends itself to my skills as a web developer. However, Blitz is looking really promising and so I'm banking on Dioxus' native capabilities for the future. Also, since Dioxus is primarily for the web, I should be able to support browser games too. As well as a phone app (ya gotta know when your clan members want you to play at all times!!!)
Known Problems
rust-socketio
currently does not support wasm, so web capabilities are out of the question right now with the existing client. But I'm planning on helping them out with it (hint hint!).
Progress
Here's what I have working so far
- Overlay any window (Windows only atm)
- Temporary in-memory db, plans on swapping this out soonish, I just want to focus on the real-time flow of things first
Auth:
- basic user/pw, sort of same deal as above, temporary
- eventually I want to at least support Discord, Steam & Google auth
Friends:
- Request, Accept, Reject, Block, Remove
- Realtime updates and online status
Chat:
- Global chat with some preliminary work for multiple rooms
- Whisper friends
Well that's it, thank you for reading