Merge branch 'move-deny-remove-global-scope' into 'master'

Move /deny and /remove global scope

See merge request poezio/poezio!93
This commit is contained in:
Maxime Buquet 2020-05-10 00:30:56 +02:00
commit 406a10bf15
5 changed files with 105 additions and 91 deletions

View file

@ -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):
"""

View file

@ -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

View file

@ -1770,19 +1770,39 @@ 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,

View file

@ -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

View file

@ -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
@ -83,15 +72,6 @@ class RosterInfoTab(Tab):
self.key_func["s"] = self.start_search
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,
@ -119,16 +99,6 @@ class RosterInfoTab(Tab):
desc='Remove the given JID from the given group.',
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,
@ -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)
@ -790,25 +735,6 @@ class RosterInfoTab(Tab):
subscription=subscription,
callback=callback)
@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):
@ -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()