using NPinyin;
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 = "", string nameFilter = "")
{
var pinyin = nameFilter.ToPinyin();
var newList = _identity
.AsSortedList()
.Where(x =>
{
if (!x.IPString.StartsWith(filter))
{
return false;
}
if (x.PinyinID?.ContainsIgnoreCase(pinyin) is true)
{
return true;
}
return x.ID.ContainsIgnoreCase(nameFilter);
})
.ToArray();
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)
{
var ipText = _ipField.Text;
var idText = _idField.Text;
await Task.Run(() => Display(ipText, idText));
}
private void DataGrid_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
}
}
}