Botframework-solutions: Typescript: ๊ตฌ๋ฌธ ๋ถ„์„ ์š”์ฒญ์—์„œ ๋ฎ์–ด์“ด ๋กœ์ปฌ ํƒ€์ž„์Šคํƒฌํ”„

์— ๋งŒ๋“  2020๋…„ 01์›” 21์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/botframework-solutions

์–ด๋–ค ํ”„๋กœ์ ํŠธ๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋‚˜์š”?

๊ธฐ์ˆ  ๋ฐ VA

์ด๊ฒƒ์€ ์–ด๋–ค ์–ธ์–ด๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ

๋ฌด์Šจ ์ผ์ด์•ผ?

๋‹ค๋ฅธ ์‹œ๊ฐ„๋Œ€์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ localTimezone์€ ๋งค๋ฒˆ ๋กœ์ปฌ ์„œ๋ฒ„ ์‹œ๊ฐ„๋Œ€๋ฅผ ๋ฎ์–ด์“ฐ๊ณ  ์‚ฌ์šฉ์ž์˜ ์‹œ๊ฐ„๋Œ€๋ฅผ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์‹œ๊ฐ„๋Œ€์˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ํด๋ผ์ด์–ธํŠธ์˜ ๋‹ค๋ฅธ ์‹œ๊ฐ„๋Œ€์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์œผ์‹ญ์‹œ์˜ค.

๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ–ˆ์Šต๋‹ˆ๊นŒ?

์ ์–ด๋„ ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉ์ž ์‹œ๊ฐ„๋Œ€๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ, ์˜ค๋ฅ˜ ์ถœ๋ ฅ ๋“ฑ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ BotFrameworkAdapter , processActivity ๋ฉ”์„œ๋“œ ๋ฐ parseRequest ํ•จ์ˆ˜์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

if (typeof activity.localTimestamp === 'string') { activity.localTimestamp = new Date(activity.localTimestamp); }

์Šคํฌ๋ฆฐ์ƒท์ด๋‚˜ ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

Bot Services Bug customer-replied-to customer-reported

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @tommyJimmy87์ž…๋‹ˆ๋‹ค! ๋ฌธ์ œ๋ฅผ ์‹ ๊ณ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ–ˆ์œผ๋ฉฐ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•œ ์žฌํ˜„ ๋‹จ๊ณ„๋ฅผ ํ™•์ธํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ตฌํ˜„์„ ๋น„๊ตํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด C# ๋ด‡์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ๊ณ„์† ์žฌํ˜„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์žฌํ˜„ ๋‹จ๊ณ„

TypeScript ๊ฐ€์ƒ ๋„์šฐ๋ฏธ ์ƒ˜ํ”Œ ์‚ฌ์šฉ

  1. ๊ฐ€์ƒ ๋„์šฐ๋ฏธ์˜ ํด๋”๋กœ ์ด๋™
  2. npm install ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค.
  3. npm run build ์†”๋ฃจ์…˜ ์ปดํŒŒ์ผ
  4. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Virtual Assistant๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.
pwsh.exe -File deployment\scripts\deploy.ps1 -name "<BOT_NAME>" -location "<LOCATION>" -appId "<APP_ID>" -appPassword "<APP_PASSWORD>" -luisAuthoringKey "<LUIS_AUTHORING_KEY>" -luisAuthoringRegion "<LUIS_AUTHORING_REGION>"
  1. Bot Framework Emulator๋ฅผ ์—ด๊ณ  ๋กœ์ปฌ์—์„œ ์‹คํ–‰๋˜๋Š” Virtual Assistant์— ์—ฐ๊ฒฐํ•˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    image

  2. Botbuilder ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€ botFrameworkAdapter.ts์˜ 1004๋ฒˆ์งธ ์ค„์— ์ค‘๋‹จ์  ์„ค์ •
    image

  3. System Time zone ๋ฅผ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: UTC+03:00 Minsk).
    image

  4. ๊ฐ€์ƒ ๋„์šฐ๋ฏธ ๋””๋ฒ„๊ทธ

  5. ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ƒ ๋„์šฐ๋ฏธ์™€ ์ฑ„ํŒ… ์‹œ์ž‘
  6. ์ค‘๋‹จ์ ์—์„œ ์‹คํ–‰์ด ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค. activity.localTimestamp ๋Š” ์ด์ „ ๋กœ์ปฌ ์„œ๋ฒ„ ์‹œ๊ฐ„๋Œ€ ์™€ ํ•จ๊ป˜ ๋‚ ์งœ ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
    image

  7. ํ• ๋‹น ํ›„ activity.localTimestamp ์˜ ์ƒˆ datetime์€ ์ƒˆ ์‚ฌ์šฉ์ž์˜ ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.
    image

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค:ํŽธ์•ˆํ•จ:

๋ชจ๋“  4 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @tommyJimmy87์ž…๋‹ˆ๋‹ค! ๋ฌธ์ œ๋ฅผ ์‹ ๊ณ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ–ˆ์œผ๋ฉฐ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•œ ์žฌํ˜„ ๋‹จ๊ณ„๋ฅผ ํ™•์ธํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ตฌํ˜„์„ ๋น„๊ตํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด C# ๋ด‡์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ๊ณ„์† ์žฌํ˜„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์žฌํ˜„ ๋‹จ๊ณ„

TypeScript ๊ฐ€์ƒ ๋„์šฐ๋ฏธ ์ƒ˜ํ”Œ ์‚ฌ์šฉ

  1. ๊ฐ€์ƒ ๋„์šฐ๋ฏธ์˜ ํด๋”๋กœ ์ด๋™
  2. npm install ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค.
  3. npm run build ์†”๋ฃจ์…˜ ์ปดํŒŒ์ผ
  4. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Virtual Assistant๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.
pwsh.exe -File deployment\scripts\deploy.ps1 -name "<BOT_NAME>" -location "<LOCATION>" -appId "<APP_ID>" -appPassword "<APP_PASSWORD>" -luisAuthoringKey "<LUIS_AUTHORING_KEY>" -luisAuthoringRegion "<LUIS_AUTHORING_REGION>"
  1. Bot Framework Emulator๋ฅผ ์—ด๊ณ  ๋กœ์ปฌ์—์„œ ์‹คํ–‰๋˜๋Š” Virtual Assistant์— ์—ฐ๊ฒฐํ•˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    image

  2. Botbuilder ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€ botFrameworkAdapter.ts์˜ 1004๋ฒˆ์งธ ์ค„์— ์ค‘๋‹จ์  ์„ค์ •
    image

  3. System Time zone ๋ฅผ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: UTC+03:00 Minsk).
    image

  4. ๊ฐ€์ƒ ๋„์šฐ๋ฏธ ๋””๋ฒ„๊ทธ

  5. ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ƒ ๋„์šฐ๋ฏธ์™€ ์ฑ„ํŒ… ์‹œ์ž‘
  6. ์ค‘๋‹จ์ ์—์„œ ์‹คํ–‰์ด ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค. activity.localTimestamp ๋Š” ์ด์ „ ๋กœ์ปฌ ์„œ๋ฒ„ ์‹œ๊ฐ„๋Œ€ ์™€ ํ•จ๊ป˜ ๋‚ ์งœ ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
    image

  7. ํ• ๋‹น ํ›„ activity.localTimestamp ์˜ ์ƒˆ datetime์€ ์ƒˆ ์‚ฌ์šฉ์ž์˜ ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.
    image

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค:ํŽธ์•ˆํ•จ:

์•ˆ๋…•ํ•˜์„ธ์š” @VictorGrycuk์ž…๋‹ˆ๋‹ค ! ์šฐ์„  ๋น ๋ฅธ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‹จ๊ณ„๋ฅผ ์ž˜ ์ดํ•ดํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•œ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ๋” ์ž˜ ์„ค๋ช…ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์ฒซ ๋ฒˆ์งธ ๊ฐ€์ •์€ ๊ฐ€์ƒ ๋„์šฐ๋ฏธ๊ฐ€ ๋กœ์ปฌ์— ๋ฐฐํฌ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  2. ๋‘ ๋ฒˆ์งธ ๊ฐ€์ •์€ 2๊ฐœ์˜ ๋‹ค๋ฅธ ๋žฉํ†ฑ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฒซ ๋ฒˆ์งธ ๋žฉํ†ฑ์€ ํด๋ผ์ด์–ธํŠธ(์ €ํฌ์˜ ๊ฒฝ์šฐ Teams)์ด๊ณ  ๋‘ ๋ฒˆ์งธ ๋žฉํ†ฑ์€ VA๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

  3. ์„ธ ๋ฒˆ์งธ ๊ฐ€์ •์€ 2๊ฐœ์˜ ๋žฉํ†ฑ์— 2๊ฐœ์˜ ๋‹ค๋ฅธ ์‹œ๊ฐ„๋Œ€๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ(ํด๋ผ์ด์–ธํŠธ)์—๋Š” GMT+0300 ์žˆ๊ณ  ์„œ๋ฒ„์—๋Š” GMT+0100 ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  4. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ชจ๋“  ์„ค์ •์ด ๋๋‚˜๋ฉด ํด๋ผ์ด์–ธํŠธ์—์„œ Teams๋ฅผ ํ†ตํ•ด VA์— ์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  5. ์š”์ฒญ์„ ๋ฐ›์ž๋งˆ์ž ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์˜ฌ๋ฐ”๋ฅธ ์‹œ๊ฐ„๋Œ€๋ฅผ ๋ณธ๋ฌธ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Screen Shot 2020-01-23 at 14 30 02

Screen Shot 2020-01-23 at 14 29 49

  1. ๊ตฌ๋ฌธ ๋ถ„์„ ์š”์ฒญ ๋‚ด์—์„œ ์˜ฌ๋ฐ”๋ฅธ Client Timezone์„ ์–ป์Šต๋‹ˆ๋‹ค.

Screen Shot 2020-01-23 at 14 34 12

  1. ๊ทธ๋Ÿฌ๋‚˜ ๋ณ€์ˆ˜ ํ• ๋‹น ํ›„(๊ธฐ๋ณธ์ ์œผ๋กœ new Date(activity.localTimestamp) ) ์„œ๋ฒ„ Timezone์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Screen Shot 2020-01-23 at 14 36 52

์•ˆ๋…•ํ•˜์„ธ์š” @tommyJimmy87์ž…๋‹ˆ๋‹ค! ์ž์„ธํ•œ ๋‹จ๊ณ„์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฒ€ํ† ํ•œ ํ›„ ๋‚˜์ค‘์— ๋‹ค์‹œ ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ˜Š.

์•ˆ๋…•ํ•˜์„ธ์š” @tommyJimmy87์ž…๋‹ˆ๋‹ค!

JavaScript๊ฐ€ Date ๊ฐœ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ œํ•œ ๋•Œ๋ฌธ์ด๋ผ๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ BotBuilder-JS ์ €์žฅ์†Œ์—์„œ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ฌธ์ œ #1612๋ฅผ ์—ด์—ˆ ์Œ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ด ๋ฌธ์ œ์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ๋„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์šฐ๋ฆฌ๊ฐ€ ๋ฐœ๊ฒฌํ•œ ๋ฌธ์ œ๋Š” ๋‚ ์งœ๋ฅผ Date ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ JS๊ฐ€ ์ด๋ฅผ UTC๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ธฐ๋ณธ์ ์œผ๋กœ ์›๋ž˜ ์‹œ๊ฐ„๋Œ€๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. JavaScript๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์‹œ๊ฐ„๋Œ€๋Š” JS๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‹œ์Šคํ…œ์˜ ์‹œ๊ฐ„๋Œ€์ž…๋‹ˆ๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‚ ์งœ ๋ฌธ์„œ ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์ง„ํ–‰ ์ƒํ™ฉ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค :relaxed:

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰