Skip to content

Communicate with CV2 using Python.

License

Notifications You must be signed in to change notification settings

Jegarde/CircuitsAPI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

43 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

promo

This appears to be patched.

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

About

Communicate with CV2 using Python.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Sponsor this project

Packages

No packages published

Languages