From b89c31ec48c8c6baf1d686a14bfe2567450837c6 Mon Sep 17 00:00:00 2001 From: MeexReay Date: Sun, 22 Jun 2025 11:11:52 +0300 Subject: [PATCH] init commit --- .gitattributes | 2 + HOST_TEMPLATE.md | 1 + LICENSE | 13 ++++++ RACv1.99.md | 17 ++++++++ RACv1.md | 19 +++++++++ RACv2.md | 45 ++++++++++++++++++++ README.md | 72 +++++++++++++++++++++++++++++++ README_TEMPLATE.md | 48 +++++++++++++++++++++ SOFTWARE_TEMPLATE.md | 1 + USERS_ADDITIONS.md | 32 ++++++++++++++ WRAC.md | 86 ++++++++++++++++++++++++++++++++++++++ _includes/head-custom.html | 1 + mkreadme.py | 28 +++++++++++++ style.css | 24 +++++++++++ 14 files changed, 389 insertions(+) create mode 100644 .gitattributes create mode 100644 HOST_TEMPLATE.md create mode 100644 LICENSE create mode 100644 RACv1.99.md create mode 100644 RACv1.md create mode 100644 RACv2.md create mode 100644 README.md create mode 100644 README_TEMPLATE.md create mode 100644 SOFTWARE_TEMPLATE.md create mode 100644 USERS_ADDITIONS.md create mode 100644 WRAC.md create mode 100644 _includes/head-custom.html create mode 100644 mkreadme.py create mode 100644 style.css diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..61a8222 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +/Archive/** filter=lfs diff=lfs merge=lfs -text +* !text !filter !merge !diff diff --git a/HOST_TEMPLATE.md b/HOST_TEMPLATE.md new file mode 100644 index 0000000..8eb720b --- /dev/null +++ b/HOST_TEMPLATE.md @@ -0,0 +1 @@ +| {address} | {description} | {software} | {status} | {protocol} | {auth} | \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..07b7a81 --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + +Copyright (C) 2004 Sam Hocevar + +Everyone is permitted to copy and distribute verbatim or modified +copies of this license document, and changing it is allowed as long +as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. \ No newline at end of file diff --git a/RACv1.99.md b/RACv1.99.md new file mode 100644 index 0000000..9814a9b --- /dev/null +++ b/RACv1.99.md @@ -0,0 +1,17 @@ +# RACv1.99 Protocol + +Message Retrieval +a. The client initiates a message retrieval session by sending the byte 0x00 to the server. + +b. In response, the server transmits the size of the available messages as an ASCII-encoded string. + +c. After receiving the size, the client must send one of the following bytes or close the connection: + +i. Sending 0x01 instructs the server to transmit all messages in full. + +ii. Sending 0x02 followed by the client’s cached messages length (as an ASCII string, e.g., 0x02"1024") instructs the server to transmit only new messages added since the cached length. The server sends messages starting from the cached length offset, and the client updates its cached length to the total size received in step 1b after processing the new messages. + +Message Transmission +a. To send a message, the client issues a request in the following format: + +The client sends the byte 0x01 followed immediately by the message content. The server does not send a response. \ No newline at end of file diff --git a/RACv1.md b/RACv1.md new file mode 100644 index 0000000..4bf253f --- /dev/null +++ b/RACv1.md @@ -0,0 +1,19 @@ +# RACv2.0 Protocol + +## Message Retrieval + +a. The client initiates a message retrieval session by sending the byte 0x00 to the server. + +b. In response, the server transmits the size of the available messages as an ASCII-encoded string. + +c. After receiving the size, the client must send one of the following bytes or close the connection: + +i. Sending 0x01 instructs the server to transmit all messages in full. + +ii. Sending 0x02 followed by the client’s cached messages length (as an ASCII string, e.g., 0x02"1024") instructs the server to transmit only new messages added since the cached length. The server sends messages starting from the cached length offset, and the client updates its cached length to the total size received in step 1b after processing the new messages. + +## Message Transmission + +a. The client sends the byte 0x01 followed immediately by the message content. The server does not send a response. + +Source: https://gitea.bedohswe.eu.org/pixtaded/crab#rac-protocol diff --git a/RACv2.md b/RACv2.md new file mode 100644 index 0000000..5d9f683 --- /dev/null +++ b/RACv2.md @@ -0,0 +1,45 @@ +# RACv2.0 Protocol + +## Message Retrieval + +a. The client initiates a message retrieval session by sending the byte 0x00 to the server. + +b. In response, the server transmits the size of the available messages as an ASCII-encoded string. + +c. After receiving the size, the client must send one of the following bytes or close the connection: + +i. Sending 0x01 instructs the server to transmit all messages in full. + +ii. Sending 0x02 followed by the client’s cached messages length (as an ASCII string, e.g., 0x02"1024") instructs the server to transmit only new messages added since the cached length. The server sends messages starting from the cached length offset, and the client updates its cached length to the total size received in step 1b after processing the new messages. + +## Message Transmission + +a. To send a message, the client issues a request in one of the following formats: + +i. Unauthenticated Message: The client sends the byte 0x01 followed immediately by the message content. The server does not send a response. + +ii. Authenticated Message: The client sends the byte 0x02 followed by the username, a newline character (\n), the password, a newline character and the message content. The server responds with a single byte: + +0x01 indicates the user does not exist. + +0x02 indicates the password is incorrect. + +A successful authentication results in the server accepting the message without sending a response. + +## User Registration + +a. To register a new user, the client sends a request formatted as: + +The byte 0x03. + +The username, followed by a newline character (\n). + +The password. + +b. The server processes the request and responds with a single byte: + +0x01 if the username already exists. + +A successful registration is assumed if no error byte (0x01) is received. The client should close the connection after handling the response. + +Source: https://gitea.bedohswe.eu.org/pixtaded/crab#rac-protocol diff --git a/README.md b/README.md new file mode 100644 index 0000000..e4e50fe --- /dev/null +++ b/README.md @@ -0,0 +1,72 @@ +This repository provides an overview of software built around the RAC protocol — including clients, servers, and associated tools. + +You're welcome to contribute by [sharing additional entries or information](https://github.com/MeexReay/RAC-Hub/pulls) to help expand this directory. + +# Clients + +| Title | Description | Author | Release | Status | Lang | RAC | WRAC | +| :---: | :---------: | :----: | :-----: | :----: | :--: | :-: | :--: | +| [bRAC](https://github.com/MeexReay/bRAC)[^1] | better RAC client (GUI) | MeexReay | [0.1.5+2.0](https://github.com/MeexReay/bRAC/releases/tag/0.1.5%2B2.0) | Active | Rust | v2.0 | v2.0 | +| [сRACk](https://github.com/pansangg/cRACk)[^5] | client for RAC kettles (TUI) | pansangg | [v2.0-beta](https://github.com/pansangg/cRACk/releases/tag/v2.0-beta) | Active | Python | v2.0 | ❌ | +| clRAC | The official RAC client | Mr. Sugoma | [2.0.1](https://wdfiles.ru/Ofx7) | Active | C | v2.0 | ❌ | +| [Mefedroniy](https://github.com/OctoBanon-Main/mefedroniy-client) | TUI client for RAC | OctoBanon | [v1.3.1+1.99.2](https://github.com/OctoBanon-Main/mefedroniy-client/releases/tag/v1.3.1%2B1.99.2) | Active | Rust | v1.99.2 | ❌ | +| [RAC.rs](https://github.com/kostya-zero/rac-rs) | Rust library for RAC client (used by [Tower](https://github.com/kostya-zero/tower)) | Kostya Zero | [0.1.0](https://crates.io/crates/rac_rs/0.1.0) | Active | Rust | v2.0 | v2.0 | +| [Tower](https://github.com/kostya-zero/tower) | GUI client for RAC developed using Tauri | Kostya Zero | ❌ | Active | Rust | v2.0 | v2.0 | +| [Snowdrop](https://github.com/Forbirdden/Snowdrop) | WRAC GUI client | Forbirdden | ❌ | Active | JavaScript | ❌ | v2.0 | +| [CRAB](https://gitea.bedohswe.eu.org/pixtaded/crab) | Bundle with both client and server | pixtaded | [2.0.0](https://gitea.bedohswe.eu.org/pixtaded/crab/releases/tag/2.0.0-snapshot-202502092015) | Frozen | Java | v1.99.2 | ❌ | +| [Dobroho Vechora](https://gitea.bedohswe.eu.org/bedohswe/dobroho_vechora) | The first open-source client | Bʰedoh₂ swé | [Source code](https://gitea.bedohswe.eu.org/bedohswe/dobroho_vechora/raw/branch/main/dobroho_vechora.bash) | Abandoned | Bash | v1.0[^2] | ❌ | +| lRAC | The first original RAC client using tkinter | Mr. Sugoma | [1.0.2](https://media.githubusercontent.com/media/MeexReay/RAC-Hub/refs/heads/main/Archive/lRAC/lrac_1.0.2.py) | Abandoned | Python | v1.0[^4] | ❌ | + + + + +[^1]: bRAC-0.1.3+2.0 requires GTK4 to be installed on Windows [(see more)](https://github.com/MeexReay/bRAC/releases/tag/0.1.3%2B2.0#user-content-window-gui-install) +[^2]: "_Я раньше хотел допилить его до v2, но мой bash код было трудно обновить_" - chunbyonga +[^5]: "_Не срал с утра или прошлого вечера, терпел ради cRACkа._" - pansangg + +# Server software + +| Title | Description | Author | Release | Status | Lang | RAC | WRAC | +| :---: | :---------: | :----: | :-----: | :----: | :--: | :-: | :--: | +| [sRAC](https://github.com/MeexReay/sRAC) | simple RAC server | MeexReay | [1.0.0](https://github.com/MeexReay/sRAC/releases) | Active | Rust | v2.0 | v2.0 | +| lRACd | The official RAC server | Mr. Sugoma | [2.0.9](https://wdfiles.ru/Obvt) | Active | C | v2.0 | ❌ | +| [CRAB](https://gitea.bedohswe.eu.org/pixtaded/crab) | Bundle with both client and server | pixtaded | [2.0.0](https://gitea.bedohswe.eu.org/pixtaded/crab/releases/tag/2.0.0-snapshot-202502092015) | Frozen | Java | v1.99.2 | ❌ | +| [AlmatyD](https://gitea.bedohswe.eu.org/bedohswe/almatyd) | Open source server | Bʰedoh₂ swé | [Source code](https://gitea.bedohswe.eu.org/bedohswe/almatyd) | Abandoned[^3] | TypeScript | v1.0 | ❌ | + + + + + +[^3]: "_Мне лень его допиливать. Если тебе зачем-то очень нужен RAC сервер, то ставь CRAB._" - chunbyonga + +# Known servers + +| Address | Description | Software | Status | Protocol | Auth | +| :------------------: | :-----------------------------------: | :--------------------------------------: | :----: | :-------: | :------: | +| 91.192.22.20:42666 | Official server by Mr. Sugoma | lRACd (2.0.9) | Active | RACv2.0 | Optional | +| meex.lol:11234 | WRACS tor proxy of 91.192.22.20:42666 | [sRAC](https://github.com/MeexReay/sRAC) | Active | WRACSv2.0 | Optional | +| meex.lol:42666 | RAC proxy of meex.lol:52667 | [sRAC](https://github.com/MeexReay/sRAC) | Active | RACv2.0 | Required | +| meex.lol:52667 | Official WRACS server | [sRAC](https://github.com/MeexReay/sRAC) | Active | WRACSv2.0 | Required | + +# Protocol documentation + +The following documents cover the structure, behavior, and expectations of RAC and WRAC protocols: + +- [RACv1.0](RACv1.md)[^4] +- [RACv1.99.x](RACv1.99.md) +- [RACv2.0](RACv2.md) +- [WRACv2.0](WRAC.md) +- [Users additions](USERS_ADDITIONS.md) + +[^4]: "_Про RAC 1 вообще забудь, это днище, его юзать нельзя._" - Mr. Sugoma + +# See also + +- [Project sources](https://github.com/MeexReay/RAC-Hub) +- [Historical archives](https://github.com/MeexReay/RAC-Hub-Archive) + +
+ +[]() []() + +This project was inspired by the ideas from [The-Stratosphere-Solutions/RAC-Hub](https://github.com/The-Stratosphere-Solutions/RAC-Hub), but all text and documentation have been created independently. diff --git a/README_TEMPLATE.md b/README_TEMPLATE.md new file mode 100644 index 0000000..daf7e0e --- /dev/null +++ b/README_TEMPLATE.md @@ -0,0 +1,48 @@ +Here you can find RAC clients, servers and more + +You can help RAC Hub by [adding more information](https://github.com/MeexReay/RAC-Hub/pulls) + +# Clients + +| Title | Description | Author | Release | Status | Lang | RAC | WRAC | +| :---: | :---------: | :----: | :-----: | :----: | :--: | :-: | :--: | +{clients} + + + + +# Server software + +| Title | Description | Author | Release | Status | Lang | RAC | WRAC | +| :---: | :---------: | :----: | :-----: | :----: | :--: | :-: | :--: | +{servers} + + + + + +# Known servers + +| Address | Description | Software | Status | Protocol | Auth | +| :------------------: | :-----------------------------------: | :--------------------------------------: | :----: | :-------: | :------: | +{hosts} + +# Protocol documentation + +- [RACv1.0](RACv1.md)[^1] +- [RACv1.99.x](RACv1.99.md) +- [RACv2.0](RACv2.md) +- [WRACv2.0](WRAC.md) +- [Users additions](USERS_ADDITIONS.md) + +# See also + +- [Original RAC-Hub](https://github.com/The-Stratosphere-Solutions/RAC-Hub) +- [RAC-Hub github](https://github.com/MeexReay/RAC-Hub) +- [Archive](https://github.com/MeexReay/RAC-Hub/tree/main/Archive) + +
+ +[]() []() + +{notes} \ No newline at end of file diff --git a/SOFTWARE_TEMPLATE.md b/SOFTWARE_TEMPLATE.md new file mode 100644 index 0000000..33702e3 --- /dev/null +++ b/SOFTWARE_TEMPLATE.md @@ -0,0 +1 @@ +| {name} | {description} | {author} | {release} | {status} | {lang} | {rac_version} | {wrac_version} | \ No newline at end of file diff --git a/USERS_ADDITIONS.md b/USERS_ADDITIONS.md new file mode 100644 index 0000000..3ce50de --- /dev/null +++ b/USERS_ADDITIONS.md @@ -0,0 +1,32 @@ +# Users additions + +## Server info packet + +Client sends: + +- Byte `0x69` + +Server sends: + +- (nothing or closes socket if server doesn't support this feature) +- Protocol version: + - Byte `0x01` for RACv1 + - Byte `0x02` for RACv1.99 + - Byte `0x03` for RACv2 +- Server name + +## User agents + +User agents in RAC is the way how to get know from what client the message was sent. It works by just checking the message text throught regex. + +Here are listed the most common clients, and their common names colors in the chat. + +| Client | Format | Regex | Color | +| :----: | :----: | :----: | :----: | +| [bRAC](https://github.com/MeexReay/bRAC) | 리㹰<{name}> {text} | `\uB9AC\u3E70<(.*?)> (.*)` | green +| [CRAB](https://gitea.bedohswe.eu.org/pixtaded/crab) | ═══<{name}> {text} | `\u2550\u2550\u2550<(.*?)> (.*)` | light red +| [Mefidroniy](https://github.com/OctoBanon-Main/mefedroniy-client) | °ʘ<{name}> {text} | `\u00B0\u0298<(.*?)> (.*)` | light magenta +| [cRACk](https://github.com/pansangg/cRACk) | ⁂<{name}> {text} | `\u2042<(.*?)> (.*)` | gold +| [Snowdrop](https://github.com/Forbirdden/Snowdrop) | ඞ<{name}> {text} | `\u0D9E<(.*?)> (.*)` | toxic green +| clRAC | <{name}> {text} | `<(.*?)> (.*)` | cyan + diff --git a/WRAC.md b/WRAC.md new file mode 100644 index 0000000..1e74281 --- /dev/null +++ b/WRAC.md @@ -0,0 +1,86 @@ +# WRACv2.0 Protocol + +Uses websocket for connections, and sends binary data only (works in packet-way manner) + +Totally inherits all packets of RACv2, except of reading messages + +## Sending messages + +Client sends: + +- Byte `0x01` +- Message text + +## Sending authorized messages + +Client sends: + +- Byte `0x02` +- Username +- `\n` +- Password +- `\n` +- Message + +Server sends: + +- nothing if message was sent successfully +- `0x01` if the user does not exists +- `0x02` if the password is incorrect + +## Registration users + +Client sends: + +- Byte `0x03` +- Username +- `\n` +- Password + +Server sends: + +- nothing if user was registered successfully +- `0x01` if the username is already taken + +## Reading messages + +### Getting message length + +Client sends: + +- Byte `0x00` + +Server sends: + +- Size of all messages in ASCII (data_size) + +### Normal reading + +This packet is independent from getting message length packet. + +Client sends: + +- Byte `0x00` +- Byte `0x01` + +Server sends: + +- All messages + +### Chunked reading + +This packet is independent from getting message length packet. + +Client sends: + +- Byte `0x00` +- Byte `0x02` +- Size of messages you have in ASCII (last_size) + +Server sends: + +- All new messages + +*for example: if you want to read last N bytes, last_size = data_size - N* + +Source: https://github.com/MeexReay/bRAC/blob/main/docs/wrac.md diff --git a/_includes/head-custom.html b/_includes/head-custom.html new file mode 100644 index 0000000..ebcf63e --- /dev/null +++ b/_includes/head-custom.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/mkreadme.py b/mkreadme.py new file mode 100644 index 0000000..7266ff9 --- /dev/null +++ b/mkreadme.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +# from typing import Optional +# from enum import Enum + +# class + +# def read_template(name): +# return open(name.upper()+"_TEMPLATE.md", "r", encoding="utf8").read() + +# SOFTWARE_TEMPLATE = read_template("software") +# HOST_TEMPLATE = read_template("host") +# README_TEMPLATE = read_template("readme") + + + +# def software( +# name: str | (str, str), +# description: str, +# author: str, +# release: Optional[(str, str)], +# status: str, +# lang: str, +# rac_version: Optional[str], +# wrac_version: Optional[str], +# note: Optional[str] +# ): +# pass diff --git a/style.css b/style.css new file mode 100644 index 0000000..034b81d --- /dev/null +++ b/style.css @@ -0,0 +1,24 @@ +@import "https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.6.1/github-markdown.min.css"; + +body { + margin: 0; +} + +@media (prefers-color-scheme: light) { + body { + background-color: #ffffff; + } +} + +@media (prefers-color-scheme: dark) { + body { + background-color: #0d1117; + } +} + +.markdown-body { + box-sizing: border-box; + min-width: 200px; + max-width: 980px; + margin: 0 auto; +} \ No newline at end of file