Accordion
A chat app built with C++ and raw networking. The client is built with C++ & QML; the server is headless C++ process intended to run in a docker container along with a PostgreSQL database.
This project is an experiment and learning experience, not a discord clone. Eventually though, with enough maturity, this app can evolve to handle media sharing and real-time voice telemetry.
Design
The Accordion user space app (don't call it accordionUSA) is built with C++ + QML. Design principles are modularity, configurability, and performance (reactNative real quiet rn). In the future, RtAudio shall be used for real-time audio management (wishful thinking 🥺). If not specified, "Accordion" shall refer to the client app, whereas the server must be explicitly mentioned.
Networking on both sides will utilize OpenSSL for TLS security. The performance focus intends to bypass HTTP in favor of raw TCP. Therefore, this app will not expose a universal api (sadly) and extra features like request methods and response checking are entirely up to us. Authentication, data streaming, and media handling are also made more difficult to the benefit of complete packet control.
The server is a headless C++ process that connects to a PostgreSQL database using libpqxx. A single server process along with a single database instance should represent the equivalent of one discord server, with multiple users and text channels. Users are localized to only one server in this case, so external account tracking would be needed if per-server anonymity is not desired. An Accordion server allows clients to view and publish chat messages; authentication is up in the air currently. 🤯
Total running list of external software source packages:
- OpenSSL: TLS Networking Security
- RtMidi: Realtime Audio I/O Processing
- libconfig++: Configuration File Interfacing
- more to come in the future 🐰 Similarly, a list of dependent linux packages:
- openssl: needed for secure networking
- anything else that was fixed by running
sudo apt install package
Development plan:
- Build & project setup, get working hello-world program.
- TCP Demo between client and server
- Add TLS with OpenSSL on top of the TCP
- Build and deploy server to a Docker container in a CI/CD pipeline
- Implement PostgreSQL interfacing for the server
- Checkpoint the client<->server model for basic crud actions
- Create client GUI with QML: display responded messages and textbox + button for sending
- Support mutliple clients per server- identify unique users and attach them to messages
- Check Windows networking capabilities for cross-platform support on the client app
- Anything below here is future goals
- Test UDP packet sending
- RtAudio through UDP demo: simple loop-back test from client -> server -> back to client
- Multiple text channels, maybe a new table for each channel? might be overkill idk
- I think soundboards are really cool
Build Instructions
Note: The server is intended for Linux only, and development for the client is still in Linux-only mode, at least in WSL.
Prerequisites:
CMake: https://cmake.org/download/
Qt6::QML: https://www.qt.io/development/download-qt-installer-oss
Note: you must export the Qt install location to your environment. E.g. add the following to a powershell profile: $env:Qt6_DIR = "C:\Qt\6.10.1\msvc2022_64"
Compiler that supports C++20. Builds have been tested with GCC12 & MSVC17
Clone repository
git clone https://git.vxbard.net/homeburger/accordion.git
git clone --recurse-submodules https://git.vxbard.net/homeburger/accordion.git # if there's submodules
git submodule update --init --recursive # if you cloned without submodules and need them
Build:
# configure
> cmake -S . -B build
# build
> cmake --build build -j
The top-level cmake will automatically build both the client and the server. If you don't want to bother with the server, cd into client directory first.
Execute:
> .\build\Debug\accordion.exe
> .\build\Release\accordion.exe
$ ./build/accordion
Configurations
Configuration files are located in the config directory. They offer options to change the program's settings without recompiling. Eventually I might make a user's guide for the configurations, but there's not too much there right now. Configurations also exist for the server, but must involve rebuilding and restarting the docker container (hip hip hooray for CI/CD)