fantastic_robot 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +117 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +19 -0
  5. data/CODE_OF_CONDUCT.md +49 -0
  6. data/Gemfile +4 -0
  7. data/Gemfile.lock +48 -0
  8. data/LICENSE +22 -0
  9. data/README.md +147 -0
  10. data/Rakefile +10 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/fantastic_robot.gemspec +32 -0
  14. data/lib/fantastic_robot/configuration.rb +32 -0
  15. data/lib/fantastic_robot/connection.rb +36 -0
  16. data/lib/fantastic_robot/model/attachment/audio.rb +12 -0
  17. data/lib/fantastic_robot/model/attachment/base.rb +15 -0
  18. data/lib/fantastic_robot/model/attachment/contact.rb +11 -0
  19. data/lib/fantastic_robot/model/attachment/document.rb +16 -0
  20. data/lib/fantastic_robot/model/attachment/location.rb +10 -0
  21. data/lib/fantastic_robot/model/attachment/photo_size.rb +12 -0
  22. data/lib/fantastic_robot/model/attachment/sticker.rb +17 -0
  23. data/lib/fantastic_robot/model/attachment/video.rb +17 -0
  24. data/lib/fantastic_robot/model/attachment/voice.rb +12 -0
  25. data/lib/fantastic_robot/model/base.rb +68 -0
  26. data/lib/fantastic_robot/model/chat.rb +14 -0
  27. data/lib/fantastic_robot/model/file.rb +14 -0
  28. data/lib/fantastic_robot/model/message.rb +51 -0
  29. data/lib/fantastic_robot/model/update.rb +15 -0
  30. data/lib/fantastic_robot/model/user.rb +11 -0
  31. data/lib/fantastic_robot/models.rb +6 -0
  32. data/lib/fantastic_robot/request/base.rb +59 -0
  33. data/lib/fantastic_robot/request/forward_message.rb +18 -0
  34. data/lib/fantastic_robot/request/get_me.rb +9 -0
  35. data/lib/fantastic_robot/request/send_audio.rb +32 -0
  36. data/lib/fantastic_robot/request/send_chat_action.rb +18 -0
  37. data/lib/fantastic_robot/request/send_document.rb +32 -0
  38. data/lib/fantastic_robot/request/send_location.rb +17 -0
  39. data/lib/fantastic_robot/request/send_message.rb +17 -0
  40. data/lib/fantastic_robot/request/send_photo.rb +16 -0
  41. data/lib/fantastic_robot/request/send_sticker.rb +18 -0
  42. data/lib/fantastic_robot/request/send_video.rb +32 -0
  43. data/lib/fantastic_robot/request/send_voice.rb +32 -0
  44. data/lib/fantastic_robot/request/set_webhook.rb +29 -0
  45. data/lib/fantastic_robot/requests.rb +13 -0
  46. data/lib/fantastic_robot/version.rb +3 -0
  47. data/lib/fantastic_robot.rb +56 -0
  48. data/lib/generators/fantastic_robot/files/fantastic_robot.rb +12 -0
  49. data/lib/generators/fantastic_robot/install_generator.rb +13 -0
  50. metadata +197 -0
@@ -0,0 +1,12 @@
1
+ module FantasticRobot
2
+ # This object represents a voice note.
3
+ class Model::Attachment::Voice < Model::Attachment::Base
4
+
5
+ attr_accessor :file_id, :file_size, :duration, :mime_type
6
+
7
+ validates :file_id, :duration, presence: true
8
+ validates :duration, numericality: true
9
+ validates :file_size, numericality: true, unless: 'file_size.blank?'
10
+
11
+ end
12
+ end
@@ -0,0 +1,68 @@
1
+ module FantasticRobot
2
+ module Model
3
+ class Base
4
+ include ::ActiveModel::Model
5
+ include ::ActiveModel::Validations
6
+ include ::ActiveModel::Serialization
7
+ include ::ActiveModel::Serializers::JSON
8
+
9
+ # As the models include a lot of different objects related,
10
+ # we build a conversion hash that indicates the type of objects
11
+ # required in special fields.
12
+ FIELD_CONVERSIONS = {}
13
+
14
+ # Initializer that converts the fields received if necessary
15
+ def initialize(attributes = {})
16
+
17
+ # Define a setter for each field that need to be converted
18
+ self.class::FIELD_CONVERSIONS.each do |field_name, field_type|
19
+ self.class.send(:define_method, "#{field_name}=") do |value|
20
+ if (value.is_a?(Array))
21
+ # If we receive an array, process each value
22
+ value.map! do |v|
23
+ # Convert each object except if it is already converted or nil
24
+ v = ((v.class == field_type || v.nil?) ? v : field_type.new(v))
25
+ end
26
+ else
27
+ # If it isn't an array, try to convert the object
28
+ value = field_type.new(value) unless (value.class == field_type || value.nil?)
29
+ end
30
+
31
+ # Set the result
32
+ instance_variable_set("@#{field_name}", value)
33
+ end
34
+ end
35
+
36
+ super(attributes)
37
+ end
38
+
39
+ # Attribute map for ActiveModel::Serialization.
40
+ def attributes
41
+ Hash[instance_variables.map{|attrib| [attrib.to_s[1..attrib.to_s.size], nil]}]
42
+ end
43
+
44
+ # Proxy to get a serialized version of the object.
45
+ def to_h
46
+ recursive_serialization(self)
47
+ end
48
+
49
+ private
50
+
51
+ # Method to try to recursively seralize the objects received
52
+ def recursive_serialization object
53
+ if (object.is_a?(Array))
54
+ # If it's an array, try to serialize each element
55
+ return object.map{|o| recursive_serialization(o)}
56
+ elsif (object.is_a?(Hash))
57
+ # It's a hash, convert each key to sym and try to serialize each value
58
+ return Hash[object.map{|k,v| [k.to_sym, recursive_serialization(v)]}]
59
+ elsif (object.respond_to?(:serializable_hash))
60
+ # If it can be seralized, serialize and try to recursively convert it's attributes
61
+ return recursive_serialization(object.serializable_hash)
62
+ else
63
+ return object
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,14 @@
1
+ module FantasticRobot
2
+ # This object represents a chat.
3
+ class Model::Chat < Model::Base
4
+
5
+ VALID_TYPES = ["private", "group", "supergroup", "channel"]
6
+
7
+ attr_accessor :id, :type, :title, :username, :first_name, :last_name
8
+
9
+ validates :id, :type, presence: true
10
+ validates :id, numericality: true
11
+ validates :type, inclusion: {in: VALID_TYPES}
12
+
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module FantasticRobot
2
+ # This object represents a file.
3
+ class Model::File < Model::Base
4
+
5
+ attr_accessor :file_id, :file_size, :file_path
6
+
7
+ validates :file_id, presence: true
8
+ validates :file_size, numericality: true, allow_blank: true
9
+
10
+ def self.file
11
+ FantasticRobot.connection.get_by_path(self.file_path) unless self.file_path.blank?
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,51 @@
1
+ require 'fantastic_robot/model/attachment/base'
2
+ require 'fantastic_robot/model/attachment/photo_size'
3
+ require 'fantastic_robot/model/attachment/audio'
4
+ require 'fantastic_robot/model/attachment/contact'
5
+ require 'fantastic_robot/model/attachment/document'
6
+ require 'fantastic_robot/model/attachment/location'
7
+ require 'fantastic_robot/model/attachment/sticker'
8
+ require 'fantastic_robot/model/attachment/video'
9
+ require 'fantastic_robot/model/attachment/voice'
10
+
11
+ module FantasticRobot
12
+ class Model::Message < Model::Base
13
+
14
+ attr_accessor :message_id, :from, :date, :chat, :forward_from, :fordward_date,
15
+ :reply_to_message
16
+
17
+ validates :message_id, :date, :chat, presence: true
18
+ validates :message_id, :date, numericality: true
19
+ validates :fordward_date, numericality: true, unless: 'fordward_date.blank?'
20
+
21
+ attr_accessor :text, :audio, :document, :photo, :sticker, :video, :voice,
22
+ :caption, :contact, :location
23
+
24
+ attr_accessor :new_chat_participant, :left_chat_participant, :new_chat_title, :new_chat_photo,
25
+ :delete_chat_photo, :group_chat_created, :supergroup_chat_created,
26
+ :channel_chat_created, :migrate_to_chat_id, :migrate_from_chat_id
27
+
28
+ validates :migrate_to_chat_id, numericality: true, unless: 'migrate_to_chat_id.blank?'
29
+ validates :migrate_from_chat_id, numericality: true, unless: 'migrate_from_chat_id.blank?'
30
+
31
+ # Field conversions of this model
32
+ FIELD_CONVERSIONS = {
33
+ from: FantasticRobot::Model::User,
34
+ chat: FantasticRobot::Model::Chat,
35
+ forward_from: FantasticRobot::Model::User,
36
+ reply_to_message: FantasticRobot::Model::Message,
37
+ audio: FantasticRobot::Model::Attachment::Audio,
38
+ document: FantasticRobot::Model::Attachment::Document,
39
+ photo: FantasticRobot::Model::Attachment::PhotoSize,
40
+ sticker: FantasticRobot::Model::Attachment::Sticker,
41
+ video: FantasticRobot::Model::Attachment::Video,
42
+ voice: FantasticRobot::Model::Attachment::Voice,
43
+ contact: FantasticRobot::Model::Attachment::Contact,
44
+ location: FantasticRobot::Model::Attachment::Location,
45
+ new_chat_participant: FantasticRobot::Model::User,
46
+ left_chat_participant: FantasticRobot::Model::User,
47
+ new_chat_photo: FantasticRobot::Model::Attachment::PhotoSize
48
+ }
49
+
50
+ end
51
+ end
@@ -0,0 +1,15 @@
1
+ module FantasticRobot
2
+ class Model::Update < Model::Base
3
+
4
+ attr_accessor :update_id, :message
5
+
6
+ validates :update_id, presence: true
7
+ validates :update_id, numericality: true
8
+
9
+ # Field conversions of this model
10
+ FIELD_CONVERSIONS = {
11
+ message: FantasticRobot::Model::Message
12
+ }
13
+
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ module FantasticRobot
2
+ # This object represents a Telegram user or bot.
3
+ class Model::User < Model::Base
4
+
5
+ attr_accessor :id, :first_name, :last_name, :username
6
+
7
+ validates :id, :first_name, presence: true
8
+ validates :id, numericality: true
9
+
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ require "fantastic_robot/model/base"
2
+ require "fantastic_robot/model/user"
3
+ require "fantastic_robot/model/chat"
4
+ require "fantastic_robot/model/file"
5
+ require "fantastic_robot/model/message"
6
+ require "fantastic_robot/model/update"
@@ -0,0 +1,59 @@
1
+ module FantasticRobot
2
+ module Request
3
+ class Base
4
+ include ::ActiveModel::Model
5
+ include ::ActiveModel::Validations
6
+ include ::ActiveModel::Serialization
7
+ include ::ActiveModel::Serializers::JSON
8
+
9
+ attr_reader :method
10
+
11
+ # Initializer that assigns the fields received
12
+ def initialize(attributes = {})
13
+ super(attributes)
14
+ end
15
+
16
+ # Attribute map for ActiveModel::Serialization.
17
+ def attributes
18
+ Hash[instance_variables.map{|attrib| [attrib.to_s[1..attrib.to_s.size], nil]}]
19
+ end
20
+
21
+ # Proxy to get a serialized version of the object.
22
+ def to_h
23
+ recursive_serialization(self)
24
+ end
25
+
26
+ # Send request to Telegram API
27
+ def send_request
28
+ raise ArgumentError, "Method name not defined" if (self.method.blank?)
29
+
30
+ payload = self.to_h
31
+ payload.delete(:method)
32
+
33
+ payload.each do |key, value|
34
+ payload[key] = Faraday::UploadIO.new(payload[key], MIME::Types.type_for(payload[key].path).first.content_type) if (value.is_a?(File))
35
+ end
36
+
37
+ FantasticRobot.connection.api_call self.method, payload
38
+ end
39
+
40
+ private
41
+
42
+ # Method to try to recursively seralize the objects received
43
+ def recursive_serialization object
44
+ if (object.is_a?(Array))
45
+ # If it's an array, try to serialize each element
46
+ return object.map{|o| recursive_serialization(o)}
47
+ elsif (object.is_a?(Hash))
48
+ # It's a hash, convert each key to sym and try to serialize each value
49
+ return Hash[object.map{|k,v| [k.to_sym, recursive_serialization(v)]}]
50
+ elsif (object.respond_to?(:serializable_hash))
51
+ # If it can be seralized, serialize and try to recursively convert it's attributes
52
+ return recursive_serialization(object.serializable_hash)
53
+ else
54
+ return object
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,18 @@
1
+ module FantasticRobot
2
+ # This object represents a forwardMessage request
3
+ class Request::ForwardMessage < Request::Base
4
+
5
+ attr_accessor :chat_id, :from_chat_id, :message_id, :disable_web_page_preview, :reply_to_message_id, :reply_markup
6
+
7
+ validates :chat_id, :from_chat_id, :message_id, presence: true
8
+ validates :message_id, presence: true
9
+ validates :chat_id, numericality: true, unless: "chat_id.to_s[0,1] == '@'"
10
+ validates :from_chat_id, numericality: true, unless: "from_chat_id.to_s[0,1] == '@'"
11
+ validates :reply_to_message_id, numericality: true, allow_blank: true
12
+
13
+ def initialize(attributes = {})
14
+ super(attributes)
15
+ @method = :forwardMessage
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ module FantasticRobot
2
+ # This object represents a getMe request
3
+ class Request::GetMe < Request::Base
4
+ def initialize(attributes = {})
5
+ super(attributes)
6
+ @method = :getMe
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,32 @@
1
+ module FantasticRobot
2
+ # This object represents a sendAudio request
3
+ class Request::SendAudio < Request::Base
4
+
5
+ MAX_FILE_SIZE = 50*1024*1024
6
+
7
+ attr_accessor :chat_id, :audio, :duration, :performer, :title, :reply_to_message_id, :reply_markup
8
+
9
+ validates :chat_id, :audio, presence: true
10
+ validates :chat_id, numericality: true, unless: "chat_id.to_s[0,1] == '@'"
11
+ validates :duration, :reply_to_message_id, numericality: true, allow_blank: true
12
+
13
+ validate :file_length
14
+
15
+ def initialize(attributes = {})
16
+ super(attributes)
17
+ @method = :sendAudio
18
+ end
19
+
20
+ private
21
+
22
+ # Function to check that the file size isn't excesive.
23
+ def file_length
24
+ if self.audio.is_a?(File) && self.audio.size > MAX_FILE_SIZE
25
+ self.errors.add :audio, "It's length is excesive. #{MAX_FILE_SIZE} is the limit."
26
+ return false
27
+ end
28
+
29
+ return true
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,18 @@
1
+ module FantasticRobot
2
+ # This object represents a sendChatAction request
3
+ class Request::SendChatAction < Request::Base
4
+
5
+ attr_accessor :chat_id, :action
6
+
7
+ VALID_ACTIONS = [:typing, :upload_photo, :record_video, :upload_video, :record_audio, :upload_audio, :upload_document, :find_location]
8
+
9
+ validates :chat_id, :action, presence: true
10
+ validates :chat_id, numericality: true, unless: "chat_id.to_s[0,1] == '@'"
11
+ validates :action, inclusion: { in: VALID_ACTIONS }
12
+
13
+ def initialize(attributes = {})
14
+ super(attributes)
15
+ @method = :sendChatAction
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,32 @@
1
+ module FantasticRobot
2
+ # This object represents a sendDocument request
3
+ class Request::SendDocument < Request::Base
4
+
5
+ MAX_FILE_SIZE = 50*1024*1024
6
+
7
+ attr_accessor :chat_id, :document, :reply_to_message_id, :reply_markup
8
+
9
+ validates :chat_id, :document, presence: true
10
+ validates :chat_id, numericality: true, unless: "chat_id.to_s[0,1] == '@'"
11
+ validates :reply_to_message_id, numericality: true, allow_blank: true
12
+
13
+ validate :file_length
14
+
15
+ def initialize(attributes = {})
16
+ super(attributes)
17
+ @method = :sendDocument
18
+ end
19
+
20
+ private
21
+
22
+ # Function to check that the file size isn't excesive.
23
+ def file_length
24
+ if self.document.is_a?(File) && self.document.size > MAX_FILE_SIZE
25
+ self.errors.add :document, "It's length is excesive. #{MAX_FILE_SIZE} is the limit."
26
+ return false
27
+ end
28
+
29
+ return true
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,17 @@
1
+ module FantasticRobot
2
+ # This object represents a sendLocation request
3
+ class Request::SendLocation < Request::Base
4
+
5
+ attr_accessor :chat_id, :latitude, :longitude, :reply_to_message_id, :reply_markup
6
+
7
+ validates :chat_id, :latitude, :longitude, presence: true
8
+ validates :latitude, :longitude, numericality: true
9
+ validates :chat_id, numericality: true, unless: "chat_id.to_s[0,1] == '@'"
10
+ validates :reply_to_message_id, numericality: true, allow_blank: true
11
+
12
+ def initialize(attributes = {})
13
+ super(attributes)
14
+ @method = :sendLocation
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module FantasticRobot
2
+ # This object represents a sendMessage request
3
+ class Request::SendMessage < Request::Base
4
+
5
+ attr_accessor :chat_id, :text, :parse_mode, :disable_web_page_preview, :reply_to_message_id, :reply_markup
6
+
7
+ validates :chat_id, :text, presence: true
8
+ validates :chat_id, numericality: true, unless: "chat_id.to_s[0,1] == '@'"
9
+ validates :disable_web_page_preview, inclusion: {in: [true, false]}, allow_blank: true
10
+ validates :reply_to_message_id, numericality: true, allow_blank: true
11
+
12
+ def initialize(attributes = {})
13
+ super(attributes)
14
+ @method = :sendMessage
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ module FantasticRobot
2
+ # This object represents a sendPhoto request
3
+ class Request::SendPhoto < Request::Base
4
+
5
+ attr_accessor :chat_id, :photo, :caption, :reply_to_message_id, :reply_markup
6
+
7
+ validates :chat_id, :photo, presence: true
8
+ validates :chat_id, numericality: true, unless: "chat_id.to_s[0,1] == '@'"
9
+ validates :reply_to_message_id, numericality: true, allow_blank: true
10
+
11
+ def initialize(attributes = {})
12
+ super(attributes)
13
+ @method = :sendPhoto
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ module FantasticRobot
2
+ # This object represents a sendSticker request
3
+ class Request::SendSticker < Request::Base
4
+
5
+ MAX_FILE_SIZE = 50*1024*1024
6
+
7
+ attr_accessor :chat_id, :sticker, :reply_to_message_id, :reply_markup
8
+
9
+ validates :chat_id, :sticker, presence: true
10
+ validates :chat_id, numericality: true, unless: "chat_id.to_s[0,1] == '@'"
11
+ validates :reply_to_message_id, numericality: true, allow_blank: true
12
+
13
+ def initialize(attributes = {})
14
+ super(attributes)
15
+ @method = :sendSticker
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,32 @@
1
+ module FantasticRobot
2
+ # This object represents a sendVideo request
3
+ class Request::SendVideo < Request::Base
4
+
5
+ MAX_FILE_SIZE = 50*1024*1024
6
+
7
+ attr_accessor :chat_id, :video, :duration, :caption, :reply_to_message_id, :reply_markup
8
+
9
+ validates :chat_id, :video, presence: true
10
+ validates :chat_id, numericality: true, unless: "chat_id.to_s[0,1] == '@'"
11
+ validates :duration, :reply_to_message_id, numericality: true, allow_blank: true
12
+
13
+ validate :file_length
14
+
15
+ def initialize(attributes = {})
16
+ super(attributes)
17
+ @method = :sendVideo
18
+ end
19
+
20
+ private
21
+
22
+ # Function to check that the file size isn't excesive.
23
+ def file_length
24
+ if self.video.is_a?(File) && self.video.size > MAX_FILE_SIZE
25
+ self.errors.add :video, "It's length is excesive. #{MAX_FILE_SIZE} is the limit."
26
+ return false
27
+ end
28
+
29
+ return true
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ module FantasticRobot
2
+ # This object represents a sendVoice request
3
+ class Request::SendVoice < Request::Base
4
+
5
+ MAX_FILE_SIZE = 50*1024*1024
6
+
7
+ attr_accessor :chat_id, :voice, :duration, :reply_to_message_id, :reply_markup
8
+
9
+ validates :chat_id, :voice, presence: true
10
+ validates :chat_id, numericality: true, unless: "chat_id.to_s[0,1] == '@'"
11
+ validates :duration, :reply_to_message_id, numericality: true, allow_blank: true
12
+
13
+ validate :file_length
14
+
15
+ def initialize(attributes = {})
16
+ super(attributes)
17
+ @method = :sendVoice
18
+ end
19
+
20
+ private
21
+
22
+ # Function to check that the file size isn't excesive.
23
+ def file_length
24
+ if self.voice.is_a?(File) && self.voice.size > MAX_FILE_SIZE
25
+ self.errors.add :voice, "It's length is excesive. #{MAX_FILE_SIZE} is the limit."
26
+ return false
27
+ end
28
+
29
+ return true
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,29 @@
1
+ module FantasticRobot
2
+ # This object represents a setWebhook request
3
+ class Request::SetWebhook < Request::Base
4
+
5
+ attr_accessor :url
6
+
7
+ validates :url, presence: true
8
+ validate :https_url
9
+
10
+ def initialize(attributes = {})
11
+ super(attributes)
12
+ @method = :setWebhook
13
+ end
14
+
15
+ private
16
+
17
+ # Check that the URL is a HTTPS one
18
+ def https_url
19
+ return false if (url.blank?)
20
+
21
+ unless (url[0,8] == "https://")
22
+ errors.add :url, "Must be an HTPPS URL."
23
+ return false
24
+ end
25
+
26
+ return true
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,13 @@
1
+ require "fantastic_robot/request/base"
2
+ require "fantastic_robot/request/forward_message"
3
+ require "fantastic_robot/request/get_me"
4
+ require "fantastic_robot/request/send_audio"
5
+ require "fantastic_robot/request/send_chat_action"
6
+ require "fantastic_robot/request/send_document"
7
+ require "fantastic_robot/request/send_location"
8
+ require "fantastic_robot/request/send_message"
9
+ require "fantastic_robot/request/send_photo"
10
+ require "fantastic_robot/request/send_sticker"
11
+ require "fantastic_robot/request/send_video"
12
+ require "fantastic_robot/request/send_voice"
13
+ require "fantastic_robot/request/set_webhook"
@@ -0,0 +1,3 @@
1
+ module FantasticRobot
2
+ VERSION = "0.1.1"
3
+ end
@@ -0,0 +1,56 @@
1
+ require "active_model"
2
+ require "faraday"
3
+ require "fantastic_robot/models"
4
+ require "fantastic_robot/requests"
5
+ require "fantastic_robot/configuration"
6
+ require "fantastic_robot/connection"
7
+ require "fantastic_robot/version"
8
+
9
+ module FantasticRobot
10
+ class << self
11
+ attr_accessor :configuration
12
+ attr_reader :connection
13
+ end
14
+
15
+ def self.initialize!
16
+ raise ArgumentError, "API Key is needed." if (self.configuration.api_key.blank?)
17
+
18
+ if (self.configuration.delivery_method == :webhook)
19
+ unless (self.configuration.callback_url.blank?)
20
+ # Register the webhook against Telegram
21
+ register_webhook
22
+ else
23
+ raise ArgumentError, 'Webhook method requires a callback URL'
24
+ end
25
+ end
26
+ end
27
+
28
+ def self.configure
29
+ self.configuration ||= Configuration.new
30
+ yield(configuration)
31
+ end
32
+
33
+ def self.configuration
34
+ @configuration ||= Configuration.new
35
+ end
36
+
37
+ def self.connection
38
+ @connection ||= Connection.new
39
+ end
40
+
41
+ ##
42
+ # Function to register the configured webhook against the Telegram API.
43
+ #
44
+ def self.register_webhook
45
+ FantasticRobot::Request::SetWebhook.new(url: self.configuration.callback_url).send_request
46
+ end
47
+
48
+ ##
49
+ # Method to respond to an update with a request.
50
+ # It can manage a Request object or a hash.
51
+ #
52
+ def self.response_json(request)
53
+ return nil unless request.is_a?(Hash) || request.is_a?(FantasticRobot::Request::Base)
54
+ request.to_h
55
+ end
56
+ end
@@ -0,0 +1,12 @@
1
+ FantasticRobot.configure do |config|
2
+ # Secret token of the API
3
+ config.api_key = 'your_bot_api_token'
4
+
5
+ # Delivery method (can be :polling or :webhook)
6
+ config.delivery_method = :webhook
7
+
8
+ # Callback URL of the webhook
9
+ config.callback_url = 'http://your_app.dev/receive'
10
+ end
11
+
12
+ FantasticRobot.initialize! if(defined?(::Thin) || defined?(::Unicorn) || defined?(::Passenger) || defined?(::Puma))
@@ -0,0 +1,13 @@
1
+ require 'rails/generators/named_base'
2
+
3
+ module FantasticRobot
4
+ module Generators
5
+ class InstallGenerator < Rails::Generators::Base
6
+ source_root File.expand_path("../files", __FILE__)
7
+
8
+ def copy_config_files
9
+ copy_file "fantastic_robot.rb", "config/initializers/fantastic_robot.rb"
10
+ end
11
+ end
12
+ end
13
+ end