mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2025-08-26 18:09:21 +00:00
181 lines
7.7 KiB
Python
181 lines
7.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
import time
|
|
import logging
|
|
import arrow
|
|
import widgetUtils
|
|
import wx
|
|
import output
|
|
import languageHandler
|
|
import config
|
|
from pubsub import pub
|
|
from controller.buffers.mastodon.base import BaseBuffer
|
|
from controller.mastodon import messages
|
|
from sessions.mastodon import compose, templates
|
|
from wxUI import buffers
|
|
from wxUI.dialogs.mastodon import dialogs as mastodon_dialogs
|
|
from wxUI.dialogs.mastodon import menus
|
|
from mysc.thread_utils import call_threaded
|
|
|
|
log = logging.getLogger("controller.buffers.mastodon.notifications")
|
|
|
|
class NotificationsBuffer(BaseBuffer):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(NotificationsBuffer, self).__init__(*args, **kwargs)
|
|
self.type = "notificationsBuffer"
|
|
|
|
def get_message(self):
|
|
notification = self.get_item()
|
|
if notification == None:
|
|
return
|
|
template = self.session.settings["templates"]["notification"]
|
|
post_template = self.session.settings["templates"]["post"]
|
|
t = templates.render_notification(notification, template, post_template, self.session.settings, relative_times=self.session.settings["general"]["relative_times"], offset_hours=self.session.db["utc_offset"])
|
|
return t
|
|
|
|
def create_buffer(self, parent, name):
|
|
self.buffer = buffers.mastodon.notificationsPanel(parent, name)
|
|
|
|
def onFocus(self, *args, **kwargs):
|
|
item = self.get_item()
|
|
if self.session.settings["general"]["relative_times"] == True:
|
|
original_date = arrow.get(self.session.db[self.name][self.buffer.list.get_selected()].created_at)
|
|
ts = original_date.humanize(locale=languageHandler.getLanguage())
|
|
self.buffer.list.list.SetItem(self.buffer.list.get_selected(), 1, ts)
|
|
if config.app["app-settings"]["read_long_posts_in_gui"] == True and self.buffer.list.list.HasFocus():
|
|
wx.CallLater(40, output.speak, self.get_message(), interrupt=True)
|
|
|
|
def bind_events(self):
|
|
self.buffer.set_focus_function(self.onFocus)
|
|
widgetUtils.connect_event(self.buffer.list.list, widgetUtils.KEYPRESS, self.get_event)
|
|
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.post_status, self.buffer.post)
|
|
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.destroy_status, self.buffer.dismiss)
|
|
|
|
def vote(self):
|
|
pass
|
|
|
|
def can_share(self, *args, **kwargs):
|
|
if self.is_post():
|
|
item = self.get_item()
|
|
return super(NotificationsBuffer, self).can_share(item=item.status)
|
|
return False
|
|
|
|
def add_to_favorites(self):
|
|
if self.is_post():
|
|
item = self.get_item()
|
|
super(NotificationsBuffer, self).add_to_favorites(item=item.status)
|
|
|
|
def remove_from_favorites(self):
|
|
if self.is_post():
|
|
item = self.get_item()
|
|
super(NotificationsBuffer, self).remove_from_favorites(item=item.status)
|
|
|
|
def toggle_favorite(self, *args, **kwargs):
|
|
if self.is_post():
|
|
item = self.get_item()
|
|
super(NotificationsBuffer, self).toggle_favorite(item=item.status)
|
|
|
|
def toggle_bookmark(self, *args, **kwargs):
|
|
if self.is_post():
|
|
item = self.get_item()
|
|
super(NotificationsBuffer, self).toggle_bookmark(item=item.status)
|
|
|
|
def reply(self, *args, **kwargs):
|
|
if self.is_post():
|
|
item = self.get_item()
|
|
super(NotificationsBuffer, self).reply(item=item.status)
|
|
|
|
def share_item(self, *args, **kwargs):
|
|
if self.is_post():
|
|
item = self.get_item()
|
|
super(NotificationsBuffer, self).share_item(item=item.status)
|
|
|
|
def url(self, *args, **kwargs):
|
|
if self.is_post():
|
|
item = self.get_item()
|
|
super(NotificationsBuffer, self).url(item=item.status, *args, **kwargs)
|
|
|
|
def audio(self, *args, **kwargs):
|
|
if self.is_post():
|
|
item = self.get_item()
|
|
super(NotificationsBuffer, self).audio(item=item.status)
|
|
|
|
def view_item(self, *args, **kwargs):
|
|
if self.is_post():
|
|
item = self.get_item()
|
|
super(NotificationsBuffer, self).view_item(item=item.status)
|
|
else:
|
|
pub.sendMessage("execute-action", action="user_details")
|
|
|
|
def open_in_browser(self, *args, **kwargs):
|
|
if self.is_post():
|
|
item = self.get_item()
|
|
super(NotificationsBuffer, self).open_in_browser(item=item.status)
|
|
|
|
def send_message(self, *args, **kwargs):
|
|
if self.is_post():
|
|
item = self.get_item()
|
|
super(NotificationsBuffer, self).send_message(item=item.status)
|
|
else:
|
|
item = self.get_item()
|
|
title = _("New conversation with {}").format(item.account.username)
|
|
caption = _("Write your message here")
|
|
users_str = "@{} ".format(item.account.acct)
|
|
post = messages.post(session=self.session, title=title, caption=caption, text=users_str)
|
|
post.message.visibility.SetSelection(3)
|
|
response = post.message.ShowModal()
|
|
if response == wx.ID_OK:
|
|
post_data = post.get_data()
|
|
call_threaded(self.session.send_post, posts=post_data, visibility="direct", language=post.get_language())
|
|
if hasattr(post.message, "destroy"):
|
|
post.message.destroy()
|
|
|
|
def is_post(self):
|
|
post_types = ["status", "mention", "reblog", "favourite", "update", "poll"]
|
|
item = self.get_item()
|
|
if item.type in post_types:
|
|
return True
|
|
return False
|
|
|
|
def destroy_status(self, *args, **kwargs):
|
|
index = self.buffer.list.get_selected()
|
|
item = self.session.db[self.name][index]
|
|
answer = mastodon_dialogs.delete_notification_dialog()
|
|
if answer == False:
|
|
return
|
|
items = self.session.db[self.name]
|
|
try:
|
|
self.session.api.notifications_dismiss(id=item.id)
|
|
items.pop(index)
|
|
self.buffer.list.remove_item(index)
|
|
output.speak(_("Notification dismissed."))
|
|
except Exception as e:
|
|
self.session.sound.play("error.ogg")
|
|
log.exception("")
|
|
self.session.db[self.name] = items
|
|
|
|
def show_menu(self, ev, pos=0, *args, **kwargs):
|
|
if self.buffer.list.get_count() == 0:
|
|
return
|
|
notification = self.get_item()
|
|
menu = menus.notification(notification.type)
|
|
if self.is_post():
|
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.reply, menuitem=menu.reply)
|
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions)
|
|
if self.can_share() == True:
|
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.share_item, menuitem=menu.boost)
|
|
else:
|
|
menu.boost.Enable(False)
|
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.fav, menuitem=menu.fav)
|
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.unfav, menuitem=menu.unfav)
|
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.url_, menuitem=menu.openUrl)
|
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.audio, menuitem=menu.play)
|
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view)
|
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy)
|
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.destroy_status, menuitem=menu.remove)
|
|
if hasattr(menu, "openInBrowser"):
|
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.open_in_browser, menuitem=menu.openInBrowser)
|
|
if pos != 0:
|
|
self.buffer.PopupMenu(menu, pos)
|
|
else:
|
|
self.buffer.PopupMenu(menu, self.buffer.list.list.GetPosition()) |