From cdc4a303af3313541183686770e9911fcc2b8e8b Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Fri, 3 Nov 2023 01:07:03 -0400 Subject: fix build number fetch (again) i think we might need to fetch every script until we find the one with build number (i.e. the "main script" is no longer fixed in the html) --- src/startup.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/startup.cpp b/src/startup.cpp index 89e29a5..130ba9b 100644 --- a/src/startup.cpp +++ b/src/startup.cpp @@ -43,8 +43,8 @@ std::optional GetJavascriptFileFromAppPage(const Glib::ustring &c start_position += str.size(); } - if (matches.size() >= 6) { - return matches[matches.size() - 6]; + if (matches.size() >= 7) { + return matches[matches.size() - 7]; } return {}; -- cgit v1.2.3 From 61cd7016fa16dbcc4c66e51b2d1a81fbc0bf50fd Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Fri, 3 Nov 2023 01:59:59 -0400 Subject: update enums --- src/discord/auditlog.hpp | 28 +++++++++ src/discord/channel.hpp | 5 ++ src/discord/message.hpp | 22 +++++++ src/discord/objects.hpp | 7 +++ src/discord/permissions.hpp | 103 +++++++++++++++++-------------- src/discord/user.hpp | 3 + src/windows/guildsettings/emojispane.cpp | 6 +- src/windows/guildsettings/rolespane.cpp | 8 +-- 8 files changed, 130 insertions(+), 52 deletions(-) (limited to 'src') diff --git a/src/discord/auditlog.hpp b/src/discord/auditlog.hpp index 3a902d1..5921937 100644 --- a/src/discord/auditlog.hpp +++ b/src/discord/auditlog.hpp @@ -49,6 +49,34 @@ enum class AuditLogActionType { THREAD_CREATE = 110, THREAD_UPDATE = 111, THREAD_DELETE = 112, + + // Unhandled: + APPLICATION_COMMAND_PERMISSION_UPDATE = 121, + SOUNDBOARD_SOUND_CREATE = 130, + SOUNDBOARD_SOUND_UPDATE = 131, + SOUNDBOARD_SOUND_DELETE = 132, + AUTO_MODERATION_RULE_CREATE = 140, + AUTO_MODERATION_RULE_UPDATE = 141, + AUTO_MODERATION_RULE_DELETE = 142, + AUTO_MODERATION_BLOCK_MESSAGE = 143, + AUTO_MODERATION_FLAG_TO_CHANNEL = 144, + AUTO_MODERATION_USER_COMMUNICATION_DISABLED = 145, + AUTO_MODERATION_QUARANTINE_USER = 146, + CREATOR_MONETIZATION_REQUEST_CREATED = 150, + CREATOR_MONETIZATION_TERMS_ACCEPTED = 151, + ONBOARDING_PROMPT_CREATE = 163, + ONBOARDING_PROMPT_UPDATE = 164, + ONBOARDING_PROMPT_DELETE = 165, + ONBOARDING_CREATE = 166, + ONBOARDING_UPDATE = 167, + GUILD_HOME_FEATURE_ITEM = 171, + GUILD_HOME_REMOVE_ITEM = 172, + HARMFUL_LINKS_BLOCKED_MESSAGE = 180, + HOME_SETTINGS_CREATE = 190, + HOME_SETTINGS_UPDATE = 191, + VOICE_CHANNEL_STATUS_CREATE = 192, + VOICE_CHANNEL_STATUS_DELETE = 193, + CLYDE_AI_PROFILE_UPDATE = 194 }; struct AuditLogChange { diff --git a/src/discord/channel.hpp b/src/discord/channel.hpp index df944ec..cac8b4c 100644 --- a/src/discord/channel.hpp +++ b/src/discord/channel.hpp @@ -20,6 +20,11 @@ enum class ChannelType : int { GUILD_PUBLIC_THREAD = 11, GUILD_PRIVATE_THREAD = 12, GUILD_STAGE_VOICE = 13, + + // Unimplemented: + GUILD_DIRECTORY = 14, + GUILD_FORUM = 15, + GUILD_MEDIA = 16, }; enum class StagePrivacy { diff --git a/src/discord/message.hpp b/src/discord/message.hpp index 0f53021..b71c158 100644 --- a/src/discord/message.hpp +++ b/src/discord/message.hpp @@ -33,6 +33,28 @@ enum class MessageType { INLINE_REPLY = 19, // yep APPLICATION_COMMAND = 20, // yep THREAD_STARTER_MESSAGE = 21, // nope + GUILD_INVITE_REMINDER = 22, // nope + CONTEXT_MENU_COMMAND = 23, // nope + AUTO_MODERATION_ACTION = 24, // nope + ROLE_SUBSCRIPTION_PURCHASE = 25, // nope + INTERACTION_PREMIUM_UPSELL = 26, // nope + STAGE_START = 27, // nope + STAGE_END = 28, // nope + STAGE_SPEAKER = 29, // nope + STAGE_TOPIC = 31, // nope + GUILD_APPLICATION_PREMIUM_SUBSCRIPTION = 32, // nope + PRIVATE_CHANNEL_INTEGRATION_ADDED = 33, // nope + PRIVATE_CHANNEL_INTEGRATION_REMOVED = 34, // nope + PREMIUM_REFERRAL = 35, // nope + GUILD_INCIDENT_ALERT_MODE_ENABLED = 36, // nope + GUILD_INCIDENT_ALERT_MODE_DISABLED = 37, // nope + GUILD_INCIDENT_REPORT_RAID = 38, // nope + GUILD_INCIDENT_REPORT_FALSE_ALARM = 39, // nope + GUILD_DEADCHAT_REVIVE_PROMPT = 40, // nope + CUSTOM_GIFT = 41, // nope + GUILD_GAMING_STATS_PROMPT = 42, // nope + POLL = 43, // nope + PURCHASE_NOTIFICATION = 44, // nope }; enum class MessageFlags { diff --git a/src/discord/objects.hpp b/src/discord/objects.hpp index 305ac65..603a9c7 100644 --- a/src/discord/objects.hpp +++ b/src/discord/objects.hpp @@ -53,6 +53,13 @@ enum class GatewayOp : int { EmbeddedActivityClose = 26, EmbeddedActivityUpdate = 27, RequestForumUnreads = 28, + RemoteCommand = 29, + GetDeletedEntityIDsNotMatchingHash = 30, + RequestSoundboardSounds = 31, + SpeedTestCreate = 32, + SpeedTestDelete = 33, + RequestLastMessages = 34, + SearchRecentMembers = 35, }; enum class GatewayEvent : int { diff --git a/src/discord/permissions.hpp b/src/discord/permissions.hpp index d274dd9..82f52df 100644 --- a/src/discord/permissions.hpp +++ b/src/discord/permissions.hpp @@ -7,44 +7,57 @@ constexpr static uint64_t PERMISSION_MAX_BIT = 36; enum class Permission : uint64_t { NONE = 0, - CREATE_INSTANT_INVITE = (1ULL << 0), // Allows creation of instant invites - KICK_MEMBERS = (1ULL << 1), // Allows kicking members - BAN_MEMBERS = (1ULL << 2), // Allows banning members - ADMINISTRATOR = (1ULL << 3), // Allows all permissions and bypasses channel permission overwrites - MANAGE_CHANNELS = (1ULL << 4), // Allows management and editing of channels - MANAGE_GUILD = (1ULL << 5), // Allows management and editing of the guild - ADD_REACTIONS = (1ULL << 6), // Allows for the addition of reactions to messages - VIEW_AUDIT_LOG = (1ULL << 7), // Allows for viewing of audit logs - PRIORITY_SPEAKER = (1ULL << 8), // Allows for using priority speaker in a voice channel - STREAM = (1ULL << 9), // Allows the user to go live - VIEW_CHANNEL = (1ULL << 10), // Allows guild members to view a channel, which includes reading messages in text channels - SEND_MESSAGES = (1ULL << 11), // Allows for sending messages in a channel - SEND_TTS_MESSAGES = (1ULL << 12), // Allows for sending of /tts messages - MANAGE_MESSAGES = (1ULL << 13), // Allows for deletion of other users messages - EMBED_LINKS = (1ULL << 14), // Links sent by users with this permission will be auto-embedded - ATTACH_FILES = (1ULL << 15), // Allows for uploading images and files - READ_MESSAGE_HISTORY = (1ULL << 16), // Allows for reading of message history - MENTION_EVERYONE = (1ULL << 17), // Allows for using the @everyone tag to notify all users in a channel, and the @here tag to notify all online users in a channel - USE_EXTERNAL_EMOJIS = (1ULL << 18), // Allows the usage of custom emojis from other servers - VIEW_GUILD_INSIGHTS = (1ULL << 19), // Allows for viewing guild insights - CONNECT = (1ULL << 20), // Allows for joining of a voice channel - SPEAK = (1ULL << 21), // Allows for speaking in a voice channel - MUTE_MEMBERS = (1ULL << 22), // Allows for muting members in a voice channel - DEAFEN_MEMBERS = (1ULL << 23), // Allows for deafening of members in a voice channel - MOVE_MEMBERS = (1ULL << 24), // Allows for moving of members between voice channels - USE_VAD = (1ULL << 25), // Allows for using voice-activity-detection in a voice channel - CHANGE_NICKNAME = (1ULL << 26), // Allows for modification of own nickname - MANAGE_NICKNAMES = (1ULL << 27), // Allows for modification of other users nicknames - MANAGE_ROLES = (1ULL << 28), // Allows management and editing of roles - MANAGE_WEBHOOKS = (1ULL << 29), // Allows management and editing of webhooks - MANAGE_EMOJIS = (1ULL << 30), // Allows management and editing of emojis - USE_SLASH_COMMANDS = (1ULL << 31), // Allows members to use slash commands in text channels - REQUEST_TO_SPEAK = (1ULL << 32), // Allows for requesting to speak in stage channels - MANAGE_THREADS = (1ULL << 34), // Allows for deleting and archiving threads, and viewing all private threads - USE_PUBLIC_THREADS = (1ULL << 35), // Allows for creating and participating in threads - USE_PRIVATE_THREADS = (1ULL << 36), // Allows for creating and participating in private threads + CREATE_INSTANT_INVITE = (1ULL << 0), // Allows creation of instant invites + KICK_MEMBERS = (1ULL << 1), // Allows kicking members + BAN_MEMBERS = (1ULL << 2), // Allows banning members + ADMINISTRATOR = (1ULL << 3), // Allows all permissions and bypasses channel permission overwrites + MANAGE_CHANNELS = (1ULL << 4), // Allows management and editing of channels + MANAGE_GUILD = (1ULL << 5), // Allows management and editing of the guild + ADD_REACTIONS = (1ULL << 6), // Allows for the addition of reactions to messages + VIEW_AUDIT_LOG = (1ULL << 7), // Allows for viewing of audit logs + PRIORITY_SPEAKER = (1ULL << 8), // Allows for using priority speaker in a voice channel + STREAM = (1ULL << 9), // Allows the user to go live + VIEW_CHANNEL = (1ULL << 10), // Allows guild members to view a channel, which includes reading messages in text channels + SEND_MESSAGES = (1ULL << 11), // Allows for sending messages in a channel + SEND_TTS_MESSAGES = (1ULL << 12), // Allows for sending of /tts messages + MANAGE_MESSAGES = (1ULL << 13), // Allows for deletion of other users messages + EMBED_LINKS = (1ULL << 14), // Links sent by users with this permission will be auto-embedded + ATTACH_FILES = (1ULL << 15), // Allows for uploading images and files + READ_MESSAGE_HISTORY = (1ULL << 16), // Allows for reading of message history + MENTION_EVERYONE = (1ULL << 17), // Allows for using the @everyone tag to notify all users in a channel, and the @here tag to notify all online users in a channel + USE_EXTERNAL_EMOJIS = (1ULL << 18), // Allows the usage of custom emojis from other servers + VIEW_GUILD_INSIGHTS = (1ULL << 19), // Allows for viewing guild insights + CONNECT = (1ULL << 20), // Allows for joining of a voice channel + SPEAK = (1ULL << 21), // Allows for speaking in a voice channel + MUTE_MEMBERS = (1ULL << 22), // Allows for muting members in a voice channel + DEAFEN_MEMBERS = (1ULL << 23), // Allows for deafening of members in a voice channel + MOVE_MEMBERS = (1ULL << 24), // Allows for moving of members between voice channels + USE_VAD = (1ULL << 25), // Allows for using voice-activity-detection in a voice channel + CHANGE_NICKNAME = (1ULL << 26), // Allows for modification of own nickname + MANAGE_NICKNAMES = (1ULL << 27), // Allows for modification of other users nicknames + MANAGE_ROLES = (1ULL << 28), // Allows management and editing of roles + MANAGE_WEBHOOKS = (1ULL << 29), // Allows management and editing of webhooks + MANAGE_GUILD_EXPRESSIONS = (1ULL << 30), // Allows management and editing of emojis, stickers, and soundboard sounds + USE_APPLICATION_COMMANDS = (1ULL << 31), // Allows members to use application commands, including slash commands and context menu commands + REQUEST_TO_SPEAK = (1ULL << 32), // Allows for requesting to speak in stage channels + MANAGE_EVENTS = (1ULL << 33), // Allows for creating, editing, and deleting scheduled events + MANAGE_THREADS = (1ULL << 34), // Allows for deleting and archiving threads, and viewing all private threads + CREATE_PUBLIC_THREADS = (1ULL << 35), // Allows for creating public and announcement threads + CREATE_PRIVATE_THREADS = (1ULL << 36), // Allows for creating private threads + USE_EXTERNAL_STICKERS = (1ULL << 37), // Allows the usage of custom stickers from other servers + SEND_MESSAGES_IN_THREADS = (1ULL << 38), // Allows for sending messages in threads + USE_EMBEDDED_ACTIVITIES = (1ULL << 39), // Allows for using Activities (applications with the EMBEDDED flag) in a voice channel + MODERATE_MEMBERS = (1ULL << 40), // Allows for timing out users to prevent them from sending or reacting to messages in chat and threads, and from speaking in voice and stage channels + VIEW_CREATOR_MONETIZATION_ANALYTICS = (1ULL << 41), // Allows for viewing role subscription insights + USE_SOUNDBOARD = (1ULL << 42), // Allows for using soundboard in a voice channel + CREATE_GUILD_EXPRESSIONS = (1ULL << 43), // undocumented + CREATE_EVENTS = (1ULL << 44), // undocumented + USE_EXTERNAL_SOUNDS = (1ULL << 45), // Allows the usage of custom soundboard sounds from other servers + SEND_VOICE_MESSAGES = (1ULL << 46), // Allows sending voice messages + USE_CLYDE_AI = (1ULL << 47), // undocumented + SET_VOICE_CHANNEL_STATUS = (1ULL << 48), // undocumented - ALL = 0x1FFFFFFFFFULL, + ALL = 0x1FFFFFFFFFFFFULL, }; template<> @@ -130,15 +143,15 @@ constexpr const char *GetPermissionString(Permission perm) { return "Manage Roles"; case Permission::MANAGE_WEBHOOKS: return "Manage Webhooks"; - case Permission::MANAGE_EMOJIS: + case Permission::MANAGE_GUILD_EXPRESSIONS: return "Manage Emojis"; - case Permission::USE_SLASH_COMMANDS: + case Permission::USE_APPLICATION_COMMANDS: return "Use Slash Commands"; case Permission::MANAGE_THREADS: return "Manage Threads"; - case Permission::USE_PUBLIC_THREADS: + case Permission::CREATE_PUBLIC_THREADS: return "Use Public Threads"; - case Permission::USE_PRIVATE_THREADS: + case Permission::CREATE_PRIVATE_THREADS: return "Use Private Threads"; default: return "Unknown Permission"; @@ -209,15 +222,15 @@ constexpr const char *GetPermissionDescription(Permission perm) { return "Allows members to create new roles and edit or delete roles lower than their highest role. Also allows members to change permissions of individual channels that they have access to."; case Permission::MANAGE_WEBHOOKS: return "Allows members to create, edit, or delete webhooks, which can post messages from other apps or sites into this server."; - case Permission::MANAGE_EMOJIS: + case Permission::MANAGE_GUILD_EXPRESSIONS: return "Allows members to add or remove custom emojis in this server."; - case Permission::USE_SLASH_COMMANDS: + case Permission::USE_APPLICATION_COMMANDS: return "Allows members to use slash commands in text channels."; case Permission::MANAGE_THREADS: return "Allows members to rename, delete, archive/unarchive, and turn on slow mode for threads."; - case Permission::USE_PUBLIC_THREADS: + case Permission::CREATE_PUBLIC_THREADS: return "Allows members to talk in threads. The \"Send Messages\" permission must be enabled for members to start new threads; if it's disabled, they can only respond to existing threads."; - case Permission::USE_PRIVATE_THREADS: + case Permission::CREATE_PRIVATE_THREADS: return "Allows members to create and chat in private threads. The \"Send Messages\" permission must be enabled for members to start new private threads; if it's disabled, they can only respond to private threads they're added to."; default: return ""; diff --git a/src/discord/user.hpp b/src/discord/user.hpp index 8b2a2c4..3e356a4 100644 --- a/src/discord/user.hpp +++ b/src/discord/user.hpp @@ -7,9 +7,11 @@ enum class EPremiumType { None = 0, NitroClassic = 1, Nitro = 2, + Basic = 3, }; struct UserData { + // todo: enum class? (for consistencys sake) enum { DiscordEmployee = 1 << 0, PartneredServerOwner = 1 << 1, @@ -29,6 +31,7 @@ struct UserData { Spammer = 1 << 20, DisablePremium = 1 << 21, ActiveDeveloper = 1 << 22, + ApplicationCommandBadge = 1 << 23, Quarantined = 1ULL << 44, MaxFlag_PlusOne, diff --git a/src/windows/guildsettings/emojispane.cpp b/src/windows/guildsettings/emojispane.cpp index 702432f..fd0abd5 100644 --- a/src/windows/guildsettings/emojispane.cpp +++ b/src/windows/guildsettings/emojispane.cpp @@ -34,7 +34,7 @@ GuildSettingsEmojisPane::GuildSettingsEmojisPane(Snowflake guild_id) discord.signal_guild_emojis_update().connect(sigc::hide<0>(sigc::mem_fun(*this, &GuildSettingsEmojisPane::OnFetchEmojis))); const auto self_id = discord.GetUserData().ID; - const bool can_manage = discord.HasGuildPermission(self_id, GuildID, Permission::MANAGE_EMOJIS); + const bool can_manage = discord.HasGuildPermission(self_id, GuildID, Permission::MANAGE_GUILD_EXPRESSIONS); m_menu_delete.set_sensitive(can_manage); m_search.set_placeholder_text("Filter"); @@ -104,7 +104,7 @@ void GuildSettingsEmojisPane::OnMap() { auto &discord = Abaddon::Get().GetDiscordClient(); const auto self_id = discord.GetUserData().ID; - const bool can_manage = discord.HasGuildPermission(self_id, GuildID, Permission::MANAGE_EMOJIS); + const bool can_manage = discord.HasGuildPermission(self_id, GuildID, Permission::MANAGE_GUILD_EXPRESSIONS); m_menu_delete.set_sensitive(can_manage); discord.FetchGuildEmojis(GuildID, sigc::mem_fun(*this, &GuildSettingsEmojisPane::OnFetchEmojis)); @@ -228,7 +228,7 @@ bool GuildSettingsEmojisPane::OnTreeButtonPress(GdkEventButton *event) { if (event->button == GDK_BUTTON_SECONDARY) { auto &discord = Abaddon::Get().GetDiscordClient(); const auto self_id = discord.GetUserData().ID; - const bool can_manage = discord.HasGuildPermission(self_id, GuildID, Permission::MANAGE_EMOJIS); + const bool can_manage = discord.HasGuildPermission(self_id, GuildID, Permission::MANAGE_GUILD_EXPRESSIONS); m_menu_delete.set_sensitive(can_manage); auto selection = m_view.get_selection(); diff --git a/src/windows/guildsettings/rolespane.cpp b/src/windows/guildsettings/rolespane.cpp index 158fa11..a3e9ae9 100644 --- a/src/windows/guildsettings/rolespane.cpp +++ b/src/windows/guildsettings/rolespane.cpp @@ -262,7 +262,7 @@ GuildSettingsRolesPaneInfo::GuildSettingsRolesPaneInfo(Snowflake guild_id) Permission::VIEW_CHANNEL, Permission::MANAGE_CHANNELS, Permission::MANAGE_ROLES, - Permission::MANAGE_EMOJIS, + Permission::MANAGE_GUILD_EXPRESSIONS, Permission::VIEW_AUDIT_LOG, Permission::VIEW_GUILD_INSIGHTS, Permission::MANAGE_WEBHOOKS, @@ -277,8 +277,8 @@ GuildSettingsRolesPaneInfo::GuildSettingsRolesPaneInfo(Snowflake guild_id) add_perms("Text Channels", RIGHT, { Permission::SEND_MESSAGES, - Permission::USE_PUBLIC_THREADS, - Permission::USE_PRIVATE_THREADS, + Permission::CREATE_PUBLIC_THREADS, + Permission::CREATE_PRIVATE_THREADS, Permission::EMBED_LINKS, Permission::ATTACH_FILES, Permission::ADD_REACTIONS, @@ -288,7 +288,7 @@ GuildSettingsRolesPaneInfo::GuildSettingsRolesPaneInfo(Snowflake guild_id) Permission::MANAGE_THREADS, Permission::READ_MESSAGE_HISTORY, Permission::SEND_TTS_MESSAGES, - Permission::USE_SLASH_COMMANDS }); + Permission::USE_APPLICATION_COMMANDS }); add_perms("Voice Channels", RIGHT, { Permission::CONNECT, -- cgit v1.2.3 From 4774711f52bde15af64f18faf411b4b30136baa6 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Fri, 3 Nov 2023 02:45:37 -0400 Subject: update permissions strings and role pane --- src/discord/permissions.hpp | 78 +++++++++++++++++++++++++++------ src/windows/guildsettings/rolespane.cpp | 38 ++++++++++------ 2 files changed, 90 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/discord/permissions.hpp b/src/discord/permissions.hpp index 82f52df..0d2217f 100644 --- a/src/discord/permissions.hpp +++ b/src/discord/permissions.hpp @@ -50,12 +50,12 @@ enum class Permission : uint64_t { MODERATE_MEMBERS = (1ULL << 40), // Allows for timing out users to prevent them from sending or reacting to messages in chat and threads, and from speaking in voice and stage channels VIEW_CREATOR_MONETIZATION_ANALYTICS = (1ULL << 41), // Allows for viewing role subscription insights USE_SOUNDBOARD = (1ULL << 42), // Allows for using soundboard in a voice channel - CREATE_GUILD_EXPRESSIONS = (1ULL << 43), // undocumented - CREATE_EVENTS = (1ULL << 44), // undocumented + CREATE_GUILD_EXPRESSIONS = (1ULL << 43), // undocumented. Present in client + CREATE_EVENTS = (1ULL << 44), // undocumented. Present in client USE_EXTERNAL_SOUNDS = (1ULL << 45), // Allows the usage of custom soundboard sounds from other servers SEND_VOICE_MESSAGES = (1ULL << 46), // Allows sending voice messages USE_CLYDE_AI = (1ULL << 47), // undocumented - SET_VOICE_CHANNEL_STATUS = (1ULL << 48), // undocumented + SET_VOICE_CHANNEL_STATUS = (1ULL << 48), // undocumented. Present in Client ALL = 0x1FFFFFFFFFFFFULL, }; @@ -104,7 +104,7 @@ constexpr const char *GetPermissionString(Permission perm) { case Permission::STREAM: return "Video"; case Permission::VIEW_CHANNEL: - return "View Channel"; + return "View Channels"; case Permission::SEND_MESSAGES: return "Send Messages"; case Permission::SEND_TTS_MESSAGES: @@ -144,15 +144,41 @@ constexpr const char *GetPermissionString(Permission perm) { case Permission::MANAGE_WEBHOOKS: return "Manage Webhooks"; case Permission::MANAGE_GUILD_EXPRESSIONS: - return "Manage Emojis"; + return "Manage Expressions"; case Permission::USE_APPLICATION_COMMANDS: - return "Use Slash Commands"; + return "Use Application Commands"; + case Permission::MANAGE_EVENTS: + return "Manage Events"; case Permission::MANAGE_THREADS: return "Manage Threads"; case Permission::CREATE_PUBLIC_THREADS: - return "Use Public Threads"; + return "Create Public Threads"; case Permission::CREATE_PRIVATE_THREADS: - return "Use Private Threads"; + return "Create Private Threads"; + case Permission::USE_EXTERNAL_STICKERS: + return "Use External Stickers"; + case Permission::SEND_MESSAGES_IN_THREADS: + return "Send Messages In Threads"; + case Permission::USE_EMBEDDED_ACTIVITIES: + return "Use Activities"; + case Permission::MODERATE_MEMBERS: + return "Timeout Members"; + // case Permission::VIEW_CREATOR_MONETIZATION_ANALYTICS: + // return ""; + case Permission::USE_SOUNDBOARD: + return "Use Soundboard"; + case Permission::CREATE_GUILD_EXPRESSIONS: + return "Create Expressions"; + case Permission::CREATE_EVENTS: + return "Create Events"; + case Permission::USE_EXTERNAL_SOUNDS: + return "Use External Sounds"; + case Permission::SEND_VOICE_MESSAGES: + return "Send Voice Messages"; + // case Permission::USE_CLYDE_AI: + // return ""; + case Permission::SET_VOICE_CHANNEL_STATUS: + return "Set Voice Channel Status"; default: return "Unknown Permission"; } @@ -223,15 +249,41 @@ constexpr const char *GetPermissionDescription(Permission perm) { case Permission::MANAGE_WEBHOOKS: return "Allows members to create, edit, or delete webhooks, which can post messages from other apps or sites into this server."; case Permission::MANAGE_GUILD_EXPRESSIONS: - return "Allows members to add or remove custom emojis in this server."; + return "Allows members to add or remove custom emoji, stickers, and sounds in this server."; case Permission::USE_APPLICATION_COMMANDS: - return "Allows members to use slash commands in text channels."; + return "Allows members to use commands from applications, including slash commands and context menu commands."; + case Permission::MANAGE_EVENTS: + return "Allows members to edit and cancel events."; case Permission::MANAGE_THREADS: - return "Allows members to rename, delete, archive/unarchive, and turn on slow mode for threads."; + return "Allows members to rename, delete, close, and turn on slow mode for threads. They can also view private threads"; case Permission::CREATE_PUBLIC_THREADS: - return "Allows members to talk in threads. The \"Send Messages\" permission must be enabled for members to start new threads; if it's disabled, they can only respond to existing threads."; + return "Allows members to create threads that everyone in a channel can view."; case Permission::CREATE_PRIVATE_THREADS: - return "Allows members to create and chat in private threads. The \"Send Messages\" permission must be enabled for members to start new private threads; if it's disabled, they can only respond to private threads they're added to."; + return "Allows members to create invite-only threads."; + case Permission::USE_EXTERNAL_STICKERS: + return "Allows members to use stickers from other servers, if they're a Discord Nitro member."; + case Permission::SEND_MESSAGES_IN_THREADS: + return "Allows members to send messages in threads."; + case Permission::USE_EMBEDDED_ACTIVITIES: + return "Allows members to use Activities in this server."; + case Permission::MODERATE_MEMBERS: + return "When you put a user in timeout they will not be able to send messages in chat, reply within threads, react to messages, or speak in voice or Stage channels."; + // case Permission::VIEW_CREATOR_MONETIZATION_ANALYTICS: + // return ""; + case Permission::USE_SOUNDBOARD: + return "Allows members to send sounds from server soundboard."; + case Permission::CREATE_GUILD_EXPRESSIONS: + return "Allows members to add custom emoji, stickers, and sounds in this server."; + case Permission::CREATE_EVENTS: + return "Allows members to create events."; + case Permission::USE_EXTERNAL_SOUNDS: + return "Allows members to use sounds from other servers, if they're a Discord Nitro member."; + case Permission::SEND_VOICE_MESSAGES: + return "Allows members to send voice messages."; + // case Permission::USE_CLYDE_AI: + // return ""; + case Permission::SET_VOICE_CHANNEL_STATUS: + return "Allows members to create and edit voice channel status."; default: return ""; } diff --git a/src/windows/guildsettings/rolespane.cpp b/src/windows/guildsettings/rolespane.cpp index a3e9ae9..25088d7 100644 --- a/src/windows/guildsettings/rolespane.cpp +++ b/src/windows/guildsettings/rolespane.cpp @@ -258,49 +258,61 @@ GuildSettingsRolesPaneInfo::GuildSettingsRolesPaneInfo(Snowflake guild_id) // fuck you clang-format you suck // clang-format off - add_perms("General", LEFT, { + add_perms("General", RIGHT, { Permission::VIEW_CHANNEL, Permission::MANAGE_CHANNELS, Permission::MANAGE_ROLES, + Permission::CREATE_GUILD_EXPRESSIONS, Permission::MANAGE_GUILD_EXPRESSIONS, Permission::VIEW_AUDIT_LOG, - Permission::VIEW_GUILD_INSIGHTS, Permission::MANAGE_WEBHOOKS, Permission::MANAGE_GUILD }); - add_perms("Membership", LEFT, { - Permission::CREATE_INSTANT_INVITE, - Permission::CHANGE_NICKNAME, - Permission::MANAGE_NICKNAMES, - Permission::KICK_MEMBERS, - Permission::BAN_MEMBERS }); - - add_perms("Text Channels", RIGHT, { + add_perms("Text Channels", LEFT, { Permission::SEND_MESSAGES, + Permission::SEND_MESSAGES_IN_THREADS, Permission::CREATE_PUBLIC_THREADS, Permission::CREATE_PRIVATE_THREADS, Permission::EMBED_LINKS, Permission::ATTACH_FILES, Permission::ADD_REACTIONS, Permission::USE_EXTERNAL_EMOJIS, + Permission::USE_EXTERNAL_STICKERS, Permission::MENTION_EVERYONE, Permission::MANAGE_MESSAGES, Permission::MANAGE_THREADS, Permission::READ_MESSAGE_HISTORY, Permission::SEND_TTS_MESSAGES, - Permission::USE_APPLICATION_COMMANDS }); + Permission::USE_APPLICATION_COMMANDS, + Permission::SEND_VOICE_MESSAGES, }); + + add_perms("Membership", LEFT, { + Permission::CREATE_INSTANT_INVITE, + Permission::CHANGE_NICKNAME, + Permission::MANAGE_NICKNAMES, + Permission::KICK_MEMBERS, + Permission::BAN_MEMBERS, + Permission::MODERATE_MEMBERS }); + + add_perms("Advanced", LEFT, { Permission::ADMINISTRATOR }); add_perms("Voice Channels", RIGHT, { Permission::CONNECT, Permission::SPEAK, Permission::STREAM, + Permission::USE_EMBEDDED_ACTIVITIES, + Permission::USE_SOUNDBOARD, + Permission::USE_EXTERNAL_SOUNDS, Permission::USE_VAD, Permission::PRIORITY_SPEAKER, Permission::MUTE_MEMBERS, Permission::DEAFEN_MEMBERS, - Permission::MOVE_MEMBERS }); + Permission::MOVE_MEMBERS, + Permission::SET_VOICE_CHANNEL_STATUS }); - add_perms("Advanced", LEFT, { Permission::ADMINISTRATOR }); + add_perms("Events", RIGHT, { + Permission::CREATE_EVENTS, + Permission::MANAGE_EVENTS, }); // clang-format on -- cgit v1.2.3 From 5703d06c7396814b239a621d03ef983372491d34 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sat, 4 Nov 2023 20:54:15 -0400 Subject: show animated reactions --- src/components/chatmessage.cpp | 6 +++++- src/discord/emoji.cpp | 4 ++++ src/discord/emoji.hpp | 2 ++ src/discord/store.cpp | 25 +++++++++++++++++++------ 4 files changed, 30 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/components/chatmessage.cpp b/src/components/chatmessage.cpp index 44396a2..d884077 100644 --- a/src/components/chatmessage.cpp +++ b/src/components/chatmessage.cpp @@ -620,7 +620,11 @@ Gtk::Widget *ChatMessageItemContainer::CreateReactionsComponent(const Message &d } else { // custom ev->set_tooltip_text(reaction.Emoji.Name); - auto img = Gtk::manage(new LazyImage(reaction.Emoji.GetURL(), 16, 16)); + auto *img = Gtk::make_managed(reaction.Emoji.GetURL(), 16, 16); + if (reaction.Emoji.IsEmojiAnimated() && Abaddon::Get().GetSettings().ShowAnimations) { + img->SetURL(reaction.Emoji.GetURL("gif")); + img->SetAnimated(true); + } img->set_can_focus(false); box->add(*img); } diff --git a/src/discord/emoji.cpp b/src/discord/emoji.cpp index a21b9bd..9c63558 100644 --- a/src/discord/emoji.cpp +++ b/src/discord/emoji.cpp @@ -49,3 +49,7 @@ std::string EmojiData::URLFromID(Snowflake emoji_id, const char *ext, const char std::string EmojiData::URLFromID(const Glib::ustring &emoji_id, const char *ext, const char *size) { return URLFromID(emoji_id.raw(), ext, size); } + +bool EmojiData::IsEmojiAnimated() const noexcept { + return IsAnimated.has_value() && *IsAnimated; +} diff --git a/src/discord/emoji.hpp b/src/discord/emoji.hpp index 156e127..a7b994f 100644 --- a/src/discord/emoji.hpp +++ b/src/discord/emoji.hpp @@ -22,4 +22,6 @@ struct EmojiData { static std::string URLFromID(const std::string &emoji_id, const char *ext = "png", const char *size = nullptr); static std::string URLFromID(Snowflake emoji_id, const char *ext = "png", const char *size = nullptr); static std::string URLFromID(const Glib::ustring &emoji_id, const char *ext = "png", const char *size = nullptr); + + bool IsEmojiAnimated() const noexcept; }; diff --git a/src/discord/store.cpp b/src/discord/store.cpp index dfeb7d1..817f71f 100644 --- a/src/discord/store.cpp +++ b/src/discord/store.cpp @@ -1056,11 +1056,12 @@ Message Store::GetMessageBound(std::unique_ptr &s) const { while (s->FetchOne()) { size_t idx; ReactionData q; - s->Get(0, q.Emoji.ID); - s->Get(1, q.Emoji.Name); - s->Get(2, q.Count); - s->Get(3, q.HasReactedWith); - s->Get(4, idx); + s->Get(0, q.Count); + s->Get(1, q.HasReactedWith); + s->Get(2, idx); + s->Get(3, q.Emoji.ID); + s->Get(4, q.Emoji.Name); + s->Get(5, q.Emoji.IsAnimated); tmp[idx] = q; } s->Reset(); @@ -2291,7 +2292,19 @@ bool Store::CreateStatements() { } m_stmt_get_reactions = std::make_unique(m_db, R"( - SELECT emoji_id, name, count, me, idx FROM reactions WHERE message = ? + SELECT + reactions.count, + reactions.me, + reactions.idx, + emojis.id, + emojis.name, + emojis.animated + FROM + reactions + INNER JOIN + emojis ON reactions.emoji_id = emojis.id + WHERE + message = ? )"); if (!m_stmt_get_reactions->OK()) { fprintf(stderr, "failed to prepare get reactions statement: %s\n", m_db.ErrStr()); -- cgit v1.2.3 From 25aadd4181b5f82f0315931b2b15953746d33af3 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sat, 4 Nov 2023 21:15:36 -0400 Subject: use a slightly different way of getting build number --- src/startup.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/startup.cpp b/src/startup.cpp index 130ba9b..1bfd9a4 100644 --- a/src/startup.cpp +++ b/src/startup.cpp @@ -43,8 +43,8 @@ std::optional GetJavascriptFileFromAppPage(const Glib::ustring &c start_position += str.size(); } - if (matches.size() >= 7) { - return matches[matches.size() - 7]; + if (matches.size() >= 2) { + return matches[matches.size() - 2]; } return {}; @@ -64,7 +64,7 @@ std::optional GetBuildNumberFromJSURL(const Glib::ustring &url, const auto res = req.execute(); if (res.error) return {}; - auto regex = Glib::Regex::create("buildNumber:\"(\\d+)\""); + auto regex = Glib::Regex::create(R"(Build Number: "\).concat\("(\d+))"); Glib::MatchInfo match; Glib::ustring string = res.text; if (regex->match(string, match)) { -- cgit v1.2.3 From cb83e30a76d76705c034541c0c1e9ef08b7b4946 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Thu, 9 Nov 2023 02:20:42 -0500 Subject: message input theme tweaking --- res/css/bare.css | 5 +++++ src/components/chatinput.cpp | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/res/css/bare.css b/res/css/bare.css index 80ef2f8..ec5b9a1 100644 --- a/res/css/bare.css +++ b/res/css/bare.css @@ -33,3 +33,8 @@ .status-indicator.idle { color: #FAA61A; } + +/* make room for attachment icon */ +.message-input.with-browse-icon { + padding-left: 30px; +} diff --git a/src/components/chatinput.cpp b/src/components/chatinput.cpp index c802413..af092e1 100644 --- a/src/components/chatinput.cpp +++ b/src/components/chatinput.cpp @@ -20,7 +20,7 @@ ChatInputText::ChatInputText() { m_textview.signal_key_press_event().connect(cb, false); m_textview.set_hexpand(false); m_textview.set_halign(Gtk::ALIGN_FILL); - m_textview.set_valign(Gtk::ALIGN_CENTER); + m_textview.set_valign(Gtk::ALIGN_FILL); m_textview.set_wrap_mode(Gtk::WRAP_WORD_CHAR); m_textview.show(); add(m_textview); -- cgit v1.2.3 From 5cca270eb1c627ae59cf294c9670d31b288b768c Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Thu, 9 Nov 2023 22:08:14 -0500 Subject: more making message input look better --- res/css/bare.css | 9 ++++--- src/components/chatinput.cpp | 59 ++++++++++---------------------------------- src/components/chatinput.hpp | 6 ++--- 3 files changed, 22 insertions(+), 52 deletions(-) (limited to 'src') diff --git a/res/css/bare.css b/res/css/bare.css index ec5b9a1..595fd04 100644 --- a/res/css/bare.css +++ b/res/css/bare.css @@ -34,7 +34,10 @@ color: #FAA61A; } -/* make room for attachment icon */ -.message-input.with-browse-icon { - padding-left: 30px; +.message-input textview, .message-input textview text { + background-color: inherit; +} + +.message-input textview { + padding: 10px 5px; } diff --git a/src/components/chatinput.cpp b/src/components/chatinput.cpp index af092e1..b6beaa5 100644 --- a/src/components/chatinput.cpp +++ b/src/components/chatinput.cpp @@ -113,30 +113,25 @@ ChatInputTextContainer::ChatInputTextContainer() { }; m_input.signal_key_press_proxy().connect(cb); + m_upload_button.set_image(m_upload_img); + m_upload_button.set_halign(Gtk::ALIGN_CENTER); + m_upload_button.set_valign(Gtk::ALIGN_CENTER); + m_upload_button.get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); + m_upload_img.property_icon_name() = "document-send-symbolic"; m_upload_img.property_icon_size() = Gtk::ICON_SIZE_LARGE_TOOLBAR; m_upload_img.get_style_context()->add_class("message-input-browse-icon"); - AddPointerCursor(m_upload_ev); - - m_upload_ev.signal_button_press_event().connect([this](GdkEventButton *ev) -> bool { - if (ev->button == GDK_BUTTON_PRIMARY) { - ShowFileChooser(); - // return focus - m_input.grab_focus(); - return true; - } - return false; + m_upload_button.signal_clicked().connect([this]() { + ShowFileChooser(); + m_input.grab_focus(); }); - m_upload_ev.add(m_upload_img); - add_overlay(m_upload_ev); - add(m_input); + m_upload_box.pack_start(m_upload_button); + pack_start(m_upload_box, false, false); + pack_start(m_input); show_all_children(); - - // stop the overlay from using (start) padding - signal_get_child_position().connect(sigc::mem_fun(*this, &ChatInputTextContainer::GetChildPosition), false); } void ChatInputTextContainer::ShowFileChooser() { @@ -160,39 +155,11 @@ ChatInputText &ChatInputTextContainer::Get() { } void ChatInputTextContainer::ShowChooserIcon() { - m_upload_ev.show(); + m_upload_button.show(); } void ChatInputTextContainer::HideChooserIcon() { - m_upload_ev.hide(); -} - -bool ChatInputTextContainer::GetChildPosition(Gtk::Widget *child, Gdk::Rectangle &pos) { - Gtk::Allocation main_alloc; - { - auto *grandchild = m_input.get_child(); - int x, y; - if (grandchild->translate_coordinates(m_input, 0, 0, x, y)) { - main_alloc.set_x(x); - main_alloc.set_y(y); - } else { - main_alloc.set_x(0); - main_alloc.set_y(0); - } - main_alloc.set_width(grandchild->get_allocated_width()); - main_alloc.set_height(grandchild->get_allocated_height()); - } - - Gtk::Requisition min, req; - child->get_preferred_size(min, req); - - // let css move it around - pos.set_x(0); - pos.set_y(0); - pos.set_width(std::max(min.width, std::min(main_alloc.get_width(), req.width))); - pos.set_height(std::max(min.height, std::min(main_alloc.get_height(), req.height))); - - return true; + m_upload_button.hide(); } ChatInputTextContainer::type_signal_add_attachment ChatInputTextContainer::signal_add_attachment() { diff --git a/src/components/chatinput.hpp b/src/components/chatinput.hpp index a3c9742..7ee3921 100644 --- a/src/components/chatinput.hpp +++ b/src/components/chatinput.hpp @@ -98,7 +98,7 @@ private: }; // file upload, text -class ChatInputTextContainer : public Gtk::Overlay { +class ChatInputTextContainer : public Gtk::Box { public: ChatInputTextContainer(); @@ -110,9 +110,9 @@ public: private: void ShowFileChooser(); - bool GetChildPosition(Gtk::Widget *child, Gdk::Rectangle &pos); - Gtk::EventBox m_upload_ev; + Gtk::Box m_upload_box; + Gtk::Button m_upload_button; Gtk::Image m_upload_img; ChatInputText m_input; -- cgit v1.2.3 From 3d2f5abce4c591e35d64d428cc1df06407128211 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Fri, 17 Nov 2023 01:24:57 -0500 Subject: reimplement status indicator in member list --- README.md | 5 -- src/components/cellrenderermemberlist.cpp | 34 ++++++++- src/components/cellrenderermemberlist.hpp | 3 + src/components/channels.cpp | 1 - src/components/memberlist.cpp | 19 ++++- src/components/memberlist.hpp | 3 + src/components/statusindicator.cpp | 122 ------------------------------ src/components/statusindicator.hpp | 29 ------- 8 files changed, 56 insertions(+), 160 deletions(-) delete mode 100644 src/components/statusindicator.cpp delete mode 100644 src/components/statusindicator.hpp (limited to 'src') diff --git a/README.md b/README.md index 0038f1f..89e7d3d 100644 --- a/README.md +++ b/README.md @@ -199,11 +199,6 @@ spam filter's wrath: | `.embed-field-value` | The value of an embed field | | `.embed-footer` | The footer of an embed | | `.member-list` | Container of the member list | -| `.status-indicator` | The status indicator | -| `.online` | Applied to status indicators when the associated user is online | -| `.idle` | Applied to status indicators when the associated user is away | -| `.dnd` | Applied to status indicators when the associated user is on do not disturb | -| `.offline` | Applied to status indicators when the associated user is offline | | `.typing-indicator` | The typing indicator (also used for replies) | Used in reorderable list implementation: diff --git a/src/components/cellrenderermemberlist.cpp b/src/components/cellrenderermemberlist.cpp index 66b223e..ee1ea3e 100644 --- a/src/components/cellrenderermemberlist.cpp +++ b/src/components/cellrenderermemberlist.cpp @@ -6,7 +6,8 @@ CellRendererMemberList::CellRendererMemberList() , m_property_id(*this, "id") , m_property_name(*this, "name") , m_property_pixbuf(*this, "pixbuf") - , m_property_color(*this, "color") { + , m_property_color(*this, "color") + , m_property_status(*this, "status") { property_mode() = Gtk::CELL_RENDERER_MODE_ACTIVATABLE; property_xpad() = 2; property_ypad() = 2; @@ -35,6 +36,10 @@ Glib::PropertyProxy CellRendererMemberList::property_color() { return m_property_color.get_proxy(); } +Glib::PropertyProxy CellRendererMemberList::property_status() { + return m_property_status.get_proxy(); +} + void CellRendererMemberList::get_preferred_width_vfunc(Gtk::Widget &widget, int &minimum_width, int &natural_width) const { switch (m_property_type.get_value()) { case MemberListRenderType::Role: @@ -117,8 +122,9 @@ void CellRendererMemberList::get_preferred_height_for_width_vfunc_member(Gtk::Wi } void CellRendererMemberList::render_vfunc_member(const Cairo::RefPtr &cr, Gtk::Widget &widget, const Gdk::Rectangle &background_area, const Gdk::Rectangle &cell_area, Gtk::CellRendererState flags) { + // Text Gdk::Rectangle text_cell_area = cell_area; - text_cell_area.set_x(22); + text_cell_area.set_x(31); const auto color = m_property_color.get_value(); if (color.get_alpha_u() > 0) { m_renderer_text.property_foreground_rgba().set_value(color); @@ -126,6 +132,30 @@ void CellRendererMemberList::render_vfunc_member(const Cairo::RefPtrbegin_new_path(); + switch (m_property_status.get_value()) { + case PresenceStatus::Online: + cr->set_source_rgb(33.0 / 255.0, 157.0 / 255.0, 86.0 / 255.0); + break; + case PresenceStatus::Idle: + cr->set_source_rgb(230.0 / 255.0, 170.0 / 255.0, 48.0 / 255.0); + break; + case PresenceStatus::DND: + cr->set_source_rgb(233.0 / 255.0, 61.0 / 255.0, 65.0 / 255.0); + break; + case PresenceStatus::Offline: + cr->set_source_rgb(122.0 / 255.0, 126.0 / 255.0, 135.0 / 255.0); + break; + } + + cr->arc(background_area.get_x() + 6.0 + 16.0 + 6.0, background_area.get_y() + background_area.get_height() / 2.0, 2.0, 0.0, 2 * (4 * std::atan(1))); + cr->close_path(); + cr->fill_preserve(); + cr->stroke(); + + // Icon const double icon_x = background_area.get_x() + 6.0; const double icon_y = background_area.get_y() + background_area.get_height() / 2.0 - 8.0; Gdk::Cairo::set_source_pixbuf(cr, m_property_pixbuf.get_value(), icon_x, icon_y); diff --git a/src/components/cellrenderermemberlist.hpp b/src/components/cellrenderermemberlist.hpp index 7a49ccf..79d32e3 100644 --- a/src/components/cellrenderermemberlist.hpp +++ b/src/components/cellrenderermemberlist.hpp @@ -1,5 +1,6 @@ #pragma once #include +#include "discord/activity.hpp" enum class MemberListRenderType : uint8_t { Role, @@ -16,6 +17,7 @@ public: Glib::PropertyProxy property_name(); Glib::PropertyProxy> property_pixbuf(); Glib::PropertyProxy property_color(); + Glib::PropertyProxy property_status(); protected: void get_preferred_width_vfunc(Gtk::Widget &widget, int &minimum_width, int &natural_width) const override; @@ -56,6 +58,7 @@ private: Glib::Property m_property_name; Glib::Property> m_property_pixbuf; Glib::Property m_property_color; + Glib::Property m_property_status; using type_signal_render = sigc::signal; type_signal_render m_signal_render; diff --git a/src/components/channels.cpp b/src/components/channels.cpp index 9fd4abd..6ed3ca4 100644 --- a/src/components/channels.cpp +++ b/src/components/channels.cpp @@ -1,6 +1,5 @@ #include "channels.hpp" #include "imgmanager.hpp" -#include "statusindicator.hpp" #include #include #include diff --git a/src/components/memberlist.cpp b/src/components/memberlist.cpp index b082daa..7046b52 100644 --- a/src/components/memberlist.cpp +++ b/src/components/memberlist.cpp @@ -28,6 +28,7 @@ MemberList::MemberList() column->add_attribute(renderer->property_name(), m_columns.m_name); column->add_attribute(renderer->property_pixbuf(), m_columns.m_pixbuf); column->add_attribute(renderer->property_color(), m_columns.m_color); + column->add_attribute(renderer->property_status(), m_columns.m_status); m_view.append_column(*column); m_model->set_sort_column(m_columns.m_sort, Gtk::SORT_ASCENDING); @@ -44,6 +45,8 @@ MemberList::MemberList() m_menu_role_copy_id.signal_activate().connect([this]() { Gtk::Clipboard::get()->set_text(std::to_string((*m_model->get_iter(m_path_for_menu))[m_columns.m_id])); }); + + Abaddon::Get().GetDiscordClient().signal_presence_update().connect(sigc::mem_fun(*this, &MemberList::OnPresenceUpdate)); } Gtk::Widget *MemberList::GetRoot() { @@ -73,6 +76,7 @@ void MemberList::UpdateMemberList() { row[m_columns.m_color] = color_transparent; row[m_columns.m_av_requested] = false; row[m_columns.m_pixbuf] = Abaddon::Get().GetImageManager().GetPlaceholder(16); + row[m_columns.m_status] = Abaddon::Get().GetDiscordClient().GetUserStatus(user.ID); m_pending_avatars[user.ID] = row_iter; } } @@ -126,6 +130,7 @@ void MemberList::UpdateMemberList() { row[m_columns.m_id] = user.ID; row[m_columns.m_name] = user.GetDisplayNameEscaped(); row[m_columns.m_pixbuf] = Abaddon::Get().GetImageManager().GetPlaceholder(16); + row[m_columns.m_status] = Abaddon::Get().GetDiscordClient().GetUserStatus(user.ID); row[m_columns.m_av_requested] = false; if (const auto iter = user_to_color.find(user.ID); iter != user_to_color.end()) { row[m_columns.m_color] = IntToRGBA(iter->second); @@ -241,12 +246,24 @@ int MemberList::SortFunc(const Gtk::TreeModel::iterator &a, const Gtk::TreeModel return 0; } +void MemberList::OnPresenceUpdate(const UserData &user, PresenceStatus status) { + for (auto &role : m_model->children()) { + for (auto &member : role.children()) { + if ((*member)[m_columns.m_id] == user.ID) { + (*member)[m_columns.m_status] = status; + return; + } + } + } +} + MemberList::ModelColumns::ModelColumns() { add(m_type); add(m_id); add(m_name); add(m_pixbuf); - add(m_av_requested); add(m_color); + add(m_status); add(m_sort); + add(m_av_requested); } diff --git a/src/components/memberlist.hpp b/src/components/memberlist.hpp index cb6c191..1c4aaf4 100644 --- a/src/components/memberlist.hpp +++ b/src/components/memberlist.hpp @@ -26,6 +26,8 @@ private: int SortFunc(const Gtk::TreeModel::iterator &a, const Gtk::TreeModel::iterator &b); + void OnPresenceUpdate(const UserData &user, PresenceStatus status); + class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns(); @@ -35,6 +37,7 @@ private: Gtk::TreeModelColumn m_name; Gtk::TreeModelColumn> m_pixbuf; Gtk::TreeModelColumn m_color; + Gtk::TreeModelColumn m_status; Gtk::TreeModelColumn m_sort; Gtk::TreeModelColumn m_av_requested; diff --git a/src/components/statusindicator.cpp b/src/components/statusindicator.cpp deleted file mode 100644 index 47e8b44..0000000 --- a/src/components/statusindicator.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include "statusindicator.hpp" - -static const constexpr int Diameter = 8; - -StatusIndicator::StatusIndicator(Snowflake user_id) - : Glib::ObjectBase("statusindicator") - , Gtk::Widget() - , m_id(user_id) - , m_status(static_cast(-1)) { - set_has_window(true); - set_name("status-indicator"); - - get_style_context()->add_class("status-indicator"); - - Abaddon::Get().GetDiscordClient().signal_guild_member_list_update().connect(sigc::hide(sigc::mem_fun(*this, &StatusIndicator::CheckStatus))); - auto cb = [this](const UserData &user, PresenceStatus status) { - if (user.ID == m_id) CheckStatus(); - }; - Abaddon::Get().GetDiscordClient().signal_presence_update().connect(sigc::track_obj(cb, *this)); - - CheckStatus(); -} - -void StatusIndicator::CheckStatus() { - const auto status = Abaddon::Get().GetDiscordClient().GetUserStatus(m_id); - const auto last_status = m_status; - get_style_context()->remove_class("online"); - get_style_context()->remove_class("dnd"); - get_style_context()->remove_class("idle"); - get_style_context()->remove_class("offline"); - get_style_context()->add_class(GetPresenceString(status)); - m_status = status; - - if (last_status != m_status) - queue_draw(); -} - -Gtk::SizeRequestMode StatusIndicator::get_request_mode_vfunc() const { - return Gtk::Widget::get_request_mode_vfunc(); -} - -void StatusIndicator::get_preferred_width_vfunc(int &minimum_width, int &natural_width) const { - minimum_width = 0; - natural_width = Diameter; -} - -void StatusIndicator::get_preferred_height_for_width_vfunc(int width, int &minimum_height, int &natural_height) const { - minimum_height = 0; - natural_height = Diameter; -} - -void StatusIndicator::get_preferred_height_vfunc(int &minimum_height, int &natural_height) const { - minimum_height = 0; - natural_height = Diameter; -} - -void StatusIndicator::get_preferred_width_for_height_vfunc(int height, int &minimum_width, int &natural_width) const { - minimum_width = 0; - natural_width = Diameter; -} - -void StatusIndicator::on_size_allocate(Gtk::Allocation &allocation) { - set_allocation(allocation); - - if (m_window) - m_window->move_resize(allocation.get_x(), allocation.get_y(), allocation.get_width(), allocation.get_height()); -} - -void StatusIndicator::on_map() { - Gtk::Widget::on_map(); -} - -void StatusIndicator::on_unmap() { - Gtk::Widget::on_unmap(); -} - -void StatusIndicator::on_realize() { - set_realized(true); - - if (!m_window) { - GdkWindowAttr attributes; - std::memset(&attributes, 0, sizeof(attributes)); - - auto allocation = get_allocation(); - - attributes.x = allocation.get_x(); - attributes.y = allocation.get_y(); - attributes.width = allocation.get_width(); - attributes.height = allocation.get_height(); - - attributes.event_mask = get_events() | Gdk::EXPOSURE_MASK; - attributes.window_type = GDK_WINDOW_CHILD; - attributes.wclass = GDK_INPUT_OUTPUT; - - m_window = Gdk::Window::create(get_parent_window(), &attributes, GDK_WA_X | GDK_WA_Y); - set_window(m_window); - - m_window->set_user_data(gobj()); - } -} - -void StatusIndicator::on_unrealize() { - m_window.reset(); - - Gtk::Widget::on_unrealize(); -} - -bool StatusIndicator::on_draw(const Cairo::RefPtr &cr) { - const auto allocation = get_allocation(); - const auto width = allocation.get_width(); - const auto height = allocation.get_height(); - - const auto color = get_style_context()->get_color(Gtk::STATE_FLAG_NORMAL); - - cr->set_source_rgb(color.get_red(), color.get_green(), color.get_blue()); - cr->arc(width / 2.0, height / 2.0, width / 3.0, 0.0, 2 * (4 * std::atan(1))); - cr->close_path(); - cr->fill_preserve(); - cr->stroke(); - - return true; -} diff --git a/src/components/statusindicator.hpp b/src/components/statusindicator.hpp deleted file mode 100644 index edd64ea..0000000 --- a/src/components/statusindicator.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once -#include "discord/snowflake.hpp" -#include "discord/activity.hpp" - -class StatusIndicator : public Gtk::Widget { -public: - StatusIndicator(Snowflake user_id); - ~StatusIndicator() override = default; - -protected: - Gtk::SizeRequestMode get_request_mode_vfunc() const override; - void get_preferred_width_vfunc(int &minimum_width, int &natural_width) const override; - void get_preferred_width_for_height_vfunc(int height, int &minimum_width, int &natural_width) const override; - void get_preferred_height_vfunc(int &minimum_height, int &natural_height) const override; - void get_preferred_height_for_width_vfunc(int width, int &minimum_height, int &natural_height) const override; - void on_size_allocate(Gtk::Allocation &allocation) override; - void on_map() override; - void on_unmap() override; - void on_realize() override; - void on_unrealize() override; - bool on_draw(const Cairo::RefPtr &cr) override; - - Glib::RefPtr m_window; - - void CheckStatus(); - - Snowflake m_id; - PresenceStatus m_status; -}; -- cgit v1.2.3 From 3ab6055898c2d6b2809b62ebf6a174f35352c204 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Fri, 17 Nov 2023 01:49:30 -0500 Subject: disable foreground set on channel renderer, get rid of stray property_sensitive=false --- src/components/channelscellrenderer.cpp | 41 ++++++++++++++++----------------- 1 file changed, 20 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/components/channelscellrenderer.cpp b/src/components/channelscellrenderer.cpp index ac98512..c344bb1 100644 --- a/src/components/channelscellrenderer.cpp +++ b/src/components/channelscellrenderer.cpp @@ -243,12 +243,12 @@ void CellRendererChannels::render_vfunc_folder(const Cairo::RefPtr(text_h)); static const auto color = Gdk::RGBA(Abaddon::Get().GetSettings().ChannelColor); - m_renderer_text.property_foreground_rgba() = color; + // m_renderer_text.property_foreground_rgba() = color; m_renderer_text.render(cr, widget, background_area, text_cell_area, flags); const bool hover_only = Abaddon::Get().GetSettings().AnimatedGuildHoverOnly; @@ -465,15 +465,15 @@ void CellRendererChannels::render_vfunc_category(const Cairo::RefPtr 0) { AddUnreadIndicator(cr, background_area); } - m_renderer_text.property_foreground_rgba() = color; + // m_renderer_text.property_foreground_rgba() = color; } m_renderer_text.render(cr, widget, background_area, text_cell_area, flags); - m_renderer_text.property_foreground_set() = false; + // m_renderer_text.property_foreground_set() = false; } // text channel @@ -511,22 +511,21 @@ void CellRendererChannels::render_vfunc_channel(const Cairo::RefPtr & muted.set_red(muted.get_red() * 0.5); muted.set_green(muted.get_green() * 0.5); muted.set_blue(muted.get_blue() * 0.5); - m_renderer_text.property_foreground_rgba() = muted; + // m_renderer_text.property_foreground_rgba() = muted; } else { - m_renderer_text.property_foreground_rgba() = color; + // m_renderer_text.property_foreground_rgba() = color; } m_renderer_text.render(cr, widget, background_area, text_cell_area, flags); - m_renderer_text.property_foreground_set() = false; + // m_renderer_text.property_foreground_set() = false; Gdk::Cairo::set_source_pixbuf(cr, m_property_pixbuf.get_value(), icon_x, icon_y); cr->rectangle(icon_x, icon_y, icon_w, icon_h); -- cgit v1.2.3 From 2b8fc6a495703ba5a3b8d2db2451fd047b34b819 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:38:54 -0500 Subject: dim channel color on mute by alpha --- src/components/channelscellrenderer.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src') diff --git a/src/components/channelscellrenderer.cpp b/src/components/channelscellrenderer.cpp index c344bb1..52bc57e 100644 --- a/src/components/channelscellrenderer.cpp +++ b/src/components/channelscellrenderer.cpp @@ -523,7 +523,14 @@ void CellRendererChannels::render_vfunc_channel(const Cairo::RefPtrget_color(Gtk::STATE_FLAG_NORMAL); + color.set_alpha(0.6); + m_renderer_text.property_foreground_rgba() = color; + } m_renderer_text.render(cr, widget, background_area, text_cell_area, flags); + m_renderer_text.property_foreground_set() = false; // unset foreground to default so properties dont bleed // m_renderer_text.property_foreground_set() = false; -- cgit v1.2.3 From 7d7c0dc33f468f424af8e6e6293b58d94b69cd01 Mon Sep 17 00:00:00 2001 From: Colin Sane Date: Tue, 21 Nov 2023 05:53:26 +0000 Subject: set glib application name (#247) --- src/abaddon.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/abaddon.cpp b/src/abaddon.cpp index 6557182..cf10f91 100644 --- a/src/abaddon.cpp +++ b/src/abaddon.cpp @@ -177,6 +177,7 @@ static void MainEventHandler(GdkEvent *event, void *main_window) { int Abaddon::StartGTK() { m_gtk_app = Gtk::Application::create("com.github.uowuo.abaddon"); + Glib::set_application_name(APP_TITLE); #ifdef WITH_LIBHANDY m_gtk_app->signal_activate().connect([] { -- cgit v1.2.3 From 0ed683e1e26d13233c189a6d4cb5d7e5e41a93a8 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Wed, 22 Nov 2023 02:37:00 -0500 Subject: add labels to settings in voice window --- src/windows/voicewindow.cpp | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/windows/voicewindow.cpp b/src/windows/voicewindow.cpp index 16a9fed..74ce8f5 100644 --- a/src/windows/voicewindow.cpp +++ b/src/windows/voicewindow.cpp @@ -181,7 +181,7 @@ VoiceWindow::VoiceWindow(Snowflake channel_id) m_mix_mono.set_active(audio.GetMixMono()); m_mix_mono.signal_toggled().connect([this]() { - Abaddon::Get().GetAudio().SetMixMono(m_mix_mono.get_active()); + Abaddon::Get().GetAudio().SetMixMono(m_mix_mono.get_active()); }); auto *playback_renderer = Gtk::make_managed(); @@ -225,6 +225,28 @@ VoiceWindow::VoiceWindow(Snowflake channel_id) window->show(); }); + auto *sliders_container = Gtk::make_managed(); + auto *sliders_labels = Gtk::make_managed(); + auto *sliders_sliders = Gtk::make_managed(); + sliders_container->pack_start(*sliders_labels, false, true, 2); + sliders_container->pack_start(*sliders_sliders); + sliders_labels->pack_start(*Gtk::make_managed("Threshold", Gtk::ALIGN_END)); + sliders_labels->pack_start(*Gtk::make_managed("Gain", Gtk::ALIGN_END)); + sliders_sliders->pack_start(m_vad_param); + sliders_sliders->pack_start(m_capture_gain); + + auto *combos_container = Gtk::make_managed(); + auto *combos_labels = Gtk::make_managed(); + auto *combos_combos = Gtk::make_managed(); + combos_container->pack_start(*combos_labels, false, true, 2); + combos_container->pack_start(*combos_combos); + combos_labels->pack_start(*Gtk::make_managed("VAD Method", Gtk::ALIGN_END)); + combos_labels->pack_start(*Gtk::make_managed("Output Device", Gtk::ALIGN_END)); + combos_labels->pack_start(*Gtk::make_managed("Input Device", Gtk::ALIGN_END)); + combos_combos->pack_start(m_vad_combo); + combos_combos->pack_start(m_playback_combo); + combos_combos->pack_start(m_capture_combo); + m_scroll.add(m_user_list); m_controls.add(m_mute); m_controls.add(m_deafen); @@ -233,12 +255,9 @@ VoiceWindow::VoiceWindow(Snowflake channel_id) m_main.add(m_menu_bar); m_main.add(m_controls); m_main.add(m_vad_value); - m_main.add(m_vad_param); - m_main.add(m_capture_gain); + m_main.add(*sliders_container); m_main.add(m_scroll); - m_main.add(m_vad_combo); - m_main.add(m_playback_combo); - m_main.add(m_capture_combo); + m_main.add(*combos_container); add(m_main); show_all_children(); -- cgit v1.2.3 From f7f1788df9f8db0810f615b41f653110935fa5c2 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sun, 26 Nov 2023 17:51:41 -0500 Subject: add input settings label, tweak padding --- src/windows/voicewindow.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/windows/voicewindow.cpp b/src/windows/voicewindow.cpp index 74ce8f5..825681c 100644 --- a/src/windows/voicewindow.cpp +++ b/src/windows/voicewindow.cpp @@ -238,8 +238,8 @@ VoiceWindow::VoiceWindow(Snowflake channel_id) auto *combos_container = Gtk::make_managed(); auto *combos_labels = Gtk::make_managed(); auto *combos_combos = Gtk::make_managed(); - combos_container->pack_start(*combos_labels, false, true, 2); - combos_container->pack_start(*combos_combos); + combos_container->pack_start(*combos_labels, false, true, 6); + combos_container->pack_start(*combos_combos, Gtk::PACK_EXPAND_WIDGET, 6); combos_labels->pack_start(*Gtk::make_managed("VAD Method", Gtk::ALIGN_END)); combos_labels->pack_start(*Gtk::make_managed("Output Device", Gtk::ALIGN_END)); combos_labels->pack_start(*Gtk::make_managed("Input Device", Gtk::ALIGN_END)); @@ -252,12 +252,13 @@ VoiceWindow::VoiceWindow(Snowflake channel_id) m_controls.add(m_deafen); m_controls.add(m_noise_suppression); m_controls.add(m_mix_mono); - m_main.add(m_menu_bar); - m_main.add(m_controls); - m_main.add(m_vad_value); - m_main.add(*sliders_container); - m_main.add(m_scroll); - m_main.add(*combos_container); + m_main.pack_start(m_menu_bar); + m_main.pack_start(m_controls); + m_main.pack_start(m_vad_value); + m_main.pack_start(*Gtk::make_managed("Input Settings")); + m_main.pack_start(*sliders_container); + m_main.pack_start(m_scroll); + m_main.pack_start(*combos_container, Gtk::PACK_EXPAND_WIDGET, 2); add(m_main); show_all_children(); -- cgit v1.2.3 From c61feb9f010caa9536e318e2aedb3a4ed739a91d Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sun, 26 Nov 2023 19:46:02 -0500 Subject: code deduplication unread indicator --- src/components/channelscellrenderer.cpp | 42 ++++++++++++--------------------- 1 file changed, 15 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/components/channelscellrenderer.cpp b/src/components/channelscellrenderer.cpp index 52bc57e..35c6137 100644 --- a/src/components/channelscellrenderer.cpp +++ b/src/components/channelscellrenderer.cpp @@ -7,6 +7,17 @@ constexpr static double M_PI = 3.14159265358979; constexpr static double M_PI_H = M_PI / 2.0; constexpr static double M_PI_3_2 = M_PI * 3.0 / 2.0; +void AddUnreadIndicator(const Cairo::RefPtr &cr, const Gdk::Rectangle &background_area) { + static const auto color = Gdk::RGBA(Abaddon::Get().GetSettings().UnreadIndicatorColor); + cr->set_source_rgb(color.get_red(), color.get_green(), color.get_blue()); + const auto x = background_area.get_x(); + const auto y = background_area.get_y(); + const auto w = background_area.get_width(); + const auto h = background_area.get_height(); + cr->rectangle(x, y, 3, h); + cr->fill(); +} + CellRendererChannels::CellRendererChannels() : Glib::ObjectBase(typeid(CellRendererChannels)) , Gtk::CellRenderer() @@ -373,14 +384,9 @@ void CellRendererChannels::render_vfunc_guild(const Cairo::RefPtrset_source_rgb(color.get_red(), color.get_green(), color.get_blue()); - const auto x = background_area.get_x(); - const auto y = background_area.get_y(); - const auto w = background_area.get_width(); - const auto h = background_area.get_height(); - cr->rectangle(x, y + h / 2.0 - 24.0 / 2.0, 3.0, 24.0); - cr->fill(); + auto area = background_area; + area.set_y(area.get_y() + area.get_height() / 2.0 - 24.0 / 2.0); + AddUnreadIndicator(cr, area); } if (total_mentions < 1) return; @@ -410,17 +416,6 @@ void CellRendererChannels::get_preferred_height_for_width_vfunc_category(Gtk::Wi m_renderer_text.get_preferred_height_for_width(widget, width, minimum_height, natural_height); } -void AddUnreadIndicator(const Cairo::RefPtr &cr, const Gdk::Rectangle &background_area) { - static const auto color = Gdk::RGBA(Abaddon::Get().GetSettings().UnreadIndicatorColor); - cr->set_source_rgb(color.get_red(), color.get_green(), color.get_blue()); - const auto x = background_area.get_x(); - const auto y = background_area.get_y(); - const auto w = background_area.get_width(); - const auto h = background_area.get_height(); - cr->rectangle(x, y, 3, h); - cr->fill(); -} - void CellRendererChannels::render_vfunc_category(const Cairo::RefPtr &cr, Gtk::Widget &widget, const Gdk::Rectangle &background_area, const Gdk::Rectangle &cell_area, Gtk::CellRendererState flags) { // todo: figure out how Gtk::Arrow is rendered because i like it better :^) constexpr static int len = 5; @@ -927,14 +922,7 @@ void CellRendererChannels::render_vfunc_dm(const Cairo::RefPtr & if (unread_state < 0) return; if (!is_muted) { - static const auto color = Gdk::RGBA(Abaddon::Get().GetSettings().UnreadIndicatorColor); - cr->set_source_rgb(color.get_red(), color.get_green(), color.get_blue()); - const auto x = background_area.get_x(); - const auto y = background_area.get_y(); - const auto w = background_area.get_width(); - const auto h = background_area.get_height(); - cr->rectangle(x, y, 3, h); - cr->fill(); + AddUnreadIndicator(cr, background_area); } } -- cgit v1.2.3 From 50d99de06076a0f3ccba5c12173ff5944ebea246 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Mon, 27 Nov 2023 02:48:34 -0500 Subject: change up set status dialog --- res/css/bare.css | 8 ++++++++ src/dialogs/setstatus.cpp | 41 ++++++++++++++++++++++++++++------------- src/dialogs/setstatus.hpp | 4 +--- 3 files changed, 37 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/res/css/bare.css b/res/css/bare.css index e3d1bb1..19c65f0 100644 --- a/res/css/bare.css +++ b/res/css/bare.css @@ -117,3 +117,11 @@ border: 1px solid #5865f2; background-color: rgba(89, 102, 242, 0.5); } + +.set-status-dialog .dialog-vbox { + padding: 5px; +} + +.set-status-dialog .dialog-action-area { + margin: 10px 5px 5px 5px; +} diff --git a/src/dialogs/setstatus.cpp b/src/dialogs/setstatus.cpp index 7a3a038..24f0b29 100644 --- a/src/dialogs/setstatus.cpp +++ b/src/dialogs/setstatus.cpp @@ -1,17 +1,31 @@ #include "setstatus.hpp" +static const std::array feelings = { + "wonderful", + "splendiferous", + "delicious", + "outstanding", + "amazing", + "great", + "marvelous", + "superb", + "out of this world", + "stupendous", + "tip-top", + "horrible", +}; + SetStatusDialog::SetStatusDialog(Gtk::Window &parent) : Gtk::Dialog("Set Status", parent, true) , m_layout(Gtk::ORIENTATION_VERTICAL) - , m_bottom(Gtk::ORIENTATION_HORIZONTAL) , m_ok("OK") - , m_cancel("Cancel") - , m_bbox(Gtk::ORIENTATION_HORIZONTAL) { - set_default_size(300, 50); + , m_cancel("Cancel") { + set_default_size(350, 200); get_style_context()->add_class("app-window"); get_style_context()->add_class("app-popup"); + get_style_context()->add_class("set-status-dialog"); - m_text.set_placeholder_text("Status text"); + m_text.set_placeholder_text("I feel " + Glib::ustring(feelings[rand() % feelings.size()]) + "!"); m_status_combo.append("online", "Online"); m_status_combo.append("dnd", "Do Not Disturb"); @@ -35,16 +49,17 @@ SetStatusDialog::SetStatusDialog(Gtk::Window &parent) response(Gtk::RESPONSE_CANCEL); }); - m_bbox.pack_start(m_ok, Gtk::PACK_SHRINK); - m_bbox.pack_start(m_cancel, Gtk::PACK_SHRINK); - m_bbox.set_layout(Gtk::BUTTONBOX_END); + m_layout.pack_start(*Gtk::make_managed("How are you, " + Abaddon::Get().GetDiscordClient().GetUserData().GetDisplayName() + "?", Gtk::ALIGN_START)); + m_layout.pack_start(m_text); + m_layout.pack_start(*Gtk::make_managed("Status", Gtk::ALIGN_START)); + m_layout.pack_start(m_status_combo); + m_layout.pack_start(*Gtk::make_managed("Activity", Gtk::ALIGN_START)); + m_layout.pack_start(m_type_combo); - m_bottom.add(m_status_combo); - m_bottom.add(m_type_combo); - m_bottom.add(m_bbox); - m_layout.add(m_text); - m_layout.add(m_bottom); get_content_area()->add(m_layout); + get_action_area()->pack_start(m_ok, Gtk::PACK_SHRINK); + get_action_area()->pack_start(m_cancel, Gtk::PACK_SHRINK); + get_action_area()->set_layout(Gtk::BUTTONBOX_START); show_all_children(); } diff --git a/src/dialogs/setstatus.hpp b/src/dialogs/setstatus.hpp index b0e6a4c..d4a015d 100644 --- a/src/dialogs/setstatus.hpp +++ b/src/dialogs/setstatus.hpp @@ -8,14 +8,12 @@ public: PresenceStatus GetStatusType() const; std::string GetActivityName() const; -protected: +private: Gtk::Box m_layout; - Gtk::Box m_bottom; Gtk::Entry m_text; Gtk::ComboBoxText m_status_combo; Gtk::ComboBoxText m_type_combo; Gtk::Button m_ok; Gtk::Button m_cancel; - Gtk::ButtonBox m_bbox; }; -- cgit v1.2.3 From 840eaa782463bda6d5ad4507c76c151bae8cbc51 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Tue, 28 Nov 2023 01:36:09 -0500 Subject: remove low priority css file --- src/abaddon.cpp | 11 ----------- src/abaddon.hpp | 1 - 2 files changed, 12 deletions(-) (limited to 'src') diff --git a/src/abaddon.cpp b/src/abaddon.cpp index 6557182..c8b294e 100644 --- a/src/abaddon.cpp +++ b/src/abaddon.cpp @@ -191,13 +191,6 @@ int Abaddon::StartGTK() { dlg.run(); }); - m_css_low_provider = Gtk::CssProvider::create(); - m_css_low_provider->signal_parsing_error().connect([](const Glib::RefPtr §ion, const Glib::Error &error) { - Gtk::MessageDialog dlg("low-priority css failed parsing (" + error.what() + ")", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); - dlg.set_position(Gtk::WIN_POS_CENTER); - dlg.run(); - }); - #ifdef _WIN32 bool png_found = false; bool gif_found = false; @@ -1086,10 +1079,6 @@ void Abaddon::ActionReloadCSS() { Gtk::StyleContext::remove_provider_for_screen(Gdk::Screen::get_default(), m_css_provider); m_css_provider->load_from_path(GetCSSPath("/" + GetSettings().MainCSS)); Gtk::StyleContext::add_provider_for_screen(Gdk::Screen::get_default(), m_css_provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - - Gtk::StyleContext::remove_provider_for_screen(Gdk::Screen::get_default(), m_css_low_provider); - m_css_low_provider->load_from_path(GetCSSPath("/application-low-priority.css")); - Gtk::StyleContext::add_provider_for_screen(Gdk::Screen::get_default(), m_css_low_provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION - 1); } catch (Glib::Error &e) { Gtk::MessageDialog dlg(*m_main_window, "css failed to load (" + e.what() + ")", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); dlg.set_position(Gtk::WIN_POS_CENTER); diff --git a/src/abaddon.hpp b/src/abaddon.hpp index 85b2fa0..6093523 100644 --- a/src/abaddon.hpp +++ b/src/abaddon.hpp @@ -182,7 +182,6 @@ private: mutable std::mutex m_mutex; Glib::RefPtr m_gtk_app; Glib::RefPtr m_css_provider; - Glib::RefPtr m_css_low_provider; // registered with a lower priority to allow better customization Glib::RefPtr m_tray; std::unique_ptr m_main_window; // wah wah cant create a gtkstylecontext fuck you -- cgit v1.2.3 From 14317bb513846a57034ecd21187a81fd2e861e85 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Fri, 1 Dec 2023 02:00:08 -0500 Subject: tweak voice settings window ui --- res/css/main.css | 8 ++++++++ src/windows/voicesettingswindow.cpp | 20 ++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/res/css/main.css b/res/css/main.css index 19c65f0..95cab3e 100644 --- a/res/css/main.css +++ b/res/css/main.css @@ -125,3 +125,11 @@ .set-status-dialog .dialog-action-area { margin: 10px 5px 5px 5px; } + +.voice-settings-window > box { + padding: 5px; +} + +.voice-settings-window scale { + margin-right: 8px; +} diff --git a/src/windows/voicesettingswindow.cpp b/src/windows/voicesettingswindow.cpp index 97f77b5..1a112f5 100644 --- a/src/windows/voicesettingswindow.cpp +++ b/src/windows/voicesettingswindow.cpp @@ -12,6 +12,7 @@ VoiceSettingsWindow::VoiceSettingsWindow() : m_main(Gtk::ORIENTATION_VERTICAL) { get_style_context()->add_class("app-window"); + get_style_context()->add_class("voice-settings-window"); set_default_size(300, 300); m_encoding_mode.append("Voice"); @@ -115,10 +116,21 @@ VoiceSettingsWindow::VoiceSettingsWindow() m_signal_gain.emit(m_gain.get_value() / 100.0); }); - m_main.add(m_encoding_mode); - m_main.add(m_signal); - m_main.add(m_bitrate); - m_main.add(m_gain); + auto *layout = Gtk::make_managed(); + auto *labels = Gtk::make_managed(); + auto *widgets = Gtk::make_managed(); + layout->pack_start(*labels, false, true, 5); + layout->pack_start(*widgets); + labels->pack_start(*Gtk::make_managed("Coding Mode", Gtk::ALIGN_END)); + labels->pack_start(*Gtk::make_managed("Signal Hint", Gtk::ALIGN_END)); + labels->pack_start(*Gtk::make_managed("Bitrate", Gtk::ALIGN_END)); + labels->pack_start(*Gtk::make_managed("Gain", Gtk::ALIGN_END)); + widgets->pack_start(m_encoding_mode); + widgets->pack_start(m_signal); + widgets->pack_start(m_bitrate); + widgets->pack_start(m_gain); + + m_main.add(*layout); add(m_main); show_all_children(); -- cgit v1.2.3 From 8fc83f6a54e8ac811d12dd9b4ddb3f9419ebf314 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sat, 2 Dec 2023 21:51:30 -0500 Subject: fix build number fetch again :DDD --- src/startup.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/startup.cpp b/src/startup.cpp index 1bfd9a4..b6d09a3 100644 --- a/src/startup.cpp +++ b/src/startup.cpp @@ -29,7 +29,7 @@ std::optional> ParseCookie(const Glib::ustri } std::optional GetJavascriptFileFromAppPage(const Glib::ustring &contents) { - auto regex = Glib::Regex::create(R"(/assets/\w{20}.js)"); + auto regex = Glib::Regex::create(R"(/assets/\w+\.?\w{20}\.js)"); std::vector matches; // regex->match_all doesnt work for some reason @@ -43,8 +43,8 @@ std::optional GetJavascriptFileFromAppPage(const Glib::ustring &c start_position += str.size(); } - if (matches.size() >= 2) { - return matches[matches.size() - 2]; + if (matches.size() >= 10) { + return matches[matches.size() - 10]; } return {}; -- cgit v1.2.3 From 6b436918f8b9a96a2dcde7c61b440bc8a774fbbf Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Mon, 4 Dec 2023 01:48:49 -0500 Subject: fetch DoesMentionEveryone from store --- src/discord/store.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/discord/store.cpp b/src/discord/store.cpp index 817f71f..0e1ba48 100644 --- a/src/discord/store.cpp +++ b/src/discord/store.cpp @@ -975,7 +975,7 @@ Message Store::GetMessageBound(std::unique_ptr &s) const { s->Get(5, r.Timestamp); s->Get(6, r.EditedTimestamp); // s->Get(7, r.IsTTS); - // s->Get(8, r.DoesMentionEveryone); + s->Get(8, r.DoesMentionEveryone); s->GetJSON(9, r.Embeds); s->Get(10, r.IsPinned); s->Get(11, r.WebhookID); -- cgit v1.2.3 From 260fc2a745afd4dca4e628e6c407b7757dbcf5f0 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Mon, 4 Dec 2023 01:50:16 -0500 Subject: show @ in reply markup if reply is a mention --- src/components/chatmessage.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/components/chatmessage.cpp b/src/components/chatmessage.cpp index d884077..6eccba2 100644 --- a/src/components/chatmessage.cpp +++ b/src/components/chatmessage.cpp @@ -661,7 +661,12 @@ Gtk::Widget *ChatMessageItemContainer::CreateReplyComponent(const Message &data) if (role.has_value()) { const auto author = discord.GetUser(author_id); if (author.has_value()) { - return "Color) + "\">" + author->GetDisplayNameEscaped(guild_id) + ""; + const auto is_mention = !data.Interaction.has_value() && data.DoesMention(author_id); + if (is_mention) { + return "Color) + "\">@" + author->GetDisplayNameEscaped(guild_id) + ""; + } else { + return "Color) + "\">" + author->GetDisplayNameEscaped(guild_id) + ""; + } } } } @@ -717,16 +722,12 @@ Gtk::Widget *ChatMessageItemContainer::CreateReplyComponent(const Message &data) HandleChannelMentions(buf); text = Glib::Markup::escape_text(buf->get_text()); } - // getting markup out of a textbuffer seems like something that to me should be really simple - // but actually is horribly annoying. replies won't have mention colors because you can't do this - // also no emojis because idk how to make a textview act like a label - // which of course would not be an issue if i could figure out how to get fonts to work on this god-forsaken framework - // oh well - // but ill manually get colors for the user who is being replied to - if (referenced.GuildID.has_value()) + + if (referenced.GuildID.has_value()) { lbl->set_markup(get_author_markup(referenced.Author.ID, *referenced.GuildID) + ": " + text); - else + } else { lbl->set_markup(get_author_markup(referenced.Author.ID) + ": " + text); + } } } else { lbl->set_markup("reply unavailable"); -- cgit v1.2.3 From e21b678220ce6ca7712a46ee9fe674320e148bab Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Mon, 4 Dec 2023 20:19:02 -0500 Subject: get link color from theme --- src/components/chatmessage.cpp | 5 +++-- src/settings.cpp | 2 -- src/settings.hpp | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/components/chatmessage.cpp b/src/components/chatmessage.cpp index d884077..4b195aa 100644 --- a/src/components/chatmessage.cpp +++ b/src/components/chatmessage.cpp @@ -361,7 +361,7 @@ Gtk::Widget *ChatMessageItemContainer::CreateEmbedComponent(const EmbedData &emb } return false; }); - static auto color = Abaddon::Get().GetSettings().LinkColor; + const auto color = title_label->get_style_context()->get_color(Gtk::STATE_FLAG_LINK); title_label->override_color(Gdk::RGBA(color)); title_label->set_markup("" + Glib::Markup::escape_text(*embed.Title) + ""); } @@ -852,7 +852,8 @@ void ChatMessageItemContainer::HandleLinks(Gtk::TextView &tv) { std::string link = match.fetch(0); auto tag = buf->create_tag(); m_link_tagmap[tag] = link; - tag->property_foreground_rgba() = Gdk::RGBA(Abaddon::Get().GetSettings().LinkColor); + const auto color = tv.get_style_context()->get_color(Gtk::STATE_FLAG_LINK); + tag->property_foreground_rgba() = color; tag->set_property("underline", 1); // stupid workaround for vcpkg bug (i think) const auto chars_start = g_utf8_pointer_to_offset(text.c_str(), text.c_str() + mstart); diff --git a/src/settings.cpp b/src/settings.cpp index c824a34..368d5bb 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -68,7 +68,6 @@ void SettingsManager::ReadSettings() { SMINT("http", "concurrent", CacheHTTPConcurrency); SMSTR("http", "user_agent", UserAgent); SMSTR("style", "expandercolor", ChannelsExpanderColor); - SMSTR("style", "linkcolor", LinkColor); SMSTR("style", "nsfwchannelcolor", NSFWChannelColor); SMSTR("style", "channelcolor", ChannelColor); SMSTR("style", "mentionbadgecolor", MentionBadgeColor); @@ -159,7 +158,6 @@ void SettingsManager::Close() { SMINT("http", "concurrent", CacheHTTPConcurrency); SMSTR("http", "user_agent", UserAgent); SMSTR("style", "expandercolor", ChannelsExpanderColor); - SMSTR("style", "linkcolor", LinkColor); SMSTR("style", "nsfwchannelcolor", NSFWChannelColor); SMSTR("style", "channelcolor", ChannelColor); SMSTR("style", "mentionbadgecolor", MentionBadgeColor); diff --git a/src/settings.hpp b/src/settings.hpp index 037233b..67ba515 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -39,7 +39,6 @@ public: // [style] // TODO: convert to StyleProperty... or maybe not? i still cant figure out what the "correct" method is for this - std::string LinkColor { "rgba(40, 200, 180, 255)" }; std::string ChannelsExpanderColor { "rgba(255, 83, 112, 255)" }; std::string NSFWChannelColor { "#ed6666" }; std::string ChannelColor { "#fbfbfb" }; -- cgit v1.2.3 From 8324172a90752403edcec2203a2abb386046cc8f Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Thu, 7 Dec 2023 21:53:05 -0500 Subject: hide progress bar when not actually mid-upload --- src/components/chatwindow.cpp | 10 ++++++++-- src/components/progressbar.cpp | 19 ++++++++++++++++++- src/components/progressbar.hpp | 11 +++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/components/chatwindow.cpp b/src/components/chatwindow.cpp index aeed4ed..9a2493d 100644 --- a/src/components/chatwindow.cpp +++ b/src/components/chatwindow.cpp @@ -5,7 +5,7 @@ #include "chatlist.hpp" #include "constants.hpp" #ifdef WITH_LIBHANDY - #include "channeltabswitcherhandy.hpp" +#include "channeltabswitcherhandy.hpp" #endif ChatWindow::ChatWindow() { @@ -109,7 +109,13 @@ ChatWindow::ChatWindow() { m_main->add(*m_meta); m_main->add(m_progress); - m_progress.show(); + m_progress.signal_start().connect([this]() { + m_progress.show(); + }); + + m_progress.signal_stop().connect([this]() { + m_progress.hide(); + }); m_main->show(); } diff --git a/src/components/progressbar.cpp b/src/components/progressbar.cpp index 75f86bb..65abfae 100644 --- a/src/components/progressbar.cpp +++ b/src/components/progressbar.cpp @@ -5,12 +5,19 @@ MessageUploadProgressBar::MessageUploadProgressBar() { auto &discord = Abaddon::Get().GetDiscordClient(); discord.signal_message_progress().connect([this](const std::string &nonce, float percent) { if (nonce == m_last_nonce) { + if (!m_active) { + m_active = true; + m_signal_start.emit(); + } set_fraction(percent); } }); discord.signal_message_send_fail().connect([this](const std::string &nonce, float) { - if (nonce == m_last_nonce) + if (nonce == m_last_nonce) { set_fraction(0.0); + m_active = false; + m_signal_stop.emit(); + } }); discord.signal_message_create().connect([this](const Message &msg) { if (msg.IsPending) { @@ -18,6 +25,16 @@ MessageUploadProgressBar::MessageUploadProgressBar() { } else if (msg.Nonce.has_value() && (*msg.Nonce == m_last_nonce)) { m_last_nonce = ""; set_fraction(0.0); + m_active = false; + m_signal_stop.emit(); } }); } + +MessageUploadProgressBar::type_signal_start MessageUploadProgressBar::signal_start() { + return m_signal_start; +} + +MessageUploadProgressBar::type_signal_stop MessageUploadProgressBar::signal_stop() { + return m_signal_stop; +} diff --git a/src/components/progressbar.hpp b/src/components/progressbar.hpp index 483ee47..8efb87a 100644 --- a/src/components/progressbar.hpp +++ b/src/components/progressbar.hpp @@ -6,5 +6,16 @@ public: MessageUploadProgressBar(); private: + bool m_active = false; std::string m_last_nonce; + + using type_signal_start = sigc::signal; + using type_signal_stop = sigc::signal; + + type_signal_start m_signal_start; + type_signal_stop m_signal_stop; + +public: + type_signal_start signal_start(); + type_signal_stop signal_stop(); }; -- cgit v1.2.3 From 23bf237e4e7dd008df8ff32da31878d1b990f5bf Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Wed, 13 Dec 2023 21:59:45 -0500 Subject: view image alt text on hover --- src/components/chatmessage.cpp | 3 +++ src/discord/message.cpp | 2 ++ src/discord/message.hpp | 5 +++-- src/discord/store.cpp | 5 ++++- 4 files changed, 12 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/components/chatmessage.cpp b/src/components/chatmessage.cpp index 6eccba2..2c2f9dd 100644 --- a/src/components/chatmessage.cpp +++ b/src/components/chatmessage.cpp @@ -46,6 +46,9 @@ ChatMessageItemContainer *ChatMessageItemContainer::FromMessage(const Message &d for (const auto &a : data.Attachments) { if (IsURLViewableImage(a.ProxyURL) && a.Width.has_value() && a.Height.has_value()) { auto *widget = container->CreateImageComponent(a.ProxyURL, a.URL, *a.Width, *a.Height); + if (a.Description.has_value()) { + widget->set_tooltip_text(*a.Description); + } container->m_main.add(*widget); } else { auto *widget = container->CreateAttachmentComponent(a); diff --git a/src/discord/message.cpp b/src/discord/message.cpp index bc4c6c8..8a0e271 100644 --- a/src/discord/message.cpp +++ b/src/discord/message.cpp @@ -128,6 +128,7 @@ void to_json(nlohmann::json &j, const AttachmentData &m) { j["proxy_url"] = m.ProxyURL; JS_IF("height", m.Height); JS_IF("width", m.Width); + JS_IF("description", m.Description); } void from_json(const nlohmann::json &j, AttachmentData &m) { @@ -138,6 +139,7 @@ void from_json(const nlohmann::json &j, AttachmentData &m) { JS_D("proxy_url", m.ProxyURL); JS_ON("height", m.Height); JS_ON("width", m.Width); + JS_ON("description", m.Description); } void from_json(const nlohmann::json &j, MessageReferenceData &m) { diff --git a/src/discord/message.hpp b/src/discord/message.hpp index b71c158..1e836d0 100644 --- a/src/discord/message.hpp +++ b/src/discord/message.hpp @@ -168,8 +168,9 @@ struct AttachmentData { int Bytes; std::string URL; std::string ProxyURL; - std::optional Height; // null - std::optional Width; // null + std::optional Height; // null + std::optional Width; // null + std::optional Description; // alt text friend void to_json(nlohmann::json &j, const AttachmentData &m); friend void from_json(const nlohmann::json &j, AttachmentData &m); diff --git a/src/discord/store.cpp b/src/discord/store.cpp index 0e1ba48..bf630aa 100644 --- a/src/discord/store.cpp +++ b/src/discord/store.cpp @@ -368,6 +368,7 @@ void Store::SetMessage(Snowflake id, const Message &message) { s->Bind(6, a.ProxyURL); s->Bind(7, a.Height); s->Bind(8, a.Width); + s->Bind(9, a.Description); if (!s->Insert()) fprintf(stderr, "message attachment insert failed for %" PRIu64 "/%" PRIu64 ": %s\n", static_cast(id), static_cast(a.ID), m_db.ErrStr()); s->Reset(); @@ -1021,6 +1022,7 @@ Message Store::GetMessageBound(std::unique_ptr &s) const { s->Get(5, q.ProxyURL); s->Get(6, q.Height); s->Get(7, q.Width); + s->Get(8, q.Description); } s->Reset(); } @@ -1509,6 +1511,7 @@ bool Store::CreateTables() { proxy TEXT NOT NULL, height INTEGER, width INTEGER, + description TEXT, PRIMARY KEY(message, id) ) )"; @@ -2212,7 +2215,7 @@ bool Store::CreateStatements() { m_stmt_set_attachment = std::make_unique(m_db, R"( REPLACE INTO attachments VALUES ( - ?, ?, ?, ?, ?, ?, ?, ? + ?, ?, ?, ?, ?, ?, ?, ?, ? ) )"); if (!m_stmt_set_attachment->OK()) { -- cgit v1.2.3 From 4bce7b7523caa26023b1a2f5e02e6646ed29f5e0 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Fri, 15 Dec 2023 01:16:11 -0500 Subject: add ability to set image alt text (closes #253) --- src/components/chatinput.cpp | 21 ++++++++++++++++++++- src/components/chatinput.hpp | 14 ++++++++++---- src/discord/chatsubmitparams.hpp | 2 ++ src/discord/discord.cpp | 10 ++++++++-- src/discord/objects.cpp | 6 ++++++ src/discord/objects.hpp | 8 ++++++++ 6 files changed, 54 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/components/chatinput.cpp b/src/components/chatinput.cpp index c802413..10896fb 100644 --- a/src/components/chatinput.cpp +++ b/src/components/chatinput.cpp @@ -295,7 +295,7 @@ std::vector ChatInputAttachmentContainer::GetAttac for (auto *x : m_attachments) { if (!x->GetFile()->query_exists()) puts("bad!"); - ret.push_back({ x->GetFile(), x->GetType(), x->GetFilename() }); + ret.push_back({ x->GetFile(), x->GetType(), x->GetFilename(), x->GetDescription() }); } return ret; } @@ -343,6 +343,7 @@ ChatInputAttachmentItem::ChatInputAttachmentItem(const Glib::RefPtr & , m_img(Gtk::make_managed()) , m_type(is_extant ? ChatSubmitParams::ExtantFile : ChatSubmitParams::PastedImage) , m_filename("unknown.png") + , m_is_image(true) , m_label("unknown.png") , m_box(Gtk::ORIENTATION_VERTICAL) { get_style_context()->add_class("attachment-item"); @@ -389,10 +390,18 @@ std::string ChatInputAttachmentItem::GetFilename() const { return m_filename; } +std::optional ChatInputAttachmentItem::GetDescription() const { + return m_description.empty() ? std::nullopt : std::optional(m_description); +} + bool ChatInputAttachmentItem::IsTemp() const noexcept { return m_type == ChatSubmitParams::PastedImage; } +bool ChatInputAttachmentItem::IsImage() const noexcept { + return m_is_image; +} + void ChatInputAttachmentItem::RemoveIfTemp() { if (IsTemp()) m_file->remove(); @@ -420,12 +429,22 @@ void ChatInputAttachmentItem::SetupMenu() { } }); + m_menu_set_alt_text.set_label("Change Alt-Text"); + m_menu_set_alt_text.signal_activate().connect([this]() { + const auto description = Abaddon::Get().ShowTextPrompt("Enter description (alt-text) for attachment", "Enter alt-text", m_description); + if (description.has_value()) { + m_description = *description; + } + }); + m_menu.add(m_menu_set_filename); + m_menu.add(m_menu_set_alt_text); m_menu.add(m_menu_remove); m_menu.show_all(); signal_button_press_event().connect([this](GdkEventButton *ev) -> bool { if (ev->button == GDK_BUTTON_SECONDARY) { + m_menu_set_alt_text.set_visible(IsImage()); m_menu.popup_at_pointer(reinterpret_cast(ev)); return true; } diff --git a/src/components/chatinput.hpp b/src/components/chatinput.hpp index a3c9742..be8c141 100644 --- a/src/components/chatinput.hpp +++ b/src/components/chatinput.hpp @@ -7,10 +7,13 @@ public: ChatInputAttachmentItem(const Glib::RefPtr &file); ChatInputAttachmentItem(const Glib::RefPtr &file, const Glib::RefPtr &pb, bool is_extant = false); - [[nodiscard]] Glib::RefPtr GetFile() const; - [[nodiscard]] ChatSubmitParams::AttachmentType GetType() const; - [[nodiscard]] std::string GetFilename() const; - [[nodiscard]] bool IsTemp() const noexcept; + Glib::RefPtr GetFile() const; + ChatSubmitParams::AttachmentType GetType() const; + std::string GetFilename() const; + std::optional GetDescription() const; + bool IsTemp() const noexcept; + bool IsImage() const noexcept; + void RemoveIfTemp(); private: @@ -21,6 +24,7 @@ private: Gtk::Menu m_menu; Gtk::MenuItem m_menu_remove; Gtk::MenuItem m_menu_set_filename; + Gtk::MenuItem m_menu_set_alt_text; Gtk::Box m_box; Gtk::Label m_label; @@ -29,6 +33,8 @@ private: Glib::RefPtr m_file; ChatSubmitParams::AttachmentType m_type; std::string m_filename; + std::string m_description; + bool m_is_image = false; private: using type_signal_item_removed = sigc::signal; diff --git a/src/discord/chatsubmitparams.hpp b/src/discord/chatsubmitparams.hpp index e195189..45fbb2a 100644 --- a/src/discord/chatsubmitparams.hpp +++ b/src/discord/chatsubmitparams.hpp @@ -1,4 +1,5 @@ #pragma once +#include #include #include #include @@ -15,6 +16,7 @@ struct ChatSubmitParams { Glib::RefPtr File; AttachmentType Type; std::string Filename; + std::optional Description; }; bool Silent = false; diff --git a/src/discord/discord.cpp b/src/discord/discord.cpp index 0618e72..ac7e2f2 100644 --- a/src/discord/discord.cpp +++ b/src/discord/discord.cpp @@ -518,6 +518,7 @@ void DiscordClient::SendChatMessageAttachments(const ChatSubmitParams ¶ms, c CreateMessageObject obj; obj.Content = params.Message; obj.Nonce = nonce; + obj.Attachments.emplace(); if (params.Silent) { obj.Flags |= MessageFlags::SUPPRESS_NOTIFICATIONS; } @@ -541,11 +542,16 @@ void DiscordClient::SendChatMessageAttachments(const ChatSubmitParams ¶ms, c m_generic_dispatch.emit(); }); req.make_form(); - req.add_field("payload_json", nlohmann::json(obj).dump().c_str(), CURL_ZERO_TERMINATED); + for (size_t i = 0; i < params.Attachments.size(); i++) { + auto &attachment = params.Attachments.at(i); const auto field_name = "files[" + std::to_string(i) + "]"; - req.add_file(field_name, params.Attachments.at(i).File, params.Attachments.at(i).Filename); + req.add_file(field_name, attachment.File, attachment.Filename); + obj.Attachments->push_back({ static_cast(i), attachment.Description }); } + + req.add_field("payload_json", nlohmann::json(obj).dump().c_str(), CURL_ZERO_TERMINATED); + m_http.Execute(std::move(req), [this, params, nonce, callback](const http::response_type &res) { for (const auto &attachment : params.Attachments) { if (attachment.Type == ChatSubmitParams::AttachmentType::PastedImage) { diff --git a/src/discord/objects.cpp b/src/discord/objects.cpp index 4ad17c3..804f10d 100644 --- a/src/discord/objects.cpp +++ b/src/discord/objects.cpp @@ -306,9 +306,15 @@ void to_json(nlohmann::json &j, const HeartbeatMessage &m) { j["d"] = m.Sequence; } +void to_json(nlohmann::json &j, const CreateMessageAttachmentObject &m) { + j["id"] = m.ID; + JS_IF("description", m.Description); +} + void to_json(nlohmann::json &j, const CreateMessageObject &m) { j["content"] = m.Content; j["flags"] = m.Flags; + JS_IF("attachments", m.Attachments); JS_IF("message_reference", m.MessageReference); JS_IF("nonce", m.Nonce); } diff --git a/src/discord/objects.hpp b/src/discord/objects.hpp index 603a9c7..dfe99f0 100644 --- a/src/discord/objects.hpp +++ b/src/discord/objects.hpp @@ -433,11 +433,19 @@ struct HeartbeatMessage : GatewayMessage { friend void to_json(nlohmann::json &j, const HeartbeatMessage &m); }; +struct CreateMessageAttachmentObject { + int ID; + std::optional Description; + + friend void to_json(nlohmann::json &j, const CreateMessageAttachmentObject &m); +}; + struct CreateMessageObject { std::string Content; MessageFlags Flags = MessageFlags::NONE; std::optional MessageReference; std::optional Nonce; + std::optional> Attachments; friend void to_json(nlohmann::json &j, const CreateMessageObject &m); }; -- cgit v1.2.3 From 5ea80d1a147c445468293277a517558e727dd4f9 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Fri, 15 Dec 2023 20:46:36 -0500 Subject: use selected bg for expander color --- src/components/channelscellrenderer.cpp | 102 +++++++++----------------------- 1 file changed, 29 insertions(+), 73 deletions(-) (limited to 'src') diff --git a/src/components/channelscellrenderer.cpp b/src/components/channelscellrenderer.cpp index 35c6137..bbe19e7 100644 --- a/src/components/channelscellrenderer.cpp +++ b/src/components/channelscellrenderer.cpp @@ -18,6 +18,32 @@ void AddUnreadIndicator(const Cairo::RefPtr &cr, const Gdk::Rect cr->fill(); } +void RenderExpander(int x_offset, const Cairo::RefPtr &cr, Gtk::Widget &widget, const Gdk::Rectangle &background_area, bool is_expanded) { + constexpr static int len = 5; + int x1, y1, x2, y2, x3, y3; + if (is_expanded) { + x1 = background_area.get_x() + x_offset; + y1 = background_area.get_y() + background_area.get_height() / 2 - len; + x2 = background_area.get_x() + x_offset + len; + y2 = background_area.get_y() + background_area.get_height() / 2 + len; + x3 = background_area.get_x() + x_offset + len * 2; + y3 = background_area.get_y() + background_area.get_height() / 2 - len; + } else { + x1 = background_area.get_x() + x_offset; + y1 = background_area.get_y() + background_area.get_height() / 2 - len; + x2 = background_area.get_x() + x_offset + len * 2; + y2 = background_area.get_y() + background_area.get_height() / 2; + x3 = background_area.get_x() + x_offset; + y3 = background_area.get_y() + background_area.get_height() / 2 + len; + } + cr->move_to(x1, y1); + cr->line_to(x2, y2); + cr->line_to(x3, y3); + const auto expander_color = widget.get_style_context()->get_background_color(Gtk::STATE_FLAG_SELECTED); + cr->set_source_rgb(expander_color.get_red(), expander_color.get_green(), expander_color.get_blue()); + cr->stroke(); +} + CellRendererChannels::CellRendererChannels() : Glib::ObjectBase(typeid(CellRendererChannels)) , Gtk::CellRenderer() @@ -218,30 +244,7 @@ void CellRendererChannels::get_preferred_height_for_width_vfunc_folder(Gtk::Widg } void CellRendererChannels::render_vfunc_folder(const Cairo::RefPtr &cr, Gtk::Widget &widget, const Gdk::Rectangle &background_area, const Gdk::Rectangle &cell_area, Gtk::CellRendererState flags) { - constexpr static int len = 5; - int x1, y1, x2, y2, x3, y3; - if (property_expanded()) { - x1 = background_area.get_x() + 7; - y1 = background_area.get_y() + background_area.get_height() / 2 - len; - x2 = background_area.get_x() + 7 + len; - y2 = background_area.get_y() + background_area.get_height() / 2 + len; - x3 = background_area.get_x() + 7 + len * 2; - y3 = background_area.get_y() + background_area.get_height() / 2 - len; - } else { - x1 = background_area.get_x() + 7; - y1 = background_area.get_y() + background_area.get_height() / 2 - len; - x2 = background_area.get_x() + 7 + len * 2; - y2 = background_area.get_y() + background_area.get_height() / 2; - x3 = background_area.get_x() + 7; - y3 = background_area.get_y() + background_area.get_height() / 2 + len; - } - cr->move_to(x1, y1); - cr->line_to(x2, y2); - cr->line_to(x3, y3); - const auto expander_color = Gdk::RGBA(Abaddon::Get().GetSettings().ChannelsExpanderColor); - cr->set_source_rgb(expander_color.get_red(), expander_color.get_green(), expander_color.get_blue()); - cr->stroke(); - + RenderExpander(7, cr, widget, background_area, property_expanded()); Gtk::Requisition text_minimum, text_natural; m_renderer_text.get_preferred_size(widget, text_minimum, text_natural); @@ -417,30 +420,7 @@ void CellRendererChannels::get_preferred_height_for_width_vfunc_category(Gtk::Wi } void CellRendererChannels::render_vfunc_category(const Cairo::RefPtr &cr, Gtk::Widget &widget, const Gdk::Rectangle &background_area, const Gdk::Rectangle &cell_area, Gtk::CellRendererState flags) { - // todo: figure out how Gtk::Arrow is rendered because i like it better :^) - constexpr static int len = 5; - int x1, y1, x2, y2, x3, y3; - if (property_expanded()) { - x1 = background_area.get_x() + 7; - y1 = background_area.get_y() + background_area.get_height() / 2 - len; - x2 = background_area.get_x() + 7 + len; - y2 = background_area.get_y() + background_area.get_height() / 2 + len; - x3 = background_area.get_x() + 7 + len * 2; - y3 = background_area.get_y() + background_area.get_height() / 2 - len; - } else { - x1 = background_area.get_x() + 7; - y1 = background_area.get_y() + background_area.get_height() / 2 - len; - x2 = background_area.get_x() + 7 + len * 2; - y2 = background_area.get_y() + background_area.get_height() / 2; - x3 = background_area.get_x() + 7; - y3 = background_area.get_y() + background_area.get_height() / 2 + len; - } - cr->move_to(x1, y1); - cr->line_to(x2, y2); - cr->line_to(x3, y3); - const auto expander_color = Gdk::RGBA(Abaddon::Get().GetSettings().ChannelsExpanderColor); - cr->set_source_rgb(expander_color.get_red(), expander_color.get_green(), expander_color.get_blue()); - cr->stroke(); + RenderExpander(7, cr, widget, background_area, property_expanded()); Gtk::Requisition text_minimum, text_natural; m_renderer_text.get_preferred_size(widget, text_minimum, text_natural); @@ -668,31 +648,7 @@ void CellRendererChannels::render_vfunc_voice_channel(const Cairo::RefPtrshow_in_cairo_context(cr); - // expander - constexpr static int len = 5; - constexpr static int offset = 24; - int x1, y1, x2, y2, x3, y3; - if (property_expanded()) { - x1 = background_area.get_x() + offset; - y1 = background_area.get_y() + background_area.get_height() / 2 - len; - x2 = background_area.get_x() + offset + len; - y2 = background_area.get_y() + background_area.get_height() / 2 + len; - x3 = background_area.get_x() + offset + len * 2; - y3 = background_area.get_y() + background_area.get_height() / 2 - len; - } else { - x1 = background_area.get_x() + offset; - y1 = background_area.get_y() + background_area.get_height() / 2 - len; - x2 = background_area.get_x() + offset + len * 2; - y2 = background_area.get_y() + background_area.get_height() / 2; - x3 = background_area.get_x() + offset; - y3 = background_area.get_y() + background_area.get_height() / 2 + len; - } - cr->move_to(x1, y1); - cr->line_to(x2, y2); - cr->line_to(x3, y3); - const auto expander_color = Gdk::RGBA(Abaddon::Get().GetSettings().ChannelsExpanderColor); - cr->set_source_rgb(expander_color.get_red(), expander_color.get_green(), expander_color.get_blue()); - cr->stroke(); + RenderExpander(24, cr, widget, background_area, property_expanded()); } // voice participant -- cgit v1.2.3 From 19282c8642f5bc1c064a8f8645b2d5380d2014b4 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Fri, 15 Dec 2023 21:44:58 -0500 Subject: allow override expander color --- src/components/channelscellrenderer.cpp | 5 ++++- src/settings.hpp | 3 +-- 2 files changed, 5 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/components/channelscellrenderer.cpp b/src/components/channelscellrenderer.cpp index bbe19e7..3f10330 100644 --- a/src/components/channelscellrenderer.cpp +++ b/src/components/channelscellrenderer.cpp @@ -39,7 +39,10 @@ void RenderExpander(int x_offset, const Cairo::RefPtr &cr, Gtk:: cr->move_to(x1, y1); cr->line_to(x2, y2); cr->line_to(x3, y3); - const auto expander_color = widget.get_style_context()->get_background_color(Gtk::STATE_FLAG_SELECTED); + auto expander_color = Gdk::RGBA(Abaddon::Get().GetSettings().ChannelsExpanderColor); + if (expander_color.get_alpha_u() == 0) { + expander_color = widget.get_style_context()->get_background_color(Gtk::STATE_FLAG_SELECTED); + } cr->set_source_rgb(expander_color.get_red(), expander_color.get_green(), expander_color.get_blue()); cr->stroke(); } diff --git a/src/settings.hpp b/src/settings.hpp index 67ba515..a51d93b 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -38,8 +38,7 @@ public: std::string UserAgent { "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36" }; // [style] - // TODO: convert to StyleProperty... or maybe not? i still cant figure out what the "correct" method is for this - std::string ChannelsExpanderColor { "rgba(255, 83, 112, 255)" }; + std::string ChannelsExpanderColor { "rgba(255, 83, 112, 0)" }; std::string NSFWChannelColor { "#ed6666" }; std::string ChannelColor { "#fbfbfb" }; std::string MentionBadgeColor { "#b82525" }; -- cgit v1.2.3 From 0187e6958464f9a9d5c8bc1143d6dfac60e862b1 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Fri, 15 Dec 2023 22:06:16 -0500 Subject: remove channel color style setting --- src/components/channelscellrenderer.cpp | 57 ++------------------------------- src/settings.cpp | 2 -- src/settings.hpp | 1 - 3 files changed, 3 insertions(+), 57 deletions(-) (limited to 'src') diff --git a/src/components/channelscellrenderer.cpp b/src/components/channelscellrenderer.cpp index 3f10330..7fd97da 100644 --- a/src/components/channelscellrenderer.cpp +++ b/src/components/channelscellrenderer.cpp @@ -258,14 +258,11 @@ void CellRendererChannels::render_vfunc_folder(const Cairo::RefPtr(text_w), static_cast(text_h)); - static const auto color = Gdk::RGBA(Abaddon::Get().GetSettings().ChannelColor); - // m_renderer_text.property_foreground_rgba() = color; m_renderer_text.render(cr, widget, background_area, text_cell_area, flags); const bool hover_only = Abaddon::Get().GetSettings().AnimatedGuildHoverOnly; @@ -435,23 +430,14 @@ void CellRendererChannels::render_vfunc_category(const Cairo::RefPtr 0) { AddUnreadIndicator(cr, background_area); } - // m_renderer_text.property_foreground_rgba() = color; } m_renderer_text.render(cr, widget, background_area, text_cell_area, flags); - // m_renderer_text.property_foreground_set() = false; } // text channel @@ -487,20 +473,7 @@ void CellRendererChannels::render_vfunc_channel(const Cairo::RefPtrget_color(Gtk::STATE_FLAG_NORMAL); @@ -509,8 +482,6 @@ void CellRendererChannels::render_vfunc_channel(const Cairo::RefPtr & const auto id = m_property_id.get_value(); const bool is_muted = discord.IsChannelMuted(id); - static const auto color = Gdk::RGBA(Abaddon::Get().GetSettings().ChannelColor); - if (Abaddon::Get().GetDiscordClient().IsChannelMuted(m_property_id.get_value())) { - auto muted = color; - muted.set_red(muted.get_red() * 0.5); - muted.set_green(muted.get_green() * 0.5); - muted.set_blue(muted.get_blue() * 0.5); - // m_renderer_text.property_foreground_rgba() = muted; - } else { - // m_renderer_text.property_foreground_rgba() = color; - } m_renderer_text.render(cr, widget, background_area, text_cell_area, flags); - // m_renderer_text.property_foreground_set() = false; Gdk::Cairo::set_source_pixbuf(cr, m_property_pixbuf.get_value(), icon_x, icon_y); cr->rectangle(icon_x, icon_y, icon_w, icon_h); diff --git a/src/settings.cpp b/src/settings.cpp index 368d5bb..d1dff3f 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -69,7 +69,6 @@ void SettingsManager::ReadSettings() { SMSTR("http", "user_agent", UserAgent); SMSTR("style", "expandercolor", ChannelsExpanderColor); SMSTR("style", "nsfwchannelcolor", NSFWChannelColor); - SMSTR("style", "channelcolor", ChannelColor); SMSTR("style", "mentionbadgecolor", MentionBadgeColor); SMSTR("style", "mentionbadgetextcolor", MentionBadgeTextColor); SMSTR("style", "unreadcolor", UnreadIndicatorColor); @@ -159,7 +158,6 @@ void SettingsManager::Close() { SMSTR("http", "user_agent", UserAgent); SMSTR("style", "expandercolor", ChannelsExpanderColor); SMSTR("style", "nsfwchannelcolor", NSFWChannelColor); - SMSTR("style", "channelcolor", ChannelColor); SMSTR("style", "mentionbadgecolor", MentionBadgeColor); SMSTR("style", "mentionbadgetextcolor", MentionBadgeTextColor); SMSTR("style", "unreadcolor", UnreadIndicatorColor); diff --git a/src/settings.hpp b/src/settings.hpp index a51d93b..99e1adc 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -40,7 +40,6 @@ public: // [style] std::string ChannelsExpanderColor { "rgba(255, 83, 112, 0)" }; std::string NSFWChannelColor { "#ed6666" }; - std::string ChannelColor { "#fbfbfb" }; std::string MentionBadgeColor { "#b82525" }; std::string MentionBadgeTextColor { "#fbfbfb" }; std::string UnreadIndicatorColor { "#ffffff" }; -- cgit v1.2.3 From 618cd27d94a23a23674fe759bdc74f938ac3d6fe Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sat, 16 Dec 2023 20:01:56 -0500 Subject: draw nsfw channels red again --- src/components/channelscellrenderer.cpp | 10 +++++----- src/settings.hpp | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/components/channelscellrenderer.cpp b/src/components/channelscellrenderer.cpp index 7fd97da..d612812 100644 --- a/src/components/channelscellrenderer.cpp +++ b/src/components/channelscellrenderer.cpp @@ -475,11 +475,11 @@ void CellRendererChannels::render_vfunc_channel(const Cairo::RefPtrget_color(Gtk::STATE_FLAG_NORMAL); - color.set_alpha(0.6); - m_renderer_text.property_foreground_rgba() = color; - } + auto color = widget.get_style_context()->get_color(Gtk::STATE_FLAG_NORMAL); + if (property_nsfw()) color = nsfw_color; + if (is_muted) color.set_alpha(0.6); + + m_renderer_text.property_foreground_rgba() = color; m_renderer_text.render(cr, widget, background_area, text_cell_area, flags); m_renderer_text.property_foreground_set() = false; diff --git a/src/settings.hpp b/src/settings.hpp index 99e1adc..c51e635 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -39,7 +39,7 @@ public: // [style] std::string ChannelsExpanderColor { "rgba(255, 83, 112, 0)" }; - std::string NSFWChannelColor { "#ed6666" }; + std::string NSFWChannelColor { "#970d0d" }; std::string MentionBadgeColor { "#b82525" }; std::string MentionBadgeTextColor { "#fbfbfb" }; std::string UnreadIndicatorColor { "#ffffff" }; -- cgit v1.2.3 From 6d7ddcd42fd1de1f0ea3eda83e3c76f2d34b6a12 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sat, 16 Dec 2023 20:38:46 -0500 Subject: use background style colors for unread indicator and mention badges --- src/components/channelscellrenderer.cpp | 31 +++++++++++++++---------------- src/settings.hpp | 6 +++--- 2 files changed, 18 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/components/channelscellrenderer.cpp b/src/components/channelscellrenderer.cpp index d612812..bf84a9b 100644 --- a/src/components/channelscellrenderer.cpp +++ b/src/components/channelscellrenderer.cpp @@ -7,8 +7,11 @@ constexpr static double M_PI = 3.14159265358979; constexpr static double M_PI_H = M_PI / 2.0; constexpr static double M_PI_3_2 = M_PI * 3.0 / 2.0; -void AddUnreadIndicator(const Cairo::RefPtr &cr, const Gdk::Rectangle &background_area) { - static const auto color = Gdk::RGBA(Abaddon::Get().GetSettings().UnreadIndicatorColor); +void AddUnreadIndicator(const Cairo::RefPtr &cr, Gtk::Widget &widget, const Gdk::Rectangle &background_area) { + static const auto color_setting = Gdk::RGBA(Abaddon::Get().GetSettings().UnreadIndicatorColor); + + const auto color = color_setting.get_alpha_u() > 0 ? color_setting : widget.get_style_context()->get_background_color(Gtk::STATE_FLAG_SELECTED); + cr->set_source_rgb(color.get_red(), color.get_green(), color.get_blue()); const auto x = background_area.get_x(); const auto y = background_area.get_y(); @@ -387,7 +390,7 @@ void CellRendererChannels::render_vfunc_guild(const Cairo::RefPtr 0) { - AddUnreadIndicator(cr, background_area); + AddUnreadIndicator(cr, widget, background_area); } } m_renderer_text.render(cr, widget, background_area, text_cell_area, flags); @@ -490,7 +493,7 @@ void CellRendererChannels::render_vfunc_channel(const Cairo::RefPtrset_source_rgb(color.get_red(), color.get_green(), color.get_blue()); - const auto x = background_area.get_x(); - const auto y = background_area.get_y(); - const auto w = background_area.get_width(); - const auto h = background_area.get_height(); - cr->rectangle(x, y, 3, h); - cr->fill(); + AddUnreadIndicator(cr, widget, background_area); } if (unread_state < 1) return; @@ -830,7 +826,7 @@ void CellRendererChannels::render_vfunc_dm(const Cairo::RefPtr & if (unread_state < 0) return; if (!is_muted) { - AddUnreadIndicator(cr, background_area); + AddUnreadIndicator(cr, widget, background_area); } } @@ -857,8 +853,11 @@ void CellRendererChannels::unread_render_mentions(const Cairo::RefPtrget_pixel_size(width, height); { - static const auto bg = Gdk::RGBA(Abaddon::Get().GetSettings().MentionBadgeColor); - static const auto text = Gdk::RGBA(Abaddon::Get().GetSettings().MentionBadgeTextColor); + static const auto badge_setting = Gdk::RGBA(Abaddon::Get().GetSettings().MentionBadgeColor); + static const auto text_setting = Gdk::RGBA(Abaddon::Get().GetSettings().MentionBadgeTextColor); + + auto bg = badge_setting.get_alpha_u() > 0 ? badge_setting : widget.get_style_context()->get_background_color(Gtk::STATE_FLAG_SELECTED); + auto text = text_setting.get_alpha_u() > 0 ? text_setting : widget.get_style_context()->get_color(Gtk::STATE_FLAG_SELECTED); const auto x = cell_area.get_x() + edge - width - MentionsRightPad; const auto y = cell_area.get_y() + cell_area.get_height() / 2.0 - height / 2.0 - 1; diff --git a/src/settings.hpp b/src/settings.hpp index c51e635..419734c 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -40,9 +40,9 @@ public: // [style] std::string ChannelsExpanderColor { "rgba(255, 83, 112, 0)" }; std::string NSFWChannelColor { "#970d0d" }; - std::string MentionBadgeColor { "#b82525" }; - std::string MentionBadgeTextColor { "#fbfbfb" }; - std::string UnreadIndicatorColor { "#ffffff" }; + std::string MentionBadgeColor { "rgba(184, 37, 37, 0)" }; + std::string MentionBadgeTextColor { "rgba(251, 251, 251, 0)" }; + std::string UnreadIndicatorColor { "rgba(255, 255, 255, 0)" }; // [notifications] #ifdef _WIN32 -- cgit v1.2.3 From 8bae9277cc544f7c1078f40e0a9a155828b40dbe Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sun, 17 Dec 2023 01:12:43 -0500 Subject: add more logging to audio manager --- src/audio/manager.cpp | 48 +++++++++++++++++++++++++++++++++++++++--------- src/audio/manager.hpp | 4 ++++ 2 files changed, 43 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/audio/manager.cpp b/src/audio/manager.cpp index 0336699..955a5b9 100644 --- a/src/audio/manager.cpp +++ b/src/audio/manager.cpp @@ -8,7 +8,7 @@ #include "manager.hpp" #include #include -#include +#include #include #include #include @@ -61,9 +61,37 @@ void capture_data_callback(ma_device *pDevice, void *pOutput, const void *pInput mgr->m_rtp_timestamp += 480; } -AudioManager::AudioManager() { +void mgr_log_callback(void *pUserData, ma_uint32 level, const char *pMessage) { + auto *log = static_cast(pUserData); + + gchar *msg = g_strstrip(g_strdup(pMessage)); + + switch (level) { + case MA_LOG_LEVEL_DEBUG: + log->debug(msg); + break; + case MA_LOG_LEVEL_INFO: + log->info(msg); + break; + case MA_LOG_LEVEL_WARNING: + log->warn(msg); + break; + case MA_LOG_LEVEL_ERROR: + log->error(msg); + default: + break; + } + + g_free(msg); +} + +AudioManager::AudioManager() + : m_log(spdlog::stdout_color_mt("miniaudio")) { m_ok = true; + ma_log_init(nullptr, &m_ma_log); + ma_log_register_callback(&m_ma_log, ma_log_callback_init(mgr_log_callback, m_log.get())); + #ifdef WITH_RNNOISE RNNoiseInitialize(); #endif @@ -77,7 +105,9 @@ AudioManager::AudioManager() { } opus_encoder_ctl(m_encoder, OPUS_SET_BITRATE(64000)); - if (ma_context_init(nullptr, 0, nullptr, &m_context) != MA_SUCCESS) { + auto ctx_cfg = ma_context_config_init(); + ctx_cfg.pLog = &m_ma_log; + if (ma_context_init(nullptr, 0, &ctx_cfg, &m_context) != MA_SUCCESS) { spdlog::get("audio")->error("failed to initialize context"); m_ok = false; return; @@ -99,14 +129,14 @@ AudioManager::AudioManager() { m_playback_id = *playback_id; m_playback_config.playback.pDeviceID = &m_playback_id; - if (ma_device_init(&m_context, &m_playback_config, &m_playback_device) != MA_SUCCESS) { - spdlog::get("audio")->error("failed to initialize playback device"); + if (auto code = ma_device_init(&m_context, &m_playback_config, &m_playback_device); code != MA_SUCCESS) { + spdlog::get("audio")->error("failed to initialize playback device (code: {})", static_cast(code)); m_ok = false; return; } - if (ma_device_start(&m_playback_device) != MA_SUCCESS) { - spdlog::get("audio")->error("failed to start playback"); + if (auto code = ma_device_start(&m_playback_device); code != MA_SUCCESS) { + spdlog::get("audio")->error("failed to start playback (code: {})", static_cast(code)); ma_device_uninit(&m_playback_device); m_ok = false; return; @@ -129,8 +159,8 @@ AudioManager::AudioManager() { m_capture_id = *capture_id; m_capture_config.capture.pDeviceID = &m_capture_id; - if (ma_device_init(&m_context, &m_capture_config, &m_capture_device) != MA_SUCCESS) { - spdlog::get("audio")->error("failed to initialize capture device"); + if (auto code = ma_device_init(&m_context, &m_capture_config, &m_capture_device); code != MA_SUCCESS) { + spdlog::get("audio")->error("failed to initialize capture device (code: {})", static_cast(code)); m_ok = false; return; } diff --git a/src/audio/manager.hpp b/src/audio/manager.hpp index 5321cb5..f5b433f 100644 --- a/src/audio/manager.hpp +++ b/src/audio/manager.hpp @@ -14,6 +14,7 @@ #include #include #include +#include #ifdef WITH_RNNOISE #include @@ -163,6 +164,9 @@ private: #endif std::atomic m_rtp_timestamp = 0; + ma_log m_ma_log; + std::shared_ptr m_log; + public: using type_signal_opus_packet = sigc::signal; type_signal_opus_packet signal_opus_packet(); -- cgit v1.2.3 From 925864f082784a6211db11cc5bde0c0369a2920e Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sun, 17 Dec 2023 01:12:57 -0500 Subject: consider audio engine init failure non-fatal --- src/abaddon.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src') diff --git a/src/abaddon.cpp b/src/abaddon.cpp index cf10f91..d949c28 100644 --- a/src/abaddon.cpp +++ b/src/abaddon.cpp @@ -254,7 +254,6 @@ int Abaddon::StartGTK() { Gtk::MessageDialog dlg(*m_main_window, "The audio engine could not be initialized!", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); dlg.set_position(Gtk::WIN_POS_CENTER); dlg.run(); - return 1; } #endif -- cgit v1.2.3 From 705938a0a8a02ece99bc6040c615ccf8ea5afa71 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Sun, 17 Dec 2023 01:17:08 -0500 Subject: dont push to audio buffers if playback device isnt started --- src/audio/manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/audio/manager.cpp b/src/audio/manager.cpp index 955a5b9..8f2a5a3 100644 --- a/src/audio/manager.cpp +++ b/src/audio/manager.cpp @@ -215,7 +215,7 @@ void AudioManager::SetOpusBuffer(uint8_t *ptr) { } void AudioManager::FeedMeOpus(uint32_t ssrc, const std::vector &data) { - if (!m_should_playback) return; + if (!m_should_playback || ma_device_get_state(&m_playback_device) != ma_device_state_started) return; std::lock_guard _(m_mutex); if (m_muted_ssrcs.find(ssrc) != m_muted_ssrcs.end()) return; -- cgit v1.2.3 From 155d95e29cc50a66cbe7711b172b195be637bc48 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Tue, 26 Dec 2023 04:19:19 -0500 Subject: fix crash when closing VoiceSettingsWindow --- src/windows/voicesettingswindow.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/windows/voicesettingswindow.cpp b/src/windows/voicesettingswindow.cpp index 1a112f5..c114c04 100644 --- a/src/windows/voicesettingswindow.cpp +++ b/src/windows/voicesettingswindow.cpp @@ -112,9 +112,12 @@ VoiceSettingsWindow::VoiceSettingsWindow() m_gain.set_increments(1.0, 5.0); m_gain.set_range(0.0, 6969696969.0); m_gain.set_value(Abaddon::Get().GetAudio().GetCaptureGain() * 100.0); - m_gain.signal_value_changed().connect([this]() { + const auto cb = [this]() { + spdlog::get("ui")->warn("emit"); m_signal_gain.emit(m_gain.get_value() / 100.0); - }); + }; + // m_gain.signal_value_changed can be fired during destruction. thankfully signals are trackable + m_gain.signal_value_changed().connect(sigc::track_obj(cb, *this, m_signal_gain)); auto *layout = Gtk::make_managed(); auto *labels = Gtk::make_managed(); -- cgit v1.2.3