diff --git a/libdino/src/service/muc_manager.vala b/libdino/src/service/muc_manager.vala index 8eba524d..178cc8f9 100644 --- a/libdino/src/service/muc_manager.vala +++ b/libdino/src/service/muc_manager.vala @@ -14,7 +14,7 @@ public class MucManager : StreamInteractionModule, Object { public signal void room_info_updated(Account account, Jid muc_jid); public signal void private_room_occupant_updated(Account account, Jid room, Jid occupant); public signal void invite_received(Account account, Jid room_jid, Jid from_jid, string? password, string? reason); - public signal void voice_request_received(Account account, Jid room_jid, Jid from_jid, string? nick, string? role, string? label); + public signal void voice_request_received(Account account, Jid room_jid, Jid from_jid, string nick); public signal void received_occupant_role(Account account, Jid jid, Xep.Muc.Role? role); public signal void bookmarks_updated(Account account, Set conferences); public signal void conference_added(Account account, Conference conference); @@ -364,8 +364,8 @@ public class MucManager : StreamInteractionModule, Object { stream_interactor.module_manager.get_module(account, Xep.Muc.Module.IDENTITY).invite_received.connect( (stream, room_jid, from_jid, password, reason) => { invite_received(account, room_jid, from_jid, password, reason); }); - stream_interactor.module_manager.get_module(account, Xep.Muc.Module.IDENTITY).voice_request_received.connect( (stream, room_jid, from_jid, nick, role, label) => { - voice_request_received(account, room_jid, from_jid, nick, role, label); + stream_interactor.module_manager.get_module(account, Xep.Muc.Module.IDENTITY).voice_request_received.connect( (stream, room_jid, from_jid, nick) => { + voice_request_received(account, room_jid, from_jid, nick); }); stream_interactor.module_manager.get_module(account, Xep.Muc.Module.IDENTITY).received_occupant_role.connect( (stream, from_jid, role) => { received_occupant_role(account, from_jid, role); diff --git a/libdino/src/service/notification_events.vala b/libdino/src/service/notification_events.vala index 19d61d0f..f6ef7019 100644 --- a/libdino/src/service/notification_events.vala +++ b/libdino/src/service/notification_events.vala @@ -13,7 +13,7 @@ public class NotificationEvents : StreamInteractionModule, Object { public signal void notify_subscription_request(Conversation conversation); public signal void notify_connection_error(Account account, ConnectionManager.ConnectionError error); public signal void notify_muc_invite(Account account, Jid room_jid, Jid from_jid, string? password, string? reason); - public signal void notify_voice_request(Account account, Jid room_jid, Jid from_jid, string? nick, string? role, string? label); + public signal void notify_voice_request(Account account, Jid room_jid, Jid from_jid, string nick); private StreamInteractor stream_interactor; @@ -28,7 +28,7 @@ public class NotificationEvents : StreamInteractionModule, Object { stream_interactor.get_module(ContentItemStore.IDENTITY).new_item.connect(on_content_item_received); stream_interactor.get_module(PresenceManager.IDENTITY).received_subscription_request.connect(on_received_subscription_request); stream_interactor.get_module(MucManager.IDENTITY).invite_received.connect((account, room_jid, from_jid, password, reason) => notify_muc_invite(account, room_jid, from_jid, password, reason)); - stream_interactor.get_module(MucManager.IDENTITY).voice_request_received.connect((account, room_jid, from_jid, nick, role, label) => notify_voice_request(account, room_jid, from_jid, nick, role, label)); + stream_interactor.get_module(MucManager.IDENTITY).voice_request_received.connect((account, room_jid, from_jid, nick) => notify_voice_request(account, room_jid, from_jid, nick)); stream_interactor.connection_manager.connection_error.connect((account, error) => notify_connection_error(account, error)); } diff --git a/main/src/ui/application.vala b/main/src/ui/application.vala index 90c83562..7c473d2f 100644 --- a/main/src/ui/application.vala +++ b/main/src/ui/application.vala @@ -138,11 +138,14 @@ public class Dino.Ui.Application : Gtk.Application, Dino.Application { }); add_action(accept_muc_invite_action); - SimpleAction accept_voice_request_action = new SimpleAction("accept-voice-request", VariantType.INT32); + SimpleAction accept_voice_request_action = new SimpleAction("accept-voice-request", new VariantType.tuple(new VariantType[]{VariantType.INT32, VariantType.STRING})); accept_voice_request_action.activate.connect((variant) => { - Conversation? conversation = stream_interactor.get_module(ConversationManager.IDENTITY).get_conversation_by_id(variant.get_int32()); + int conversation_id = variant.get_child_value(0).get_int32(); + Conversation? conversation = stream_interactor.get_module(ConversationManager.IDENTITY).get_conversation_by_id(conversation_id); if (conversation == null) return; - stream_interactor.get_module(MucManager.IDENTITY).change_role(conversation.account, conversation.counterpart, conversation.nickname, "participant"); + + string nick = variant.get_child_value(1).get_string(); + stream_interactor.get_module(MucManager.IDENTITY).change_role(conversation.account, conversation.counterpart, nick, "participant"); }); add_action(accept_voice_request_action); diff --git a/main/src/ui/notifications.vala b/main/src/ui/notifications.vala index c68ab0ff..134c757a 100644 --- a/main/src/ui/notifications.vala +++ b/main/src/ui/notifications.vala @@ -141,7 +141,7 @@ public class Notifications : Object { GLib.Application.get_default().send_notification(null, notification); } - private async void on_voice_request_received(Account account, Jid room_jid, Jid from_jid, string? nick, string? role, string? label) { + private async void on_voice_request_received(Account account, Jid room_jid, Jid from_jid, string nick) { Conversation? conversation = stream_interactor.get_module(ConversationManager.IDENTITY).get_conversation(room_jid, account, Conversation.Type.GROUPCHAT); if (conversation == null) return; @@ -156,9 +156,10 @@ public class Notifications : Object { notification.set_icon(get_pixbuf_icon(jid_avatar)); } catch (Error e) { } - notification.set_default_action_and_target_value("app.accept-voice-request", new Variant.int32(conversation.id)); + Variant variant = new Variant.tuple(new Variant[] {new Variant.int32(conversation.id), new Variant.string(nick)}); + notification.set_default_action_and_target_value("app.accept-voice-request", variant); notification.add_button_with_target_value(_("Deny"), "app.deny-voice-request", conversation.id); - notification.add_button_with_target_value(_("Accept"), "app.accept-voice-request", conversation.id); + notification.add_button_with_target_value(_("Accept"), "app.accept-voice-request", variant); GLib.Application.get_default().send_notification(null, notification); } diff --git a/xmpp-vala/src/module/xep/0045_muc/module.vala b/xmpp-vala/src/module/xep/0045_muc/module.vala index aef3796b..dcfe8ace 100644 --- a/xmpp-vala/src/module/xep/0045_muc/module.vala +++ b/xmpp-vala/src/module/xep/0045_muc/module.vala @@ -69,7 +69,7 @@ public class Module : XmppStreamModule { public signal void received_occupant_role(XmppStream stream, Jid jid, Role? role); public signal void subject_set(XmppStream stream, string? subject, Jid jid); public signal void invite_received(XmppStream stream, Jid room_jid, Jid from_jid, string? password, string? reason); - public signal void voice_request_received(XmppStream stream, Jid room_jid, Jid from_jid, string? nick, string? role, string? label); + public signal void voice_request_received(XmppStream stream, Jid room_jid, Jid from_jid, string nick); public signal void room_info_updated(XmppStream stream, Jid muc_jid); public signal void self_removed_from_room(XmppStream stream, Jid jid, StatusCode code); @@ -559,8 +559,6 @@ public class ReceivedPipelineListener : StanzaListener { Gee.List? fields = x_field_node.get_subnodes("field", DataForms.NS_URI); Jid? from_jid = null; string? nick = null; - string? role = null; - string? label = null; if (fields.size!=0){ foreach (var field_node in fields){ @@ -579,13 +577,19 @@ public class ReceivedPipelineListener : StanzaListener { } else if (var_ == "muc#role"){ StanzaNode? value_node = field_node.get_subnode("value", DataForms.NS_URI); - if (value_node != null) role = value_node.get_string_content(); - } - else if (var_ == "muc#request_allow"){ - label = field_node.get_attribute("label"); + if (value_node != null) { + if (value_node.get_string_content() != "participant") { + warning("Voice request with role other than participant"); + } + } } } - outer.voice_request_received(stream, message.from, from_jid, nick, role, label); + if (from_jid == null || nick == null) { + warning("Voice request without from_jid or nick"); + return false; + } + + outer.voice_request_received(stream, message.from, from_jid, nick); return true; } }