IRC: Ponte de Sauerbraten e Discord


Imagina que legal utilizar o Discord para conversar com jogadores de um servidor de jogo em tempo real? É isso que conseguimos fazer com o servidor do Sauerbraten utilizando o IRC.

 O funcionamento é simples: Servidor <-> IRC <-> Discord. Para fazer a ponte entre o IRC e o Sauerbraten, nós precisamos de uma função do Remod (servermod que utilizamos), chamada "irc_ontext", claro que para isso antes é necessário configurar todo o "bot" do remod, e fazer com que ele se conecte em um canal de um servidor IRC (nesse caso o #cubebr no webchat.gamesurge.net), isso inclui adicionar um nome para ele ("Server"). Feito a conexão do bot ao IRC, e utilizando o evento "irc_ontext", o bot começará a "reescrever" tudo que acontecer no servidor ingame ao canal do IRC, (as mensagens no canal serão enviadas pelo bot, então ficará tipo <bot>: <usuário> texto).

Agora estamos conectados no IRC, e já podemos conversar com a galera do servidor sem precisar entrar nele, mas ainda não chegamos na parte do Discord.



Para conectar o Discord ao Sauerbraten, utilizaremos o IRC como ponte, e para isso vamos precisar de um Discord bot, o Discord-irc feito por reactiflux funciona muito bem. Instalando o bot e tudo necessário para rodá-lo, chegou a parte mais simples: Configurar o arquivo JSON do bot, para dizer a ele quais canais procurar (tanto discord como irc), ele terá o nome "Discord". Agora basta mandá-lo ficar de olho no canal #cubebr do servidor webchat.gamesurge.net, e reproduzir tudo que ver para o canal #Sauerbraten no discord, e vice-versa. E ai temos 2 bots trabalhando no irc, copiando e mandando mensagens das "casas" deles.

Mas e para enviar comandos pelo Discord que são executados no servidor do Sauerbraten? Ai está um problema, as mensagens que saem do Discord para o Sauerbraten chegam "sujas" (como é um bot copiando o outro, o IRC acaba copiando o nome do Discord, que por sua vez já havia copiado o nome do usuário, então ao chegar no Sauerbraten a mensagem será tipo <Discord> <usuário> <texto> (o nome do bot "Server" só não aparece pois estamos utilizando o evento irc_ontext, mas ele aparece quando a mensagem sai do Sauerbraten para o irc/ Discord, então basicamente "Discord" e "Server" são as sujeiras). Enviar os comandos nessas condições é impossível, tanto para executar comandos do IRC, quanto para executar comandos no Sauerbraten, então tivemos que bolar uma ideia, e isso inclui o uso de Cubescript!

A solução foi simples, mas chegar até ela que levou tempo (e alguns neurônios). Cubescript possui alguns comandos de strings, entre eles estão: strstr (procura por uma string, e retorna o numero de caracteres ate a primeira letra dela)  substr (copia apenas as letras a partir do numero de caracteres de inicio, e então salva até o numero de caracteres final). Para fazer os comandos funcionarem, primeiro temos que definir um prefixo ($), checar se a mensagem do usuário se inicia com aquele prefixo e tentar executar apenas a mensagem que vem após aquele prefixo. 

commandprefixo = "!"
pscommand = (strstr $arg2 (concatword "> " $commandprefixo)) //<playername> $commandprefixo
commandsy = (substr $arg2 (+ $pscommand 2) 1)

Como já sabemos que a "sujeira" que não queremos se inicia com < e termina com > (<nomedousuario>) e a mensagem vem após isso, utilizamos o strstr para verificar se o nosso prefixo existe após o caractere "> ", e usando substr, podemos salvar o numero de caracteres após "> " (que deve começar com $), se o valor corresponder (começa com $) então podemos tentar salvar o comando que vem após o prefixo ($comando, só queremos o "comando"), e para isso basta usar novamente o substr, dessa vez tendo o valor de inicio de caracteres, nós adicionaremos +1 (para pular uma letra, que no caso é o prefixo), e ai teremos apenas o comando de fato.

if (=s $commandsy $commandprefixo)[
commandstart = (strstr $arg2 $commandprefixo)
thecommand = (substr $arg2 (+ $commandstart 1) 100)
discordcommand $thecommand
][]

Agora é só "brincar" com esse resultado, criando um comando novo chamado "discordcommand", com alguns ifs que vão verificar se a string que é chamada após o comando existe na lista de comandos.

discordcommand = [
//SERVERHELP
if (=s $arg1 "serverhelp")[
ircsay ":blue_book: Commands: **$whois** | **$currentinfo** | **$scoreboard**"
]
]


Entre em nosso canal do Discord: CubeBR


Comentários

  1. Postei os scripts completos aqui: https://github.com/SalatielSauer/Sauerbraten-Content/tree/master/remod/scripts

    ResponderExcluir

Postar um comentário

O que achou dessa postagem? Deixe o seu comentário! :D

Cube BR - 2017/2018   [<>]
Todos os direitos são... não, aqui não tem direitos.