R-āĻ āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻ˛āĻŋāĻ—ā§āĻ°āĻžāĻŽ āĻŦāĻŸ āĻ˛ā§‡āĻ–āĻž (āĻĒāĻžāĻ°ā§āĻŸ 4): āĻŦāĻŸā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻŽāĻžā§āĻœāĻ¸ā§āĻ¯āĻĒā§‚āĻ°ā§āĻŖ, āĻ¯ā§ŒāĻ•ā§āĻ¤āĻŋāĻ• āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž

āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻ†āĻ—ā§‡āĻ°āĻŸāĻŋ āĻĒāĻĄāĻŧā§‡ āĻĨāĻžāĻ•ā§‡āĻ¨ āĻ¤āĻŋāĻ¨āĻŸāĻŋ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ āĻāĻ‡ āĻ¸āĻŋāĻ°āĻŋāĻœ āĻĨā§‡āĻ•ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻœāĻžāĻ¨ā§‡āĻ¨ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻ•ā§€āĻŦā§‹āĻ°ā§āĻĄ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻĒā§‚āĻ°ā§āĻŖāĻžāĻ™ā§āĻ— āĻŸā§‡āĻ˛āĻŋāĻ—ā§āĻ°āĻžāĻŽ āĻŦāĻŸ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻšāĻ¯āĻŧāĨ¤

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡, āĻ†āĻŽāĻ°āĻž āĻļāĻŋāĻ–āĻŦ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻŸ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻšāĻ¯āĻŧ āĻ¯āĻž āĻāĻ•āĻŸāĻŋ āĻ§āĻžāĻ°āĻžāĻŦāĻžāĻšāĻŋāĻ• āĻ¸āĻ‚āĻ˛āĻžāĻĒ āĻŦāĻœāĻžāĻ¯āĻŧ āĻ°āĻžāĻ–āĻŦā§‡āĨ¤ āĻ¸ā§‡āĻ—ā§āĻ˛ā§‹. āĻŦāĻŸ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻĒā§āĻ°āĻļā§āĻ¨ āĻœāĻŋāĻœā§āĻžāĻžāĻ¸āĻž āĻ•āĻ°āĻŦā§‡ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•āĻŋāĻ›ā§ āĻ¤āĻĨā§āĻ¯ āĻĒā§āĻ°āĻŦā§‡āĻļ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻŦā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ°āĻŦā§‡āĻļ āĻ•āĻ°āĻž āĻĄā§‡āĻŸāĻžāĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡, āĻŦāĻŸ āĻ•āĻŋāĻ›ā§ āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻ•āĻ°āĻŦā§‡āĨ¤

āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡ āĻ†āĻŽāĻ°āĻž āĻļāĻŋāĻ–āĻŦ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻŦāĻŸ āĻāĻ° āĻšā§āĻĄā§‡āĻ° āĻ¨āĻŋāĻšā§‡ āĻāĻ•āĻŸāĻŋ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖā§‡ āĻāĻŸāĻŋ āĻšāĻŦā§‡ SQLite, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻĒāĻ¨āĻŋ āĻ…āĻ¨ā§āĻ¯ āĻ•ā§‹āĻ¨ DBMS āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤ āĻ†āĻŽāĻŋ R āĻ­āĻžāĻˇāĻžāĻ¯āĻŧ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ…ā§āĻ¯āĻžāĻ•ā§āĻŸ āĻ•āĻ°āĻžāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻ†āĻ°āĻ“ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻ˛āĻŋāĻ–ā§‡āĻ›āĻŋ āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ.

R-āĻ āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻ˛āĻŋāĻ—ā§āĻ°āĻžāĻŽ āĻŦāĻŸ āĻ˛ā§‡āĻ–āĻž (āĻĒāĻžāĻ°ā§āĻŸ 4): āĻŦāĻŸā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻŽāĻžā§āĻœāĻ¸ā§āĻ¯āĻĒā§‚āĻ°ā§āĻŖ, āĻ¯ā§ŒāĻ•ā§āĻ¤āĻŋāĻ• āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž

"R āĻ¤ā§‡ āĻŸā§‡āĻ˛āĻŋāĻ—ā§āĻ°āĻžāĻŽ āĻŦāĻŸ āĻ˛ā§‡āĻ–āĻž" āĻ¸āĻŋāĻ°āĻŋāĻœā§‡āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§

  1. āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻŦāĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ āĻŸā§‡āĻ˛āĻŋāĻ—ā§āĻ°āĻžāĻŽā§‡ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒāĻžāĻ āĻžāĻ¤ā§‡ āĻāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ
  2. āĻŦāĻŸā§‡ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻāĻŦāĻ‚ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨
  3. āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻŸā§‡ āĻ•ā§€āĻŦā§‹āĻ°ā§āĻĄ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻŦā§‡āĻ¨
  4. āĻŦāĻŸā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻŽāĻžā§āĻœāĻ¸ā§āĻ¯āĻĒā§‚āĻ°ā§āĻŖ, āĻ¯ā§ŒāĻ•ā§āĻ¤āĻŋāĻ• āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž

āĻ¸āĻ¨ā§āĻ¤ā§āĻˇā§āĻŸ

āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻĄā§‡āĻŸāĻž āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖā§‡ āĻ†āĻ—ā§āĻ°āĻšā§€ āĻšāĻ¨ āĻ¤āĻŦā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻŽāĻžāĻ° āĻĒā§āĻ°āĻ¤āĻŋ āĻ†āĻ—ā§āĻ°āĻšā§€ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻŸā§‡āĻ˛āĻŋāĻ—ā§āĻ°āĻžāĻŽ и āĻ‡āĻ‰āĻŸāĻŋāĻ‰āĻŦ āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛ āĻ¯āĻžāĻ° āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§ āĻ†āĻ° āĻ­āĻžāĻˇāĻžāĻ•ā§‡ āĻ¨āĻŋāĻŦā§‡āĻĻāĻŋāĻ¤āĨ¤

  1. āĻ­ā§‚āĻŽāĻŋāĻ•āĻž
  2. āĻŦāĻŸ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž
  3. āĻŦāĻŸ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻ•āĻžāĻ āĻžāĻŽā§‹
  4. āĻŦāĻŸ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨
  5. āĻāĻ•āĻŸāĻŋ āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§€āĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨
  6. āĻāĻ•āĻŸāĻŋ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡
  7. āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ˛ā§‡āĻ–āĻž
  8. āĻŦāĻŸ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ
  9. āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°
  10. āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°
  11. āĻŦāĻŸ āĻ˛āĻžā§āĻš āĻ•ā§‹āĻĄ
  12. āĻ‰āĻĒāĻ¸āĻ‚āĻšāĻžāĻ°

āĻ­ā§‚āĻŽāĻŋāĻ•āĻž

āĻŦāĻŸāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•āĻžāĻ› āĻĨā§‡āĻ•ā§‡ āĻĄā§‡āĻŸāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•ā§‹āĻ¨āĻ“ āĻ¤āĻĨā§āĻ¯ āĻĒā§āĻ°āĻŦā§‡āĻļ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¸āĻ‚āĻ˛āĻžāĻĒā§‡āĻ° āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻāĻŸāĻŋ āĻ•āĻ°āĻžāĻ° āĻ¸āĻ°ā§āĻŦā§‹āĻ¤ā§āĻ¤āĻŽ āĻ‰āĻĒāĻžāĻ¯āĻŧ āĻšāĻ˛ āĻ•āĻŋāĻ›ā§ āĻ§āĻ°āĻŖā§‡āĻ° āĻāĻŽāĻŦā§‡āĻĄā§‡āĻĄ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž, āĻ¯ā§‡āĻŽāĻ¨ SQLiteāĨ¤

āĻ¸ā§‡āĻ—ā§āĻ˛ā§‹. āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§‚āĻĒ āĻšāĻŦā§‡āĨ¤ āĻ†āĻŽāĻ°āĻž āĻŦāĻŸ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ•ā§‡ āĻŦāĻ˛āĻŋ, āĻāĻŦāĻ‚ āĻŦāĻŸāĻŸāĻŋ āĻ•ā§āĻ°āĻŽāĻžāĻ¨ā§āĻ¸āĻžāĻ°ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻžāĻ› āĻĨā§‡āĻ•ā§‡ āĻ•āĻŋāĻ›ā§ āĻ¤āĻĨā§āĻ¯ā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ§āĻžāĻĒā§‡ āĻāĻŸāĻŋ āĻāĻ‡ āĻ¤āĻĨā§āĻ¯ āĻĒā§āĻ°āĻŦā§‡āĻļā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻ†āĻŽāĻ°āĻž āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ¸āĻšāĻœ āĻ¸āĻŽā§āĻ­āĻžāĻŦā§āĻ¯ āĻŦāĻŸ āĻ˛āĻŋāĻ–āĻŦ, āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻžāĻŽ āĻœāĻŋāĻœā§āĻžāĻžāĻ¸āĻž āĻ•āĻ°āĻŦā§‡, āĻ¤āĻžāĻ°āĻĒāĻ° āĻ†āĻĒāĻ¨āĻžāĻ° āĻŦāĻ¯āĻŧāĻ¸ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻĄā§‡āĻŸāĻž āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻŦā§‡āĨ¤ āĻŦāĻ¯āĻŧāĻ¸ āĻœāĻŋāĻœā§āĻžāĻžāĻ¸āĻž āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻāĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻŦā§‡ āĻ¯ā§‡ āĻĒā§āĻ°āĻŦā§‡āĻļ āĻ•āĻ°āĻž āĻĄā§‡āĻŸāĻž āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻāĻŦāĻ‚ āĻĒāĻžāĻ ā§āĻ¯ āĻ¨āĻ¯āĻŧāĨ¤

āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¸āĻšāĻœ āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨ā§‡āĻ° āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¤āĻŋāĻ¨āĻŸāĻŋ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻĨāĻžāĻ•āĻŦā§‡:

  1. start āĻšāĻ˛ āĻŦāĻŸā§‡āĻ° āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• āĻ…āĻŦāĻ¸ā§āĻĨāĻž, āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•āĻžāĻ› āĻĨā§‡āĻ•ā§‡ āĻ•ā§‹āĻ¨ā§‹ āĻ¤āĻĨā§āĻ¯ āĻ†āĻļāĻž āĻ•āĻ°ā§‡ āĻ¨āĻž
  2. wait_name - āĻ¯ā§‡ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¯āĻŧ āĻŦāĻŸ āĻāĻ•āĻŸāĻŋ āĻ¨āĻžāĻŽ āĻ˛ā§‡āĻ–āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§‡
  3. wait_age āĻšāĻ˛ āĻ¸ā§‡āĻ‡ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻŦāĻŸ āĻ†āĻĒāĻ¨āĻžāĻ° āĻŦāĻ¯āĻŧāĻ¸ āĻ˛ā§‡āĻ–āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§‡, āĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻ›āĻ°ā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻžāĨ¤

āĻŦāĻŸ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž

āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻ†āĻŽāĻ°āĻž āĻ§āĻžāĻĒā§‡ āĻ§āĻžāĻĒā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŦ; āĻĒā§āĻ°ā§‹ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻŸāĻŋ āĻĒāĻ°āĻŋāĻ•āĻ˛ā§āĻĒāĻ¨āĻžāĻ—āĻ¤āĻ­āĻžāĻŦā§‡ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§‚āĻĒ āĻšāĻŋāĻ¤ā§āĻ°āĻŋāĻ¤ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡:
R-āĻ āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻ˛āĻŋāĻ—ā§āĻ°āĻžāĻŽ āĻŦāĻŸ āĻ˛ā§‡āĻ–āĻž (āĻĒāĻžāĻ°ā§āĻŸ 4): āĻŦāĻŸā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻŽāĻžā§āĻœāĻ¸ā§āĻ¯āĻĒā§‚āĻ°ā§āĻŖ, āĻ¯ā§ŒāĻ•ā§āĻ¤āĻŋāĻ• āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž

  1. āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻŦāĻŸ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ†āĻŽāĻ°āĻž āĻ•āĻŋāĻ›ā§ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻŦāĨ¤ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻŦāĻŸ āĻŸā§‹āĻ•ā§‡āĻ¨, āĻāĻŦāĻ‚ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻĢāĻžāĻ‡āĻ˛ā§‡āĻ° āĻĒāĻĨāĨ¤
  2. āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻāĻ¨āĻ­āĻžāĻ¯āĻŧāĻ°āĻ¨āĻŽā§‡āĻ¨ā§āĻŸ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻŦāĻŸ āĻ¸āĻš āĻĒā§āĻ°āĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻĒāĻĨ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻŦā§‡āĨ¤
  3. āĻ†āĻŽāĻ°āĻž āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻ¨āĻŋāĻœā§‡āĻ‡ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋ, āĻāĻŦāĻ‚ āĻ…āĻ¨ā§‡āĻ•āĻ—ā§āĻ˛āĻŋ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋ āĻ¯āĻžāĻ¤ā§‡ āĻŦāĻŸ āĻāĻŸāĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤
  4. āĻ†āĻŽāĻ°āĻž āĻŦāĻŸ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻ˛āĻŋāĻ–āĻŋ, āĻ¯ā§‡āĻŽāĻ¨ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻāĻŸāĻŋ āĻ¸āĻžā§āĻšāĻžāĻ˛āĻ¨ āĻ•āĻ°āĻž āĻšāĻŦā§‡.
  5. āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡āĨ¤ āĻ¯āĻžāĻ° āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ā§‡ āĻŦāĻŸ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ—ā§āĻ˛āĻŋ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ•āĻ°āĻŦā§‡, āĻ¯āĻž āĻšā§āĻ¯āĻžāĻŸā§‡āĻ° āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡āĨ¤
  6. āĻ†āĻŽāĻ°āĻž āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ° āĻ¯ā§‹āĻ— āĻ•āĻ°āĻŋ āĻ¯āĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻŦāĻŸ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻāĻŦāĻ‚ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ¸āĻ‚āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻŦā§‡āĨ¤
  7. āĻāĻ° āĻŦāĻŸ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻ¯āĻžāĻ•.

āĻŦāĻŸ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻ•āĻžāĻ āĻžāĻŽā§‹

āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŦāĻŸā§‡āĻ° āĻ•ā§‹āĻĄ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāĻ¤ āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ•āĻžāĻ āĻžāĻŽā§‹āĻ¤ā§‡ āĻ­āĻžāĻ— āĻ•āĻ°āĻŦāĨ¤

  • āĻŦāĻŸ.āĻ†āĻ° — āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŦāĻŸā§‡āĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ•ā§‹āĻĄ
  • db_bot_function.R — āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¸āĻš āĻ•ā§‹āĻĄā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ˛āĻ•
  • āĻŦāĻŸ_āĻĒāĻĻā§āĻ§āĻ¤āĻŋ.āĻ†āĻ° - āĻŦāĻŸ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻ•ā§‹āĻĄ
  • āĻŦāĻžāĻ°ā§āĻ¤āĻž_āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°.āĻ†āĻ° - āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°
  • āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°.āĻ†āĻ° - āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°
  • config.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

# 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 āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻžāĻŽ āĻœāĻŋāĻœā§āĻžāĻžāĻ¸āĻž āĻ•āĻ°ā§‡, āĻāĻŦāĻ‚ āĻšā§āĻ¯āĻžāĻŸā§‡āĻ° āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°ā§‡ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž_āĻ¨āĻžāĻŽ, āĻ…āĻ°ā§āĻĨāĻžā§Ž āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻžāĻŽ āĻ˛ā§‡āĻ–āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻŦāĻžāĻ‡āĨ¤

āĻāĻ° āĻĒāĻ°ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻ¨āĻžāĻŽ āĻĒāĻžāĻ āĻžāĻ¨ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ enter_name, āĻŦāĻŸ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ…āĻ­ā§āĻ¯āĻ°ā§āĻĨāĻ¨āĻž āĻœāĻžāĻ¨āĻžāĻ¯āĻŧ, āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻ¨āĻžāĻŽ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻ˛ā§‡āĻ–ā§‡ āĻāĻŦāĻ‚ āĻšā§āĻ¯āĻžāĻŸāĻŸāĻŋ āĻ°āĻžāĻœā§āĻ¯ā§‡ āĻ¸ā§āĻ¯ā§āĻ‡āĻš āĻ•āĻ°ā§‡ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž_āĻŦāĻ¯āĻŧāĻ¸.

āĻāĻ‡ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§‡, āĻŦāĻŸ āĻ†āĻļāĻž āĻ•āĻ°ā§‡ āĻ¯ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻŦāĻ¯āĻŧāĻ¸ā§‡ āĻĒā§āĻ°āĻŦā§‡āĻļ āĻ•āĻ°āĻŦā§‡āĻ¨āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻŦāĻ¯āĻŧāĻ¸ āĻĒāĻžāĻ āĻžāĻ¨, āĻŦāĻŸ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŽā§āĻŦāĻ°ā§‡āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§‡ āĻ•āĻŋāĻ›ā§ āĻĒāĻžāĻ ā§āĻ¯ āĻĒāĻžāĻ āĻžāĻ¨ āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻŦāĻ˛āĻŦā§‡: ĐĸŅ‹ ввŅ‘Đģ ĐŊĐĩĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊŅ‹Đĩ Đ´Đ°ĐŊĐŊŅ‹Đĩ, ввĐĩди Ņ‡Đ¸ŅĐģĐž, āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĄā§‡āĻŸāĻž āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻĒā§āĻ°āĻŦā§‡āĻļ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻŦā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŽā§āĻŦāĻ° āĻĒāĻžāĻ āĻžāĻ¨, āĻŦāĻŸ āĻ°āĻŋāĻĒā§‹āĻ°ā§āĻŸ āĻ•āĻ°āĻŦā§‡ āĻ¯ā§‡ āĻāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻŦāĻ¯āĻŧāĻ¸ āĻ¸ā§āĻŦā§€āĻ•āĻžāĻ° āĻ•āĻ°ā§‡āĻ›ā§‡, āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻĄā§‡āĻŸāĻž āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻ˛āĻŋāĻ–āĻŦā§‡, āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•āĻžāĻ› āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĄā§‡āĻŸāĻž āĻ°āĻŋāĻĒā§‹āĻ°ā§āĻŸ āĻ•āĻ°āĻŦā§‡ āĻāĻŦāĻ‚ āĻšā§āĻ¯āĻžāĻŸ āĻ¸ā§āĻŸā§‡āĻŸāĻŸāĻŋāĻ•ā§‡ āĻ¤āĻžāĻ° āĻ†āĻ¸āĻ˛ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¨ā§‡ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻŦā§‡, āĻ¯ā§‡āĻŽāĻ¨ āĻ­āĻŋ start.

āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§‡ āĻĢā§‹āĻ¨ āĻ•āĻ°ā§‡ state āĻ†āĻĒāĻ¨āĻŋ āĻ¯ā§‡ āĻ•ā§‹āĻ¨ā§‹ āĻ¸āĻŽāĻ¯āĻŧ āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻšā§āĻ¯āĻžāĻŸ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻžāĻ¸ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻāĻŦāĻ‚ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ reset āĻšā§āĻ¯āĻžāĻŸāĻŸāĻŋāĻ•ā§‡ āĻ¤āĻžāĻ° āĻ†āĻ¸āĻ˛ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¯āĻŧ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻāĻŋāĻ¨āĨ¤

āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°

āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻŦāĻŸ āĻ¤ā§ˆāĻ°āĻŋāĻ° āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ…āĻ‚āĻļāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋāĨ¤ āĻāĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ā§‡ āĻ¯ā§‡ āĻŦāĻŸāĻŸāĻŋ āĻŦā§āĻāĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡ āĻ¯ā§‡ āĻāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•āĻžāĻ› āĻĨā§‡āĻ•ā§‡ āĻ•ā§‹āĻ¨ āĻ¤āĻĨā§āĻ¯ āĻ†āĻļāĻž āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻāĻŸāĻŋ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤

āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡ GitHub āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻĢāĻžāĻ‡āĻ˛ā§‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻŦāĻžāĻ°ā§āĻ¤āĻž_āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ°.āĻ†āĻ°.

āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ•ā§‹āĻĄ:

# ###########################################################
# 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āĻŸāĻŋ āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸ, āĻšā§āĻ¯āĻžāĻŸ āĻ†āĻ‡āĻĄāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨āĨ¤

āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž_āĻ¨āĻžāĻŽ āĻ¯āĻ–āĻ¨ āĻšā§āĻ¯āĻžāĻŸ āĻāĻ•āĻŸāĻŋ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¯āĻŧ āĻĨāĻžāĻ•ā§‡ āĻ¤āĻ–āĻ¨ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°ā§‡ā§ˇ 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

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨