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:
commit
406a10bf15
5 changed files with 105 additions and 91 deletions
|
@ -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):
|
||||
"""
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in a new issue