แƒขแƒ”แƒšแƒ”แƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ‘แƒแƒขแƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ R-แƒจแƒ˜ (แƒœแƒแƒฌแƒ˜แƒšแƒ˜ 4): แƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒฃแƒšแƒ˜, แƒšแƒแƒ’แƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ“แƒ˜แƒแƒšแƒแƒ’แƒ˜แƒก แƒแƒ’แƒ”แƒ‘แƒ แƒ‘แƒแƒขแƒ—แƒแƒœ

แƒ—แƒฃ แƒฃแƒ™แƒ•แƒ” แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒ” แƒฌแƒ˜แƒœแƒ แƒกแƒแƒ›แƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒ แƒแƒ› แƒกแƒ”แƒ แƒ˜แƒ˜แƒ“แƒแƒœ, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒ™แƒ•แƒ” แƒ˜แƒชแƒ˜แƒ—, แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒฌแƒ”แƒ แƒแƒ— แƒกแƒ แƒฃแƒšแƒคแƒแƒกแƒแƒ•แƒแƒœแƒ˜ แƒขแƒ”แƒšแƒ”แƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ‘แƒแƒขแƒ”แƒ‘แƒ˜ แƒ™แƒšแƒแƒ•แƒ˜แƒแƒขแƒฃแƒ แƒ˜แƒ—.

แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒกแƒฌแƒแƒ•แƒšแƒ˜แƒ— แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒ‘แƒแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ˜แƒœแƒแƒ แƒฉแƒฃแƒœแƒ”แƒ‘แƒก แƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒฃแƒš แƒ“แƒ˜แƒแƒšแƒแƒ’แƒก. แƒ˜แƒ›แƒแƒ—. แƒ‘แƒแƒขแƒ˜ แƒ“แƒแƒ’แƒ˜แƒกแƒ•แƒแƒ›แƒ— แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒก แƒ“แƒ แƒ“แƒแƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒแƒ— แƒ แƒแƒ˜แƒ›แƒ” แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒงแƒ•แƒแƒœแƒแƒก. แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒ›แƒ˜แƒ”แƒ  แƒจแƒ”แƒงแƒ•แƒแƒœแƒ˜แƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒ’แƒแƒ›แƒแƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ”, แƒ‘แƒแƒขแƒ˜ แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒแƒก.

แƒแƒกแƒ”แƒ•แƒ” แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒกแƒฌแƒแƒ•แƒšแƒ˜แƒ— แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ แƒ‘แƒแƒขแƒ˜แƒก แƒฅแƒฃแƒ“แƒ˜แƒก แƒฅแƒ•แƒ”แƒจ, แƒฉแƒ•แƒ”แƒœแƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒจแƒ˜ แƒ”แƒก แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ SQLite, แƒ›แƒแƒ’แƒ แƒแƒ› แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒกแƒฎแƒ•แƒ DBMS. แƒ›แƒ” แƒฃแƒคแƒ แƒ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒแƒ“ แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ” แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ”แƒ‘แƒ—แƒแƒœ แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ R แƒ”แƒœแƒแƒ–แƒ” แƒ”แƒก แƒ›แƒฃแƒฎแƒšแƒ˜.

แƒขแƒ”แƒšแƒ”แƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ‘แƒแƒขแƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ R-แƒจแƒ˜ (แƒœแƒแƒฌแƒ˜แƒšแƒ˜ 4): แƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒฃแƒšแƒ˜, แƒšแƒแƒ’แƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ“แƒ˜แƒแƒšแƒแƒ’แƒ˜แƒก แƒแƒ’แƒ”แƒ‘แƒ แƒ‘แƒแƒขแƒ—แƒแƒœ

แƒงแƒ•แƒ”แƒšแƒ แƒกแƒขแƒแƒขแƒ˜แƒ แƒกแƒ”แƒ แƒ˜แƒ˜แƒ“แƒแƒœ "แƒขแƒ”แƒšแƒ”แƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ‘แƒแƒขแƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ R-แƒจแƒ˜"

  1. แƒฉแƒ•แƒ”แƒœ แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— แƒ‘แƒแƒขแƒก แƒ“แƒ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ›แƒแƒก แƒขแƒ”แƒšแƒ”แƒ’แƒ แƒแƒ›แƒแƒจแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒกแƒแƒ’แƒ–แƒแƒ•แƒœแƒแƒ“
  2. แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ— แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ แƒ“แƒ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜ แƒ‘แƒแƒขแƒจแƒ˜
  3. แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒแƒ— แƒ™แƒšแƒแƒ•แƒ˜แƒแƒขแƒฃแƒ แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ แƒ‘แƒแƒขแƒก
  4. แƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒฃแƒšแƒ˜, แƒšแƒแƒ’แƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ“แƒ˜แƒแƒšแƒแƒ’แƒ˜แƒก แƒแƒ’แƒ”แƒ‘แƒ แƒ‘แƒแƒขแƒ—แƒแƒœ

แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก

แƒ—แƒฃ แƒ’แƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ”แƒ‘แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜, แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ’แƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒแƒ— แƒฉแƒ”แƒ›แƒ˜ แƒ“แƒ”แƒžแƒ”แƒจแƒ ะธ youtube แƒแƒ แƒฎแƒ”แƒ‘แƒ˜. แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒ˜แƒก แƒฃแƒ›แƒ”แƒขแƒ”แƒกแƒ˜ แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒ”แƒซแƒฆแƒ•แƒœแƒ”แƒ‘แƒ R แƒ”แƒœแƒแƒก.

  1. แƒจแƒ”แƒกแƒแƒ•แƒแƒšแƒ˜
  2. แƒ‘แƒแƒขแƒ˜แƒก แƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜
  3. แƒ‘แƒแƒขแƒ˜แƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ
  4. แƒ‘แƒแƒขแƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ
  5. แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒ˜
  6. แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ
  7. แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒฉแƒแƒฌแƒ”แƒ แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒกแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
  8. แƒ‘แƒแƒขแƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜
  9. แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜
  10. แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜
  11. แƒ‘แƒแƒขแƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ“แƒ˜
  12. แƒ“แƒแƒกแƒ™แƒ•แƒœแƒ

แƒจแƒ”แƒกแƒแƒ•แƒแƒšแƒ˜

แƒ˜แƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒ‘แƒแƒขแƒ›แƒ แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒแƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒ’แƒแƒœ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ“แƒแƒ”แƒšแƒแƒ“แƒแƒ— แƒ แƒแƒ˜แƒ›แƒ” แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒงแƒ•แƒแƒœแƒแƒก, แƒ—แƒฅแƒ•แƒ”แƒœ แƒ“แƒแƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒ“แƒ˜แƒแƒšแƒแƒ’แƒ˜แƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒฉแƒแƒฌแƒ”แƒ แƒ. แƒแƒ›แƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ แƒ’แƒ–แƒ แƒแƒ แƒ˜แƒก แƒ แƒแƒ˜แƒ›แƒ” แƒกแƒแƒฎแƒ˜แƒก แƒฉแƒแƒจแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ SQLite.

แƒ˜แƒ›แƒแƒ—. แƒšแƒแƒ’แƒ˜แƒ™แƒ แƒแƒกแƒ”แƒ—แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ. แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒ•แƒฃแƒฌแƒแƒ“แƒ”แƒ‘แƒ— แƒ‘แƒแƒขแƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒก แƒ“แƒ แƒ‘แƒแƒขแƒ˜ แƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒฃแƒšแƒแƒ“ แƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒฉแƒ•แƒ”แƒœแƒ’แƒแƒœ แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒš แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒแƒก แƒ“แƒ แƒงแƒแƒ•แƒ”แƒš แƒœแƒแƒ‘แƒ˜แƒฏแƒ–แƒ” แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ แƒแƒ› แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒงแƒ•แƒแƒœแƒแƒก แƒ“แƒ แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒจแƒ”แƒแƒ›แƒแƒฌแƒ›แƒแƒก แƒ˜แƒ’แƒ˜.

แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ— แƒฃแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒก แƒ‘แƒแƒขแƒก, แƒฏแƒ”แƒ  แƒ˜แƒก แƒ›แƒแƒ’แƒ—แƒฎแƒแƒ•แƒก แƒกแƒแƒฎแƒ”แƒšแƒก, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒแƒกแƒแƒ™แƒก แƒ“แƒ แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒš แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ แƒจแƒ”แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก. แƒแƒกแƒแƒ™แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒกแƒแƒก แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก, แƒ แƒแƒ› แƒจแƒ”แƒงแƒ•แƒแƒœแƒ˜แƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒแƒ แƒ˜แƒก แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜ แƒ“แƒ แƒแƒ แƒ แƒขแƒ”แƒฅแƒกแƒขแƒ˜.

แƒแƒกแƒ”แƒ— แƒ›แƒแƒ แƒขแƒ˜แƒ• แƒ“แƒ˜แƒแƒšแƒแƒ’แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒกแƒแƒ›แƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ แƒ”แƒฅแƒœแƒ”แƒ‘แƒ:

  1. แƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ แƒแƒ แƒ˜แƒก แƒ‘แƒแƒขแƒ˜แƒก แƒœแƒแƒ แƒ›แƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒ˜แƒก แƒแƒ  แƒ”แƒšแƒ˜แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒ’แƒแƒœ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒแƒก
  2. Wait_name - แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒ‘แƒแƒขแƒ˜ แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒก แƒจแƒ”แƒงแƒ•แƒแƒœแƒแƒก
  3. Wait_age แƒแƒ แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒ‘แƒแƒขแƒ˜ แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒแƒกแƒแƒ™แƒ˜แƒก แƒจแƒ”แƒงแƒ•แƒแƒœแƒแƒก, แƒกแƒ แƒฃแƒšแƒ˜ แƒฌแƒšแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก.

แƒ‘แƒแƒขแƒ˜แƒก แƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜

แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒแƒ•แƒแƒจแƒ”แƒœแƒ”แƒ‘แƒ— แƒ‘แƒแƒขแƒก แƒ”แƒขแƒแƒžแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“; แƒ›แƒ—แƒ”แƒšแƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒกแƒฅแƒ”แƒ›แƒแƒขแƒฃแƒ แƒแƒ“ แƒ˜แƒงแƒแƒก แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ˜ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒœแƒแƒ˜แƒ แƒแƒ“:
แƒขแƒ”แƒšแƒ”แƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ‘แƒแƒขแƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ R-แƒจแƒ˜ (แƒœแƒแƒฌแƒ˜แƒšแƒ˜ 4): แƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒฃแƒšแƒ˜, แƒšแƒแƒ’แƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ“แƒ˜แƒแƒšแƒแƒ’แƒ˜แƒก แƒแƒ’แƒ”แƒ‘แƒ แƒ‘แƒแƒขแƒ—แƒแƒœ

  1. แƒฉแƒ•แƒ”แƒœ แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— แƒ‘แƒแƒขแƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒจแƒ”แƒ•แƒ˜แƒœแƒแƒฎแƒแƒ•แƒ— แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒก. แƒฉแƒ•แƒ”แƒœแƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ‘แƒแƒขแƒ˜แƒก แƒœแƒ˜แƒจแƒแƒœแƒ˜ แƒ“แƒ แƒ’แƒ–แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜แƒกแƒ™แƒ”แƒœ.
  2. แƒฉแƒ•แƒ”แƒœ แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒก, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒจแƒ”แƒ˜แƒœแƒแƒฎแƒ”แƒ‘แƒ แƒ‘แƒแƒขแƒ˜แƒ— แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ’แƒ–แƒ.
  3. แƒฉแƒ•แƒ”แƒœ แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— แƒ—แƒแƒ•แƒแƒ“ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒก แƒ“แƒ แƒ แƒ˜แƒ’ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒก, แƒ แƒแƒ—แƒ แƒ‘แƒแƒขแƒ›แƒ แƒจแƒ”แƒซแƒšแƒแƒก แƒ›แƒแƒกแƒ—แƒแƒœ แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒแƒ‘แƒ.
  4. แƒ•แƒฌแƒ”แƒ แƒ— แƒ‘แƒแƒขแƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒก, แƒ”.แƒ˜. แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒ˜แƒก แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒก.
  5. แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ. แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒ‘แƒแƒขแƒ˜ แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒก แƒฌแƒ•แƒ“แƒแƒ›แƒแƒก แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒš แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ–แƒ”, แƒ แƒแƒช แƒ“แƒแƒ›แƒแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒฉแƒแƒขแƒ˜แƒก แƒแƒ›แƒŸแƒแƒ›แƒ˜แƒœแƒ“แƒ”แƒš แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒ–แƒ”.
  6. แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ“แƒแƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ”แƒœ แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒก แƒ“แƒ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒก แƒ‘แƒแƒขแƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜แƒ—.
  7. แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒแƒ— แƒ‘แƒแƒขแƒ˜.

แƒ‘แƒแƒขแƒ˜แƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ

แƒ›แƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒฃแƒšแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒงแƒแƒคแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ‘แƒแƒขแƒ˜แƒก แƒ™แƒแƒ“แƒก แƒ“แƒ แƒกแƒฎแƒ•แƒ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒš แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒแƒ“.

  • แƒ‘แƒแƒขแƒ˜.แƒ  โ€” แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ‘แƒแƒขแƒ˜แƒก แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒ™แƒแƒ“แƒ˜
  • db_bot_function.R โ€” แƒ™แƒแƒ“แƒ˜แƒก แƒ‘แƒšแƒแƒ™แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒกแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒ—
  • bot_methods.R - แƒ‘แƒแƒขแƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ“แƒ˜
  • แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก_แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜.R - แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜
  • แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜.แƒ  - แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜
  • แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ. cfg - แƒ‘แƒแƒขแƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ
  • create_db_data.sql โ€” SQL แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ แƒฉแƒแƒขแƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒ— แƒชแƒฎแƒ แƒ˜แƒšแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“
  • create_db_state.sql โ€” SQL แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒฉแƒแƒขแƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒชแƒฎแƒ แƒ˜แƒšแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“
  • bot.db - แƒ‘แƒแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ

แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒœแƒแƒฎแƒแƒ— แƒ›แƒ—แƒ”แƒšแƒ˜ แƒ‘แƒแƒขแƒ˜แƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜, แƒแƒœ แƒฉแƒแƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ แƒฉแƒ”แƒ›แƒ˜แƒ“แƒแƒœ แƒกแƒแƒชแƒแƒ•แƒ˜ GitHub-แƒ–แƒ”.

แƒ‘แƒแƒขแƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ

แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ•แƒก, แƒ แƒแƒ’แƒแƒ แƒช แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒแƒก ini แƒคแƒแƒ˜แƒšแƒ˜, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒคแƒแƒ แƒ›แƒ:

[bot_settings]
bot_token=ะขะžะšะ•ะ_ะ’ะะจะ•ะ“ะž_ะ‘ะžะขะ

[db_settings]
db_path=C:/ะŸะฃะขะฌ/ะš/ะŸะะŸะšะ•/ะŸะ ะžะ•ะšะขะ/bot.db

แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒแƒจแƒ˜ แƒ•แƒฌแƒ”แƒ แƒ— แƒ‘แƒแƒขแƒ˜แƒก แƒŸแƒ”แƒขแƒแƒœแƒก แƒ“แƒ แƒ’แƒ–แƒแƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒกแƒ™แƒ”แƒœ, แƒ”.แƒ˜. bot.db แƒคแƒแƒ˜แƒšแƒ–แƒ”; แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— แƒ—แƒแƒ•แƒแƒ“ แƒคแƒแƒ˜แƒšแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ”แƒขแƒแƒžแƒ–แƒ”.

แƒฃแƒคแƒ แƒ แƒ แƒ—แƒฃแƒšแƒ˜ แƒ‘แƒแƒขแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— แƒฃแƒคแƒ แƒ แƒ แƒ—แƒฃแƒšแƒ˜ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜, แƒ’แƒแƒ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ, แƒแƒ  แƒแƒ แƒ˜แƒก แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜ ini แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒกแƒฎแƒ•แƒ แƒคแƒแƒ แƒ›แƒแƒขแƒ˜ JSON-แƒ˜แƒก แƒฉแƒแƒ—แƒ•แƒšแƒ˜แƒ—.

แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒ˜

แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒ™แƒแƒ›แƒžแƒ˜แƒฃแƒขแƒ”แƒ แƒ–แƒ” แƒ‘แƒแƒขแƒ˜แƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ›แƒฅแƒแƒœแƒ” แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ” แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒœแƒ—แƒแƒ•แƒกแƒ“แƒ”แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒแƒจแƒ˜ แƒ“แƒ แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ“แƒ˜แƒกแƒ™แƒ–แƒ”, แƒแƒกแƒ” แƒ แƒแƒ› แƒ™แƒแƒ“แƒจแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ˜แƒกแƒ™แƒ”แƒœ แƒ›แƒ˜แƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ’แƒ–แƒ แƒ“แƒแƒงแƒ”แƒœแƒ“แƒ”แƒ‘แƒ แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒ˜แƒก แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ—. TG_BOT_PATH.

แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ’แƒ–แƒ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก, แƒฃแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒกแƒ˜ แƒแƒ แƒ˜แƒก แƒ›แƒ˜แƒกแƒ˜ แƒคแƒแƒ˜แƒšแƒจแƒ˜ แƒฉแƒแƒฌแƒ”แƒ แƒ .แƒ แƒ”แƒœแƒ•แƒ˜แƒ แƒแƒœแƒ˜.

แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— แƒแƒœ แƒจแƒ”แƒชแƒ•แƒแƒšแƒแƒ— แƒ”แƒก แƒคแƒแƒ˜แƒšแƒ˜ แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— file.edit(path.expand(file.path("~", ".Renviron"))). แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒ”แƒ— แƒ˜แƒ’แƒ˜ แƒ“แƒ แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ— แƒ”แƒ แƒ—แƒ˜ แƒฎแƒแƒ–แƒ˜ แƒคแƒแƒ˜แƒšแƒก:

TG_BOT_PATH=C:/ะŸะฃะขะฌ/ะš/ะ’ะะจะ•ะœะฃ/ะŸะ ะžะ•ะšะขะฃ

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒจแƒ”แƒ˜แƒœแƒแƒฎแƒ”แƒ— แƒคแƒแƒ˜แƒšแƒ˜ .แƒ แƒ”แƒœแƒ•แƒ˜แƒ แƒแƒœแƒ˜ แƒ“แƒ แƒ’แƒแƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ”แƒ— RStudio.

แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒแƒ แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ. แƒ“แƒแƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ 2 แƒ›แƒแƒ’แƒ˜แƒ“แƒ:

  • chat_data โ€” แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ‘แƒแƒขแƒ›แƒ แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒกแƒ’แƒแƒœ
  • chat_state โ€” แƒงแƒ•แƒ”แƒšแƒ แƒฉแƒแƒขแƒ˜แƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ

แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— แƒ”แƒก แƒชแƒฎแƒ แƒ˜แƒšแƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ SQL แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—:

CREATE TABLE chat_data (
    chat_id BIGINT  PRIMARY KEY
                    UNIQUE,
    name    TEXT,
    age     INTEGER
);

CREATE TABLE chat_state (
    chat_id BIGINT PRIMARY KEY
                   UNIQUE,
    state   TEXT
);

แƒ—แƒฃ แƒฉแƒแƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ”แƒ— แƒ‘แƒแƒขแƒ˜แƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜ GitHub, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒ™แƒแƒ“แƒ˜ R-แƒจแƒ˜.

# ะกะบั€ะธะฟั‚ ัะพะทะดะฐะฝะธั ะฑะฐะทั‹ ะดะฐะฝะฝั‹ั…
library(DBI)     # ะธะฝั‚ะตั€ั„ะตะนั ะดะปั ั€ะฐะฑะพั‚ั‹ ั ะกะฃะ‘ะ”
library(configr) # ั‡ั‚ะตะฝะธะต ะบะพะฝั„ะธะณะฐ
library(readr)   # ั‡ั‚ะตะฝะธะต ั‚ะตะบัั‚ะพะฒั‹ั… SQL ั„ะฐะนะปะพะฒ
library(RSQLite) # ะดั€ะฐะนะฒะตั€ ะดะปั ะฟะพะดะบะปัŽั‡ะตะฝะธั ะบ SQLite

# ะดะธั€ะตะบั‚ะพั€ะธั ะฟั€ะพะตะบั‚ะฐ
setwd(Sys.getenv('TG_BOT_PATH'))

# ั‡ั‚ะตะฝะธะต ะบะพะฝั„ะธะณะฐ
cfg <- read.config('config.cfg')

# ะฟะพะดะบะปัŽั‡ะตะฝะธะต ะบ SQLite
con <- dbConnect(SQLite(), cfg$db_settings$db_path)

# ะกะพะทะดะฐะฝะธะต ั‚ะฐะฑะปะธั† ะฒ ะฑะฐะทะต
dbExecute(con, statement = read_file('create_db_data.sql'))
dbExecute(con, statement = read_file('create_db_state.sql'))

แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒฉแƒแƒฌแƒ”แƒ แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒกแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒฉแƒ•แƒ”แƒœ แƒฃแƒ™แƒ•แƒ” แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒ›แƒ–แƒแƒ“ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜ แƒ“แƒ แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ. แƒแƒฎแƒšแƒ แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒฌแƒ”แƒ แƒแƒ— แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜, แƒ แƒแƒ› แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ— แƒ“แƒ แƒฉแƒแƒฌแƒ”แƒ แƒแƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒแƒ› แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜.

แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ’แƒแƒ“แƒ›แƒแƒฌแƒ”แƒ แƒ”แƒ— แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜ แƒกแƒแƒ˜แƒ“แƒแƒœ GitHub, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ˜แƒžแƒแƒ•แƒแƒ— แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒคแƒแƒ˜แƒšแƒจแƒ˜ db_bot_function.R.

แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒกแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ™แƒแƒ“แƒ˜

# ###########################################################
# Function for work bot with database

# ะฟะพะปัƒั‡ะธั‚ัŒ ั‚ะตะบัƒั‰ะตะต ัะพัั‚ะพัะฝะธะต ั‡ะฐั‚ะฐ
get_state <- function(chat_id) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  chat_state <- dbGetQuery(con, str_interp("SELECT state FROM chat_state WHERE chat_id == ${chat_id}"))$state

  return(unlist(chat_state))

  dbDisconnect(con)
}

# ัƒัั‚ะฐะฝะพะฒะธั‚ัŒ ั‚ะตะบัƒั‰ะตะต ัะพัั‚ะพัะฝะธะต ั‡ะฐั‚ะฐ
set_state <- function(chat_id, state) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  # upsert ัะพัั‚ะพัะฝะธะต ั‡ะฐั‚ะฐ
  dbExecute(con, 
            str_interp("
            INSERT INTO chat_state (chat_id, state)
                VALUES(${chat_id}, '${state}') 
                ON CONFLICT(chat_id) 
                DO UPDATE SET state='${state}';
            ")
  )

  dbDisconnect(con)

}

# ะทะฐะฟะธััŒ ะฟะพะปัƒั‡ะตะฝะฝั‹ั… ะดะฐะฝะฝั‹ั… ะฒ ะฑะฐะทัƒ
set_chat_data <- function(chat_id, field, value) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  # upsert ัะพัั‚ะพัะฝะธะต ั‡ะฐั‚ะฐ
  dbExecute(con, 
            str_interp("
            INSERT INTO chat_data (chat_id, ${field})
                VALUES(${chat_id}, '${value}') 
                ON CONFLICT(chat_id) 
                DO UPDATE SET ${field}='${value}';
            ")
  )

  dbDisconnect(con)

}

# read chat data
get_chat_data <- function(chat_id, field) {

  con <- dbConnect(SQLite(), cfg$db_settings$db_path)

  # upsert ัะพัั‚ะพัะฝะธะต ั‡ะฐั‚ะฐ
  data <- dbGetQuery(con, 
                     str_interp("
            SELECT ${field}
            FROM chat_data
            WHERE chat_id = ${chat_id};
            ")
  )

  dbDisconnect(con)

  return(data[[field]])

}

แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— 4 แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ:

  • get_state() - แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ— แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒฉแƒแƒขแƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒ“แƒแƒœ
  • set_state() โ€” แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒฉแƒแƒขแƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜
  • get_chat_data() โ€” แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ— แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜
  • set_chat_data() โ€” แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒกแƒ’แƒแƒœ แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜

แƒงแƒ•แƒ”แƒšแƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ, แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒแƒœ แƒ™แƒ˜แƒ—แƒฎแƒฃแƒšแƒแƒ‘แƒ”แƒœ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒ“แƒแƒœ แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— dbGetQuery(), แƒแƒœ แƒฉแƒแƒ˜แƒ“แƒ˜แƒœแƒแƒก UPSERT แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒ (แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ แƒแƒœ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ แƒแƒฎแƒแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒฉแƒแƒฌแƒ”แƒ แƒ), แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— dbExecute().

UPSERT แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒ˜แƒก แƒกแƒ˜แƒœแƒขแƒแƒฅแƒกแƒ˜ แƒแƒกแƒ”แƒ—แƒ˜แƒ:

INSERT INTO chat_data (chat_id, ${field})
VALUES(${chat_id}, '${value}') 
ON CONFLICT(chat_id) 
DO UPDATE SET ${field}='${value}';

แƒ˜แƒ›แƒแƒ—. แƒฉแƒ•แƒ”แƒœแƒ˜ แƒชแƒฎแƒ แƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ•แƒ”แƒšแƒจแƒ˜ chat_id แƒแƒฅแƒ•แƒก แƒฃแƒœแƒ˜แƒ™แƒแƒšแƒฃแƒ แƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ แƒ“แƒ แƒแƒ แƒ˜แƒก แƒชแƒฎแƒ แƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜. แƒ—แƒแƒ•แƒ“แƒแƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ•แƒชแƒ“แƒ˜แƒšแƒแƒ‘แƒ— แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒแƒ— แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ แƒชแƒฎแƒ แƒ˜แƒšแƒจแƒ˜ แƒ“แƒ แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒจแƒ”แƒชแƒ“แƒแƒ›แƒแƒก, แƒ—แƒฃ แƒฃแƒ™แƒ•แƒ” แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒฉแƒแƒขแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ•แƒแƒแƒฎแƒšแƒ”แƒ‘แƒ— แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒแƒก แƒแƒ› แƒฉแƒแƒขแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘.

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜, แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒแƒ› แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒก แƒ‘แƒแƒขแƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒกแƒ แƒ“แƒ แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒจแƒ˜.

แƒ‘แƒแƒขแƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜

แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ‘แƒแƒขแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒแƒ แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ. แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ’แƒแƒ“แƒ›แƒแƒฌแƒ”แƒ แƒ”แƒ— แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜ แƒกแƒแƒ˜แƒ“แƒแƒœ GitHub, แƒ›แƒแƒจแƒ˜แƒœ แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒคแƒแƒ˜แƒšแƒจแƒ˜แƒ bot_methods.R.

แƒ‘แƒแƒขแƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒก แƒ™แƒแƒ“แƒ˜

# ###########################################################
# bot methods

# start dialog
start <- function(bot, update) {

  # 

  # Send query
  bot$sendMessage(update$message$chat_id, 
                  text = "ะ’ะฒะตะดะธ ัะฒะพั‘ ะธะผั")

  # ะฟะตั€ะตะบะปัŽั‡ะฐะตะผ ัะพัั‚ะพัะฝะธะต ะดะธะฐะปะพะณะฐ ะฒ ั€ะตะถะธะผ ะพะถะธะดะฐะฝะธั ะฒะฒะพะดะฐ ะธะผะตะฝะธ
  set_state(chat_id = update$message$chat_id, state = 'wait_name')

}

# get current chat state
state <- function(bot, update) {

  chat_state <- get_state(update$message$chat_id)

  # Send state
  bot$sendMessage(update$message$chat_id, 
                  text = unlist(chat_state))

}

# reset dialog state
reset <- function(bot, update) {

  set_state(chat_id = update$message$chat_id, state = 'start')

}

# enter username
enter_name <- function(bot, update) {

  uname <- update$message$text

  # Send message with name
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(uname, ", ะฟั€ะธัั‚ะฝะพ ะฟะพะทะฝะฐะบะพะผะธั‚ัั, ั ะฑะพั‚!"))

  # ะ—ะฐะฟะธัั‹ะฒะฐะตะผ ะธะผั ะฒ ะณะปะพะฑะฐะปัŒะฝัƒัŽ ะฟะตั€ะตะผะตะฝะฝัƒัŽ
  #username <<- uname
  set_chat_data(update$message$chat_id, 'name', uname) 

  # ะกะฟั€ะฐะฒัˆะธะฒะฐะตะผ ะฒะพะทั€ะฐัั‚
  bot$sendMessage(update$message$chat_id, 
                  text = "ะกะบะพะปัŒะบะพ ั‚ะตะฑะต ะปะตั‚?")

  # ะœะตะฝัะตะผ ัะพัั‚ะพัะฝะธะต ะฝะฐ ะพะถะธะดะฐะฝะธะต ะฒะฒะพะดะฐ ะธะผะตะฝะธ
  set_state(chat_id = update$message$chat_id, state = 'wait_age')

}

# enter user age
enter_age <- function(bot, update) {

  uage <- as.numeric(update$message$text)

  # ะฟั€ะพะฒะตั€ัะตะผ ะฑั‹ะปะพ ะฒะฒะตะดะตะฝะพ ั‡ะธัะปะพ ะธะปะธ ะฝะตั‚
  if ( is.na(uage) ) {

    # ะตัะปะธ ะฒะฒะตะดะตะฝะพ ะฝะต ั‡ะธัะปะพ ั‚ะพ ะฟะตั€ะตัะฟั€ะฐัˆะธะฒะฐะตะผ ะฒะพะทั€ะฐัั‚
    bot$sendMessage(update$message$chat_id, 
                    text = "ะขั‹ ะฒะฒั‘ะป ะฝะตะบะพั€ั€ะตะบั‚ะฝั‹ะต ะดะฐะฝะฝั‹ะต, ะฒะฒะตะดะธ ั‡ะธัะปะพ")

  } else {

    # ะตัะปะธ ะฒะฒะตะดะตะฝะพ ั‡ะธัะปะพ ัะพะพะฑั‰ะฐะตะผ ั‡ั‚ะพ ะฒะพะทั€ะฐัั‚ ะฟั€ะธะฝัั‚
    bot$sendMessage(update$message$chat_id, 
                    text = "ะžะš, ะฒะพะทั€ะฐัั‚ ะฟั€ะธะฝัั‚")

    # ะทะฐะฟะธัั‹ะฒะฐะตะผ ะณะปะพะฑะฐะปัŒะฝัƒัŽ ะฟะตั€ะตะผะตะฝะฝัƒัŽ ั ะฒะพะทั€ะฐัั‚ะพะผ
    #userage <<- uage
    set_chat_data(update$message$chat_id, 'age', uage) 

    # ัะพะพะฑั‰ะฐะตะผ ะบะฐะบะธะต ะดะฐะฝะฝั‹ะต ะฑั‹ะปะธ ัะพะฑั€ะฐะฝั‹
    username <- get_chat_data(update$message$chat_id, 'name')
    userage  <- get_chat_data(update$message$chat_id, 'age')

    bot$sendMessage(update$message$chat_id, 
                    text = paste0("ะขะตะฑั ะทะพะฒัƒั‚ ", username, " ะธ ั‚ะตะฑะต ", userage, " ะปะตั‚. ะ‘ัƒะดะตะผ ะทะฝะฐะบะพะผั‹"))

    # ะฒะพะทะฒั€ะฐั‰ะฐะตะผ ะดะธะฐะปะพะณ ะฒ ะธัั…ะพะดะฝะพะต ัะพัั‚ะพัะฝะธะต
    set_state(chat_id = update$message$chat_id, state = 'start')
  }

}

แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— 5 แƒ›แƒ”แƒ—แƒแƒ“แƒ˜:

  • แƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ - แƒ“แƒ˜แƒแƒšแƒแƒ’แƒ˜แƒก แƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ
  • แƒกแƒแƒฎแƒ”แƒšแƒ›แƒฌแƒ˜แƒคแƒ โ€” แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ— แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒฉแƒแƒขแƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ
  • แƒ’แƒแƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ โ€” แƒ’แƒแƒœแƒแƒแƒฎแƒšแƒ”แƒ— แƒฉแƒแƒขแƒ˜แƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ
  • enter_name โ€” แƒ‘แƒแƒขแƒ˜ แƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒกแƒแƒฎแƒ”แƒšแƒก
  • enter_age โ€” แƒ‘แƒแƒขแƒ˜ แƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒแƒกแƒแƒ™แƒก

แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ start แƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒกแƒแƒฎแƒ”แƒšแƒก แƒ“แƒ แƒชแƒ•แƒšแƒ˜แƒก แƒฉแƒแƒขแƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒก Wait_name, แƒ”.แƒ˜. แƒšแƒแƒ“แƒ˜แƒœแƒ˜แƒก แƒ แƒ”แƒŸแƒ˜แƒ›แƒจแƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒก แƒจแƒ”แƒงแƒ•แƒแƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜, แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒ— แƒกแƒแƒฎแƒ”แƒšแƒก แƒ“แƒ แƒ˜แƒก แƒ›แƒฃแƒจแƒแƒ•แƒ“แƒ”แƒ‘แƒ แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒ— enter_name, แƒ‘แƒแƒขแƒ˜ แƒ’แƒ˜แƒšแƒแƒชแƒแƒ•แƒก, แƒฌแƒ”แƒ แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒš แƒกแƒแƒฎแƒ”แƒšแƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ แƒ“แƒ แƒชแƒ•แƒšแƒ˜แƒก แƒฉแƒแƒขแƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒ–แƒ” แƒšแƒแƒ“แƒ˜แƒœแƒ˜แƒก_แƒแƒกแƒแƒ™แƒ˜.

แƒแƒ› แƒ”แƒขแƒแƒžแƒ–แƒ” แƒ‘แƒแƒขแƒ˜ แƒ”แƒšแƒ˜แƒก, แƒ แƒแƒ› แƒจแƒ”แƒ˜แƒงแƒ•แƒแƒœแƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒแƒกแƒแƒ™แƒ˜. แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒแƒกแƒแƒ™แƒก, แƒ‘แƒแƒขแƒ˜ แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒแƒก, แƒ—แƒฃ แƒœแƒแƒ›แƒ แƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ— แƒขแƒ”แƒฅแƒกแƒขแƒ˜, แƒ˜แƒก แƒ˜แƒขแƒงแƒ•แƒ˜แƒก: ะขั‹ ะฒะฒั‘ะป ะฝะตะบะพั€ั€ะตะบั‚ะฝั‹ะต ะดะฐะฝะฝั‹ะต, ะฒะฒะตะดะธ ั‡ะธัะปะพแƒ“แƒ แƒ“แƒแƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ แƒ—แƒฅแƒ•แƒ”แƒœ แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒจแƒ”แƒ˜แƒงแƒ•แƒแƒœแƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜. แƒ—แƒฃ แƒœแƒแƒ›แƒ”แƒ แƒ˜ แƒ’แƒแƒ›แƒแƒ’แƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ—, แƒ‘แƒแƒขแƒ˜ แƒจแƒ”แƒ’แƒแƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ—, แƒ แƒแƒ› แƒ›แƒแƒœ แƒ›แƒ˜แƒ˜แƒฆแƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒแƒกแƒแƒ™แƒ˜, แƒฉแƒแƒฌแƒ”แƒ แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒš แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜, แƒ›แƒแƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒ’แƒแƒœ แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒก แƒ“แƒ แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒฉแƒแƒขแƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒก แƒ—แƒแƒ•แƒ“แƒแƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒžแƒแƒ–แƒ˜แƒชแƒ˜แƒแƒ–แƒ”, แƒ”.แƒ˜. แƒ• start.

แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒ— state แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒแƒ— แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒฉแƒแƒขแƒ˜แƒก แƒกแƒขแƒแƒขแƒฃแƒกแƒ˜ แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ“แƒ แƒแƒก แƒ“แƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— reset แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ— แƒฉแƒแƒขแƒ˜ แƒ—แƒแƒ•แƒ“แƒแƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒจแƒ˜.

แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜

แƒฉแƒ•แƒ”แƒœแƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜ แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒ‘แƒแƒขแƒ˜แƒก แƒ›แƒจแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ‘แƒแƒจแƒ˜. แƒกแƒฌแƒแƒ แƒ”แƒ“ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒ’แƒแƒ˜แƒ’แƒ”แƒ‘แƒก แƒ‘แƒแƒขแƒ˜ แƒ แƒ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒแƒก แƒ”แƒšแƒ˜แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒ’แƒแƒœ แƒ“แƒ แƒ แƒแƒ’แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ“แƒ”แƒก.

แƒžแƒ แƒแƒ”แƒฅแƒขแƒจแƒ˜ GitHub แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜ แƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒคแƒแƒ˜แƒšแƒจแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก_แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜.R.

แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒ˜แƒก แƒ™แƒแƒ“แƒ˜:

# ###########################################################
# message state filters

# ั„ะธะปัŒั‚ั€ ัะพะพะฑั‰ะตะฝะธะน ะฒ ัะพัั‚ะพัะฝะธะธ ะพะถะธะดะฐะฝะธั ะธะผะตะฝะธ
MessageFilters$wait_name <- BaseFilter(function(message) {
  get_state( message$chat_id )  == "wait_name"
}
)

# ั„ะธะปัŒั‚ั€ ัะพะพะฑั‰ะตะฝะธะน ะฒ ัะพัั‚ะพัะฝะธะธ ะพะถะธะดะฐะฝะธั ะฒะพะทั€ะฐัั‚ะฐ
MessageFilters$wait_age <- BaseFilter(function(message) {
  get_state( message$chat_id )   == "wait_age"
}
)

แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒจแƒ˜ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒแƒ“แƒ แƒ” แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒš แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒก get_state(), แƒ˜แƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒแƒ— แƒฉแƒแƒขแƒ˜แƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ. แƒ”แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ 1 แƒแƒ แƒ’แƒฃแƒ›แƒ”แƒœแƒขแƒก, แƒฉแƒแƒขแƒ˜แƒก ID-แƒก.

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒคแƒ˜แƒšแƒขแƒ แƒ˜ Wait_name แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒก, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒฉแƒแƒขแƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒจแƒ˜แƒ wait_name, แƒ“แƒ แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ“ แƒคแƒ˜แƒšแƒขแƒ แƒ˜แƒช แƒšแƒแƒ“แƒ˜แƒœแƒ˜แƒก_แƒแƒกแƒแƒ™แƒ˜ แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒก, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒฉแƒแƒขแƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒจแƒ˜แƒ wait_age.

แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜

แƒคแƒแƒ˜แƒšแƒ˜ แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜แƒ— แƒแƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜.แƒ แƒ“แƒ แƒแƒฅแƒ•แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒ™แƒแƒ“แƒ˜:

# ###########################################################
# handlers

# command handlers
start_h <- CommandHandler('start', start)
state_h <- CommandHandler('state', state)
reset_h <- CommandHandler('reset', reset)

# message handlers
## !MessageFilters$command - ะพะทะฝะฐั‡ะฐะตั‚ ั‡ั‚ะพ ะบะพะผะฐะฝะดั‹ ะดะฐะฝะฝั‹ะต ะพะฑั€ะฐะฑะพั‚ั‡ะธะบะธ ะฝะต ะพะฑั€ะฐะฑะฐั‚ั‹ะฒะฐัŽั‚, 
## ั‚ะพะปัŒะบะพ ั‚ะตะบัั‚ะพะฒั‹ะต ัะพะพะฑั‰ะตะฝะธั
wait_age_h  <- MessageHandler(enter_age,  MessageFilters$wait_age  & !MessageFilters$command)
wait_name_h <- MessageHandler(enter_name, MessageFilters$wait_name & !MessageFilters$command)

แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ›แƒแƒ’แƒชแƒ”แƒ›แƒ— แƒ’แƒแƒฃแƒจแƒ•แƒแƒ— แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜ แƒ“แƒ˜แƒแƒšแƒแƒ’แƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒงแƒ”แƒ‘แƒแƒ“, แƒ’แƒแƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ— แƒ“แƒ แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒแƒ— แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ.

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜, แƒฉแƒ•แƒ”แƒœ แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— 2 แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ”แƒšแƒก แƒฌแƒ˜แƒœแƒ แƒ”แƒขแƒแƒžแƒ–แƒ” แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜ แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒ•แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒ›แƒแƒ— แƒคแƒ˜แƒšแƒขแƒ แƒก !MessageFilters$command, แƒแƒกแƒ” แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒฉแƒ”แƒ—แƒ˜แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒจแƒ˜.

แƒ‘แƒแƒขแƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ“แƒ˜

แƒแƒฎแƒšแƒ แƒฉแƒ•แƒ”แƒœ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒ–แƒแƒ“ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒ’แƒแƒกแƒแƒจแƒ•แƒ”แƒ‘แƒแƒ“, แƒ‘แƒแƒขแƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒ™แƒแƒ“แƒ˜ แƒคแƒแƒ˜แƒšแƒจแƒ˜แƒ แƒ‘แƒแƒขแƒ˜.แƒ .

library(telegram.bot)
library(tidyverse)
library(RSQLite)
library(DBI)
library(configr)

# ะฟะตั€ะตั…ะพะดะธะผ ะฒ ะฟะฐะฟะบัƒ ะฟั€ะพะตะบั‚ะฐ
setwd(Sys.getenv('TG_BOT_PATH'))

# ั‡ะธั‚ะฐะตะผ ะบะพะฝั„ะธะณ
cfg <- read.config('config.cfg')

# ัะพะทะดะฐั‘ะผ ัะบะทะตะผะฟะปัั€ ะฑะพั‚ะฐ
updater <- Updater(cfg$bot_settings$bot_token)

# ะ—ะฐะณั€ัƒะทะบะฐ ะบะพะผะฟะพะฝะตะฝั‚ะพะฒ ะฑะพั‚ะฐ
source('db_bot_function.R') # ั„ัƒะฝะบั†ะธะธ ะดะปั ั€ะฐะฑะพั‚ั‹ ั ะ‘ะ”
source('bot_methods.R')     # ะผะตั‚ะพะดั‹ ะฑะพั‚ะฐ
source('message_filters.R') # ั„ะธะปัŒั‚ั€ั‹ ัะพะพะฑั‰ะตะฝะธะน
source('handlers.R') # ะพะฑั€ะฐะฑะพั‚ั‡ะธะบะธ ัะพะพะฑั‰ะตะฝะธะน

# ะ”ะพะฑะฐะฒะปัะตะผ ะพะฑั€ะฐะฑะพั‚ั‡ะธะบะธ ะฒ ะดะธัะฟะตั‚ั‡ะตั€
updater <- updater +
  start_h +
  wait_age_h +
  wait_name_h +
  state_h +
  reset_h

# ะ—ะฐะฟัƒัะบะฐะตะผ ะฑะพั‚ะฐ
updater$start_polling()

แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ— แƒ”แƒก แƒ‘แƒแƒขแƒ˜:
แƒขแƒ”แƒšแƒ”แƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ‘แƒแƒขแƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ R-แƒจแƒ˜ (แƒœแƒแƒฌแƒ˜แƒšแƒ˜ 4): แƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒฃแƒšแƒ˜, แƒšแƒแƒ’แƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ“แƒ˜แƒแƒšแƒแƒ’แƒ˜แƒก แƒแƒ’แƒ”แƒ‘แƒ แƒ‘แƒแƒขแƒ—แƒแƒœ

แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ“แƒ แƒแƒก แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— /state แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ— แƒฉแƒแƒขแƒ˜แƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ แƒ“แƒ แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— /reset แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ— แƒฉแƒแƒขแƒ˜ แƒ—แƒแƒ•แƒ“แƒแƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒจแƒ˜ แƒ“แƒ แƒ™แƒ•แƒšแƒแƒ• แƒ“แƒแƒ˜แƒฌแƒงแƒ”แƒ— แƒ“แƒ˜แƒแƒšแƒแƒ’แƒ˜.

แƒ“แƒแƒกแƒ™แƒ•แƒœแƒ

แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ•แƒแƒ แƒ™แƒ•แƒ˜แƒ”แƒ—, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ แƒ‘แƒแƒขแƒ˜แƒก แƒจแƒ˜แƒ’แƒœแƒ˜แƒ— แƒ“แƒ แƒ แƒแƒ’แƒแƒ  แƒแƒ•แƒแƒจแƒ”แƒœแƒแƒ— แƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒฃแƒšแƒ˜ แƒšแƒแƒ’แƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ“แƒ˜แƒแƒšแƒแƒ’แƒ”แƒ‘แƒ˜ แƒฉแƒแƒขแƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒฉแƒแƒฌแƒ”แƒ แƒ˜แƒ—.

แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ“แƒแƒ•แƒฎแƒ”แƒ“แƒ”แƒ— แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒžแƒ แƒ˜แƒ›แƒ˜แƒขแƒ˜แƒฃแƒš แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒก, แƒ แƒแƒ—แƒ แƒ’แƒแƒ’แƒ˜แƒแƒ“แƒ•แƒ˜แƒšแƒ“แƒ”แƒ— แƒแƒ›แƒ’แƒ•แƒแƒ แƒ˜ แƒ‘แƒแƒขแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒ˜แƒ“แƒ”แƒ˜แƒก แƒ’แƒแƒ’แƒ”แƒ‘แƒ; แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒแƒจแƒ˜, แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒแƒแƒฌแƒงแƒแƒ— แƒ‘แƒ”แƒ•แƒ แƒแƒ“ แƒฃแƒคแƒ แƒ แƒ แƒ—แƒฃแƒšแƒ˜ แƒ“แƒ˜แƒแƒšแƒแƒ’แƒ”แƒ‘แƒ˜.

แƒแƒ› แƒกแƒ”แƒ แƒ˜แƒ˜แƒก แƒ›แƒแƒ›แƒ“แƒ”แƒ•แƒœแƒ แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒกแƒฌแƒแƒ•แƒšแƒ˜แƒ—, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒจแƒ”แƒ•แƒ–แƒฆแƒฃแƒ“แƒแƒ— แƒ‘แƒแƒขแƒ˜แƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜แƒก แƒฃแƒคแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒกแƒ˜ แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ