Discord ์๋ฒ ์ด์, AI ๋ณด์กฐ, ์์ ์ฌ์, ๊ฒ์/๋๋ฐ, ์ผ์ , ์ธ๋ถ ์๋ฆผ์ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ Python ๊ธฐ๋ฐ Discord ๋ด์ ๋๋ค.
์ด ์ ์ฅ์๋ ๋ด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋, Docker ์คํ ์์ฐ, Jenkins ์์ ํ์ดํ๋ผ์ธ, DB ๋ง์ด๊ทธ๋ ์ด์ ์คํฌ๋ฆฝํธ๋ฅผ ํจ๊ป ๊ด๋ฆฌํฉ๋๋ค. ๊ณต์ Jenkins ์ปจํธ๋กค๋ฌ๋ ์ธ๋ถ ๋ฐํ์ ์ธํ๋ผ๋ ์ด ์ ์ฅ์ ๋ฒ์๊ฐ ์๋๋๋ค.
discord.py๊ธฐ๋ฐ slash command/package cog ๊ตฌ์กฐ- OpenAI Responses API ๊ธฐ๋ฐ ์ง๋ฌธ, ๊ฒ์, ์์ฝ, ๋ฒ์ญ, ํด์, ์ค๋ช , ์์ ์ถ์ฒ, ๊ณต์ง ์์ฝ
- YouTube ์์ ์์ฝ, ๋๊ธ ์์ฝ, ๋ผ์ด๋ธ/์ ๋ก๋/WebSub/์ปค๋ฎค๋ํฐ ๊ฒ์๋ฌผ ์๋ฆผ
- ์์ ์ฌ์, ๋๊ธฐ์ด, ๋ฐ๋ณต, ์ ํ, ์ฆ๊ฒจ์ฐพ๊ธฐ, ํจ๋ UI
- MySQL ๊ธฐ๋ฐ ๊ธธ๋ ์ค์ , ๋๋ฐ ์์ก, ์์ฝ ๋ฉ์์ง, YouTube ๊ตฌ๋ , DDAY, ๊ธฐ๋ฅ ์ํ ์ ์ฅ
aiohttp.web๊ธฐ๋ฐ ์ํ/์ธ๋ถ ์ฝ๋ฐฑ API- Docker Compose ๋ฐฐํฌ์ Jenkins ๊ฒ์ฆ/๋ง์ด๊ทธ๋ ์ด์ /๋ฐฐํฌ ๋จ๊ณ
- Runtime: Python 3.11
- Discord:
discord.py,discord.py[voice],discord-ext-voice-recv - HTTP/DB:
aiohttp,aiomysql - AI: OpenAI Responses API, hosted prompt payload
- ์์ฑ/๋ฏธ๋์ด:
faster-whisper,pyttsx3,yt-dlp,ffmpeg - ์ธ๋ถ API: YouTube Data API, Riot API, ํ๊ตญ์ํ ECOS
- ํ
์คํธ:
unittest,compileall - ๋ฐฐํฌ: Docker, Docker Compose, Jenkins Pipeline
.
โโโ bot.py # Bot ์์ฑ, Cog ์๋ ๋ก๋, ๋ฉ์์ง ์บ์, startup ์ด๊ธฐํ
โโโ api/ # OpenAI, Riot, ECOS API adapter
โโโ cogs/ # Slash command์ background/API cog
โโโ common/ # ๊ณตํต OpenAI prompt payload helper
โโโ func/ # YouTube ์์ฝ/๋ฏธ๋์ด ์ฒ๋ฆฌ์ 1557 ๊ฐ์ง ๊ธฐ๋ฅ
โโโ util/ # DB, guild/message/music/youtube/maplestory/loop helper
โโโ scripts/migrate_db.py # MySQL schema migration entrypoint
โโโ test/ # unittest ๊ธฐ๋ฐ ํ๊ท ํ
์คํธ
โโโ Dockerfile* # runtime/dependency image
โโโ docker-compose.yml # local/deploy compose service
โโโ Jenkinsfile # checkout, verify, migrate, deploy ์์ pipeline
bot.py๊ฐ commands.Bot์ ์์ฑํ๊ณ cogs/ ์๋์ ๋จ์ผ ํ์ผ cog์ package cog๋ฅผ ์๋์ผ๋ก ๋ฐ๊ฒฌํด ๋ก๋ํฉ๋๋ค. cogs.status_api๋ ํ์ cog๋ก ์ทจ๊ธ๋์ด ๋ก๋ ์คํจ ์ startup์ด ์ค๋จ๋ฉ๋๋ค.
bot.py๋ ๋ค์ ์ ์ญ ์ํ๋ ๊ด๋ฆฌํฉ๋๋ค.
DISCORD_CLIENT.USER_MESSAGES: ๊ธธ๋๋ณ ์ต๊ทผ ๋ฉ์์ง ์บ์. AI ์ง๋ฌธ๊ณผ ์์ฝ ์ปจํ ์คํธ๋ก ์ฌ์ฉํฉ๋๋ค. ๋ํ ์์ฝ์ ์ต๊ทผ ์ด๋ฏธ์ง ์ต๋ 4์ฅ๋ ํจ๊ป ์ฒ๋ฆฌํ๋ฉฐ, ํด์๊ณผ ์ค๋ช ์ ์ ํ ๋ฉ์์ง ๊ธฐ์ค ์ฑ๋ ๊ธฐ๋ก์ ์ง์ ์กฐํํฉ๋๋ค.DISCORD_CLIENT.PARTY_LIST:-ํํฐ๋ก ๋๋๋ Discord ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๊ธธ๋๋ณ๋ก ์ถ์ ํฉ๋๋ค.
ํ์ฌ ์ฃผ์ ๊ธฐ๋ฅ์ package cog ํํ์ธ cogs/<name>/__init__.py์ ์์นํฉ๋๋ค. ๋ณต์กํ ๊ธฐ๋ฅ์ ํด๋น cog๊ฐ command surface๋ง ๋ด๋นํ๊ณ ์ธ๋ถ ๋ก์ง์ util/, func/, ํ์ ๋ชจ๋๋ก ๋ถ๋ฆฌํฉ๋๋ค.
๋ํ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
cogs/gambling/: ๋๋ฐ ๋ช ๋ น surface, ์์ก/๊ฒ์ ๋ก์ง์ ํ์ ํ์ผ๋ก ๋ถ๋ฆฌcogs/music/: ์์ ๋ช ๋ น surface, queue/playback/source/view helper๋util/music/cogs/youtube_subscriptions/: YouTube ๊ตฌ๋ ๋ช ๋ น surface, ์ํ/์๋ฆผ/WebSub helper๋util/youtube/cogs/maplestory/: MapleStory ๋ช ๋ น surface, fetch/parser/sender/state๋util/maplestory/cogs/loop/: background task orchestration, ์ธ๋ถ runner๋util/loop/,util/youtube/,util/maplestory/,util/codex_resets/,util/earthquake/
| ๋ช ๋ น์ด | ์ค๋ช |
|---|---|
/๋์ |
์นดํ ๊ณ ๋ฆฌ๋ณ ๋์๋ง UI |
/๊ธฐ๊ฐ์ฑ๋ |
๊ธฐ๊ฐ์ฑ๋ ์ด๋ฏธ์ง ์ ์ก |
/ํ |
๋ด latency ํ์ธ |
/clean |
๊ด๋ฆฌ์ ์ ์ฉ ์ต๊ทผ ๋ฉ์์ง ์ ๋ฆฌ |
/์ฑ๋์ค์ |
๊ธฐ๋ ์ผ, ๋๋ฐ, ์์ , ์ ํ๋ธ, ๋ฉ์ดํ๊ณต์ง, ๋ก์๊ณต์ง, ์ฝ๋ฑ์ค๋ฆฌ์ , ์ง์ง์๋ฆผ ์ฑ๋ ์ง์ /ํด์ |
/์ฑ๋์ค์ ํ์ธ |
ํ์ฌ ๊ธธ๋์ ๊ธฐ๋ฅ๋ณ ์ฑ๋ ์ค์ ํ์ธ |
| ๋ช ๋ น์ด | ์ค๋ช |
|---|---|
/๊ธฐ๋
์ผ์
๋ฐ์ดํธ |
์ค๋ ๊ธฐ๋ ์ผ/์ฌ๊ฑด ๊ณต์ง๋ฅผ ์๋ ๊ฐฑ์ |
/dday์ถ๊ฐ |
์๋ฒ DDAY ์ถ๊ฐ |
/dday์ญ์ |
DDAY ๋ชฉ๋ก์์ ์ ํ ์ญ์ |
/dday๋ชฉ๋ก |
์๋ฒ DDAY ๋ชฉ๋ก ์กฐํ |
/์์ฝ ์ผ๋ฐ |
์ง์ ์๊ฐ์ ๋ฉ์์ง ์์ฝ |
/์์ฝ ๋ฐ๋ณต |
๋งค์๊ฐ/๋งค์ผ/๋งค์ฃผ/๋งค๋ฌ ๋ฐ๋ณต ๋ฉ์์ง ์์ฝ |
/์์ฝ ๋ฆฌ์คํธ |
์์ฝ ๋ชฉ๋ก ์กฐํ ๋ฐ ์ญ์ |
| ๋ช ๋ น์ด/์ก์ | ์ค๋ช |
|---|---|
/์ง๋ฌธ |
์ต๊ทผ ๋ํ ๋ฌธ๋งฅ์ ๋ฐ์ํ๋ ํ ์คํธ/์ด๋ฏธ์ง ์ง๋ฌธ |
/์ ์ด์์ฌ |
ํ ์คํธ์ ์ด๋ฏธ์ง ๊ธฐ๋ฐ ์ง๋ฌธ |
/๊ฒ์ |
ํ ์คํธ์ ์ ํ ์ด๋ฏธ์ง ๋จ์๋ฅผ ์ด์ฉํ ์น ๊ฒ์ |
/๋ํ์์ฝ |
์ต๊ทผ ์ฑํ ๊ณผ ์ต๊ทผ ์ด๋ฏธ์ง ์ต๋ 4์ฅ ์์ฝ |
/๋ฒ์ญ |
์ ๋ ฅ ํ ์คํธ/์ด๋ฏธ์ง ๋๋ ์ต๊ทผ ๋ฉ์์ง ๋ฒ์ญ |
/ํด์ |
์ ๋ ฅ ํ ์คํธ/์ด๋ฏธ์ง ๋๋ ์ต๊ทผ ๋ฉ์์ง์ ๊ฐ๊น์ด ์ฃผ๋ณ ์ด๋ฏธ์ง ์ต๋ 4์ฅ์ ์์น, ๊ณ์ฐ, ๋ฐ ํ๋ณด ๊ฒ์ ํด์ |
/์ค๋ช
|
์ ๋ ฅ ํ ์คํธ/์ด๋ฏธ์ง ๋๋ ์ต๊ทผ ๋ฉ์์ง์ ๊ฐ๊น์ด ์ฃผ๋ณ ์ด๋ฏธ์ง ์ต๋ 4์ฅ ์ค๋ช |
/๋ญ๋จน์ง |
์ ์ฅ ํ๋กฌํํธ์ gpt-6-luna๋ก ์ธ๊ณ ์์ ๋ฉ๋ด ํ๋ ์ถ์ฒ, ์์ ๋ฌธํ๊ถ ์ํ๊ณผ ์ต๊ทผ 20๊ฐ ๋ฉ๋ด ๋ฐ๋ณต ๋ฐฉ์ง (์ฌ์์ ์ ์ด๊ธฐํ) |
์ปจํ
์คํธ ๋ฉ๋ด ๋ฉ์์ง ๋ฒ์ญ |
์ ํ ๋ฉ์์ง ๋ฒ์ญ |
์ปจํ
์คํธ ๋ฉ๋ด ๋ฉ์์ง ํด์ |
์ ํ ๋ฉ์์ง ํด์ |
์ปจํ
์คํธ ๋ฉ๋ด ๋ฉ์์ง ์ค๋ช
|
์ ํ ๋ฉ์์ง ์ค๋ช |
OpenAI ํธ์ถ์ api/chatGPT.py์์ ๊ฐ์ธ๋ฉฐ, hosted prompt payload๋ common/openai_prompt.py์ helper๋ก ์์ฑํฉ๋๋ค. OpenAI SDK ์์ธ๋ OpenAIModelError๋ก ๋งคํํด ์ฌ์ฉ์์๊ฒ ์์ ํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ณด๋
๋๋ค.
| ๋ช ๋ น์ด | ์ค๋ช |
|---|---|
/๋ํ |
์์ฑ ์ฑ๋์ ์ฐธ์ฌํด ์ค์๊ฐ ์์ฑ ๋ํ ์์ |
/๋ํ์ข
๋ฃ |
์์ฑ ๋ํ ์ข ๋ฃ ๋ฐ ํด์ฅ |
์์ฑ ์ฒ๋ฆฌ๋ discord-ext-voice-recv Opus sink์์ Discord DAVE payload๋ฅผ ๋จผ์ ํด๋
ํ ๋ค ์ฌ์ฉ์๋ณ Opus decoder๋ก PCM์ ๋ง๋ค๊ณ , silence detection, faster-whisper STT, pyttsx3 TTS ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์์๋ ์์ฑ frame์ ํด๋น ์ฌ์ฉ์ decoder์์๋ง ํ๊ธฐํ๋ฏ๋ก ์ ์ฒด ์์ loop๋ฅผ ์ค๋จํ์ง ์์ต๋๋ค. Windows ๋ก์ปฌ ์คํ์์๋ bin/ ๋๋ PATH์ ffmpeg๋ฅผ ์ฌ์ฉํฉ๋๋ค.
STT๋ ๊ธฐ๋ณธ์ ์ผ๋ก tiny ๋ชจ๋ธ์ CPU int8๋ก ์คํํฉ๋๋ค. CUDA ๋ชจ๋ธ์ GPU ๋ฐํ์์ ์ค์ ๋ก ์ค๋นํ ํ๊ฒฝ์์๋ง VOICE_CHAT_WHISPER_DEVICE=cuda์ ๋ชจ๋ธ ๋ฐ ์ฐ์ฐ ํ์์ ๋ช
์ํด ํ์ฑํํฉ๋๋ค.
| ๋ช ๋ น์ด/๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
/์์ฝ |
์ต๊ทผ ๋ฉ์์ง์ YouTube ๋งํฌ 10๊ฐ๋ฅผ ์ ํํด ์์/๋๊ธ/๊ฒ์๋ฌผ ์์ฝ |
์ปจํ
์คํธ ๋ฉ๋ด ์ ํ๋ธ ์์ฝ |
์ ํ ๋ฉ์์ง์ YouTube ๋งํฌ ์์ฝ |
/์ ํ๋ธ๊ตฌ๋
์ถ๊ฐ |
์ฑ๋ URL, ID, @handle, ๊ฒ์์ด๋ก ๊ตฌ๋
์ถ๊ฐ |
/์ ํ๋ธ๊ตฌ๋
์๋ฆผ์ค์ |
๊ตฌ๋ ๋ณ ๋ผ์ด๋ธ/์์/์ปค๋ฎค๋ํฐ ์๋ฆผ on/off |
/์ ํ๋ธ๊ตฌ๋
์ญ์ |
๊ตฌ๋ ๋ชฉ๋ก์์ ์ ํ ์ญ์ |
/์ ํ๋ธ๊ตฌ๋
๋ชฉ๋ก |
์๋ฒ์ YouTube ๊ตฌ๋ ๋ชฉ๋ก ํ์ธ |
YouTube ์์ฝ์ ์๋ง์ ์ฐ์ ์ฌ์ฉํ๊ณ , ํ์ ์ ์ค๋์ค๋ฅผ MP3๋ก ๋ณํํด STT ํ ์์ฝํฉ๋๋ค. ๋๊ธ์ ์ต๋ 40๊ฐ๋ฅผ ์์ฝํฉ๋๋ค. ์ปค๋ฎค๋ํฐ ๊ฒ์๋ฌผ์ direct post URL๊ณผ channel posts page๋ฅผ ํ์ฑํฉ๋๋ค.
YouTube ์๋ฆผ์ ๋ค์ ๊ฒฝ๋ก๋ฅผ ์กฐํฉํฉ๋๋ค.
- WebSub Atom callback ์์
- YouTube Data API
videos.list๋ก live/upcoming/upload/shorts ๋ถ๋ฅ - Atom feed fallback polling
- ์ปค๋ฎค๋ํฐ ๊ฒ์๋ฌผ 10๋ถ polling
- WebSub ๊ตฌ๋ 12์๊ฐ ์ฃผ๊ธฐ ๊ฐฑ์
| ๋ช ๋ น์ด/๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
/์ฌ๋ฐ์ด๋ฉ์ดํ |
์งํ ์ค์ธ ์คํ์ ์ฌ๋ฐ์ด ๋ฉ์ดํ ์ด๋ฒคํธ ์ด๋ฏธ์ง ์กฐํ |
/๋ฉ์ดํ๊ณต์ง๊ตฌ๋
|
ํ์ฌ ์ฑ๋์ ๋ฉ์ดํ์คํ ๋ฆฌ ๊ณต์ง ์๋ฆผ ๊ตฌ๋ /ํด์ |
| ๋ช ๋ น์ด | ์ค๋ช |
|---|---|
/๋ก์๊ณต์ง๊ตฌ๋
[์ํ] |
๊ด๋ฆฌ์๊ฐ ํ์ฌ ์ฑ๋์ ๋ก์คํธ์ํฌ ๊ณต์ง ์๋ฆผ์ ๊ตฌ๋ /ํด์ |
/์ฑ๋์ค์ ๊ธฐ๋ฅ:๋ก์๊ณต์ง์์๋ ๊ฐ์ ์๋ฆผ ์ฑ๋์ ์ง์ ํ๊ฑฐ๋ ํด์ ํฉ๋๋ค./์ฑ๋์ค์ ํ์ธ์์ ํ์ธํ ์ ์์ต๋๋ค.- ๊ณต์ ๊ณต์ง ๋ชฉ๋ก์ 3๋ถ๋ง๋ค ํ์ธํ๋ฉฐ, ์ ๋ชฉ๊ณผ ๋ณธ๋ฌธ ๋ณ๊ฒฝ๋ ๊ฐ์งํฉ๋๋ค.
- ์ต์ด ๊ตฌ๋ ๊ณผ ์ฑ๋ ๋ณ๊ฒฝ ์ ๊ธฐ์กด ๊ณต์ง๋ ๊ธฐ์ค ์ํ๋ก ์ ์ฅํ๋ฉฐ ๊ณผ๊ฑฐ ๊ธ์ ์ ์กํ์ง ์์ต๋๋ค.
- ๋ฉ์ดํ ๊ณต์ง์ ๊ฐ์ 3~4์ค AI ์์ฝ ์๋ฒ ๋๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์์ฝ ์คํจ ์ ์๋ฌธ ๊ธฐ๋ฐ ์์ฝ์ ์ ๊ณตํฉ๋๋ค.
- ์ด๋ฏธ ์ ์กํ ๊ธ์ด ์์ ๋๋ฉด ๊ธฐ์กด ๋ฉ์์ง๋ฅผ ๊ฐฑ์ ํฉ๋๋ค. ๋์ผ ๊ธ์ ์ ๊ฒ ์ฐ์ฅ๊ณผ ์๋ฃ ์ฒ๋ฆฌ๋ ๋ฉ์ดํ ๊ณต์ง ์ ์ก ๋ก์ง์ ๋ฐ๋ฆ ๋๋ค.
- ์์ง๊ณผ ๊ตฌ๋
์ํ๋
util/lostark/notices.py์์ ๊ด๋ฆฌํ๋ฉฐ DB์lostarkNoticeState์ ์ ์ฅํฉ๋๋ค.
๊ณต์ง ์๋ฆผ์ 3๋ถ๋ง๋ค ํ์ธํฉ๋๋ค. ์ ์ ๊ฒ ๊ณต์ง๋ ์ ๋ฉ์์ง๋ก ๋ณด๋ด๊ณ , ์ผ๋ฐ ์์ ์ ๊ธฐ์กด ๋ฉ์์ง๋ฅผ ์์ ํฉ๋๋ค. ์ฐ์ฅ ๊ณต์ง๋ ๋ณ๋ ๋ฉ์์ง๋ก ์๋ฆฌ๊ณ , ์ ๊ฒ ์๋ฃ ๊ณต์ง๊ฐ ๋์ค๋ฉด ์ด์ ์ ๊ฒ ๊ด๋ จ ๋ฉ์์ง๋ฅผ ์ ๋ฆฌํ ๋ค ์๋ฃ ๊ณต์ง๋ฅผ ์ ์กํฉ๋๋ค.
| ๋ช ๋ น์ด/๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
/์ฝ๋ฑ์ค๋ฆฌ์
์๋ฆผ |
ํ์ฌ ์ฑ๋์ Codex ์ฌ์ฉ๋ ๋ฆฌ์ ์๋ฆผ ์ค์ /ํด์ |
codex-resets.com์ด ์ ๊ณตํ๋ ๊ณต๊ฐ API์ /api/v1/resets๋ฅผ 3๋ถ๋ง๋ค ํ์ธํฉ๋๋ค. ์ต์ 100๊ฑด ์ค ์ ์ผ๋ฐ ๋ฆฌ์
๊ณผ ์ ๋ฆฝํ ๋ฆฌ์
์ ์๋ฆฌ๋ฉฐ, X ๊ฒ์๋ฌผ ์์ด ๊ด์ธก๋ ๋ฆฌ์
๋ ํฌํจํฉ๋๋ค. ์์ ๋ฆฌ์
๊ณผ ๋ฆฌ์
๊ฐ๋ฅ์ฑ ์์ธก์ ์๋ฆผ ๋์์์ ์ ์ธํฉ๋๋ค. ์ด ์ฌ์ดํธ๋ OpenAI ๊ณต์ ์๋น์ค๊ฐ ์๋ ๋น๊ณต์ ์ถ์ ๊ธฐ์
๋๋ค.
| ๋ช ๋ น์ด/๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
/์ง์ง์๋ฆผ |
ํ์ฌ ์ฑ๋์ ์ผ๋ณธ M5.9 ์ด์, ํ๊ตญ M5.0 ์ด์, ๊ธฐํ ๊ตญ๊ฐ M6.5 ์ด์ ์ง์ง ์๋ฆผ ์ค์ /ํด์ |
/์ฑ๋์ค์ ๊ธฐ๋ฅ:์ง์ง์๋ฆผ |
์ง์ ํ ์ฑ๋์ ์ง์ง ์๋ฆผ ์ค์ /ํด์ |
/์ง์ง์๋ฆผ ์ํ:true๋ก ์คํํ ํ์ฌ ์ฑ๋์ด๋ /์ฑ๋์ค์ ๊ธฐ๋ฅ:์ง์ง์๋ฆผ ์ฑ๋:#์๋ฆผ์ฑ๋๋ก ์ง์ ํ ์ฑ๋์ ์๋ฆผ์ ๋ณด๋
๋๋ค. ๋ ๋ช
๋ น์ด๋ ๊ฐ์ earthquake_alert ์ค์ ์ ์ฌ์ฉํฉ๋๋ค.
| ๋์ | ์ ๋ณด ์ถ์ฒ | Discord ์ ์ก ๊ธฐ์ค | @everyone ๊ธฐ์ค |
|---|---|---|---|
| ์ผ๋ณธ | Wolfx JMA ๊ธด๊ธ์ง์ง์๋ณด | M5.9 ์ด์ | M7.0 ์ด์ |
| ํ๊ตญ ๋ฐ ํ๋ฐ๋ ์ธ์ ํด์ญ | EMSC/CSEM | M5.0 ์ด์ | M5.5 ์ด์ |
| ์ผ๋ณธ๊ณผ ํ๊ตญ์ ์ ์ธํ ๊ตญ๊ฐ | EMSC/CSEM | M6.5 ์ด์ | ์ฌ์ฉํ์ง ์์ |
์ผ๋ณธ์ Wolfx์ JMA ๊ธด๊ธ์ง์ง์๋ณด WebSocket์ ์์ ์ฐ๊ฒฐํด ์ผ๋ณธ ๊ธฐ์์ฒญ์ด ๋ฐํํ M5.9 ์ด์ ์๋ณด์ ๊ฒฝ๋ณด๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ๋ฌํฉ๋๋ค. ์ง์์ง์ ์์ ์ง์ญ์ ์ผ๋ณธ์ด๋ ๋ณ๋ ํค๊ฐ ํ์ ์๋ Google ๋ฒ์ญ์ผ๋ก ๋ณํํด ์ผ๋ณธ์ด(ํ๊ตญ์ด) ํ์์ผ๋ก ํ์ํ๋ฉฐ, ๋ฒ์ญ ์์ฒญ์ด ์คํจํ๋ฉด ์๋ฌธ์ผ๋ก ์๋ฆผ์ ๊ณ์ ๋ณด๋
๋๋ค. ๊ฐ์ ์ง์ง์ ํ์๋ณด์ ์ต์ข
๋ณด๋ ๊ธฐ์กด Discord ๋ฉ์์ง์ ์ง๋ ์์น๋ฅผ ์์ ํ๋ฉฐ ์ทจ์๋ณด๋ ๋ฐ์ํฉ๋๋ค. ํ๋ จ๋ณด์ 2๋ถ ์ด์ ์ง๋ ์ด๊ธฐ ์ค๋
์ท์ ์๋ฆฌ์ง ์์ต๋๋ค.
์ผ๋ณธ ์ธ ์ ์ธ๊ณ๋ EMSC/CSEM Standing Order WebSocket์ ์์ ์ฐ๊ฒฐํฉ๋๋ค. ํ๊ตญ์ ์ง์ญ๋ช
๊ณผ ํ๋ฐ๋ ์ขํ ๋ฒ์๋ก ํ๋ณํด M5.0 ์ด์๋ถํฐ, ๊ทธ ๋ฐ์ ๊ตญ๊ฐ๋ M6.5 ์ด์๋ถํฐ ๊ทผ์ค์๊ฐ์ผ๋ก ์ ๋ฌํฉ๋๋ค. EMSC์ unid์ ๊ฐฑ์ ์๊ฐ์ผ๋ก ์ ๊ท, ์์ , ์ญ์ ์ ๋ณด๋ฅผ ๊ฐ์ Discord ๋ฉ์์ง์ ๋ฐ์ํ๋ฉฐ ์ผ๋ณธ ์ง์ญ์ JMA ์๋ฆผ๊ณผ์ ์ค๋ณต์ ๋ง๊ธฐ ์ํด ์ ์ธํฉ๋๋ค. ์ฐ๊ฒฐ์ด ๋๊ฒผ๋ค๊ฐ ๋ณต๊ตฌ๋๋ฉด ์ต๊ทผ 10๋ถ ๋์ ๊ฐฑ์ ๋ M5.0 ์ด์ ์๋ฃ๋ฅผ ์กฐํํ ๋ค ์ง์ญ๋ณ ๊ธฐ์ค์ ์ ์ฉํด ๋๋ฝ์ ๋ณด์ํ์ง๋ง ์ต์ด ์คํ ๋ ๊ณผ๊ฑฐ ์ง์ง์ ์ฌ์ํ์ง ์์ต๋๋ค. EMSC๋ ์กฐ๊ธฐ๊ฒฝ๋ณด๊ฐ ์๋๋ผ ๊ด์ธก ํ ์๋ ๋ถ์๋๋ ์๋น ์ ๋ณด์ด๋ฉฐ ์์๋ฃ ๊ธฐ๊ด๊ณผ EMSC/CSEM์ ์๋ฒ ๋ ํ๋จ์ ํ์ํฉ๋๋ค.
@everyone์ ์ผ๋ณธ ์ง์ง M7.0 ์ด์๊ณผ ํ๊ตญ ์ง์ง M5.5 ์ด์์ ์ ์ฉํฉ๋๋ค. ๊ฐ์ ์ง์ง์์๋ ํ ๋ฒ๋ง ๋ฉ์
ํ๋ฉฐ, ์ผ๋ฐ ์๋ฆผ์ ๋ณด๋ธ ๋ค ํ์ ์ ๋ณด์์ ์ฒ์ ๋ฉ์
๊ธฐ์ค ์ด์์ผ๋ก ์ํฅ๋๋ฉด ๋ฉ์
์ด ํฌํจ๋ ์ ๋ฉ์์ง๋ก ๊ต์ฒดํฉ๋๋ค. ๊ทธ ๋ฐ์ ๊ตญ๊ฐ์์ ๋ฐ์ํ EMSC ์ง์ง์ ๊ท๋ชจ์ ๊ด๊ณ์์ด ๋ฉ์
ํ์ง ์์ต๋๋ค. ๋ฉ์
์ ๋ณด๋ด๋ ค๋ฉด ๋ด์ ๋์ ์ฑ๋์ @everyone, @here, ๋ชจ๋ ์ญํ ๋ฉ์
๊ถํ์ด ์์ด์ผ ํฉ๋๋ค.
Discord ์๋ฒ ๋๋ ๋ ์์ค ๋ชจ๋ ๊ท๋ชจ, ๊น์ด, ์ต๋ ์์ ์ง๋์ ๋ฐํ ๋จ๊ณ, ๋ฐํ ์๊ฐ, ๋ฐ์ ์ถ์ ์๊ฐ์ ๊ฐ๊ฐ 3์ด ํ์ผ๋ก ํ์ํฉ๋๋ค. EMSC๋ ์์ ์ง๋๋ฅผ ์ ๊ณตํ์ง ์์ ์ ๊ณต ์ ํจ์ผ๋ก ํ์ํฉ๋๋ค. ์ถ์ ์ง์์ OpenStreetMap ์ง๋ ์ด๋ฏธ์ง์ ํฌ๊ฒ ๋ณด๊ธฐ ๋งํฌ๋ก ํ์ํฉ๋๋ค. ์ผ์ชฝ ํ
๋๋ฆฌ๋ ๊ท๋ชจ M3.0 ์ด์ ์ด๋ก, M4.0 ์ด์ ๋
ธ๋, M5.0 ์ด์ ์ฃผํฉ, M6.0 ์ด์ ๋นจ๊ฐ์ด๋ฉฐ ์ทจ์ ๋๋ ์ญ์ ์ ๋ณด์ ๊ท๋ชจ ๋ฏธ์์ ํ์์
๋๋ค.
Wolfx๋ ์ผ๋ณธ ๊ธฐ์์ฒญ๊ณผ ๊ด๊ณ์๋ ๋น๊ณต์ ์ค๊ณ ์๋น์ค์ด๋ฉฐ EMSC/CSEM์ ์ฌ๋ฌ ๊ด์ธก๊ธฐ๊ด์ ์๋ฃ๋ฅผ ์์งํ๋ ๋น์ ๋ถ ๋น์๋ฆฌ ๊ธฐ๊ด์ ๋๋ค. EMSC ์๋ฃ๋ ์ด์ฉ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ถ์ฒ๋ฅผ ํ์ํ๋ฉฐ ์์ ์ ์ฌ์ฉ ์ ๋ณ๋ ํ๊ฐ ์ฌ๋ถ๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค. ์๋ณด์ ๊ท๋ชจ, ์ง์, ์์ ์ง๋๋ ํ์ ์ ๋ณด์์ ๋ฐ๋๊ฑฐ๋ ์ทจ์๋ ์ ์์ผ๋ฏ๋ก ํ์ง ๊ณต์ ์ฌ๋ ์๋ฆผ์ ์ฐ์ ํ์ธํด์ผ ํฉ๋๋ค.
| ๋ช ๋ น์ด | ์ค๋ช |
|---|---|
/๋ด์ |
๊ฐ์ ์์ฑ๋ฐฉ์์ ๋ฒํผ์ผ๋ก 10๋ช ์ ๋ชจ์งํ ๋ค LoL ๋ด์ ํ/ํฌ์ง์ ์๋ ๋ฐฐ์ |
/์๋ญ |
Riot ID ๊ธฐ๋ฐ ์๋ก ๋ญํฌ ์กฐํ |
/์๋ญ |
Riot ID ๊ธฐ๋ฐ ์์ ๋ญํฌ ์กฐํ |
/์ผ์ผ๋ญํฌ |
์์ ์๋ญ ์กฐํ ๋์ ํ์ธ |
/์ผ์ผ๋ญํฌ๋ณ๊ฒฝ |
์์ ์๋ญ ์กฐํ ๋์ ๋ณ๊ฒฝ |
/์ผ์ผ๋ญํฌ๋ฃจํ |
์์ ๋ญํฌ ๋ฃจํ on/off |
/ํฌํ |
์ฝค๋ง ๊ตฌ๋ถ ํญ๋ชฉ๊ณผ ์ฐธ์ฌ ์ธ์์ผ๋ก ๋ฒํผ ํฌํ ์งํ |
/๋ด์ ์ ๋ช
๋ น์ ์คํํ ์ฌ์ฉ์๊ฐ ์ฐธ๊ฐ ์ค์ธ ์์ฑ๋ฐฉ์ ๊ธฐ์ค์ผ๋ก 10๋ถ ๋์ ๋ชจ์งํฉ๋๋ค. ๊ฐ์ ์์ฑ๋ฐฉ์ ์ฌ์ฉ์๋ง ์ฐธ๊ฐ ๋ฒํผ์ ๋๋ฅผ ์ ์์ผ๋ฉฐ, ์ฐธ๊ฐ์๊ฐ ์์ฑ๋ฐฉ์ ๋๊ฐ๋ฉด ๋ช
๋จ์์ ์๋์ผ๋ก ์ ์ธ๋ฉ๋๋ค. 10๋ช
์ด ๋ชจ์ด๋ฉด ์ฐธ๊ฐ ์์์ ๊ด๊ณ์์ด ๋ ๋ํ๊ณผ ๋ธ๋ฃจํ์ 5๊ฐ ํฌ์ง์
์ ๋ฌด์์๋ก ๋ฐฐ์ ํฉ๋๋ค. ๋ชจ์ง์์ ์๋ฒ ๊ด๋ฆฌ์๋ ์๋ฃ ์ ์ ๋ชจ์ง์ ์ทจ์ํ ์ ์์ต๋๋ค.
๋๋ฐ ๋ช
๋ น์ /์ฑ๋์ค์ ๊ธฐ๋ฅ:๋๋ฐ์ผ๋ก ์ง์ ํ ์ฑ๋์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
| ๋ช ๋ น์ด | ์ค๋ช |
|---|---|
/๋ฟ๋ฆฌ๊ธฐ |
์ง์ ๊ธ์ก์ ์ง์ ์ธ์์๊ฒ ์ ์ฐฉ์ ๋๋ค ๋ถ๋ฐฐ |
/๋์ค |
ํ๋ฃจ 1ํ 10,000์ ์ง๊ธ |
/์์ก |
๋ณด์ ๊ธ์ก ํ์ธ |
/์์ |
๊ธธ๋ ๋ด ๋ณด์ ๊ธ์ก ์์ |
/์ก๊ธ |
๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ์ก๊ธ |
/๊ฐ์๋ฐ์๋ณด |
์น๋ฆฌ 2๋ฐฐ, ๋ฌด์น๋ถ ์ ๋ฐ, ํจ๋ฐฐ ์์ค |
/๋๋ฐ |
30-70% ๋๋ค ํ๋ฅ , ์ฑ๊ณต ์ 2๋ฐฐ |
/์ฆ์๋ณต๊ถ |
300์ ๋ณต๊ถ ๊ตฌ๋งค |
/์ฌ๋ค๋ฆฌ |
3๊ฐ ์ฌ๋ค๋ฆฌ ์ค 1๊ฐ ๋น์ฒจ ์ ํ |
/์ฌ๋กฏ |
3๊ฐ ์ฌ๋กฏ ์ผ์น ์ ๋ฐฐ๋น |
/๋ธ๋์ญ |
Hit/Stand/Double, ๋ธ๋์ญ 1.5๋ฐฐ ์ถ๊ฐ ๋ฐฐ๋น |
์์
๋ช
๋ น์ /์ฑ๋์ค์ ๊ธฐ๋ฅ:์์
์ผ๋ก ์ฑ๋์ ์ ํํ ์ ์์ต๋๋ค.
| ๋ช ๋ น์ด | ์ค๋ช |
|---|---|
/์์
|
์ฌ์ ์ํ์ ๋ฒํผ ํจ๋ ํ์ |
/์ฌ์ |
YouTube URL ๋๋ ๊ฒ์์ด ์ฌ์ |
/์ผ์์ ์ง |
ํ์ฌ ๊ณก ์ผ์์ ์ง |
/๋ค์์ฌ์ |
์ผ์์ ์ง๋ ๊ณก ์ฌ๊ฐ |
/์ ์ง |
์ฌ์ ์ ์ง ๋ฐ ์์ฑ ์ฑ๋ ํด์ฅ |
/์คํต |
ํ์ฌ ๊ณก ๊ฑด๋๋ฐ๊ธฐ |
/๋๊ธฐ์ด |
ํ์ฌ ๋๊ธฐ์ด ์กฐํ |
/๊ตฌ๊ฐ์ด๋ |
์ฌ์ ์์น ์ด๋ |
/๋ฐ๋ณต |
๋ฐ๋ณต ๋ชจ๋ on/off |
/๋๊ธฐ์ด์ญ์ |
์ง์ ๋ฒํธ์ ๋๊ธฐ์ด ํญ๋ชฉ ์ญ์ |
/๋๊ธฐ์ด๋น์ฐ๊ธฐ |
๋๊ธฐ์ด ์ ์ฒด ๋น์ฐ๊ธฐ |
/๋๊ธฐ์ด์ด๋ |
๋๊ธฐ์ด ์์ ๋ณ๊ฒฝ |
/์
ํ |
๋๊ธฐ์ด ๋ฌด์์ ์๊ธฐ |
| ๋ช ๋ น์ด | ์ค๋ช |
|---|---|
/ํํฐ |
ํ์ฌ ์์ฑ๋ ํํฐ ๋ชฉ๋ก ์กฐํ |
/ํํฐ์์ฑ |
๋น๊ณต๊ฐ ์นดํ ๊ณ ๋ฆฌ/ํ ์คํธ/์์ฑ ์ฑ๋ ์์ฑ |
/ํํฐ์ด๋ |
ํํฐ์ ์ ์ ๋ฅผ ์ ํํด ์ด๋ |
/ํํฐ์ฐธ๊ฐ |
ํํฐ ์ฐธ๊ฐ |
/ํํฐ์ |
ํํฐ ๋ฉค๋ฒ ๋ชฉ๋ก ์กฐํ |
/ํํฐํํด |
ํํฐ ๊ถํ ํด์ |
/ํํฐํด์ |
ํํฐ ์ญ์ |
| ๋ช ๋ น์ด | ์ค๋ช |
|---|---|
/ํ์จ |
ํ๊ตญ์ํ ECOS ๊ธฐ์ค ์ต์ ํ์จ๊ณผ ๊ธฐ๋ณธ 30์ผ ๊ทธ๋ํ, ์ต๋ 365์ผ |
/์ธํ๋ณด์ ์ก |
ํ๊ตญ์ํ ECOS ๊ธฐ์ค ์ต์ ์ธํ๋ณด์ ์ก๊ณผ ๊ธฐ๋ณธ 12๊ฐ์ ๊ทธ๋ํ, ์ต๋ 60๊ฐ์ |
- ๋จ์ผ ์ปค์คํ ์ด๋ชจ์ง ์ ๋ ฅ ์ ์๋ณธ ํฌ๊ธฐ ์ด๋ฏธ์ง ์ถ๋ ฅ
- ์ผ๋ฐ ๋ฉ์์ง๋ฅผ
USER_MESSAGES์ ์บ์ํด AI ์ปจํ ์คํธ๋ก ์ฌ์ฉ - ๋ฉ์์ง ๋ด YouTube ๋งํฌ ๊ฐ์ง ํ ์์ฝ UI ์ ๊ณต
- ํน์ ์ฑ๋์
1557๊ฐ์ง ๋ฐ ์ฃผ๊ฐ ๋ฆฌํฌํธ ์ง๊ณ
| ์ฃผ๊ธฐ | ์์ |
|---|---|
| 60์ด | Discord presence ๊ฐฑ์ |
| ๋งค์ผ 00:00 KST | ์ต๊ทผ ๋ฉ์์ง ์ฌ๋ก๋ฉ, ๊ธฐ๋ ์ผ/DDAY/์ฌ๋ฐ์ด๋ฉ์ดํ refresh |
| ๋งค์ผ 00:01 KST | ์ฃผ๊ฐ 1557 ๋ฆฌํฌํธ ์กฐ๊ฑด ํ์ธ |
| 60์ด | YouTube WebSub/Atom feed ํ๋ณด ํ์ธ |
| 10๋ถ | YouTube ์ปค๋ฎค๋ํฐ ๊ฒ์๋ฌผ polling |
| 3๋ถ | MapleStory ๊ณต์ง polling |
| 3๋ถ | ๋ก์คํธ์ํฌ ๊ณต์ง polling |
| 12์๊ฐ | YouTube WebSub ๊ตฌ๋ ๊ฐฑ์ |
| 30์ด | ์์ฝ ๋ฉ์์ง ๋ฐ์ก ํ์ธ |
cogs/status_api๊ฐ aiohttp.web ์๋ฒ๋ฅผ ์คํํฉ๋๋ค. ๊ธฐ๋ณธ ํฌํธ๋ 1557์ด๋ฉฐ API_PORT๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
| Method | Path | ์ค๋ช |
|---|---|---|
GET |
/ |
๊ฐ๋จํ ์ํ ๋ฌธ์์ด |
GET |
/health |
bot readiness, latency, uptime, guild/user/message count, schema version |
POST |
/celebration/update |
๊ธฐ๋ ์ผ ๊ณต์ง ์๋ ๊ฐฑ์ |
GET |
/youtube/websub |
YouTube WebSub challenge ๊ฒ์ฆ |
POST |
/youtube/websub |
YouTube Atom notification ์์ |
/celebration/update๋ X-API-Key: <CELEBRATION_UPDATE_API_KEY> ํค๋๊ฐ ํ์ํฉ๋๋ค. JSON body ๋๋ query string์ผ๋ก guild_id๋ฅผ ๋๊ธฐ๋ฉด ํน์ ๊ธธ๋๋ง ๊ฐฑ์ ํ๊ณ , ์๋ตํ๋ฉด ๊ธฐ๋
์ผ ์ฑ๋์ด ์ค์ ๋ ๋ชจ๋ ๊ธธ๋๋ฅผ ๋์์ผ๋ก ํฉ๋๋ค.
WebSub callback์ YOUTUBE_WEBSUB_VERIFY_TOKEN์ query์ token ๋๋ hub.verify_token์ผ๋ก ๊ฒ์ฆํฉ๋๋ค. ๋ฐฐํฌ ๋ฐํ์์์๋ ์ด ๊ฐ์ด ํ์์
๋๋ค.
MySQL์ ์ฌ์ฉํฉ๋๋ค. ์ฑ์ ์์ ์ schema version๋ง ํ์ธํ๊ณ , ์ค์ DDL ์ ์ฉ์ scripts/migrate_db.py์์ ์ํํฉ๋๋ค.
์ฃผ์ ํ ์ด๋ธ:
guild,discord_userchannel_settingssetting_datagambling_balancesscheduled_messagespanel_messagesmusic_favoritescounter_1557youtube_subscriptionsdday_eventsspecial_daysschema_migrations
๋ง์ด๊ทธ๋ ์ด์ ์คํ:
python -m scripts.migrate_db.env๋ ๋ก์ปฌ ์คํ์ฉ, .env.deploy๋ ๋ฐฐํฌ ์คํ์ฉ์
๋๋ค. ๋ ๋ค secret ํ์ผ์ด๋ฉฐ Git์ ํฌํจํ์ง ์์ต๋๋ค.
์ฒ์ ์ค์ ํ ๋๋ .env.example์ ๋ณต์ฌํด ์ค์ ๊ฐ์ ์ฑ์๋๋ค.
ํ์/์ฃผ์ ๊ฐ:
DISCORD_TOKEN=...
OPENAI_KEY=...
GOOGLE_API_KEY=...
RIOT_KEY=...
ECOS_API_KEY=...
SONPANNO_GUILD_ID=...
SSAFY_GUILD_ID=...
DB_HOST=localhost:3306
DB_DATABASE=...
DB_USERNAME=...
DB_PASSWORD=...
API_PORT=1557
CELEBRATION_UPDATE_API_KEY=...
VOICE_CHAT_WHISPER_DEVICE=cpu
VOICE_CHAT_WHISPER_MODEL=tiny
VOICE_CHAT_WHISPER_COMPUTE_TYPE=int8
TZ=Asia/Seoul
YOUTUBE_WEBSUB_CALLBACK_URL=https://example.com/youtube/websub
YOUTUBE_WEBSUB_VERIFY_TOKEN=...Docker ๋ฐฐํฌ์์ MySQL์ด ํธ์คํธ loopback์ ๋ฐ์ธ๋ฉ๋์ด ์์ผ๋ฉด DB_HOST=host.docker.internal:3306์ฒ๋ผ Docker host gateway๋ฅผ ๊ฐ๋ฆฌ์ผ์ผ ํฉ๋๋ค.
Python 3.11 ๊ธฐ์ค์ผ๋ก ์คํํฉ๋๋ค.
pip install -r requirements.txt
python -m scripts.migrate_db
python bot.pyWindows์์๋ ์๋ ์คํฌ๋ฆฝํธ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
.\_launchBot.ps1๋๋:
_launchBot.batpip_install.txt๋ legacy/manual ์ค์น ๋ฉ๋ชจ์ด๋ฉฐ, ๊ธฐ๋ณธ dependency entrypoint๋ requirements.txt์
๋๋ค.
docker build -f Dockerfile.deps -t bot-discord-bot-deps:latest .
docker compose --env-file .env up -d --build
docker compose --env-file .env psCompose๋ 127.0.0.1:1557:1557๋ก Status API๋ฅผ ๋
ธ์ถํ๊ณ , ์ปจํ
์ด๋์์ ํธ์คํธ DB ์ ๊ทผ์ ์ํด host.docker.internal host gateway๋ฅผ ์ถ๊ฐํฉ๋๋ค. Whisper ๋ค์ด๋ก๋๋ whisper-model-cache named volume์ ๋ณด์กด๋๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์ด๋ ๊ต์ฒด ๋ ๊ฐ์ ๋ชจ๋ธ์ ๋ค์ ๋ฐ์ง ์์ต๋๋ค. Docker json-file ๋ก๊ทธ๋ ๊ธฐ๋ณธ 10MB ํ์ผ 3๊ฐ๋ก ํ์ ํ๋ฉฐ BOT_LOG_MAX_SIZE์ BOT_LOG_MAX_FILES๋ก ์กฐ์ ํ ์ ์์ต๋๋ค.
์ฝ๋ ๋ณ๊ฒฝ ํ ๊ธฐ๋ณธ ๊ฒ์ฆ:
python -m compileall -q bot.py api cogs common func util test
python -m unittest discover -s testtest/๋ importable package๊ฐ ์๋๋ฏ๋ก focused test๋ discovery mode๋ก ์คํํฉ๋๋ค.
python -m unittest discover -s test -p "test_scheduler.py"Docker/Jenkins์ ๋ง์ถฐ DB migration๊น์ง ํ์ธํ ๋:
python -m scripts.migrate_db
python -m compileall -q bot.py api cogs common func util test
python -m unittest discover -s testJenkinsfile์ ์์ pipeline์ผ๋ก ๋ค์ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค.
- Checkout
.env.deploy๋ณต์ ๋ฐ Docker ํ๊ฒฝ ํ์ธ- dependency image ๊ธฐ๋ฐ
compileall/unittest๊ฒ์ฆ - DB migration ์คํ
scripts/jenkins_deploy.sh๋ก Docker Compose ๋ฐฐํฌ- ๋ฐฐํฌ ๋ก๊ทธ์ ์ํ ๋ฉํ๋ฐ์ดํฐ ๋ณด๊ด
Jenkins ๋ฐฐํฌ๋ Secret text credential discordbot-env์์ .env.deploy ๋ด์ฉ์ ๋ณต์ํ๋๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ๋ฐฐํฌ ํ๊ฒฝ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋ค๋ฉด ์ ์ฅ์ diff๋ง์ผ๋ก๋ ๋ฐฐํฌ ๊ฐ์ด ๋ฐ๋์ง ์์ผ๋ฏ๋ก Jenkins credential์ Secret text payload๋ ๊ฐ์ ๋ด์ฉ์ผ๋ก ๊ฐฑ์ ํด์ผ ํฉ๋๋ค.
๋ฐฐํฌ ์คํฌ๋ฆฝํธ ์ง์ ์คํ ์:
ENV_FILE=.env.deploy ./scripts/jenkins_deploy.sh auto
ENV_FILE=.env.deploy ./scripts/jenkins_deploy.sh restart
ENV_FILE=.env.deploy ./scripts/jenkins_deploy.sh force- I/O, HTTP, DB ์์ ์ async ๊ธฐ๋ฐ์ผ๋ก ์์ฑํฉ๋๋ค.
- HTTP client๋
aiohttp๋ฅผ ์ฐ์ ์ฌ์ฉํฉ๋๋ค. - ๊ธธ๋๋ณ ์ฑ๋ ์ค์ ์
util/guild/channel_settings.pyhelper๋ฅผ ์ฌ์ฉํฉ๋๋ค. - ๊ธฐ๋ฅ ์ํ๋
setting_data๋๋ ์ ์ฉ ํ ์ด๋ธ์ ์ ์ฅํ๊ณ ๋ก์ปฌ JSON ํ์ผ์ ์๋ก ๋ง๋ค์ง ์์ต๋๋ค. - ๊ฒฝ๋ก ์ฒ๋ฆฌ๋
pathlib๋๋bot.py์BASE_DIR๊ธฐ๋ฐ์ผ๋ก ์์ฑํฉ๋๋ค. - ์ฌ์ฉ์์๊ฒ ๋ณด์ด๋ ์คํจ๋ Discord ๋ฉ์์ง๋ก ์์ ํ๊ฒ ์๋ดํ๊ณ , ๋ด๋ถ ์์ธ๋ traceback๊ณผ ํจ๊ป ๋ก๊ทธ์ ๋จ๊น๋๋ค.
.env,.env.deploy, ๋ด๋ถ URL, ๋ก์ปฌ ์ ๋ ๊ฒฝ๋ก, private ์ด์ ์ธ๋ถ์ฌํญ์ ์ปค๋ฐํ์ง ์์ต๋๋ค.