terraria-source-code/Social/WeGame/NetClientSocialModule.cs
2021-10-26 12:45:26 -04:00

498 lines
18 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Decompiled with JetBrains decompiler
// Type: Terraria.Social.WeGame.NetClientSocialModule
// Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null
// MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83
// Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe
using rail;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using Terraria.Localization;
using Terraria.Net;
using Terraria.Net.Sockets;
namespace Terraria.Social.WeGame
{
public class NetClientSocialModule : NetSocialModule
{
private RailCallBackHelper _callbackHelper = new RailCallBackHelper();
private bool _hasLocalHost;
private IPCServer server = new IPCServer();
private readonly string _serverIDMedataKey = "terraria.serverid";
private RailID _inviter_id = new RailID();
private List<PlayerPersonalInfo> _player_info_list;
private MessageDispatcherServer _msgServer;
private void OnIPCClientAccess()
{
WeGameHelper.WriteDebugString("IPC client access");
this.SendFriendListToLocalServer();
}
private void LazyCreateWeGameMsgServer()
{
if (this._msgServer != null)
return;
this._msgServer = new MessageDispatcherServer();
this._msgServer.Init("WeGame.Terraria.Message.Server");
this._msgServer.OnMessage += new Action<IPCMessage>(this.OnWegameMessage);
this._msgServer.OnIPCClientAccess += new Action(this.OnIPCClientAccess);
CoreSocialModule.OnTick += new Action(this._msgServer.Tick);
this._msgServer.Start();
}
private void OnWegameMessage(IPCMessage message)
{
if (message.GetCmd() != IPCMessageType.IPCMessageTypeReportServerID)
return;
ReportServerID reportServerID;
message.Parse<ReportServerID>(out reportServerID);
this.OnReportServerID(reportServerID);
}
private void OnReportServerID(ReportServerID reportServerID)
{
WeGameHelper.WriteDebugString("OnReportServerID - " + reportServerID._serverID);
this.AsyncSetMyMetaData(this._serverIDMedataKey, reportServerID._serverID);
this.AsyncSetInviteCommandLine(reportServerID._serverID);
}
public override void Initialize()
{
base.Initialize();
this.RegisterRailEvent();
this.AsyncGetFriendsInfo();
this._reader.SetReadEvent(new WeGameP2PReader.OnReadEvent(this.OnPacketRead));
this._reader.SetLocalPeer(this.GetLocalPeer());
this._writer.SetLocalPeer(this.GetLocalPeer());
Main.OnEngineLoad += new Action(this.CheckParameters);
}
private void AsyncSetInviteCommandLine(string cmdline) => rail_api.RailFactory().RailFriends().AsyncSetInviteCommandLine(cmdline, "");
private void AsyncSetMyMetaData(string key, string value)
{
List<RailKeyValue> railKeyValueList = new List<RailKeyValue>();
railKeyValueList.Add(new RailKeyValue()
{
key = (__Null) key,
value = (__Null) value
});
rail_api.RailFactory().RailFriends().AsyncSetMyMetadata(railKeyValueList, "");
}
private bool TryAuthUserByRecvData(RailID user, byte[] data, int length)
{
WeGameHelper.WriteDebugString("TryAuthUserByRecvData user:{0}", (object) (ulong) ((RailComparableID) user).id_);
if (length < 3)
{
WeGameHelper.WriteDebugString("Failed to validate authentication packet: Too short. (Length: " + (object) length + ")");
return false;
}
int num = (int) data[1] << 8 | (int) data[0];
if (num != length)
{
WeGameHelper.WriteDebugString("Failed to validate authentication packet: Packet size mismatch. (" + (object) num + "!=" + (object) length + ")");
return false;
}
if (data[2] == (byte) 93)
return true;
WeGameHelper.WriteDebugString("Failed to validate authentication packet: Packet type is not correct. (Type: " + (object) data[2] + ")");
return false;
}
private bool OnPacketRead(byte[] data, int size, RailID user)
{
if (!this._connectionStateMap.ContainsKey(user))
return false;
NetSocialModule.ConnectionState connectionState = this._connectionStateMap[user];
if (connectionState != NetSocialModule.ConnectionState.Authenticating)
return connectionState == NetSocialModule.ConnectionState.Connected;
if (!this.TryAuthUserByRecvData(user, data, size))
{
WeGameHelper.WriteDebugString(" Auth Server Ticket Failed");
this.Close(user);
}
else
{
WeGameHelper.WriteDebugString("OnRailAuthSessionTicket Auth Success..");
this.OnAuthSuccess(user);
}
return false;
}
private void OnAuthSuccess(RailID remote_peer)
{
if (!this._connectionStateMap.ContainsKey(remote_peer))
return;
this._connectionStateMap[remote_peer] = NetSocialModule.ConnectionState.Connected;
this.AsyncSetPlayWith(this._inviter_id);
this.AsyncSetMyMetaData("status", Language.GetTextValue("Social.StatusInGame"));
// ISSUE: explicit non-virtual call
this.AsyncSetMyMetaData(this._serverIDMedataKey, __nonvirtual (((RailComparableID) remote_peer).id_.ToString()));
Main.clrInput();
Netplay.ServerPassword = "";
Main.GetInputText("");
Main.autoPass = false;
Main.netMode = 1;
Netplay.OnConnectedToSocialServer((ISocket) new SocialSocket((RemoteAddress) new WeGameAddress(remote_peer, this.GetFriendNickname(this._inviter_id))));
// ISSUE: explicit non-virtual call
WeGameHelper.WriteDebugString("OnConnectToSocialServer server:" + __nonvirtual (((RailComparableID) remote_peer).id_.ToString()));
}
private bool GetRailConnectIDFromCmdLine(RailID server_id)
{
foreach (string commandLineArg in Environment.GetCommandLineArgs())
{
string str = "--rail_connect_cmd=";
int num = commandLineArg.IndexOf(str);
if (num != -1)
{
ulong result = 0;
if (ulong.TryParse(commandLineArg.Substring(num + str.Length), out result))
{
((RailComparableID) server_id).id_ = (__Null) (long) result;
return true;
}
}
}
return false;
}
private void CheckParameters()
{
RailID server_id = new RailID();
if (!this.GetRailConnectIDFromCmdLine(server_id))
return;
if (((RailComparableID) server_id).IsValid())
Main.OpenPlayerSelect((Main.OnPlayerSelected) (playerData =>
{
Main.ServerSideCharacter = false;
playerData.SetAsActive();
Main.menuMode = 882;
Main.statusText = Language.GetTextValue("Social.Joining");
WeGameHelper.WriteDebugString(" CheckParameters lobby.join");
this.JoinServer(server_id);
}));
else
WeGameHelper.WriteDebugString("Invalid RailID passed to +connect_lobby");
}
public override void LaunchLocalServer(Process process, ServerMode mode)
{
if (this._lobby.State != LobbyState.Inactive)
this._lobby.Leave();
this.LazyCreateWeGameMsgServer();
ProcessStartInfo startInfo1 = process.StartInfo;
startInfo1.Arguments = startInfo1.Arguments + " -wegame -localwegameid " + (object) (ulong) ((RailComparableID) this.GetLocalPeer()).id_;
if (mode.HasFlag((Enum) ServerMode.Lobby))
{
this._hasLocalHost = true;
if (mode.HasFlag((Enum) ServerMode.FriendsCanJoin))
process.StartInfo.Arguments += " -lobby friends";
else
process.StartInfo.Arguments += " -lobby private";
if (mode.HasFlag((Enum) ServerMode.FriendsOfFriends))
process.StartInfo.Arguments += " -friendsoffriends";
}
string str;
rail_api.RailFactory().RailUtils().GetLaunchAppParameters((EnumRailLaunchAppType) 2, ref str);
ProcessStartInfo startInfo2 = process.StartInfo;
startInfo2.Arguments = startInfo2.Arguments + " " + str;
WeGameHelper.WriteDebugString("LaunchLocalServer,cmd_line:" + process.StartInfo.Arguments);
this.AsyncSetMyMetaData("status", Language.GetTextValue("Social.StatusInGame"));
Netplay.OnDisconnect += new Action(this.OnDisconnect);
process.Start();
}
public override void Shutdown()
{
this.AsyncSetInviteCommandLine("");
this.CleanMyMetaData();
this.UnRegisterRailEvent();
base.Shutdown();
}
public override ulong GetLobbyId() => 0;
public override bool StartListening(SocketConnectionAccepted callback) => false;
public override void StopListening()
{
}
public override void Close(RemoteAddress address)
{
this.CleanMyMetaData();
this.Close(this.RemoteAddressToRailId(address));
}
public override bool CanInvite() => (this._hasLocalHost || this._lobby.State == LobbyState.Active || Main.LobbyId != 0UL) && (uint) Main.netMode > 0U;
public override void OpenInviteInterface() => this._lobby.OpenInviteOverlay();
private void Close(RailID remote_peer)
{
if (!this._connectionStateMap.ContainsKey(remote_peer))
return;
WeGameHelper.WriteDebugString("CloseRemotePeer, remote:{0}", (object) (ulong) ((RailComparableID) remote_peer).id_);
rail_api.RailFactory().RailNetworkHelper().CloseSession(this.GetLocalPeer(), remote_peer);
this._connectionStateMap[remote_peer] = NetSocialModule.ConnectionState.Inactive;
this._lobby.Leave();
this._reader.ClearUser(remote_peer);
this._writer.ClearUser(remote_peer);
}
public override void Connect(RemoteAddress address)
{
}
public override void CancelJoin()
{
if (this._lobby.State == LobbyState.Inactive)
return;
this._lobby.Leave();
}
private void RegisterRailEvent()
{
RAILEventID[] railEventIdArray = new RAILEventID[7]
{
(RAILEventID) 16001,
(RAILEventID) 16002,
(RAILEventID) 13503,
(RAILEventID) 13501,
(RAILEventID) 12003,
(RAILEventID) 12002,
(RAILEventID) 12010
};
foreach (int num in railEventIdArray)
{
// ISSUE: method pointer
this._callbackHelper.RegisterCallback((RAILEventID) num, new RailEventCallBackHandler((object) this, __methodptr(OnRailEvent)));
}
}
private void UnRegisterRailEvent() => this._callbackHelper.UnregisterAllCallback();
public void OnRailEvent(RAILEventID id, EventBase data)
{
WeGameHelper.WriteDebugString("OnRailEvent,id=" + id.ToString() + " ,result=" + data.result.ToString());
if (id <= 12010)
{
if (id != 12002)
{
if (id != 12003)
{
if (id != 12010)
return;
this.OnFriendlistChange((RailFriendsListChanged) data);
}
else
this.OnGetFriendMetaData((RailFriendsGetMetadataResult) data);
}
else
this.OnRailSetMetaData((RailFriendsSetMetadataResult) data);
}
else if (id <= 13503)
{
if (id != 13501)
{
if (id != 13503)
return;
this.OnRailRespondInvation((RailUsersRespondInvitation) data);
}
else
this.OnRailGetUsersInfo((RailUsersInfoData) data);
}
else if (id != 16001)
{
if (id != 16002)
return;
this.OnRailCreateSessionFailed((CreateSessionFailed) data);
}
else
this.OnRailCreateSessionRequest((CreateSessionRequest) data);
}
private string DumpMataDataString(List<RailKeyValueResult> list)
{
StringBuilder stringBuilder = new StringBuilder();
foreach (RailKeyValueResult railKeyValueResult in list)
stringBuilder.Append("key: " + (string) railKeyValueResult.key + " value: " + (string) railKeyValueResult.value);
return stringBuilder.ToString();
}
private string GetValueByKey(string key, List<RailKeyValueResult> list)
{
string str = (string) null;
foreach (RailKeyValueResult railKeyValueResult in list)
{
if ((string) railKeyValueResult.key == key)
{
str = (string) railKeyValueResult.value;
break;
}
}
return str;
}
private bool SendFriendListToLocalServer()
{
bool flag = false;
if (this._hasLocalHost)
{
List<RailFriendInfo> list = new List<RailFriendInfo>();
if (this.GetRailFriendList(list))
{
WeGameFriendListInfo t = new WeGameFriendListInfo()
{
_friendList = list
};
IPCMessage msg = new IPCMessage();
msg.Build<WeGameFriendListInfo>(IPCMessageType.IPCMessageTypeNotifyFriendList, t);
flag = this._msgServer.SendMessage(msg);
WeGameHelper.WriteDebugString("NotifyFriendListToServer: " + flag.ToString());
}
}
return flag;
}
private bool GetRailFriendList(List<RailFriendInfo> list)
{
bool flag = false;
IRailFriends irailFriends = rail_api.RailFactory().RailFriends();
if (irailFriends != null)
flag = irailFriends.GetFriendsList(list) == 0;
return flag;
}
private void OnGetFriendMetaData(RailFriendsGetMetadataResult data)
{
if (((EventBase) data).result != null || ((List<RailKeyValueResult>) data.friend_kvs).Count <= 0)
return;
WeGameHelper.WriteDebugString("OnGetFriendMetaData - " + this.DumpMataDataString((List<RailKeyValueResult>) data.friend_kvs));
string valueByKey = this.GetValueByKey(this._serverIDMedataKey, (List<RailKeyValueResult>) data.friend_kvs);
if (valueByKey == null)
return;
if (valueByKey.Length > 0)
{
RailID server_id = new RailID();
((RailComparableID) server_id).id_ = (__Null) (long) ulong.Parse(valueByKey);
if (((RailComparableID) server_id).IsValid())
this.JoinServer(server_id);
else
WeGameHelper.WriteDebugString("JoinServer failed, invalid server id");
}
else
WeGameHelper.WriteDebugString("can not find server id key");
}
private void JoinServer(RailID server_id)
{
WeGameHelper.WriteDebugString("JoinServer:{0}", (object) (ulong) ((RailComparableID) server_id).id_);
this._connectionStateMap[server_id] = NetSocialModule.ConnectionState.Authenticating;
int length = 3;
byte[] numArray = new byte[length];
numArray[0] = (byte) (length & (int) byte.MaxValue);
numArray[1] = (byte) (length >> 8 & (int) byte.MaxValue);
numArray[2] = (byte) 93;
rail_api.RailFactory().RailNetworkHelper().SendReliableData(this.GetLocalPeer(), server_id, numArray, (uint) length);
}
private string GetFriendNickname(RailID rail_id)
{
if (this._player_info_list != null)
{
foreach (PlayerPersonalInfo playerInfo in this._player_info_list)
{
if (RailComparableID.op_Equality((RailComparableID) playerInfo.rail_id, (RailComparableID) rail_id))
return (string) playerInfo.rail_name;
}
}
return "";
}
private void OnRailGetUsersInfo(RailUsersInfoData data) => this._player_info_list = (List<PlayerPersonalInfo>) data.user_info_list;
private void OnFriendlistChange(RailFriendsListChanged data)
{
if (!this._hasLocalHost)
return;
this.SendFriendListToLocalServer();
}
private void AsyncGetFriendsInfo()
{
IRailFriends irailFriends = rail_api.RailFactory().RailFriends();
if (irailFriends == null)
return;
List<RailFriendInfo> railFriendInfoList = new List<RailFriendInfo>();
irailFriends.GetFriendsList(railFriendInfoList);
List<RailID> railIdList = new List<RailID>();
foreach (RailFriendInfo railFriendInfo in railFriendInfoList)
railIdList.Add((RailID) railFriendInfo.friend_rail_id);
irailFriends.AsyncGetPersonalInfo(railIdList, "");
}
private void AsyncSetPlayWith(RailID rail_id)
{
List<RailUserPlayedWith> railUserPlayedWithList = new List<RailUserPlayedWith>();
railUserPlayedWithList.Add(new RailUserPlayedWith()
{
rail_id = (__Null) rail_id
});
rail_api.RailFactory().RailFriends()?.AsyncReportPlayedWithUserList(railUserPlayedWithList, "");
}
private void OnRailSetMetaData(RailFriendsSetMetadataResult data) => WeGameHelper.WriteDebugString("OnRailSetMetaData - " + ((EventBase) data).result.ToString());
private void OnRailRespondInvation(RailUsersRespondInvitation data)
{
WeGameHelper.WriteDebugString(" request join game");
if (this._lobby.State != LobbyState.Inactive)
this._lobby.Leave();
this._inviter_id = (RailID) data.inviter_id;
Main.OpenPlayerSelect((Main.OnPlayerSelected) (playerData =>
{
Main.ServerSideCharacter = false;
playerData.SetAsActive();
Main.menuMode = 882;
Main.statusText = Language.GetTextValue("Social.JoiningFriend", (object) this.GetFriendNickname((RailID) data.inviter_id));
this.AsyncGetServerIDByOwener((RailID) data.inviter_id);
WeGameHelper.WriteDebugString("inviter_id: " + (object) (ulong) ((RailComparableID) data.inviter_id).id_);
}));
}
private void AsyncGetServerIDByOwener(RailID ownerID) => rail_api.RailFactory().RailFriends()?.AsyncGetFriendMetadata(ownerID, new List<string>()
{
this._serverIDMedataKey
}, "");
private void OnRailCreateSessionRequest(CreateSessionRequest result)
{
WeGameHelper.WriteDebugString(nameof (OnRailCreateSessionRequest));
if (!this._connectionStateMap.ContainsKey((RailID) result.remote_peer) || this._connectionStateMap[(RailID) result.remote_peer] == NetSocialModule.ConnectionState.Inactive)
return;
WeGameHelper.WriteDebugString("AcceptSessionRequest, local{0}, remote:{1}", (object) (ulong) ((RailComparableID) result.local_peer).id_, (object) (ulong) ((RailComparableID) result.remote_peer).id_);
rail_api.RailFactory().RailNetworkHelper().AcceptSessionRequest((RailID) result.local_peer, (RailID) result.remote_peer);
}
private void OnRailCreateSessionFailed(CreateSessionFailed result)
{
WeGameHelper.WriteDebugString("OnRailCreateSessionFailed, CloseRemote: local:{0}, remote:{1}", (object) (ulong) ((RailComparableID) result.local_peer).id_, (object) (ulong) ((RailComparableID) result.remote_peer).id_);
this.Close((RailID) result.remote_peer);
}
private void CleanMyMetaData() => rail_api.RailFactory().RailFriends()?.AsyncClearAllMyMetadata("");
private void OnDisconnect()
{
this.CleanMyMetaData();
this._hasLocalHost = false;
Netplay.OnDisconnect -= new Action(this.OnDisconnect);
}
}
}