Skip to content

Commit b51207c

Browse files
committed
basic construct
1 parent 492422d commit b51207c

File tree

5 files changed

+65
-15
lines changed

5 files changed

+65
-15
lines changed

telegram/ext/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
# along with this program. If not, see [http://www.gnu.org/licenses/].
1919
"""Extensions over the Telegram Bot API to facilitate bot making"""
2020

21+
from .basepersistence import BasePersistence
2122
from .dispatcher import Dispatcher, DispatcherHandlerStop, run_async
2223
from .jobqueue import JobQueue, Job
2324
from .updater import Updater
@@ -43,4 +44,4 @@
4344
'MessageHandler', 'BaseFilter', 'Filters', 'RegexHandler', 'StringCommandHandler',
4445
'StringRegexHandler', 'TypeHandler', 'ConversationHandler',
4546
'PreCheckoutQueryHandler', 'ShippingQueryHandler', 'MessageQueue', 'DelayQueue',
46-
'DispatcherHandlerStop', 'run_async')
47+
'DispatcherHandlerStop', 'run_async', 'BasePersistence')

telegram/ext/basepersistence.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,21 @@
1919
"""This module contains the BasePersistence class."""
2020

2121
class BasePersistence(object):
22-
def __init__(self):
23-
pass
22+
def __init__(self, store_job_queue=False, store_user_data=False, store_chat_data=False):
23+
self.store_job_queue = store_job_queue
24+
self.store_user_data = store_user_data
25+
self.store_chat_data = store_chat_data
2426

2527
def get_job_queue(self):
2628
raise NotImplemented
2729

28-
def get_datas(self):
30+
def get_user_data(self):
2931
raise NotImplemented
3032

31-
def get_conversation(self):
33+
def get_chat_data(self):
34+
raise NotImplemented
35+
36+
def get_conversations(self):
3237
raise NotImplemented
3338

3439
def change_conversation(self):

telegram/ext/conversationhandler.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,9 @@ def __init__(self,
124124
timed_out_behavior=None,
125125
per_chat=True,
126126
per_user=True,
127-
per_message=False):
127+
per_message=False,
128+
name=None,
129+
persistent=False):
128130

129131
self.entry_points = entry_points
130132
self.states = states
@@ -136,6 +138,10 @@ def __init__(self,
136138
self.per_user = per_user
137139
self.per_chat = per_chat
138140
self.per_message = per_message
141+
self.name = name
142+
if persistent and not self.name:
143+
raise ValueError("Conversations can't be persistent when handler is unnamed.")
144+
self.persistent = persistent
139145

140146
self.conversations = dict()
141147
self.current_conversation = None

telegram/ext/dispatcher.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
from telegram import TelegramError
3434
from telegram.ext.handler import Handler
3535
from telegram.utils.promise import Promise
36+
from telegram.ext import BasePersistence
37+
3638

3739
logging.getLogger(__name__).addHandler(logging.NullHandler())
3840
DEFAULT_GROUP = 0
@@ -70,6 +72,8 @@ class Dispatcher(object):
7072
instance to pass onto handler callbacks.
7173
workers (:obj:`int`): Number of maximum concurrent worker threads for the ``@run_async``
7274
decorator.
75+
user_data (:obj:`dict`): A dictionary handlers can use to store data for the user.
76+
chat_data (:obj:`dict`): A dictionary handlers can use to store data for the chat.
7377
7478
Args:
7579
bot (:class:`telegram.Bot`): The bot object that should be passed to the handlers.
@@ -86,16 +90,33 @@ class Dispatcher(object):
8690
__singleton = None
8791
logger = logging.getLogger(__name__)
8892

89-
def __init__(self, bot, update_queue, workers=4, exception_event=None, job_queue=None):
93+
def __init__(self, bot, update_queue, workers=4, exception_event=None, job_queue=None, persistence=None):
9094
self.bot = bot
9195
self.update_queue = update_queue
92-
self.job_queue = job_queue
9396
self.workers = workers
97+
if persistence:
98+
if not isinstance(persistence, BasePersistence):
99+
self.logger.warning("persistence should be based on Telegram.ext.BasePersistence")
100+
self.persistence = persistence
101+
else:
102+
self.persistence = None
103+
104+
if self.persistence:
105+
if self.persistence.store_user_data:
106+
self.user_data = self.persistence.get_user_data()
107+
if not isinstance(self.user_data, defaultdict):
108+
raise ValueError("user_data must be of type defaultdict")
109+
else:
110+
self.user_data = defaultdict(dict)
111+
if self.persistence.store_chat_data:
112+
self.chat_data = self.persistence.get_chat_data()
113+
if not isinstance(self.chat_data, defaultdict):
114+
raise ValueError("`chat_data must be of type defaultdict")
115+
else:
116+
self.chat_data = defaultdict(dict)
117+
118+
self.job_queue = job_queue
94119

95-
self.user_data = defaultdict(dict)
96-
""":obj:`dict`: A dictionary handlers can use to store data for the user."""
97-
self.chat_data = defaultdict(dict)
98-
""":obj:`dict`: A dictionary handlers can use to store data for the chat."""
99120
self.handlers = {}
100121
"""Dict[:obj:`int`, List[:class:`telegram.ext.Handler`]]: Holds the handlers per group."""
101122
self.groups = []
@@ -324,11 +345,17 @@ def add_handler(self, handler, group=DEFAULT_GROUP):
324345
group (:obj:`int`, optional): The group identifier. Default is 0.
325346
326347
"""
348+
# Unfortunately due to circular imports this has to be here
349+
from .conversationhandler import ConversationHandler
327350

328351
if not isinstance(handler, Handler):
329352
raise TypeError('handler is not an instance of {0}'.format(Handler.__name__))
330353
if not isinstance(group, int):
331354
raise TypeError('group is not int')
355+
if isinstance(handler, ConversationHandler) and handler.persistent:
356+
if not self.persistence:
357+
raise ValueError("Conversationhandler {} can not be persistent if logger has no persistence", handler.name)
358+
handler.conversations = self.persistence.get_conversations(handler.name)
332359

333360
if group not in self.handlers:
334361
self.handlers[group] = list()

telegram/ext/updater.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ def __init__(self,
9191
workers=4,
9292
bot=None,
9393
user_sig_handler=None,
94-
request_kwargs=None):
94+
request_kwargs=None,
95+
persistence=None):
9596

9697
if (token is None) and (bot is None):
9798
raise ValueError('`token` or `bot` must be passed')
@@ -123,14 +124,24 @@ def __init__(self,
123124
self.bot = Bot(token, base_url, request=self._request)
124125
self.user_sig_handler = user_sig_handler
125126
self.update_queue = Queue()
126-
self.job_queue = JobQueue(self.bot)
127+
self.persistence = persistence
128+
self.job_queue = None
129+
if self.persistence:
130+
if self.persistence.store_job_queue:
131+
self.job_queue = self.persistence.get_job_queue()
132+
if not isinstance(self.job_queue, JobQueue):
133+
raise ValueError("job_queue must be of type JobQueue")
134+
135+
if not self.job_queue:
136+
self.job_queue = JobQueue(self.bot)
127137
self.__exception_event = Event()
128138
self.dispatcher = Dispatcher(
129139
self.bot,
130140
self.update_queue,
131141
job_queue=self.job_queue,
132142
workers=workers,
133-
exception_event=self.__exception_event)
143+
exception_event=self.__exception_event,
144+
persistence=self.persistence)
134145
self.last_update_id = 0
135146
self.running = False
136147
self.is_idle = False

0 commit comments

Comments
 (0)