mirror of
https://github.com/eternnoir/pyTelegramBotAPI.git
synced 2023-08-10 21:12:57 +03:00
Additional bugfix
Additional bugfix Plus protected methods removal
This commit is contained in:
parent
8d8aa5a380
commit
2e6b6bda53
@ -1335,7 +1335,7 @@ class AsyncTeleBot:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
self.current_states = asyncio_handler_backends.StateFile(filename=filename)
|
self.current_states = asyncio_handler_backends.StateFile(filename=filename)
|
||||||
self.current_states._create_dir()
|
self.current_states.create_dir()
|
||||||
|
|
||||||
async def set_webhook(self, url=None, certificate=None, max_connections=None, allowed_updates=None, ip_address=None,
|
async def set_webhook(self, url=None, certificate=None, max_connections=None, allowed_updates=None, ip_address=None,
|
||||||
drop_pending_updates = None, timeout=None):
|
drop_pending_updates = None, timeout=None):
|
||||||
@ -1790,6 +1790,7 @@ class AsyncTeleBot:
|
|||||||
:param timeout: timeout
|
:param timeout: timeout
|
||||||
:param allow_sending_without_reply:
|
:param allow_sending_without_reply:
|
||||||
:param protect_content:
|
:param protect_content:
|
||||||
|
:param data: deprecated, for backward compatibility
|
||||||
:return: API reply.
|
:return: API reply.
|
||||||
"""
|
"""
|
||||||
if data and not(sticker):
|
if data and not(sticker):
|
||||||
@ -1837,13 +1838,16 @@ class AsyncTeleBot:
|
|||||||
:param allow_sending_without_reply:
|
:param allow_sending_without_reply:
|
||||||
:param reply_markup:
|
:param reply_markup:
|
||||||
:param timeout:
|
:param timeout:
|
||||||
:param data: function typo miss compatibility: do not use it
|
:param data: deprecated, for backward compatibility
|
||||||
"""
|
"""
|
||||||
parse_mode = self.parse_mode if (parse_mode is None) else parse_mode
|
parse_mode = self.parse_mode if (parse_mode is None) else parse_mode
|
||||||
|
if data and not(video):
|
||||||
|
# function typo miss compatibility
|
||||||
|
video = data
|
||||||
|
|
||||||
return types.Message.de_json(
|
return types.Message.de_json(
|
||||||
await asyncio_helper.send_video(
|
await asyncio_helper.send_video(
|
||||||
self.token, chat_id, data, duration, caption, reply_to_message_id, reply_markup,
|
self.token, chat_id, video, duration, caption, reply_to_message_id, reply_markup,
|
||||||
parse_mode, supports_streaming, disable_notification, timeout, thumb, width, height,
|
parse_mode, supports_streaming, disable_notification, timeout, thumb, width, height,
|
||||||
caption_entities, allow_sending_without_reply, protect_content))
|
caption_entities, allow_sending_without_reply, protect_content))
|
||||||
|
|
||||||
@ -1873,6 +1877,7 @@ class AsyncTeleBot:
|
|||||||
:param thumb: InputFile or String : Thumbnail of the file sent
|
:param thumb: InputFile or String : Thumbnail of the file sent
|
||||||
:param caption: String : Animation caption (may also be used when resending animation by file_id).
|
:param caption: String : Animation caption (may also be used when resending animation by file_id).
|
||||||
:param parse_mode:
|
:param parse_mode:
|
||||||
|
:param protect_content:
|
||||||
:param reply_to_message_id:
|
:param reply_to_message_id:
|
||||||
:param reply_markup:
|
:param reply_markup:
|
||||||
:param disable_notification:
|
:param disable_notification:
|
||||||
@ -3057,4 +3062,4 @@ class AsyncTeleBot:
|
|||||||
:param chat_id:
|
:param chat_id:
|
||||||
"""
|
"""
|
||||||
for key, value in kwargs.items():
|
for key, value in kwargs.items():
|
||||||
await self.current_states._add_data(chat_id, key, value)
|
await self.current_states.add_data(chat_id, key, value)
|
||||||
|
@ -28,7 +28,7 @@ class StateMemory:
|
|||||||
"""Delete a state"""
|
"""Delete a state"""
|
||||||
self._states.pop(chat_id)
|
self._states.pop(chat_id)
|
||||||
|
|
||||||
def _get_data(self, chat_id):
|
def get_data(self, chat_id):
|
||||||
return self._states[chat_id]['data']
|
return self._states[chat_id]['data']
|
||||||
|
|
||||||
async def set(self, chat_id, new_state):
|
async def set(self, chat_id, new_state):
|
||||||
@ -39,7 +39,7 @@ class StateMemory:
|
|||||||
"""
|
"""
|
||||||
await self.add_state(chat_id,new_state)
|
await self.add_state(chat_id,new_state)
|
||||||
|
|
||||||
async def _add_data(self, chat_id, key, value):
|
async def add_data(self, chat_id, key, value):
|
||||||
result = self._states[chat_id]['data'][key] = value
|
result = self._states[chat_id]['data'][key] = value
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@ -77,28 +77,28 @@ class StateFile:
|
|||||||
:param chat_id:
|
:param chat_id:
|
||||||
:param state: new state
|
:param state: new state
|
||||||
"""
|
"""
|
||||||
states_data = self._read_data()
|
states_data = self.read_data()
|
||||||
if chat_id in states_data:
|
if chat_id in states_data:
|
||||||
states_data[chat_id]['state'] = state
|
states_data[chat_id]['state'] = state
|
||||||
return await self._save_data(states_data)
|
return await self.save_data(states_data)
|
||||||
else:
|
else:
|
||||||
new_data = states_data[chat_id] = {'state': state,'data': {}}
|
states_data[chat_id] = {'state': state,'data': {}}
|
||||||
return await self._save_data(states_data)
|
return await self.save_data(states_data)
|
||||||
|
|
||||||
|
|
||||||
async def current_state(self, chat_id):
|
async def current_state(self, chat_id):
|
||||||
"""Current state."""
|
"""Current state."""
|
||||||
states_data = self._read_data()
|
states_data = self.read_data()
|
||||||
if chat_id in states_data: return states_data[chat_id]['state']
|
if chat_id in states_data: return states_data[chat_id]['state']
|
||||||
else: return False
|
else: return False
|
||||||
|
|
||||||
async def delete_state(self, chat_id):
|
async def delete_state(self, chat_id):
|
||||||
"""Delete a state"""
|
"""Delete a state"""
|
||||||
states_data = self._read_data()
|
states_data = self.read_data()
|
||||||
states_data.pop(chat_id)
|
states_data.pop(chat_id)
|
||||||
await self._save_data(states_data)
|
await self.save_data(states_data)
|
||||||
|
|
||||||
def _read_data(self):
|
def read_data(self):
|
||||||
"""
|
"""
|
||||||
Read the data from file.
|
Read the data from file.
|
||||||
"""
|
"""
|
||||||
@ -107,7 +107,7 @@ class StateFile:
|
|||||||
file.close()
|
file.close()
|
||||||
return states_data
|
return states_data
|
||||||
|
|
||||||
def _create_dir(self):
|
def create_dir(self):
|
||||||
"""
|
"""
|
||||||
Create directory .save-handlers.
|
Create directory .save-handlers.
|
||||||
"""
|
"""
|
||||||
@ -117,7 +117,7 @@ class StateFile:
|
|||||||
with open(self.file_path,'wb') as file:
|
with open(self.file_path,'wb') as file:
|
||||||
pickle.dump({}, file)
|
pickle.dump({}, file)
|
||||||
|
|
||||||
async def _save_data(self, new_data):
|
async def save_data(self, new_data):
|
||||||
"""
|
"""
|
||||||
Save data after editing.
|
Save data after editing.
|
||||||
:param new_data:
|
:param new_data:
|
||||||
@ -126,8 +126,8 @@ class StateFile:
|
|||||||
pickle.dump(new_data, state_file, protocol=pickle.HIGHEST_PROTOCOL)
|
pickle.dump(new_data, state_file, protocol=pickle.HIGHEST_PROTOCOL)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _get_data(self, chat_id):
|
def get_data(self, chat_id):
|
||||||
return self._read_data()[chat_id]['data']
|
return self.read_data()[chat_id]['data']
|
||||||
|
|
||||||
async def set(self, chat_id, new_state):
|
async def set(self, chat_id, new_state):
|
||||||
"""
|
"""
|
||||||
@ -138,10 +138,10 @@ class StateFile:
|
|||||||
"""
|
"""
|
||||||
await self.add_state(chat_id,new_state)
|
await self.add_state(chat_id,new_state)
|
||||||
|
|
||||||
async def _add_data(self, chat_id, key, value):
|
async def add_data(self, chat_id, key, value):
|
||||||
states_data = self._read_data()
|
states_data = self.read_data()
|
||||||
result = states_data[chat_id]['data'][key] = value
|
result = states_data[chat_id]['data'][key] = value
|
||||||
await self._save_data(result)
|
await self.save_data(result)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@ -173,7 +173,7 @@ class StateContext:
|
|||||||
def __init__(self , obj: StateMemory, chat_id) -> None:
|
def __init__(self , obj: StateMemory, chat_id) -> None:
|
||||||
self.obj = obj
|
self.obj = obj
|
||||||
self.chat_id = chat_id
|
self.chat_id = chat_id
|
||||||
self.data = obj._get_data(chat_id)
|
self.data = obj.get_data(chat_id)
|
||||||
|
|
||||||
async def __aenter__(self):
|
async def __aenter__(self):
|
||||||
return self.data
|
return self.data
|
||||||
@ -191,14 +191,14 @@ class StateFileContext:
|
|||||||
self.data = None
|
self.data = None
|
||||||
|
|
||||||
async def __aenter__(self):
|
async def __aenter__(self):
|
||||||
self.data = self.obj._get_data(self.chat_id)
|
self.data = self.obj.get_data(self.chat_id)
|
||||||
return self.data
|
return self.data
|
||||||
|
|
||||||
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
||||||
old_data = self.obj._read_data()
|
old_data = self.obj.read_data()
|
||||||
for i in self.data:
|
for i in self.data:
|
||||||
old_data[self.chat_id]['data'][i] = self.data.get(i)
|
old_data[self.chat_id]['data'][i] = self.data.get(i)
|
||||||
await self.obj._save_data(old_data)
|
await self.obj.save_data(old_data)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
import asyncio # for future uses
|
import asyncio # for future uses
|
||||||
from time import time
|
|
||||||
import aiohttp
|
import aiohttp
|
||||||
from telebot import types
|
from telebot import types
|
||||||
import json
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import ujson as json
|
import ujson as json
|
||||||
@ -853,6 +851,8 @@ async def send_data(token, chat_id, data, data_type, reply_to_message_id=None, r
|
|||||||
payload['caption_entities'] = json.dumps(types.MessageEntity.to_list_of_dicts(caption_entities))
|
payload['caption_entities'] = json.dumps(types.MessageEntity.to_list_of_dicts(caption_entities))
|
||||||
if allow_sending_without_reply is not None:
|
if allow_sending_without_reply is not None:
|
||||||
payload['allow_sending_without_reply'] = allow_sending_without_reply
|
payload['allow_sending_without_reply'] = allow_sending_without_reply
|
||||||
|
if protect_content is not None:
|
||||||
|
payload['protect_content'] = protect_content
|
||||||
if method_url == 'sendDocument' and disable_content_type_detection is not None:
|
if method_url == 'sendDocument' and disable_content_type_detection is not None:
|
||||||
payload['disable_content_type_detection'] = disable_content_type_detection
|
payload['disable_content_type_detection'] = disable_content_type_detection
|
||||||
return await _process_request(token, method_url, params=payload, files=files, method='post')
|
return await _process_request(token, method_url, params=payload, files=files, method='post')
|
||||||
|
@ -276,7 +276,7 @@ class StateFile:
|
|||||||
"""
|
"""
|
||||||
self.add_state(chat_id,new_state)
|
self.add_state(chat_id,new_state)
|
||||||
|
|
||||||
def _add_data(self, chat_id, key, value):
|
def add_data(self, chat_id, key, value):
|
||||||
states_data = self.read_data()
|
states_data = self.read_data()
|
||||||
result = states_data[chat_id]['data'][key] = value
|
result = states_data[chat_id]['data'][key] = value
|
||||||
self.save_data(result)
|
self.save_data(result)
|
||||||
|
@ -4,6 +4,7 @@ import re
|
|||||||
import string
|
import string
|
||||||
import threading
|
import threading
|
||||||
import traceback
|
import traceback
|
||||||
|
import warnings
|
||||||
from typing import Any, Callable, List, Dict, Optional, Union
|
from typing import Any, Callable, List, Dict, Optional, Union
|
||||||
|
|
||||||
# noinspection PyPep8Naming
|
# noinspection PyPep8Naming
|
||||||
@ -436,7 +437,7 @@ def generate_random_token():
|
|||||||
return ''.join(random.sample(string.ascii_letters, 16))
|
return ''.join(random.sample(string.ascii_letters, 16))
|
||||||
|
|
||||||
|
|
||||||
def deprecated(warn: bool=False, alternative: Optional[Callable]=None):
|
def deprecated(warn: bool=True, alternative: Optional[Callable]=None):
|
||||||
"""
|
"""
|
||||||
Use this decorator to mark functions as deprecated.
|
Use this decorator to mark functions as deprecated.
|
||||||
When the function is used, an info (or warning if `warn` is True) is logged.
|
When the function is used, an info (or warning if `warn` is True) is logged.
|
||||||
@ -445,12 +446,11 @@ def deprecated(warn: bool=False, alternative: Optional[Callable]=None):
|
|||||||
"""
|
"""
|
||||||
def decorator(function):
|
def decorator(function):
|
||||||
def wrapper(*args, **kwargs):
|
def wrapper(*args, **kwargs):
|
||||||
|
info = f"`{function.__name__}` is deprecated." + (f" Use `{alternative.__name__}` instead" if alternative else "")
|
||||||
if not warn:
|
if not warn:
|
||||||
logger.info(f"`{function.__name__}` is deprecated."
|
logger.info(info)
|
||||||
+ (f" Use `{alternative.__name__}` instead" if alternative else ""))
|
|
||||||
else:
|
else:
|
||||||
logger.warning(f"`{function.__name__}` is deprecated."
|
logger.warning(info)
|
||||||
+ (f" Use `{alternative.__name__}` instead" if alternative else ""))
|
|
||||||
return function(*args, **kwargs)
|
return function(*args, **kwargs)
|
||||||
return wrapper
|
return wrapper
|
||||||
return decorator
|
return decorator
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import sys
|
import sys
|
||||||
|
import warnings
|
||||||
|
|
||||||
sys.path.append('../')
|
sys.path.append('../')
|
||||||
|
|
||||||
@ -19,14 +20,19 @@ if not should_skip:
|
|||||||
CHAT_ID = os.environ['CHAT_ID']
|
CHAT_ID = os.environ['CHAT_ID']
|
||||||
GROUP_ID = os.environ['GROUP_ID']
|
GROUP_ID = os.environ['GROUP_ID']
|
||||||
|
|
||||||
def _new_test():
|
|
||||||
pass
|
|
||||||
|
|
||||||
@util.deprecated(alternative=_new_test)
|
|
||||||
def _test():
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
def deprecated1_new_function():
|
||||||
|
print("deprecated1_new_function")
|
||||||
|
def deprecated1_old_function():
|
||||||
|
print("deprecated1_old_function")
|
||||||
|
warnings.warn("The 'deprecated1_old_function' is deprecated. Use `deprecated1_new_function` instead", DeprecationWarning, 2)
|
||||||
|
deprecated1_new_function()
|
||||||
|
|
||||||
|
def deprecated2_new_function():
|
||||||
|
print("deprecated2_new_function")
|
||||||
|
@util.deprecated(alternative=deprecated2_new_function)
|
||||||
|
def deprecated2_old_function():
|
||||||
|
print("deprecated2_old_function")
|
||||||
|
|
||||||
@pytest.mark.skipif(should_skip, reason="No environment variables configured")
|
@pytest.mark.skipif(should_skip, reason="No environment variables configured")
|
||||||
class TestTeleBot:
|
class TestTeleBot:
|
||||||
@ -633,7 +639,8 @@ class TestTeleBot:
|
|||||||
assert update.message.text == 'got' * 2
|
assert update.message.text == 'got' * 2
|
||||||
|
|
||||||
def test_deprecated_dec(self):
|
def test_deprecated_dec(self):
|
||||||
_test()
|
deprecated1_old_function()
|
||||||
|
deprecated2_old_function()
|
||||||
|
|
||||||
def test_chat_permissions(self):
|
def test_chat_permissions(self):
|
||||||
return # CHAT_ID is private chat, no permissions can be set
|
return # CHAT_ID is private chat, no permissions can be set
|
||||||
|
Loading…
Reference in New Issue
Block a user