Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ocalasans/samp-query-node
API em JavaScript para realizar requisições e extrair dados de servidores SA-MP (San Andreas Multiplayer), desenvolvida para rodar em ambiente Node.js.
https://github.com/ocalasans/samp-query-node
api javascript js networking node node-js nodejs nodejs-api nodejs-modules query sa-mp samp server server-query server-status
Last synced: 12 days ago
JSON representation
API em JavaScript para realizar requisições e extrair dados de servidores SA-MP (San Andreas Multiplayer), desenvolvida para rodar em ambiente Node.js.
- Host: GitHub
- URL: https://github.com/ocalasans/samp-query-node
- Owner: ocalasans
- License: mit
- Created: 2024-10-31T17:22:17.000Z (19 days ago)
- Default Branch: main
- Last Pushed: 2024-11-02T22:22:30.000Z (17 days ago)
- Last Synced: 2024-11-02T23:19:09.169Z (17 days ago)
- Topics: api, javascript, js, networking, node, node-js, nodejs, nodejs-api, nodejs-modules, query, sa-mp, samp, server, server-query, server-status
- Language: JavaScript
- Homepage: https://abre.ai/samp-spc
- Size: 57.6 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# SA-MP Query Node
Uma API completa para ambientes **Node.js**, projetada para consultas a servidores SA-MP (San Andreas Multiplayer) e compatível com o OPEN.MP (Open Multiplayer). Oferece recursos avançados de monitoramento e coleta de informações em tempo real.### Idiomas
- **English** > [README](Translations/English)
- **Español** > [README](Translations/Espanol)
- **Polski** > [README](Translations/Polski)
- **Türk** > [README](Translations/Turk)
- **Deutsch** > [README](Translations/Deutsch)
- **Русский** > [README](Translations/Русский)
- **Français** > [README](Translations/Francais)
- **Italiano** > [README](Translations/Italiano)
- **Svenska** > [README](Translations/Svenska)## Índice
- [SA-MP Query Node](#sa-mp-query-node)
- [Idiomas](#idiomas)
- [Índice](#índice)
- [Sobre a API](#sobre-a-api)
- [Instalação](#instalação)
- [Funcionalidades](#funcionalidades)
- [Sistema de Consulta Principal](#sistema-de-consulta-principal)
- [Estrutura da API](#estrutura-da-api)
- [Classes Principais](#classes-principais)
- [1. DNS\_Cache](#1-dns_cache)
- [2. Query\_Manager](#2-query_manager)
- [3. SAMP\_Strings](#3-samp_strings)
- [Sistema de Cache DNS](#sistema-de-cache-dns)
- [Sistema de Latência](#sistema-de-latência)
- [Medição de Ping](#medição-de-ping)
- [Exemplos de Uso](#exemplos-de-uso)
- [1. Consulta Básica](#1-consulta-básica)
- [2. Consulta com Opções Personalizadas](#2-consulta-com-opções-personalizadas)
- [3. Utilizando Promises](#3-utilizando-promises)
- [4. Monitoramento Contínuo](#4-monitoramento-contínuo)
- [Tratamento de Erros](#tratamento-de-erros)
- [1. Erros de Conexão](#1-erros-de-conexão)
- [2. Timeouts](#2-timeouts)
- [3. Validação de Dados](#3-validação-de-dados)
- [Considerações de Desempenho](#considerações-de-desempenho)
- [Otimizações Implementadas](#otimizações-implementadas)
- [Limitações Técnicas](#limitações-técnicas)
- [Estrutura de Resposta](#estrutura-de-resposta)
- [Comunidade SA-MP](#comunidade-sa-mp)## Sobre a API
O **SA-MP Query Node** é uma API desenvolvida especificamente para interagir com servidores SA-MP, permitindo a coleta de informações detalhadas sobre o servidor em tempo real. A API utiliza o protocolo de consulta nativo do SA-MP e implementa várias camadas de otimização para garantir consultas eficientes e confiáveis.
A API foi projetada com foco em:
- Confiabilidade nas consultas
- Eficiência no processamento
- Facilidade de uso
- Tratamento robusto de erros
- Suporte completo a todas as funcionalidades do protocolo SA-MP## Instalação
Clone o repositório para sua máquina local:
```bash
git clone https://github.com/ocalasans/samp-query-node.git
```## Funcionalidades
### Sistema de Consulta Principal
A API oferece um sistema de consulta completo que permite obter:
1. **Informações Básicas do Servidor:**
- Nome do servidor
- Modo de jogo atual
- Idioma configurado
- Status de proteção por senha
- Número máximo de jogadores
- Número atual de jogadores online2. **Lista Detalhada de Jogadores:**
- ID do jogador
- Nome do jogador
- Pontuação atual
- Latência (ping) do jogador3. **Regras do Servidor:**
- Configurações de lag compensation
- Clima atual
- Outras regras personalizadas definidas pelo servidor4. **Medições de Desempenho:**
- Latência do servidor (ping)
- Tempo de resposta das consultas
- Estatísticas de conexão## Estrutura da API
### Classes Principais
#### 1. DNS_Cache
```javascript
class DNS_Cache {
constructor() {
this.cache = new Map();
this.Resolve_DNS = promisify(dns.resolve4);
}
}
```A classe **DNS_Cache** é responsável por:
- Armazenar temporariamente resoluções DNS
- Otimizar consultas repetidas
- Reduzir a latência de conexão
- Gerenciar o tempo de vida do cacheMétodos principais:
- `Get_IP_Address(host_name)`: Resolve e cache endereços IP
- Cache automático com duração configurável (padrão: 5 minutos)
- Fallback para hostname em caso de falha na resolução#### 2. Query_Manager
```javascript
class Query_Manager extends EventEmitter {
constructor() {
super();
this.Active_Queries = new Map();
}
}
```O **Query_Manager** controla:
- Gerenciamento de consultas ativas
- Timeouts e retentativas
- Eventos de conclusão de consulta
- Limpeza de consultas expiradasFuncionalidades:
- Sistema de retry automático
- Controle de tempo limite
- Gerenciamento de múltiplas consultas simultâneas
- Emissão de eventos de conclusão#### 3. SAMP_Strings
```javascript
class SAMP_Strings {
static charset = [/* conjunto de caracteres SA-MP */];
static Decode_String(buffer_data) { /* ... */ }
}
```Responsável por:
- Decodificação de strings do SA-MP
- Suporte a caracteres especiais
- Limpeza e sanitização de strings
- Conversão de buffers para texto## Sistema de Cache DNS
O sistema de cache DNS é uma parte crucial da API, implementando:
1. **Gerenciamento de Cache:**
- Armazenamento eficiente de resoluções DNS
- Verificação de validade temporal
- Limpeza automática de entradas antigas2. **Otimização de Desempenho:**
- Redução de consultas DNS redundantes
- Melhoria no tempo de resposta
- Economia de recursos de rede3. **Configurações de Cache:**
```javascript
const DNS_CACHE_TIME = 300000; // 5 minutos
```4. **Tratamento de Falhas:**
- Fallback para hostname original
- Retry automático em falhas temporárias
- Logging de erros de resolução## Sistema de Latência
### Medição de Ping
O sistema de medição de latência implementa:
1. **Coleta de Amostras:**
```javascript
const LATENCY = {
SAMPLES: 5,
CHECK_INTERVAL: 50,
TIMEOUT: 2000,
MAX_VALID_PING: 800
};
```2. **Processamento de Resultados:**
- Cálculo de média de latência
- Filtragem de valores atípicos
- Detecção de timeouts3. **Otimizações:**
- Múltiplas amostras para precisão
- Intervalos configuráveis
- Timeouts independentes### Exemplos de Uso
#### 1. Consulta Básica
```javascript
const query = require('samp-query-node');query('127.0.0.1:7777', (erro, resposta) => {
if (erro) {
console.error('Erro na consulta:', erro);
return;
}
console.log('Informações do servidor:', resposta);
});
```#### 2. Consulta com Opções Personalizadas
```javascript
const opcoes = {
host: '127.0.0.1',
port: 7777,
timeout: 1500 // timeout de 1.5 segundos
};query(opcoes, (erro, resposta) => {
if (erro) {
console.error('Erro:', erro);
return;
}
console.log('Nome do servidor:', resposta.hostname);
console.log('Jogadores:', resposta.onlinePlayers);
console.log('Modo de jogo:', resposta.gamemode);
// Processando lista de jogadores
resposta.players.forEach(jogador => {
console.log(`${jogador.name}: ${jogador.score} pontos`);
});
});
```#### 3. Utilizando Promises
```javascript
const util = require('util');
const Query_Async = util.promisify(query);async function Requisitar_Servidor() {
try {
const info = await Query_Async('127.0.0.1:7777');
console.log('Servidor:', info.hostname);
console.log('Jogadores:', info.onlinePlayers);
console.log('Ping:', info.ping, 'ms');
// Processando regras do servidor
if (info.rules.lagcomp === 'On') {
console.log('Servidor com lag compensation ativado');
}
// Listando top jogadores
const topJogadores = info.players
.sort((a, b) => b.score - a.score)
.slice(0, 5);
console.log('\nTop 5 Jogadores:');
topJogadores.forEach((jogador, index) => {
console.log(`${index + 1}. ${jogador.name}: ${jogador.score} pontos`);
});
} catch (erro) {
console.error('Erro ao consultar servidor:', erro);
}
}
```#### 4. Monitoramento Contínuo
```javascript
async function Monitorar_Servidor(endereco, intervalo = 60000) {
const Query_Async = util.promisify(query);
console.log(`Iniciando monitoramento de ${endereco}`);
setInterval(async () => {
try {
const info = await Query_Async(endereco);
console.log('\n=== Status do Servidor ===');
console.log(`Tempo: ${new Date().toLocaleString()}`);
console.log(`Jogadores: ${info.onlinePlayers}/${info.maxPlayers}`);
console.log(`Ping: ${info.ping}ms`);
console.log(`Modo: ${info.gamemode}`);
if (info.onlinePlayers > 0) {
console.log('\nJogadores Online:');
info.players.forEach(jogador => {
console.log(`- ${jogador.name} (Ping: ${jogador.ping}ms)`);
});
}
} catch (erro) {
console.error('Erro no monitoramento:', erro);
}
}, intervalo);
}
```## Tratamento de Erros
A API implementa um sistema robusto de tratamento de erros:
### 1. Erros de Conexão
```javascript
query('127.0.0.1:7777', (erro, resposta) => {
if (!resposta.hostname) {
console.log('Servidor offline ou inacessível');
}
});
```### 2. Timeouts
```javascript
const opcoes = {
host: '127.0.0.1',
port: 7777,
timeout: 2000 // 2 segundos
};query(opcoes, (erro, resposta) => {
if (erro) {
console.log('Servidor não respondeu no tempo limite');
}
});
```### 3. Validação de Dados
```javascript
query('127.0.0.1:7777', (erro, resposta) => {
// Verificações de segurança
if (resposta.onlinePlayers > resposta.maxPlayers) {
console.log('Dados inconsistentes recebidos');
return;
}
// Validação de jogadores
resposta.players = resposta.players.filter(jogador => {
return jogador.name && jogador.score >= 0 && jogador.ping >= 0;
});
});
```## Considerações de Desempenho
### Otimizações Implementadas
1. **Cache DNS:**
- Reduz consultas DNS repetidas
- Cache com tempo de vida configurável
- Limpeza automática de cache2. **Gerenciamento de Conexões:**
- Reutilização de sockets quando possível
- Timeouts otimizados
- Sistema de retry inteligente3. **Processamento de Dados:**
- Parsing eficiente de pacotes
- Validação otimizada de dados
- Gerenciamento de memória eficiente4. **Medição de Latência:**
- Múltiplas amostras para precisão
- Filtro de valores atípicos
- Cálculo otimizado de médias## Limitações Técnicas
1. **Limitações de Protocolo:**
- Tamanho máximo de pacote: 2048 bytes
- Máximo de jogadores consultáveis: 100
- Timeout padrão: 1000ms2. **Limitações de Cache:**
- Tempo máximo de cache DNS: 5 minutos
- Limite de entradas no cache3. **Limitações de Rede:**
- Máximo de 3 tentativas por consulta
- Intervalo mínimo entre tentativas: 150ms
- Ping máximo válido: 800ms4. **Limitações de Dados:**
- Tamanho máximo de strings
- Número máximo de regras do servidor
- Limitações de caracteres especiais## Estrutura de Resposta
A API retorna um objeto detalhado com todas as informações do servidor:
```javascript
{
// Informações básicas
address: "127.0.0.1", // Endereço do servidor
port: 7777, // Porta do servidor
hostname: "Server", // Nome do servidor
gamemode: "RolePlay", // Modo de jogo
language: "Português - Brasil", // Idioma
// Status do servidor
password: false, // Proteção por senha
maxPlayers: 100, // Máximo de jogadores
onlinePlayers: 45, // Jogadores online
ping: 58, // Latência em ms
queryTime: 1635789012345, // Timestamp da consulta
// Lista de jogadores
players: [
{
id: 0, // ID do jogador
name: "Calasans", // Nome
score: 63, // Pontuação
ping: 117 // Ping do jogador
},
],
// Regras do servidor
rules: {
allowed_clients: "0.3.7, 0.3.DL", // Versões permitidas de clientes
artwork: 1, // Habilitação de artwork
lagcomp: "On", // Status do lag comp
mapname: "San Andreas", // Nome do mapa
version: "0.3.7", // Versão do servidor
weather: 10, // ID do clima
weburl: "website.com", // URL do site do servidor
worldtime: "12:00" // Hora do mundo no servidor
}
}
```## Comunidade SA-MP
- [SA-MP Programming Community](https://discord.com/invite/3fApZh66Tf)