diff --git a/telebot/__init__.py b/telebot/__init__.py index ca93487..5f299a6 100644 --- a/telebot/__init__.py +++ b/telebot/__init__.py @@ -252,7 +252,7 @@ class TeleBot: """ self.current_states = StateFile(filename=filename) - self.current_states._create_dir() + self.current_states.create_dir() def enable_save_reply_handlers(self, delay=120, filename="./.handler-saves/reply.save"): """ @@ -1221,11 +1221,13 @@ class TeleBot: reply_to_message_id = reply_to_message_id, reply_markup = reply_markup, parse_mode = parse_mode, disable_notification = disable_notification, timeout = timeout, caption = caption, thumb = thumb, caption_entities = caption_entities, allow_sending_without_reply = allow_sending_without_reply, - disable_content_type_detection = disable_content_type_detection, visible_file_name = visible_file_name, protect_content = protect_content)) + disable_content_type_detection = disable_content_type_detection, visible_file_name = visible_file_name, + protect_content = protect_content)) # TODO: Rewrite this method like in API. def send_sticker( - self, chat_id: Union[int, str], sticker: Union[Any, str], + self, chat_id: Union[int, str], + sticker: Union[Any, str], reply_to_message_id: Optional[int]=None, reply_markup: Optional[REPLY_MARKUP_TYPES]=None, disable_notification: Optional[bool]=None, @@ -1236,6 +1238,7 @@ class TeleBot: """ Use this method to send .webp stickers. :param chat_id: + :param sticker: :param data: :param reply_to_message_id: :param reply_markup: @@ -1254,7 +1257,8 @@ class TeleBot: self.token, chat_id, sticker, 'sticker', reply_to_message_id=reply_to_message_id, reply_markup=reply_markup, disable_notification=disable_notification, timeout=timeout, - allow_sending_without_reply=allow_sending_without_reply, protect_content=protect_content)) + allow_sending_without_reply=allow_sending_without_reply, + protect_content=protect_content)) def send_video( self, chat_id: Union[int, str], video: Union[Any, str], @@ -1330,6 +1334,7 @@ class TeleBot: :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 parse_mode: + :param protect_content: :param reply_to_message_id: :param reply_markup: :param disable_notification: @@ -2559,7 +2564,7 @@ class TeleBot: :param chat_id: """ for key, value in kwargs.items(): - self.current_states._add_data(chat_id, key, value) + self.current_states.add_data(chat_id, key, value) def register_next_step_handler_by_chat_id( self, chat_id: Union[int, str], callback: Callable, *args, **kwargs) -> None: diff --git a/telebot/apihelper.py b/telebot/apihelper.py index 3f9562d..870c609 100644 --- a/telebot/apihelper.py +++ b/telebot/apihelper.py @@ -144,6 +144,7 @@ def _make_request(token, method_name, method='get', params=None, files=None): method, request_url, params=params, files=files, timeout=(connect_timeout, read_timeout), proxies=proxy) elif CUSTOM_REQUEST_SENDER: + # noinspection PyCallingNonCallable result = CUSTOM_REQUEST_SENDER( method, request_url, params=params, files=files, timeout=(connect_timeout, read_timeout), proxies=proxy) @@ -246,6 +247,7 @@ def send_message( :param timeout: :param entities: :param allow_sending_without_reply: + :param protect_content: :return: """ method_url = r'sendMessage' @@ -861,7 +863,8 @@ def send_audio(token, chat_id, audio, caption=None, duration=None, performer=Non def send_data(token, chat_id, data, data_type, reply_to_message_id=None, reply_markup=None, parse_mode=None, disable_notification=None, timeout=None, caption=None, thumb=None, caption_entities=None, - allow_sending_without_reply=None, disable_content_type_detection=None, visible_file_name=None): + allow_sending_without_reply=None, disable_content_type_detection=None, visible_file_name=None, + protect_content = None): method_url = get_method_by_type(data_type) payload = {'chat_id': chat_id} files = None @@ -896,6 +899,8 @@ def send_data(token, chat_id, data, data_type, reply_to_message_id=None, reply_m payload['caption_entities'] = json.dumps(types.MessageEntity.to_list_of_dicts(caption_entities)) if allow_sending_without_reply is not None: 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: payload['disable_content_type_detection'] = disable_content_type_detection return _make_request(token, method_url, params=payload, files=files, method='post') @@ -1382,6 +1387,7 @@ def send_invoice( :param max_tip_amount: The maximum accepted amount for tips in the smallest units of the currency :param suggested_tip_amounts: A JSON-serialized array of suggested amounts of tips in the smallest units of the currency. At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed max_tip_amount. + :param protect_content: :return: """ method_url = r'sendInvoice' diff --git a/telebot/handler_backends.py b/telebot/handler_backends.py index 45b903b..6f12c35 100644 --- a/telebot/handler_backends.py +++ b/telebot/handler_backends.py @@ -168,7 +168,7 @@ class StateMemory: """Delete a state""" self._states.pop(chat_id) - def _get_data(self, chat_id): + def get_data(self, chat_id): return self._states[chat_id]['data'] def set(self, chat_id, new_state): @@ -179,7 +179,7 @@ class StateMemory: """ self.add_state(chat_id,new_state) - def _add_data(self, chat_id, key, value): + def add_data(self, chat_id, key, value): result = self._states[chat_id]['data'][key] = value return result @@ -217,28 +217,27 @@ class StateFile: :param chat_id: :param state: new state """ - states_data = self._read_data() + states_data = self.read_data() if chat_id in states_data: states_data[chat_id]['state'] = state - return self._save_data(states_data) + return self.save_data(states_data) else: - new_data = states_data[chat_id] = {'state': state,'data': {}} - return self._save_data(states_data) - + states_data[chat_id] = {'state': state,'data': {}} + return self.save_data(states_data) def current_state(self, chat_id): """Current state.""" - states_data = self._read_data() + states_data = self.read_data() if chat_id in states_data: return states_data[chat_id]['state'] else: return False def delete_state(self, chat_id): """Delete a state""" - states_data = self._read_data() + states_data = self.read_data() states_data.pop(chat_id) - self._save_data(states_data) + self.save_data(states_data) - def _read_data(self): + def read_data(self): """ Read the data from file. """ @@ -247,7 +246,7 @@ class StateFile: file.close() return states_data - def _create_dir(self): + def create_dir(self): """ Create directory .save-handlers. """ @@ -257,7 +256,7 @@ class StateFile: with open(self.file_path,'wb') as file: pickle.dump({}, file) - def _save_data(self, new_data): + def save_data(self, new_data): """ Save data after editing. :param new_data: @@ -266,23 +265,21 @@ class StateFile: pickle.dump(new_data, state_file, protocol=pickle.HIGHEST_PROTOCOL) return True - def _get_data(self, chat_id): - return self._read_data()[chat_id]['data'] + def get_data(self, chat_id): + return self.read_data()[chat_id]['data'] def set(self, chat_id, new_state): """ Set a new state for a user. :param chat_id: :param new_state: new_state of a user - """ self.add_state(chat_id,new_state) 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 - self._save_data(result) - + self.save_data(result) return result def finish(self, chat_id): @@ -313,7 +310,7 @@ class StateContext: def __init__(self , obj: StateMemory, chat_id) -> None: self.obj = obj self.chat_id = chat_id - self.data = obj._get_data(chat_id) + self.data = obj.get_data(chat_id) def __enter__(self): return self.data @@ -321,6 +318,7 @@ class StateContext: def __exit__(self, exc_type, exc_val, exc_tb): return + class StateFileContext: """ Class for data. @@ -328,15 +326,14 @@ class StateFileContext: def __init__(self , obj: StateFile, chat_id) -> None: self.obj = obj self.chat_id = chat_id - self.data = self.obj._get_data(self.chat_id) + self.data = self.obj.get_data(self.chat_id) def __enter__(self): return self.data def __exit__(self, exc_type, exc_val, exc_tb): - old_data = self.obj._read_data() + old_data = self.obj.read_data() for i in self.data: old_data[self.chat_id]['data'][i] = self.data.get(i) - self.obj._save_data(old_data) - + self.obj.save_data(old_data) return diff --git a/telebot/util.py b/telebot/util.py index 1ab6201..414fa56 100644 --- a/telebot/util.py +++ b/telebot/util.py @@ -449,7 +449,7 @@ def deprecated(warn: bool=False, alternative: Optional[Callable]=None): logger.info(f"`{function.__name__}` is deprecated." + (f" Use `{alternative.__name__}` instead" if alternative else "")) else: - logger.warn(f"`{function.__name__}` is deprecated." + logger.warning(f"`{function.__name__}` is deprecated." + (f" Use `{alternative.__name__}` instead" if alternative else "")) return function(*args, **kwargs) return wrapper @@ -484,6 +484,7 @@ def antiflood(function, *args, **kwargs): """ from telebot.apihelper import ApiTelegramException from time import sleep + msg = None try: msg = function(*args, **kwargs) except ApiTelegramException as ex: @@ -491,4 +492,4 @@ def antiflood(function, *args, **kwargs): sleep(ex.result_json['parameters']['retry_after']) msg = function(*args, **kwargs) finally: - return msg \ No newline at end of file + return msg diff --git a/telebot/version.py b/telebot/version.py index 42af8f6..531afbd 100644 --- a/telebot/version.py +++ b/telebot/version.py @@ -1,3 +1,3 @@ # Versions should comply with PEP440. # This line is parsed in setup.py: -__version__ = '4.3.0' +__version__ = '4.3.1'