치춘짱베리굿나이스

[Rank 5] ft_irc - 만들어야 하는 명령어 정리 본문

42/42s Cursus

[Rank 5] ft_irc - 만들어야 하는 명령어 정리

치춘 2023. 1. 7. 12:05

만들어야 하는 명령어

이건 우리 팀 (특징: 최대한 쪼끄맣게 만듦) 이 만들면서 아 이건 추가해야겠다 느낀 거고

팀마다 다를 수 있음

서버 실행

./ircserv <포트번호> <비밀번호>
  • 포트번호를 입력하면 해당 포트에 서버가 열려야 한다 (localhost:포트번호)
  • 비밀번호는 클라이언트 측에서 연결 시도할 때 입력할 수 있어야 한다
    • 서버 실행 시에 입력한 번호와 클라이언트 연결 시에 입력한 번호 (PASS 참고) 가 다를 경우 접속 불가
  • 포트번호와 비밀번호는 서버 실행 시에 인자로 받아서 인스턴스에 저장

최초 접속 시 인증

PASS

PASS <비밀번호>
  • 서버의 비밀번호를 전송한다
  • PASS 명령은 반드시 맨 처음에 들어와야 하며, 비밀번호가 맞지 않으면 (검증에 실패하면) 이후의 명령들은 모두 무시된다
  • NICK, USER보다도 먼저 들어와서 검증이 마쳐져야 한다

NICK

NICK <닉네임>
  • 한 서버 안에서 닉네임은 겹칠 수 없다
  • 닉네임이 겹치지 않는 한, 마음대로 설정 가능하다
  • 서버 내에서 사용자를 구분하는 역할을 하는 실질적인 이름이다

 

  nickname   =  ( letter / special ) *8( letter / digit / special / "-" )
  letter     =  %x41-5A / %x61-7A       ; A-Z / a-z
  digit      =  %x30-39                 ; 0-9
  special    =  %x5B-60 / %x7B-7D
                   ; "[", "]", "\", "`", "_", "^", "{", "|", "}"
  • 닉네임 규칙은 다음과 같다
    • 영어, (허용되는) 특수문자로 시작해야 한다
    • 최대 9글자의 영어, 특수문자, 숫자 사용 가능하다
    • 특수문자라 함은, [, ], \, ```, _, ^, {, |, } 만 가능하다

USER

USER <유저명> <호스트명> <서버명> :<PC 유저명 (실명)>
  • 한 서버 안에서 유저명은 겹칠 수 있다
  • 클라이언트가 맘대로 수정할 수 없다
  • RFC 1459에서는 USER <username> <hostname> <servername> <realname>
  • RFC 2812에서는 USER <user> <mode> <unused> <realname>
  • irssi는 RFC 1459 기준으로 전송하고, 서버 접속할 때 알아서 보내준다

서버 관련 기능

QUIT

QUIT :<메시지>
  • 서버와의 연결을 해제한다
  • 답장 형식은 존재하지 않는다 (연결을 바로 끊어버리므로)
    • 서버에서는 오류를 발생시킴으로써 이 커맨드에 답장한다
    • ERROR :Closing Link: <호스트명> (Quit: <메시지>)
  • 인자로 연결 끊을 때 보내고 싶은 메시지를 입력해 넣을 수 있으며, 이는 같은 채널에 존재하는 모든 유저들에게 전송된다 (브로드캐스팅)
  • 유저가 속해 있는 모든 채널에서 유저 정보를 삭제해야 하고, 다른 유저들에게 알림을 보내야 한다

JOIN

JOIN <채널명>
  • 원래는 JOIN에 비밀번호 (key) 설정 기능도 있는데 굳이? 안 만들어도 될 것 같다
  • 인자로 받은 채널명에 해당하는 채널이 존재하지 않을 경우, 새로 생성하고 JOIN 한다
    • 이때 최초로 JOIN 한 사람은 채널 관리자 (operator) 가 된다
  • 채널명은 무조건 맨 앞 글자가 &, #, +, ! 중 하나여야 하고, 공백 문자나 ^G (Ascii 7) 가 들어올 수 없다
    • 또한 대소문자를 구분하지 않는다

채널 관련 기능

TOPIC (op)

TOPIC <채널명> :<주제>
  • 채널 주제를 설정할 수 있다
  • operator만 가능하게끔 해도 될 듯
  • 주제 인자가 없거나, 이 명령을 보낸 사람이 operator가 아니거나, 해당 채널에 소속되지 않았을 경우 오류를 뱉는다

KICK (op)

KICK <채널명> <닉네임> :<메시지>
  • 유저를 내쫒을 수 있다
  • operator만 가능하다
  • 메시지는 이 유저를 쫒아낼 때 채널 전체에 broadcasting 되는 메시지
  • 유저가 존재하지 않거나, 채널이 존재하지 않거나, 이 명령을 보낸 사람이 operator가 아니거나, 해당 채널에 소속되지 않았을 경우 오류를 뱉는다
  • KICK당한 유저는 그 뒤에 전송되는 모든 메시지를 받을 수 없으나, 영구 차단이 아니기 때문에 재접속은 가능하다

PART

PART <channel> :<Message>
  • 채널에서 나갈 수 있다
  • 메시지는 내가 나갈 때 채널 전체에 broadcasting 되는 메시지
  • 이 채널 소속이 아닐 경우 오류를 뱉는다
  • QUIT이랑 다른 점은, QUIT은 아예 종료 (모든 채널에서 나감) 이고 PART는 현재 채널에서만 나가는 명령어라는 것

MODE (op)

MODE <닉네임> <+o | -o>
  • 유저의 모드를 변경할 수 있다
  • operator만 가능하다
  • 유저 숨기기, 자리 비움 등의 기능도 있으나 해당 과제에서는 구현할 필요가 없으므로 관리자 권한 부여 및 회수 용도로만 사용한다
  • 관리자 권한 부여 / 회수는 관리자만 가능하므로, operator만 가능하게끔 제약을 둔다
  • 관리자가 아니거나 존재하지 않는 권한 플래그일 경우, 또는 이미 operator인 사람을 다시 operator로 만들거나 operator가 아닌 사람의 권한을 회수할 경우 오류를 뱉는다

NAMES

NAMES <채널>
  • 채널에 참여중인 모든 유저의 닉네임을 보내준다
  • 유저의 visible 옵션에 따라 보여지는 유저가 달라질 수 있지만 해당 기능을 구현하지 않으므로 구분 없이 다 출력하면 된다
  • 접속중인 채널이 없을 경우 오류를 뱉는다

PRIVMSG

PRIVMSG <닉네임 또는 채널명> :<메시지 본문>
  • 메시지를 채널 전체 또는 특정 유저에게 보낼 수 있다
  • 채널명에 규칙이 정해져 있으므로 (&, #, +, ! 중 하나로 시작하며, 이 문자들은 유저명에 사용 불가능) 해당 문자로 시작할 경우 채널로 판단, 아니면 닉네임으로 판단하면 된다
  • 메시지 본문부터는 공백이 들어갈 수 있다 (파싱할 때 주의)
    • 세미콜론 기준으로 뒤에 오는 문자열을 한번에 받으면 된다
  • 보낸 유저가 채널에 없거나, 받을 유저가 서버에 접속하지 않았을 경우 오류를 뱉는다

그외

WHO

    WHO <마스크> <o>
  • 답장으로 마스크에 해당하는 유저 목록 리스트를 보내준다
  • o 플래그를 켜면, operator 유저만 보여준다
  • 마스크는 * 등의 특수문자를 사용할 수 있으며, 만약 마스크가 chic* 이라면 chichoon, chic2 등 대응되는 닉네임에 해당하는 유저 리스트를 보내주는 식이다
  • 구현 안 해도 동작에 크게 이상은 없지만 서버 연결이 끊기는 버그의 주범인 것 같아서 일단 구현했다
    • 사실 버그의 주범은 따로 있었음

PING

PING <수신받을 서버명>
  • 서버와의 연결을 유지하고 싶을 때 사용한다
  • PING 을 날리면 PONG이 돌아옴으로써 연결이 유지되었음을 알 수 있다
  • 만약 특정 시간 안에 PONG이 오지 않을 경우, 서버 연결이 끊어졌다고 판단하고 연결을 닫는//다

PONG

PONG <송신한 서버명>
  • PING에 대한 답장으로 사용한다
  • PING의 답장은 무조건 PONG이어야 하며, 인자로 송신한 서버 이름을 붙인다
  • 원래는 수신받을 서버 이름도 2번째 인자로 넣어주어야 하지만, 서버간의 통신은 구현하지 않아도 되기 때문에 이번 과제에서는 필요 없다

만들지 않아도 될 것 같은 기능?

CAP LS

CAP LS
  • 서버의 Capability (가용량?) 를 체크하는 명령
  • irssi가 주기적으로? 보내긴 하지만 DALnet에서는 답장을 따로 보내지 않는 것 같다
  • 무시해도 될 듯하지만 서버 접속이 안 되는 버그가 있어서 혹시 몰라 추가했다 (사실 이유는 다른 거였음)

RFC 문서

클라이언트

서버

'42 > 42s Cursus' 카테고리의 다른 글

[Rank 5] ft_containers - explicit 키워드  (0) 2023.01.13
[Rank 5] ft_containers - std::iterator_traits  (0) 2023.01.11
[Rank 5] ft_irc (작성중)  (0) 2023.01.07
[Rank 5] inception - Docker-compose  (0) 2022.10.26
[Rank 5] inception - Dockerfile  (3) 2022.10.14
Comments