Determine se um usuário é identificado no IRC
Pergunta
No meu BOT IRC, existem alguns comandos que eu quero ser utilizável por mim e quero verificar se qualquer pessoa que use meu nome seja identificada com o Nickserv (identificado). No entanto, não consegui encontrar uma maneira fácil de determinar isso, e é por isso que estou aqui.
Freenode e Rizon são as principais redes de destino, se isso importa.
EDIT: Eu estava realmente ciente dos vários Usermodes para usuários identificados (embora eu não tenha prestado atenção suficiente para perceber que eles diferem!); Desculpe por não mencionar isso antes. A resposta bruta que recebo de um usuário, no entanto, não inclui seus Usermodes; Parece algo assim:
:liam_neeson!n=pearson@71-9-55-124.dhcp.snlo.ca.charter.com PRIVMSG #erasmus-testing :foo
Suponho, então, que estou tentando encontrar uma maneira (com vários IRCDs, GRR) para obter essas bandeiras. Se, como alguém mencionou, Rizon retornará se alguém é ou não identificado em uma consulta Whois, esse é o tipo de coisa que estou procurando.
Solução
No FreeNode, enviando uma mensagem privada para o Nickserv com a mensagem ACC <nickname>
retornará um número que indica o status de identificação do usuário:
A resposta está na forma
<nickname> ACC <digit>
:0 - account or user does not exist 1 - account exists but user is not logged in 2 - user is not logged in but recognized (see ACCESS) 3 - user is logged in
o STATUS <nickname>
O comando fornece resultados semelhantes no Rizon:
A resposta tem esse formato:
<nickname> <digit>
0 - no such user online or nickname not registered 1 - user not recognized as nickname's owner 2 - user recognized as owner via access list only 3 - user recognized as owner via password identification
As vantagens que esse método tem sobre um whois:
- As informações sobre o status de identificação estão sempre incluídas. Com o WHOESS, você simplesmente não receberá uma linha dizendo algo como "identificado com o Nickserv como tal e such" se o usuário não for, de fato, identificado.
- Número consistente de linhas retornadas. Como quero pegar a mensagem antes de passar o controle para o restante do meu programa, posso ler facilmente uma linha fora do buffer (vejo problemas de sincronização no seu futuro!), Determine o status e continue como normal.
Outras dicas
Em algumas redes, você pode ativar um recurso chamado 'Identify-MSG'. No Freenode, você faz isso enviando "Cap Req Identify-MSG" e "Cap End" quando você se conecta ao servidor. O servidor responderá com uma resposta confirmando esse recurso. Posteriormente, todas as mensagens (e ações do CTCP) serão precedidas com um "+" (o usuário identificou com o Nickserv) ou um "-" (o usuário não se identificou com o Nickserv), por exemplo:
: liam_neesson! n=pearson@71-9-55-124.dhcp.snlo.ca.charter.com Privmsg #Erasmus-testing:+foo
O registro de Nick não faz parte do padrão IRC. É sempre oferecido por servidores IRC personalizados e/ou bots. Eu não acho que você encontrará uma solução verdadeiramente universal, mas o Nickserv é uma implementação comum disponível, que funcionaria em muitas redes. Wikipedia tem mais informações.
Você pode evitar o problema completamente e fazer com que seu usuário se registre no seu bot, em vez de com o Nickserv. Seu bot faria a verificação de senha e invalidaria as credenciais do usuário quando o usuário fizer o login. Esta seria uma solução universal.
À medida que seu nome de usuário é registrado, antes que seu bot faça login, você faz o comando:
/ns ghost username password
Este comando removerá qualquer usuário conectado ao seu usuário, lembre -se de que eu só usei isso no Freenode, não sei se ele funcionará em outro servidor.
Com o Freenode, se um usuário for identificado como Nickserv, então seu usuário tem o +conjunto de modo e. Não tenho certeza se Rizon tem algo semelhante.
Conjunto irrealircd e hybrd +r para usuários registrados, não tenho certeza se todos os servidores do IRC fazem isso, é bastante não padronizado. Também no Rizon, você pode quem pode e isso informará se o usuário está registrado.
/NickServ INFO <username>
Isso lhe dirá se o usuário está registrado ou não.
Eu descobri o comando através deste site: http://www.deepspace.org/nickserv.htm