X Tutup
Skip to content

Commit 92c3f48

Browse files
committed
Removing redundant parentheses, Python3 support, user.name property
1 parent 9f27537 commit 92c3f48

File tree

6 files changed

+96
-68
lines changed

6 files changed

+96
-68
lines changed

.travis.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
language: python
22
python:
3-
- 2.7
3+
- "2.6"
4+
- "2.7"
5+
- "3.2"
6+
- "3.3"
7+
- "3.4"
8+
- "nightly"
49
script: make test

telegram/bot.py

Lines changed: 48 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,14 @@
44
"""A library that provides a Python interface to the Telegram Bot API"""
55

66
import json
7-
import urllib
8-
import urllib2
7+
try:
8+
from urllib.parse import urlencode
9+
from urllib.request import urlopen, Request
10+
from urllib.error import HTTPError, URLError
11+
except ImportError:
12+
from urllib import urlencode
13+
from urllib2 import urlopen, Request
14+
from urllib2 import HTTPError, URLError
915
import functools
1016

1117
from telegram import (User, Message, Update, UserProfilePhotos, TelegramError,
@@ -28,30 +34,22 @@ def __init__(self,
2834
try:
2935
bot = self.getMe()
3036

31-
self._id = bot.id
32-
self._first_name = bot.first_name
33-
self._last_name = bot.last_name
34-
self._username = bot.username
37+
self.id = bot.id
38+
self.first_name = bot.first_name
39+
self.last_name = bot.last_name
40+
self.username = bot.username
3541

3642
self.__auth = True
3743
except TelegramError:
3844
raise TelegramError({'message': 'Bad token'})
3945

4046
@property
41-
def id(self):
42-
return self._id
43-
44-
@property
45-
def first_name(self):
46-
return self._first_name
47-
48-
@property
49-
def last_name(self):
50-
return self._last_name
51-
52-
@property
53-
def username(self):
54-
return self._username
47+
def name(self):
48+
if self.username:
49+
return '@%s' % self.username
50+
if self.last_name:
51+
return '%s %s' % (self.first_name, self.last_name)
52+
return self.first_name
5553

5654
def clearCredentials(self):
5755
"""Clear any credentials for this instance.
@@ -65,7 +63,7 @@ def getMe(self):
6563
A telegram.User instance representing that bot if the
6664
credentials are valid, None otherwise.
6765
"""
68-
url = '%s/getMe' % (self.base_url)
66+
url = '%s/getMe' % self.base_url
6967

7068
json_data = self._requestUrl(url, 'GET')
7169
data = self._parseAndCheckTelegram(json_data)
@@ -141,15 +139,15 @@ def sendMessage(self,
141139
A telegram.Message instance representing the message posted.
142140
"""
143141

144-
url = '%s/sendMessage' % (self.base_url)
142+
url = '%s/sendMessage' % self.base_url
145143

146144
data = {'chat_id': chat_id,
147145
'text': text}
148146

149147
if disable_web_page_preview:
150148
data['disable_web_page_preview'] = disable_web_page_preview
151149

152-
return (url, data)
150+
return url, data
153151

154152
@message
155153
@require_authentication
@@ -172,7 +170,7 @@ def forwardMessage(self,
172170
A telegram.Message instance representing the message forwarded.
173171
"""
174172

175-
url = '%s/forwardMessage' % (self.base_url)
173+
url = '%s/forwardMessage' % self.base_url
176174

177175
data = {}
178176
if chat_id:
@@ -182,7 +180,7 @@ def forwardMessage(self,
182180
if message_id:
183181
data['message_id'] = message_id
184182

185-
return (url, data)
183+
return url, data
186184

187185
@message
188186
@require_authentication
@@ -215,15 +213,15 @@ def sendPhoto(self,
215213
A telegram.Message instance representing the message posted.
216214
"""
217215

218-
url = '%s/sendPhoto' % (self.base_url)
216+
url = '%s/sendPhoto' % self.base_url
219217

220218
data = {'chat_id': chat_id,
221219
'photo': photo}
222220

223221
if caption:
224222
data['caption'] = caption
225223

226-
return (url, data)
224+
return url, data
227225

228226
@message
229227
@require_authentication
@@ -255,12 +253,12 @@ def sendAudio(self,
255253
A telegram.Message instance representing the message posted.
256254
"""
257255

258-
url = '%s/sendAudio' % (self.base_url)
256+
url = '%s/sendAudio' % self.base_url
259257

260258
data = {'chat_id': chat_id,
261259
'audio': audio}
262260

263-
return (url, data)
261+
return url, data
264262

265263
@message
266264
@require_authentication
@@ -289,12 +287,12 @@ def sendDocument(self,
289287
A telegram.Message instance representing the message posted.
290288
"""
291289

292-
url = '%s/sendDocument' % (self.base_url)
290+
url = '%s/sendDocument' % self.base_url
293291

294292
data = {'chat_id': chat_id,
295293
'document': document}
296294

297-
return (url, data)
295+
return url, data
298296

299297
@message
300298
@require_authentication
@@ -323,12 +321,12 @@ def sendSticker(self,
323321
A telegram.Message instance representing the message posted.
324322
"""
325323

326-
url = '%s/sendSticker' % (self.base_url)
324+
url = '%s/sendSticker' % self.base_url
327325

328326
data = {'chat_id': chat_id,
329327
'sticker': sticker}
330328

331-
return (url, data)
329+
return url, data
332330

333331
@message
334332
@require_authentication
@@ -358,12 +356,12 @@ def sendVideo(self,
358356
A telegram.Message instance representing the message posted.
359357
"""
360358

361-
url = '%s/sendVideo' % (self.base_url)
359+
url = '%s/sendVideo' % self.base_url
362360

363361
data = {'chat_id': chat_id,
364362
'video': video}
365363

366-
return (url, data)
364+
return url, data
367365

368366
@message
369367
@require_authentication
@@ -393,13 +391,13 @@ def sendLocation(self,
393391
A telegram.Message instance representing the message posted.
394392
"""
395393

396-
url = '%s/sendLocation' % (self.base_url)
394+
url = '%s/sendLocation' % self.base_url
397395

398396
data = {'chat_id': chat_id,
399397
'latitude': latitude,
400398
'longitude': longitude}
401399

402-
return (url, data)
400+
return url, data
403401

404402
@message
405403
@require_authentication
@@ -425,12 +423,12 @@ def sendChatAction(self,
425423
- ChatAction.FIND_LOCATION for location data.
426424
"""
427425

428-
url = '%s/sendChatAction' % (self.base_url)
426+
url = '%s/sendChatAction' % self.base_url
429427

430428
data = {'chat_id': chat_id,
431429
'action': action}
432430

433-
return (url, data)
431+
return url, data
434432

435433
@require_authentication
436434
def getUserProfilePhotos(self,
@@ -453,7 +451,7 @@ def getUserProfilePhotos(self,
453451
Returns a telegram.UserProfilePhotos object.
454452
"""
455453

456-
url = '%s/getUserProfilePhotos' % (self.base_url)
454+
url = '%s/getUserProfilePhotos' % self.base_url
457455

458456
data = {'user_id': user_id}
459457

@@ -492,7 +490,7 @@ def getUpdates(self,
492490
A list of telegram.Update objects are returned.
493491
"""
494492

495-
url = '%s/getUpdates' % (self.base_url)
493+
url = '%s/getUpdates' % self.base_url
496494

497495
data = {}
498496
if offset:
@@ -524,7 +522,7 @@ def setWebhook(self,
524522
Returns:
525523
True if successful else TelegramError was raised
526524
"""
527-
url = '%s/setWebhook' % (self.base_url)
525+
url = '%s/setWebhook' % self.base_url
528526

529527
data = {'url': webhook_url}
530528

@@ -556,29 +554,29 @@ def _requestUrl(self,
556554
if InputFile.is_inputfile(data):
557555
data = InputFile(data)
558556

559-
request = urllib2.Request(
557+
request = Request(
560558
url,
561559
data=data.to_form(),
562560
headers=data.headers
563561
)
564562

565-
return urllib2.urlopen(request).read()
563+
return urlopen(request).read()
566564
else:
567-
return urllib2.urlopen(
565+
return urlopen(
568566
url,
569-
urllib.urlencode(data)
567+
urlencode(data).encode()
570568
).read()
571569
except IOError as e:
572570
raise TelegramError(str(e))
573-
except urllib2.HTTPError as e:
571+
except HTTPError as e:
574572
raise TelegramError(str(e))
575-
except urllib2.URLError as e:
573+
except URLError as e:
576574
raise TelegramError(str(e))
577575

578576
if method == 'GET':
579577
try:
580-
return urllib2.urlopen(url).read()
581-
except urllib2.URLError as e:
578+
return urlopen(url).read()
579+
except URLError as e:
582580
raise TelegramError(str(e))
583581

584582
return 0 # if not a POST or GET request

telegram/inputfile.py

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
#!/usr/bin/env python
22

3-
4-
import mimetools
3+
try:
4+
from email.generator import _make_boundary as choose_boundary
5+
from urllib.request import urlopen
6+
from io import BufferedReader as file
7+
except ImportError:
8+
from mimetools import choose_boundary
9+
from urllib2 import urlopen
510
import mimetypes
611
import os
712
import re
8-
import urllib2
13+
import sys
914

1015
from .error import TelegramError
1116

@@ -18,7 +23,7 @@ class InputFile(object):
1823
def __init__(self,
1924
data):
2025
self.data = data
21-
self.boundary = mimetools.choose_boundary()
26+
self.boundary = choose_boundary()
2227

2328
if 'audio' in data:
2429
self.input_name = 'audio'
@@ -40,7 +45,7 @@ def __init__(self,
4045
DEFAULT_MIME_TYPE
4146

4247
if 'http' in self.input_file:
43-
self.input_file_content = urllib2.urlopen(self.input_file).read()
48+
self.input_file_content = urlopen(self.input_file).read()
4449
self.mimetype = InputFile.is_image(self.input_file_content)
4550
self.filename = self.mimetype.replace('/', '.')
4651

@@ -58,20 +63,20 @@ def to_form(self):
5863
form_boundary = '--' + self.boundary
5964

6065
# Add data fields
61-
for name, value in self.data.iteritems():
66+
for name, value in self.data.items():
6267
form.extend([
6368
form_boundary,
64-
str('Content-Disposition: form-data; name="%s"' % name),
69+
'Content-Disposition: form-data; name="%s"' % name,
6570
'',
6671
str(value)
6772
])
6873

6974
# Add input_file to upload
7075
form.extend([
7176
form_boundary,
72-
str('Content-Disposition: form-data; name="%s"; filename="%s"' % (
77+
'Content-Disposition: form-data; name="%s"; filename="%s"' % (
7378
self.input_name, self.filename
74-
)),
79+
),
7580
'Content-Type: %s' % self.mimetype,
7681
'',
7782
self.input_file_content
@@ -80,6 +85,19 @@ def to_form(self):
8085
form.append('--' + self.boundary + '--')
8186
form.append('')
8287

88+
return self._parse(form)
89+
90+
def _parse(self, form):
91+
if sys.version_info > (3,):
92+
# on Python 3 form needs to be byte encoded
93+
encoded_form = []
94+
for item in form:
95+
try:
96+
encoded_form.append(item.encode())
97+
except AttributeError:
98+
encoded_form.append(item)
99+
100+
return b'\r\n'.join(encoded_form)
83101
return '\r\n'.join(form)
84102

85103
@staticmethod
@@ -96,14 +114,14 @@ def is_image(stream):
96114
try:
97115
header = stream[:10]
98116

99-
if re.match(r'GIF8', header):
117+
if re.match(b'GIF8', header):
100118
return 'image/gif'
101119

102-
if re.match(r'\x89PNG', header):
120+
if re.match(b'\x89PNG', header):
103121
return 'image/png'
104122

105-
if re.match(r'\xff\xd8\xff\xe0\x00\x10JFIF', header) or \
106-
re.match(r'\xff\xd8\xff\xe1(.*){2}Exif', header):
123+
if re.match(b'\xff\xd8\xff\xe0\x00\x10JFIF', header) or \
124+
re.match(b'\xff\xd8\xff\xe1(.*){2}Exif', header):
107125
return 'image/jpeg'
108126
except IndexError as e:
109127
raise TelegramError(str(e))
@@ -122,7 +140,7 @@ def is_inputfile(data):
122140
"""
123141
if data:
124142
file_types = ['audio', 'document', 'photo', 'video']
125-
file_type = [i for i in data.keys() if i in file_types]
143+
file_type = [i for i in list(data.keys()) if i in file_types]
126144

127145
if file_type:
128146
file_content = data[file_type[0]]

0 commit comments

Comments
 (0)
X Tutup