aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--slack/commands.py70
-rw-r--r--slack/slack_workspace.py5
2 files changed, 54 insertions, 21 deletions
diff --git a/slack/commands.py b/slack/commands.py
index f0bf941..60fd5d9 100644
--- a/slack/commands.py
+++ b/slack/commands.py
@@ -52,7 +52,10 @@ class Command:
def weechat_command(
- completion: str = "", min_args: int = 0, slack_buffer_required: bool = False
+ completion: str = "",
+ min_args: int = 0,
+ split_all_args: bool = False,
+ slack_buffer_required: bool = False,
) -> Callable[
[Callable[[str, List[str], Dict[str, Optional[str]]], None]],
Callable[[str, str], None],
@@ -66,7 +69,8 @@ def weechat_command(
@wraps(f)
def wrapper(buffer: str, args: str):
pos_args, options = parse_options(args)
- split_args = pos_args.split(" ", min_args)
+ maxsplit = -1 if split_all_args else 0 if min_args == 0 else min_args - 1
+ split_args = pos_args.split(" ", maxsplit)
if min_args and not pos_args or len(split_args) < min_args:
print_error(
f'Too few arguments for command "/{cmd}" (help on command: /help {cmd})'
@@ -112,37 +116,61 @@ def command_slack(buffer: str, args: List[str], options: Dict[str, Optional[str]
print("ran slack")
-@weechat_command("%(slack_workspaces)|-all")
+def workspace_connect(workspace: SlackWorkspace):
+ if workspace.is_connected:
+ print_error(f'already connected to workspace "{workspace.name}"!')
+ return
+ elif workspace.is_connecting:
+ print_error(f'already connecting to workspace "{workspace.name}"!')
+ return
+ run_async(workspace.connect())
+
+
+@weechat_command("%(slack_workspaces)|-all", split_all_args=True)
def command_slack_connect(
buffer: str, args: List[str], options: Dict[str, Optional[str]]
):
- async def connect():
- if args and args[0]:
- workspace = shared.workspaces.get(args[0])
- if workspace:
- await workspace.connect()
+ if options.get("all", False) is None:
+ for workspace in shared.workspaces.values():
+ run_async(workspace.connect())
+ elif args[0]:
+ for arg in args:
+ workspace = shared.workspaces.get(arg)
+ if workspace is None:
+ print_error(f'workspace "{arg}" not found')
else:
- print_error(f'workspace "{args[0]}" not found')
- elif options.get("all", False) is None:
- for workspace in shared.workspaces.values():
- await workspace.connect()
+ workspace_connect(workspace)
+ else:
+ conversation = get_conversation_from_buffer_pointer(buffer)
+ if conversation:
+ workspace_connect(conversation.workspace)
- run_async(connect())
+
+def workspace_disconnect(workspace: SlackWorkspace):
+ if not workspace.is_connected and not workspace.is_connecting:
+ print_error(f'not connected to workspace "{workspace.name}"!')
+ return
+ workspace.disconnect()
-@weechat_command("%(slack_workspaces)|-all")
+@weechat_command("%(slack_workspaces)|-all", split_all_args=True)
def command_slack_disconnect(
buffer: str, args: List[str], options: Dict[str, Optional[str]]
):
- if args and args[0]:
- workspace = shared.workspaces.get(args[0])
- if workspace:
- workspace.disconnect()
- else:
- print_error(f'workspace "{args[0]}" not found')
- elif options.get("all", False) is None:
+ if options.get("all", False) is None:
for workspace in shared.workspaces.values():
workspace.disconnect()
+ elif args[0]:
+ for arg in args:
+ workspace = shared.workspaces.get(arg)
+ if workspace is None:
+ print_error(f'workspace "{arg}" not found')
+ else:
+ workspace_disconnect(workspace)
+ else:
+ conversation = get_conversation_from_buffer_pointer(buffer)
+ if conversation:
+ workspace_disconnect(conversation.workspace)
@weechat_command()
diff --git a/slack/slack_workspace.py b/slack/slack_workspace.py
index bc31a27..57cd57c 100644
--- a/slack/slack_workspace.py
+++ b/slack/slack_workspace.py
@@ -175,6 +175,10 @@ class SlackWorkspace:
def is_connected(self):
return self._is_connected
+ @property
+ def is_connecting(self):
+ return self._connect_task is not None
+
@is_connected.setter
def is_connected(self, value: bool):
self._is_connected = value
@@ -183,6 +187,7 @@ class SlackWorkspace:
async def connect(self) -> None:
self._connect_task = create_task(self._connect())
await self._connect_task
+ self._connect_task = None
async def _connect(self) -> None:
rtm_connect = await self.api.fetch_rtm_connect()