αž€αžΆαžšαžŸαžšαžŸαŸαžš bot αž‘αžΌαžšαž›αŸαžαž“αŸ…αž€αŸ’αž“αž»αž„ R (αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 4): αž€αžΆαžšαž€αžŸαžΆαž„αž€αžΆαžšαžŸαž“αŸ’αž‘αž“αžΆαžŸαž˜αž αŸαžαž»αž•αž›αž“αž·αž„αž‘αžΌαž‡αžΈαžαž›αž‡αžΆαž˜αž½αž™ bot

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αžΆαž“αž’αžΆαž“αžšαž½αž…αž αžΎαž™ αž’αžαŸ’αžαž”αž‘αž”αžΈ αž–αžΈαžŸαŸŠαŸαžšαžΈαž“αŸαŸ‡ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž’αŸ’αž“αž€αžŠαžΉαž„αž–αžΈαžšαž”αŸ€αž”αžŸαžšαžŸαŸαžš bots αžαŸαž‘αŸαž€αŸ’αžšαžΆαž˜αž–αŸαž‰αž›αŸαž‰αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αŸ’αžαžΆαžšαž…αž»αž…αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αžšαŸ€αž“αž–αžΈαžšαž”αŸ€αž”αžŸαžšαžŸαŸαžš bot αžŠαŸ‚αž›αž“αžΉαž„αžšαž€αŸ’αžŸαžΆαž€αžΆαžšαžŸαž“αŸ’αž‘αž“αžΆαž‡αžΆαž”αŸ‹αž›αžΆαž”αŸ‹αŸ” αž‘αžΆαŸ†αž„αž“αŸ„αŸ‡αŸ” bot αž“αžΉαž„αžŸαž½αžšαž’αŸ’αž“αž€αž“αžΌαžœαžŸαŸ†αžŽαž½αžš αž αžΎαž™αžšαž„αŸ‹αž…αžΆαŸ†αž’αŸ’αž“αž€αž”αž‰αŸ’αž…αžΌαž›αž–αŸαžαŸŒαž˜αžΆαž“αž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ” αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž’αŸ’αž“αž€αž”αž‰αŸ’αž…αžΌαž› bot αž“αžΉαž„αž’αž“αž»αžœαžαŸ’αžαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ”

αž•αž„αžŠαŸ‚αžšαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αžšαŸ€αž“αž–αžΈαžšαž”αŸ€αž”αž”αŸ’αžšαžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αŸ’αžšαŸ„αž˜αž€αŸ’αžšαžŽαžΆαžαŸ‹αž“αŸƒ bot αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαžšαž”αžŸαŸ‹αž™αžΎαž„αžœαžΆαž“αžΉαž„αž‡αžΆ SQLite αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎ DBMS αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαžšαžŸαŸαžšαž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž’αŸ†αž–αžΈαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‡αžΆαž˜αž½αž™αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž—αžΆαžŸαžΆ R αž“αŸ…αž€αŸ’αž“αž»αž„ αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡.

αž€αžΆαžšαžŸαžšαžŸαŸαžš bot αž‘αžΌαžšαž›αŸαžαž“αŸ…αž€αŸ’αž“αž»αž„ R (αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 4): αž€αžΆαžšαž€αžŸαžΆαž„αž€αžΆαžšαžŸαž“αŸ’αž‘αž“αžΆαžŸαž˜αž αŸαžαž»αž•αž›αž“αž·αž„αž‘αžΌαž‡αžΈαžαž›αž‡αžΆαž˜αž½αž™ bot

αž’αžαŸ’αžαž”αž‘αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž–αžΈαžŸαŸŠαŸαžšαžΈ "αž€αžΆαžšαžŸαžšαžŸαŸαžšαžŸαžΆαžšαž‘αžΌαžšαž›αŸαžαž‡αžΆαž’αž€αŸ’αžŸαžš R"

  1. αž™αžΎαž„αž”αž„αŸ’αž€αžΎαž bot αž αžΎαž™αž”αŸ’αžšαžΎαžœαžΆαžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‰αžΎαžŸαžΆαžšαž€αŸ’αž“αž»αž„αž‘αžΌαžšαž›αŸαž
  2. αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ αž“αž·αž„αžαž˜αŸ’αžšαž„αžŸαžΆαžšαž‘αŸ… bot
  3. αžšαž”αŸ€αž”αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαž€αŸ’αžαžΆαžšαž…αž»αž…αž‘αŸ…αž”αžΌαž
  4. αž€αžΆαžšαž€αžŸαžΆαž„αž€αžΆαžšαžŸαž“αŸ’αž‘αž“αžΆαžŸαž˜αž αŸαžαž»αž•αž› αž“αž·αž„αžŸαž˜αž αŸαžαž»αž•αž›αž‡αžΆαž˜αž½αž™αž”αžΌαž

αž˜αžΆαžαž·αž€αžΆ

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž›αžΎαž€αžΆαžšαžœαž·αž—αžΆαž‚αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž›αžΎαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αž‘αžΌαžšαž›αŸαž ΠΈ YouTube αž†αžΆαž“αŸ‚αž›αŸ” αž˜αžΆαžαž·αž€αžΆαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž§αž‘αŸ’αž‘αž·αžŸαžŠαž›αŸ‹αž—αžΆαžŸαžΆ R αŸ”

  1. αžŸαŸαž…αž€αŸ’αžαžΈαžŽαŸ‚αž“αžΆαŸ†
  2. αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αž”αžΌαž
  3. αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‚αž˜αŸ’αžšαŸ„αž„
  4. αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αžΌαž
  5. αž”αž„αŸ’αž€αžΎαžαž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“
  6. αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™
  7. αž˜αž»αžαž„αžΆαžšαžŸαžšαžŸαŸαžšαžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™
  8. αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž”αžΌαž
  9. αžαž˜αŸ’αžšαž„αžŸαžΆαžš
  10. αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™
  11. αž€αžΌαžŠαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΌαž
  12. αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αžŸαŸαž…αž€αŸ’αžαžΈαžŽαŸ‚αž“αžΆαŸ†

αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™ bot αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαž’αŸ’αž“αž€ αž αžΎαž™αžšαž„αŸ‹αž…αžΆαŸ†αž’αŸ’αž“αž€αž”αž‰αŸ’αž…αžΌαž›αž–αŸαžαŸŒαž˜αžΆαž“αžŽαžΆαž˜αž½αž™ αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžαŸ‹αžαŸ’αžšαžΆαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸƒαž€αžΆαžšαžŸαž“αŸ’αž‘αž“αžΆαŸ” αž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αžŠαŸαž›αŸ’αž’αž”αŸ†αž•αž»αžαžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžœαžΆαž‚αžΊαžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎαž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αž”αŸ‹αžŠαžΌαž…αž‡αžΆ SQLite αŸ”

αž‘αžΆαŸ†αž„αž“αŸ„αŸ‡αŸ” αžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαž“αžΉαž„αž˜αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ” αž™αžΎαž„αž αŸ…αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš bot αž αžΎαž™ bot αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž–αŸαžαŸŒαž˜αžΆαž“αž˜αž½αž™αž…αŸ†αž“αž½αž“αž–αžΈαž™αžΎαž„αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž αžΎαž™αž“αŸ…αž‡αŸ†αž αžΆαž“αž“αžΈαž˜αž½αž™αŸ— αžœαžΆαžšαž„αŸ‹αž…αžΆαŸ†αž–αŸαžαŸŒαž˜αžΆαž“αž“αŸαŸ‡αž”αž‰αŸ’αž…αžΌαž› αž αžΎαž™αž’αžΆαž…αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžœαžΆαž”αžΆαž“αŸ”

αž™αžΎαž„αž“αžΉαž„αžŸαžšαžŸαŸαžš bot αžŠαŸαžŸαžΆαž˜αž‰αŸ’αž‰αž”αŸ†αž•αž»αžαžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“ αžŠαŸ†αž”αžΌαž„αžœαžΆαž“αžΉαž„αžŸαž½αžšαžšαž€αžˆαŸ’αž˜αŸ„αŸ‡αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž’αžΆαž™αž»αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž αžΎαž™αž“αžΉαž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αž‘αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž“αŸ…αž–αŸαž›αžŸαž½αžšαžšαž€αž’αžΆαž™αž» αžœαžΆαž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž›αž‚αžΊαž‡αžΆαž›αŸαž αž˜αž·αž“αž˜αŸ‚αž“αž’αžαŸ’αžαž”αž‘αž‘αŸαŸ”

αž€αžΆαžšαžŸαž“αŸ’αž‘αž“αžΆαžŠαŸαžŸαžΆαž˜αž‰αŸ’αž‰αž”αŸ‚αž”αž“αŸαŸ‡ αž“αžΉαž„αž˜αžΆαž“αžšαžŠαŸ’αž‹αžαŸ‚αž”αžΈαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ–

  1. αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‚αžΊαž‡αžΆαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž’αž˜αŸ’αž˜αžαžΆαžšαž”αžŸαŸ‹ bot αžŠαŸ‚αž›αž€αŸ’αž“αž»αž„αž“αŸ„αŸ‡αžœαžΆαž˜αž·αž“αžšαŸ†αž–αžΉαž„αžαžΆαž“αžΉαž„αž˜αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αžŽαžΆαž˜αž½αž™αž–αžΈαž’αŸ’αž“αž€αž‘αŸαŸ”
  2. wait_name - αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ‚αž› bot αžšαž„αŸ‹αž…αžΆαŸ†αžˆαŸ’αž˜αŸ„αŸ‡αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αž‰αŸ’αž…αžΌαž›
  3. wait_age αž‚αžΊαž‡αžΆαžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ‚αž› bot αžšαž„αŸ‹αž…αžΆαŸ†αž’αžΆαž™αž»αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž› αž…αŸ†αž“αž½αž“αž†αŸ’αž“αžΆαŸ†αž–αŸαž‰αŸ”

αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αž”αžΌαž

αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž’αžαŸ’αžαž”αž‘ αž™αžΎαž„αž“αžΉαž„αž”αž„αŸ’αž€αžΎαž bot αž˜αž½αž™αž‡αŸ†αž αžΆαž“αž˜αŸ’αžαž„αž˜αž½αž™αŸ— αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΆαŸ†αž„αž˜αžΌαž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαžαžΆαž˜αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜:
αž€αžΆαžšαžŸαžšαžŸαŸαžš bot αž‘αžΌαžšαž›αŸαžαž“αŸ…αž€αŸ’αž“αž»αž„ R (αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 4): αž€αžΆαžšαž€αžŸαžΆαž„αž€αžΆαžšαžŸαž“αŸ’αž‘αž“αžΆαžŸαž˜αž αŸαžαž»αž•αž›αž“αž·αž„αž‘αžΌαž‡αžΈαžαž›αž‡αžΆαž˜αž½αž™ bot

  1. αž™αžΎαž„αž”αž„αŸ’αž€αžΎαž bot config αžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ bot token αž“αž·αž„αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αž―αž€αžŸαžΆαžš databaseαŸ”
  2. αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžŠαŸ‚αž›αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αž‡αžΆαž˜αž½αž™ bot αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αŸ”
  3. αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„ αž“αž·αž„αž˜αž»αžαž„αžΆαžšαž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™ bot αž’αžΆαž…αž’αŸ’αžœαžΎαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‡αžΆαž˜αž½αž™αžœαžΆαž”αžΆαž“αŸ”
  4. αž™αžΎαž„αžŸαžšαžŸαŸαžš bot method, i.e. αž˜αž»αžαž„αžΆαžšαžŠαŸ‚αž›αžœαžΆαž“αžΉαž„αž’αž“αž»αžœαžαŸ’αžαŸ”
  5. αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžαž˜αŸ’αžšαž„αžŸαžΆαžšαŸ” αžŠαŸ„αž™αž˜αžΆαž“αž‡αŸ†αž“αž½αž™αžŠαŸ‚αž› bot αž“αžΉαž„αž…αžΌαž›αž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸƒαž€αžΆαžšαž‡αž‡αŸ‚αž€αŸ”
  6. αž™αžΎαž„αž”αž“αŸ’αžαŸ‚αž˜αž§αž”αž€αžšαžŽαŸαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸ‚αž›αž“αžΉαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ αž“αž·αž„αžŸαžΆαžšαž‡αžΆαž˜αž½αž™αž“αžΉαž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš bot αž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ”
  7. αžαŸ„αŸ‡αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš bot αŸ”

αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‚αž˜αŸ’αžšαŸ„αž„

αžŠαžΎαž˜αŸ’αž”αžΈαž—αžΆαž–αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž™αžΎαž„αž“αžΉαž„αž”αŸ‚αž„αž…αŸ‚αž€αž€αžΌαžŠαž“αŸƒ bot αžšαž”αžŸαŸ‹αž™αžΎαž„ αž“αž·αž„αž―αž€αžŸαžΆαžšαž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‘αŸ…αž‡αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ”

  • bot.R - αž›αŸαžαž€αžΌαžŠαžŸαŸ†αžαžΆαž“αŸ‹αž“αŸƒ bot αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”
  • db_bot_function.R - αž”αŸ’αž›αž»αž€αž“αŸƒαž€αžΌαžŠαžŠαŸ‚αž›αž˜αžΆαž“αž˜αž»αžαž„αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™
  • bot_methods.R - αž€αžΌαžŠαž“αŸƒαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš bot
  • message_filters.R - αžαž˜αŸ’αžšαž„αžŸαžΆαžš
  • αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™.R - αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™
  • config.cfg - αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ bot
  • create_db_data.sql - αžŸαŸ’αž‚αŸ’αžšαžΈαž” SQL αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„αžŠαŸ‚αž›αž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αž‡αŸ‚αž€αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™
  • create_db_state.sql - αžŸαŸ’αž‚αŸ’αžšαžΈαž” SQL αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„αž“αŸƒαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž‡αž‡αŸ‚αž€αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™
  • bot.db - αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ bot

αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αž‚αž˜αŸ’αžšαŸ„αž„ bot αž‘αžΆαŸ†αž„αž˜αžΌαž› ឬ αž‘αžΆαž‰αž™αž€ αž–αžΈαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αžƒαŸ’αž›αžΆαŸ†αž„αž“αŸ…αž›αžΎ GitHub.

αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αžΌαž

αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ αž―αž€αžŸαžΆαžš ini, αž‘αž˜αŸ’αžšαž„αŸ‹αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

[bot_settings]
bot_token=Π’ΠžΠšΠ•Π_Π’ΠΠ¨Π•Π“Πž_Π‘ΠžΠ’Π

[db_settings]
db_path=C:/ПУВЬ/К/ΠŸΠΠŸΠšΠ•/ΠŸΠ ΠžΠ•ΠšΠ’Π/bot.db

αž“αŸ…αž€αŸ’αž“αž»αž„ config αž™αžΎαž„αžŸαžšαžŸαŸαžš bot token αž“αž·αž„αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹ database i.e. αž‘αŸ…αž―αž€αžŸαžΆαžš bot.db αž™αžΎαž„αž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžšαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αž“αŸ…αž‡αŸ†αž αžΆαž“αž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ bots αžŸαŸ’αž˜αž»αž‚αŸ’αžšαžŸαŸ’αž˜αžΆαž‰αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αžšαžΎαž“ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαž configs αžŸαŸ’αž˜αž»αž‚αŸ’αžšαžŸαŸ’αž˜αžΆαž‰αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αž αž€αŸ’αžšαŸ…αž–αžΈαž“αŸαŸ‡αžœαžΆαž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžš ini config αž‘αŸ αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž‘αž˜αŸ’αžšαž„αŸ‹αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžšαž½αž˜αž‘αžΆαŸ†αž„ JSON αž•αž„αžŠαŸ‚αžšαŸ”

αž”αž„αŸ’αž€αžΎαžαž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“

αž“αŸ…αž›αžΎαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž“αžΈαž˜αž½αž™αŸ— αžαžαž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž˜αžΆαž“αž‚αž˜αŸ’αžšαŸ„αž„ bot αž’αžΆαž…αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ αž“αž·αž„αž“αŸ…αž›αžΎαžŠαŸ’αžšαžΆαž™αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αžαžαž‚αž˜αŸ’αžšαŸ„αž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαžΆαž˜αžšαž™αŸˆαž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αŸ” TG_BOT_PATH.

αž˜αžΆαž“αžœαž·αž’αžΈαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“ αžŠαŸ‚αž›αžŸαžΆαž˜αž‰αŸ’αž‰αž”αŸ†αž•αž»αžαž‚αžΊαžŸαžšαžŸαŸαžšαžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš .αžšαŸ‰αŸαž“αžœαžΈαžšαŸ‰αž»αž“.

αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαž αž¬αž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž―αž€αžŸαžΆαžšαž“αŸαŸ‡αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ file.edit(path.expand(file.path("~", ".Renviron"))). αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžœαžΆ αž αžΎαž™αž”αž“αŸ’αžαŸ‚αž˜αž”αž“αŸ’αž‘αžΆαžαŸ‹αž˜αž½αž™αž‘αŸ…αž―αž€αžŸαžΆαžšαŸ–

TG_BOT_PATH=C:/ПУВЬ/К/Π’ΠΠ¨Π•ΠœΠ£/ΠŸΠ ΠžΠ•ΠšΠ’Π£

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž―αž€αžŸαžΆαžš .αžšαŸ‰αŸαž“αžœαžΈαžšαŸ‰αž»αž“ αž αžΎαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ RStudio αž‘αžΎαž„αžœαž·αž‰αŸ”

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™

αž‡αŸ†αž αžΆαž“αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‚αžΊαž”αž„αŸ’αž€αžΎαžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžαž»αž…αŸ†αž“αž½αž“ αŸ’αŸ–

  • chat_data β€” αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž› bot αž”αžΆαž“αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž–αžΈαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹
  • 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
);

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αžΆαž“αž‘αžΆαž‰αž™αž€αž‚αž˜αŸ’αžšαŸ„αž„ bot αž–αžΈ 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]])

}

αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž˜αž»αžαž„αžΆαžšαžŸαžΆαž˜αž‰αŸ’αž‰αž…αŸ†αž“αž½αž“ αŸ€αŸ–

  • 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 αž˜αžΆαž“αž€αž˜αŸ’αžšαž·αžαž“αŸƒαž—αžΆαž–αž―αž€αž€αŸ„ αž“αž·αž„αž‡αžΆαž‚αž“αŸ’αž›αžΉαŸ‡αž…αž˜αŸ’αž”αž„αž“αŸƒαžαžΆαžšαžΆαž„αŸ” αž‡αžΆαžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž”αž“αŸ’αžαŸ‚αž˜αž–αŸαžαŸŒαž˜αžΆαž“αž‘αŸ…αž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„ αž αžΎαž™αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž€αŸ†αž αž»αžŸ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‡αž‡αŸ‚αž€αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž˜αžΆαž“αžœαžαŸ’αžαž˜αžΆαž“αžšαž½αž…αž αžΎαž™ αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž™αžΎαž„αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž–αŸαžαŸŒαž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‡αž‡αŸ‚αž€αž“αŸαŸ‡αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αžœαž·αž’αžΈ αž“αž·αž„αžαž˜αŸ’αžšαž„αžšαž”αžŸαŸ‹ bot αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž”αžΌαž

αž‡αŸ†αž αžΆαž“αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž bot αžšαž”αžŸαŸ‹αž™αžΎαž„αž‚αžΊαž”αž„αŸ’αž€αžΎαžαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αžΆαž“αž‘αžΆαž‰αž™αž€αž‚αž˜αŸ’αžšαŸ„αž„αž–αžΈ GitHubαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊαž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš bot_methods.R.

αž€αžΌαžŠαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš Bot

# ###########################################################
# 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')
  }

}

αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž…αŸ†αž“αž½αž“ αŸ₯αŸ–

  • αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ - αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αŸ’αžšαž’αž”αŸ‹
  • αžšαžŠαŸ’αž‹ - αž‘αž‘αž½αž›αž”αžΆαž“αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž‡αž‡αŸ‚αž€αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“
  • αž€αŸ†αžŽαžαŸ‹αž‘αžΎαž„αžœαž·αž‰ - αž€αŸ†αžŽαžαŸ‹αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž‡αž‡αŸ‚αž€αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž‘αžΎαž„αžœαž·αž‰
  • enter_name - bot αžŸαž½αžšαžšαž€αžˆαŸ’αž˜αŸ„αŸ‡αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”
  • enter_age β€” bot αžŸαž½αžšαžšαž€αž’αžΆαž™αž»αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž start αžŸαž½αžšαžšαž€αžˆαŸ’αž˜αŸ„αŸ‡αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž αžΎαž™αž”αŸ’αžαžΌαžšαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž‡αž‡αŸ‚αž€αž‘αŸ… wait_name, i.e. αžŠαžΎαž˜αŸ’αž”αžΈαžšαž„αŸ‹αž…αžΆαŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αžˆαŸ’αž˜αŸ„αŸ‡αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎαžˆαŸ’αž˜αŸ„αŸ‡αž αžΎαž™αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš enter_namebot αžŸαŸ’αžœαžΆαž‚αž˜αž“αŸαž’αŸ’αž“αž€ αžŸαžšαžŸαŸαžšαžˆαŸ’αž˜αŸ„αŸ‡αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αž‘αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž αžΎαž™αž”αŸ’αžαžΌαžšαž€αžΆαžšαž‡αž‡αŸ‚αž€αž‘αŸ…αž‡αžΆαžŸαŸ’αžαžΆαž“αž—αžΆαž– αžšαž„αŸ‹αž…αžΆαŸ†_αž’αžΆαž™αž».

αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž“αŸαŸ‡ bot αžšαŸ†αž–αžΉαž„αžαžΆαž’αŸ’αž“αž€αž“αžΉαž„αž…αžΌαž›αž’αžΆαž™αž»αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎαž’αžΆαž™αž»αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ bot αž–αž·αž“αž·αžαŸ’αž™αžŸαžΆαžš αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž•αŸ’αž‰αžΎαž’αžαŸ’αžαž”αž‘αž˜αž½αž™αž…αŸ†αž“αž½αž“αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž›αŸαž αžœαžΆαž“αžΉαž„αž“αž·αž™αžΆαž™αžαžΆαŸ– Π’Ρ‹ Π²Π²Ρ‘Π» Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, Π²Π²Π΅Π΄ΠΈ Ρ‡ΠΈΡΠ»ΠΎαž αžΎαž™αž“αžΉαž„αžšαž„αŸ‹αž…αžΆαŸ†αž±αŸ’αž™αž’αŸ’αž“αž€αž”αž‰αŸ’αž…αžΌαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αžΎαž„αžœαž·αž‰αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αžΆαž“αž•αŸ’αž‰αžΎαž›αŸαžαž˜αž½αž™ bot αž“αžΉαž„αžšαžΆαž™αž€αžΆαžšαžŽαŸαžαžΆαžœαžΆαž”αžΆαž“αž‘αž‘αž½αž›αž™αž€αž’αžΆαž™αž»αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αžŸαžšαžŸαŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αžšαžΆαž™αž€αžΆαžšαžŽαŸαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αž–αžΈαž’αŸ’αž“αž€ αž αžΎαž™αžαŸ’αžšαž‘αž”αŸ‹αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž‡αž‡αŸ‚αž€αž‘αŸ…αž‘αžΈαžαžΆαŸ†αž„αžŠαžΎαž˜αžšαž”αžŸαŸ‹αžœαžΆ αž–αŸ„αž›αž‚αžΊαž§αŸ” វ start.

αžŠαŸ„αž™αž αŸ…αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš state αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αžŸαŸ’αž“αžΎβ€‹αžŸαž»αŸ†β€‹αžŸαŸ’αžαžΆαž“αž—αžΆαž–β€‹αž‡αž‡αŸ‚αž€β€‹αž€αŸ†αžŸαžΆαž“αŸ’αžβ€‹αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“β€‹αž“αŸ…β€‹αž–αŸαž›β€‹αžŽαžΆβ€‹αž€αŸβ€‹αž”αžΆαž“ αž αžΎαž™β€‹αžŠαŸ„αž™β€‹αž”αŸ’αžšαžΎβ€‹αž–αžΆαž€αŸ’αž™β€‹αž”αž‰αŸ’αž‡αžΆ reset αžαŸ’αžšαž‘αž”αŸ‹αž€αžΆαžšαž‡αž‡αŸ‚αž€αž‘αŸ…αžŸαž—αžΆαž–αžŠαžΎαž˜αžšαž”αžŸαŸ‹αžœαžΆαŸ”

αžαž˜αŸ’αžšαž„αžŸαžΆαžš

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αžŠαŸαžŸαŸ†αžαžΆαž“αŸ‹αž”αŸ†αž•αž»αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž bot αŸ” αžœαžΆαž‚αžΊαžŠαŸ„αž™αž˜αžΆαž“αž‡αŸ†αž“αž½αž™αž–αžΈαžαž˜αŸ’αžšαž„αžŸαžΆαžšαžŠαŸ‚αž› bot αž“αžΉαž„αž™αž›αŸ‹αž–αžΈαž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αžœαžΆαžšαŸ†αž–αžΉαž„αž‘αž»αž€αž–αžΈαž’αŸ’αž“αž€ αž“αž·αž„αžšαž”αŸ€αž”αžŠαŸ‚αž›αžœαžΆαž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αž“αŸ…αž›αžΎ GitHub αžαž˜αŸ’αžšαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš message_filters.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 αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹ αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž€αžΆαžšαž‡αž‡αŸ‚αž€αŸ”

αžαž˜αŸ’αžšαž„αž”αž“αŸ’αž‘αžΆαž”αŸ‹ wait_name αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαžšαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž‡αž‡αŸ‚αž€αžŸαŸ’αžαž·αžαž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž˜αž½αž™αŸ” wait_nameαž αžΎαž™αž™αŸ„αž„αž‘αŸ…αžαžΆαž˜αžαž˜αŸ’αžšαž„ αžšαž„αŸ‹αž…αžΆαŸ†_αž’αžΆαž™αž» αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαžšαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž‡αž‡αŸ‚αž€αžŸαŸ’αžαž·αžαž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž˜αž½αž™αŸ” wait_age.

αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™

αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž˜αžΆαž“αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ αž’αŸ’αž“αž€αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™.Rαž“αž·αž„αž˜αžΆαž“αž›αŸαžαž€αžΌαžŠαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸˆ

# ###########################################################
# 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αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž’αžΆαž…αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž‡αž‡αŸ‚αž€αžŽαžΆαž˜αž½αž™αŸ”

αž€αžΌαžŠαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΌαž

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž˜αžΆαž“αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αžŠαžΎαž˜αŸ’αž”αžΈαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž€αžΌαžŠαž…αž˜αŸ’αž”αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš bot αž‚αžΊαž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš bot.R.

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()

αž‡αžΆαž›αž‘αŸ’αž’αž•αž›αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“ bot αž“αŸαŸ‡αŸ–
αž€αžΆαžšαžŸαžšαžŸαŸαžš bot αž‘αžΌαžšαž›αŸαžαž“αŸ…αž€αŸ’αž“αž»αž„ R (αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 4): αž€αžΆαžšαž€αžŸαžΆαž„αž€αžΆαžšαžŸαž“αŸ’αž‘αž“αžΆαžŸαž˜αž αŸαžαž»αž•αž›αž“αž·αž„αž‘αžΌαž‡αžΈαžαž›αž‡αžΆαž˜αž½αž™ bot

αž“αŸ…αž–αŸαž›αžŽαžΆαž˜αž½αž™αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ /state αž™αžΎαž„αž’αžΆαž…αžŸαž½αžšαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž‡αž‡αŸ‚αž€αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ αž“αž·αž„αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ /reset αžαŸ’αžšαž‘αž”αŸ‹αž€αžΆαžšαž‡αž‡αŸ‚αž€αž‘αŸ…αžŸαž—αžΆαž–αžŠαžΎαž˜αžšαž”αžŸαŸ‹αžœαžΆ αž αžΎαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαžŸαž“αŸ’αž‘αž“αžΆαž˜αŸ’αžαž„αž‘αŸ€αžαŸ”

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž™αžΎαž„αž”αžΆαž“αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αž”αŸ’αžšαžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„ bot αž“αž·αž„αžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžŸαž“αŸ’αž‘αž“αžΆαžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαžαžΆαž˜αž›αŸ†αžŠαžΆαž”αŸ‹αž›αŸ†αžŠαŸ„αž™αžŠαŸ„αž™αž€αžαŸ‹αžαŸ’αžšαžΆαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž‡αž‡αŸ‚αž€αŸ”

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž™αžΎαž„αž”αžΆαž“αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž§αž‘αžΆαž αžšαžŽαŸαž”αž‹αž˜αž”αŸ†αž•αž»αž αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ„αž™αž’αŸ’αž“αž€αž™αž›αŸ‹αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αž”αžΆαžŸαŸ‹αž–αžΈαž‚αŸ†αž“αž·αžαž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž bots αž”αŸ‚αž”αž“αŸαŸ‡ αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžŸαž“αŸ’αž‘αž“αžΆαžŠαŸ‚αž›αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž‡αžΆαž„αž“αŸαŸ‡αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸŠαŸαžšαžΈαž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αžšαŸ€αž“αž–αžΈαžšαž”αŸ€αž”αžŠαžΆαž€αŸ‹αž€αž˜αŸ’αžšαž·αžαžŸαž·αž‘αŸ’αž’αž·αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎ bot αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž•αŸ’αžŸαŸαž„αŸ—αžšαž”αžŸαŸ‹αžœαžΆαŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹