private readonly List<string> _servers = new List<string>();
private async void timer1_Tick(object sender, EventArgs e)
{
try
{
// Download servers from both sources
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")
);
// Combine the lists and remove duplicates
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();
// lblServersOnline.Text = $"Online Servers: {dataGridView1.RowCount} ";
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;
/* case "mapname":
dataGridView1.Rows[i].Cells[5].Value = kvp.Value;
break;*/
default:
// Do something when key is not hostname or some other
break;
}
dataGridView1.Rows[i].Cells[2].Value = $" {iPlayers + "/" + iMaxPlayers} ";
}
// Hide or remove previous rows with empty Hostname
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
{
// Wait for row to be updated before moving to the next one
System.Threading.Thread.Sleep(100);
i--; // stay at the same index since the row is not fully populated yet
}
}
// Wait for 5 minutes before updating the DataGridView again
System.Threading.Thread.Sleep(5 * 60 * 1000);
}
}