Skip to content

Latest commit

Β 

History

History
431 lines (324 loc) Β· 19 KB

File metadata and controls

431 lines (324 loc) Β· 19 KB

ft_irc

Pipeline

κΈ°λ³Έ μ—°κ²° 흐름

  1. ν΄λΌμ΄μ–ΈνŠΈλŠ” IRC μ„œλ²„μ™€ 6667(κΈ°λ³Έ) λ˜λŠ” μ§€μ •λœ 포트둜 TCP 연결을 μ„€μ •ν•©λ‹ˆλ‹€.
  2. ν΄λΌμ΄μ–ΈνŠΈλŠ” NICK λͺ…령을 보내 λ‹‰λ„€μž„μ„ μ„€μ •ν•©λ‹ˆλ‹€.
  3. ν΄λΌμ΄μ–ΈνŠΈλŠ” USER λͺ…령을 보내 μ‚¬μš©μž 정보 (μ‚¬μš©μž 이름, 호슀트 이름, μ„œλ²„ 이름, μ‹€μ œ 이름)λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  4. μ„œλ²„λŠ” μ—°κ²°μ˜ 성곡 λ˜λŠ” μ‹€νŒ¨λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 일련의 숫자 μ½”λ“œλ‘œ μ‘λ‹΅ν•©λ‹ˆλ‹€.
  5. 연결이 μ„€μ •λ˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈλŠ” JOIN λͺ…령을 μ‚¬μš©ν•˜μ—¬ 채널에 μ°Έμ—¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  6. μ„œλ²„λŠ” MOTD λ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 보내 μ„œλ²„μ— λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  7. ν΄λΌμ΄μ–ΈνŠΈλŠ” μ—¬λŸ¬ λͺ…령을 μ‚¬μš©ν•˜μ—¬ μ±„λ„μ—μ„œ λŒ€ν™”λ₯Ό λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ…λ Ήμ–΄

일단 레퍼런슀 κΈμ–΄μ˜¨κ±°λΌ μ–Όλ§ˆλ‚˜ κ΅¬ν˜„ν• μ§€λŠ” 결정해야함.

λͺ¨λ“  λͺ…λ Ήμ–΄λŠ” λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•Šκ³  /r/n으둜 λλ‚©λ‹ˆλ‹€.

message		::= ['@' <tags> SPACE] [':' <source> SPACE] <command> <parameters> <crlf>
SPACE		::=  %x20 *( %x20 )   ; space character(s)
command		::=  letter* / 3digit
crlf		::=  %x0D %x0A        ; "carriage return" "linefeed"
parameter	::=  *( SPACE middle ) [ SPACE ":" trailing ]
nospcrlfcl	::=  <sequence of any characters except NUL, CR, LF, colon (`:`) and SPACE>
middle		::=  nospcrlfcl *( ":" / nospcrlfcl )
trailing	::=  *( ":" / " " / nospcrlfcl )
mask		=  *( nowild / noesc wildone / noesc wildmany )
wildone		=  %x3F
wildmany	=  %x2A
nowild		=  %x01-29 / %x2B-3E / %x40-FF ; any octet except NUL, "*", "?"
noesc		=  %x01-5B / %x5D-FF ; any octet except NUL and "\"
matchone	=  %x01-FF ; matches wildone
matchmany	=  *matchone ; matches wildmany
  • νƒœκ·Έ : (@, 0x40) 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€μ˜ 선택적 λ©”νƒ€λ°μ΄ν„°μž…λ‹ˆλ‹€.
  • source : (:, 0x3A) 둜 μ‹œμž‘ν•˜λŠ” λ©”μ‹œμ§€μ˜ μΆœμ²˜μ— λŒ€ν•œ 선택적 λ©”λͺ¨μž…λ‹ˆλ‹€.
  • command : 이 λ©”μ‹œμ§€κ°€ λ‚˜νƒ€λ‚΄λŠ” νŠΉμ • λͺ…λ Ήμž…λ‹ˆλ‹€.
  • λ§€κ°œλ³€μˆ˜ : μ‘΄μž¬ν•˜λŠ” 경우 이 νŠΉμ • λͺ…λ Ήκ³Ό κ΄€λ ¨λœ λ°μ΄ν„°μž…λ‹ˆλ‹€.

μ΄λŸ¬ν•œ λ©”μ‹œμ§€ λΆ€λΆ„κ³Ό λ§€κ°œλ³€μˆ˜ μžμ²΄λŠ” ν•˜λ‚˜ μ΄μƒμ˜ ASCII SPACE 문자둜 κ΅¬λΆ„λ©λ‹ˆλ‹€ ( , 0x20).

πŸ’‘ numeric reply: μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ»€λ©˜λ“œλ‚˜ operation의 결과에 κ΄€ν•΄ μ „λ‹¬ν•˜λŠ” standardized messages

(1) connection registration

  • IRC μ„œλ²„μ— 연결을 λ“±λ‘ν•˜κΈ° μœ„ν•΄ μ‚¬μš©

PASS: μ„œλ²„μ— μ—°κ²°ν•˜κΈ° μœ„ν•œ λΉ„λ²ˆ μ„€μ •

  • ꡬ성
    • λΉ„λ²ˆμ€ connection을 λ“±λ‘ν•˜κΈ° μœ„ν•œ μ–΄λŠ μ‹œλ„ 이전, λ°˜λ“œμ‹œ μ„€μ •λ˜μ–΄μ•Ό ν•œλ‹€
      • 즉, ν΄λΌμ΄μ–ΈνŠΈλŠ” NICK/USER μ»€λ©˜λ“œ 이전에 μ„œλ²„ λΉ„λ²ˆμ„ 적어야 ν•˜κ³ , μ„œλ²„λŠ” μ–΄λ–€ SERVER μ»€λ©˜λ“œλ³΄λ‹€ λ¨Όμ € PASS μ»€λ©˜λ“œλ₯Ό 보내야 ν•œλ‹€
    • It is possible to send multiple PASS commands before registering but only the last one sent is used for verification and it may not be changed once registered.
PASS λŒ€μΆ©λΉ„λ²ˆ
  • numeric replies
    • ERR_NEEDMOREPARAMSΒ - Not enough parameters
    • ERR_ALREADYREGISTREDΒ - Already registered
    • ERR_PASSWDMISMATCHΒ - Password incorrect

NICK: ν΄λΌμ΄μ–ΈνŠΈκ°€ nickname μ„€μ •

  • ꡬ성
    • hopcountλŠ” μ„œλ²„μ— μ˜ν•΄μ„œλ§Œ μ‚¬μš©, κ·Έ 별λͺ…이 ν™ˆ μ„œλ²„μ—μ„œ μ–Όλ§ˆλ‚˜ 멀리 μžˆλŠ”μ§€ μ•Œλ €μ£ΌκΈ° μœ„ν•΄ μ‚¬μš©(μ‚¬μš©ν•  일 μ—†μŒ)
NICK λŒ€μΆ©λ³„λͺ… [ <hopcount> ]

:WiZ NICK Kilroy                ; WiZ changed his nickname to Kilroy.
  • numeric replies
    • ERR_NONICKNAMEGIVENΒ - No nickname given
    • ERR_ERRONEUSNICKNAMEΒ - Erroneous nickname
    • ERR_NICKNAMEINUSEΒ - Nickname in use
    • ERR_NICKCOLLISIONΒ - Nickname collision KILL(λ™μ‹œμ— 같은 λ‹‰λ„€μž„μ„ μ‚¬μš©ν•˜λŠ” μ‚¬μš©μžκ°€ μžˆμ„ λ•Œ λ°œμƒ)

USER: μƒˆλ‘œμš΄ ν΄λΌμ΄μ–ΈνŠΈμ˜ username, hostname, servername, realname μ„€μ •

  • ꡬ성
    • USER와 NICK μ»€λ§¨λ“œκ°€ μ„œλ²„μ— μ „λ‹¬λ˜μ–΄μ•Όμ§€ IRC μ„œλ²„μ— ν΄λΌμ΄μ–ΈνŠΈκ°€ λ“±λ‘λœλ‹€
    • realname νŒŒλΌλ―Έν„°λŠ” space(’ β€˜) character듀을 포함할 수 있고 이λ₯Ό μœ„ν•΄(ν•˜λ‚˜μ˜ νŒŒλΌλ―Έν„°λ‘œ μΈμ‹μ‹œν‚€κΈ° μœ„ν•΄) 콜둠(’:’)이 μ„ ν–‰λ˜μ–΄μ•Ό ν•œλ‹€
USER <username> <hostname> <servername> <realname>
  • numeric replies
    • ERR_NEEDMOREPARAMSΒ - Not enough parameters
    • ERR_ALREADYREGISTREDΒ - Already registered

OPER: 일반 μœ μ €κ°€ OP의 κΆŒν•œμ„ μ–»μŒ

  • ꡬ성
    • λ§Œμ•½ OPER μ»€λ©˜λ“œλ₯Ό μ‚¬μš©ν•œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ˜¬λ°”λ₯Έ λΉ„λ²ˆμ„ μ‚¬μš©ν–ˆλ‹€λ©΄, μ„œλ²„λŠ” λ‚˜λ¨Έμ§€ λ„€νŠΈμ›Œν¬μ— ν΄λΌμ΄μ–ΈνŠΈλ“€μ˜ nickname을 μœ„ν•œ β€œMODE +o”λ₯Ό λ°œκΈ‰ν•¨μœΌλ‘œμ¨ μ•Œλ¦°λ‹€
OPER μœ μ € λΉ„λ²ˆ
  • numeric replies
    • ERR_NEEDMOREPARAMSΒ - Not enough parameters
    • ERR_NOOPERHOSTΒ - Not vaild for your host
    • ERR_PASSWDMISMATCHΒ - Password incorrect
    • RPL_YOUREOPERΒ - You are now an IRC operator

QUIT: ν΄λΌμ΄μ–ΈνŠΈ μ„Έμ…˜μ„ μ’…λ£Œ(μ„œλ²„μ—μ„œ λ‚˜κ°)

  • ꡬ성
    • μ’…λ£Œ λ©”μ‹œμ§€λ₯Ό μž…λ ₯ν•˜λ©΄, κΈ°λ³Έ λ©”μ‹œμ§€μΈ ν΄λΌμ΄μ–ΈνŠΈμ˜ nickname이 μ•„λ‹Œ λ©”μ‹œμ§€κ°€ 좜λ ₯
    • λ§Œμ•½ λ‹€λ₯Έ 이유둜 인해 ν΄λΌμ΄μ–ΈνŠΈ 연결이 ν΄λΌμ΄μ–ΈνŠΈκ°€ QUIT λͺ…령을 내리지 μ•Šκ³  μ’…λ£Œλœ 경우(예: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ£½κ³  μ†ŒμΌ“μ—μ„œ EOF λ°œμƒ), μ„œλ²„λŠ” μ’…λ£Œ λ©”μ‹œμ§€λ₯Ό λ°œμƒμ‹œν‚¨ 이벀트의 성격을 λ°˜μ˜ν•˜λŠ” μ–΄λ–€ μ’…λ₯˜μ˜ λ©”μ‹œμ§€λ‘œ μ±„μ›Œμ•Ό ν•œλ‹€
    • 콜둠이 μ„ ν–‰λœλ‹€λ©΄, μ΄ν›„μ˜ μ’…λ£Œ λ©”μ‹œμ§€λŠ” 곡백(’ β€˜)을 ν¬ν•¨ν•˜λŠ” κ²ƒμœΌλ‘œ κ°„μ£Όν•΄μ•Ό ν•œ
 QUIT μ’…λ£Œ λ©”μ‹œμ§€(선택적)

 QUIT :Gone to have lunch
  • numeric replies
    • μ—†μŒ

(2) channel operations

JOIN: ν΄λΌμ΄μ–ΈνŠΈκ°€ νŠΉμ • 채널에 μ°Έμ—¬

  • ꡬ성
    • μ•„λž˜μ™€ 같은 쑰건이 μΆ©μ‘±λ˜μ–΄μ•Ό 채널에 μ°Έμ—¬ν•  수 μžˆλ‹€
      • 채널이 invite-only라면 ν΄λΌμ΄μ–ΈνŠΈλŠ” λ°˜λ“œμ‹œ μ΄ˆλŒ€λ°›μ•„μ•Ό ν•œλ‹€
      • ν΄λΌμ΄μ–ΈνŠΈμ˜ nickname, username, hostname이 active ban에 ν•΄λ‹Ήλ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€
      • key(λΉ„λ²ˆ)이 μ„€μ •λ˜μ—ˆλ‹€λ©΄, μ˜¬λ°”λ₯Έ key(λΉ„λ²ˆ)이 μ£Όμ–΄μ Έμ•Ό ν•œλ‹€
    • ν΄λΌμ΄μ–ΈνŠΈκ°€ 채널에 μ°Έμ—¬ν•œ ν›„μ—λŠ”, 그듀은 채널에 영ν–₯을 μ£ΌλŠ” λͺ¨λ“  μ»€λ©˜λ“œμ— λŒ€ν•œ μ•Œλ¦Όμ„ λ°›λŠ”λ‹€
      • 이 것은 MODE, KICK, PART, QUIT and of course PRIVMSG/NOTICE 을 ν¬ν•¨ν•œλ‹€
    • λ§Œμ•½ JOIN μ»€λ©˜λ“œκ°€ μ„±κ³΅μ μœΌλ‘œ μ‹€ν–‰λ˜μ—ˆλ‹€λ©΄, ν΄λΌμ΄μ–ΈνŠΈλŠ” κ·Έ λ‹€
JOIN <channel>{,<channel>} [<key>{,<key>}]

JOIN #foobar
JOIN &foo fubar
JOIN #foo,#bar fubar,foobar

:Wiz JOIN #Twilight_zone ;JOIN message from WiZ
  • numeric replies
    • ERR_NEEDMOREPARAMS (461): not enough parameter
    • ERR_BADCHANMASK (476): ν΄λΌμ΄μ–ΈνŠΈκ°€ 잘λͺ»λœ 채널 마슀크λ₯Ό μ‚¬μš©ν•˜μ—¬ 채널에 μ°Έμ—¬ν•˜λ €κ³  μ‹œλ„ν•  λ•Œ λ°œμƒ
      • 채널 λ§ˆμŠ€ν¬λŠ” 채널 이름을 μ§€μ •ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ꡬ문을 μ˜λ―Έν•˜λ©°, ν˜•μ‹μ΄ 잘λͺ»λ˜κ±°λ‚˜ μœ νš¨ν•˜μ§€ μ•Šμ€ 경우
    • ERR_INVITEONLYCHAN (473): ν΄λΌμ΄μ–ΈνŠΈκ°€ μ°Έμ—¬ν•˜λ €λŠ” 채널이 μ΄ˆλŒ€ μ „μš©μž„μ„ λ‚˜νƒ€λ‚΄λŠ” 응닡
      • 이 λͺ¨λ“œλ₯Ό κ°–λŠ” 채널은 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ΄ˆλŒ€λ₯Ό λ°›κΈ° μ „μ—λŠ” μ°Έμ—¬ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
    • ERR_BANNEDFROMCHAN (474): ν΄λΌμ΄μ–ΈνŠΈκ°€ μ§€μ •λœ 채널 μ°Έμ—¬λ₯Ό κΈˆμ§€λ‹Ήν–ˆμŒμ„ λ‚˜νƒ€λ‚΄λŠ” 응닡
      • ν΄λΌμ΄μ–ΈνŠΈκ°€ κΈˆμ§€λ˜λ©΄ 채널에 μ°Έμ—¬ν•  수 μ—†μœΌλ©°, μ„œλ²„κ°€ 이 였λ₯˜ λ©”μ‹œμ§€λ₯Ό λ³΄λƒ…λ‹ˆλ‹€.
    • ERR_BADCHANNELKEY (475): ν΄λΌμ΄μ–ΈνŠΈκ°€ ν‚€κ°€ μ„€μ •λœ 채널에 μ°Έμ—¬ν•˜λ €κ³  ν•  λ•Œ 잘λͺ»λœ λ˜λŠ” μœ νš¨ν•˜μ§€ μ•Šμ€ 채널 ν‚€λ₯Ό μ œκ³΅ν•œ 경우 λ°œμƒν•˜λŠ” 응닡
    • ERR_CHANNELISFULL (471): ν΄λΌμ΄μ–ΈνŠΈκ°€ μ°Έμ—¬ν•˜λ €λŠ” 채널이 이미 μ΅œλŒ€ μš©λŸ‰μ— λ„λ‹¬ν•˜μ—¬ μΆ”κ°€ μ‚¬μš©μžλ₯Ό μˆ˜μš©ν•  수 μ—†μŒμ„ λ‚˜νƒ€λ‚΄λŠ” 응닡
    • ERR_NOSUCHCHANNEL (403): μ§€μ •λœ 채널이 μ„œλ²„μ— μ‘΄μž¬ν•˜μ§€ μ•ŠμŒμ„ λ‚˜νƒ€λ‚΄λŠ” 응닡
      • ν΄λΌμ΄μ–ΈνŠΈκ°€ λ“±λ‘λ˜μ§€ μ•Šκ±°λ‚˜ μ‚¬μš©ν•  수 μ—†λŠ” 채널에 μ°Έμ—¬ν•˜λ €κ³  ν•  λ•Œ μ„œλ²„κ°€ 이 였λ₯˜ λ©”μ‹œμ§€λ₯Ό λ³΄λƒ…λ‹ˆλ‹€.

PART: ν΄λΌμ΄μ–ΈνŠΈμ˜ 채널 λ‚˜κ°€κΈ°

  • ꡬ성
    • νŒŒλΌλ―Έν„°λ‘œ μ œμ‹œλœ μ±„λ„μ—μ„œ active user λͺ©λ‘μ—μ„œ 제거
PART <channel>{,<channel>}

PART #oz-ops,&groups
  • numeric replies
    • ERR_NEEDMOREPARAMS
    • ERR_NOSUCHCHANNEL
    • ERR_NOTONCHANNEL: μ‚¬μš©μžκ°€ μ§€μ •ν•œ 채널에 μ°Έμ—¬ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ λ°œμƒν•˜λŠ” 였λ₯˜λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μ‚¬μš©μžκ°€ 채널에 μ°Έμ—¬ν•˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ 채널 κ΄€λ ¨ λͺ…령을 μ‹€ν–‰ν•˜λ €κ³  ν•  λ•Œ μ„œλ²„κ°€ 이 였λ₯˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

MODE: channel의 λͺ¨λ“œλ₯Ό λ³€κ²½

  • ꡬ성
  1. channel λͺ¨λ“œ
MODE <channel> {[+|-]|o|i|k|o|l} [<limit>] [<user>] [<ban mask>]

MODE #Finnish +im               ; Makes #Finnish channel moderated and
                                'invite-only'.

MODE #Finnish +o Kilroy         ; Gives 'chanop' privileges to Kilroy on channel #Finnish.
  • i: μ΄ˆλŒ€ μ „μš© 채널 μ„€μ •/ν•΄μ œ

  • t: μ±„λ„μ—μ„œ 주제 λͺ…λ Ήμ˜ μ œν•œ μ„€μ •/ν•΄μ œ (채널 μš΄μ˜μžμ—κ²Œλ§Œ 적용)

  • k: 채널 ν‚€(λΉ„λ°€λ²ˆν˜Έ) μ„€μ •/ν•΄μ œ

  • o: 채널 운영자 κΆŒν•œ λΆ€μ—¬/λ°•νƒˆ

  • l: μ±„λ„μ˜ μ‚¬μš©μž μ œν•œ μ„€μ •/ν•΄μ œ

  • numeric replies

    • ERR_NEEDMOREPARAMS: λͺ…령에 ν•„μš”ν•œ λ§€κ°œλ³€μˆ˜κ°€ μΆ©λΆ„ν•˜μ§€ μ•ŠμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • RPL_CHANNELMODEIS: μ±„λ„μ˜ ν˜„μž¬ λͺ¨λ“œλ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.
    • ERR_CHANOPRIVSNEEDED: 채널 운영자 κΆŒν•œμ΄ ν•„μš”ν•¨μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • ERR_NOSUCHNICK: μ§€μ •λœ λ‹‰λ„€μž„μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • ERR_NOTONCHANNEL: ν΄λΌμ΄μ–ΈνŠΈκ°€ 채널에 μ°Έμ—¬ν•˜μ§€ μ•Šμ•˜μŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • ERR_KEYSET: 채널 ν‚€κ°€ 이미 μ„€μ •λ˜μ—ˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • RPL_BANLIST: μ±„λ„μ˜ κΈˆμ§€λœ μ‚¬μš©μž λͺ©λ‘μ„ ν‘œμ‹œν•©λ‹ˆλ‹€.
    • RPL_ENDOFBANLIST: κΈˆμ§€λœ μ‚¬μš©μž λͺ©λ‘μ˜ λμž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • ERR_UNKNOWNMODE: μ•Œ 수 μ—†λŠ” λͺ¨λ“œ λ¬Έμžκ°€ μ‚¬μš©λ˜μ—ˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • ERR_NOSUCHCHANNEL: μ§€μ •λœ 채널이 μ‘΄μž¬ν•˜μ§€ μ•ŠμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • ERR_USERSDONTMATCH: μ‚¬μš©μžκ°€ μ„œλ‘œ μΌμΉ˜ν•˜μ§€ μ•ŠμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • RPL_UMODEIS: μ‚¬μš©μžμ˜ ν˜„μž¬ λͺ¨λ“œλ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.
    • ERR_UMODEUNKNOWNFLAG: μ•Œ 수 μ—†λŠ” μ‚¬μš©μž λͺ¨λ“œ ν”Œλž˜κ·Έκ°€ μ§€μ •λ˜μ—ˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

TOPIC: μ±„λ„μ˜ topic 확인 λ˜λŠ” λ³€κ²½

  • ꡬ성
    • 이 μ£Όμ–΄μ§€μ§€ μ•ŠμœΌλ©΄ 채널 의 μ£Όμ œκ°€ λ°˜ν™˜λœλ‹€
    • λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” 경우, ν•΄λ‹Ή μ±„λ„μ˜ μ£Όμ œκ°€ λ³€κ²½λœλ‹€
      • μ΄λ•Œ 채널 λͺ¨λ“œκ°€ 이 μž‘μ—…μ„ ν—ˆμš©ν•˜λŠ” κ²½μš°μ—λ§Œ λ³€κ²½λœλ‹€.
TOPIC <channel> [<topic>]
  • numerics
    • ERR_NEEDMOREPARAMS: ν•„μš”ν•œ λ§€κ°œλ³€μˆ˜κ°€ 더 ν•„μš”ν•¨ ERR_NOTONCHANNEL: 채널에 μ°Έμ—¬ν•˜μ§€ μ•ŠμŒ RPL_NOTOPIC: μ£Όμ œκ°€ μ„€μ •λ˜μ§€ μ•ŠμŒ RPL_TOPIC: μ£Όμ œκ°€ 섀정됨 ERR_CHANOPRIVSNEEDED: 채널 운영자 κΆŒν•œμ΄ ν•„μš”ν•¨

NAMES: ν΄λΌμ΄μ–ΈνŠΈκ°€ λ³Ό 수 μžˆλŠ” nickname λͺ©λ‘ λ‚˜μ—΄

  • ꡬ성
    • 채널이 privateμ΄λ‚˜ secret을 μ œμ™Έν•œ λͺ©λ‘ 확인 κ°€λŠ₯
    • ν‹€λ¦° 채널 이름에 λŒ€ν•œ μ—λŸ¬ λ©”μ‹œμ§€λŠ” μ—†λ‹€
    • νŒŒλΌλ―Έν„°κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄, λͺ¨λ“  채널과 그에 μ†ν•΄μžˆλŠ” μ°Έμ—¬μžλ“€μ˜ λͺ©λ‘μ΄ λ‚˜μ—΄λœλ‹€
NAMES [<channel>{,<channel>}]

NAMES #twilight_zone,#42
NAMES
  • numerics
    • RPL_NAMREPLY: μ±„λ„μ˜ μ‚¬μš©μž λͺ©λ‘μ„ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ œκ³΅ν•˜λŠ” 숫자 응닡 μ½”λ“œμž…λ‹ˆλ‹€. 이 응닡은 ν΄λΌμ΄μ–ΈνŠΈκ°€ νŠΉμ • 채널에 λŒ€ν•œ μ‚¬μš©μž λͺ©λ‘μ„ μš”μ²­ν–ˆμ„ λ•Œ μ„œλ²„κ°€ μ „μ†‘ν•˜λŠ” λ©”μ‹œμ§€μž…λ‹ˆλ‹€. 일반적으둜 채널에 λŒ€ν•œ μ‚¬μš©μž λͺ©λ‘μ„ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ œκ³΅ν•˜κ³  이λ₯Ό μ•Œλ¦¬λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
    • RPL_ENDOFNAMES: 채널 μ‚¬μš©μž λͺ©λ‘μ˜ 끝을 λ‚˜νƒ€λ‚΄λŠ” 숫자 응닡 μ½”λ“œμž…λ‹ˆλ‹€. 채널 μ‚¬μš©μž λͺ©λ‘μ΄ λλ‚¬μŒμ„ λ‚˜νƒ€λ‚΄λ©°, ν΄λΌμ΄μ–ΈνŠΈλŠ” 이λ₯Ό λ°›κ³  λͺ©λ‘μ˜ λμž„μ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. 이 응닡은 RPL_NAMREPLY λ©”μ‹œμ§€ λ‹€μŒμ— μ‚¬μš©λ˜μ–΄ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 채널 μ‚¬μš©μž λͺ©λ‘μ˜ 끝을 ν‘œμ‹œν•©λ‹ˆλ‹€.

LIST: channelκ³Ό topic λͺ©λ‘ λ‚˜μ—΄

  • ꡬ성
    • νŒŒλΌλ―Έν„°κ°€ μ œμ‹œλ˜λ©΄ κ·Έ μ±„λ„λ“€λ§Œ λ‚˜μ—΄
    • private 채널은 β€œPrv” 라고 λͺ…μ‹œ, secret 채널은 λͺ…μ‹œν•˜μ§€ μ•ŠμŒ(λ‹€λ§Œ, μœ μ €κ°€ κ·Έ 채널에 μ†ν•΄μžˆμœΌλ©΄ 좜λ ₯)
LIST [<channel>{,<channel>} [<server>]]
  • numerics
    • ERR_NOSUCHSERVER: μš”μ²­ν•œ μ„œλ²„κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • RPL_LISTSTART: 채널 λͺ©λ‘μ„ 보여주기 μ‹œμž‘ν•¨μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • RPL_LIST: 채널 λͺ©λ‘μ„ μ „μ†‘ν•©λ‹ˆλ‹€.
    • RPL_LISTEND: 채널 λͺ©λ‘ 전솑이 μ™„λ£Œλ˜μ—ˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

INVITE: ν•΄λ‹Ή 채널에 ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μ΄ˆλŒ€

  • ꡬ성
    • λŒ€μƒ μ‚¬μš©μžκ°€ μ΄ˆλŒ€λ˜λŠ” 채널이 λ°˜λ“œμ‹œ μ‘΄μž¬ν•˜κ±°λ‚˜ μœ νš¨ν•œ 채널이어야 ν•˜λŠ” μš”κ΅¬ 사항은 μ—†λ‹€
    • μ΄ˆλŒ€λœ μ‚¬μš©μžλ₯Ό μ΄ˆλŒ€ μ „μš© 채널 (λͺ¨λ“œ +i)둜 μ΄ˆλŒ€ν•˜λ €λ©΄ μ΄ˆλŒ€λ₯Ό λ³΄λ‚΄λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•΄λ‹Ή μ±„λ„μ—μ„œ 채널 운영자둜 μΈμ‹λ˜μ–΄μ•Ό ν•œλ‹€
 INVITE <nickname> <channel>

 :Angel INVITE Wiz #Dust         ; User Angel inviting WiZ to channel
                                   #Dust

   INVITE Wiz #Twilight_Zone       ; Command to invite WiZ to
                                   #Twilight_zone
  • numerics
    • ERR_NEEDMOREPARAMS: λͺ…령에 ν•„μš”ν•œ λ§€κ°œλ³€μˆ˜κ°€ μΆ©λΆ„ν•˜μ§€ μ•ŠμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • ERR_NOSUCHNICK: μ§€μ •λœ λ‹‰λ„€μž„μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • ERR_NOTONCHANNEL: ν΄λΌμ΄μ–ΈνŠΈκ°€ 채널에 μ°Έμ—¬ν•˜μ§€ μ•Šμ•˜μŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • ERR_USERONCHANNEL: μ‚¬μš©μžκ°€ 이미 채널에 μ°Έμ—¬ μ€‘μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • ERR_CHANOPRIVSNEEDED: 채널 운영자 κΆŒν•œμ΄ ν•„μš”ν•¨μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • RPL_INVITING: μ‚¬μš©μžμ—κ²Œ μ΄ˆλŒ€κ°€ μ „μ†‘λ˜μ—ˆμŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • RPL_AWAY: μ‚¬μš©μžκ°€ μž μ‹œ λΆ€μž¬ μ€‘μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

KICK: ν•΄λ‹Ή μ±„λ„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈ 강퇴

  • ꡬ성
    • 채널 운영자만 λ‹€λ₯Έ μ‚¬μš©μžλ₯Ό μ±„λ„μ—μ„œ μΆ”λ°©ν•  수 μžˆλ‹€
    • KICK λ©”μ‹œμ§€λ₯Ό μˆ˜μ‹ ν•œ 각 μ„œλ²„λŠ” ν•΄λ‹Ή λ©”μ‹œμ§€κ°€ μœ νš¨ν•œμ§€ ν™•μΈν•œλ‹€ (즉, 보낸 μ‚¬λžŒμ΄ μ‹€μ œλ‘œ 채널 μš΄μ˜μžμΈμ§€ 확인) κ·Έ ν›„ ν•΄λ‹Ή ν΄λΌμ΄μ–ΈνŠΈλ₯Ό κ°•
 KICK <channel> <user> [<comment>]
 KICK <channel>{,<channel>} <user>{,<user>} [<comment>]

 KICK &Melbourne Matthew         ; Kick Matthew from &Melbourne

KICK #Finnish John :Speaking English
                                ; Kick John from #Finnish using
                                "Speaking English" as the reason
                                (comment).

:WiZ KICK #Finnish John         ; KICK message from WiZ to remove John
                                from channel #Finnish
  • numerics
    • ERR_NEEDMOREPARAMS: ν•„μš”ν•œ λ§€κ°œλ³€μˆ˜κ°€ 더 ν•„μš”ν•¨ ERR_NOSUCHCHANNEL: 채널이 μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ ERR_BADCHANMASK: 잘λͺ»λœ 채널 마슀크 ERR_CHANOPRIVSNEEDED: 채널 운영자 κΆŒν•œμ΄ ν•„μš”ν•¨ ERR_NOTONCHANNEL: 채널에 μ°Έμ—¬ν•˜μ§€ μ•ŠμŒ

(3) Sending Messages

PRIVMSG

  • ꡬ성
    • λŠ” λ©”μ‹œμ§€ μˆ˜μ‹ μžμ˜ λ‹‰λ„€μž„
      • λŠ” μ‰Όν‘œλ‘œ κ΅¬λΆ„λœ μ΄λ¦„μ΄λ‚˜ 채널 λͺ©λ‘μΌ μˆ˜λ„ μžˆλ‹€.
    • λ§€κ°œλ³€μˆ˜λŠ” 호슀트 마슀크(#mask) λ˜λŠ” μ„œλ²„ 마슀크($mask)일 μˆ˜λ„ μžˆλ‹€
      • 이 경우, μ„œλ²„λŠ” λ§ˆμŠ€ν¬μ™€ μΌμΉ˜ν•˜λŠ” μ„œλ²„ λ˜λŠ” 호슀트λ₯Ό κ°€μ§„ μ‚¬μš©μžμ—κ²Œλ§Œ PRIVMSGλ₯Ό λ³΄λƒ…λ‹ˆλ‹€. (λ§ˆμŠ€ν¬λŠ” 적어도 1개의 "."을 κ°€μ Έμ•Ό ν•˜λ©° λ§ˆμ§€λ§‰ "." λ‹€μŒμ— μ™€μΌλ“œμΉ΄λ“œκ°€ μ—†μ–΄μ•Ό ν•©λ‹ˆλ‹€.)
      • μ΄λŸ¬ν•œ μš”κ΅¬ 사항은 "#" λ˜λŠ” "$"둜 λ©”μ‹œμ§€λ₯Ό 보내지 λͺ»ν•˜λ„둝 ν•¨μœΌλ‘œμ¨ λͺ¨λ“  μ‚¬μš©μžμ—κ²Œ λ°©μ†‘λ˜λŠ” 것을 λ°©μ§€ν•œλ‹€
    • 이 ν™•μž₯된 PRIVMSG λͺ…령은 운영자만 μ‚¬μš©ν•  수 μžˆλ‹€.
    PRIVMSG <receiver>{,<receiver>} <전솑할 ν…μŠ€νŠΈ>
  • μ½”λ“œ μ˜ˆμ‹œ
    • Angelμ—κ²Œ Wizλ‘œλΆ€ν„° λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄λŠ” 경우:
      :Angel PRIVMSG Wiz :μ•ˆλ…•ν•˜μ„Έμš”, 이 λ©”μ‹œμ§€λ₯Ό λ°›κ³  μžˆλ‚˜μš”?
    • Angelμ—κ²Œ λ©”μ‹œμ§€λ₯Ό 보내고 Angel이 그것을 λ°›μ•˜λ‹€λŠ” 응닡을 λ°›λŠ” 경우:
      PRIVMSG Angel :λ„€, λ°›κ³  μžˆμ–΄μš”!
      
  • numeric replies
    • ERR_NORECIPIENT: μˆ˜μ‹ μžκ°€ μ§€μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
    • ERR_NOTEXTTOSEND: 전솑할 ν…μŠ€νŠΈκ°€ μ—†μŠ΅λ‹ˆλ‹€.
    • ERR_CANNOTSENDTOCHAN: μ±„λ„λ‘œ λ©”μ‹œμ§€λ₯Ό 보낼 수 μ—†μŠ΅λ‹ˆλ‹€.
    • ERR_NOTOPLEVEL: μ΅œμƒμœ„ 도메인이 μ•„λ‹Œ μˆ˜μ‹ μžμ—κ²Œ λ©”μ‹œμ§€λ₯Ό 보낼 수 μ—†μŠ΅λ‹ˆλ‹€.
    • ERR_WILDTOPLEVEL: μ™€μΌλ“œμΉ΄λ“œκ°€ ν¬ν•¨λœ μ΅œμƒμœ„ 도메인에 λ©”μ‹œμ§€λ₯Ό 보낼 수 μ—†μŠ΅λ‹ˆλ‹€.
    • ERR_TOOMANYTARGETS: μ§€μ •λœ μˆ˜μ‹ μžκ°€ λ„ˆλ¬΄ λ§ŽμŠ΅λ‹ˆλ‹€.
    • ERR_NOSUCHNICK: ν•΄λ‹Ήν•˜λŠ” λ‹‰λ„€μž„μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    • RPL_AWAY: μˆ˜μ‹ μžκ°€ λΆ€μž¬μ€‘μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

NOTICE

  • ꡬ성
    • NOTICE λ©”μ‹œμ§€λŠ” PRIVMSG와 μœ μ‚¬ν•˜κ²Œ μ‚¬μš©λœλ‹€
    • NOTICE와 PRIVMSG의 차이점은 NOTICE λ©”μ‹œμ§€μ— λŒ€ν•œ μžλ™ 응닡이 μ ˆλŒ€ μ „μ†‘λ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€λŠ” 것이닀
      • 이 κ·œμΉ™μ€ μ„œλ²„μ—λ„ 적용되며, μ„œλ²„λŠ” NOTICEλ₯Ό μˆ˜μ‹ ν•  λ•Œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ–΄λ– ν•œ 였λ₯˜ 응닡도 λ³΄λ‚΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€.
      • 이 κ·œμΉ™μ˜ λͺ©μ μ€ ν΄λΌμ΄μ–ΈνŠΈκ°€ 받은 것에 λŒ€ν•œ 응닡을 μžλ™μœΌλ‘œ 보내어 루프에 λΉ μ§€μ§€ μ•Šλ„λ‘ ν•˜λŠ” 것이닀
      • μ΄λŠ” 일반적으둜 μžλ™ν™”λœ μ‹œμŠ€ν…œ(ν΄λΌμ΄μ–ΈνŠΈμ— AI λ˜λŠ” λ‹€λ₯Έ λŒ€ν™”ν˜• ν”„λ‘œκ·Έλž¨μ΄ μ œμ–΄ν•˜λŠ”)μ—μ„œ μ‚¬μš©λ˜λ©°, 항상 응닡을 보이도둝 μ„€μ •λ˜μ–΄ μžˆμ–΄μ•Ό λ‹€λ₯Έ μžλ™ν™”λœ μ‹œμŠ€ν…œκ³Ό 루프에 λΉ μ§€μ§€ μ•ŠλŠ”λ‹€
NOTICE <nickname> <전솑할 ν…μŠ€νŠΈ>
  • numerics은 PRIVMSG와 동일

(4) μΆ”κ°€ κΈ°λŠ₯

PING

  • ꡬ성
    • PING λ©”μ‹œμ§€λŠ” μ—°κ²°μ˜ λ‹€λ₯Έ μͺ½μ— ν™œμ„± ν΄λΌμ΄μ–ΈνŠΈκ°€ μžˆλŠ”μ§€ ν…ŒμŠ€νŠΈν•˜λŠ” 데 μ‚¬μš©λœλ‹€
    • λ‹€λ₯Έ ν™œλ™μ΄ κ°μ§€λ˜μ§€ μ•ŠλŠ” 경우 μ •κΈ°μ μœΌλ‘œ PING λ©”μ‹œμ§€κ°€ μ „μ†‘λœλ‹€.
    • 연결이 μ„€μ •λœ μ‹œκ°„ 내에 PING λͺ…령에 μ‘λ‹΅ν•˜μ§€ μ•ŠμœΌλ©΄ ν•΄λ‹Ή 연결이 λ‹«νžŒλ‹€.
    • PING λ©”μ‹œμ§€λ₯Ό μˆ˜μ‹ ν•œ λͺ¨λ“  ν΄λΌμ΄μ–ΈνŠΈλŠ” κ°€λŠ₯ν•œ 빨리 (PING λ©”μ‹œμ§€λ₯Ό 보낸 μ„œλ²„)에 μ μ ˆν•œ PONG λ©”μ‹œμ§€λ‘œ μ‘λ‹΅ν•˜μ—¬ μ—¬μ „νžˆ μ‚΄μ•„ μžˆμŒμ„ λ‚˜νƒ€λ‚΄μ–΄μ•Ό ν•œλ‹€
    • μ„œλ²„λŠ” PING λͺ…령에 μ‘λ‹΅ν•΄μ„œλŠ” μ•ˆ 되고 연결이 ν™œμ„± μƒνƒœμž„μ„ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ μ—°κ²°μ˜ λ‹€λ₯Έ μͺ½μ—μ„œ PING을 μ‘λ‹΅ν•˜λŠ” 것에 μ˜μ‘΄ν•΄μ•Ό ν•œλ‹€
    • λ§€κ°œλ³€μˆ˜κ°€ μ§€μ •λœ 경우 PING λ©”μ‹œμ§€κ°€ ν•΄λ‹Ή μ„œλ²„λ‘œ μ „λ‹¬λ©λ‹ˆλ‹€.
PING <server1> [<server2>]

숫자 응닡:

  • ERR_NOORIGIN
  • ERR_NOSUCHSERVER

μ˜ˆμ‹œ:

  • μ„œλ²„κ°€ λ‹€λ₯Έ μ„œλ²„μ—κ²Œ μ‚΄μ•„ μžˆλ‹€λŠ” 것을 λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ PING λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄λŠ” 경우:
    PING tolsun.oulu.fi
    
    
  • λ‹‰λ„€μž„ WiZμ—κ²Œ PING λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄λŠ” 경우:
    PING WiZ
    
    

PONG

  • ꡬ성 PONG λ©”μ‹œμ§€λŠ” ping λ©”μ‹œμ§€μ— λŒ€ν•œ μ‘λ‹΅μž…λ‹ˆλ‹€. λ§€κ°œλ³€μˆ˜κ°€ 제곡된 경우 이 λ©”μ‹œμ§€λŠ” ν•΄λ‹Ή 데λͺ¬μœΌλ‘œ μ „λ‹¬λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. λ§€κ°œλ³€μˆ˜λŠ” PING λ©”μ‹œμ§€μ— μ‘λ‹΅ν•˜κ³  이 λ©”μ‹œμ§€λ₯Ό μƒμ„±ν•œ 데λͺ¬μ˜ μ΄λ¦„μž…λ‹ˆλ‹€.
PONG <daemon> [<daemon2>]

숫자 응닡:

  • ERR_NOORIGIN
  • ERR_NOSUCHSERVER

μ˜ˆμ‹œ:

  • PONG λ©”μ‹œμ§€λ₯Ό 보낸 데λͺ¬μ΄ csd.bu.edu이고, 이 λ©”μ‹œμ§€κ°€ tolsun.oulu.fi둜 μ „λ‹¬λ˜λŠ” 경우:
    PONG csd.bu.edu tolsun.oulu.fi