Skip to content

Commit 9c4e9e1

Browse files
committed
Merge pyrogram#221, string sessions now work for bots too
1 parent fd5889d commit 9c4e9e1

6 files changed

Lines changed: 30 additions & 12 deletions

File tree

pyrogram/client/client.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -281,14 +281,15 @@ def start(self):
281281
if self.is_started:
282282
raise ConnectionError("Client has already been started")
283283

284-
if self.BOT_TOKEN_RE.match(self.session_name):
285-
self.is_bot = True
286-
self.bot_token = self.session_name
287-
self.session_name = self.session_name.split(":")[0]
288-
warnings.warn('\nYou are using a bot token as session name.\n'
289-
'It will be deprecated in next update, please use session file name to load '
290-
'existing sessions and bot_token argument to create new sessions.',
291-
DeprecationWarning, stacklevel=2)
284+
if isinstance(self.session_storage, JsonSessionStorage):
285+
if self.BOT_TOKEN_RE.match(self.session_storage.session_data):
286+
self.is_bot = True
287+
self.bot_token = self.session_storage.session_data
288+
self.session_storage.session_data = self.session_storage.session_data.split(":")[0]
289+
warnings.warn('\nYou are using a bot token as session name.\n'
290+
'It will be deprecated in next update, please use session file name to load '
291+
'existing sessions and bot_token argument to create new sessions.',
292+
DeprecationWarning, stacklevel=2)
292293

293294
self.load_config()
294295
self.load_session()

pyrogram/client/ext/base_client.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ class StopTransmission(StopIteration):
7070

7171
def __init__(self, session_storage: BaseSessionStorage):
7272
self.session_storage = session_storage
73-
self.is_bot = False
7473

7574
self.rnd_id = MsgId
7675
self.channels_pts = {}

pyrogram/client/session_storage/base_session_storage.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ def __init__(self, client: 'pyrogram.client.BaseClient', session_data):
3535
self.auth_key = None
3636
self.user_id = None
3737
self.date = 0
38+
self.is_bot = False
3839
self.peers_by_id = {}
3940
self.peers_by_username = {}
4041
self.peers_by_phone = {}

pyrogram/client/session_storage/json_session_storage.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ def load_session(self):
5050
self.auth_key = base64.b64decode("".join(s["auth_key"])) # join split key
5151
self.user_id = s["user_id"]
5252
self.date = s.get("date", 0)
53+
self.is_bot = s.get('is_bot', self.client.is_bot)
5354

5455
for k, v in s.get("peers_by_id", {}).items():
5556
self.peers_by_id[int(k)] = utils.get_input_peer(int(k), v)
@@ -85,6 +86,7 @@ def save_session(self, sync=False):
8586
'auth_key': auth_key,
8687
'user_id': self.user_id,
8788
'date': self.date,
89+
'is_bot': self.is_bot,
8890
'peers_by_id': {
8991
k: getattr(v, "access_hash", None)
9092
for k, v in self.peers_by_id.copy().items()

pyrogram/client/session_storage/session_storage_mixin.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ def date(self) -> int:
6060
def date(self, val):
6161
self.session_storage.date = val
6262

63+
@property
64+
def is_bot(self):
65+
return self.session_storage.is_bot
66+
67+
@is_bot.setter
68+
def is_bot(self, val) -> int:
69+
self.session_storage.is_bot = val
70+
6371
@property
6472
def peers_by_id(self) -> Dict[str, int]:
6573
return self.session_storage.peers_by_id

pyrogram/client/session_storage/string_session_storage.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,31 @@ class StringSessionStorage(BaseSessionStorage):
1111
Char dc_id (1 byte, unsigned)
1212
Boolean test_mode (1 byte)
1313
Long long user_id (8 bytes, signed)
14+
Boolean is_bot (1 byte)
1415
Bytes auth_key (256 bytes)
1516
1617
Uses Base64 encoding for printable representation
1718
"""
18-
PACK_FORMAT = '<B?q256s'
19+
PACK_FORMAT = '<B?q?256s'
20+
21+
def _unpack(self, data):
22+
return struct.unpack(self.PACK_FORMAT, data)
23+
24+
def _pack(self):
25+
return struct.pack(self.PACK_FORMAT, self.dc_id, self.test_mode, self.user_id, self.is_bot, self.auth_key)
1926

2027
def load_session(self):
2128
try:
2229
session_string = self.session_data[1:]
2330
session_string += '=' * (4 - len(session_string) % 4) # restore padding
2431
decoded = base64.b64decode(session_string, b'-_')
25-
self.dc_id, self.test_mode, self.user_id, self.auth_key = struct.unpack(self.PACK_FORMAT, decoded)
32+
self.dc_id, self.test_mode, self.user_id, self.is_bot, self.auth_key = self._unpack(decoded)
2633
except (struct.error, binascii.Error):
2734
raise SessionDoesNotExist()
2835

2936
def save_session(self, sync=False):
3037
if not sync:
31-
packed = struct.pack(self.PACK_FORMAT, self.dc_id, self.test_mode, self.user_id, self.auth_key)
38+
packed = self._pack()
3239
encoded = ':' + base64.b64encode(packed, b'-_').decode('latin-1').rstrip('=')
3340
split = '\n'.join(['"{}"'.format(encoded[i: i + 50]) for i in range(0, len(encoded), 50)])
3441
print('Created session string:\n{}'.format(split))

0 commit comments

Comments
 (0)