Added online friends buffer

This commit is contained in:
Manuel Cortez 2019-02-14 13:09:44 -06:00
parent 4c220cbb36
commit 5780d3ca21
6 changed files with 91 additions and 9 deletions

View File

@ -2,6 +2,7 @@
## changes in this version ## changes in this version
* A new buffer, called online, has been added in the friends section. It contains friends currently connected to VK. Items in this buffer will be added as soon as new friends are online in the social network, and will be removed when friends are offline. This buffer needs a lot of testing. Please report any possible inconsistency on this method.
* Added new options to open the config and logs folder, these options are located in the help menu and may be useful during error reporting. * Added new options to open the config and logs folder, these options are located in the help menu and may be useful during error reporting.
* Added experimental support to "subscribers" buffer, inside frienship requests. This shows friend requests that have been declined by the current user. * Added experimental support to "subscribers" buffer, inside frienship requests. This shows friend requests that have been declined by the current user.
* Fixed an error in Socializer that was making it unable to detect unread messages properly. * Fixed an error in Socializer that was making it unable to detect unread messages properly.

View File

@ -1139,8 +1139,15 @@ class peopleBuffer(feedBuffer):
return return
if ("last_seen" in post) == False: return if ("last_seen" in post) == False: return
original_date = arrow.get(post["last_seen"]["time"]) original_date = arrow.get(post["last_seen"]["time"])
created_at = original_date.humanize(locale=languageHandler.curLang[:2]) now = arrow.now()
self.tab.list.list.SetItem(self.tab.list.get_selected(), 1, created_at) original_date.to(now.tzinfo)
diffdate = now-original_date
if diffdate.days == 0 and diffdate.seconds <= 360:
online_status = _("Online")
else:
# Translators: This is the date of last seen
online_status = _("Last seen {0}").format(original_date.humanize(locale=languageHandler.curLang[:2]),)
self.tab.list.list.SetItem(self.tab.list.get_selected(), 1, online_status)
def open_timeline(self, *args, **kwargs): def open_timeline(self, *args, **kwargs):
pass pass
@ -1196,6 +1203,49 @@ class peopleBuffer(feedBuffer):
def keep_as_follower(self, *args, **kwargs): def keep_as_follower(self, *args, **kwargs):
pass pass
def add_person(self, person):
# This tracks if the user already exists here, in such case we just will update the last_seen variable
existing = False
for i in self.session.db[self.name]["items"]:
if person["id"] == i["id"]:
existing = True
i["last_seen"]["time"] = person["last_seen"]["time"]
break
# Add the new user to the buffer just if it does not exists previously.
if existing == False:
self.session.db[self.name]["items"].insert(0, person)
self.insert(person, True)
def remove_person(self, user_id):
# Make sure the user is added in the buffer, otherwise don't attempt to remove a None Value from the list.
user = None
for i in self.session.db[self.name]["items"]:
if i["id"] == user_id:
user = i
break
if user != None:
person_index = self.session.db[self.name]["items"].index(user)
self.session.db[self.name]["items"].pop(person_index)
self.tab.list.remove_item(person_index)
def get_friend(self, user_id):
for i in self.session.db["friends_"]["items"]:
if i["id"] == user_id:
return i
log.exception("Getting user manually...")
user = self.session.vk.client.users.get(user_ids=event.user_id, fields="last_seen")[0]
return user
def update_online(self):
online_users = self.session.vk.client.friends.getOnline()
now = time.time()
for i in self.session.db[self.name]["items"]:
if i["id"] in online_users:
i["last_seen"]["time"] = now
else:
log.exception("Removing an user from online status manually... %r" % (i))
self.remove_person(i["id"])
class requestsBuffer(peopleBuffer): class requestsBuffer(peopleBuffer):
def get_items(self, show_nextpage=False): def get_items(self, show_nextpage=False):

View File

@ -92,7 +92,8 @@ class Controller(object):
pub.sendMessage("create_buffer", buffer_type="videoBuffer", buffer_title=_("My videos"), parent_tab="videos", kwargs=dict(parent=self.window.tb, name="me_video", composefunc="render_video", session=self.session, endpoint="get", parent_endpoint="video", count=self.session.settings["buffers"]["count_for_video_buffers"])) pub.sendMessage("create_buffer", buffer_type="videoBuffer", buffer_title=_("My videos"), parent_tab="videos", kwargs=dict(parent=self.window.tb, name="me_video", composefunc="render_video", session=self.session, endpoint="get", parent_endpoint="video", count=self.session.settings["buffers"]["count_for_video_buffers"]))
pub.sendMessage("create_buffer", buffer_type="emptyBuffer", buffer_title=_("Albums"), parent_tab="videos", kwargs=dict(parent=self.window.tb, name="albums")) pub.sendMessage("create_buffer", buffer_type="emptyBuffer", buffer_title=_("Albums"), parent_tab="videos", kwargs=dict(parent=self.window.tb, name="albums"))
pub.sendMessage("create_buffer", buffer_type="emptyBuffer", buffer_title=_("People"), kwargs=dict(parent=self.window.tb, name="people")) pub.sendMessage("create_buffer", buffer_type="emptyBuffer", buffer_title=_("People"), kwargs=dict(parent=self.window.tb, name="people"))
pub.sendMessage("create_buffer", buffer_type="peopleBuffer", buffer_title=_("Friends"), parent_tab="people", kwargs=dict(parent=self.window.tb, name="friends_", composefunc="render_person", session=self.session, endpoint="get", parent_endpoint="friends", count=5000, order="hints", fields="uid, first_name, last_name, last_seen")) pub.sendMessage("create_buffer", buffer_type="peopleBuffer", buffer_title=_("Online"), parent_tab="people", kwargs=dict(parent=self.window.tb, name="online_friends", composefunc="render_person", session=self.session, endpoint="getOnline", parent_endpoint="friends", count=5000, order="hints", fields="uid, first_name, last_name, last_seen"))
pub.sendMessage("create_buffer", buffer_type="peopleBuffer", buffer_title=_("All friends"), parent_tab="people", kwargs=dict(parent=self.window.tb, name="friends_", composefunc="render_person", session=self.session, endpoint="get", parent_endpoint="friends", count=5000, order="hints", fields="uid, first_name, last_name, last_seen"))
pub.sendMessage("create_buffer", buffer_type="emptyBuffer", buffer_title=_("Friendship requests"), parent_tab="people", kwargs=dict(parent=self.window.tb, name="requests")) pub.sendMessage("create_buffer", buffer_type="emptyBuffer", buffer_title=_("Friendship requests"), parent_tab="people", kwargs=dict(parent=self.window.tb, name="requests"))
pub.sendMessage("create_buffer", buffer_type="requestsBuffer", buffer_title=_("Pending requests"), parent_tab="requests", kwargs=dict(parent=self.window.tb, name="friend_requests", composefunc="render_person", session=self.session, count=1000)) pub.sendMessage("create_buffer", buffer_type="requestsBuffer", buffer_title=_("Pending requests"), parent_tab="requests", kwargs=dict(parent=self.window.tb, name="friend_requests", composefunc="render_person", session=self.session, count=1000))
pub.sendMessage("create_buffer", buffer_type="requestsBuffer", buffer_title=_("I follow"), parent_tab="requests", kwargs=dict(parent=self.window.tb, name="friend_requests_sent", composefunc="render_person", session=self.session, count=1000, out=1)) pub.sendMessage("create_buffer", buffer_type="requestsBuffer", buffer_title=_("I follow"), parent_tab="requests", kwargs=dict(parent=self.window.tb, name="friend_requests_sent", composefunc="render_person", session=self.session, count=1000, out=1))
@ -243,9 +244,12 @@ class Controller(object):
self.get_audio_albums(self.session.user_id, create_buffers=False) self.get_audio_albums(self.session.user_id, create_buffers=False)
self.get_video_albums(self.session.user_id, create_buffers=False) self.get_video_albums(self.session.user_id, create_buffers=False)
for i in self.buffers: for i in self.buffers:
if hasattr(i, "get_items"): # Online friends buffer should not be updated, as chat LongPoll server already gives status about offline and online friends.
if hasattr(i, "get_items") and i.name != "online_friends":
i.get_items() i.get_items()
log.debug("Updated %s" % (i.name)) log.debug("Updated %s" % (i.name))
else:
i.update_online()
def reorder_buffer(self, buffer): def reorder_buffer(self, buffer):
""" this puts the chat buffers at the top of the list when there are new incoming messages. """ this puts the chat buffers at the top of the list when there are new incoming messages.
@ -415,6 +419,17 @@ class Controller(object):
msg = _("{user1_nom} is online.").format(**user_name) msg = _("{user1_nom} is online.").format(**user_name)
sound = "friend_online.ogg" sound = "friend_online.ogg"
self.notify(msg, sound, self.session.settings["chat"]["notifications"]) self.notify(msg, sound, self.session.settings["chat"]["notifications"])
online_buffer = self.search("online_friends")
user = None
for i in self.session.db["friends_"]["items"]:
if i["id"] == event.user_id:
user = i
user["last_seen"]["time"] = time.time()
break
if user == None:
log.exception("Getting user manually...")
user = self.session.vk.client.users.get(user_ids=event.user_id, fields="last_seen")[0]
online_buffer.add_person(user)
def user_offline(self, event): def user_offline(self, event):
""" Sends a notification of an user logging off in VK. """ Sends a notification of an user logging off in VK.
@ -426,6 +441,8 @@ class Controller(object):
msg = _("{user1_nom} is offline.").format(**user_name) msg = _("{user1_nom} is offline.").format(**user_name)
sound = "friend_offline.ogg" sound = "friend_offline.ogg"
self.notify(msg, sound, self.session.settings["chat"]["notifications"]) self.notify(msg, sound, self.session.settings["chat"]["notifications"])
online_friends = self.search("online_friends")
online_friends.remove_person(event.user_id)
def notify(self, message="", sound="", type="native"): def notify(self, message="", sound="", type="native"):
""" display a notification in Socializer. """ display a notification in Socializer.
@ -603,7 +620,7 @@ class Controller(object):
params["adult"] = dlg.get_checkable("safe_search") params["adult"] = dlg.get_checkable("safe_search")
params["sort"] = dlg.get_sort_order() params["sort"] = dlg.get_sort_order()
# params["filters"] = "youtube, vimeo, short, long, mp4" # params["filters"] = "youtube, vimeo, short, long, mp4"
print(params) # print(params)
newbuff = buffers.videoBuffer(parent=self.window.tb, name="{0}_videosearch".format(params["q"],), session=self.session, composefunc="render_video", parent_endpoint="video", endpoint="search", **params) newbuff = buffers.videoBuffer(parent=self.window.tb, name="{0}_videosearch".format(params["q"],), session=self.session, composefunc="render_video", parent_endpoint="video", endpoint="search", **params)
self.buffers.append(newbuff) self.buffers.append(newbuff)
call_threaded(newbuff.get_items) call_threaded(newbuff.get_items)

View File

@ -84,12 +84,18 @@ def render_person(status, session):
Reference: https://vk.com/dev/fields""" Reference: https://vk.com/dev/fields"""
if "last_seen" in status: if "last_seen" in status:
original_date = arrow.get(status["last_seen"]["time"]) original_date = arrow.get(status["last_seen"]["time"])
now = arrow.now()
original_date.to(now.tzinfo)
diffdate = now-original_date
if diffdate.days == 0 and diffdate.seconds <= 360:
online_status = _("Online")
else:
# Translators: This is the date of last seen # Translators: This is the date of last seen
last_seen = _("{0}").format(original_date.humanize(locale=languageHandler.curLang[:2]),) online_status = _("Last seen {0}").format(original_date.humanize(locale=languageHandler.curLang[:2]),)
# Account suspended or deleted. # Account suspended or deleted.
elif ("last_seen" in status) == False and "deactivated" in status: elif ("last_seen" in status) == False and "deactivated" in status:
last_seen = _("Account deactivated") online_status = _("Account deactivated")
return ["{0} {1}".format(status["first_name"], status["last_name"]), last_seen] return ["{0} {1}".format(status["first_name"], status["last_name"]), online_status]
def render_newsfeed_item(status, session): def render_newsfeed_item(status, session):
""" This me☻thod is used to render an item of the news feed. """ This me☻thod is used to render an item of the news feed.

View File

@ -55,6 +55,11 @@ class vkSession(object):
@data list: A list with items and some information about cursors. @data list: A list with items and some information about cursors.
returns the number of items that has been added in this execution""" returns the number of items that has been added in this execution"""
global post_types global post_types
# When this method is called by friends.getOnlyne, it gives only friend IDS so we need to retrieve full objects from VK.
# ToDo: It would be nice to investigate whether reusing some existing objects would be a good idea, whenever possible.
if name == "online_friends":
newdata = self.vk.client.users.get(user_ids=",".join([str(z) for z in data]), fields="last_seen")
data = newdata
first_addition = False first_addition = False
num = 0 num = 0
if (name in self.db) == False: if (name in self.db) == False:
@ -62,7 +67,7 @@ class vkSession(object):
self.db[name]["items"] = [] self.db[name]["items"] = []
first_addition = True first_addition = True
for i in data: for i in data:
if "type" in i and (i["type"] == "wall_photo" or i["type"] == "photo_tag" or i["type"] == "photo"): if "type" in i and not isinstance(i["type"], int) and (i["type"] == "wall_photo" or i["type"] == "photo_tag" or i["type"] == "photo"):
log.debug("Skipping unsupported item... %r" % (i,)) log.debug("Skipping unsupported item... %r" % (i,))
continue continue
# for some reason, VK sends post data if the post has been deleted already. # for some reason, VK sends post data if the post has been deleted already.

View File

@ -26,6 +26,9 @@ def show_error_code(code):
def bad_authorisation(): def bad_authorisation():
return wx.MessageDialog(None, _("authorisation failed. Your configuration will be deleted. If you recently changed your password in VK, you need to reauthorize Socializer. The application will be restarted and prompt you again for your user and password. Press OK to continue."), _("Error"), style=wx.ICON_ERROR).ShowModal() return wx.MessageDialog(None, _("authorisation failed. Your configuration will be deleted. If you recently changed your password in VK, you need to reauthorize Socializer. The application will be restarted and prompt you again for your user and password. Press OK to continue."), _("Error"), style=wx.ICON_ERROR).ShowModal()
def connection_error():
return wx.MessageDialog(None, _("Socializer could not connect to VK due to a connection issue. Be sure you have a working internet connection. The application will be closed when you press the OK button. If your internet connection is working correctly, please try to open socializer in a few minutes. If this problem persists, contact the developers to receive further assistance."), _("Connection Error"), style=wx.ICON_ERROR).ShowModal()
def no_audio_albums(): def no_audio_albums():
return wx.MessageDialog(None, _("You do not have audio albums."), _("Error"), style=wx.ICON_ERROR).ShowModal() return wx.MessageDialog(None, _("You do not have audio albums."), _("Error"), style=wx.ICON_ERROR).ShowModal()