Discord Bot Construction Kit ๐Ÿค–

์ข‹์•„. ๊ทธ๊ฑด ์ข€ ์‹ค๋ง์Šค๋Ÿฌ์šด๋ฐ, ์ง€์› ์‚ฌ๋ก€๋ฅผ ๋” ์ž˜ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ๋””์Šค์ฝ”๋“œ์˜ ์ง€์› ์ฑ„๋„์— ์Šค๋ ˆ๋“œ๋ฅผ ์˜๋ฌดํ™”ํ–ˆ๊ฑฐ๋“ . ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋ ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ๋‹คํ–‰ํžˆ ๋‹ค๋ฅธ ์žฅ์ ๋“ค์ด ์žˆ์–ด.

API์— ๋Œ€ํ•œ ์˜ˆ์ƒ ์™„๋ฃŒ ์‹œ์ (ETA)์ด ์žˆ๊ณ , ์ด ๊ธฐ๋Šฅ์„ ๋ฐฑ์—”๋“œ์—์„œ ์ง€์›ํ•˜๋ ค๋ฉด ๋น„์šฉ์ด ์–ผ๋งˆ๋‚˜ ๋“ค์ง€ ๊ฐ์ด ์™€?

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

/k

2๊ฐœ์˜ ์ข‹์•„์š”

์ตœ๊ทผ์— ๊ด€๋ จํ•ด์„œ ์ถ”์ ์„ ์ง„ํ–‰ํ–ˆ๊ณ , ์ด๋ฏธ ์ƒ๋‹น ์‹œ๊ฐ„ ๊ฐœ๋ฐœ์ด ์ง„ํ–‰ ์ค‘์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ถ”์ ์„ ์ง„ํ–‰ํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์ง€๋งŒ, ๊ฒฝ๊ณ ํ•˜๊ฑด๋Œ€, ๋งˆ์ง€๋ง‰์— ๊ทธ๋“ค์€ "์™„์„ฑ๋  ๋•Œ ์™„์„ฑ๋˜๋Š” ๊ฒƒ"์ด๋ผ๊ณ  ํ•˜๋”๊ตฐ์š” โ€ฆ ์˜คํ”ˆ ์†Œ์Šค์˜ ๋ฌธ์ œ๋Š” ์ ์ ˆํ•œ ์ˆ˜์ค€์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ž๊ธˆ(๋˜๋Š” ์ž๊ธˆ ๋ถ€์กฑ)์„ ์ง‘์ค‘๋ ฅ๊ณผ ์šฐ์„ ์ˆœ์œ„ ์„ค์ •์„ ๋•๊ธฐ ์œ„ํ•ด ํšจ๊ณผ์ ์œผ๋กœ ๋ฐฐ๋ถ„ํ•  ์ข‹์€ ๋ฐฉ์‹์ด ์ข…์ข… ๋ถ€์กฑํ•˜๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค โ€ฆ ์ง€์ผœ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค โ€ฆ

์ œ ์ž…์žฅ์—์„œ๋Š” ์ตœ์ข… ๊ตฌํ˜„์„ ํ™•์ธํ•ด์•ผ๋งŒ ์ž‘์—…๋Ÿ‰์„ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋„์ „์˜ ์ ์€ ๋ฉ”์‹œ์ง€ ์ž์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•˜์ง€๋งŒ, Threads๋ฅผ Topics์™€ ๋™๊ธฐํ™”ํ•˜๋ ค๋ฉด Discourse์—์„œ Discord Threads๋ฅผ Discourse Topics์— ๋งคํ•‘ํ•˜๋Š”ๆŸ็ง์˜ ๋งคํ•‘(์˜ˆ: ์‚ฌ์šฉ์ž ์ •์˜ ํ•„๋“œ ๋˜๋Š” ํ…Œ์ด๋ธ”)์„ ์œ ์ง€ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Thread์— ์ƒˆ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ Discourse์˜ ์–ด๋””์— ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐฐ์น˜ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›ํ•˜์‹œ๋Š” ์ •ํ™•ํ•œ ๊ธฐ๋Šฅ/๋™์ž‘ ๋ฐฉ์‹์„ ์ข€ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹ค ์ˆ˜ ์žˆ์„๊นŒ์š”?

2๊ฐœ์˜ ์ข‹์•„์š”

์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์—†๋Š” ๊ฒƒ์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฑด ์ •๋ง ๋‹ต๋‹ตํ•œ ์ผ์ด์ฃ .

์ œ ์•„์ด๋””์–ด๋Š” ๋””์Šค์ฝ”๋“œ์™€ ๋””์Šค์ปค์Šค๊ฐ€ ์„œ๋กœ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž˜ ๋ณด์™„ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋””์Šค์ฝ”์–ด ๋ธ”๋กœ๊ทธ์˜ ๊ธฐ์‚ฌ์™€ ํ† ๋ก ์—์„œ ํฐ ์˜๊ฐ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ €ํฌ๊ฐ€ ๋””์Šค์ฝ”๋“œ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•œ ์ง€ ๊ฑฐ์˜ ๋‘ ๋‹ฌ์ด ์ง€๋‚ฌ์ง€๋งŒ, ์–ด๋–ป๊ฒŒ ๋ฐœ์ „ํ• ์ง€ ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด์— ๊ฑฐ์˜ ์„ค์ •ํ•˜์ง€ ์•Š์•˜๋˜ ๋””์Šค์ปค์Šค ํฌ๋Ÿผ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€๋Š” ์ •ํ™•ํžˆ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ๋„ ์‚ฌ๋žŒ๋“ค์ด ๊ธฐ์ˆ  ์ง€์› ์งˆ๋ฌธ์„ ์œ„ํ•ด ๋””์Šค์ปค์Šค์™€ ๋””์Šค์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์ €๋Š” FOSS ํ”„๋กœ์ ํŠธ์ธ CrowdSec์— ์ฐธ์—ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ๋””์Šค์ปค์Šค๋ฅผ ๋” ์žฅ๊ธฐ์ ์ธ ๊ธฐ์–ต ๊ณต๊ฐ„์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ๋””์Šค์ฝ”๋“œ ์ฑ„๋„๊ณผ ์ผ์น˜ํ•˜๋Š” ์ฃผ์ œ ์•„๋ž˜์—์„œ ๋””์Šค์ฝ”๋“œ ์Šค๋ ˆ๋“œ๋ฅผ ๋””์Šค์ปค์Šค๋กœ ๋™๊ธฐํ™”ํ•˜๋Š”(๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐ˜๋Œ€๋„) ์•„์ด๋””์–ด์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๊ณผ์ •์„ ํ›จ์”ฌ ๋” ํšจ๊ณผ์ ์œผ๋กœ(์˜ˆ: ์ž๋™ํ™”ํ•˜์—ฌ) ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ง์”€๋“œ๋ ธ๋“ฏ์ด ์ €๋Š” ์ตœ๊ทผ์— ๋””์Šค์ฝ”๋“œ์—์„œ ์Šค๋ ˆ๋“œ ์‚ฌ์šฉ์„ ๊ฐ•์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž ์ง€์›์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์Šค๋ ˆ๋“œ ์ „์ฒด๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ํ•ญ์ƒ ์‰ฌ์šด ์ผ์€ ์•„๋‹ˆ๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ๋””์Šค์ปค์Šค ๋™๊ธฐํ™”๋ฅผ ํ™œ์šฉํ•˜์—ฌ, ๋””์Šค์ฝ”๋“œ์˜ ์žก๋‹คํ•œ ๋Œ€ํ™”์— ๋„ˆ๋ฌด ๊นŠ์ด ๋น ์ง€์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๋‹ต๋ณ€ํ•ด์•ผ ํ•  ์งˆ๋ฌธ๋“ค์„ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ํ™œ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ๋‚ด์šฉ์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋“ค๋ฆฌ๋‚˜์š”? ๊ทธ๋ฆฌ๊ณ  ๋” ์งง์€ ์‹œ๊ฐ„ ์•ˆ์— ์ด๋ฅผ ๋‹ฌ์„ฑํ•  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ์š”?

2๊ฐœ์˜ ์ข‹์•„์š”

์•ˆ๋…•ํ•˜์„ธ์š” @merefield !

GitHub์—์„œ ์ž‘์„ฑํ•œ ์ด์Šˆ๊ฐ€ ํ™•์ธ๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์•„์„œ, ๋‹ค์Œ์œผ๋กœ ์ ์ ˆํ•œ ์žฅ์†Œ์ธ ์ด๊ณณ์—์„œ ์—ฐ๋ฝ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

image

Discord ๋ด‡ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ถ”์ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„ ์ด๋ฏธ์ง€๋Š” ์ธ์ŠคํŽ™ํŠธ ์—˜๋ฆฌ๋จผํŠธ(Inspect Element) ์˜ค๋ฅ˜๋ฅผ ๋ณด์—ฌ์ฃผ๋ฉฐ, ๊ฐœ์ธ ๋ฉ”์‹œ์ง€(PM)๋ฅผ ๋ณด๋‚ธ ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” ๋ฉ”์‹œ์ง€ ์ „์†ก ์‹œ "500 Error"๊ฐ€ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. PM์€ ์ •์ƒ์ ์œผ๋กœ ์ „์†ก๋˜์ง€๋งŒ, ์ด ์˜ค๋ฅ˜ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋น„ํ™œ์„ฑํ™”ํ•œ ํ›„์—๋Š” ๋ฌธ์ œ๊ฐ€ ๋” ์ด์ƒ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ /lib/discourse_event_handlers.rb ํŒŒ์ผ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. PM์ด post_created DiscourseEvent๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์—ฌ ๊ฒŒ์‹œ๋ฌผ์˜ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ posted_category = post.topic.category.id๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๋ ค๋‹ค ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถ”์ •๋ฉ๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ, ์ด ๋ฌธ์ œ๊ฐ€ ์กฐ์†ํžˆ ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

2๊ฐœ์˜ ์ข‹์•„์š”

๋ฆฌํฌํŠธ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋งž๋Š” ๋ง์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ฃผ์— ์‹œ๊ฐ„์„ ๋‚ด์„œ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ์„์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋„ค์š” โ€ฆ

2๊ฐœ์˜ ์ข‹์•„์š”

์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์—…๋ฐ์ดํŠธ๊ฐ€ ๋‚˜์˜ค๋ฉด ์ฃผ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. :+1:

2๊ฐœ์˜ ์ข‹์•„์š”

์š”์ฆ˜ ๊ณ ๊ฐ ์—…๋ฌด๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„ ๋‹น๋ถ„๊ฐ„ ์ด ์ด์Šˆ๋ฅผ ๋ฐ”๋กœ ํ™•์ธํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋™์•ˆ PR์€ ์ˆ˜๋ฝํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌด๋ฃŒ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋” ๋งŽ์€ ๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

2๊ฐœ์˜ ์ข‹์•„์š”

์š”์ฆ˜ ์ผ์ด ์ •๋ง ๋ฐ”๋น ์„œ, ํ•˜์ง€๋งŒ ์ˆ˜์ •์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋‚ด์šฉ์„ ์ปค๋ฐ‹ํ•ด ๋‘์—ˆ์–ด:

FIX: exclude private messages from bot event considerations ยท merefield/discourse-discord-bot@82b2109 (github.com)

์ด์ œ ์ž˜ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ ๊ฐ™๊ณ , PM์—์„œ ๋œจ๋˜ ๋ฌด์„œ์šด 500 ์—๋Ÿฌ๋„ ์‚ฌ๋ผ์กŒ์–ด โ€ฆ

2๊ฐœ์˜ ์ข‹์•„์š”

์˜ค, ์ •๋ง ํ›Œ๋ฅญํ•˜๋„ค์š”. Discord Chat์„ ๋Œ€์ฒดํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋„ค์š”!

Discourse์—์„œ ์Šฌ๋Ÿฌ๊ทธ(slug) ์ด๋ฆ„์„ ์ฝ์–ด์•ผ ํ•˜๋‚˜์š”, ์•„๋‹ˆ๋ฉด ์ œ๋ชฉ๋งŒ ์ฝ์œผ๋ฉด ๋˜๋‚˜์š”?

1๊ฐœ์˜ ์ข‹์•„์š”

Discord๋Š” ์Šฌ๋Ÿฌ๊ทธ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์–ต์ด ์ •ํ™•ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ œ๋ชฉ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

2๊ฐœ์˜ ์ข‹์•„์š”

์•ˆ๋…•ํ•˜์„ธ์š”, ์ด์ „์— ์งˆ๋ฌธ์ด ์žˆ์—ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, OAuth ์ž๊ฒฉ ์ฆ๋ช…์€ ์•ฑ๊ณผ ๋™์ผํ•ด์•ผ ํ•˜๋‚˜์š”? ํ˜„์žฌ ๋‹ค๋ฅธ ๋””์Šค์ฝ”๋“œ ๋™๊ธฐํ™” ํ†ตํ•ฉ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ , OAuth ํ•„๋“œ๊ฐ€ ์ด๋ฏธ ์ž…๋ ฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ข‹์•„์š”

์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ฝ”์–ด์— ํฌํ•จ๋œ ๊ณต์‹ ์†Œ์…œ ๋กœ๊ทธ์ธ ์†”๋ฃจ์…˜๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๋ด‡์—๋Š” ์Šน์ธ๋œ Discord ์•ฑ์—์„œ ๋ฐœ๊ธ‰๋œ ํ† ํฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋‘ ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•œ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๊ฐœ์˜ ์ข‹์•„์š”

๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์„ธํŒ…์—์„œ ์ œ๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์ด ์žˆ๋Š”์ง€ ๋” ๋””๋ฒ„๊น…ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

2๊ฐœ์˜ ์ข‹์•„์š”

๊ฐ™์€ ๋””์Šค์ฝ”๋“œ ์•ฑ์ผ ํ•„์š”๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ํ•œ๋ฒˆ ์‹œ๋„ํ•ด ๋ณด์„ธ์š”!

2๊ฐœ์˜ ์ข‹์•„์š”

์•ˆ๋…•ํ•˜์„ธ์š”!

Discord ๊ณ„์ •์— ๋”ฐ๋ผ Discourse ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ค๋ฅธ ์‹ ๋ขฐ ์ˆ˜์ค€(Trust Level)์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํฌ๋Ÿผ์—์„œ ๊ฒ€์ƒ‰ํ•˜๋‹ค๊ฐ€ ์ด๊ณณ์— ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ Discord์—์„œ ๊ฝค ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์šด์˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ตœ๊ทผ ๋” ์ฒด๊ณ„์ ์ธ ๋…ผ์˜๋ฅผ ์œ„ํ•ด Discourse๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Discord ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๊ณ  Discord์—์„œ ํŠน์ • ์—ญํ• ์„ ๊ฐ€์ง„ ๋ฉค๋ฒ„๊ฐ€ ์ž๋™์œผ๋กœ Discourse์—์„œ ์‹ ๋ขฐ ์ˆ˜์ค€ 1์„ ๋ฐ›๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด Bot Kit์ด ์ด๋Ÿฌํ•œ ๊ตฌํ˜„์„ ์œ„ํ•œ ์ ์ ˆํ•œ ์ถœ๋ฐœ์ ์ด ๋ ๊นŒ์š”?

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

1๊ฐœ์˜ ์ข‹์•„์š”

์ œ๊ฐ€ ์•„๋Š” ํ•œ ์ด ๋ด‡์€ Discourse์—์„œ Discord๋กœ๋งŒ ์ž‘๋™ํ•˜๋Š” "๋‹จ๋ฐฉํ–ฅ"์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ๋Š” Discourse ์„ค์น˜ ํ™˜๊ฒฝ์˜ ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ ์›นํ›…์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ์ž‘์—…์„ ์ข€ ๋” ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์›นํ›… ์ด๋ฒคํŠธ ์ˆ˜์‹  โ†’ Discourse ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ Discord ์‚ฌ์šฉ์ž ID ๊ฐ€์ ธ์˜ค๊ธฐ (Discord ์ธ์ฆ ์‚ฌ์šฉ ํ•„์š”) โ†’ discord.js, .py ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ญํ• (Roles) ๊ฐ€์ ธ์˜ค๊ธฐ โ†’ Discourse API ์š”์ฒญ์œผ๋กœ ์—ญํ•  ํ• ๋‹น

Discord ID๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด Data Explorer ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

-- [params]
-- string :user
SELECT u.username, u.id, a.user_id, a.provider_name, a.provider_uid
FROM users u
JOIN user_associated_accounts a on a.user_id = u.id
WHERE u.username = :user

์ดํ›„ Data Explorer ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ํ•ด๋‹น ์ฟผ๋ฆฌ์— API ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ID๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ข‹์•„์š”

์—ญํ•  ๋™๊ธฐํ™”(role sync)์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ด์ง€๋งŒ, ๊ทธ ์™ธ์—๋Š” ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

OP(์›ํฌ์Šคํ„ฐ)์˜ ๊ธ€์—์„œ:

์ฆ‰, Discord โ†’ Discourse ๋ฐฉํ–ฅ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ’๋ถ€ํ•˜๋ฉฐ, ๋‹จ์ˆœํžˆ โ€˜์—ญํ•  ๋™๊ธฐํ™”โ€™ ๋ด‡์ด ์•„๋‹™๋‹ˆ๋‹ค.

ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ, ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ์šฉํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ PR(ํ’€ ๋ฆฌํ€˜์ŠคํŠธ)์€ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ๋“ค์–ด์˜ค๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. :eyes:

4๊ฐœ์˜ ์ข‹์•„์š”

@merefield ๋‹˜, ์ด ๊ฒŒ์‹œ๋ฌผ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํ˜น์‹œ ๋””์Šค์ฝ”๋“œ ID๋ฅผ ์•Œ๋ ค ์ฃผ์‹ค ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ดœ์ฐฎ์œผ์‹œ๋‹ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์„ ๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ง€์‹์„ ๋ˆ„๊ตฌ๋‚˜ ์—ด๋žŒํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ์ง€ํ•˜๋ ค๋ฉด, ์งˆ๋ฌธ์€ ์ด๊ณณ์—์„œ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. Discord๋Š” ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ€๊ธฐ๋งŒ ํ•˜๊ณ  ๋‹ค์‹œ๋Š” ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๋ธ”๋ž™ํ™€๊ณผ๋„ ๊ฐ™์Šต๋‹ˆ๋‹ค. :slight_smile: ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์™ธ์—๋„ ์ด๊ณณ Discourse์—์„œ ์ฑ„ํŒ…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ข‹์•„์š”

์ผ€๋„ค, ์•ˆ๋…•ํ•˜์„ธ์š”. ์ƒ์—…์  ๋ชฉ์ ์ด ์•„๋‹ˆ๋ผ๋ฉด, ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๊ทธ ์งˆ๋ฌธ๋“ค์—์„œ ๋„์›€์„ ๋ฐ›๊ฑฐ๋‚˜(์‹ฌ์ง€์–ด ๋‹ต๋ณ€์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก) ์—ฌ๊ธฐ์—์„œ ์งˆ๋ฌธํ•ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

3๊ฐœ์˜ ์ข‹์•„์š”