diff --git a/src/controller/buffers/mastodon/__init__.py b/src/controller/buffers/mastodon/__init__.py index 554863d8..be846044 100644 --- a/src/controller/buffers/mastodon/__init__.py +++ b/src/controller/buffers/mastodon/__init__.py @@ -1,3 +1,4 @@ # -*- coding: utf-8 -*- from .base import BaseBuffer -from .mentions import MentionsBuffer \ No newline at end of file +from .mentions import MentionsBuffer +from .conversations import ConversationBuffer \ No newline at end of file diff --git a/src/controller/buffers/mastodon/conversations.py b/src/controller/buffers/mastodon/conversations.py new file mode 100644 index 00000000..7a68e2a2 --- /dev/null +++ b/src/controller/buffers/mastodon/conversations.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +import time +import logging +import widgetUtils +from controller.buffers.mastodon.base import BaseBuffer +from sessions.mastodon import utils +from wxUI import commonMessageDialogs +log = logging.getLogger("controller.buffers.mastodon.conversations") + +class ConversationBuffer(BaseBuffer): + + def __init__(self, toot, *args, **kwargs): + self.toot = toot + super(ConversationBuffer, self).__init__(*args, **kwargs) + + def start_stream(self, mandatory=False, play_sound=True, avoid_autoreading=False): + current_time = time.time() + if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True: + self.execution_time = current_time + log.debug("Starting stream for buffer %s, account %s and type %s" % (self.name, self.account, self.type)) + log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs)) + self.toot = self.session.api.status(id=self.toot.id) + # toDo: Implement reverse timelines properly here. + try: + results = [] + items = getattr(self.session.api, self.function)(*self.args, **self.kwargs) + [results.append(item) for item in items.ancestors] + results.append(self.toot) + [results.append(item) for item in items.descendants] + except Exception as e: + log.exception("Error %s" % (str(e))) + return + number_of_items = self.session.order_buffer(self.name, results) + log.debug("Number of items retrieved: %d" % (number_of_items,)) + self.put_items_on_list(number_of_items) + if number_of_items > 0 and self.name != "sent_toots" and self.name != "sent_direct_messages" and self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True: + self.session.sound.play(self.sound) + # Autoread settings + if avoid_autoreading == False and mandatory == True and number_of_items > 0 and self.name in self.session.settings["other_buffers"]["autoread_buffers"]: + self.auto_read(number_of_items) + return number_of_items + + def get_more_items(self): + elements = [] + if self.session.settings["general"]["reverse_timelines"] == False: + max_id = self.session.db[self.name][0].id + else: + max_id = self.session.db[self.name][-1].id + try: + items = getattr(self.session.api, self.function)(max_id=max_id, limit=self.session.settings["general"]["max_toots_per_call"], exclude_types=["follow", "favourite", "reblog", "poll", "follow_request"], *self.args, **self.kwargs) + items = [item.status for item in items if item.get("status") and item.type == "mention"] + except Exception as e: + log.exception("Error %s" % (str(e))) + return + items_db = self.session.db[self.name] + for i in items: + if utils.find_item(i, self.session.db[self.name]) == None: + elements.append(i) + if self.session.settings["general"]["reverse_timelines"] == False: + items_db.insert(0, i) + else: + items_db.append(i) + self.session.db[self.name] = items_db + selection = self.buffer.list.get_selected() + log.debug("Retrieved %d items from cursored search in function %s." % (len(elements), self.function)) + if self.session.settings["general"]["reverse_timelines"] == False: + for i in elements: + toot = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"]) + self.buffer.list.insert_item(True, *toot) + else: + for i in items: + toot = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"]) + self.buffer.list.insert_item(False, *toot) + self.buffer.list.select_item(selection) + output.speak(_(u"%s items retrieved") % (str(len(elements))), True) + + def remove_buffer(self, force=False): + if force == False: + dlg = commonMessageDialogs.remove_buffer() + else: + dlg = widgetUtils.YES + if dlg == widgetUtils.YES: + if self.name in self.session.db: + self.session.db.pop(self.name) + return True + elif dlg == widgetUtils.NO: + return False \ No newline at end of file