aboutsummaryrefslogtreecommitdiff
path: root/libdino/src/service/contact_model.vala
diff options
context:
space:
mode:
authorMiquel Lionel <lionel@les-miquelots.net>2023-10-30 21:48:08 +0100
committerMiquel Lionel <lionel@les-miquelots.net>2023-10-30 21:48:08 +0100
commitd761e8ccd5293d2f30a889b0cbe302c985aee68c (patch)
tree922bb248a7fee4cdff3da114abc7d77200f3d0da /libdino/src/service/contact_model.vala
parent302e954c99c71d670201828c6746dfaa40276d6d (diff)
parent3de716446819550514d50a8112f5b6dd0c662702 (diff)
downloaddino-d761e8ccd5293d2f30a889b0cbe302c985aee68c.tar.gz
dino-d761e8ccd5293d2f30a889b0cbe302c985aee68c.zip
Show which account is currently used in conversation details in the about sectionadd_conversation_account_indicator
Diffstat (limited to 'libdino/src/service/contact_model.vala')
-rw-r--r--libdino/src/service/contact_model.vala58
1 files changed, 58 insertions, 0 deletions
diff --git a/libdino/src/service/contact_model.vala b/libdino/src/service/contact_model.vala
new file mode 100644
index 00000000..312df4f7
--- /dev/null
+++ b/libdino/src/service/contact_model.vala
@@ -0,0 +1,58 @@
+using Xmpp;
+using Gee;
+using Qlite;
+
+using Dino.Entities;
+
+public class Dino.Model.ConversationDisplayName : Object {
+ public string display_name { get; set; }
+}
+
+namespace Dino {
+ public class ContactModels : StreamInteractionModule, Object {
+ public static ModuleIdentity<ContactModels> IDENTITY = new ModuleIdentity<ContactModels>("contact_models");
+ public string id { get { return IDENTITY.id; } }
+
+ private StreamInteractor stream_interactor;
+ private HashMap<Conversation, Model.ConversationDisplayName> conversation_models = new HashMap<Conversation, Model.ConversationDisplayName>(Conversation.hash_func, Conversation.equals_func);
+
+ public static void start(StreamInteractor stream_interactor) {
+ ContactModels m = new ContactModels(stream_interactor);
+ stream_interactor.add_module(m);
+ }
+
+ private ContactModels(StreamInteractor stream_interactor) {
+ this.stream_interactor = stream_interactor;
+
+ stream_interactor.get_module(MucManager.IDENTITY).room_info_updated.connect((account, jid) => {
+ check_update_models(account, jid, Conversation.Type.GROUPCHAT);
+ });
+ stream_interactor.get_module(MucManager.IDENTITY).private_room_occupant_updated.connect((account, room, occupant) => {
+ check_update_models(account, room, Conversation.Type.GROUPCHAT);
+ });
+ stream_interactor.get_module(MucManager.IDENTITY).subject_set.connect((account, jid, subject) => {
+ check_update_models(account, jid, Conversation.Type.GROUPCHAT);
+ });
+ stream_interactor.get_module(RosterManager.IDENTITY).updated_roster_item.connect((account, jid, roster_item) => {
+ check_update_models(account, jid, Conversation.Type.CHAT);
+ });
+ }
+
+ private void check_update_models(Account account, Jid jid, Conversation.Type conversation_ty) {
+ var conversation = stream_interactor.get_module(ConversationManager.IDENTITY).get_conversation(jid, account, conversation_ty);
+ if (conversation == null) return;
+ var display_name_model = conversation_models[conversation];
+ if (display_name_model == null) return;
+ display_name_model.display_name = Dino.get_conversation_display_name(stream_interactor, conversation, "%s (%s)");
+ }
+
+ public Model.ConversationDisplayName get_display_name_model(Conversation conversation) {
+ if (conversation_models.has_key(conversation)) return conversation_models[conversation];
+
+ var model = new Model.ConversationDisplayName();
+ model.display_name = Dino.get_conversation_display_name(stream_interactor, conversation, "%s (%s)");
+ conversation_models[conversation] = model;
+ return model;
+ }
+ }
+} \ No newline at end of file