[Tutorial] Implementaзгo Discord + SA:MP [Rank/Comandos/Informaзхes]
#1

Bom dia galera!

este tutorial ira trazer algo bacana, e muito legal para seus servidores, poderб interagir com um bot, criado de maneira simples, e que interage com seu servidor!

INTRODUЗГO:
aqui vocк ira aprender a fazer com que o bot do discord, de-em informaзхes simples como IP do servidor, site, quantos estгo online, e quem estб jogando... alem de muitas coisas!

NOTAS:
  • й necessбrio que vocк tenha o serviзo SSL instalado com ou sem certificado, para que o bot funcione!
    (nгo irei explicar aqui, por que cada distro tem modo de instalaзгo entгo procure por seu SO)
  • vocк tem que ser dono do servidor para convidar bot (ou ter um cargo elevado)
  • sempre busque o plugin mais atualizado para evitar falhas, e manter estabilidade
  • se forem mostrar para alguйm, me marque nos crйditos, eu ficarei muito feliz por isso!
  • se vocкs melhorarem o cуdigo, nгo guarde para si! coloque aqui para compartilhar seu conhecimento! ^^[/I]
Criando um bot:

Vocк precisarб criar um bot primeiro para saber o token de seu bot para o plugin.
Instalaзгo:

Configurando o seu bot:

na sua server cfg, coloque o token de seu bot deste modo, para que
Code:
discord_bot_token YOUR_BOT_TOKEN_HERE
Instale o Plugin Discord Connector:

Baixe a versгo mais atualizada: https://github.com/maddinat0r/samp-d...ector/releases
e extraia a pasta em seu servidor.

apуs isso configure a sua server.cfg para carregar o plugin deste modo:
Code:
plugins discord-connector
Instale o processador de comandos DDCMD:

Instale o DDCMD para que possa trabalhar facilmente com comandos no discord!
https://sampforum.blast.hk/showthread.php?tid=652258
https://github.com/RodrigoDornelles/...iscord-cmd.inc

em seu gamemode ficara assim:

Code:
new    DCC_COMMAND_PREFIX[]= {'!','+','/'}; //opcional se quiser personalizar seus prefixos! 

#include <discord-connector>			//livraria do bot no discord!
#include <discord-cmd>				//comandos discord
Colocando funcionalidades ao plugin:

Sicronizar chat:

PHP Code:
#define DC_CHATGLOBAL     "323103597942276096"    //chatid (clique com botao direito nele e copiar o id no discord)
static DCC_Channel:g_ChatGlobal;
forward DiscordMessage(DCC_Channel:channelDCC_User:author, const message[]);
hook OnGameModeInit()
{
    
g_ChatGlobal     DCC_FindChannelByIdDC_CHATGLOBAL);    //localisar seu chat pretendido
    
return Y_HOOKS_CONTINUE_RETURN_1;
}
hook OnPlayerText(playeridtext[])
{
    new 
message[200];
    
format(message200"**`%s`** [%d] -> *`%s`*"GetPlayerNameEx(playerid), playeridtext);//formate de acordo com seu gosto
    
DCC_SendChannelMessage(g_ChatGlobal,message);    //envia a menssagem do SA:MP no discord
    
return Y_HOOKS_CONTINUE_RETURN_1;
}
//DCC_OnChannelMessage(DCC_Channel:channel, DCC_User:author, const message[])  se nгo utilizar o DDCMD
public DiscordMessage(DCC_Channel:channelDCC_User:author, const message[])
{
    if(
IsDiscordBot(author)) 
        return 
1;    //nгo enviara mensagem de outros bots
    
if(g_ChatGlobal != channel)
        return 
1;    //caso a mensagem for fora do seu canal escolhido, nгo mostrara no servidor
    
new msg[512];
    
format(msgsizeof(msg), "[Discord] {00AAFF}%s{FFFFFF}: %s"GetNickDiscord(author), message);    //formate de acordo com seu gosto
    
SendClientMessageToAll(0xFFFFFFFFmsg);    //enviara mesnagem para todos os players
    
return 1;
}
stock IsDiscordBot(DCC_User:author)    //funзгo simplificada
{
    new 
bool:Isabot;
    
DCC_IsUserBot(authorIsabot);
    return 
Isabot;

Rank de jogadores:

PHP Code:
DDCMD:rank(DCC_Channel:channelDCC_User:useridparams[])//quando alguem der o comando !rank no discord chamara esta funзгo
{
    if(!
strcmp(params"pvp"true))
        return 
DCC_SendChannelMessage(channel,"exemplo");
    else if(!
strcmp(params"score"true))
    {
        
//consulta no banco de dados, para pegar 10 primeiros usuarios, com  maior score
        
mysql_function_query(mysql"SELECT `score`,`usuario` from `contas` order by `score` desc LIMIT 10"true"RankScore_D""d"channel);
        return 
1;
    }
    else if(!
strcmp(params"grana"true))
        return 
DCC_SendChannelMessage(channel,"exemplo");
    else if(!
strcmp(params"online",true))
        return 
DCC_SendChannelMessage(channel,"exemplo");
    
//parametros incompativeis
    
return DCC_SendChannelMessage(channel,"`utilize: /rank [pvp/online/grana/score]`");    //mostrara as suas oзхes de rank
}
forward RankScore_D(DCC_Channel:channel);
public     
RankScore_D(DCC_Channel:channel)//resultado da consulta
{
    new 
rows,fields;
    
cache_get_data(rows,fields);//captar numero de linhas e colunas    
    
    //str -> serб formataзгo da menssagem
    //temp-> formataзгo da linha antes de inserir na str
    //score-> valor obetido do player
    //nick-> nome do jogador
    //``` -> criara campo [code] no discord (design mais bonito)
    //PHP -> deixar uma cor legal no campo CODE
    
new str[1010]="```PHP",nick[MAX_PLAYER_NAME],temp[100], score;
    for(new 
0rowsi++)//looping para os 10 mais pontuados (caso nгo houver 10 contas mostrara a menos!)
    
{
        
cache_get_field_content(i"usuario"nick);    //receber nome do jogador
        
score cache_get_field_content_int(i"score");//receber o score
        // %c -> char 
        //0xD, 0xA -> char quebra linha 
        //I+1 -> a contagem comeзa do 0, entгo adiciona +1 para ser de numeraзгo 1° ao 10°
        //nick-> nome do jogador
        
format(tempsizeof(temp), "%c%c[%02d] %s"0xD0xAi+1nick);
        
strcat(strtemp);//colocara a linha formata na string str
        //conta o tamanho do nick
        
new ESPACO_RANK strlen(nick);//e -> espaзos
        //conforme tamanho do nick, sera adiciona X espaзos para que fique alinhado
        
for(new 0eo++)//o looping secundario
            
strcat(str" "); //adiciona espaзos
        //mostrar o score do jogador depois de alinhas os caracteres
        
format(tempsizeof(temp), "#SCORE: %d"score);
        
strcat(strtemp);//finalizaria aquela linha para repetir looping no proximo jogador
    
}
    
strcat(str"```");// fechara campo [code] apуs o looping acabar de todos os jogadores estarem no rank
    
DCC_SendChannelMessage(channel,"**`TOP 10 JOGADORES DE MAIOR SCORE:`**");//personalize de acordo sua preferencia
    
DCC_SendChannelMessage(channel,str);//mostrara resultado do TOP 10
    
return 1;

Informaзхes bбsicas:

PHP Code:
DDCMD:ip(DCC_Channel:channelDCC_User:useridparams[])//quando executarem o comando !ip
{
    
DCC_SendChannelMessage(channel,"**`IP do servidor:`** `52.xx.xxx.xxx:xxxx`");// mostrar mensagem do IP do jogador
    
return 1;
}
DDCMD:site(DCC_Channel:channelDCC_User:useridparams[])
{
    new 
str[200]="**`Site:`** https://www.brasilsaopaulo.com",temp[50];
    
//str -> serб formataзгo da menssagem 
    //temp-> formataзгo da linha antes de inserir na str 
    // %c -> char  
    //0xD, 0xA -> char quebra linha  
    
format(tempsizeof(temp), "%c%c**`Wiki:`** https://wiki.brasilsaopaulo.com%c%c",0xD0xA,0xD0xA);
    
strcat(strtemp);//junta linha formatada na string    
    
format(tempsizeof(temp), "**`Forum:`** https://forum.brasilsaopaulo.com%c%c",0xD0xA);
    
strcat(strtemp);
    
strcat(str"**`********:`** https://*******/bspserver");
    
DCC_SendChannelMessage(channel,str);//manda a mensagem que foi formata com varias linhas
    
return 1;


CREDITOS:
RazorG: Tutorial & Codigos
Xeon™: DDCMD
maddinat0r: DiscordConnector
Reply
#2

Уtimo!
Reply
#3

Уtimo para quem usa discord, Razor mandou bem pra caramba!
Reply
#4

Parabйns, bom tutorial.
Reply
#5

Gostei da forma que explicou e da organizaзгo do tуpico

bom tutorial
Reply
#6

Parabйns Razor!
Reply
#7

Sobre sincronizar o chat.. ok bacana, й um dos mйtodos para fazer isto mais eficientes, agora quanto aos ranks realmente decepcionante vocк trazer um processamento desnecessбrio para pawn, enquanto pode ser feito facilmente com quaisquer outra linguagem de forma externa, assim livrando seu servidor.
Reply
#8

Quote:
Originally Posted by Dayvison_
View Post
Sobre sincronizar o chat.. ok bacana, й um dos mйtodos para fazer isto mais eficientes, agora quanto aos ranks realmente decepcionante vocк trazer um processamento desnecessбrio para pawn, enquanto pode ser feito facilmente com quaisquer outra linguagem de forma externa, assim livrando seu servidor.
tгo ruim assim? o servidor processa o rank rapidamente, delay imperceptнvel para quem efetuou o comando, alem do mais ele nгo й chamado com frequкncia, assim o impacto na jogabilidade й nulo, nгo vi problema nisso! ^^


Quote:

todo caso й aqui й sу um tutorial, nenhum dos meus exemplos estб 100% ao meu servidor, tem mais features, e proteзхes! cabe ao usuбrio saber o que precisa

Reply
#9

Muito bom, parabйns.
Reply
#10

Muito interessante seu tutorial. Uma йpoca pensei em realizar isto, mas nгo com comandos. Parabйns!
Reply
#11

Muito bom.
Reply
#12

Quote:
Originally Posted by Dayvison_
View Post
aos ranks realmente decepcionante vocк trazer um processamento desnecessбrio para pawn, enquanto pode ser feito facilmente com quaisquer outra linguagem de forma externa, assim livrando seu servidor.
Acho meio difнcil haver alguma espйcie de delay que possa interferir na jogabilidade. Se vocк observar bem, estб apenas fazendo uma consulta MySQL que retorna os scores de forma decrescente nгo hб nenhum processamento puramente PAWN, sу MySQL.
Reply
#13

Bom ver que depois de tanto tempo ainda a board estб ativa com projetos bacanas.

Parabens
Reply
#14

Bom tutorial.

Recomendo atualizar para MySQL R40+.
Reply


Forum Jump:


Users browsing this thread: 4 Guest(s)