90 lines
2.8 KiB
Python
90 lines
2.8 KiB
Python
"""
|
|
A simple router for allowing multiple applications to talk to VRChat simultaneously.
|
|
"""
|
|
|
|
from threading import Thread
|
|
import argparse
|
|
import logging
|
|
|
|
from pythonosc import udp_client, osc_server
|
|
from pythonosc.dispatcher import Dispatcher
|
|
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
logger = logging.getLogger('main')
|
|
|
|
parser = argparse.ArgumentParser(description='Simple OSC router')
|
|
parser.add_argument('--count', '-c', type=int, help='How many routers to create', default=5)
|
|
|
|
parser.add_argument('--routerIP', type=str, default='127.0.0.1',
|
|
help='')
|
|
parser.add_argument('--routerTXStartPort', '-ssp', type=int,
|
|
help='The starting port for the router servers.', default=9100)
|
|
parser.add_argument('--routerRXStartPort', '-csp', type=int,
|
|
help='The starting port for the router clients.', default=9200)
|
|
|
|
parser.add_argument('--masterIP', type=str, default='127.0.0.1',
|
|
help='')
|
|
parser.add_argument('--masterTXPort', type=int,
|
|
help='', default=9000)
|
|
parser.add_argument('--masterRXPort', type=int,
|
|
help='', default=9001)
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
routerDispatcher = Dispatcher()
|
|
masterDispatcher = Dispatcher()
|
|
|
|
masterServer = osc_server.ThreadingOSCUDPServer((args.masterIP, args.masterRXPort),
|
|
masterDispatcher, timeout=2.5)
|
|
masterClient = udp_client.SimpleUDPClient(args.masterIP, args.masterTXPort, timeout=2.5)
|
|
|
|
routerServers = []
|
|
routerClients = []
|
|
|
|
def broadcastToMaster(address, value):
|
|
"""
|
|
Broadcasts anything sent from a router to the master.
|
|
"""
|
|
|
|
logger.debug('Broadcasting "%s"="%s" to master...', address, value)
|
|
masterClient.send_message(address, value)
|
|
|
|
def broadcastToRouters(address, value):
|
|
"""
|
|
Broadcasts anything sent from the master to the routers.
|
|
"""
|
|
|
|
logger.debug('Broadcasting "%s"="%s" to %s routers...', address, value, len(routerClients))
|
|
for c in routerClients:
|
|
c.send_message(address, value)
|
|
|
|
|
|
routerDispatcher.map('*', broadcastToMaster)
|
|
masterDispatcher.map('*', broadcastToRouters)
|
|
|
|
for i in range(args.count):
|
|
logger.debug('Starting router #%s...', i+1)
|
|
serverPort = args.routerRXStartPort + i
|
|
clientPort = args.routerTXStartPort + i
|
|
server = osc_server.ThreadingOSCUDPServer((args.routerIP, serverPort), routerDispatcher,
|
|
timeout=2.5)
|
|
client = udp_client.SimpleUDPClient(args.routerIP, clientPort, timeout=2.5)
|
|
routerClients.append(client)
|
|
routerServers.append(server)
|
|
|
|
Thread(target=server.serve_forever).start()
|
|
|
|
logger.info('Ready. Press CTRL+C to quit.')
|
|
|
|
try:
|
|
masterServer.serve_forever()
|
|
except KeyboardInterrupt:
|
|
pass
|
|
|
|
masterServer.server_close()
|
|
|
|
for s in routerServers:
|
|
s.server_close()
|