using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Web; using System.Web.Script.Serialization; using System.Windows; namespace AnotherReplayReader { /// /// Window1.xaml 的交互逻辑 /// internal partial class Window1 : Window { private PlayerIdentity _identity; public Window1(PlayerIdentity identity) { InitializeComponent(); _identity = identity; Refresh(); } private async void Refresh() { Dispatcher.Invoke(() => _setIPButton.IsEnabled = false); try { Dispatcher.Invoke(() => { _dataGrid.Items.Clear(); _dataGrid.Items.Add(new IPAndPlayer { IP = 0, ID = "正在加载..." }); }); await _identity.Fetch(); Display(); } catch(Exception e) { Dispatcher.Invoke(() => MessageBox.Show(this, $"无法加载IP表:{e}")); } Dispatcher.Invoke(() => _setIPButton.IsEnabled = true); } private void Display(string filter = "") { var newList = _identity.AsSortedList().Where(x => x.IPString.StartsWith(filter)); Dispatcher.Invoke(() => { _dataGrid.Items.Clear(); foreach (var item in newList) { _dataGrid.Items.Add(item); } }); } private async void OnClick(object sender, RoutedEventArgs e) { Dispatcher.Invoke(() => _setIPButton.IsEnabled = false); await Task.Run(() => { var ipText = Dispatcher.Invoke(() => _ipField.Text); if (!IPAddress.TryParse(ipText, out var ip)) { Dispatcher.Invoke(() => MessageBox.Show(this, "IP格式不正确")); return; } var idText = Dispatcher.Invoke(() => _idField.Text); if (string.IsNullOrWhiteSpace(idText)) { var result = Dispatcher.Invoke(() => MessageBox.Show(this, "你没填输入任何说明,是否确认继续?", "注意", MessageBoxButton.OKCancel)); if(result != MessageBoxResult.OK) { return; } } try { var bytes = ip.GetAddressBytes(); var ipNum = (uint)bytes[0] * 256 * 256 * 256 + bytes[1] * 256 * 256 + bytes[2] * 256 + bytes[3]; var text = HttpUtility.UrlEncode(idText); var key = HttpUtility.UrlEncode(Auth.GetKey()); var request = WebRequest.Create($"https://lanyi.altervista.org/playertable/playertable.php?do=setIP&ip={ipNum}&id={text}&key={key}"); using (var stream = request.GetResponse().GetResponseStream()) using (var reader = new StreamReader(stream)) { var response = reader.ReadToEnd(); var serializer = new JavaScriptSerializer(); var result = serializer.Deserialize(response); if(!result) { Dispatcher.Invoke(() => MessageBox.Show(this, "设置IP表失败")); } } } catch (Exception exception) { Dispatcher.Invoke(() => MessageBox.Show(this, $"设置IP表时发生错误。\r\n{exception}")); } }); Refresh(); } private async void OnIPFieldChanged(object sender, System.Windows.Controls.TextChangedEventArgs e) { await Task.Run(() => { var fieldText = Dispatcher.Invoke(() => _ipField.Text); Display(fieldText); }); } } }