using System; using SteamKit2; using SteamKit2.Internal; // this namespace stores the generated protobuf message structures namespace Sample2_Extending; class MyHandler : ClientMsgHandler { // define our custom callback class // this will pass data back to the user of the handler public class MyCallback : CallbackMsg { public EResult Result { get; private set; } // generally we don't want user code to instantiate callback objects, // but rather only let handlers create them internal MyCallback( EResult res ) { Result = res; } } // handlers can also define functions which can send data to the steam servers public void LogOff( string user, string pass ) { var logOffMessage = new ClientMsgProtobuf( EMsg.ClientLogOff ); Client.Send( logOffMessage ); } // some other useful function public void DoSomething() { // this function could send some other message or perform some other logic // ... // Client.Send( somethingElse ); // etc // ... } public override void HandleMsg( IPacketMsg packetMsg ) { // this function is called when a message arrives from the Steam network // the SteamClient class will pass the message along to every registered ClientMsgHandler // the MsgType exposes the EMsg (type) of the message switch ( packetMsg.MsgType ) { // we want to custom handle this message, for the sake of an example case EMsg.ClientLogOnResponse: HandleLogonResponse( packetMsg ); break; } } void HandleLogonResponse( IPacketMsg packetMsg ) { // in order to get at the message contents, we need to wrap the packet message // in an object that gives us access to the message body var logonResponse = new ClientMsgProtobuf( packetMsg ); // the raw body of the message often doesn't make use of useful types, so we need to // cast them to types that are prettier for the user to handle EResult result = ( EResult )logonResponse.Body.eresult; // our handler will simply display a message in the console, and then post our custom callback with the result of logon Console.WriteLine( "HandleLogonResponse: {0}", result ); // post the callback to be consumed by user code Client.PostCallback( new MyCallback( result ) ); } }