Um pouco incomum, mas ei, por que não? :)
O objetivo: escreva um daemon IRC em funcionamento no seu idioma de escolha que forneça a funcionalidade de barebones, com o menor número possível de caracteres. Desde que atenda aos critérios abaixo, ele não precisa estar em total conformidade com os RFCs do IRC (isso tornaria o desafio significativamente menos divertido), ele só precisa trabalhar.
Requisitos:
- Os clientes devem poder conectar-se na porta 6667 e usá-la. Pelo menos o irssi e o XChat devem poder se conectar a ele com êxito com uma configuração padrão.
- Os usuários devem poder especificar seu próprio apelido, alterá-lo enquanto já estiver conectado, ingressar em canais, sair de canais e sair corretamente (ou seja,
QUIT
). - Os canais devem ser criados normalmente - ingressar em um canal sem usuários 'cria' ele. Eles não precisam ser persistentes.
- Os usuários devem poder enviar mensagens de canal e privadas (ou seja, para outros usuários).
- O
WHOIS
comando deve ser implementada, bem comoPING
/PONG
,LIST
eNAMES
(principalmente, a fim de manter os clientes felizes).
Restrições:
- Você não pode usar nenhuma biblioteca de terceiros (que inclui bibliotecas de E / S com eventos não principais). Somente bibliotecas padrão que acompanham a plataforma que você usa são permitidas.
- Se sua implementação incluir suporte explícito ao IRC na biblioteca padrão, você também não poderá usá-lo. A funcionalidade de rede da biblioteca padrão é, obviamente, boa.
- Seu envio deve poder ser executado de forma independente. Não ser inteligente com scripts mIRC :)
Modos, pontapés, etc. não precisam ser implementados (a menos que seja necessário para fazê-lo funcionar com os clientes acima). O SSL também não é necessário. Apenas a funcionalidade barebones acima, para manter o desafio curto e divertido.
Mais informações sobre o IRC é aqui , RFC são 1459 e 2812 (eu não posso ligar para eles diretamente devido a minha falta de reputação). O menor envio funcional e compatível com os requisitos vence!
Respostas:
C ++ (golfe parcialmente) 5655 (com CRLF contando por 1)
Isso é compilado no VS 2013 (usa auto, lambdas e winsock). Parecia estar funcionando antes de eu jogar o golfe, a menos que eu amassasse, ainda assim deveria estar ok. Uma das razões pelas quais é tão grande é que as respostas numéricas que estou retornando incluem o texto especificado na RFC - não sei se isso é necessário ou não. Testei-o com o KVirc porque ele é executado de forma portável (não é permitido instalar software no meu PC!) O KVirc parece funcionar com meu servidor, mas não conheço outros clientes - fiz o que achava que a RFC dizia, mas muito disso está subespecificado, então espero que eu entenda direito.
O servidor lida com DIE, KILL, NICK, USER, MODE, WHOIS, WHO, JOIN, PART, TOPIC, LIST, NAMES, PRIVMSG, USERS, PING, PONG e QUIT em vários graus. Para a maioria deles, retorno as respostas necessárias, incluindo a maioria das verificações necessárias para retornar as respostas de erro especificadas. Para alguns deles eu trapaceio:
Eu acho que é apenas parcialmente jogado, porque eu não sou muito bom em jogar golfe; se você vir algo grande, edite a resposta e corrija-a.
Aqui está a versão golfada
Aqui está a versão mais não destruída (ainda usa algumas macros):
fonte