shellwhisper-cli 1.0.1__tar.gz → 1.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- shellwhisper_cli-1.0.3/LICENSE +19 -0
- {shellwhisper_cli-1.0.1 → shellwhisper_cli-1.0.3}/PKG-INFO +3 -1
- {shellwhisper_cli-1.0.1 → shellwhisper_cli-1.0.3}/pyproject.toml +5 -2
- {shellwhisper_cli-1.0.1/src → shellwhisper_cli-1.0.3}/shellwhisper_cli.egg-info/PKG-INFO +3 -1
- shellwhisper_cli-1.0.3/shellwhisper_cli.egg-info/SOURCES.txt +11 -0
- shellwhisper_cli-1.0.3/shellwhisper_cli.egg-info/top_level.txt +1 -0
- shellwhisper_cli-1.0.1/src/components/sidebar.py +0 -90
- shellwhisper_cli-1.0.1/src/screens/chat_screen.py +0 -661
- shellwhisper_cli-1.0.1/src/screens/forgot_password.py +0 -79
- shellwhisper_cli-1.0.1/src/screens/join_screen.py +0 -23
- shellwhisper_cli-1.0.1/src/screens/login.py +0 -104
- shellwhisper_cli-1.0.1/src/screens/private_whisper_screen.py +0 -26
- shellwhisper_cli-1.0.1/src/screens/room_action_screen.py +0 -35
- shellwhisper_cli-1.0.1/src/screens/security_screen.py +0 -45
- shellwhisper_cli-1.0.1/src/shellwhisper_cli.egg-info/SOURCES.txt +0 -19
- shellwhisper_cli-1.0.1/src/shellwhisper_cli.egg-info/top_level.txt +0 -7
- shellwhisper_cli-1.0.1/src/utils/api_client.py +0 -133
- {shellwhisper_cli-1.0.1 → shellwhisper_cli-1.0.3}/README.md +0 -0
- {shellwhisper_cli-1.0.1 → shellwhisper_cli-1.0.3}/setup.cfg +0 -0
- {shellwhisper_cli-1.0.1/src → shellwhisper_cli-1.0.3}/shellwhisper_cli.egg-info/dependency_links.txt +0 -0
- {shellwhisper_cli-1.0.1/src → shellwhisper_cli-1.0.3}/shellwhisper_cli.egg-info/entry_points.txt +0 -0
- {shellwhisper_cli-1.0.1/src → shellwhisper_cli-1.0.3}/shellwhisper_cli.egg-info/requires.txt +0 -0
- {shellwhisper_cli-1.0.1 → shellwhisper_cli-1.0.3}/src/app.py +0 -0
- {shellwhisper_cli-1.0.1 → shellwhisper_cli-1.0.3}/src/events.py +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
📜 The ShellWhisper Public License (SWPL)
|
|
2
|
+
Version 1.0, May 2026
|
|
3
|
+
|
|
4
|
+
Copyright (c) 2026 Souvik Chatterjee (codassassin)
|
|
5
|
+
|
|
6
|
+
1. Purpose
|
|
7
|
+
The ShellWhisper Public License is designed to foster a community of terminal-centric developers while ensuring the core architectural integrity of the ShellWhisper (SW) messaging ecosystem remains open and credited.
|
|
8
|
+
|
|
9
|
+
2. Grant of Rights
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including the rights to use, copy, modify, merge, publish, and distribute copies of the Software, provided that the original author is credited as the primary architect.
|
|
11
|
+
|
|
12
|
+
3. Architectural Integrity
|
|
13
|
+
Any derivative works or forks of this Software that utilize the Deterministic Room ID Strategy (alphabetical sorting of member usernames for private room creation) or the TUI-first (Terminal User Interface) methodology must include a prominent reference to the original ShellWhisper project in their documentation.
|
|
14
|
+
|
|
15
|
+
4. Professional Usage
|
|
16
|
+
While this software was developed with the Fedora Workstation and Spring Boot/MongoDB stack in mind, it is licensed for cross-platform deployment. However, the use of this software within enterprise network automation environments must comply with standard security auditing practices as defined by the user's local jurisdiction.
|
|
17
|
+
|
|
18
|
+
5. Liability & Warranty
|
|
19
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND. THE AUTHOR SHALL NOT BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY ARISING FROM THE USE OF THE SOFTWARE OR ITS CAPABILITIES IN REAL-TIME MESSAGING ENVIRONMENTS.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: shellwhisper-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.3
|
|
4
4
|
Summary: A sleek terminal-based real-time chat client for ShellWhisper
|
|
5
5
|
License: MIT
|
|
6
6
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -9,9 +9,11 @@ Classifier: Operating System :: OS Independent
|
|
|
9
9
|
Classifier: Topic :: Communications :: Chat
|
|
10
10
|
Requires-Python: >=3.10
|
|
11
11
|
Description-Content-Type: text/markdown
|
|
12
|
+
License-File: LICENSE
|
|
12
13
|
Requires-Dist: textual>=0.50.0
|
|
13
14
|
Requires-Dist: requests>=2.31.0
|
|
14
15
|
Requires-Dist: websocket-client>=1.7.0
|
|
16
|
+
Dynamic: license-file
|
|
15
17
|
|
|
16
18
|
# ShellWhisper CLI
|
|
17
19
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "shellwhisper-cli"
|
|
7
|
-
version = "1.0.
|
|
7
|
+
version = "1.0.3"
|
|
8
8
|
description = "A sleek terminal-based real-time chat client for ShellWhisper"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -22,4 +22,7 @@ dependencies = [
|
|
|
22
22
|
]
|
|
23
23
|
|
|
24
24
|
[project.scripts]
|
|
25
|
-
shellwhisper = "src.app:main"
|
|
25
|
+
shellwhisper = "src.app:main"
|
|
26
|
+
|
|
27
|
+
[tool.setuptools]
|
|
28
|
+
packages = ["src"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: shellwhisper-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.3
|
|
4
4
|
Summary: A sleek terminal-based real-time chat client for ShellWhisper
|
|
5
5
|
License: MIT
|
|
6
6
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -9,9 +9,11 @@ Classifier: Operating System :: OS Independent
|
|
|
9
9
|
Classifier: Topic :: Communications :: Chat
|
|
10
10
|
Requires-Python: >=3.10
|
|
11
11
|
Description-Content-Type: text/markdown
|
|
12
|
+
License-File: LICENSE
|
|
12
13
|
Requires-Dist: textual>=0.50.0
|
|
13
14
|
Requires-Dist: requests>=2.31.0
|
|
14
15
|
Requires-Dist: websocket-client>=1.7.0
|
|
16
|
+
Dynamic: license-file
|
|
15
17
|
|
|
16
18
|
# ShellWhisper CLI
|
|
17
19
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
shellwhisper_cli.egg-info/PKG-INFO
|
|
5
|
+
shellwhisper_cli.egg-info/SOURCES.txt
|
|
6
|
+
shellwhisper_cli.egg-info/dependency_links.txt
|
|
7
|
+
shellwhisper_cli.egg-info/entry_points.txt
|
|
8
|
+
shellwhisper_cli.egg-info/requires.txt
|
|
9
|
+
shellwhisper_cli.egg-info/top_level.txt
|
|
10
|
+
src/app.py
|
|
11
|
+
src/events.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
src
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
from textual.widgets import Static, Label, Button, LoadingIndicator
|
|
2
|
-
from textual.containers import Vertical
|
|
3
|
-
from textual.app import ComposeResult
|
|
4
|
-
|
|
5
|
-
class Sidebar(Static):
|
|
6
|
-
def compose(self) -> ComposeResult:
|
|
7
|
-
yield Label("ShellWhisper", id="sidebar-title")
|
|
8
|
-
yield Static(classes='spacer')
|
|
9
|
-
|
|
10
|
-
yield Button("🌐 ROOM ACTIONS", id="btn_room_mgmt")
|
|
11
|
-
yield Button("✉️ PRIVATE WHISPER", id="btn_private")
|
|
12
|
-
|
|
13
|
-
yield Static(classes='spacer')
|
|
14
|
-
yield Label("MY ROOMS", id="section-label")
|
|
15
|
-
|
|
16
|
-
with Vertical(id="rooms-list"):
|
|
17
|
-
yield LoadingIndicator()
|
|
18
|
-
|
|
19
|
-
yield Static(classes='spacer')
|
|
20
|
-
yield Button("Logout", variant="error", id="logout_btn")
|
|
21
|
-
|
|
22
|
-
# async def update_rooms(self, rooms: list):
|
|
23
|
-
# rooms_list = self.query_one("#rooms-list")
|
|
24
|
-
# await rooms_list.query("*").remove()
|
|
25
|
-
|
|
26
|
-
# if not rooms:
|
|
27
|
-
# await rooms_list.mount(Label("No rooms yet...", classes="empty-msg"))
|
|
28
|
-
# else:
|
|
29
|
-
# current_user = self.app.current_user
|
|
30
|
-
|
|
31
|
-
# for room in rooms:
|
|
32
|
-
# display_name = room['roomName']
|
|
33
|
-
|
|
34
|
-
# if room.get("type") == "PRIVATE":
|
|
35
|
-
# clean_name = display_name.replace("private_", "")
|
|
36
|
-
|
|
37
|
-
# parts = clean_name.split("_")
|
|
38
|
-
|
|
39
|
-
# if len(parts) == 2:
|
|
40
|
-
# display_name = parts[1] if parts[0] == current_user else parts[0]
|
|
41
|
-
|
|
42
|
-
# btn_label = f"💬 {display_name}"
|
|
43
|
-
# else:
|
|
44
|
-
# btn_label = f"#{display_name}"
|
|
45
|
-
|
|
46
|
-
# btn = Button(
|
|
47
|
-
# # label=f"#{room['roomName']}",
|
|
48
|
-
# label=btn_label,
|
|
49
|
-
# id=f"room_{room['id']}",
|
|
50
|
-
# classes="room-link"
|
|
51
|
-
# )
|
|
52
|
-
# await rooms_list.mount(btn)
|
|
53
|
-
|
|
54
|
-
async def update_rooms(self, rooms: list):
|
|
55
|
-
rooms_list = self.query_one("#rooms-list")
|
|
56
|
-
await rooms_list.query("*").remove()
|
|
57
|
-
|
|
58
|
-
if not rooms:
|
|
59
|
-
await rooms_list.mount(Label("No rooms yet...", classes="empty-msg"))
|
|
60
|
-
else:
|
|
61
|
-
current_user = self.app.current_user
|
|
62
|
-
|
|
63
|
-
for room in rooms:
|
|
64
|
-
room_name = room['roomName']
|
|
65
|
-
room_type = room.get("type", "GROUP")
|
|
66
|
-
|
|
67
|
-
if room_type == "PRIVATE":
|
|
68
|
-
raw = room_name
|
|
69
|
-
|
|
70
|
-
if raw.startswith("private_"):
|
|
71
|
-
raw = raw[len("private_"):]
|
|
72
|
-
|
|
73
|
-
other = raw
|
|
74
|
-
|
|
75
|
-
if raw.startswith(current_user + "_"):
|
|
76
|
-
other = raw[len(current_user) + 1:]
|
|
77
|
-
elif raw.endswith("_" + current_user):
|
|
78
|
-
other = raw[: -(len(current_user) + 1)]
|
|
79
|
-
|
|
80
|
-
btn_label = f"💬 {other}"
|
|
81
|
-
else:
|
|
82
|
-
btn_label = room_name
|
|
83
|
-
|
|
84
|
-
btn = Button(
|
|
85
|
-
label=btn_label,
|
|
86
|
-
id=f"room_{room['id']}",
|
|
87
|
-
classes="room-link"
|
|
88
|
-
)
|
|
89
|
-
|
|
90
|
-
await rooms_list.mount(btn)
|