telegramAPI 1.0.1 → 1.0.2b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 62d780796896bb0d1b9860090ebe8947dda0ff8f
4
- data.tar.gz: 54302fa7ce896108350e4d45692a8cdeecc77f95
3
+ metadata.gz: 89e16e0cd37195648280e189febf1a7c5b250527
4
+ data.tar.gz: d478828f86e3181ba3e43337ee7a12fa90ceeace
5
5
  SHA512:
6
- metadata.gz: 1473f06f0b80dc0cd31cb65a11a7316e0de55c452c73e8734a8f2a12d33772154dec0c78897a66e3ec5d07555cc9636bd13e316f40ea68d2ff099e31d1b17aeb
7
- data.tar.gz: 78d0480e5b74a6686cf2a6d03982f5004ef4671e71d20de8319ed71dcb11c4d9f6e54f143fda85129417cd05c67ee88cddde86b0ac37161136f76f58f3ecd175
6
+ metadata.gz: 9700f259459eb019acaf2cce1ccaddb47782818140fafcb111caf6b877240502a7774df2232ffd54b84dbe25d048eb37a0ebfd34641df3e3d461144a9c816d6c
7
+ data.tar.gz: d657f246416f0aaa84af591e170c18b68a352695e35ca2034c6d1d578c146e4bc9ddea063f40bd133da8a1b692fefc9251257c5c4d85e6c286e9f3591204d07f
data/README.md ADDED
@@ -0,0 +1,72 @@
1
+ # TelegramAPI
2
+
3
+ This is a simple and lightweight Ruby API for Telegram Bots.
4
+
5
+ With this tiny library you can create awesome Telegram Bot!
6
+
7
+ ## Installation
8
+
9
+ ```
10
+ sudo gem install telegramAPI
11
+ ```
12
+
13
+ ## Use
14
+
15
+ Import the library in your script with:
16
+
17
+ ```ruby
18
+ require 'telegramAPI'
19
+ ```
20
+
21
+ Obtain a token, if you haven't yet, talking with [@BotFather](https://telegram.me/botfather)
22
+
23
+ ## Getting Started
24
+
25
+ To test your access token, you can use the *getMe* method
26
+ ```ruby
27
+ require 'telegramAPI'
28
+
29
+ token = "******"
30
+ api = TelegramAPI.new token
31
+ bot = api.getMe
32
+ puts "I'm bot #{bot.first_name} with id #{bot.id}"
33
+ puts "But you can call me @#{bot.username}"
34
+ ```
35
+
36
+ ## Documentation
37
+
38
+ The complete documentation can be found at [www.rubydoc.info](http://www.rubydoc.info/gems/telegramAPI/)
39
+
40
+
41
+ ## Examples
42
+
43
+ ### Echo Server
44
+
45
+ ```ruby
46
+ token = "******"
47
+ api = TelegramAPI.new token
48
+ while true do
49
+ # Get last messages if there are, or wait 180 seconds for new messages
50
+ u=api.getUpdates {timeout=>180}
51
+ u.each do |m|
52
+ api.sendMessage(m.message.chat.id, m.message.text)
53
+ end
54
+ end
55
+ ```
56
+
57
+ ### Send Media
58
+
59
+ ```ruby
60
+ api.sendSticker m.message.chat.id, sticker_id
61
+
62
+ api.sendPhoto m.message.chat.id, "/home/path-of-image/image.jpg"
63
+
64
+ api.sendDocument m.message.chat.id, "/home/path-of-document/doc.gif"
65
+
66
+ api.sendAudio m.message.chat.id, "/home/path-of-audio/audio.opus"
67
+
68
+ api.sendVideo m.message.chat.id, "/home/path-of-video/video.mp4"
69
+
70
+ api.sendLocation m.message.chat.id, 45.462781, 9.177732
71
+ ```
72
+ **Note:** According to Telegram, each audio must be encoded in **Ogg OPUS**, and each video must be encoded in **mp4**.
data/lib/telegramAPI.rb CHANGED
@@ -3,17 +3,25 @@ require 'json'
3
3
  require 'net/http'
4
4
  require 'net/https'
5
5
  require 'uri'
6
- require 'rest-client' # sudo gem install rest-client
6
+ require 'rest-client'
7
7
  require 'telegramObjects'
8
8
 
9
+ # This library provides an easy way to access to the Telegram Bot API
10
+ # Author:: Benedetto Nespoli
11
+ # License:: MIT
12
+
9
13
  class TelegramAPI
10
14
  @@core = "https://api.telegram.org/bot"
11
15
 
12
- def initialize t
13
- @token = t
16
+ # Create a new instance of TelegramAPI
17
+ #
18
+ # @param token [String] the access token, obtained thanks to {https://telegram.me/botfather @BotFather} on Telegram.
19
+ def initialize token
20
+ @token = token
14
21
  @last_update = 0
15
22
  end
16
23
 
24
+ private
17
25
  def query api, params={}
18
26
  p=[]
19
27
  params_s=""
@@ -23,12 +31,18 @@ class TelegramAPI
23
31
 
24
32
  JSON.parse(open(@@core+@token+"/"+api+params_s).read)
25
33
  end
34
+ public
26
35
 
36
+ # Provide information about the bot itself
37
+ # @return [User] Information about the bot
27
38
  def getMe
28
39
  User.new self.query("getMe")
29
40
  end
30
41
 
31
- def getUpdates options={}
42
+ # Get last updates, including last received messages
43
+ # @param options [Hash<String, String>] Optional settings
44
+ # @return [Array<Update>] List of all updates
45
+ def getUpdates options={"timeout"=>0, "limit"=>100}
32
46
  r=self.query "getUpdates", {"offset"=>@last_update.to_s}.merge(options)
33
47
  if r['ok']!=true then return nil end
34
48
  up=ArrayOf.new(r['result'],Update).to_a
@@ -36,52 +50,95 @@ class TelegramAPI
36
50
  return up
37
51
  end
38
52
 
53
+ # Send a message to the user with id +to+, with the text +text+
54
+ # @param to [Integer] chat_id to which send the message. Usually message.chat.id
55
+ # @param text [String] The text to send
56
+ # @param options (see #getUpdates)
57
+ # @return [Message] Message with the Photo sent
39
58
  def sendMessage to, text, options={}
40
- Message.new self.query("sendMessage", {"chat_id"=>to.to_s, "text"=>URI::encode(text)}.merge(options))
59
+ if options.has_key?"reply_markup" then
60
+ options["reply_markup"]=options["reply_markup"].to_json
61
+ end
62
+ Message.new self.query("sendMessage", {"chat_id"=>to.to_s, "text"=>URI::encode(text)}.merge(options))["result"]
41
63
  end
42
64
 
65
+ # Send a message as forwarded
66
+ # @param to (see #sendMessage)
67
+ # @param from [Integer] chat_id of the original message.
68
+ # @param msg [Integer] The message_id of the original message
69
+ # @return (see #sendPhoto)
43
70
  def forwardMessage to, from, msg
44
- Message.new self.query("forwardMessage", {"chat_id"=>to, "from_chat_id"=>from, "message_id"=>msg})
71
+ Message.new self.query("forwardMessage", {"chat_id"=>to, "from_chat_id"=>from, "message_id"=>msg})["result"]
45
72
  end
46
73
 
74
+ # Send a local file containing a photo
75
+ # @param to (see #sendMessage)
76
+ # @param path [String] The path of the file to send
77
+ # @param options (see #sendMessage)
78
+ # @return (see #sendMessage)
47
79
  def sendPhoto to, path, options={}
48
80
  Message.new JSON.parse(RestClient.post(@@core+@token+"/sendPhoto", {:photo=>File.new(path,'rb'), :chat_id=>to.to_s}.merge(options)).body)["result"]
49
81
  end
50
82
 
51
- # Max size: 50MB
52
- # Format: Ogg OPUS. On ubuntu: avconv -i input.ext -acodec libopus output.ogg
83
+ # Send an audio file in Ogg OPUS format of max 50MB
84
+ # @param (see #sendPhoto)
85
+ # @return (see #sendPhoto)
53
86
  def sendAudio to, path, options={}
54
- RestClient.post @@core+@token+"/sendAudio", {:audio=>File.new(path, 'rb'), :chat_id=>to.to_s}.merge(options)
87
+ Message.new JSON.parse(RestClient.post(@@core+@token+"/sendAudio", {:audio=>File.new(path, 'rb'), :chat_id=>to.to_s}.merge(options)).body)["result"]
55
88
  end
56
89
 
90
+ # Send a general document (file, image, audio)
91
+ # @param (see #sendPhoto)
92
+ # @return (see #sendPhoto)
57
93
  def sendDocument to, path, options={}
58
- RestClient.post @@core+@token+"/sendDocument", {:document=>File.new(path,'rb'), :chat_id=>to.to_s}.merge(options)
94
+ Message.new JSON.parse(RestClient.post(@@core+@token+"/sendDocument", {:document=>File.new(path,'rb'), :chat_id=>to.to_s}.merge(options)).body)["result"]
59
95
  end
60
96
 
97
+ # Send a Sticker from File
98
+ # @param (see #sendPhoto)
99
+ # @return (see #sendSticker)
61
100
  def sendStickerFromFile to, path, options={}
62
- RestClient.post @@core+@token+"/sendStiker", {:sticker=>File.new(path,'rb'), :chat_id=>to.to_s}.merge(options)
101
+ Message.new JSON.parse(RestClient.post(@@core+@token+"/sendStiker", {:sticker=>File.new(path,'rb'), :chat_id=>to.to_s}.merge(options)).body)["result"]
63
102
  end
64
103
 
104
+ # Send a Sticker through its ID
105
+ # @param to (see #sendPhoto)
106
+ # @param id [Integer] the ID of the sticker to send
107
+ # @param options (see #sendPhoto)
108
+ # @return (see #sendPhoto)
65
109
  def sendSticker to, id, options={}
66
- RestClient.post @@core+@token+"/sendSticker", {:sticker=>id, :chat_id=>to.to_s}.merge(options)
110
+ Message.new JSON.parse(RestClient.post(@@core+@token+"/sendSticker", {:sticker=>id, :chat_id=>to.to_s}.merge(options)).body)["result"]
67
111
  end
68
112
 
69
- # Max size: 50MB
70
- # Fromat: mp4
113
+ # Send a video file in mp4 format of max 50MB
114
+ # @param (see #sendPhoto)
115
+ # @return (see #sendPhoto)
71
116
  def sendVideo to, path, options={}
72
- RestClient.post @@core+@token+"/sendVideo", {:video=>File.new(path,'rb'), :chat_id=>to.to_s}.merge(options)
117
+ Message.new JSON.parse(RestClient.post(@@core+@token+"/sendVideo", {:video=>File.new(path,'rb'), :chat_id=>to.to_s}.merge(options)).body)["result"]
73
118
  end
74
119
 
120
+ # Send a location
121
+ # @param to (see #sendPhoto)
122
+ # @param lat [Float] Latitude
123
+ # @param long [Float] Longitude
124
+ # @param options (see #sendPhoto)
125
+ # @return (see #sendPhoto)
75
126
  def sendLocation to, lat, long, options={}
76
- self.query "sendLocation", {"chat_id"=>to, "latitude"=>lat, "longitude"=>long}.merge(options)
127
+ Message.new self.query("sendLocation", {"chat_id"=>to, "latitude"=>lat, "longitude"=>long}.merge(options))["result"]
77
128
  end
78
129
 
79
- # act is one between: typing, upload_photo, record_video, record_audio, upload_audio, upload_document, find_location
130
+ # Send a Chat Action
131
+ # @param to (see #sendPhoto)
132
+ # @param act [String] One of: typing, upload_photo, record_video, record_audio, upload_audio, upload_document, find_location
80
133
  def sendChatAction to, act
81
134
  self.query "sendChatAction", {"chat_id"=>to, "action"=>act}
82
135
  end
83
136
 
137
+ # Get a list of user profile photos, in up to 4 sizes each
138
+ # @param id [Integer] ID user whom getting the photos
139
+ # @param options (see #sendPhoto)
140
+ # @return [UserProfilePhotos]
84
141
  def getUserProfilePhotos id, options={}
85
- self.query "getUserProfilePhotos", {"user_id"=>id}.merge(options)
142
+ UserProfilePhotos.new self.query("getUserProfilePhotos", {"user_id"=>id}.merge(options))["result"]
86
143
  end
87
144
  end
@@ -7,6 +7,7 @@ class Update
7
7
  end
8
8
  end
9
9
 
10
+ # Object describing a Bot or User
10
11
  class User
11
12
  attr_accessor :id, :first_name, :last_name, :username
12
13
  def initialize json
@@ -18,6 +19,7 @@ class User
18
19
  end
19
20
  end
20
21
 
22
+ # Object describing a Chat Group
21
23
  class GroupChat
22
24
  attr_accessor :id, :title
23
25
  def initialize json
@@ -43,6 +45,7 @@ class ArrayOf
43
45
  end
44
46
  end
45
47
 
48
+ # Object describing a Message
46
49
  class Message
47
50
  attr_accessor :message_id, :from, :date, :chat, :forward_from, :forward_date,
48
51
  :reply_to_message, :text, :audio, :document, :photo, :sticker, :video,
@@ -75,6 +78,7 @@ class Message
75
78
  end
76
79
  end
77
80
 
81
+ # Object Describing a Photo or Sticker
78
82
  class PhotoSize
79
83
  attr_accessor :file_id, :width, :height, :file_size
80
84
  def initialize json
@@ -156,6 +160,7 @@ class Location
156
160
  end
157
161
  end
158
162
 
163
+ # Object describing a list of photos in up to 4 sizes each
159
164
  class UserProfilePhotos
160
165
  attr_accessor :total_count, :photos
161
166
  def initialize json
@@ -177,6 +182,10 @@ class ReplyKeyboardMarkup
177
182
  @one_time_keyboard = json["one_time_keyboard"]
178
183
  @selective = json["selective"]
179
184
  end
185
+
186
+ def to_json
187
+ "{\"keyboard\":" + @keyboard.to_json + ", \"resize_keyboard\":" + (!@resize_keyboard ? "false" : "true") + ", \"one_time_keyboard\":" + (!@one_time_keyboard ? "false" : "true") + ", \"selective\":" + (!@selective ? "false" : "true") + "}"
188
+ end
180
189
  end
181
190
 
182
191
  class ReplyKeyboardHide
@@ -186,6 +195,10 @@ class ReplyKeyboardHide
186
195
  @hide_keyboard = json["hide_keyboard"]
187
196
  @selective = json["selective"]
188
197
  end
198
+
199
+ def to_json
200
+ "{\"hide_keyboard\":true, \"selective\":"+(!@selective ? "false" : "true")+"}"
201
+ end
189
202
  end
190
203
 
191
204
  class ForceReply
@@ -195,4 +208,8 @@ class ForceReply
195
208
  @force_reply = json["force_reply"]
196
209
  @selective = json["selective"]
197
210
  end
211
+
212
+ def to_json
213
+ "{\"force_reply\":true, \"selective\":"+(!@selective ? "false" : "true")+"}"
214
+ end
198
215
  end
metadata CHANGED
@@ -1,24 +1,39 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: telegramAPI
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2b
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benedetto Nespoli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-03 00:00:00.000000000 Z
12
- dependencies: []
13
- description: A lightweight Ruby API for Telegram-Bots
11
+ date: 2015-07-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: A lightweight Ruby API for Telegram Bots
14
28
  email: benedetto.nespoli@gmail.com
15
29
  executables: []
16
30
  extensions: []
17
31
  extra_rdoc_files: []
18
32
  files:
33
+ - README.md
19
34
  - lib/telegramAPI.rb
20
35
  - lib/telegramObjects.rb
21
- homepage: http://rubygems.org/gems/telegramAPI
36
+ homepage: https://github.com/bennesp/telegramAPI
22
37
  licenses:
23
38
  - MIT
24
39
  metadata: {}
@@ -33,13 +48,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
33
48
  version: '0'
34
49
  required_rubygems_version: !ruby/object:Gem::Requirement
35
50
  requirements:
36
- - - ">="
51
+ - - ">"
37
52
  - !ruby/object:Gem::Version
38
- version: '0'
53
+ version: 1.3.1
39
54
  requirements: []
40
55
  rubyforge_project:
41
56
  rubygems_version: 2.2.2
42
57
  signing_key:
43
58
  specification_version: 4
44
- summary: Telegram api for Bots
59
+ summary: Telegram API for Bots
45
60
  test_files: []
61
+ has_rdoc: