bookmarks: get rid of callbacks

This commit is contained in:
mathieui 2021-01-29 17:56:51 +01:00 committed by Link Mauve
parent f2aaba982b
commit 19b58d86f5
3 changed files with 91 additions and 57 deletions

View file

@ -30,9 +30,19 @@ Adding a remote bookmark:
import functools
import logging
from typing import Optional, List, Union
from typing import (
Callable,
List,
Optional,
Union,
)
from slixmpp import InvalidJID, JID
from slixmpp import (
InvalidJID,
JID,
ClientXMPP,
)
from slixmpp.exceptions import IqError, IqTimeout
from slixmpp.plugins.xep_0048 import Bookmarks, Conference, URL
from poezio.config import config
@ -213,17 +223,17 @@ class BookmarkList:
self.preferred = value
config.set_and_save('use_bookmarks_method', value)
def save_remote(self, xmpp, callback):
async def save_remote(self, xmpp: ClientXMPP):
"""Save the remote bookmarks."""
if not any(self.available_storage.values()):
return
method = 'xep_0049' if self.preferred == 'privatexml' else 'xep_0223'
if method:
xmpp.plugin['xep_0048'].set_bookmarks(
return await xmpp.plugin['xep_0048'].set_bookmarks(
stanza_storage(self.bookmarks),
method=method,
callback=callback)
)
def save_local(self):
"""Save the local bookmarks."""
@ -231,22 +241,24 @@ class BookmarkList:
if bookmark.method == 'local')
config.set_and_save('rooms', local)
def save(self, xmpp, core=None, callback=None):
async def save(self, xmpp: ClientXMPP, core=None):
"""Save all the bookmarks."""
self.save_local()
def _cb(iq):
if callback:
callback(iq)
if iq["type"] == "error" and core:
core.information('Could not save remote bookmarks.', 'Error')
elif core:
core.information('Bookmarks saved', 'Info')
if config.get('use_remote_bookmarks'):
self.save_remote(xmpp, _cb)
try:
result = await self.save_remote(xmpp)
if core is not None:
core.information('Bookmarks saved', 'Info')
return result
except (IqError, IqTimeout) as iq:
if core is not None:
core.information(
'Could not save remote bookmarks.',
'Error'
)
raise
async def get_pep(self, xmpp):
async def get_pep(self, xmpp: ClientXMPP):
"""Add the remotely stored bookmarks via pep to the list."""
iq = await xmpp.plugin['xep_0048'].get_bookmarks(method='xep_0223')
for conf in iq['pubsub']['items']['item']['bookmarks'][
@ -257,7 +269,7 @@ class BookmarkList:
self.append(bookm)
return iq
async def get_privatexml(self, xmpp):
async def get_privatexml(self, xmpp: ClientXMPP):
"""
Fetch the remote bookmarks stored via privatexml.
"""
@ -268,7 +280,7 @@ class BookmarkList:
self.append(bookm)
return iq
async def get_remote(self, xmpp, information):
async def get_remote(self, xmpp: ClientXMPP, information: Callable):
"""Add the remotely stored bookmarks to the list."""
if xmpp.anon or not any(self.available_storage.values()):
information('No remote bookmark storage available', 'Warning')

View file

@ -440,12 +440,14 @@ class CommandCore:
room, nick = self._parse_join_jid(args[0] if args else '')
password = args[1] if len(args) > 1 else None
self._add_bookmark(
room=room,
nick=nick,
autojoin=True,
password=password,
method='local',
asyncio.ensure_future(
self._add_bookmark(
room=room,
nick=nick,
autojoin=True,
password=password,
method='local',
)
)
@command_args_parser.quoted(0, 3)
@ -463,9 +465,11 @@ class CommandCore:
autojoin = (method == 'local' or
(len(args) > 1 and args[1].lower() == 'true'))
self._add_bookmark(room, nick, autojoin, password, method)
asyncio.ensure_future(
self._add_bookmark(room, nick, autojoin, password, method)
)
def _add_bookmark(
async def _add_bookmark(
self,
room: Optional[str],
nick: Optional[str],
@ -496,7 +500,7 @@ class CommandCore:
if password is None and tab.password is not None:
password = tab.password
elif room == '*':
return self._add_wildcard_bookmarks(method)
return await self._add_wildcard_bookmarks(method)
# Once we found which room to bookmark, find corresponding tab if it
# exists and fill nickname if none was specified and not default.
@ -528,10 +532,15 @@ class CommandCore:
bookmark.password = password
self.core.bookmarks.save_local()
self.core.bookmarks.save_remote(self.core.xmpp,
self.core.handler.on_bookmark_result)
try:
result = await self.core.bookmarks.save_remote(
self.core.xmpp,
)
self.core.handler.on_bookmark_result(result)
except (IqError, IqTimeout) as iq:
self.core.handler.on_bookmark_result(iq)
def _add_wildcard_bookmarks(self, method):
async def _add_wildcard_bookmarks(self, method):
new_bookmarks = []
for tab in self.core.get_tabs(tabs.MucTab):
bookmark = self.core.bookmarks[tab.jid.bare]
@ -545,8 +554,11 @@ class CommandCore:
new_bookmarks.extend(self.core.bookmarks.bookmarks)
self.core.bookmarks.set(new_bookmarks)
self.core.bookmarks.save_local()
self.core.bookmarks.save_remote(self.core.xmpp,
self.core.handler.on_bookmark_result)
try:
iq = await self.core.bookmarks.save_remote(self.core.xmpp)
self.core.handler.on_bookmark_result(iq)
except IqError as iq:
self.core.handler.on_bookmark_result(iq)
@command_args_parser.ignored
def bookmarks(self):
@ -563,27 +575,30 @@ class CommandCore:
@command_args_parser.quoted(0, 1)
def remove_bookmark(self, args):
"""/remove_bookmark [jid]"""
def cb(success):
if success:
self.core.information('Bookmark deleted', 'Info')
else:
self.core.information('Error while deleting the bookmark',
'Error')
jid = None
if not args:
tab = self.core.tabs.current_tab
if isinstance(tab, tabs.MucTab) and self.core.bookmarks[tab.jid.bare]:
self.core.bookmarks.remove(tab.jid.bare)
self.core.bookmarks.save(self.core.xmpp, callback=cb)
else:
self.core.information('No bookmark to remove', 'Info')
if isinstance(tab, tabs.MucTab):
jid = tab.jid.bare
else:
if self.core.bookmarks[args[0]]:
self.core.bookmarks.remove(args[0])
self.core.bookmarks.save(self.core.xmpp, callback=cb)
else:
self.core.information('No bookmark to remove', 'Info')
jid = args[0]
asyncio.ensure_future(
self._remove_bookmark_routine(jid)
)
async def _remove_bookmark_routine(self, jid: str):
"""Asynchronously remove a bookmark"""
if self.core.bookmarks[jid]:
self.core.bookmarks.remove(jid)
try:
await self.core.bookmarks.save(self.core.xmpp)
self.core.information('Bookmark deleted', 'Info')
except (IqError, IqTimeout):
self.core.information('Error while deleting the bookmark',
'Error')
else:
self.core.information('No bookmark to remove', 'Info')
@deny_anonymous
@command_args_parser.quoted(0, 1)

View file

@ -2,9 +2,12 @@
Defines the data-forms Tab
"""
import asyncio
import logging
from typing import Dict, Callable, List
from slixmpp.exceptions import IqError, IqTimeout
from poezio import windows
from poezio.bookmarks import Bookmark, BookmarkList
from poezio.core.structs import Command
@ -89,17 +92,21 @@ class BookmarksTab(Tab):
'Error')
return
for bm in self.removed_bookmarks:
if bm in self.bookmarks:
self.bookmarks.remove(bm)
def send_cb(success):
if success:
self.core.information('Bookmarks saved', 'Info')
else:
self.core.information('Remote bookmarks not saved.', 'Error')
asyncio.ensure_future(
self.save_routine()
)
self.bookmarks.save(self.core.xmpp, callback=send_cb)
async def save_routine(self):
try:
await self.bookmarks.save(self.core.xmpp)
self.core.information('Bookmarks saved', 'Info')
except (IqError, IqTimeout):
self.core.information('Remote bookmarks not saved.', 'Error')
self.core.close_tab(self)
return True