private void TextChangedHandler(object Sender, TextChangedEventArgs Args) { string NewText = AddressField.Text; int ColonCount = NewText.Count(Symbol => Symbol == ':'); if (ColonCount == 0) { AddButton.IsEnabled = HostnameRegex.IsMatch(NewText) || IPRegex.IsMatch(NewText); } else if (ColonCount == 1) { int ColonIndex = NewText.IndexOf(':'); string Host = NewText.Substring(0, ColonIndex); AddButton.IsEnabled = (HostnameRegex.IsMatch(Host) || IPRegex.IsMatch(Host)) && ushort.TryParse(NewText.Substring(++ColonIndex), out _); } else { AddButton.IsEnabled = false; } }
private async void Add(object Sender, RoutedEventArgs Args) { string Address = AddressField.Text, Host; int Port = -1; if (Address.Count(Symbol => Symbol == ':') == 0) { Host = Address; } else { int ColonIndex = Address.IndexOf(':'); Host = Address.Substring(0, ColonIndex); Port = int.Parse(Address.Substring(++ColonIndex)); } bool IsDomain = false; IPAddress IP = null; if (!(IPRegex.IsMatch(Host) && TryParse(Host, out IP))) { IsDomain = true; SetStatus(LocString(LocCode.ResolvingIP), YellowBrush); try { IP = (await GetHostAddressesAsync(Host))[0]; } catch { } } if (IP is null) { SetStatus(LocString(LocCode.NoIPFound), DarkRed); } else { AddressField.IsReadOnly = true; AddButton.IsEnabled = false; if (Port == -1) { SetStatus(LocString(LocCode.ScanningServers), YellowBrush); Server[] Servers = await GetServersForIPAsync(IP); if (Servers is null) { SetStatus(LocString(LocCode.NoServersFound), DarkRed); } else { SetStatus(string.Format(LocString(LocCode.AddServersSuccess), Servers.Length), DarkGreen); if (Instance.CurrentPage is ClusterPage Page && Page.Cluster.Discord is null) { foreach (Server Server in Servers) { Page.ServersList.Children.Add(new ServerItem(Server)); } } foreach (Server Server in Servers) { UServers.Add(new KeyValuePair <Server, string>(Server, IsDomain ? Host : null)); } CommitList(); QueueUserWorkItem((State) => { foreach (Server Server in Servers) { Server.Refresh(); } }); } } else { SetStatus(LocString(LocCode.RequestingSrvInfo), YellowBrush); Server Server = (await ResolveServerAsync(IP, Port)) ?? await FindServerAsync(IP, Port); if (Server is null) { SetStatus(LocString(LocCode.SrvDidnRespond), DarkRed); } else if ((int)Server.Code == -1) { SetStatus(LocString(LocCode.SrvNotSpacewar), DarkRed); } else { SetStatus(LocString(LocCode.AddServerSuccess), DarkGreen); if (Instance.CurrentPage is ClusterPage Page && Page.Cluster.Discord is null) { Page.ServersList.Children.Add(new ServerItem(Server)); } UServers.Add(new KeyValuePair <Server, string>(Server, IsDomain ? Host : null)); CommitList(); QueueUserWorkItem((State) => Server.Refresh()); } } AddressField.IsReadOnly = false; AddButton.IsEnabled = true; } }