2025-02-26 15:03:13 -08:00

169 lines
4.6 KiB
C#

using HarmonyLib;
using Steamworks;
using System;
using System.Threading;
namespace SteamTransportTest;
/// <summary>
/// entry point for testing.
/// should probably make this a separate project since it copies over steam api. idc rn
/// </summary>
public static class Program
{
public static void Main(string[] args)
{
Console.WriteLine("This is the test mode for the steam transport");
try
{
// copied from qsbcore and steamworks.net docs
{
if (!Packsize.Test())
{
Console.Error.WriteLine("[Steamworks.NET] Packsize Test returned false, the wrong version of Steamworks.NET is being run in this platform.");
}
if (!DllCheck.Test())
{
Console.Error.WriteLine("[Steamworks.NET] DllCheck Test returned false, One or more of the Steamworks binaries seems to be the wrong version.");
}
// yes, these have to be the same. even for connecting to ip address
Environment.SetEnvironmentVariable("SteamAppId", "480");
Environment.SetEnvironmentVariable("SteamGameId", "480");
var m_bInitialized = SteamAPI.Init();
if (!m_bInitialized)
{
Console.Error.WriteLine("[Steamworks.NET] SteamAPI_Init() failed. Refer to Valve's documentation or the comment above this line for more information.");
return;
}
SteamClient.SetWarningMessageHook((severity, text) => Console.WriteLine(text));
}
Console.WriteLine("press 1 for server, 2 for client");
switch (Console.ReadKey(true).KeyChar)
{
case '1':
Console.WriteLine("server");
DoServer();
break;
case '2':
Console.WriteLine("client");
DoClient();
break;
}
}
finally
{
SteamAPI.Shutdown();
Console.WriteLine("Done. Press any key to exit");
Console.ReadKey();
}
}
private static void DoServer()
{
var transport = new SteamTransport.SteamTransport();
transport.Log = Console.WriteLine;
transport.TestIpAddress = "127.0.0.1:1234";
// make timeout for client detecting server drop different than timeout for server detecting client drop
transport.Timeout = 5000;
transport.DoFakeNetworkErrors = false;
transport.OnServerError = (conn, error, s) => Console.Error.WriteLine($"ERROR {conn} {error} {s}");
var theConn = -1;
transport.OnServerConnected = conn => theConn = conn;
transport.OnServerDataSent = (conn, bytes, i) => Console.WriteLine($"SEND {conn} {i} {bytes.Join()}");
transport.OnServerDataReceived = (conn, bytes, i) => Console.WriteLine($"RECV {conn} {i} {bytes.Join()}");
transport.ServerStart();
try
{
Console.WriteLine("press c to close, s to send, d to disconnect");
var running = true;
while (running)
{
transport.ServerEarlyUpdate();
if (Console.KeyAvailable)
{
switch (Console.ReadKey(true).KeyChar)
{
case 'c':
// running = false;
transport.ServerDisconnect(theConn); // mirror does this for us
transport.ServerStop();
break;
case 's':
transport.ServerSend(theConn, new ArraySegment<byte>(new byte[] { 1, 2, (byte)DateTime.Now.Millisecond, 4, 5 }, 1, 5 - 1));
break;
case 'd':
transport.ServerDisconnect(theConn);
break;
}
}
SteamAPI.RunCallbacks();
transport.ServerLateUpdate();
Thread.Sleep(10);
}
}
finally
{
transport.ServerDisconnect(theConn); // mirror does this for us
transport.ServerStop();
}
}
private static void DoClient()
{
var transport = new SteamTransport.SteamTransport();
transport.Log = Console.WriteLine;
transport.TestIpAddress = "127.0.0.1:1234";
transport.Timeout = 20000;
transport.DoFakeNetworkErrors = true;
transport.OnClientError = (error, s) => Console.Error.WriteLine($"ERROR {error} {s}");
transport.OnClientDataSent = (bytes, i) => Console.WriteLine($"SEND {i} {bytes.Join()}");
transport.OnClientDataReceived = (bytes, i) => Console.WriteLine($"RECV {i} {bytes.Join()}");
transport.ClientConnect("76561198150564286");
try
{
Console.WriteLine("press c to close, s to send");
var running = true;
// transport.OnClientDisconnected = () => running = false; // mirror normally does this
while (running)
{
transport.ClientEarlyUpdate();
if (Console.KeyAvailable)
{
switch (Console.ReadKey(true).KeyChar)
{
case 'c':
// running = false;
transport.ClientDisconnect();
break;
case 's':
transport.ClientSend(new ArraySegment<byte>(new byte[] { 1, 2, (byte)DateTime.Now.Millisecond, 4, 5 }, 1, 5 - 1), 1);
break;
}
}
SteamAPI.RunCallbacks();
transport.ClientLateUpdate();
Thread.Sleep(10);
}
}
finally
{
transport.ClientDisconnect();
}
}
}