2012-10-14 1 views
3

내 자신의 IRC 서버를 코딩하려고합니다. IRC RFC를 참조하고 있지만 약간 혼란 스럽습니다. RFC를 엄격히 준수해야한다면 mIRC와 같이 인기있는 클라이언트가 내 서버에서 작동하지 않을 것이라고 생각합니다. 예를 들어, RFC는 서버가 다음 숫자 응답 중 하나의 성공적인 MODE 명령에 응답해야한다고 말합니다. RPL_BANLIST, RPL_CHANNELMODEIS, RPL_ENDOFBANLIST, RPL_UMODEIS. 이것은 내가 성공한 사용자 모드 변경에서 RFC가 명시 적으로 그렇게 보이지는 않지만 RPL_UMODEIS로 응답 할 것이라고 믿게합니다.IRC RFC 구현 : MODE에 응답하는 방법?

그러나 다른 오픈 소스 IRC 서버에 대한 소스 코드를 확인하면 'MODE'가 아닌 숫자 명령으로 응답하는 것을 볼 수 있습니다. 그것은 마치 보이는 MODE 명령을 에코합니다.

MODE 명령에 어떻게 응답해야합니까? 간단한 명령과 응답 차트가있는 더 좋은 형식의 RFC가 있습니까?

답변

5

RFC 1459는 유명하지 않습니다. 서버를 작성하는 데 필요한 모든 것을 알려주지는 않습니다.

이 경우 누락 된 부분은 기존 모드를 쿼리하는 MODE 명령과 새로운 모드를 설정하는 MODE 명령의 차이입니다. 모드 쿼리의 경우 클라이언트는 기존 모드를 나타내는 숫자 응답을받습니다. 모드를 변경하는 경우 오류가 발생하지 않는 한 클라이언트는 직접 숫자로 응답하지 않습니다. 그러나 모드 으로 변경되면 클라이언트는 변경 사실을 알리기 위해 서버에서 MODE을 수신합니다.클라이언트의 대화명이 foo하고있는 경우

그래서 예를 들어, 전송 :

MODE foo 

다음이 현재 사용자 모드를 조회 - 그것은 같은 RPL_UMODEIS 응답을 기대 :

:irc.example.org 221 foo :+i 

경우]를 클라이언트가 다음을 보냅니다.

MODE foo :+w 

다음이 변경됩니다. - S의 사용자 모드는이 ERR_USERSDONTMATCH 같은 숫자 오류 또는 모드 변경의 승인 얻을 것 중 하나이 확인이 MODE에 직접 응답이 기술적으로하지 않습니다

:[email protected] MODE foo :+w 

하는 것으로를 - 그것은 관련의 클라이언트를 알려주는 서버의 그 상태는 클라이언트 명령에 의해 트리거 된 상태로 변경됩니다.

채널 모드에서도 비슷한 상황이 발생합니다. 클라이언트와 현재 채널 모드 쿼리 경우

MODE #channel 

을 한 후 현재의 "간단한"채널 모드를 포함하는 RPL_CHANNELMODEIS 응답, 채널 생성 시간을주고 아마 RPL_CREATIONTIME 응답을 기대합니다. 그와 현재의 금지 목록을 조회하는 경우 :

MODE #channel b 

다음 RPL_ENDOFBANLIST 다음에 0 개 이상의 RPL_BANLIST 응답을 얻을 것이다. 대신 클라이언트가 채널 모드 변경하려고하면

:

MODE #channel :+k zounds 

을 한 후 직접 응답은 오류 응답 또는 아무것도 것 중 하나; 채널 모드가 실제로 변경된 경우 MODE 명령이 다시 표시되는 것을 볼 수 있습니다. 후자의 경우 성공한 MODE 명령도 채널의 다른 구성원에게 전송됩니다. 이는 실제로 처음 MODE 명령에 대한 직접 응답이 아니라 간접적 인 응답임을 보여줍니다.

1

사용자 모드 문자열입니다.

  • 대한 +/- B 모드 : RPL_BANLIST 및/또는 채널 모드에 대한 다음 RPL_ENDOFBANLIST
  • 금지 목록 : 일반적으로 반응은 사용 rmodes위한 RPL_CHANNELMODEIS
  • : RPL_UMODEIS

때때로 MODE 명령은 모드를 변경하지 않고 (옵션없이 + b와 같이) 모드를 나열하기 위해 실행됩니다. 이에 대한 응답으로, 적절한 숫자 코드가 무엇이든주고 모드를 다시 뱉어냅니다. RFC 2812 update to RFC 1459에있는 서버에서 기대할 수있는 것에 대한 정보가 더 있습니다.이 정보는 클라이언트에 더 중점을 둡니다.