Mark unread messags as read and play sound when unread messages are focused

This commit is contained in:
Manuel Cortez 2018-12-16 00:41:47 -06:00
parent a21d0f8a73
commit 4b51126239
3 changed files with 18 additions and 18 deletions

View File

@ -7,6 +7,8 @@
* Audio albums are loaded correctly. * Audio albums are loaded correctly.
* It is possible to play audios added by friends appearing in the news feed. * It is possible to play audios added by friends appearing in the news feed.
* Adding and removing an audio file to your library works. * Adding and removing an audio file to your library works.
* Unread messages will play a sound when focused.
* Unread messages will be marked as read when user focuses them.
## Changes in version 0.16 (13.12.2018) ## Changes in version 0.16 (13.12.2018)
@ -69,6 +71,3 @@
* Added a new attachments' list. When a post is opened, this list will show up if there are attachments in the current post (attachments are audio, photos, video and links). You will be able to interact with the supported data (at the moment only photos, videos, audio and links are supported, more will be added in future). * Added a new attachments' list. When a post is opened, this list will show up if there are attachments in the current post (attachments are audio, photos, video and links). You will be able to interact with the supported data (at the moment only photos, videos, audio and links are supported, more will be added in future).
* Added a changelog file which could be opened from the help menu. * Added a changelog file which could be opened from the help menu.
* Added a preferences dialogue and a new application menu in the menu bar. From this dialogue you can change the number of items to be loaded for every buffer. * Added a preferences dialogue and a new application menu in the menu bar. From this dialogue you can change the number of items to be loaded for every buffer.
---
© 2016, manuel cortéz.

View File

@ -653,6 +653,7 @@ class chatBuffer(baseBuffer):
if msg == False: # Handle the case where the last line of the control cannot be matched to anything. if msg == False: # Handle the case where the last line of the control cannot be matched to anything.
return return
if msg.has_key("read_state") and msg["read_state"] == 0 and msg["id"] not in self.reads: if msg.has_key("read_state") and msg["read_state"] == 0 and msg["id"] not in self.reads:
self.session.soundplayer.play("message_unread.ogg")
self.reads.append(msg["id"]) self.reads.append(msg["id"])
self.session.db[self.name]["items"][-1]["read_state"] = 1 self.session.db[self.name]["items"][-1]["read_state"] = 1
# print msg # print msg
@ -681,7 +682,7 @@ class chatBuffer(baseBuffer):
self.send_chat_to_user() self.send_chat_to_user()
event.Skip() event.Skip()
def get_items(self, show_nextpage=False): def get_items(self, show_nextpage=False, unread=False):
if self.can_get_items == False: return if self.can_get_items == False: return
retrieved = True # Control variable for handling unauthorised/connection errors. retrieved = True # Control variable for handling unauthorised/connection errors.
try: try:
@ -700,6 +701,8 @@ class chatBuffer(baseBuffer):
else: else:
if num > 0: if num > 0:
[self.insert(i, False) for i in self.session.db[self.name]["items"][:num]] [self.insert(i, False) for i in self.session.db[self.name]["items"][:num]]
if unread:
self.session.db[self.name]["items"][-1].update(read_state=0)
return retrieved return retrieved
def add_attachment(self, *args, **kwargs): def add_attachment(self, *args, **kwargs):

View File

@ -67,9 +67,9 @@ class Controller(object):
self.buffers.append(home) self.buffers.append(home)
# Translators: Newsfeed's name in the tree view. # Translators: Newsfeed's name in the tree view.
self.window.insert_buffer(home.tab, _(u"Home"), self.window.search("posts")) self.window.insert_buffer(home.tab, _(u"Home"), self.window.search("posts"))
self.repeatedUpdate = RepeatingTimer(180, self.update_all_buffers) self.repeatedUpdate = RepeatingTimer(120, self.update_all_buffers)
self.repeatedUpdate.start() self.repeatedUpdate.start()
self.readMarker = RepeatingTimer(120, self.mark_as_read) self.readMarker = RepeatingTimer(60, self.mark_as_read)
self.readMarker.start() self.readMarker.start()
feed = buffers.feedBuffer(parent=self.window.tb, name="me_feed", composefunc="render_status", session=self.session, endpoint="get", parent_endpoint="wall", extended=1, count=self.session.settings["buffers"]["count_for_wall_buffers"]) feed = buffers.feedBuffer(parent=self.window.tb, name="me_feed", composefunc="render_status", session=self.session, endpoint="get", parent_endpoint="wall", extended=1, count=self.session.settings["buffers"]["count_for_wall_buffers"])
self.buffers.append(feed) self.buffers.append(feed)
@ -363,7 +363,7 @@ class Controller(object):
if i.kwargs.has_key("user_id") and i.kwargs["user_id"] == user_id: return i if i.kwargs.has_key("user_id") and i.kwargs["user_id"] == user_id: return i
return None return None
def chat_from_id(self, user_id, setfocus=True): def chat_from_id(self, user_id, setfocus=True, unread=False):
b = self.search_chat_buffer(user_id) b = self.search_chat_buffer(user_id)
if b != None: if b != None:
pos = self.window.search(b.name) pos = self.window.search(b.name)
@ -378,7 +378,7 @@ class Controller(object):
if setfocus: if setfocus:
pos = self.window.search(buffer.name) pos = self.window.search(buffer.name)
self.window.change_buffer(pos) self.window.change_buffer(pos)
wx.CallAfter(buffer.get_items) wx.CallAfter(buffer.get_items, unread=unread)
if setfocus: buffer.tab.text.SetFocus() if setfocus: buffer.tab.text.SetFocus()
return True return True
@ -411,17 +411,18 @@ class Controller(object):
uid = obj.peer_id uid = obj.peer_id
# If there is no buffer, we must create one in a wxThread so it will not crash. # If there is no buffer, we must create one in a wxThread so it will not crash.
if buffer == None: if buffer == None:
wx.CallAfter(self.chat_from_id, uid, setfocus=self.session.settings["chat"]["automove_to_conversations"]) wx.CallAfter(self.chat_from_id, uid, setfocus=self.session.settings["chat"]["automove_to_conversations"], unread=True)
self.session.soundplayer.play("conversation_opened.ogg") self.session.soundplayer.play("conversation_opened.ogg")
return return
# If the chat already exists, let's create a dictionary wich will contains data of the received message. # If the chat already exists, let's create a dictionary wich will contains data of the received message.
message = {"id": obj.message_id, "user_id": uid, "date": obj.timestamp, "body": obj.text, "attachments": obj.attachments} message = {"id": obj.message_id, "user_id": uid, "date": obj.timestamp, "body": obj.text, "attachments": obj.attachments, "read_state": 0}
# if attachments is true, let's request for the full message with attachments formatted in a better way. # if attachments is true, let's request for the full message with attachments formatted in a better way.
# Todo: code improvements. We shouldn't need to request the same message again just for these attachments. # Todo: code improvements. We shouldn't need to request the same message again just for these attachments.
if len(message["attachments"]) != 0: if len(message["attachments"]) != 0:
message_ids = message["id"] message_ids = message["id"]
results = self.session.vk.client.messages.getById(message_ids=message_ids) results = self.session.vk.client.messages.getById(message_ids=message_ids)
message = results["items"][0] message = results["items"][0]
message.update(read_state=0)
if obj.from_me: if obj.from_me:
message["from_id"] = self.session.user_id message["from_id"] = self.session.user_id
else: else:
@ -462,17 +463,14 @@ class Controller(object):
time.sleep(2) time.sleep(2)
return self.create_unread_messages() return self.create_unread_messages()
for i in msgs["items"]: for i in msgs["items"]:
wx.CallAfter(self.chat_from_id, i["message"]["user_id"], setfocus=False) wx.CallAfter(self.chat_from_id, i["message"]["user_id"], setfocus=False, unread=True)
def mark_as_read(self): def mark_as_read(self):
ids = ""
for i in self.buffers: for i in self.buffers:
if hasattr(i, "reads"): if hasattr(i, "reads") and len(i.reads) != 0:
for z in i.reads: response = self.session.vk.client.messages.markAsRead(peer_id=i.kwargs["user_id"])
ids = ids+"%d," % (z,)
i.reads = [] i.reads = []
if ids != "": time.sleep(1)
response = self.session.vk.client.messages.markAsRead(message_ids=ids)
def get_audio_albums(self, user_id=None): def get_audio_albums(self, user_id=None):
try: try: