3333from telegram import TelegramError
3434from telegram .ext .handler import Handler
3535from telegram .utils .promise import Promise
36+ from telegram .ext import BasePersistence
37+
3638
3739logging .getLogger (__name__ ).addHandler (logging .NullHandler ())
3840DEFAULT_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 ()
0 commit comments