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.