Skip to content

Commit 9274539

Browse files
committed
Fix: minor changes (safer)
1 parent 8ac608f commit 9274539

File tree

5 files changed

+39
-16
lines changed

5 files changed

+39
-16
lines changed

autoconv/autoconv_handler.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,13 @@ def _change_state(self, data, state=None):
9191
data_context.update({"error": False, "error-counter": 0})
9292
elif data_context.get("error") is not None:
9393
data_context.pop("error")
94-
data_context.pop("error-counter")
94+
data_context.pop("error-counter", 0)
9595
self._restore_basic_routes()
9696
return new_state
9797

9898
def _wrong_message(self, text, data):
9999
"""Handler for wrong message"""
100-
self.tData.update.message.delete()
100+
self.safe_delete_message(self.tData.update.message)
101101
state = self.conversation.get_state(self.tData.context.user_data.get("state"))
102102
self._restore_basic_routes()
103103
# save data
@@ -122,7 +122,7 @@ def _wrong_message(self, text, data):
122122
def _update_dynamic_list(self, state):
123123
"""Update i and routes backup for dynamic list"""
124124
data = self.tData.context.user_data
125-
if (state_l := data.get("list")) :
125+
if state_l := data.get("list"):
126126
i = int(data.get("list_i"))
127127
new_i = i
128128
if state.list_all:
@@ -297,12 +297,20 @@ def _send_message(self, state, send_func, elements=None, save=True, post_func=st
297297
return new_msg
298298

299299
def _do_operations(self, state, data):
300+
"""Apply operations if exists in this state and button"""
300301
if isinstance(data, int):
301302
data = data - len(self.tData.context.user_data.get("list", []))
302303
if state.operations and data in state.operations:
303304
return state.operations.get(data)(self.tData.prepare())
304305
return False
305306

307+
def safe_delete_message(self, message):
308+
"""Safe delete messages (for group and channel)"""
309+
try:
310+
message.delete()
311+
except BadRequest:
312+
pass
313+
306314
# -------- Public functions ---------
307315

308316
# ---- async
@@ -338,7 +346,7 @@ def send_message(tdata):
338346
chat_id = tdata.update.effective_chat.id
339347
msg_id = tdata.context.bot.send_message(chat_id, msg, **kwargs)
340348
sleep(seconds)
341-
msg_id.delete()
349+
self.safe_delete_message(msg_id)
342350

343351
self.set_timed_function(0, function=send_message)
344352

@@ -370,8 +378,8 @@ def force_state(self, state, update):
370378
def restart(self, update, context):
371379
"""Restart handler to initial configuration"""
372380
if self.tData.context:
373-
self.tData.context.user_data.get("data").clear()
374-
self.tData.context.user_data.pop("bot-msg")
381+
self.tData.context.user_data.get("data", {}).clear()
382+
self.tData.context.user_data.pop("bot-msg", 0)
375383
self.tData.prepare()
376384
else:
377385
self.tData.update_telegram_data(update, context)
@@ -386,19 +394,18 @@ def manage_conversation(self, update, context, delete_first=False):
386394
context.user_data.get("prev_state")
387395
)
388396
self.tData.update_telegram_data(update, context)
389-
telegram_id = self.tData.update.effective_chat.id
390397
# ---- check authorization
391398
if (
392399
self.conversation.users_list is not None
393-
and telegram_id not in self.conversation.users_list
400+
and update.effective_user.id not in self.conversation.users_list
394401
):
395-
if (fbs := self.conversation.no_auth_state) :
402+
if fbs := self.conversation.no_auth_state:
396403
return self.force_state(fbs, update)
397404
return self.NEXT
398405
# ---- start | first message
399406
if not self.tData.context.user_data:
400407
if delete_first:
401-
update.message.delete()
408+
self.safe_delete_message(update.message)
402409
state = self.conversation.start
403410
self._init_context(state)
404411
self._send_message(state, self.tData.update.message.reply_text)
@@ -412,7 +419,7 @@ def manage_conversation(self, update, context, delete_first=False):
412419
to_reply = self.tData.update.callback_query.edit_message_text
413420
else:
414421
if not state.regex and not state.handler:
415-
self.tData.update.message.delete()
422+
self.safe_delete_message(self.tData.update.message)
416423
return self.NEXT
417424
data = (
418425
state.handler
@@ -422,7 +429,7 @@ def manage_conversation(self, update, context, delete_first=False):
422429
if state.regex and not match(state.regex, str(data)) or not data:
423430
return self._wrong_message(state.regex, data)
424431
to_reply = self.tData.context.user_data.get("bot-msg").edit_text
425-
self.tData.update.message.delete()
432+
self.safe_delete_message(self.tData.update.message)
426433
# ---- next stage
427434
typed_data = state.data_type(data) if data != "BACK" else "BACK"
428435
if not self._do_operations(state, typed_data) == self.EXIT_SIGNAL:

autoconv/conversation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from autoconv.state import State
77
from pydantic import validate_arguments
88
from toml import load as tload
9-
from yaml import load as yload
9+
from yaml import safe_load as yload
1010

1111

1212
class Conversation:

autoconv/utils/telegram_data.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ def __init__(self, autoconv, users):
77
self.udata = None
88
self.sdata = None
99
self.message = None
10+
self.chat_type = None
1011
self.exception = None
1112
self.users = users
1213

@@ -23,11 +24,15 @@ def __str__(self):
2324
# ---- Update functions
2425

2526
def update_telegram_data(self, update, context):
27+
"""Simple info update in TelegramData"""
2628
self.update = update
2729
self.context = context
2830

2931
def prepare(self):
30-
self.telegram_id = self.update.effective_chat.id
32+
"""Preparing all the update info for dynamic stuff in handler"""
33+
self.message = self.update.message or self.update.callback_query.message
34+
self.telegram_id = self.update.effective_user.id
35+
self.chat_type = self.message.chat.type
3136
self.udata = self.context.user_data
3237
self.sdata = self.udata.get("data") if self.udata else None
3338
self.message = self.update.message
@@ -36,16 +41,25 @@ def prepare(self):
3641
# ---- Public function
3742

3843
def save(self, *args, **kwargs):
44+
"""Save key:value in user_data space"""
3945
self.context.user_data.update(*args, **kwargs)
4046
self.prepare()
4147

4248
def add(self, key, value):
49+
"""Add some value to a already stored key in user_data"""
4350
prev_value = self.udata.get(key)
4451
self.context.user_data.update({key: prev_value + value})
4552
self.prepare()
4653
return prev_value + value
4754

4855
def get_or_set(self, key, set_value):
56+
"""Get or set a value associated to a key in user_data"""
4957
if key not in self.udata:
5058
self.save({key: set_value})
5159
return self.udata.get(key)
60+
61+
def delete(self, key, pop_value=None):
62+
"""Delete a key in user_data"""
63+
value = self.context.user_data.pop(key, pop_value)
64+
self.prepare()
65+
return value

requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ certifi==2021.5.30
44
pydantic==1.8.2
55
python-telegram-bot==13.6
66
pytz==2021.1
7+
PyYAML==6.0
78
six==1.16.0
9+
toml==0.10.2
810
tornado==6.1
911
typing-extensions==3.10.0.0
1012
tzlocal==2.1

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
setuptools.setup(
77
name="telegram-autoconv",
8-
version="0.0.71",
8+
version="0.0.72",
99
author="Moris Doratiotto",
1010
author_email="[email protected]",
1111
description="A python module to auto build conversation for a Telegram bot",
@@ -16,7 +16,7 @@
1616
install_requires=[
1717
"python-telegram-bot==13.7",
1818
"pydantic==1.8.2",
19-
"pyyaml==5.4.1",
19+
"pyyaml==6.0",
2020
"toml==0.10.2",
2121
],
2222
classifiers=[

0 commit comments

Comments
 (0)