Home

Awesome

Abaddon


Alternative Discord client made in C++ with GTK

<table> <tr> <td><img src="/.readme/s5.png"></td> <td><img src="/.readme/s6.png"></td> </tr> <tr> <td><img src="/.readme/s7.png"></td> <td><img src="/.readme/s8.png"></td> </tr> </table>

<a href="https://discord.gg/wkCU3vuzG5"><img src="https://discord.com/api/guilds/858156817711890443/widget.png?style=shield"></a>

Current features:

1 - Abaddon tries its best (though is not perfect) to make Discord think it's a legitimate web client. Some of the things done to do this include: using a browser user agent, sending the same IDENTIFY message that the official web client does, using API v9 endpoints in all cases, and not using endpoints the web client does not normally use. There are still a few smaller inconsistencies, however. For example the web client sends lots of telemetry via the /science endpoint (uBlock origin stops this) as well as in the headers of all requests.<br>

See here for things you might want to avoid if you are worried about being caught in the spam filter.

2 - Unicode emojis are substituted manually as opposed to rendered by GTK on non-Windows platforms. This can be changed with the stock_emojis setting as shown at the bottom of this README. A CBDT-based font using Twemoji is provided to allow GTK to render emojis natively on Windows.

3 - There are some inconsistencies with thread state that might be encountered in some more uncommon cases, but they are the result of fundamental issues with Discord's thread implementation.

Building manually (recommended if not on Windows):

Windows (with MSYS2):

  1. Install following packages:
    • mingw-w64-x86_64-cmake
    • mingw-w64-x86_64-ninja
    • mingw-w64-x86_64-sqlite3
    • mingw-w64-x86_64-nlohmann-json
    • mingw-w64-x86_64-curl
    • mingw-w64-x86_64-zlib
    • mingw-w64-x86_64-gtkmm3
    • mingw-w64-x86_64-libhandy
    • mingw-w64-x86_64-opus
    • mingw-w64-x86_64-libsodium
    • mingw-w64-x86_64-spdlog
  2. git clone --recurse-submodules="subprojects" https://github.com/uowuo/abaddon && cd abaddon
  3. mkdir build && cd build
  4. cmake -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
  5. ninja
  6. Copy resources

Mac:

  1. git clone https://github.com/uowuo/abaddon --recurse-submodules="subprojects" && cd abaddon
  2. brew install gtkmm3 nlohmann-json libhandy opus libsodium spdlog adwaita-icon-theme
  3. mkdir build && cd build
  4. cmake ..
  5. make
  6. Copy resources

Linux:

  1. Install dependencies
    • On Ubuntu 22.04 (Jammy)/Debian 12 (bookworm) and newer:
      $ sudo apt install g++ cmake libgtkmm-3.0-dev libcurl4-gnutls-dev libsqlite3-dev libssl-dev nlohmann-json3-dev libhandy-1-dev libsecret-1-dev libopus-dev libsodium-dev libspdlog-dev
      
    • On Arch Linux
      $ sudo pacman -S gcc cmake gtkmm3 libcurl-gnutls lib32-sqlite lib32-openssl nlohmann-json libhandy opus libsodium spdlog
      
    • On Fedora Linux:
      $ sudo dnf install g++ cmake gtkmm3.0-devel libcurl-devel sqlite-devel openssl-devel json-devel libsecret-devel libhandy-devel opus-devel libsodium-devel spdlog-devel
      

      Note: On older versions of fedora you might need to install gtkmm30-devel instead of gtkmm3.0-devel. Use dnf search gtkmm3 to see available packages.

  2. git clone https://github.com/uowuo/abaddon --recurse-submodules="subprojects" && cd abaddon
  3. mkdir build && cd build
  4. cmake ..
  5. make
  6. Copy resources

FreeBSD:

  1. pkg install git cmake nlohmann-json spdlog gtkmm30 libhandy libsodium
  2. git clone https://github.com/uowuo/abaddon --recurse-submodules="subprojects" && cd abaddon
  3. mkdir build && cd build
  4. cmake ..
  5. make
  6. Copy resources

Downloads:

Latest release version: https://github.com/uowuo/abaddon/releases/latest

CI:

Warning: If you use Windows, make sure to start from the bin directory

Resources

The two folders within the res folder (res/res and res/css) are necessary. Windows also uses the fonts folder. You can put them directly next to the executable. On Linux, css and res can also be loaded from ~/.local/share/abaddon or /usr/share/abaddon

abaddon.ini will also be automatically used if located at ~/.config/abaddon/abaddon.ini and there is no abaddon.ini in the working directory

How do I get my token?

Follow these instructions.

The Spam Filter

Discord likes disabling accounts/forcing them to reset their passwords if they think the user is a spam bot or potentially had their account compromised. While the official client still often gets users caught in the spam filter, third party clients tend to upset the spam filter more often. If you get caught by it, you can usually appeal it and get it restored. Here are some things you might want to do with the official client instead if you are particularly afraid of evoking the spam filter's wrath:

Dependencies:

TODO:

Styling

<details> <summary>Show all styles</summary>

CSS selectors

SelectorDescription
.app-windowApplied to all windows. This means the main window and all popups
.app-popupAdditional class for .app-windows when the window is not the main window
.channel-listContainer of the channel list
.messagesContainer of user messages
.message-containerThe container which holds a user's messages
.message-container-authorThe author label for a message container
.message-container-timestampThe timestamp label for a message container
.message-container-avatarAvatar for a user in a message
.message-container-extraLabel containing BOT/Webhook
.message-textThe text of a user message
.pendingExtra class of .message-text for messages pending to be sent
.failedExtra class of .message-text for messages that failed to be sent
.message-attachment-boxContains attachment info
.message-replyContainer for the replied-to message in a reply (these elements will also have .message-text set)
.message-inputApplied to the chat input container
.replyingExtra class for chat input container when a reply is currently being created
.reaction-boxContains a reaction image and the count
.reactedAdditional class for reaction-box when the user has reacted with a particular reaction
.reaction-countContains the count for reaction
.completerContainer for the message completer
.completer-entryContainer for a single entry in the completer
.completer-entry-labelContains the label for an entry in the completer
.completer-entry-imageContains the image for an entry in the completer
.embedContainer for a message embed
.embed-authorThe author of an embed
.embed-titleThe title of an embed
.embed-descriptionThe description of an embed
.embed-field-titleThe title of an embed field
.embed-field-valueThe value of an embed field
.embed-footerThe footer of an embed
.member-listContainer of the member list
.typing-indicatorThe typing indicator (also used for replies)

Used in reorderable list implementation:

Selector
.drag-icon
.drag-hover-top
.drag-hover-bottom

Used in guild settings popup:

SelectorDescription
.guild-settings-windowContainer for list of members in the members pane
.guild-members-pane-list
.guild-members-pane-infoContainer for member info
.guild-roles-pane-listContainer for list of roles in the roles pane

Used in profile popup:

SelectorDescription
.mutual-friend-itemApplied to every item in the mutual friends list
.mutual-friend-item-nameName in mutual friend item
.mutual-friend-item-avatarAvatar in mutual friend item
.mutual-guild-itemApplied to every item in the mutual guilds list
.mutual-guild-item-nameName in mutual guild item
.mutual-guild-item-iconIcon in mutual guild item
.mutual-guild-item-nickUser nickname in mutual guild item
.profile-connectionApplied to every item in the user connections list
.profile-connection-labelLabel in profile connection item
.profile-connection-checkCheckmark in verified profile connection items
.profile-connectionsContainer for profile connections
.profile-notesContainer for notes in profile window
.profile-notes-labelLabel that says "NOTE"
.profile-notes-textActual note text
.profile-info-paneApplied to container for info section of profile popup
.profile-info-createdLabel for creation date of profile
.user-profile-window
.profile-main-containerInner container for profile
.profile-avatar
.profile-usernameUser's display name (username for backwards compatibility)
.profile-username-nondisplayUser's actual username
.profile-switcherButtons used to switch viewed section of profile
.profile-stackContainer for profile info that can be switched between
.profile-badgesContainer for badges
.profile-badge
</details>

Settings

Settings are configured (for now) by editing abaddon.ini. The format is similar to the standard Windows ini format except:

Warning: You should edit these while the client is closed, even though there's an option to reload while running.

This listing is organized by section. For example, memory_db would be set by adding memory_db = true under the line [discord]

<details> <summary>Show all settings</summary>

discord

SettingTypeDefaultDescription
gatewaystringoverride url for Discord gateway. must be json format and use zlib stream compression
api_basestringoverride base url for Discord API
memory_dbbooleanfalseif true, Discord data will be kept in memory as opposed to on disk
tokenstringDiscord token used to login, this can be set from the menu
prefetchbooleanfalseif true, new messages will cause the avatar and image attachments to be automatically downloaded
autoconnectbooleanfalseautoconnect to discord
keychainbooleantruestore token in system keychain (if compiled with support)

http

SettingTypeDefaultDescription
user_agentstringsets the user-agent to use in HTTP requests to the Discord API (not including media/images)
concurrentint20how many images can be concurrently retrieved

gui

SettingTypeDefaultDescription
member_list_discriminatorbooleantrueshow user discriminators in the member list
stock_emojisbooleantrueallow abaddon to substitute unicode emojis with images from emojis.bin, must be false to allow GTK to render emojis itself
custom_emojisbooleantruedownload and use custom Discord emojis
cssstringpath to the main CSS file
animationsbooleantrueuse animated images where available (e.g. server icons, emojis, avatars). false means static images will be used
animated_guild_hover_onlybooleantrueonly animate guild icons when the guild is being hovered over
owner_crownbooleantrueshow a crown next to the owner
unreadsbooleantrueshow unread indicators and mention badges
save_statebooleantruesave the state of the gui (active channels, tabs, expanded channels)
alt_menubooleanfalsekeep the menu hidden unless revealed with alt key
hide_to_traybooleanfalsehide abaddon to the system tray on window close
show_deleted_indicatorbooleantrueshow [deleted] indicator next to deleted messages instead of actually deleting the message
font_scaledoublescale font rendering. 1 is unchanged
image_embed_clamp_widthint400maximum width of image embeds
image_embed_clamp_heightint300maximum height of image embeds
classic_channelsbooleanfalseuse classic Discord-style interface for server/channel listing
classic_change_guild_on_openbooleantruechange displayed guild when selecting a channel (classic channel list)

style

SettingTypeDescription
expandercolorstringcolor to use for the expander in the channel list
nsfwchannelcolorstringcolor to use for NSFW channels in the channel list
mentionbadgecolorstringbackground color for mention badges
mentionbadgetextcolorstringcolor to use for number displayed on mention badges
unreadcolorstringcolor to use for the unread indicator

notifications

SettingTypeDefaultDescription
enabledbooleantrue (if not on Windows)Enable desktop notifications
playsoundbooleantrueEnable notification sounds. Requires ENABLE_NOTIFICATION_SOUNDS=TRUE in CMake

voice

SettingTypeDefaultDescription
vadstringrnnoise if enabled, gate otherwiseMethod used for voice activity detection. Changeable in UI
backendsstringemptyChange backend priority when initializing miniaudio: wasapi;dsound;winmm;coreaudio;sndio;audio4;oss;pulseaudio;alsa;jack

windows

SettingTypeDefaultDescription
hideconsolebooleanfalseHide console on startup

Environment variables

variableDescription
ABADDON_NO_FC(Windows only) don't use custom font config
ABADDON_CONFIGchange path of configuration file to use. relative to cwd or can be absolute
</details>