Skip to content

Commit

Permalink
Allow blocking entire domain from conversation details
Browse files Browse the repository at this point in the history
	- the block domain option is in a drop down of the block button
	- when blocking the domain, the "Blocked domain" button appears
	  and block button disappears and vice versa.
  • Loading branch information
eerielili committed Jun 21, 2024
1 parent 0c45387 commit 947b444
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 13 deletions.
15 changes: 9 additions & 6 deletions libdino/src/service/blocking_manager.vala
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,22 @@ public class BlockingManager : StreamInteractionModule, Object {
this.stream_interactor = stream_interactor;
}

public bool is_blocked(Account account, Jid jid) {
public bool is_blocked(Account account, Jid jid, bool domainblock = false) {
XmppStream stream = stream_interactor.get_stream(account);
return stream != null && stream.get_module(Xmpp.Xep.BlockingCommand.Module.IDENTITY).is_blocked(stream, jid.to_string());
string jid_str = domainblock ? jid.domainpart.to_string () : jid.to_string();
return stream != null && stream.get_module(Xmpp.Xep.BlockingCommand.Module.IDENTITY).is_blocked(stream, jid_str);
}

public void block(Account account, Jid jid) {
public void block(Account account, Jid jid, bool domainblock = false) {
XmppStream stream = stream_interactor.get_stream(account);
stream.get_module(Xmpp.Xep.BlockingCommand.Module.IDENTITY).block(stream, { jid.to_string() });
string jid_str = domainblock ? jid.domainpart.to_string () : jid.to_string();
stream.get_module(Xmpp.Xep.BlockingCommand.Module.IDENTITY).block(stream, { jid_str });
}

public void unblock(Account account, Jid jid) {
public void unblock(Account account, Jid jid, bool domainblock = false) {
XmppStream stream = stream_interactor.get_stream(account);
stream.get_module(Xmpp.Xep.BlockingCommand.Module.IDENTITY).unblock(stream, { jid.to_string() });
string jid_str = domainblock ? jid.domainpart.to_string () : jid.to_string();
stream.get_module(Xmpp.Xep.BlockingCommand.Module.IDENTITY).unblock(stream, { jid_str });
}

public bool is_supported(Account account) {
Expand Down
24 changes: 22 additions & 2 deletions main/data/conversation_details.ui
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,8 @@
</object>
</child>
<child>
<object class="GtkButton" id="block_button">
<object class="AdwSplitButton" id="block_button">
<property name="menu_model">block_menu_model</property>
<property name="visible" bind-source="model" bind-property="show-blocked" bind-flags="sync-create"/>
<child>
<object class="AdwButtonContent" id="block_button_content">
Expand All @@ -132,6 +133,17 @@
</child>
</object>
</child>
<child>
<object class="GtkButton" id="block_domain_button">
<property name="visible" bind-source="model" bind-property="show-blocked" bind-flags="sync-create"/>
<child>
<object class="AdwButtonContent" id="block_domain_button_content">
<property name="icon-name">action-unavailable-symbolic</property>
<property name="label">Domain blocked</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
Expand Down Expand Up @@ -203,4 +215,12 @@
</item>
</section>
</menu>
</interface>
<menu id="block_menu_model">
<section>
<item>
<attribute name="label">Block domain</attribute>
<attribute name="action">domain.on</attribute>
</item>
</section>
</menu>
</interface>
12 changes: 11 additions & 1 deletion main/src/ui/conversation_details.vala
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ namespace Dino.Ui.ConversationDetails {
model.conversation = conversation;
model.display_name = stream_interactor.get_module(ContactModels.IDENTITY).get_display_name_model(conversation);
model.blocked = stream_interactor.get_module(BlockingManager.IDENTITY).is_blocked(model.conversation.account, model.conversation.counterpart);
model.domain_blocked = stream_interactor.get_module(BlockingManager.IDENTITY).is_blocked(model.conversation.account, model.conversation.counterpart, true);

if (conversation.type_ == Conversation.Type.GROUPCHAT) {
stream_interactor.get_module(MucManager.IDENTITY).get_config_form.begin(conversation.account, conversation.counterpart, (_, res) => {
Expand Down Expand Up @@ -54,6 +55,7 @@ namespace Dino.Ui.ConversationDetails {
return true;
});
model.bind_property("blocked", view_model, "blocked", BindingFlags.SYNC_CREATE);
model.bind_property("domain_blocked", view_model, "domain_blocked", BindingFlags.SYNC_CREATE);
model.bind_property("data-form", view_model, "room-configuration-rows", BindingFlags.SYNC_CREATE, (_, from, ref to) => {
var data_form = (DataForms.DataForm) from;
if (data_form == null) return true;
Expand Down Expand Up @@ -81,6 +83,14 @@ namespace Dino.Ui.ConversationDetails {
}
view_model.blocked = !view_model.blocked;
});
view_model.domain_block_changed.connect(() => {
if (view_model.domain_blocked) {
stream_interactor.get_module(BlockingManager.IDENTITY).unblock(model.conversation.account, model.conversation.counterpart, true);
} else {
stream_interactor.get_module(BlockingManager.IDENTITY).block(model.conversation.account, model.conversation.counterpart, true);
}
view_model.domain_blocked = !view_model.domain_blocked;
});
view_model.notification_changed.connect((setting) => {
switch (setting) {
case ON:
Expand Down Expand Up @@ -185,4 +195,4 @@ namespace Dino.Ui.ConversationDetails {
break;
}
}
}
}
5 changes: 4 additions & 1 deletion main/src/view_model/conversation_details.vala
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ using Gtk;
public class Dino.Ui.ViewModel.ConversationDetails : Object {
public signal void pin_changed();
public signal void block_changed();
public signal void domain_block_changed();
public signal void notification_flipped();
public signal void notification_changed(NotificationSetting setting);

Expand All @@ -32,6 +33,7 @@ public class Dino.Ui.ViewModel.ConversationDetails : Object {

public bool show_blocked { get; set; }
public bool blocked { get; set; }
public bool domain_blocked { get; set; }

public GLib.ListStore preferences_rows = new GLib.ListStore(typeof(PreferencesRow.Any));
public GLib.ListStore about_rows = new GLib.ListStore(typeof(PreferencesRow.Any));
Expand All @@ -46,4 +48,5 @@ public class Dino.Ui.Model.ConversationDetails : Object {
public DataForms.DataForm? data_form { get; set; }
public string? data_form_bak;
public bool blocked { get; set; }
}
public bool domain_blocked { get; set; }
}
23 changes: 20 additions & 3 deletions main/src/windows/conversation_details.vala
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@ namespace Dino.Ui.ConversationDetails {
[GtkChild] public unowned Box about_box;
[GtkChild] public unowned Button pin_button;
[GtkChild] public unowned Adw.ButtonContent pin_button_content;
[GtkChild] public unowned Button block_button;
[GtkChild] public unowned Adw.SplitButton block_button;
[GtkChild] public unowned Adw.ButtonContent block_button_content;
[GtkChild] public unowned Button block_domain_button;
[GtkChild] public unowned Adw.ButtonContent block_domain_button_content;
[GtkChild] public unowned Button notification_button_toggle;
[GtkChild] public unowned Adw.ButtonContent notification_button_toggle_content;
[GtkChild] public unowned MenuButton notification_button_menu;
Expand All @@ -27,16 +29,19 @@ namespace Dino.Ui.ConversationDetails {
install_action("notification.off", null, (widget, action_name) => { ((Dialog) widget).model.notification_changed(ViewModel.ConversationDetails.NotificationSetting.OFF); } );
install_action("notification.highlight", null, (widget, action_name) => { ((Dialog) widget).model.notification_changed(ViewModel.ConversationDetails.NotificationSetting.HIGHLIGHT); } );
install_action("notification.default", null, (widget, action_name) => { ((Dialog) widget).model.notification_changed(ViewModel.ConversationDetails.NotificationSetting.DEFAULT); } );
install_action("domain.on", null, (widget, action_name) => { ((Dialog) widget).model.domain_block_changed(); } );
}

construct {
pin_button.clicked.connect(() => { model.pin_changed(); });
block_button.clicked.connect(() => { model.block_changed(); });
block_domain_button.clicked.connect(() => { model.domain_block_changed(); });
notification_button_toggle.clicked.connect(() => { model.notification_flipped(); });
notification_button_split.clicked.connect(() => { model.notification_flipped(); });

model.notify["pinned"].connect(update_pinned_button);
model.notify["blocked"].connect(update_blocked_button);
model.notify["domain-blocked"].connect(update_blocked_button);
model.notify["notification"].connect(update_notification_button);
model.notify["notification"].connect(update_notification_button_state);
model.notify["notification-options"].connect(update_notification_button_visibility);
Expand Down Expand Up @@ -64,13 +69,25 @@ namespace Dino.Ui.ConversationDetails {
}

private void update_blocked_button() {
block_button_content.icon_name = "action-unavailable-symbolic";
block_button_content.icon_name = "dino-block-symbolic";
block_domain_button_content.icon_name = block_button_content.icon_name;
block_button_content.label = model.blocked ? _("Blocked") : _("Block");
block_domain_button.visible = false;
if (model.blocked) {
block_button.visible = true;
block_domain_button.visible = false;
block_button.add_css_class("error");
} else {
block_button.remove_css_class("error");
}

if (model.domain_blocked) {
block_domain_button.visible = true;
block_button.visible = false;
block_domain_button.add_css_class("error");
} else {
block_button.visible = true;
}
}

private void update_notification_button() {
Expand Down Expand Up @@ -229,4 +246,4 @@ namespace Dino.Ui.ConversationDetails {
return preference_group;
}
}
}
}

0 comments on commit 947b444

Please sign in to comment.