Skip to main content

promo

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

Metadata

Release files for circuitsapi 0.0.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for circuitsapi 0.0.4
File Size Uploaded
circuitsapi-0.0.4.tar.gz 13.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for circuitsapi 0.0.4
File Interpreter ABI Platform
circuitsapi-0.0.4-py3-none-any.whl Python 3 none any Details

Total release size: 26.0 kB

Release files / circuitsapi-0.0.4.tar.gz

Download URL circuitsapi-0.0.4.tar.gz
Size 13.6 kB
Tags Source
SHA-256 checksum
How to use checksums
b3147e04f678a7e5a68a864c262fe0153c5e52079ba7dee0aac8372616dd1dfb
BLAKE2b-256 checksum
How to use checksums
7595f83972860d8cba627a5d885be85c6947fbca188fd99807a6ad84d5dc6b50
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.12.0

Release files / circuitsapi-0.0.4-py3-none-any.whl

Download URL circuitsapi-0.0.4-py3-none-any.whl
Size 12.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fb38608ed2770e1c1540942c5601db55ca73d0d415043a90f36424bae695f619
BLAKE2b-256 checksum
How to use checksums
ec80e9cbd003f74c1b0f33307d2e13ec5e3db2d60f709c5f9c8d2842bdd8546c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.12.0

Release history Release notifications | RSS feed

This release

0.0.4 This release

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page