Open nicknamemohaji opened 2 months ago
sabyun : 채널관련 명령어 somilee : 운영자, 메시지, 기타 관련 명령어 저희는 일단 이번주는 공부해보고 완성 예정일을 정해보도록 하겠습니다.
JOIN
커맨드 (i
플래그만 검사하는 시나리오)
i
플래그가 꺼져 있으면
i
플래그가 켜져 있으면 _invites
확인_invites
에 사용자가 있으면
_invites
에서 사용자 제거 -> 종료_invites
에 사용자가 없으면 -> 473 에러 -> 종료PRIVMSG
커맨드
:(nickname) PRIVMSG #(channel) :(msg)
전달 -> 종료:(nickname) PRIVMSG :(msg)
전달 -> 종료COMMAND
또는 ACTION
폴더 생성CLIENT_ACTION_JOIN.CPP
시나리오 작성
시나리오 브리핑 및 조정
작업 시작
std::vector<std::vector<string> >
으로 반환<명령어>:<데이터>
형식으로 정의class IRCServer; action 시 여러 커멘드 입력시 예) /join a,b,c,d a,b,d,d 비번은 a,b,c,d임 일때 a,b,d채널은 접속되고 c만 오류를 내뱉어야 하는 상황에서 중간에 오류를 쓰로우하면 더이상 진행이 안되는 문제가 생김.
채널에 접속시 채널에 있는 모든 유저에게 유저가 접속했다는 메시지를 전송해야함. 채널에 있는 리스트를 가지고 유저의 fd값을 가져와야 해서 IRCClient* GetClient(const std::string& user_name); 메소드를 서버클래스에 추가함.
채널에 접속시 채널에 있는 모든 유저에게 유저가 접속했다는 메시지를 전송해야함. 채널에 있는 리스트를 가지고 유저의 fd값을 가져와야 해서 IRCClient* GetClient(const std::string& user_name); 메소드를 서버클래스에 추가함.
server _clients 의 맵에 클라이언트들이 추가가 안되는듯? 클라이언트에게 메시지를 전송할수 없음! @nicknamemohaji
중간에 오류를 쓰로우하면 더이상 진행이 안되는 문제가 생김.
아.. JOIN에서 여러 개의 채널에 동시에 들어갈 수 있다는걸 몰랐습니다. ActionJOIN 안에서 try-catch를 이용하다 마지막 파라미터에서 오류가 발생하면 그 때는 다시 throw해주면 되지 않을까 싶습니다.
IRCClient* GetClient(const std::string& user_name); 메소드를 서버클래스에 추가함.
명령어 처리 함수들이 서버 콘텍스트 안에서 실행되면 std::find(_clients, nickname) 같은 방식으로 클라이언트 객체를 얻어올 수 있습니다. 여기서 닉네임 못 찾으면 401 에러 던지면 되겠네요
_clients 의 맵에 클라이언트들이 추가가 안되는듯
닉네임 중복체크 후에 맵에 추가하는 코드를 작성하던 중에 일정이 생겨버렸습니다. 죄송합니다. 월요일에 시간 나면 수정해서 올리겠습니다
서브젝트 내용
IO 멀티플렉싱
kqueue
등의 멀티플렉싱 방식 사용IRC 서버 구현
CAP
PASS
NICK
,USER
MOTD
PING
,PONG
QUIT
ERROR
IRC 채널 구현
JOIN
NAMES
PART
TOPIC
INVITE
KICK
MODE
PRIVMSG
NOTICE
LIST
보너스 구현
모듈 기획
TCPMultiplexer::WaitEvent
->IRCClient::Recv
: 커널 버퍼가 빌 때 까지IRCClient
의 버퍼에 계속 읽음TCPMultiplexer::WaitEvent
->IRCServer::ReadEvent
IRCServer::ReadEvent
->IRCServer::RequestParser
: 메시지의 tag, source, command, params를 파싱IRCServer::RequestParser
->IRCServer::Context(context)
->IRCChannel::Context(context)
->IRCClient::Context(context)
: 파싱한 command에 맞는 메소드 호출IRCServer::DoAction
->IRCServer::CreateResponse
->IRCClient::Send
: 작업이 끝난 후 응답 반환ex.
:dan!d@localhost PRIVMSG #chan HEY!
: IRCServer::SelectChannel -> IRCChannel::BroadCast -> (각각의 클라이언트에서) IRCClient::PrivMsgJOIN #foobar
: IRCServer::CreateChannel -> IRCChannel::Join -> IRCClient::Join