check for missed messages on reconnect

This commit is contained in:
dries.k
2022-03-29 17:06:45 +02:00
parent 5a49881a9b
commit 17e41c414d
5 changed files with 142 additions and 48 deletions

View File

@@ -1,4 +1,6 @@
DEFAULT_SETTINGS = { DEFAULT_SETTINGS = {
"message/check_missed/notify": False,
"message/last_id": 0,
"logging/level": "Disabled", "logging/level": "Disabled",
"tray/notifications/priority": 5, "tray/notifications/priority": 5,
"tray/notifications/duration_ms": 5000, "tray/notifications/duration_ms": 5000,

View File

@@ -80,6 +80,8 @@ class MainApplication(QtWidgets.QApplication):
self.tray = Tray() self.tray = Tray()
self.tray.show() self.tray.show()
self.first_connect = True
self.gotify_client.listen( self.gotify_client.listen(
new_message_callback=self.new_message_callback, new_message_callback=self.new_message_callback,
opened_callback=self.listener_opened_callback, opened_callback=self.listener_opened_callback,
@@ -123,10 +125,39 @@ class MainApplication(QtWidgets.QApplication):
i + 1, 0, ApplicationModelItem(application, icon), i + 1, 0, ApplicationModelItem(application, icon),
) )
def update_last_id(self, i: int):
if i > settings.value("message/last_id", type=int):
settings.setValue("message/last_id", i)
def listener_opened_callback(self): def listener_opened_callback(self):
self.main_window.set_active() self.main_window.set_active()
self.tray.set_icon_ok() self.tray.set_icon_ok()
if self.first_connect:
# Do not check for missed messages on launch
self.first_connect = False
return
def get_missed_messages_callback(page: gotify.GotifyPagedMessagesModel):
last_id = settings.value("message/last_id", type=int)
ids = []
page.messages.reverse()
for message in page.messages:
if message.id > last_id:
if settings.value("message/check_missed/notify", type=bool):
self.new_message_callback(message)
else:
self.add_message_to_model(message)
ids.append(message.id)
if ids:
self.update_last_id(max(ids))
self.get_missed_messages_task = GetMessagesTask(self.gotify_client)
self.get_missed_messages_task.success.connect(get_missed_messages_callback)
self.get_missed_messages_task.start()
def listener_closed_callback(self, close_status_code: int, close_msg: str): def listener_closed_callback(self, close_status_code: int, close_msg: str):
self.main_window.set_connecting() self.main_window.set_connecting()
self.tray.set_icon_error() self.tray.set_icon_error()
@@ -149,6 +180,7 @@ class MainApplication(QtWidgets.QApplication):
message: gotify.GotifyMessageModel, message: gotify.GotifyMessageModel,
application: gotify.GotifyApplicationModel, application: gotify.GotifyApplicationModel,
): ):
self.update_last_id(message.id)
message_item = MessagesModelItem(message) message_item = MessagesModelItem(message)
self.messages_model.insertRow(row, message_item) self.messages_model.insertRow(row, message_item)
self.main_window.insert_message_widget( self.main_window.insert_message_widget(

View File

@@ -17,7 +17,11 @@ class Ui_Dialog(object):
self.gridLayout.setObjectName("gridLayout") self.gridLayout.setObjectName("gridLayout")
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Apply|QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) self.buttonBox.setStandardButtons(
QtWidgets.QDialogButtonBox.StandardButton.Apply
| QtWidgets.QDialogButtonBox.StandardButton.Cancel
| QtWidgets.QDialogButtonBox.StandardButton.Ok
)
self.buttonBox.setObjectName("buttonBox") self.buttonBox.setObjectName("buttonBox")
self.gridLayout.addWidget(self.buttonBox, 1, 0, 1, 1) self.gridLayout.addWidget(self.buttonBox, 1, 0, 1, 1)
self.tabWidget = QtWidgets.QTabWidget(Dialog) self.tabWidget = QtWidgets.QTabWidget(Dialog)
@@ -30,29 +34,37 @@ class Ui_Dialog(object):
self.groupBox_5.setObjectName("groupBox_5") self.groupBox_5.setObjectName("groupBox_5")
self.gridLayout_4 = QtWidgets.QGridLayout(self.groupBox_5) self.gridLayout_4 = QtWidgets.QGridLayout(self.groupBox_5)
self.gridLayout_4.setObjectName("gridLayout_4") self.gridLayout_4.setObjectName("gridLayout_4")
spacerItem = QtWidgets.QSpacerItem(
40,
20,
QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum,
)
self.gridLayout_4.addItem(spacerItem, 0, 2, 1, 1)
self.label_6 = QtWidgets.QLabel(self.groupBox_5)
self.label_6.setObjectName("label_6")
self.gridLayout_4.addWidget(self.label_6, 1, 2, 1, 1)
self.label_4 = QtWidgets.QLabel(self.groupBox_5)
self.label_4.setObjectName("label_4")
self.gridLayout_4.addWidget(self.label_4, 0, 0, 1, 1)
self.label_5 = QtWidgets.QLabel(self.groupBox_5)
self.label_5.setObjectName("label_5")
self.gridLayout_4.addWidget(self.label_5, 1, 0, 1, 1)
self.spin_duration = QtWidgets.QSpinBox(self.groupBox_5) self.spin_duration = QtWidgets.QSpinBox(self.groupBox_5)
self.spin_duration.setMinimum(500) self.spin_duration.setMinimum(500)
self.spin_duration.setMaximum(30000) self.spin_duration.setMaximum(30000)
self.spin_duration.setSingleStep(100) self.spin_duration.setSingleStep(100)
self.spin_duration.setObjectName("spin_duration") self.spin_duration.setObjectName("spin_duration")
self.gridLayout_4.addWidget(self.spin_duration, 1, 1, 1, 1) self.gridLayout_4.addWidget(self.spin_duration, 1, 1, 1, 1)
self.label_6 = QtWidgets.QLabel(self.groupBox_5)
self.label_6.setObjectName("label_6")
self.gridLayout_4.addWidget(self.label_6, 1, 2, 1, 1)
self.label_5 = QtWidgets.QLabel(self.groupBox_5)
self.label_5.setObjectName("label_5")
self.gridLayout_4.addWidget(self.label_5, 1, 0, 1, 1)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.gridLayout_4.addItem(spacerItem, 0, 2, 1, 1)
self.label_4 = QtWidgets.QLabel(self.groupBox_5)
self.label_4.setObjectName("label_4")
self.gridLayout_4.addWidget(self.label_4, 0, 0, 1, 1)
self.spin_priority = QtWidgets.QSpinBox(self.groupBox_5) self.spin_priority = QtWidgets.QSpinBox(self.groupBox_5)
self.spin_priority.setMinimum(1) self.spin_priority.setMinimum(1)
self.spin_priority.setMaximum(10) self.spin_priority.setMaximum(10)
self.spin_priority.setProperty("value", 5) self.spin_priority.setProperty("value", 5)
self.spin_priority.setObjectName("spin_priority") self.spin_priority.setObjectName("spin_priority")
self.gridLayout_4.addWidget(self.spin_priority, 0, 1, 1, 1) self.gridLayout_4.addWidget(self.spin_priority, 0, 1, 1, 1)
self.cb_notify = QtWidgets.QCheckBox(self.groupBox_5)
self.cb_notify.setObjectName("cb_notify")
self.gridLayout_4.addWidget(self.cb_notify, 2, 0, 1, 3)
self.verticalLayout_4.addWidget(self.groupBox_5) self.verticalLayout_4.addWidget(self.groupBox_5)
self.groupBox_4 = QtWidgets.QGroupBox(self.tab_general) self.groupBox_4 = QtWidgets.QGroupBox(self.tab_general)
self.groupBox_4.setObjectName("groupBox_4") self.groupBox_4.setObjectName("groupBox_4")
@@ -61,7 +73,12 @@ class Ui_Dialog(object):
self.pb_change_server_info = QtWidgets.QPushButton(self.groupBox_4) self.pb_change_server_info = QtWidgets.QPushButton(self.groupBox_4)
self.pb_change_server_info.setObjectName("pb_change_server_info") self.pb_change_server_info.setObjectName("pb_change_server_info")
self.gridLayout_3.addWidget(self.pb_change_server_info, 0, 0, 1, 1) self.gridLayout_3.addWidget(self.pb_change_server_info, 0, 0, 1, 1)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) spacerItem1 = QtWidgets.QSpacerItem(
40,
20,
QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum,
)
self.gridLayout_3.addItem(spacerItem1, 0, 1, 1, 1) self.gridLayout_3.addItem(spacerItem1, 0, 1, 1, 1)
self.verticalLayout_4.addWidget(self.groupBox_4) self.verticalLayout_4.addWidget(self.groupBox_4)
self.groupBox_7 = QtWidgets.QGroupBox(self.tab_general) self.groupBox_7 = QtWidgets.QGroupBox(self.tab_general)
@@ -78,10 +95,20 @@ class Ui_Dialog(object):
self.pb_open_log.setMaximumSize(QtCore.QSize(30, 16777215)) self.pb_open_log.setMaximumSize(QtCore.QSize(30, 16777215))
self.pb_open_log.setObjectName("pb_open_log") self.pb_open_log.setObjectName("pb_open_log")
self.gridLayout_6.addWidget(self.pb_open_log, 0, 2, 1, 1) self.gridLayout_6.addWidget(self.pb_open_log, 0, 2, 1, 1)
spacerItem2 = QtWidgets.QSpacerItem(190, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) spacerItem2 = QtWidgets.QSpacerItem(
190,
20,
QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Minimum,
)
self.gridLayout_6.addItem(spacerItem2, 0, 3, 1, 1) self.gridLayout_6.addItem(spacerItem2, 0, 3, 1, 1)
self.verticalLayout_4.addWidget(self.groupBox_7) self.verticalLayout_4.addWidget(self.groupBox_7)
spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) spacerItem3 = QtWidgets.QSpacerItem(
20,
40,
QtWidgets.QSizePolicy.Policy.Minimum,
QtWidgets.QSizePolicy.Policy.Expanding,
)
self.verticalLayout_4.addItem(spacerItem3) self.verticalLayout_4.addItem(spacerItem3)
self.tabWidget.addTab(self.tab_general, "") self.tabWidget.addTab(self.tab_general, "")
self.tab_fonts = QtWidgets.QWidget() self.tab_fonts = QtWidgets.QWidget()
@@ -107,7 +134,12 @@ class Ui_Dialog(object):
self.horizontalLayout.addWidget(self.pb_font_message_content) self.horizontalLayout.addWidget(self.pb_font_message_content)
self.layout_fonts_message.addLayout(self.horizontalLayout) self.layout_fonts_message.addLayout(self.horizontalLayout)
self.verticalLayout_5.addWidget(self.groupBox_2) self.verticalLayout_5.addWidget(self.groupBox_2)
spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) spacerItem4 = QtWidgets.QSpacerItem(
20,
40,
QtWidgets.QSizePolicy.Policy.Minimum,
QtWidgets.QSizePolicy.Policy.Expanding,
)
self.verticalLayout_5.addItem(spacerItem4) self.verticalLayout_5.addItem(spacerItem4)
self.tabWidget.addTab(self.tab_fonts, "") self.tabWidget.addTab(self.tab_fonts, "")
self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1) self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)
@@ -119,7 +151,8 @@ class Ui_Dialog(object):
QtCore.QMetaObject.connectSlotsByName(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog)
Dialog.setTabOrder(self.tabWidget, self.spin_priority) Dialog.setTabOrder(self.tabWidget, self.spin_priority)
Dialog.setTabOrder(self.spin_priority, self.spin_duration) Dialog.setTabOrder(self.spin_priority, self.spin_duration)
Dialog.setTabOrder(self.spin_duration, self.pb_change_server_info) Dialog.setTabOrder(self.spin_duration, self.cb_notify)
Dialog.setTabOrder(self.cb_notify, self.pb_change_server_info)
Dialog.setTabOrder(self.pb_change_server_info, self.combo_logging) Dialog.setTabOrder(self.pb_change_server_info, self.combo_logging)
Dialog.setTabOrder(self.combo_logging, self.pb_open_log) Dialog.setTabOrder(self.combo_logging, self.pb_open_log)
Dialog.setTabOrder(self.pb_open_log, self.pb_font_message_title) Dialog.setTabOrder(self.pb_open_log, self.pb_font_message_title)
@@ -131,24 +164,37 @@ class Ui_Dialog(object):
Dialog.setWindowTitle(_translate("Dialog", "Dialog")) Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.groupBox_5.setTitle(_translate("Dialog", "Notifications")) self.groupBox_5.setTitle(_translate("Dialog", "Notifications"))
self.label_6.setText(_translate("Dialog", "ms")) self.label_6.setText(_translate("Dialog", "ms"))
self.label_5.setText(_translate("Dialog", "Notification duration")) self.label_4.setText(
self.label_4.setText(_translate("Dialog", "Minimum priority to show notifications:")) _translate("Dialog", "Minimum priority to show notifications:")
)
self.label_5.setText(_translate("Dialog", "Notification duration:"))
self.cb_notify.setText(
_translate(
"Dialog",
"Show a notification for missed messages after reconnecting",
)
)
self.groupBox_4.setTitle(_translate("Dialog", "Server info")) self.groupBox_4.setTitle(_translate("Dialog", "Server info"))
self.pb_change_server_info.setText(_translate("Dialog", "Change server info")) self.pb_change_server_info.setText(_translate("Dialog", "Change server info"))
self.groupBox_7.setTitle(_translate("Dialog", "Logging")) self.groupBox_7.setTitle(_translate("Dialog", "Logging"))
self.label_7.setText(_translate("Dialog", "Level")) self.label_7.setText(_translate("Dialog", "Level"))
self.pb_open_log.setToolTip(_translate("Dialog", "Open logfile")) self.pb_open_log.setToolTip(_translate("Dialog", "Open logfile"))
self.pb_open_log.setText(_translate("Dialog", "...")) self.pb_open_log.setText(_translate("Dialog", "..."))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_general), _translate("Dialog", "General")) self.tabWidget.setTabText(
self.tabWidget.indexOf(self.tab_general), _translate("Dialog", "General")
)
self.groupBox_2.setTitle(_translate("Dialog", "Message")) self.groupBox_2.setTitle(_translate("Dialog", "Message"))
self.pb_font_message_title.setText(_translate("Dialog", "Title")) self.pb_font_message_title.setText(_translate("Dialog", "Title"))
self.pb_font_message_date.setText(_translate("Dialog", "Date")) self.pb_font_message_date.setText(_translate("Dialog", "Date"))
self.pb_font_message_content.setText(_translate("Dialog", "Message")) self.pb_font_message_content.setText(_translate("Dialog", "Message"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_fonts), _translate("Dialog", "Fonts")) self.tabWidget.setTabText(
self.tabWidget.indexOf(self.tab_fonts), _translate("Dialog", "Fonts")
)
if __name__ == "__main__": if __name__ == "__main__":
import sys import sys
app = QtWidgets.QApplication(sys.argv) app = QtWidgets.QApplication(sys.argv)
Dialog = QtWidgets.QDialog() Dialog = QtWidgets.QDialog()
ui = Ui_Dialog() ui = Ui_Dialog()

View File

@@ -40,33 +40,6 @@
<string>Notifications</string> <string>Notifications</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_4"> <layout class="QGridLayout" name="gridLayout_4">
<item row="1" column="1">
<widget class="QSpinBox" name="spin_duration">
<property name="minimum">
<number>500</number>
</property>
<property name="maximum">
<number>30000</number>
</property>
<property name="singleStep">
<number>100</number>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_6">
<property name="text">
<string>ms</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Notification duration</string>
</property>
</widget>
</item>
<item row="0" column="2"> <item row="0" column="2">
<spacer name="horizontalSpacer_3"> <spacer name="horizontalSpacer_3">
<property name="orientation"> <property name="orientation">
@@ -80,6 +53,13 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="1" column="2">
<widget class="QLabel" name="label_6">
<property name="text">
<string>ms</string>
</property>
</widget>
</item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
@@ -87,6 +67,26 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Notification duration:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="spin_duration">
<property name="minimum">
<number>500</number>
</property>
<property name="maximum">
<number>30000</number>
</property>
<property name="singleStep">
<number>100</number>
</property>
</widget>
</item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QSpinBox" name="spin_priority"> <widget class="QSpinBox" name="spin_priority">
<property name="minimum"> <property name="minimum">
@@ -100,6 +100,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0" colspan="3">
<widget class="QCheckBox" name="cb_notify">
<property name="text">
<string>Show a notification for missed messages after reconnecting</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@@ -272,6 +279,7 @@
<tabstop>tabWidget</tabstop> <tabstop>tabWidget</tabstop>
<tabstop>spin_priority</tabstop> <tabstop>spin_priority</tabstop>
<tabstop>spin_duration</tabstop> <tabstop>spin_duration</tabstop>
<tabstop>cb_notify</tabstop>
<tabstop>pb_change_server_info</tabstop> <tabstop>pb_change_server_info</tabstop>
<tabstop>combo_logging</tabstop> <tabstop>combo_logging</tabstop>
<tabstop>pb_open_log</tabstop> <tabstop>pb_open_log</tabstop>

View File

@@ -43,6 +43,10 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog):
settings.value("tray/notifications/duration_ms", type=int) settings.value("tray/notifications/duration_ms", type=int)
) )
self.cb_notify.setChecked(
settings.value("message/check_missed/notify", type=bool)
)
# Logging # Logging
self.combo_logging.addItems( self.combo_logging.addItems(
[ [
@@ -97,6 +101,7 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog):
# Notifications # Notifications
self.spin_priority.valueChanged.connect(self.settings_changed_callback) self.spin_priority.valueChanged.connect(self.settings_changed_callback)
self.spin_duration.valueChanged.connect(self.settings_changed_callback) self.spin_duration.valueChanged.connect(self.settings_changed_callback)
self.cb_notify.stateChanged.connect(self.settings_changed_callback)
# Server info # Server info
self.pb_change_server_info.clicked.connect(self.change_server_info_callback) self.pb_change_server_info.clicked.connect(self.change_server_info_callback)
@@ -122,6 +127,7 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog):
# Priority # Priority
settings.setValue("tray/notifications/priority", self.spin_priority.value()) settings.setValue("tray/notifications/priority", self.spin_priority.value())
settings.setValue("tray/notifications/duration_ms", self.spin_duration.value()) settings.setValue("tray/notifications/duration_ms", self.spin_duration.value())
settings.setValue("message/check_missed/notify", self.cb_notify.isChecked())
# Logging # Logging
selected_level = self.combo_logging.currentText() selected_level = self.combo_logging.currentText()