diff --git a/.gear/rules b/.gear/rules new file mode 100644 index 0000000..eedd5e3 --- /dev/null +++ b/.gear/rules @@ -0,0 +1,2 @@ +tar: v@version@:. +diff: v@version@:. . exclude=.gear exclude=*.spec diff --git a/.gear/tags/list b/.gear/tags/list new file mode 100644 index 0000000..3a9def2 --- /dev/null +++ b/.gear/tags/list @@ -0,0 +1 @@ +02baf04eaa3a5fd546fdf9e507ea515bad973cc3 v0.7.9 diff --git a/.gear/upstream/remotes b/.gear/upstream/remotes new file mode 100644 index 0000000..d86e54b --- /dev/null +++ b/.gear/upstream/remotes @@ -0,0 +1,3 @@ +[remote "upstream"] + url = https://github.com/trigg/Discover.git + fetch = +refs/heads/*:refs/remotes/upstream/* diff --git a/README.md b/README.md index ac59d35..49aa571 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,11 @@ This will close out any already running discover overlay for this user #### Close the overlay `discover-overlay --close` or `discover-overlay -x` -This closes the process running the overlay, hence any `--rpc` commands sent afterwards will do nothing +This closes the process running the overlay. Any control commands sent afterwards will do nothing + +#### Show version + +`discover-overlay --version` or `discover-overlay --V` #### Open configuration window `discover-overlay --configure` or `discover-overlay -c` @@ -38,40 +42,43 @@ This closes the process running the overlay, hence any `--rpc` commands sent aft This will redirect all debug to the file `~/.config/discover-overlay/output.txt` #### Hide the currently shown overlays -`discover-overlay --rpc --hide` +`discover-overlay --hide` -This will not stop the process running the overlay. This means the `--rpc` commands sent afterwards continue working as expected, and the `--show` is much quicker than starting the overlay from the start. +This will not stop the process running the overlay. This means the control commands sent afterwards continue working as expected, and the `--show` is much quicker than starting the overlay from the start. #### Show the overlays -`discover-overlay --rpc --show` +`discover-overlay --show` Note that if the process running the overlay has stopped or crashed then this will do nothing #### Mute yourself in voice chat -`discover-overlay --rpc --mute` +`discover-overlay --mute` #### Unmute yourself in voice chat -`discover-overlay --rpc --unmute` +`discover-overlay --unmute` #### Deafen yourself in voice chat -`discover-overlay --rpc --deaf` +`discover-overlay --deaf` #### Undeafen yourself in voice chat -`discover-overlay --rpc --undeaf` +`discover-overlay --undeaf` +### Attempt to leave the current voice channel + +`discover-overlay --leave` or `discover-overlay -l` #### Attempt to join voice channel by room ID -`discover-overlay --rpc --moveto=X` +`discover-overlay --moveto=X` Using a Room ID from Discord to replace `X`, this will attempt to join the voice channel. #### Populate the channel RPC file with a list of guilds -`discover-overlay --rpc --refresh-guilds` +`discover-overlay --refresh-guilds` Requests a list of guilds. Once collected, it will write them to `~/.config/discover-overlay/channels.rpc` as a JSON object #### Populate the channel RPC file with a list of channels from a guild -`discover-overlay --rpc --guild-request=X` +`discover-overlay --guild-request=X` Using a Server ID from Discord to replace `X`, this will request a list of channels (text & voice) from the given guild. Once collected, it will write them to `~/.config/discover-overlay/channels.rpc` as a JSON object. diff --git a/discover-overlay.spec b/discover-overlay.spec new file mode 100644 index 0000000..8eb2536 --- /dev/null +++ b/discover-overlay.spec @@ -0,0 +1,68 @@ +%define pypi_name discover_overlay + +Name: discover-overlay +Version: 0.7.9 +Release: alt1 +Summary: Yet another Discord overlay for Linux written in Python using GTK3 +License: GPL-3.0-only +Group: Networking/Other +URL: https://github.com/trigg/Discover +VCS: https://github.com/trigg/Discover +Source: %name-%version.tar +BuildRequires: rpm-build-python3 +BuildRequires: python3-module-pygobject3 +BuildRequires: python3-module-websocket-client +BuildRequires: python3-module-pyxdg +BuildRequires: python3-module-requests +BuildRequires: python3-module-pillow +BuildRequires: python3-module-xlib +BuildRequires: python3-module-setuptools +BuildRequires: python3-module-pulsectl-asyncio +BuildRequires: bash + +%description +Discover-Overlay is a GTK3 overlay written in Python3. +It can be configured to show who is currently talking on discord or +it can be set to display text and images from a preconfigured channel. +It is fully customisable and can be configured to display anywhere +on the screen. We fully support X11 and wlroots based environments. +We felt the need to make this project due to the shortcomings in support +on Linux by the official discord client. + +%package -n python3-module-%pypi_name +Summary: Moonraker - API Web Server for Klipper +BuildArch: noarch +Group: Development/Python3 + +%description -n python3-module-%pypi_name +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +%prep +%setup + +%build +export PDM_BUILD_SCM_VERSION=%version +%pyproject_build + +%install +%pyproject_install + +%files +%_bindir/discover-overlay +%_desktopdir/%{pypi_name}* +#%_iconsdir/* +/usr/share/icons/hicolor/256x256/apps/discover-overlay-default.png +/usr/share/icons/hicolor/256x256/apps/discover-overlay-tray.png +/usr/share/icons/hicolor/256x256/apps/discover-overlay.png +/usr/share/icons/hicolor/scalable/apps/discover-overlay-default.svg +/usr/share/icons/hicolor/scalable/apps/discover-overlay-tray.svg +/usr/share/icons/hicolor/scalable/apps/discover-overlay.svg + + +%files -n python3-module-%pypi_name +%python3_sitelibdir_noarch/%pypi_name +%python3_sitelibdir_noarch/%pypi_name-%version.dist-info + +%changelog +* Fri Feb 20 2026 Tesla Bittgenstein 0.7.9-alt1 +- Initial build. diff --git a/discover-overlay.spec~ b/discover-overlay.spec~ new file mode 100644 index 0000000..1b59cce --- /dev/null +++ b/discover-overlay.spec~ @@ -0,0 +1,61 @@ +%define pypi_name discover_overlay + +Name: discover-overlay +Version: 0.7.9 +Release: alt1 +Summary: Yet another Discord overlay for Linux written in Python using GTK3 +License: GPL-3.0-only +Group: Networking/Other +URL: https://github.com/trigg/Discover +VCS: https://github.com/trigg/Discover +Source: %name-%version.tar +BuildRequires: rpm-build-python3 +BuildRequires: python3-module-pygobject3 +BuildRequires: python3-module-websocket-client +BuildRequires: python3-module-pyxdg +BuildRequires: python3-module-requests +BuildRequires: python3-module-pillow +BuildRequires: python3-module-xlib +BuildRequires: python3-module-setuptools +BuildRequires: python3-module-pulsectl-asyncio +BuildRequires: bash + +%description +Discover-Overlay is a GTK3 overlay written in Python3. +It can be configured to show who is currently talking on discord or +it can be set to display text and images from a preconfigured channel. +It is fully customisable and can be configured to display anywhere +on the screen. We fully support X11 and wlroots based environments. +We felt the need to make this project due to the shortcomings in support +on Linux by the official discord client. + +%package -n python3-module-%pypi_name +Summary: Moonraker - API Web Server for Klipper +BuildArch: noarch +Group: Development/Python3 + +%description -n python3-module-%pypi_name +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +%prep +%setup + +%build +export PDM_BUILD_SCM_VERSION=%version +%pyproject_build + +%install +%pyproject_install + +%files +%_bindir/discover-overlay +%_desktopdir/%{pypi_name}* +#%_iconsdir/* + +%files -n python3-module-%pypi_name +%python3_sitelibdir_noarch/%pypi_name +%python3_sitelibdir_noarch/%pypi_name-%version.dist-info + +%changelog +* Fri Feb 20 2026 Tesla Bittgenstein 0.7.9-alt1 +- Initial build. diff --git a/discover_overlay/discord_connector.py b/discover_overlay/discord_connector.py index 89418d2..c13bc81 100644 --- a/discover_overlay/discord_connector.py +++ b/discover_overlay/discord_connector.py @@ -61,6 +61,8 @@ class DiscordConnector: self.text = [] self.authed = False self.last_rate_limit_send = 0 + self.muted = False + self.deafened = False self.socket_watch = None @@ -458,6 +460,8 @@ class DiscordConnector: elif j["cmd"] == "SELECT_VOICE_CHANNEL": return elif j["cmd"] == "SET_VOICE_SETTINGS": + self.muted = j['data']['mute'] + self.deafened = j['data']['deaf'] return elif j["cmd"] == "GET_VOICE_SETTINGS": return diff --git a/discover_overlay/discover_overlay.py b/discover_overlay/discover_overlay.py index f9e7269..4e75283 100755 --- a/discover_overlay/discover_overlay.py +++ b/discover_overlay/discover_overlay.py @@ -97,33 +97,6 @@ class Discover: """ Read in arg list from command or RPC and act accordingly """ - if "--help" in data or "-h" in data: - print(_("Usage") + ": discover-overlay [OPTIONS]... ") - print(_("Show an X11 or wlroots overlay with information")) - print(_("from Discord client")) - print("") - print(" -c, --configure ", _("Open configuration window")) - print(" -x, --close ", - _("Close currently running instance")) - print(" -v, --debug ", - _("Verbose output for aid in debugging")) - print(" -h, --help ", _("This screen")) - print(" --hide ", _("Hide overlay")) - print(" --show ", _("Show overlay")) - print(" --rpc ", - _("Send command, not start new instance.")) - print(" --mute ", _("Set own user to mute")) - print(" --unmute ", _("Set unmuted")) - print(" --deaf ", _("Set own user to deafened")) - print(" --undeaf ", _("Unset user deafened state")) - print(" --moveto=XX ", - _("Move the user into voice room, by Room ID")) - print(" --minimized ", - _("If tray icon is enabled, start with only tray icon and no configuration window")) - print("") - print(_("For gamescope compatibility ensure ENV has 'GDK_BACKEND=x11'")) - if normal_close: - sys.exit(0) if "--close" in data or "-x" in data: self.exit() if "--steamos" in data or "-s" in data: @@ -144,9 +117,18 @@ class Discover: if "--undeaf" in data: if self.connection: self.connection.set_deaf(False) + if "--toggle-mute" in data: + if self.connection: + self.connection.set_mute(not self.connection.muted) + if "--toggle-deaf" in data: + if self.connection: + self.connection.set_deaf(not self.connection.deafened) if "--refresh-guilds" in data: if self.connection: self.connection.req_guilds() + if "--leave" in data or "-l" in data: + if self.connection: + self.connection.change_voice_room(None) pattern = re.compile("--moveto=([0-9]+)") if any((match := pattern.match(x)) for x in data): if self.connection: @@ -479,6 +461,60 @@ class Discover: if deaf is not None: GLib.idle_add(self.connection.set_deaf, deaf) +def show_help(): + print(_("Usage") + ": discover-overlay [OPTIONS]... ") + print(_("Show an X11 or wlroots overlay with information")) + print(_("from Discord client")) + print("") + print(" -c, --configure ", _("Open configuration window")) + print(" -x, --close ", + _("Close currently running instance")) + print(" -v, --debug ", + _("Verbose output for aid in debugging")) + print(" -h, --help ", _("This screen")) + print(" -V, --version ", _("Show version information")) + print(" --hide ", _("Hide overlay")) + print(" --show ", _("Show overlay")) + print(" --mute ", _("Set own user to mute")) + print(" --unmute ", _("Set unmuted")) + print(" --toggle-mute ", _("Toggle muted")) + print(" --deaf ", _("Set own user to deafened")) + print(" --undeaf ", _("Unset user deafened state")) + print(" --toggle-deaf ", _("Toggle deaf")) + print(" --moveto=XX ", + _("Move the user into voice room, by Room ID")) + print(" --leave ", _("Leave the current voice channel")) + print(" --minimized ", + _("If tray icon is enabled, start with only tray icon and no configuration window")) + print("") + print(_("For gamescope compatibility ensure ENV has 'GDK_BACKEND=x11'")) + +def show_version(): + print(pkg_resources.get_distribution('discover_overlay').version) + +def is_a_controller(argv): + + actions = { + "-x", "--close", + "--hide", "--show", + "--mute", "--unmute", "--toggle-mute", + "--deaf", "--undeaf", "--toggle-deaf", + "-l", "--leave", + "--refresh-guilds", + } + controls = { + "--moveto=", + "--guild-request=", + } + for arg in argv: + # Match the actions (i.e --mute, --deafen) + if arg in actions: + return True + # Match the controls (i.e --moveto=123456789 and --guild-request=987654321) + for control in controls: + if arg.startswith(control): + return True + return False def entrypoint(): """ @@ -494,6 +530,12 @@ def entrypoint(): """ signal.signal(signal.SIGINT, signal.SIG_DFL) + if "--help" in sys.argv or "-h" in sys.argv: + show_help() + return + if "--version" in sys.argv or "-V" in sys.argv: + show_version() + return # Find Config directory config_dir = os.path.join(xdg_config_home, "discover_overlay") os.makedirs(config_dir, exist_ok=True) @@ -504,6 +546,17 @@ def entrypoint(): config_file = os.path.join(config_dir, "config.ini") debug_file = os.path.join(config_dir, "output.txt") + if "-c" in sys.argv or "--configure" in sys.argv: + _settings = MainSettingsWindow(config_file, rpc_file, channel_file, sys.argv[1:]) + Gtk.main() + return + + if is_a_controller(sys.argv): + line = " ".join(arg for arg in sys.argv[1:]).strip() + with open(rpc_file, "w", encoding="utf-8") as f: + f.write(line) + return + # Prepare logger logging.getLogger().setLevel(logging.INFO) log_format = "%(levelname)s - %(name)s - %(message)s" @@ -520,30 +573,14 @@ def entrypoint(): if 'GAMESCOPE_WAYLAND_DISPLAY' in os.environ: os.unsetenv("WAYLAND_DISPLAY") + # Catch any errors and log them try: - if "--rpc" in sys.argv: - # Send command to overlay - line = "" - for arg in sys.argv[1:]: - line = f"{line} {arg}" - with open(rpc_file, "w", encoding="utf-8") as tfile: - tfile.write(line) - log.warning("Sent RPC command") - else: - if "-c" in sys.argv or "--configure" in sys.argv: - # Show config window - _settings = MainSettingsWindow( - config_file, rpc_file, channel_file, sys.argv[1:]) - Gtk.main() - else: - # Tell any other running overlay to close - with open(rpc_file, "w", encoding="utf-8") as tfile: - tfile.write("--close") - # Show the overlay - Discover(rpc_file, config_file, channel_file, - debug_file, sys.argv[1:]) - return + with open(rpc_file, "w", encoding="utf-8") as tfile: + tfile.write("--close") + # Show the overlay + Discover(rpc_file, config_file, channel_file, + debug_file, sys.argv[1:]) except Exception as ex: # pylint: disable=broad-except log.error(ex) diff --git a/discover_overlay/locales/fr/LC_MESSAGES/default.mo b/discover_overlay/locales/fr/LC_MESSAGES/default.mo index c7697b5..4eadbd4 100644 Binary files a/discover_overlay/locales/fr/LC_MESSAGES/default.mo and b/discover_overlay/locales/fr/LC_MESSAGES/default.mo differ diff --git a/discover_overlay/locales/fr/LC_MESSAGES/default.po b/discover_overlay/locales/fr/LC_MESSAGES/default.po index 37cc391..3d8b3fe 100644 --- a/discover_overlay/locales/fr/LC_MESSAGES/default.po +++ b/discover_overlay/locales/fr/LC_MESSAGES/default.po @@ -1,10 +1,10 @@ -# Noé Lopez , 2023, 2024. +# Noé Lopez , 2023, 2024, 2025. msgid "" msgstr "" "Project-Id-Version: discover 0.7.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-05-01 20:54+0200\n" -"PO-Revision-Date: 2024-04-03 22:46+0200\n" +"PO-Revision-Date: 2025-05-01 21:05+0200\n" "Last-Translator: Noé Lopez \n" "Language-Team: Noé Lopez \n" "Language: fr_FR\n" @@ -112,19 +112,19 @@ msgid "Discover Overlay Configuration" msgstr "Configuration de Discover Overlay" msgid "Open Configuration" -msgstr "" +msgstr "Ouvrir la configuration" msgid "Hide Overlay" -msgstr "" +msgstr "Cacher l’overlay" msgid "Quit Overlay" -msgstr "" +msgstr "Quitter l’overlay" msgid "Quit Configuration" -msgstr "" +msgstr "Quitter la configuration" msgid "Show Overlay" -msgstr "" +msgstr "Montrer l’overlay" msgid "Place Window" msgstr "Choisir la position de la fenêtre" @@ -193,7 +193,7 @@ msgid "Close overlay" msgstr "Fermer l’overlay" msgid "About" -msgstr "" +msgstr "À propos" msgid "Display Horizontally" msgstr "Afficher horizontalement" diff --git a/discover_overlay/overlay.py b/discover_overlay/overlay.py index 1c15a08..58e2ac5 100644 --- a/discover_overlay/overlay.py +++ b/discover_overlay/overlay.py @@ -192,10 +192,6 @@ class OverlayWindow(Gtk.Window): if self.hide_on_mouseover: # We've mouse-overed if self.draw_blank: - self.set_untouchable() - context.set_source_rgba(0.0, 0.0, 0.0, 0.0) - context.set_operator(cairo.OPERATOR_SOURCE) - context.paint() return else: (width, height) = self.get_size() @@ -236,10 +232,6 @@ class OverlayWindow(Gtk.Window): if (self.floating != floating or self.pos_x != pos_x or self.pos_y != pos_y or self.width != width or self.height != height): - # Special case for Cinnamon desktop : see https://github.com/trigg/Discover/issues/322 - if ('XDG_SESSION_DESKTOP' in os.environ and - os.environ['XDG_SESSION_DESKTOP'] == 'cinnamon'): - floating = True self.floating = floating self.pos_x = pos_x @@ -487,15 +479,17 @@ class OverlayWindow(Gtk.Window): """Callback when mouseover occurs, hides overlay""" self.draw_blank = True self.set_needs_redraw() + self.hide() + GLib.timeout_add_seconds(self.timeout_mouse_over, self.mouseout_timed) return True def mouseout(self, _a=None, _b=None): """Callback when mouseout occurs, sets a timer to show overlay""" - GLib.timeout_add_seconds(self.timeout_mouse_over, self.mouseout_timed) return True def mouseout_timed(self, _a=None, _b=None): """Callback a short while after mouseout occured, shows overlay""" self.draw_blank = False + self.show() self.set_needs_redraw() return False diff --git a/discover_overlay/settings_window.py b/discover_overlay/settings_window.py index 0688685..640b7a6 100644 --- a/discover_overlay/settings_window.py +++ b/discover_overlay/settings_window.py @@ -325,11 +325,13 @@ class MainSettingsWindow(): self.channel_ids = [] g.remove_all() c.remove_all() - for guild in data['guild'].values(): + guilds = sorted(data['guild'].values(), key=lambda x: x['name'].lower()) + for guild in guilds: g.append_text(guild['name']) self.guild_ids.append(guild['id']) if guild['id'] == self.current_guild and 'channels' in guild: - for channel in guild['channels']: + channels = sorted(guild['channels'], key=lambda x: x['name'].lower()) + for channel in channels: c.append_text(channel['name']) self.channel_ids.append(channel['id']) except FileNotFoundError: @@ -732,9 +734,6 @@ class MainSettingsWindow(): self.widget['core_settings_min'].set_sensitive(self.show_sys_tray_icon) - if 'XDG_SESSION_DESKTOP' in os.environ and os.environ['XDG_SESSION_DESKTOP'] == 'cinnamon': - self.widget['voice_anchor_float'].set_sensitive(False) - self.widget['core_audio_assist'].set_active( config.getboolean("general", "audio_assist", fallback=False)) @@ -1000,8 +999,6 @@ class MainSettingsWindow(): def update_floating_anchor(self): floating = self.widget['voice_anchor_float'].get_active() == 0 - if 'XDG_SESSION_DESKTOP' in os.environ and os.environ['XDG_SESSION_DESKTOP'] == 'cinnamon': - floating = True if floating: self.widget['voice_align_1'].hide() diff --git a/discover_overlay/voice_overlay.py b/discover_overlay/voice_overlay.py index 4b00e79..b84e517 100644 --- a/discover_overlay/voice_overlay.py +++ b/discover_overlay/voice_overlay.py @@ -599,7 +599,7 @@ class VoiceOverlayWindow(OverlayWindow): current_y = 0 + self.vert_edge_padding offset_y = avatar_size + self.icon_spacing if self.align_right: # A lie. Align bottom - current_y = self.height - avatar_size - self.vert_edge_padding + current_y = (height - avatar_size) - self.vert_edge_padding offset_y = -(avatar_size + self.icon_spacing) rows_to_draw = [] while len(users_to_draw) > 0: diff --git a/setup.py b/setup.py index 5bf7a82..470e9fd 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ setup( name='discover-overlay', author='trigg', author_email='', - version='0.7.8', + version='0.7.9', description='Voice chat overlay', long_description=readme(), long_description_content_type='text/markdown',