1
0

LauncherConnectingGui.xaml.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. using System.Linq;
  2. using Content.Client.Stylesheets;
  3. using Content.Shared.CCVar;
  4. using Content.Shared.Dataset;
  5. using Robust.Client.AutoGenerated;
  6. using Robust.Client.UserInterface;
  7. using Robust.Client.UserInterface.Controls;
  8. using Robust.Client.UserInterface.XAML;
  9. using Robust.Shared.Configuration;
  10. using Robust.Shared.IoC;
  11. using Robust.Shared.Timing;
  12. using Robust.Shared.Network;
  13. using Robust.Shared.Prototypes;
  14. using Robust.Shared.Random;
  15. namespace Content.Client.Launcher
  16. {
  17. [GenerateTypedNameReferences]
  18. public sealed partial class LauncherConnectingGui : Control
  19. {
  20. private const float RedialWaitTimeSeconds = 15f;
  21. private readonly LauncherConnecting _state;
  22. private float _waitTime;
  23. // Pressing reconnect will redial instead of simply reconnecting.
  24. private bool _redial;
  25. private readonly IRobustRandom _random;
  26. private readonly IPrototypeManager _prototype;
  27. private readonly IConfigurationManager _cfg;
  28. private readonly IClipboardManager _clipboard;
  29. public LauncherConnectingGui(LauncherConnecting state, IRobustRandom random,
  30. IPrototypeManager prototype, IConfigurationManager config, IClipboardManager clipboard)
  31. {
  32. _state = state;
  33. _random = random;
  34. _prototype = prototype;
  35. _cfg = config;
  36. _clipboard = clipboard;
  37. RobustXamlLoader.Load(this);
  38. LayoutContainer.SetAnchorPreset(this, LayoutContainer.LayoutPreset.Wide);
  39. Stylesheet = IoCManager.Resolve<IStylesheetManager>().SheetSpace;
  40. ChangeLoginTip();
  41. RetryButton.OnPressed += ReconnectButtonPressed;
  42. ReconnectButton.OnPressed += ReconnectButtonPressed;
  43. CopyButton.OnPressed += CopyButtonPressed;
  44. CopyButtonDisconnected.OnPressed += CopyButtonDisconnectedPressed;
  45. ExitButton.OnPressed += _ => _state.Exit();
  46. var addr = state.Address;
  47. if (addr != null)
  48. ConnectingAddress.Text = addr;
  49. state.PageChanged += OnPageChanged;
  50. state.ConnectFailReasonChanged += ConnectFailReasonChanged;
  51. state.ConnectionStateChanged += ConnectionStateChanged;
  52. state.ConnectFailed += HandleDisconnectReason;
  53. ConnectionStateChanged(state.ConnectionState);
  54. // Redial flag setup
  55. var edim = IoCManager.Resolve<ExtendedDisconnectInformationManager>();
  56. edim.LastNetDisconnectedArgsChanged += LastNetDisconnectedArgsChanged;
  57. LastNetDisconnectedArgsChanged(edim.LastNetDisconnectedArgs);
  58. }
  59. // Just button, there's only one at once anyways :)
  60. private void ReconnectButtonPressed(BaseButton.ButtonEventArgs args)
  61. {
  62. if (_redial)
  63. {
  64. // Redial shouldn't fail, but if it does, try a reconnect (maybe we're being run from debug)
  65. if (_state.Redial())
  66. return;
  67. }
  68. _state.RetryConnect();
  69. }
  70. private void CopyButtonPressed(BaseButton.ButtonEventArgs args)
  71. {
  72. CopyText(ConnectFailReason.Text);
  73. }
  74. private void CopyButtonDisconnectedPressed(BaseButton.ButtonEventArgs args)
  75. {
  76. CopyText(DisconnectReason.Text);
  77. }
  78. private void CopyText(string? text)
  79. {
  80. if (!string.IsNullOrEmpty(text))
  81. {
  82. _clipboard.SetText(text);
  83. }
  84. }
  85. private void ConnectFailReasonChanged(string? reason)
  86. {
  87. ConnectFailReason.SetMessage(reason == null
  88. ? ""
  89. : Loc.GetString("connecting-fail-reason", ("reason", reason)));
  90. }
  91. private void LastNetDisconnectedArgsChanged(NetDisconnectedArgs? args)
  92. {
  93. HandleDisconnectReason(args);
  94. }
  95. private void HandleDisconnectReason(INetStructuredReason? reason)
  96. {
  97. if (reason == null)
  98. {
  99. _waitTime = 0;
  100. _redial = false;
  101. }
  102. else
  103. {
  104. _redial = reason.RedialFlag;
  105. if (reason.Message.Int32Of("delay") is { } delay)
  106. {
  107. _waitTime = delay;
  108. }
  109. else if (_redial)
  110. {
  111. _waitTime = RedialWaitTimeSeconds;
  112. }
  113. }
  114. }
  115. private void ChangeLoginTip()
  116. {
  117. var tipsDataset = _cfg.GetCVar(CCVars.LoginTipsDataset);
  118. var loginTipsEnabled = _prototype.TryIndex<LocalizedDatasetPrototype>(tipsDataset, out var tips);
  119. LoginTips.Visible = loginTipsEnabled;
  120. if (!loginTipsEnabled)
  121. {
  122. return;
  123. }
  124. var tipList = tips!.Values;
  125. if (tipList.Count == 0)
  126. return;
  127. var randomIndex = _random.Next(tipList.Count);
  128. var tip = tipList[randomIndex];
  129. LoginTip.SetMessage(Loc.GetString(tip));
  130. LoginTipTitle.Text = Loc.GetString("connecting-window-tip", ("numberTip", randomIndex));
  131. }
  132. protected override void FrameUpdate(FrameEventArgs args)
  133. {
  134. base.FrameUpdate(args);
  135. var button = _state.CurrentPage == LauncherConnecting.Page.ConnectFailed
  136. ? RetryButton
  137. : ReconnectButton;
  138. _waitTime -= args.DeltaSeconds;
  139. if (_waitTime <= 0)
  140. {
  141. button.Disabled = false;
  142. var key = _redial
  143. ? "connecting-redial"
  144. : _state.CurrentPage == LauncherConnecting.Page.ConnectFailed
  145. ? "connecting-reconnect"
  146. : "connecting-retry";
  147. button.Text = Loc.GetString(key);
  148. }
  149. else
  150. {
  151. button.Disabled = true;
  152. button.Text = Loc.GetString("connecting-redial-wait", ("time", _waitTime.ToString("00.000")));
  153. }
  154. }
  155. private void OnPageChanged(LauncherConnecting.Page page)
  156. {
  157. ConnectingStatus.Visible = page == LauncherConnecting.Page.Connecting;
  158. ConnectFail.Visible = page == LauncherConnecting.Page.ConnectFailed;
  159. Disconnected.Visible = page == LauncherConnecting.Page.Disconnected;
  160. if (page == LauncherConnecting.Page.Disconnected)
  161. DisconnectReason.Text = _state.LastDisconnectReason;
  162. }
  163. private void ConnectionStateChanged(ClientConnectionState state)
  164. {
  165. ConnectStatus.Text = Loc.GetString($"connecting-state-{state}");
  166. }
  167. }
  168. }