From a57ea752d6abb0b158121e3d8257b88f2d9cf552 Mon Sep 17 00:00:00 2001 From: Manuel Cortez Date: Thu, 23 Mar 2023 13:17:55 -0600 Subject: [PATCH] Mastodon: Finished first implementation of 'reattempt to post on failures'. Should be relevant for #527, #526, #377, #137, #108 --- src/controller/buffers/mastodon/base.py | 14 +++++++++++++- src/controller/mainController.py | 6 +++++- src/controller/mastodon/messages.py | 16 ++++++++++------ src/sessions/mastodon/session.py | 7 +++---- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/controller/buffers/mastodon/base.py b/src/controller/buffers/mastodon/base.py index de4c7a46..bdbfb9fe 100644 --- a/src/controller/buffers/mastodon/base.py +++ b/src/controller/buffers/mastodon/base.py @@ -564,4 +564,16 @@ class BaseBuffer(base.Buffer): dlg.Destroy() if answer != wx.ID_OK: return - poll = self.session.api_call(call_name="poll_vote", id=poll.id, choices=options, preexec_message=_("Sending vote...")) \ No newline at end of file + poll = self.session.api_call(call_name="poll_vote", id=poll.id, choices=options, preexec_message=_("Sending vote...")) + + def post_from_error(self, visibility, data): + title = _("Post") + caption = _("Write your post here") + post = messages.post(session=self.session, title=title, caption=caption) + post.set_post_data(visibility=visibility, data=data) + response = post.message.ShowModal() + if response == wx.ID_OK: + post_data = post.get_data() + call_threaded(self.session.send_post, posts=post_data, visibility=post.get_visibility()) + if hasattr(post.message, "destroy"): + post.message.destroy() diff --git a/src/controller/mainController.py b/src/controller/mainController.py index 3a7ea9fe..42904743 100644 --- a/src/controller/mainController.py +++ b/src/controller/mainController.py @@ -130,7 +130,7 @@ class Controller(object): pub.subscribe(self.mastodon_new_item, "mastodon.new_item") pub.subscribe(self.mastodon_updated_item, "mastodon.updated_item") pub.subscribe(self.mastodon_new_conversation, "mastodon.conversation_received") - + pub.subscribe(self.mastodon_error_post, "mastodon.error_post") # connect application events to GUI widgetUtils.connect_event(self.view, widgetUtils.CLOSE_EVENT, self.exit_) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.show_hide, menuitem=self.view.show_hide) @@ -1306,6 +1306,10 @@ class Controller(object): # if "direct_messages" not in buffer.session.settings["other_buffers"]["muted_buffers"]: # self.notify(buffer.session, sound_to_play) + def mastodon_error_post(self, name, reply_to, visibility, posts): + home = self.search_buffer("home_timeline", name) + wx.CallAfter(home.post_from_error, visibility=visibility, data=posts) + def report_error(self, *args, **kwargs): """Redirects the user to the issue page on github""" log.debug("Redirecting the user to report an error...") diff --git a/src/controller/mastodon/messages.py b/src/controller/mastodon/messages.py index e008c855..62c157b0 100644 --- a/src/controller/mastodon/messages.py +++ b/src/controller/mastodon/messages.py @@ -64,18 +64,22 @@ class post(messages.basicTweet): self.add_post(event=None, update_gui=False) return self.thread - def set_post_data(self, *data): + def set_post_data(self, visibility, data): if len(data) == 0: return if len(data) > 1: self.thread = data[:-1] for p in self.thread: - self.message.add_item(item=[p.get("text", ""), len(p.get("attachments", []))], list_type="post") + self.message.add_item(item=[p.get("text") or "", len(p.get("attachments") or [])], list_type="post") post = data[-1] - self.attachments = post.get("attachments", []) - self.message.text.SetValue(post.get("text", "")) - self.message.sensitive.SetValue(post.get("sensitive", False)) - self.message.spoiler.SetValue(post.get("spoiler_text", "")) + self.attachments = post.get("attachments") or [] + self.message.text.SetValue(post.get("text") or "") + self.message.sensitive.SetValue(post.get("sensitive") or False) + self.message.spoiler.SetValue(post.get("spoiler_text") or "") + visibility_settings = dict(public=0, unlisted=1, private=2, direct=3) + self.message.visibility.SetSelection(visibility_settings.get(visibility)) + self.message.on_sensitivity_changed() + self.text_processor() def text_processor(self, *args, **kwargs): text = self.message.text.GetValue() diff --git a/src/sessions/mastodon/session.py b/src/sessions/mastodon/session.py index 1fcd7f18..054eb28a 100644 --- a/src/sessions/mastodon/session.py +++ b/src/sessions/mastodon/session.py @@ -203,7 +203,7 @@ class Session(base.baseSession): self.sound.play(_sound) return val - def send_post(self, reply_to=None, users=None, visibility=None, posts=[]): + def send_post(self, reply_to=None, visibility=None, posts=[]): """ Convenience function to send a thread. """ in_reply_to_id = reply_to for obj in posts: @@ -213,8 +213,7 @@ class Session(base.baseSession): item = self.api_call(call_name="status_post", status=text, _sound="tweet_send.ogg", in_reply_to_id=in_reply_to_id, visibility=visibility, sensitive=obj["sensitive"], spoiler_text=obj["spoiler_text"]) # If it fails, let's basically send an event with all passed info so we will catch it later. except Exception as e: - pub.sendMessage("mastodon.error_post", reply_to=reply_to, users=users, visibility=visibility, posts=posts) - print("message sent") + pub.sendMessage("mastodon.error_post", name=self.get_name(), reply_to=reply_to, visibility=visibility, posts=posts) return if item != None: in_reply_to_id = item["id"] @@ -232,7 +231,7 @@ class Session(base.baseSession): if item != None: in_reply_to_id = item["id"] except Exception as e: - pub.sendMessage("mastodon.error_post", reply_to=reply_to, users=users, visibility=visibility, posts=posts) + pub.sendMessage("mastodon.error_post", name=self.get_name(), reply_to=reply_to, visibility=visibility, posts=posts) return def get_name(self):