CircuitsAPI is a system to transmit data to Rec Room circuits.
Project description
THIS PROJECT IS IN PRE-ALPHA STAGE
This system has not been properly tested. It is constantly being updated with breaking changes. Do not use this system in a production environment. Only use it for testing and experimenting.
Detailed documentation and instructions coming later.
Feel free to contact @Jegarde on Discord for inquiries.
What is this?
A system to communicate with CV2 using Python.
Limitations
- You must sacrifice the following permission roles: host, moderator & contributor. Co-owner will be the only role you can grant others without triggering the system.
- Room owner & co-owners will not be able to receive data by this system.
- You can only send a single bit at once. This system is not applicable for big data transmissions.
- CV2 pongs require messing with the instance's matchmaking state.
- The circuits are currently made in Rooms v2 to prevent the system being used in existing production rooms due to instability.
- It will be ported over to Rooms v1 once it's stable enough.
Installation
The recommended method is installing via pip.
pip install -U circuitsapi
For instructions on installing Python and pip, see The Hitchhiker's Guide to Python.
Setup
Clone the template room: https://rec.net/room/CircuitsAPI.
Request a developer key from https://devportal.rec.net/. This will be passed as the dev_token argument in the client.
Setup RecNetLogin: https://github.com/Jegarde/RecNet-Login/?tab=readme-ov-file#setup.
Quickstart
Here's the basics of setting up the client:
import circuitsapi
import asyncio
async def main():
# Let's initialize the CircuitsAPI client!
# dev_token is the developer key from https://devportal.rec.net/.
# rr_auth is the RecNet access token. If left empty, CircuitsAPI defaults to RecNetLogin: https://github.com/Jegarde/RecNet-Login/
async with circuitsapi.Client(dev_token="", rr_auth=None) as client:
# Connect to a supported room
room = await client.connect_to_room(room="CircuitsAPI") # You can also use the room ID
# Connect to a specific user to send data to
user = await room.connect_to_user(user="Jegarde") # You can also use the account ID
# Send signals to the receiver ports
await user.send_bit_1()
await user.send_bit_0()
await user.send_end_signal()
# Send binary
await user.send_binary(101101)
asyncio.run(main())
Here's the functions you can use if you hook up the in-game 'Receiver' to the 'Packet Handler':
# Assuming you are connected to an user
# Sending text
await user.send_text_packet("Hello, World!")
# Sending integers
await user.send_int_packet(69420)
# Ping the in-game Packet Handler
await user.ping()
Here's some miscellaneous functions:
# Returns true if the player is in the specified room
# Requires 'rn.match.read' scope in access token.
await user.check_is_player_in_room()
# Returns the player's room instance data
# Requires 'rn.match.read' scope in access token.
await user.get_instance()
# Returns player IDs of those who have taken images in the past 10 minutes
# If you want to connect to users, you can ask them to take pictures and have the server check for those pictures
await room.find_players()
Example Usage
This example script is compatible with the template room.
Experimental Features
Run-length encoding
You can compress data with run-length encoding.
Ex. "aaabbbceeeeee" -> "3a3b1c6e"
This is only efficient if the data has lots of repetition.
# Shortened code
from circuitsapi import run_length_encoding
await user.send_text_packet(run_length_encoding("aaabbbccc")) # encodes to 3a3b3c
In-game decoder:
How does this work?
There's CV2 chips for checking if a player is a host, mod or a contributor and you can modify a player's roles through the API. This allows us to send remote signals to the specified player while CV2 is constantly checking for each players' roles.
CircuitsAPI uses the following signals:
Host = Add on bit
Mod = Add off bit
Contributor = Repeat previous bit
No role = End of binary number
So if we wanted to transmit 1011 in binary numbers, the following signals would be sent:
>>> Modify [player] role to Host # Add on bit
>>> Modify [player] role to Mod # Add off bit
>>> Modify [player] role to Host # Add on bit
>>> Modify [player] role to Contributor # Add on bit (repeat previous bit)
>>> Modify [player] role to None # End of binary number
Modify role request
POST /rooms/{ROOM_ID}/roles/{PLAYER_ID} HTTP/1.1
Host: rooms.rec.net
Authorization: Bearer {ACCESS_TOKEN}
Content-Type: application/x-www-form-urlencoded
role={0 | 10 | 20 | 25}
Requires an access token from an account with owner / co-owner in the specified room.
| Role | ID |
|---|---|
| None | 0 |
| Host | 10 |
| Mod | 20 |
| Contributor | 25 |
| Co-owner | 30 |
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file circuitsapi-0.0.4.tar.gz.
File metadata
- Download URL: circuitsapi-0.0.4.tar.gz
- Upload date:
- Size: 13.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b3147e04f678a7e5a68a864c262fe0153c5e52079ba7dee0aac8372616dd1dfb
|
|
| MD5 |
f1cecc89d47b96e108967a3e95bc4f7e
|
|
| BLAKE2b-256 |
7595f83972860d8cba627a5d885be85c6947fbca188fd99807a6ad84d5dc6b50
|
File details
Details for the file circuitsapi-0.0.4-py3-none-any.whl.
File metadata
- Download URL: circuitsapi-0.0.4-py3-none-any.whl
- Upload date:
- Size: 12.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fb38608ed2770e1c1540942c5601db55ca73d0d415043a90f36424bae695f619
|
|
| MD5 |
88135e270017ff7f8ebd9d179566b891
|
|
| BLAKE2b-256 |
ec80e9cbd003f74c1b0f33307d2e13ec5e3db2d60f709c5f9c8d2842bdd8546c
|