summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Buquet <pep@bouah.net>2020-05-10 00:30:56 +0200
committerMaxime Buquet <pep@bouah.net>2020-05-10 00:30:56 +0200
commit406a10bf15fe46400b658df6bbe7ce2942e6ee00 (patch)
tree10996f59972b2be47eae9ad4da257961c72f7429
parentf68fa1da5e2cccd396ee03eec12359ff905b7bc6 (diff)
parenta1c8efdfb2f28976aaa653e5fc1e695b943bb739 (diff)
downloadpoezio-406a10bf15fe46400b658df6bbe7ce2942e6ee00.tar.gz
poezio-406a10bf15fe46400b658df6bbe7ce2942e6ee00.tar.bz2
poezio-406a10bf15fe46400b658df6bbe7ce2942e6ee00.tar.xz
poezio-406a10bf15fe46400b658df6bbe7ce2942e6ee00.zip
Merge branch 'move-deny-remove-global-scope' into 'master'
Move /deny and /remove global scope See merge request poezio/poezio!93
-rw-r--r--poezio/core/commands.py59
-rw-r--r--poezio/core/completions.py13
-rw-r--r--poezio/core/core.py26
-rw-r--r--poezio/decorators.py12
-rw-r--r--poezio/tabs/rostertab.py86
5 files changed, 105 insertions, 91 deletions
diff --git a/poezio/core/commands.py b/poezio/core/commands.py
index b00cf24a..6bf1d338 100644
--- a/poezio/core/commands.py
+++ b/poezio/core/commands.py
@@ -17,11 +17,12 @@ from slixmpp.xmlstream.matcher import StanzaPath
from poezio import common
from poezio import pep
from poezio import tabs
+from poezio import multiuserchat as muc
from poezio.bookmarks import Bookmark
from poezio.common import safeJID
from poezio.config import config, DEFAULT_CONFIG, options as config_opts
-from poezio import multiuserchat as muc
from poezio.contact import Contact, Resource
+from poezio.decorators import deny_anonymous
from poezio.plugin import PluginConfig
from poezio.roster import roster
from poezio.theming import dump_tuple, get_theme
@@ -517,8 +518,9 @@ class CommandCore:
else:
self.core.information('No bookmark to remove', 'Info')
+ @deny_anonymous
@command_args_parser.quoted(0, 1)
- def command_accept(self, args):
+ def accept(self, args):
"""
Accept a JID. Authorize it AND subscribe to it
"""
@@ -553,8 +555,9 @@ class CommandCore:
pto=jid, ptype='subscribe', pnick=self.core.own_nick)
self.core.information('%s is now authorized' % jid, 'Roster')
+ @deny_anonymous
@command_args_parser.quoted(1)
- def command_add(self, args):
+ def add(self, args):
"""
Add the specified JID to the roster, and automatically
accept the reverse subscription
@@ -582,6 +585,56 @@ class CommandCore:
roster.modified()
self.core.information('%s was added to the roster' % jid, 'Roster')
+ @deny_anonymous
+ @command_args_parser.quoted(0, 1)
+ def deny(self, args):
+ """
+ /deny [jid]
+ Denies a JID from our roster
+ """
+ jid = None
+ if not args:
+ tab = self.core.tabs.current_tab
+ if isinstance(tab, tabs.RosterInfoTab):
+ item = tab.roster_win.selected_row
+ if isinstance(item, Contact):
+ jid = item.bare_jid
+ else:
+ jid = safeJID(args[0]).bare
+ if jid not in [jid for jid in roster.jids()]:
+ jid = None
+ if jid is None:
+ self.core.information('No subscription to deny', 'Warning')
+ return
+
+ contact = roster[jid]
+ if contact:
+ contact.unauthorize()
+ self.core.information('Subscription to %s was revoked' % jid,
+ 'Roster')
+
+ @deny_anonymous
+ @command_args_parser.quoted(0, 1)
+ def remove(self, args):
+ """
+ Remove the specified JID from the roster. i.e.: unsubscribe
+ from its presence, and cancel its subscription to our.
+ """
+ jid = None
+ if args:
+ jid = safeJID(args[0]).bare
+ else:
+ tab = self.core.tabs.current_tab
+ if isinstance(tab, tabs.RosterInfoTab):
+ item = tab.roster_win.selected_row
+ if isinstance(item, Contact):
+ jid = item.bare_jid
+ if jid is None:
+ self.core.information('No roster item to remove', 'Error')
+ return
+ roster.remove(jid)
+ del roster[jid]
+
@command_args_parser.ignored
def command_reconnect(self):
"""
diff --git a/poezio/core/completions.py b/poezio/core/completions.py
index ee3e95bf..ada8d2b9 100644
--- a/poezio/core/completions.py
+++ b/poezio/core/completions.py
@@ -44,6 +44,19 @@ class CompletionCore:
' ',
quotify=False)
+ def roster_barejids(self, the_input):
+ """Complete roster bare jids"""
+ jids = sorted(
+ str(contact.bare_jid) for contact in roster.contacts.values()
+ if contact.pending_in
+ )
+ return Completion(the_input.new_completion, jids, 1, '', quotify=False)
+
+ def remove(self, the_input):
+ """Completion for /remove"""
+ jids = [jid for jid in roster.jids()]
+ return Completion(the_input.auto_completion, jids, '', quotify=False)
+
def presence(self, the_input):
"""
Completion of /presence
diff --git a/poezio/core/core.py b/poezio/core/core.py
index 8f25d551..06d56062 100644
--- a/poezio/core/core.py
+++ b/poezio/core/core.py
@@ -1770,20 +1770,40 @@ class Core:
completion=self.completion.bookmark)
self.register_command(
'accept',
- self.command.command_accept,
+ self.command.accept,
usage='[jid]',
desc='Allow the provided JID (or the selected contact '
'in your roster), to see your presence.',
- shortdesc='Allow a user your presence.',)
+ shortdesc='Allow a user your presence.',
+ completion=self.completion.roster_barejids)
self.register_command(
'add',
- self.command.command_add,
+ self.command.add,
usage='<jid>',
desc='Add the specified JID to your roster, ask them to'
' allow you to see his presence, and allow them to'
' see your presence.',
shortdesc='Add a user to your roster.')
self.register_command(
+ 'deny',
+ self.command.deny,
+ usage='[jid]',
+ desc='Deny your presence to the provided JID (or the '
+ 'selected contact in your roster), who is asking'
+ 'you to be in their roster.',
+ shortdesc='Deny a user your presence.',
+ completion=self.completion.roster_barejids)
+ self.register_command(
+ 'remove',
+ self.command.remove,
+ usage='[jid]',
+ desc='Remove the specified JID from your roster. This '
+ 'will unsubscribe you from its presence, cancel '
+ 'its subscription to yours, and remove the item '
+ 'from your roster.',
+ shortdesc='Remove a user from your roster.',
+ completion=self.completion.remove)
+ self.register_command(
'reconnect',
self.command.command_reconnect,
usage="[reconnect]",
diff --git a/poezio/decorators.py b/poezio/decorators.py
index 4b5d0320..51abf32c 100644
--- a/poezio/decorators.py
+++ b/poezio/decorators.py
@@ -162,3 +162,15 @@ class CommandArgParser:
command_args_parser = CommandArgParser()
+
+
+def deny_anonymous(func: Callable) -> Callable:
+ """Decorator to disable commands when using an anonymous account."""
+ def wrap(self: 'RosterInfoTab', *args, **kwargs):
+ if self.core.xmpp.anon:
+ return self.core.information(
+ 'This command is not available for anonymous accounts.',
+ 'Info'
+ )
+ return func(self, *args, **kwargs)
+ return wrap
diff --git a/poezio/tabs/rostertab.py b/poezio/tabs/rostertab.py
index 50b8c0d5..072e0776 100644
--- a/poezio/tabs/rostertab.py
+++ b/poezio/tabs/rostertab.py
@@ -24,7 +24,7 @@ from poezio.contact import Contact, Resource
from poezio.decorators import refresh_wrapper
from poezio.roster import RosterGroup, roster
from poezio.theming import get_theme, dump_tuple
-from poezio.decorators import command_args_parser
+from poezio.decorators import command_args_parser, deny_anonymous
from poezio.core.structs import Command, Completion
from poezio.tabs import Tab
from poezio.ui.types import InfoMessage
@@ -32,17 +32,6 @@ from poezio.ui.types import InfoMessage
log = logging.getLogger(__name__)
-def deny_anonymous(func: Callable) -> Callable:
- def wrap(self: 'RosterInfoTab', *args, **kwargs):
- if self.core.xmpp.anon:
- return self.core.information(
- 'This command is not available for anonymous accounts.',
- 'Info'
- )
- return func(self, *args, **kwargs)
- return wrap
-
-
class RosterInfoTab(Tab):
"""
A tab, split in two, containing the roster and infos
@@ -84,15 +73,6 @@ class RosterInfoTab(Tab):
self.key_func["S"] = self.start_search_slow
self.key_func["n"] = self.change_contact_name
self.register_command(
- 'deny',
- self.command_deny,
- usage='[jid]',
- desc='Deny your presence to the provided JID (or the '
- 'selected contact in your roster), who is asking'
- 'you to be in their roster.',
- shortdesc='Deny a user your presence.',
- completion=self.completion_deny)
- self.register_command(
'name',
self.command_name,
usage='<jid> [name]',
@@ -120,16 +100,6 @@ class RosterInfoTab(Tab):
shortdesc='Remove a user from a group.',
completion=self.completion_groupremove)
self.register_command(
- 'remove',
- self.command_remove,
- usage='[jid]',
- desc='Remove the specified JID from your roster. This '
- 'will unsubscribe you from its presence, cancel '
- 'its subscription to yours, and remove the item '
- 'from your roster.',
- shortdesc='Remove a user from your roster.',
- completion=self.completion_remove)
- self.register_command(
'export',
self.command_export,
usage='[/path/to/file]',
@@ -570,31 +540,6 @@ class RosterInfoTab(Tab):
self.core.xmpp.plugin['xep_0077'].change_password(
args[0], callback=callback)
- @deny_anonymous
- @command_args_parser.quoted(0, 1)
- def command_deny(self, args):
- """
- /deny [jid]
- Denies a JID from our roster
- """
- if not args:
- item = self.roster_win.selected_row
- if isinstance(item, Contact):
- jid = item.bare_jid
- else:
- self.core.information('No subscription to deny', 'Warning')
- return
- else:
- jid = safeJID(args[0]).bare
- if jid not in [jid for jid in roster.jids()]:
- self.core.information('No subscription to deny', 'Warning')
- return
-
- contact = roster[jid]
- if contact:
- contact.unauthorize()
- self.core.information('Subscription to %s was revoked' % jid,
- 'Roster')
@deny_anonymous
@command_args_parser.quoted(1, 1)
@@ -792,25 +737,6 @@ class RosterInfoTab(Tab):
@deny_anonymous
@command_args_parser.quoted(0, 1)
- def command_remove(self, args):
- """
- Remove the specified JID from the roster. i.e.: unsubscribe
- from its presence, and cancel its subscription to our.
- """
- if args:
- jid = safeJID(args[0]).bare
- else:
- item = self.roster_win.selected_row
- if isinstance(item, Contact):
- jid = item.bare_jid
- else:
- self.core.information('No roster item to remove', 'Error')
- return
- roster.remove(jid)
- del roster[jid]
-
- @deny_anonymous
- @command_args_parser.quoted(0, 1)
def command_import(self, args):
"""
Import the contacts
@@ -933,16 +859,6 @@ class RosterInfoTab(Tab):
the_input.new_completion, groups, n, '', quotify=True)
return False
- def completion_deny(self, the_input):
- """
- Complete the first argument from the list of the
- contact with ask=='subscribe'
- """
- jids = sorted(
- str(contact.bare_jid) for contact in roster.contacts.values()
- if contact.pending_in)
- return Completion(the_input.new_completion, jids, 1, '', quotify=False)
-
def refresh(self):
if self.need_resize:
self.resize()