From 8144b87adca67b87da91d577c18d3ff9250843fc Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Mon, 2 May 2022 14:43:43 -0700 Subject: [PATCH] break out behaviour --- Cargo.toml | 2 +- src/behaviour.rs | 109 +++++++++++++++++++++++++++++++++++++++++++++++ src/imp.rs | 103 +------------------------------------------- src/lib.rs | 1 + 4 files changed, 113 insertions(+), 102 deletions(-) create mode 100644 src/behaviour.rs diff --git a/Cargo.toml b/Cargo.toml index 93b9aff..6d26f1e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,6 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -libcwtch = "0.3.0" +libcwtch = "0.3.2" serde_json = "1.0" chrono = "0.4.19" \ No newline at end of file diff --git a/src/behaviour.rs b/src/behaviour.rs new file mode 100644 index 0000000..fdadd17 --- /dev/null +++ b/src/behaviour.rs @@ -0,0 +1,109 @@ + +/// defines a locked list of allowed peers and groups the bot may communicate with +/// others will be blocked, and peers listed here will be peered with actively +pub struct AllowListMembers { + /// list of peers to allow by handle + pub peers: Vec, + /// list of groups to join and listen for peers in peer list from + pub groups: Vec, +} + +impl AllowListMembers { + /// constructs a new AllowListMembers struct + pub fn new(peers: Vec, groups: Vec) -> Self { + AllowListMembers {peers: peers, groups: groups} + } +} + +/// How new contacts should be treated +pub enum NewContactPolicy { + /// Do not react, leave it for the custom event handler + Ignore, + /// Block all new contacts + Block, + /// Accept all new contacts + Accept, + /// AllowList is a list of handles that connections will be allowed from and connected to, and will be accepted + /// everything else will be ignored + AllowList(AllowListMembers) +} + +/// 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) + pub proto_experiments: bool, + + /// The bot will enable the file sharing experiment + pub proto_experiment_fileshare: bool, + + /// The bot will enable the groups experiment + pub proto_experiment_groups: bool, + + /// The profile name the bot will share with accepted conversations + pub profile_name: String, + /// The profile pic the bot with share with accepted conversations IF the file share exoeriment is enabled + pub profile_pic_path: Option, + + /// Policy dictacting how the bot should automatically handle ContactCreated events + pub new_contant_policy: NewContactPolicy, +} + +/// intermediary struct for building a Behaviour using builder patern +pub struct BehaviourBuilder { + behaviour: Behaviour, +} + +impl BehaviourBuilder { + /// Returns a new empty default off for features behaviour builder + pub fn new() -> Self { + return BehaviourBuilder { + behaviour: Behaviour { + proto_experiments: false, + proto_experiment_fileshare: false, + proto_experiment_groups: false, + new_contant_policy: NewContactPolicy::Ignore, + profile_name: "".to_string(), + profile_pic_path: None, + }, + }; + } + + /// Build the defined behaviours into a Behaviour struct + pub fn build(self) -> Behaviour { + self.behaviour + } + + /// Control if the Behaviour of the bot should include groups (enabling experiments and the group experiment) + pub fn groups(mut self, val: bool) -> Self { + self.behaviour.proto_experiment_groups = val; + self.behaviour.proto_experiments = true; + self + } + + /// Control if the Behaviour of the bot should include filesharing (enabling experiments and the filesharing experiment) + pub fn fileshare(mut self, val: bool) -> Self { + self.behaviour.proto_experiment_fileshare = val; + self.behaviour.proto_experiments = true; + self + } + + /// Set a profile pic for the bot and enable the filesharing experiment + pub fn profile_pic_path(mut self, val: String) -> Self { + self.behaviour.profile_pic_path = Some(val); + self.behaviour.proto_experiment_fileshare = true; + self.behaviour.proto_experiments = true; + self + } + + /// Set a name for the behaviour + pub fn name(mut self, val: String) -> Self { + self.behaviour.profile_name = val; + self + } + + /// Set a new contact policy for the behaviour + pub fn new_contact_policy(mut self, val: NewContactPolicy) -> Self { + self.behaviour.new_contant_policy = val; + self + } +} diff --git a/src/imp.rs b/src/imp.rs index df56cd7..8860191 100644 --- a/src/imp.rs +++ b/src/imp.rs @@ -3,107 +3,8 @@ use libcwtch::structs::*; use libcwtch::CwtchLib; use serde_json; -use crate::imp::NewContactPolicy::AllowList; - -// Todo: move Behaviour + building to seperate file - -pub struct AllowListMembers { - // list of peers to allow by handle - peers: Vec, - // list of groups to join and listen for peers in peer list from - groups: Vec, -} - -impl AllowListMembers { - pub fn new(peers: Vec, groups: Vec) -> Self { - AllowListMembers {peers: peers, groups: groups} - } -} - -/// How new contacts should be treated -pub enum NewContactPolicy { - /// Do not react, leave it for the custom event handler - Ignore, - /// Block all new contacts - Block, - /// Accept all new contacts - Accept, - /// AllowList is a list of handles that connections will be allowed from and connected to, and will be accepted - /// everything else will be ignored - AllowList(AllowListMembers) -} - -/// 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) - pub proto_experiments: bool, - - /// The bot will enable the file sharing experiment - pub proto_experiment_fileshare: bool, - - /// The bot will enable the groups experiment - pub proto_experiment_groups: bool, - - /// The profile name the bot will share with accepted conversations - pub profile_name: String, - /// The profile pic the bot with share with accepted conversations IF the file share exoeriment is enabled - pub profile_pic_path: Option, - - /// Policy dictacting how the bot should automatically handle ContactCreated events - pub new_contant_policy: NewContactPolicy, -} - -pub struct BehaviourBuilder { - behaviour: Behaviour, -} - -impl BehaviourBuilder { - pub fn new() -> Self { - return BehaviourBuilder { - behaviour: Behaviour { - proto_experiments: false, - proto_experiment_fileshare: false, - proto_experiment_groups: false, - new_contant_policy: NewContactPolicy::Ignore, - profile_name: "".to_string(), - profile_pic_path: None, - }, - }; - } - - pub fn build(self) -> Behaviour { - self.behaviour - } - - pub fn groups(mut self, val: bool) -> Self { - self.behaviour.proto_experiment_groups = val; - self.behaviour.proto_experiments = true; - self - } - - pub fn fileshare(mut self, val: bool) -> Self { - self.behaviour.proto_experiment_fileshare = val; - self.behaviour.proto_experiments = true; - self - } - - pub fn profile_pic_path(mut self, val: String) -> Self { - self.behaviour.profile_pic_path = Some(val); - self.behaviour.proto_experiment_fileshare = true; - self.behaviour.proto_experiments = true; - self - } - - pub fn name(mut self, val: String) -> Self { - self.behaviour.profile_name = val; - self - } - - pub fn new_contact_policy(mut self, val: NewContactPolicy) -> Self { - self.behaviour.new_contant_policy = val; - self - } -} +use crate::behaviour::{Behaviour, NewContactPolicy}; +use crate::behaviour::NewContactPolicy::AllowList; /// Trait to be used by implementors of imp bots to supply their custom event handling /// the handle function is called after the default imp automatic event handling has run on each new event diff --git a/src/lib.rs b/src/lib.rs index 171f4a1..0c2d3b6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,3 @@ pub mod event; pub mod imp; +pub mod behaviour;