치춘짱베리굿나이스
[Rank 5] ft_irc - 만들어야 하는 명령어 정리 본문
만들어야 하는 명령어
이건 우리 팀 (특징: 최대한 쪼끄맣게 만듦) 이 만들면서 아 이건 추가해야겠다 느낀 거고
팀마다 다를 수 있음
서버 실행
./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