From 76fa84bd667e9e6b60f4ead56ebc6ba182f4e768 Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Sat, 21 Oct 2023 10:02:24 -0700 Subject: [PATCH] implement group policy; group api fixes in experimental libcwtch-rs --- src/behaviour.rs | 18 ++++++++++++++++++ src/imp.rs | 41 ++++++++++++++++++++++++----------------- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/behaviour.rs b/src/behaviour.rs index 06fd1df..c7bc65f 100644 --- a/src/behaviour.rs +++ b/src/behaviour.rs @@ -29,6 +29,15 @@ pub enum NewContactPolicy { AllowList(AllowListMembers) } +pub enum GroupInvitePolicy { + /// Ignore all group invites + IgnoreAll, + /// Accept all group invites + AcceptAll, + /// Only accept group invites from contacts. Pairs strongly with NewContactPolicy of AllowList + AcceptFromContact, +} + /// Settings for the bot on how it should automatically behave pub struct Behaviour { /// The bot will enable experimental feautres (required for any experiments to be used) @@ -47,6 +56,9 @@ pub struct Behaviour { /// Policy dictacting how the bot should automatically handle ContactCreated events pub new_contant_policy: NewContactPolicy, + + /// Policy dictating how the bot should handle Group Invites + pub group_invite_policy: GroupInvitePolicy, } /// intermediary struct for building a Behaviour using builder patern @@ -63,6 +75,7 @@ impl BehaviourBuilder { proto_experiment_fileshare: false, proto_experiment_groups: false, new_contant_policy: NewContactPolicy::Ignore, + group_invite_policy: GroupInvitePolicy::IgnoreAll, profile_name: "".to_string(), profile_pic_path: None, }, @@ -107,4 +120,9 @@ impl BehaviourBuilder { self.behaviour.new_contant_policy = val; self } + + pub fn group_invite_policy(mut self, val: GroupInvitePolicy) -> Self { + self.behaviour.group_invite_policy = val; + self + } } diff --git a/src/imp.rs b/src/imp.rs index d0d101d..cde0106 100644 --- a/src/imp.rs +++ b/src/imp.rs @@ -1,9 +1,11 @@ use chrono::{DateTime, FixedOffset}; use libcwtch::structs::*; use libcwtch::CwtchLib; -use libcwtch::event::{ConversationID, Event}; +use libcwtch::event::{ContactIdentity, ConversationID, Event}; +use libcwtch::structs::MessageType::InviteGroup; -use crate::behaviour::{Behaviour, NewContactPolicy}; +use crate::behaviour::{Behaviour, GroupInvitePolicy, NewContactPolicy}; +use crate::behaviour::GroupInvitePolicy::AcceptAll; use crate::behaviour::NewContactPolicy::AllowList; /// Trait to be used by implementors of imp bots to supply their custom event handling @@ -20,7 +22,7 @@ pub trait EventHandler { fn on_new_message_from_contact(&self, cwtch: &dyn libcwtch::CwtchLib, profile: &Profile, conversation_id: ConversationID, handle: String, timestamp_received: DateTime, message: MessageWrapper) {} #[allow(unused_variables)] - fn on_new_message_from_group(&self, cwtch: &dyn libcwtch::CwtchLib, profile: &Profile, conversation_id: ConversationID, handle: String, timestamp_sent: DateTime, message: MessageWrapper) {} + fn on_new_message_from_group(&self, cwtch: &dyn libcwtch::CwtchLib, profile: &Profile, conversation_id: ConversationID, contact: ContactIdentity, timestamp_sent: DateTime, message: MessageWrapper) {} } /// Cwtch bot @@ -111,14 +113,6 @@ impl Imp { panic!("error parsing profile: {}", e); } - // Share profile image - match self.settings.as_ref() { - Some(_settings) => { - self.cwtch.share_file(&profile_id, ConversationID(-1), "build_bot.png"); - } - None => (), - }; - self.cwtch.set_profile_attribute( &profile_id, "profile.name", @@ -139,7 +133,6 @@ impl Imp { } } - self.profile = Some(ok_profile.clone()); } } @@ -190,14 +183,28 @@ impl Imp { } } Event::NewMessageFromPeer {profile_id, conversation_id,contact_id, nick, timestamp_received, message, notification, picture } => { - match self.profile.as_ref() { - Some(profile) => handler.on_new_message_from_contact(self.cwtch.as_ref(), profile, conversation_id.clone(), nick.clone(), timestamp_received.clone(), message.clone()), - None => {}, + if message.o == InviteGroup { + if let Some(profile) = self.profile.as_ref() { + match self.behaviour.group_invite_policy { + GroupInvitePolicy::IgnoreAll => (), + GroupInvitePolicy::AcceptAll => self.cwtch.import_bundle(profile_id, message.d.as_str()), + GroupInvitePolicy::AcceptFromContact=> { + if profile.conversations[conversation_id].accepted { + self.cwtch.import_bundle(profile_id, message.d.as_str()) + } + } + } + } + } else { + match self.profile.as_ref() { + Some(profile) => handler.on_new_message_from_contact(self.cwtch.as_ref(), profile, conversation_id.clone(), nick.clone(), timestamp_received.clone(), message.clone()), + None => {}, + } } } - Event::NewMessageFromGroup { profile_id, conversation_id, timestamp_sent, contact_id, index, message, content_hash, picture, nick, notification, } => { + Event::NewMessageFromGroup { profile_id, conversation_id, timestamp_sent, contact_id, index, message, content_hash, picture, notification, } => { if let Some(profile )= self.profile.as_ref() { - handler.on_new_message_from_group(self.cwtch.as_ref(), profile, conversation_id.clone(), nick.clone(), timestamp_sent.clone(), message.clone()) + handler.on_new_message_from_group(self.cwtch.as_ref(), profile, conversation_id.clone(), contact_id.clone(), timestamp_sent.clone(), message.clone()) } } Event::ErrUnhandled { name, data } => eprintln!("unhandled event: {}!", name),