This document is stil work in progress
OpenIRC์์ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ค ๊ฒ์ ์ผ๋ง๋ ์ด๋ป๊ฒ ์๋ก ์ฃผ๊ณ ๋ฐ์์ง๋ฅผ ๊ธฐ์ ํฉ๋๋ค.
์ด ๋ฌธ์์์ ๋ค๋ค์ง๋ json ๋ฐ ๋ฉ์ธ์งํฉ ๋ฐ์ดํฐ์ ์คํค๋ง๋ makise ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ๊ธฐ์ ๋ฉ๋๋ค.
- ๋ฐฉ๋ฒ
- ์ฑํ ๋ฉ์ธ์ง ํฌ๋งท
- ์์ฒญ/์๋ต ๋ฉ์ธ์ง ํฌ๋งท
- ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๋ ๋ฉ์ธ์ง ํฌ๋งท
- ๋ฐฉ๋ฒ
OpenIRC ์๋ฒ๋ OAuth๋ฅผ ์ฌ์ฉํ ์ธ์ฆ๊ณผ ์ด๋ฉ์ผ ์ธ์ฆ ๋ฐฉ์, ๊ทธ๋ฆฌ๊ณ ๋ฐ๊ธ๋ฐ์ ํ ํฐ์ ์ฌ์ฉํ๋ ์ธ์ฆ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค.
TODO
TODO
POST ๋ฉ์๋๋ก url์ http://<OpenIRC ์๋ฒ ์ฃผ์>/login/์ผ๋ก, ์์ฒญ์ธ์๋ { "method": "token", "token": "<๋ฐ๊ธ๋ฐ์ ํ ํฐ>" }์ผ๋ก ํธ์ถํ๋ฉด ์๋ฒ๋ ๋ค์๊ณผ ๊ฐ์ ํฌ๋งท์ json ๊ฐ์ฒด๋ฅผ ์๋ตํฉ๋๋ค:
this is {
connections: [connection],
ws: url // ์น์์ผ ์ฐ๊ฒฐ ์ฃผ์
}
url is string
connection is {
name: string, // ์ค์ง์ด์๋ฒ
url: string, // ocarina.irc.ozinger.org
port: int32, // 16667
ssl: boolean, // true
connid: int32, // ์ปค๋ฅ์
id
seq: js_safe_int, // ์ํ์ค ๋ฒํธ
user: me, // ํ์ฌ ์ฌ์ฉ์
channels: [channel]
}
channel is {
name: string, // ์ฑ๋ ์ด๋ฆ
topic: string, // ์ฑ๋ ํ ํฝ
users: [user] // ์ฑ๋์ ์ ์ํ ์ ์ ๋ชฉ๋ก
}
user is {
nickname: string // ์ฌ์ฉ์ ๋ํ๋ช
}
me is user and {
realname: string, // ์ฌ์ฉ์๋ช
username: string, // ์ฌ์ฉ์ ๊ณ์ ๋ช
password: string // ์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ
}
์ปค๋ฅ์
๋ง๋ค seq๋ผ๋ ์ํ์ค ๋ฒํธ๊ฐ ๋ค์ด์๋๋ฐ,
์ด ์ํ์ค ๋ฒํธ๋ณด๋ค ์์ ์ฑํ
์ด๋ฒคํธ ๋ก๊ทธ๋ ์ปค๋ฅ์
์ ์ํ๋ฅผ ์กฐ์ํ์ง ๋ง๋ผ๋ ์๋ฏธ์
๋๋ค.
์ฌ๊ธฐ์ ์ปค๋ฅ์
์ ์ํ๋ ์ฑ๋ ๋ชฉ๋ก๊ณผ ์ฑ๋๋ณ ํ ํฝ ๋ฐ ์ ์ ๋ชฉ๋ก ๋ฑ์ ์๋ฏธํฉ๋๋ค.
์น์์ผ์ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ต๋๋ค.
๋ก๊ทธ์ธ ์ ์ฐจ๋ฅผ ๊ฑฐ์น๋ฉด ์ฌ์ฉ์ ๊ธฐ๋ณธ ์ ๋ณด์ ์น์์ผ ์ฐ๊ฒฐ ์ฃผ์(res.ws)๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ฌ์ฉ์ ์ธ์ฆ๋ ์น์์ผ ์ฐ๊ฒฐ ์ฃผ์์ด๊ธฐ ๋๋ฌธ์ ์ฑํ
๋ฉ์ธ์ง์๋ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ฐ๋ก ๋ด์ ํ์๊ฐ ์์ต๋๋ค.
๊ทธ ์ธ ์ฌ์ฉ์ ์ ๋ณด๋ RESTful api๋ฅผ ํตํด์ ์ป์ด์ผ ํฉ๋๋ค.
- ์ฑํ ๋ฉ์ธ์ง ํฌ๋งท
๋ฉ์ธ์งํฉ์ ์ฌ์ฉํฉ๋๋ค.
์ฃผ๊ณ ๋ฐ๋ ๋ฉ์ธ์ง ๋ฐ์ดํฐ๋ ๋ฌด์กฐ๊ฑด object ํํ์ฌ์ผ ํฉ๋๋ค.
์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ๋ชจ๋ ์์ฒญ์ ๋ํด์ ์๋ต์ ํด์ค ์๋ฌด๊ฐ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ณด๋ด๋ ๋ชจ๋ ์ฑํ
๋ฉ์ธ์ง๋ ์์ฒญ id(์ดํ rid)๋ฅผ ๊ฐ์ต๋๋ค.
์๋ฒ์ ๋ชจ๋ ์๋ต ๋ฉ์ธ์ง๋ rid๋ฅผ ๊ฐ์ต๋๋ค.
ํด๋ผ์ด์ธํธ๋ ์ด rid๋ฅผ ์ด์ฉํด์ ์์ฒญ์ ์์ํ๋ ์๋ต์ ์์๋ผ ์ ์์ต๋๋ค.
rid๋ int32 ํ์
์ ๊ฐ์ง๋ฉฐ, ํด๋ผ์ด์ธํธ์์ ์ง์ ๊ด๋ฆฌ(2147483647์ ๋์ด๊ฐ๋ฉด 0๋ถํฐ ๋ค์ ์์ํ๋ ๋ฑ์ ์ฒ๋ฆฌ)ํ๋ฉด ๋ฉ๋๋ค.
rid๊ฐ int32 ํ์
์ด ์๋๊ฑฐ๋(์: 12.34) ์์๊ฐ์ ๊ฐ์ง ๊ฒฝ์ฐ,
์๋ฒ๋ rid๊ฐ -1์ธ ์๋ต์ ๋๋ ค์ฃผ์ด์ผํฉ๋๋ค:
{
"rid": -1,
"given_rid": 12.34,
"kind": "error",
"list": [
{
"kind": "invalid_type",
"context": "rid",
"given_type": "number",
"required_type": "int32"
}
]
}(ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ๋ณด๋ด๋) ์์ฒญ ๋ฉ์ธ์ง์ ๊ธฐ๋ณธ ํฌ๋งท์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
request is {
rid: int32,
kind: request_kind
}
request_kind is (
'join', 'leave', 'message'
)
(์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๋) ์๋ต ๋ฉ์ธ์ง์ ๊ธฐ๋ณธ ํฌ๋งท์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
response is {
rid: int32,
kind: response_kind
}
response_kind is (
'ok',
'error'
)
response[rid = -1] is {
given_rid: *
}
response[kind = 'error'] is {
list: [error]
}
error is {
kind: ('invalid_type')
}
error[kind = 'invalid_type'] is {
context: string, // 'key.array["0"].key2'...
given_type: string,
required_type: string
}
์๋ต์ด ์๋ ๊ฒฝ์ฐ์, ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๋ ๋ฉ์ธ์ง๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ตํ ์๋ฌด๊ฐ ์์ต๋๋ค.
์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๋ ๋ฉ์ธ์ง์ ๊ธฐ๋ณธ ํฌ๋งท์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
message is {
kind: message_kind
}
message_kind is () // TODO
- ์์ฒญ/์๋ต ๋ฉ์ธ์ง ํฌ๋งท
target is {
connid: int32,
kind: ('channel', 'user'),
name: string
}
// ์ฑ๋ ์ ์
request[kind = 'join'] is {
target: target
}
// ์ฑ๋ ํด์ฅ
request[kind = 'leave'] is {
target: target
}
// ๋ํ
request[kind = 'message'] is {
target: target,
content: string
}
- ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๋ ๋ฉ์ธ์ง ํฌ๋งท
TODO