README.md in telegram-bot-ruby-1.0.0 vs README.md in telegram-bot-ruby-2.0.0

- old
+ new

@@ -7,11 +7,13 @@ [![Maintainability](https://api.codeclimate.com/v1/badges/7e61fbf5bec86e118fb1/maintainability)](https://codeclimate.com/github/atipugin/telegram-bot-ruby/maintainability) [![Say Thanks!](https://img.shields.io/badge/Say%20Thanks!-🦉-1EAEDB.svg)](https://saythanks.io/to/atipugin) ## 🚧 Upgrading to 1.0 -Since v1.0 telegram-bot-ruby uses [dry-struct](https://github.com/dry-rb/dry-struct) instead of [virtus](https://github.com/solnic/virtus). This means that type objects are now immutable and you can't change them after initialization: +Since v1.0 `telegram-bot-ruby` uses [`dry-struct`](https://github.com/dry-rb/dry-struct) +instead of [`virtus`](https://github.com/solnic/virtus). +This means that type objects are now immutable and you can't change them after initialization: ```ruby # This won't work kb = Telegram::Bot::Types::ReplyKeyboardRemove.new kb.remove_keyboard = true @@ -25,11 +27,11 @@ ## Installation Add following line to your Gemfile: ```ruby -gem 'telegram-bot-ruby' +gem 'telegram-bot-ruby', '~> 1.0' ``` And then execute: ```shell @@ -42,11 +44,12 @@ gem install telegram-bot-ruby ``` ## Usage -First things first, you need to [obtain a token](https://core.telegram.org/bots#6-botfather) for your bot. Then create your Telegram bot like this: +First things first, you need to [obtain a token](https://core.telegram.org/bots#6-botfather) for your bot. +Then create your Telegram bot like this: ```ruby require 'telegram/bot' token = 'YOUR_TELEGRAM_BOT_API_TOKEN' @@ -61,39 +64,63 @@ end end end ``` -Note that `bot.api` object implements [Telegram Bot API methods](https://core.telegram.org/bots/api#available-methods) as is. So you can invoke any method inside the block without any problems. All methods are available in both *snake_case* and *camelCase* notations. +Note that `bot.api` object implements +[Telegram Bot API methods](https://core.telegram.org/bots/api#available-methods) as is. +So you can invoke any method inside the block without any problems. +All methods are available in both *snake_case* and *camelCase* notations. If you need to start a bot in development mode you have to pass `environment: :test`: ```ruby Telegram::Bot::Client.run(token, environment: :test) do |bot| # ... end ``` -Same thing about `message` object - it implements [Message](https://core.telegram.org/bots/api#message) spec, so you always know what to expect from it. +Same thing about `message` object: it implements [Message](https://core.telegram.org/bots/api#message) spec, +so you always know what to expect from it. +To gracefully stop the bot, for example by `INT` signal (Ctrl-C), call the `bot.stop` method: + +```ruby +bot = Telegram::Bot::Client.new(token) + +Signal.trap('INT') do + bot.stop +end + +bot.listen do |message| + # it will be in an infinity loop until `bot.stop` command + # (with a small delay for the current `fetch_updates` request) +end +``` + ## Webhooks -If you are going to use [webhooks](https://core.telegram.org/bots/api#setwebhook) instead of [long polling](https://core.telegram.org/bots/api#getupdates), you need to implement your own webhook callbacks server. Take a look at [this repo](https://github.com/solyaris/BOTServer) as an example. +If you are going to use [webhooks](https://core.telegram.org/bots/api#setwebhook) +instead of [long polling](https://core.telegram.org/bots/api#getupdates), +you need to implement your own webhook callbacks server. +Take a look at [this repo](https://github.com/solyaris/BOTServer) as an example. ## Proxy -As some countries block access to Telegram, you can set up your own proxy and use it to access Telegram API. In this case you need to configure API url: +As some countries block access to Telegram, you can set up your own proxy and use it to access Telegram API. +In this case you need to configure API URL: ```ruby Telegram::Bot::Client.run(token, url: 'https://proxy.example.com') do |bot| # ... end ``` ## Custom keyboards -You can use your own [custom keyboards](https://core.telegram.org/bots#keyboards). Here is an example: +You can use your own [custom keyboards](https://core.telegram.org/bots#keyboards). +Here is an example: ```ruby bot.listen do |message| case message.text when '/start' @@ -129,11 +156,12 @@ end ``` ## Inline keyboards -[Bot API 2.0](https://core.telegram.org/bots/2-0-intro) brought us new inline keyboards. Example: +[Bot API 2.0](https://core.telegram.org/bots/2-0-intro) brought us new inline keyboards. +Example: ```ruby bot.listen do |message| case message when Telegram::Bot::Types::CallbackQuery @@ -177,17 +205,29 @@ bot.api.send_message(chat_id: message.chat.id, text: "Hello, #{message.from.first_name}!") end end ``` -Now, with `inline` mode enabled, your `message` object can be an instance of [Message](https://core.telegram.org/bots/api#message), [InlineQuery](https://core.telegram.org/bots/api#inlinequery) or [ChosenInlineResult](https://core.telegram.org/bots/api#choseninlineresult). That's why you need to check type of each message and decide how to handle it. +Now, with `inline` mode enabled, your `message` object can be an instance of +[Message](https://core.telegram.org/bots/api#message), +[InlineQuery](https://core.telegram.org/bots/api#inlinequery) or +[ChosenInlineResult](https://core.telegram.org/bots/api#choseninlineresult). +That's why you need to check type of each message and decide how to handle it. -Using `answer_inline_query` you can send query results to user. `results` field must be an array of [query result objects](https://core.telegram.org/bots/api#inlinequeryresult). +Using `answer_inline_query` you can send query results to user. +`results` field must be an array of [query result objects](https://core.telegram.org/bots/api#inlinequeryresult). ## File upload -Your bot can even upload files ([photos](https://core.telegram.org/bots/api#sendphoto), [audio](https://core.telegram.org/bots/api#sendaudio), [documents](https://core.telegram.org/bots/api#senddocument), [stickers](https://core.telegram.org/bots/api#sendsticker), [video](https://core.telegram.org/bots/api#sendvideo)) to Telegram servers. Just like this: +Your bot can even upload files +([photos](https://core.telegram.org/bots/api#sendphoto), +[audio](https://core.telegram.org/bots/api#sendaudio), +[documents](https://core.telegram.org/bots/api#senddocument), +[stickers](https://core.telegram.org/bots/api#sendsticker), +[video](https://core.telegram.org/bots/api#sendvideo)) +to Telegram servers. +Just like this: ```ruby bot.listen do |message| case message.text when '/photo' @@ -197,11 +237,13 @@ end ``` ## Logging -By default, bot doesn't log anything (uses `NullLoger`). You can change this behavior and provide your own logger class. See example below: +By default, bot doesn't log anything (uses `NullLoger`). +You can change this behavior and provide your own logger class. +See example below: ```ruby Telegram::Bot::Client.run(token, logger: Logger.new($stderr)) do |bot| bot.logger.info('Bot has been started') bot.listen do |message| @@ -210,11 +252,12 @@ end ``` ## Connection adapters -Since version `0.5.0` we rely on [faraday](https://github.com/lostisland/faraday) under the hood. You can use any of supported adapters (for example, `net/http/persistent`): +Since version `0.5.0` we rely on [faraday](https://github.com/lostisland/faraday) under the hood. +You can use any of supported adapters (for example, `net/http/persistent`): ```ruby require 'net/http/persistent' Telegram::Bot.configure do |config| @@ -222,16 +265,17 @@ end ``` ## Boilerplates -If you don't know how to setup database for your bot or how to use it with different languages here are some boilerplates which can help you to start faster: +If you don't know how to setup database for your bot or how to use it with different languages +here are some boilerplates which can help you to start faster: - [Ruby Telegram Bot boilerplate](https://github.com/telegram-bots/ruby-telegram-bot-boilerplate) ## Contributing -1. Fork it -2. Create your feature branch (git checkout -b my-new-feature) -3. Commit your changes (git commit -am 'Add some feature') -4. Push to the branch (git push origin my-new-feature) -5. Create new Pull Request +1. Fork it. +2. Create your feature branch (`git checkout -b my-new-feature`). +3. Commit your changes (`git commit -am 'Add some feature'`). +4. Push to the branch (`git push origin my-new-feature`). +5. Create a new Pull Request.