private readonly List<string> _servers = new List<string>();
private async void timer1_Tick(object sender, EventArgs e)
{
try
{
var serverLists = await Task.WhenAll(
DownloadServerList("http://lists.sa-mp.com/0.3.7/hosted"),
DownloadServerList("http://lists.sa-mp.com/0.3.7/internet")
);
var serverList = serverLists.SelectMany(s => s)
.Distinct()
.ToArray();
var serversToRemove = _servers.Except(serverList).ToList();
var serversToAdd = serverList.Except(_servers).ToList();
foreach (var server in serversToRemove)
{
int rowIndex = dataGridView1.Rows
.Cast<DataGridViewRow>()
.FirstOrDefault(row => row.Cells[0].Value != null && row.Cells[0].Value.ToString() == server)?.Index ?? -1;
if (rowIndex != -1)
{
dataGridView1.Rows.RemoveAt(rowIndex);
}
}
foreach (var server in serversToAdd)
{
_servers.Add(server);
dataGridView1.Rows.Add(server);
}
if (serversToAdd.Count > 0 && !_backgroundWorker.IsBusy)
{
_backgroundWorker.RunWorkerAsync();
timer1.Stop();
}
}
catch (HttpRequestException ex)
{
Console.WriteLine($"Error retrieving content: {ex.Message}");
}
}
private async Task<string[]> DownloadServerList(string url)
{
HttpResponseMessage response = await _httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
return responseBody.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);
}
private void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if (_backgroundWorker.CancellationPending)
{
e.Cancel = true;
return;
}
var server = dataGridView1.Rows[i].Cells[0].Value?.ToString();
if (!string.IsNullOrEmpty(server))
{
SampQuery api = new SampQuery(server.Split(':')[0], Convert.ToUInt16(server.Split(':')[1]), 'i');
int iPlayers = 0, iMaxPlayers = 0;
foreach (KeyValuePair<string, string> kvp in api.read(true))
{
switch (kvp.Key)
{
case "hostname":
dataGridView1.Rows[i].Cells[1].Value = kvp.Value;
break;
case "players":
iPlayers = Convert.ToInt32(kvp.Value);
break;
case "maxplayers":
iMaxPlayers = Convert.ToInt32(kvp.Value);
break;
case "gamemode":
dataGridView1.Rows[i].Cells[4].Value = kvp.Value;
break;
default:
break;
}
dataGridView1.Rows[i].Cells[2].Value = $" {iPlayers + "/" + iMaxPlayers} ";
}
for (int j = i - 1; j >= 0; j--)
{
if (string.IsNullOrEmpty(dataGridView1.Rows[j].Cells[1].Value?.ToString()))
{
dataGridView1.Invoke((MethodInvoker)delegate
{
dataGridView1.Rows[j].Visible = false;
});
}
else
{
break;
}
}
}
else
{
System.Threading.Thread.Sleep(100);
i--;
}
}
System.Threading.Thread.Sleep(5 * 60 * 1000);
}
}