Skip to content

๐Ÿคฉ ์Šฌ๋ž™ ์›นํ›…์œผ๋กœ ๋ฆฌ์•ก์…˜(reaction)์„ ๋ฐ›์•„์„œ ์ด๋ชจ์ง€(Emoji) ๋žญํ‚น์„ ๊ตฌํ•˜๋Š” ์›นํ›… ์„œ๋น„์Šค ์ž…๋‹ˆ๋‹ค!

License

Notifications You must be signed in to change notification settings

JAY-Chan9yu/heymoji

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Hey + Emoji = Heymoji

๊ฐœ๋ฐœ์ž์˜ ํ•œ๋งˆ๋”” ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป

๋งํฌ๋“œ์ธ์—์„œ ๋งคํ”„ ๋ฉค๋ฒ„๋“ค์ด ์„œ๋กœ ํ† ๋งˆํ† ๋ฅผ ์ฃผ๋Š” ์ด์œ ๋Š”? ๋ผ๋Š” ๊ธ€์„ ์ฝ๊ณ , ์Šฌ๋ž™ ์ด๋ชจ์ง€(Emoji)๋กœ ๋ฉค๋ฒ„๋“ค์—๊ฒŒ ์นญ์ฐฌ์ด๋‚˜ ๋ฆฌ์ŠคํŽ™ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธํ™”๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด ์žฌ๋ฐŒ๊ธฐ๋„ ํ•˜๊ณ  ๊ณ ๋งˆ์›€๋„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ์žฌ๋ฏธ๋‚œ ๊ธฐ๋Šฅ์€ ์˜คํ”ˆ์†Œ์Šค๋กœ ๊ณต๊ฐœํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ํ† ์ด ํ”„๋กœ์ ํŠธ๋กœ ๋งŒ๋“ค์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
(๊ทผ๋ฐ Nodejs๋กœ ๋งŒ๋“ค์–ด์ง„๊ฒŒ ์ด๋ฏธ ์žˆ์—ˆ๋„ค์š” heyburrito)

์ข€ ๋” ์žฌ๋ฏธ๋‚œ ๊ธฐ๋Šฅ + ์™„์„ฑ๋„ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ๋˜๊ธฐ์œ„ํ•ด ์œ ์ง€๋ณด์ˆ˜๋Š” ์ง€์†์ ์œผ๋กœ ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.๐Ÿ’ช
FastAPI์— ๊ตฌ์กฐ๋‚˜ ํ”„๋กœ์ ํŠธ ๊ด€๋ จ๋œ ์ถ”๊ฐ€๊ธฐ๋Šฅ, ๊ฐœ์„ ์‚ฌํ•ญ PR์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค!


๐Ÿ‘‹ ๊ฐœ์š”

ํ—ค์ด๋ชจ์ง€

Heymoji API์„œ๋ฒ„๋Š” Python 3.10, FastAPI ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ์™ธ ๋ฒ„์ „์—์„œ ํŒจํ‚ค์ง€ ๋ฐ ๋™์ž‘์— ๋Œ€ํ•œ ํ˜ธํ™˜์€ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๊ทผ๋ฐ ๊ฑฐ์˜ ๋‹ค ๋ ๊ฑฐ์—์š” python3.7 ์ด์ƒ์ด๋ฉด...์•„๋งˆ๋‘~๐Ÿ˜ )
ํ”„๋ก ํŠธ์—”๋“œ๋Š” vuejs๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ„๋‹จํžˆ ๋งŒ๋“ค์–ด ๋ดค์Šต๋‹ˆ๋‹ค!


๐Ÿ›  ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

์ฒ˜์Œ Heymoji๋ฅผ ๊ฐœ๋ฐœํ• ๋•Œ๋Š” DDD ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค.
DDD์— ๋Œ€ํ•œ ์Šคํ„ฐ๋””๋ฅผ ์œ„ํ•ด ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์œผ๋ฉฐ https://github.com/Ermlab/python-ddd ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๋‹ค์†Œ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ถ”ํ›„ ์œ ์ง€๋ณด์ˆ˜์™€ ์—ฌ๋Ÿฌ ์ƒํƒœ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ DDD๊ฐ€ ์ข€ ๋” ์œ ์—ฐํ•  ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค๐Ÿ˜

โ”œโ”€โ”€ apps
|   โ”œโ”€ api 
|   |  โ”œโ”€โ”€ dependancy
|   |  โ””โ”€โ”€ router
|   โ”œโ”€ applications 
|   |  โ””โ”€โ”€ services (Application Service)
|   โ”œโ”€ domains
|   |  โ””โ”€ user (๋„๋ฉ”์ธ)
|   |     โ”œโ”€ entities.py 
|   |     โ”œโ”€ services.py (Domain Service)
|   |     โ”œโ”€ repositories.py
|   |     โ””โ”€ schemas.py	
|   โ”œโ”€ infrastructure (infra ๊ด€๋ จ ์ •์˜ ๊ตฌ์กฐ)
|   โ”œโ”€ utils
|   โ”œโ”€ tests
|   โ””โ”€ main.py
โ”œโ”€โ”€ conf
|   โ””โ”€โ”€ settings.py
โ”œโ”€โ”€ scripts
โ”œโ”€โ”€ migrations (alembic DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์„ค์ •)
โ”œโ”€โ”€ seed_work (ํ”„๋กœ์ ํŠธ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ด์•ผํ•˜๋Š” ์ž‘์—…, ์ฝ”๋“œ)
โ”œโ”€โ”€ alembic.ini
โ”œโ”€โ”€ requirements.txt
โ”œโ”€โ”€ docker-compose.yaml
โ”œโ”€โ”€ Dockerfile
โ”œโ”€โ”€ web.Dockerfile
โ”œโ”€โ”€ .env_sample
โ””โ”€โ”€ frontend (heymoji ์›นํŽ˜์ด์ง€ ๊ด€๋ จ ์ฝ”๋“œ)

๐Ÿ’พ ์„ธํŒ…

.env_sample์„ ์ฐธ๊ณ ํ•ด์„œ .envํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์›ํ•˜์‹œ๋Š” ์„ธํŒ…์œผ๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋“ค์„ ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค.
DB๋Š” MySQL์„ ์‚ฌ์šฉํ•˜๋ฉฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด aiomysql๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋‹ค๋ฅธ DB ์‚ฌ์šฉํ•˜๋ ค๋ฉด config ์„ค์ •์ด ์กฐ๊ธˆ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„ ์„ค๋ช…
ENV ๋ฐฐํฌํ™˜๊ฒฝ ์ •์˜
ALLOW_ORIGINS CORS๋ฅผ ํ—ˆ์šฉํ•  ORIGIN ๋ฆฌ์ŠคํŠธ
DB_HOST DB ํ˜ธ์ŠคํŠธ
DB_PORT DB ํฌํŠธ
DATABASE DB ์ด๋ฆ„
DB_USERNAME DB ์ ‘์† ์œ ์ €๋„ค์ž„
DB_PASSWORD DB ํŒจ์Šค์›Œ๋“œ
SLACK_TOKEN ์Šฌ๋ž™ ํ† ํฐ
BOT_NAME ์Šฌ๋ž™๋ด‡ ์ด๋ฆ„
ERROR_CHANNEL ์Šฌ๋ž™ ์—๋Ÿฌ ๋ฆฌํฌํŒ… ์ฑ„๋„
SPECIAL_EMOJI ํŠน๋ณ„ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ์ด๋ชจ์ง€
LIMIT_GIVE_COUNT_OF_SPECIAL_EMOJI ๋งค์›” ๋‹ค๋ฅธ ๋ฉค๋ฒ„์—๊ฒŒ ์ค„ ์ˆ˜ ์žˆ๋Š” SPECIAL_EMOJI ์ œํ•œ ๊ฐœ์ˆ˜
ALLOWED_REACTION_LIST ์›นํ›… ๋ฆฌ์•ก์…˜์œผ๋กœ ํ—ˆ์šฉ๋œ ์ด๋ชจ์ง€(reaction)๋“ค์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
ALLOWED_EMOJI_TYPES ํ•ธ๋“ค๋งํ•  ์ด๋ชจ์ง€๋“ค์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
RANK_URL ๋žญํ‚น ์›นํŽ˜์ด์ง€ URK
DEFAULT_AVATAR_URL ๊ธฐ๋ณธ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ URL

๐Ÿณ Docker-Compose ์‹คํ–‰

.env_sample์„ ์ฐธ๊ณ ํ•˜์—ฌ.envํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ๋’ค docker-compose up -d ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
api, web, db ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ชจ๋‘ ์‹คํ–‰ ๋œ ํ›„ http://127.0.0.1:8080 ์— ์ ‘์†ํ•˜์—ฌ ๋™์ž‘์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
โ—๏ธ์ฃผ์˜: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋œจ๊ณ  ํŒจํ‚ค์ง€ ์„ค์น˜์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด์ˆ˜ ์žˆ์–ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰๊นŒ์ง€ ๋ช‡๋ถ„์ด ์†Œ์š” ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-01-02 แ„‹แ…ฉแ„’แ…ฎ 10 54 35

docker-comopse ์‹คํ–‰ ์ „์— README ํ•˜๋‹จ์— ์žˆ๋Š” Slack Bot ์„ค์ •์„ ๋จผ์ € ๋ณด์‹œ๊ณ  SlackToken ๊ฐ™์€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋จผ์ € ์ฃผ์ž…ํ•ด์ฃผ์„ธ์š”!


๐Ÿ’ก ๋กœ์ปฌ ์‹คํ–‰

pip install -r requirements

root๊ฒฝ๋กœ(/heymoji) ์— ๊ฐ€์„œ uvicorn์œผ๋กœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค.
๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” &๋ฅผ ๋งˆ์ง€๋ง‰์— ๋ถ™์—ฌ์ฃผ์„ธ์š”.

uvicorn app.main:app --port 8080

๋งŒ์•ฝ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ๊ฑฐํ•˜๊ณ ์‹ถ์€ ๊ฒฝ์šฐ

1. ps aux | grep uvicorn
2. kill -9 {PID} 

์ž˜๋ชป๋œ ํ”„๋กœ์„ธ์Šค kill์„ ์ฃผ์˜ํ•˜์„ธ์š”!


๐Ÿ“ API ๋ฌธ์„œ ๋ฐ ํ…Œ์ŠคํŠธ

HOST_URL/docs๋กœ ์ ‘์†ํ•˜๋ฉด Swagger๋กœ ๋งŒ๋“ค์–ด์ง„ web ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (FastAPI๋Š” swagger, redoc ์ง€์›)

API ๋ฌธ์„œ ๋ฐ ํ…Œ์ŠคํŠธ



๐Ÿ‘พ ์Šฌ๋ž™ ๋งจ์…˜ ๋ช…๋ น์–ด

์ด๋ฆ„ ์„ค๋ช…
help ์ปค๋ฉ˜๋“œ ๊ด€๋ จ help
create_user user ์ƒ์„ฑ
update_user user ์ •๋ณด ์—…๋ฐ์ดํŠธ
show_user ์œ ์ € is_display = True (๋…ธ์ถœ)
hide_user ์œ ์ € is_display = False (์ˆจ๊น€)
show_best_member ํ•ด๋‹น์›” ๋ฒ ์ŠคํŠธ ๋ฉค๋ฒ„ ์ถ”์ถœ
๐Ÿฅณ ๋ฉค๋ฒ„ ๋“ฑ๋ก
์ด๋ฆ„์€ ํ•„์ˆ˜ ์ž…๋‹ˆ๋‹ค!
@EmojiBot --create_user --name=์ด๋ฆ„ --avatar_url=์ด๋ฏธ์ง€URL --department=๋ถ€์„œ

๐Ÿ›  ๋ฉค๋ฒ„ ์ •๋ณด ์—…๋ฐ์ดํŠธ
์—…๋ฐ์ดํŠธํ•  ์ •๋ณด๋งŒ ์ ์–ด์ฃผ์„ธ์š”!
@EmojiBot --update_user --avatar_url=์ด๋ฏธ์ง€URL

๐ŸŽ– ์ด๋ฒˆ๋‹ฌ ๋ฒ ์ŠคํŠธ ๋ฉค๋ฒ„ ๋ฆฌ์ŠคํŠธ ์ถ”์ถœ
@EmojiBot --show_best_member --year=2022 --month=1

๐Ÿ™ˆ ์œ ์ € ์ˆจ๊ธฐ๊ธฐ
@EmojiBot --hide_user --slack_id=์Šฌ๋ž™ID

๐Ÿ™‰ ์œ ์ € ๋ณด์ด๊ธฐ
@EmojiBot --show_user --slack_id=์Šฌ๋ž™ID

๐ŸŽ– show_best_member ์˜ˆ์‹œ

show_best_member ์˜ˆ์‹œ

๐Ÿš€ Postman ์œผ๋กœ ์œ ์ € ๋“ฑ๋ก ์˜ˆ์‹œ

ํฌ์ŠคํŠธ๋งจ ๋“ฑ๋ก ์˜ˆ์‹œ



๐ŸงŸโ€โ™‚๏ธ ํ”„๋กœ์„ธ์Šค Live ์ฒดํฌ (์„ ํƒ)

shell script๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ Live ์ฒดํฌ๋ฅผ ์ง„ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ํฌ๋ก ํƒญ์— 1๋ถ„๋งˆ๋‹ค ์‹คํ–‰ํ•˜๋„๋ก ๋“ฑ๋ก.
๋กœ๊น…๋„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

#! /bin/bash
PYTHON_PATH=/{{ path }}/venv/bin/python
SCRIPT_PATH=/{{ path }}/heymoji/app

checker=`ps aux | grep -v "grep" | grep "{{ ๊ฒ€์ƒ‰ํ•  ์ด๋ฆ„}}" | wc -l`

if [ "$checker" == "0" ]; then
	source '{{ path }}/venv/bin/activate'
	cd $SCRIPT_PATH && `uvicorn main:app --port 8080 &`
fi

๐Ÿค– Slack Bot ์„ค์ •

https://api.slack.com/apps ์— ์ ‘์†ํ•˜์—ฌ create app ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ํ›„,
์›ํ•˜๋Š” workspace์— app์„ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”!

Basic Information ํƒญ์„ ํด๋ฆญํ›„ ํ•˜๋‹จ์—์„œ app์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  Save ํ•ด์ค๋‹ˆ๋‹ค.
์ด๊ฑด ์•ˆํ•ด๋„ ๋˜์ง€๋งŒ ํ•˜๋Š”๊ฒŒ ์ข‹์•„์š”. ์™œ๋ƒํ•˜๋ฉด ๋ฉ‹์žˆ๊ฑฐ๋“ ์š”๐Ÿ˜Ž

Add features and functionality์—์„œ Event Subscriptions์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

Event๋ฅผ Enable(ํ™œ์„ฑํ™”) ์‹œํ‚จํ›„ Requst URL์„ ๋„ฃ์–ด์„œ ์ธ์ฆ์„ ํ•ฉ๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-01-02 แ„‹แ…ฉแ„’แ…ฎ 10 12 32

์œ„ ํ™”๋ฉด์—์„œ ์Šฌ๋ž™ํ† ํฐ์„ copyํ•˜์—ฌ .env ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•ด ngrok์„ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ํŽธํ•ฉ๋‹ˆ๋‹ค.์‹ค์ œ prod ํ™˜๊ฒฝ์—์„œ๋Š” Nginx + uvicorn์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ๋˜์š”!
Nginx Config ์—์„œ proxy_pass ๋งŒ uvicorn์œผ๋กœ ์‹คํ–‰ํ•œ ๋กœ์ปฌ ์„œ๋ฒ„๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

Heymoji๋Š” ์Šฌ๋ž™ ๋ฉค๋ฒ„๋“ค์˜ reaction_added, reaction_removed ์ด๋ฒคํŠธ์™€ bot์„ ํ˜ธ์ถœํ•˜๋Š” app_mention ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์Šฌ๋ž™๋ด‡๊ณผ DM์„ ํ†ตํ•ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” message.im์„ ์„ ํƒํ•˜๊ณ  Message Tab ๊ธฐ๋Šฅ์„ on ์‹œ์ผœ์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ app์„ workspace์— ์„ค์น˜(install)ํ•˜๋ฉด ์„ค์ •ํ•œ ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚ ๋•Œ๋งˆ๋‹ค slack์—์„œ Heymoji์„œ๋ฒ„๋กœ ์›นํ›… api๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

About

๐Ÿคฉ ์Šฌ๋ž™ ์›นํ›…์œผ๋กœ ๋ฆฌ์•ก์…˜(reaction)์„ ๋ฐ›์•„์„œ ์ด๋ชจ์ง€(Emoji) ๋žญํ‚น์„ ๊ตฌํ•˜๋Š” ์›นํ›… ์„œ๋น„์Šค ์ž…๋‹ˆ๋‹ค!

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published