# Discordo Plus A fork of [discordo](https://github.com/ayn2op/discordo) — a lightweight Discord terminal client — with enhanced navigation, media support, and security hardening. ## Changes from upstream ### Media & Attachments - **Image viewer**: Opens image attachments (jpeg, png, webp, gif) in a configurable viewer (`mpv` by default) with X11 geometry auto-detection - **Save image**: `S` saves the selected message's image attachment to a configurable directory - **Link display compression**: URLs are shown as human-friendly labels — Discord CDN links show the filename, known sites show short labels (e.g., "Tenor GIF", "YouTube", "GitHub - owner/repo"), others show host + truncated path. Garbled CDN filenames (URL-encoded URLs, UUIDs) are cleaned up. Redundant link preview embeds are suppressed. Full URLs remain clickable via OSC 8 hyperlinks. ### Navigation & UI - **Arrow key navigation**: Up/down arrows move within a panel (same as k/j), left/right arrows cycle between guilds and messages panels. All four are separate configurable keybinds. - **ESC focus cycling**: ESC cycles focus between input → messages → guilds → input (respects hidden guilds panel) - **Auto-select**: Entering a channel always selects the latest message and focuses the messages list - **Search**: `/` opens fuzzy search over current channel messages - **Threads**: Thread indicator on messages, `T` navigates into thread - **Reactions**: Displayed below messages, bold for own reactions, real-time gateway updates. `e` opens emoji picker to add reactions (common unicode + guild custom emoji). `v` shows who reacted with each emoji in a popup. - **Reply collapse**: `Z` toggles collapsing reply quotes to a compact `> ` indicator - **Timestamp toggle**: `t` toggles timestamps on/off at runtime - **Wrap indentation**: Continuation lines of long messages get a 2-space indent for visual clarity - **User info**: `w` shows author info popup (username, join date, roles) - **Command mode**: `:` opens vim-style command input (`:q`, `:quit`, `:logout`) - **Help**: `?` toggles full help overlay, `E` edits config from help - **Picker browse mode**: ESC in overlay pickers enters browse mode (j/k/g/G navigate, `i` returns to input) ### State & Persistence - **Guild/channel state**: Expanded/collapsed state for guilds, categories, and forums persists between sessions - **Focus on channel select**: Selecting a channel always focuses messages list and selects the latest message ### Security - Path traversal prevention, HTTPS-only downloads with 100MB size limit, restrictive file permissions (0700/0600), image viewer validation via `exec.LookPath`, atomic state writes, direct `exec.Command` (no shell), environment token warning ## Building on Arch Linux ### Requirements ```bash sudo pacman -S go mpv xdotool wl-clipboard ``` - `go` — Go compiler (1.26+) - `mpv` — media player used as image viewer (supports jpeg/png/webp/gif with animation) - `xdotool` — used to detect terminal window geometry on X11 (optional, image viewer still works without it) - `wl-clipboard` — clipboard support on Wayland (skip if using X11) ### Build and install ```bash git clone https://gogs.altsol.dev/claude/discordo-plus.git cd discordo-plus # Option 1: Install via pacman (Arch Linux) makepkg -si # Option 2: Manual install go build -o discordo-plus . sudo install -Dm755 discordo-plus /usr/local/bin/discordo-plus ``` ### Run ```bash discordo-plus ``` On first launch, enter your Discord token or scan the QR code to log in. ## Configuration Config file location: `~/.config/discordo/config.toml` The default config is used if no file exists. See [the default config](./internal/config/config.toml) for all options. ### Image-related settings ```toml # External image viewer (must accept a file path as first argument) # When set to "mpv", auto-adds --geometry, --force-window, --loop-file flags # Set to "default" to use xdg-open image_viewer = "mpv" # Directory for saved images (supports ~/, empty = current directory) image_save_dir = "~/Pictures/discordo" [keybinds.messages_list] # Open attachments/links from selected message open = "o" # Save image attachment from selected message save_image = "S" ``` ### Notes - On X11, `xdotool` is used to detect terminal geometry so `mpv` opens at the same position and size as your terminal. Without `xdotool`, `mpv` opens at its default position. - On Wayland, `xdotool` doesn't work — use compositor window rules instead (e.g., sway: `for_window [app_id="mpv"] floating enable, move position center`) - Alternative viewers: `imv`, `nsxiv`, `feh` — set via `image_viewer` in config. Geometry detection only applies to `mpv`. ## Usage ### Token (UI, recommended) 1. Run the `discordo` executable with no arguments. 2. Enter your token and click on the "Login" button to save it. ### Token (environment variable) Set the value of the `DISCORDO_TOKEN` environment variable to the authentication token to log in with. > [!WARNING] > Environment variables are visible to all processes running as the same user (via `/proc/PID/environ` on Linux). Prefer the keyring for interactive use. Only use `DISCORDO_TOKEN` in controlled environments (e.g., systemd units with protected `EnvironmentFile=`). ```sh DISCORDO_TOKEN="your-token-here" discordo-plus ``` ### QR (UI) 1. Run the `discordo` executable with no arguments. 2. Click on the "Login with QR" button. 3. Follow the instructions in the QR Login screen. ## Configuration The configuration file allows you to configure and customize the behavior, keybindings, and theme of the application. - Unix: `$XDG_CONFIG_HOME/discordo/config.toml` or `$HOME/.config/discordo/config.toml` - Darwin: `$HOME/Library/Application Support/discordo/config.toml` - Windows: `%AppData%/discordo/config.toml` Discordo uses the default configuration if a configuration file is not found in the aforementioned path; however, the default configuration file is not written to the path. [The default configuration can be found here](./internal/config/config.toml). > [!IMPORTANT] > Automated user accounts or "self-bots" are against Discord's Terms of Service. I am not responsible for any loss caused by using "self-bots" or Discordo. ## License Copyright (C) 2025-present ayn2op This project is licensed under the GNU General Public License v3.0 (GPL-3.0). See the [LICENSE](./LICENSE) file for the full license text.