с# | cpp samp client

Hideme Flow

Известный
Автор темы
555
193
1. как получить список серверов с вкладки internet, hosted?
1660076652046.png

2. как узнать по ip:port
2.1 стоит ли пароль на сервере
2.2 название сервера
2.3 онлайн
2.4 пинг (как у клиента самп)
2.5 мод сервера
2.6 язык сервера
 

_=Gigant=_

Известный
134
191
C:
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);
            }
        }
 

Escobar_Montana

Новичок
1
0
C:
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);
            }
        }
Cкинь пожалуйста файлом, ибо у меня не копируется как бы не пытался. В первый раз с таким сталкиваюсь.
 

_=Gigant=_

Известный
134
191