// 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 _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(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(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 railKeyValueList = new List(); 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 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 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 list = new List(); if (this.GetRailFriendList(list)) { WeGameFriendListInfo t = new WeGameFriendListInfo() { _friendList = list }; IPCMessage msg = new IPCMessage(); msg.Build(IPCMessageType.IPCMessageTypeNotifyFriendList, t); flag = this._msgServer.SendMessage(msg); WeGameHelper.WriteDebugString("NotifyFriendListToServer: " + flag.ToString()); } } return flag; } private bool GetRailFriendList(List 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) data.friend_kvs).Count <= 0) return; WeGameHelper.WriteDebugString("OnGetFriendMetaData - " + this.DumpMataDataString((List) data.friend_kvs)); string valueByKey = this.GetValueByKey(this._serverIDMedataKey, (List) 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) 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 railFriendInfoList = new List(); irailFriends.GetFriendsList(railFriendInfoList); List railIdList = new List(); foreach (RailFriendInfo railFriendInfo in railFriendInfoList) railIdList.Add((RailID) railFriendInfo.friend_rail_id); irailFriends.AsyncGetPersonalInfo(railIdList, ""); } private void AsyncSetPlayWith(RailID rail_id) { List railUserPlayedWithList = new List(); 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() { 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); } } }