diff --git a/crates/client/src/client.rs b/crates/client/src/client.rs index 9ec24abae58a40d71646fd5f6228d3c47ba97864..73ecf16084d833a7b48806a8f27cb4b63d2d8419 100644 --- a/crates/client/src/client.rs +++ b/crates/client/src/client.rs @@ -351,7 +351,7 @@ impl Client { })); } Status::SignedOut | Status::UpgradeRequired => { - self.telemetry.set_metrics_id(None); + self.telemetry.set_authenticated_user_info(None, false); state._reconnect_task.take(); } _ => {} diff --git a/crates/client/src/telemetry.rs b/crates/client/src/telemetry.rs index c9b5665e9ed7a786c354caa3338d4b05754f8002..7b0b2ef3240ab9c7932d4c6b6ea99aef0d7c7ad8 100644 --- a/crates/client/src/telemetry.rs +++ b/crates/client/src/telemetry.rs @@ -9,6 +9,7 @@ use isahc::Request; use lazy_static::lazy_static; use parking_lot::Mutex; use serde::Serialize; +use serde_json::json; use std::{ io::Write, mem, @@ -176,11 +177,32 @@ impl Telemetry { .detach(); } - pub fn set_metrics_id(&self, metrics_id: Option) { + pub fn set_authenticated_user_info( + self: &Arc, + metrics_id: Option, + is_staff: bool, + ) { + let is_signed_in = metrics_id.is_some(); self.state.lock().metrics_id = metrics_id.map(|s| s.into()); + if is_signed_in { + self.report_event_with_user_properties( + "$identify", + Default::default(), + json!({ "$set": { "staff": is_staff } }), + ) + } } pub fn report_event(self: &Arc, kind: &str, properties: Value) { + self.report_event_with_user_properties(kind, properties, Default::default()); + } + + fn report_event_with_user_properties( + self: &Arc, + kind: &str, + properties: Value, + user_properties: Value, + ) { if AMPLITUDE_API_KEY.is_none() { return; } @@ -198,7 +220,11 @@ impl Telemetry { } else { None }, - user_properties: None, + user_properties: if let Value::Object(user_properties) = user_properties { + Some(user_properties) + } else { + None + }, user_id: state.metrics_id.clone(), device_id: state.device_id.clone(), os_name: state.os_name, diff --git a/crates/client/src/test.rs b/crates/client/src/test.rs index 56d3d80b631ec2adb905abbe8b0d0ed4e6f6c6d6..288c9a31faaada7c52ebebcf0df2b2f6341d9374 100644 --- a/crates/client/src/test.rs +++ b/crates/client/src/test.rs @@ -157,6 +157,7 @@ impl FakeServer { .receipt(), GetPrivateUserInfoResponse { metrics_id: "the-metrics-id".into(), + staff: false, }, ) .await; diff --git a/crates/client/src/user.rs b/crates/client/src/user.rs index b31cda94b37f1310b14772f0027706d59368055b..d52d6367b0bba399d2f50565eca9ab08d61696bd 100644 --- a/crates/client/src/user.rs +++ b/crates/client/src/user.rs @@ -148,7 +148,14 @@ impl UserStore { let fetch_metrics_id = client.request(proto::GetPrivateUserInfo {}).log_err(); let (user, info) = futures::join!(fetch_user, fetch_metrics_id); - client.telemetry.set_metrics_id(info.map(|i| i.metrics_id)); + if let Some(info) = info { + client.telemetry.set_authenticated_user_info( + Some(info.metrics_id), + info.staff, + ); + } else { + client.telemetry.set_authenticated_user_info(None, false); + } client.telemetry.report_event("sign in", Default::default()); current_user_tx.send(user).await.ok(); } diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 467ec174ab083c62d956fd18f17e94f28409eb32..e42b0812ab128f67a28c8d6e301e4795ef449bd4 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -1738,7 +1738,16 @@ impl Server { .await .user_id_for_connection(request.sender_id)?; let metrics_id = self.app_state.db.get_user_metrics_id(user_id).await?; - response.send(proto::GetPrivateUserInfoResponse { metrics_id })?; + let user = self + .app_state + .db + .get_user_by_id(user_id) + .await? + .ok_or_else(|| anyhow!("user not found"))?; + response.send(proto::GetPrivateUserInfoResponse { + metrics_id, + staff: user.admin, + })?; Ok(()) } diff --git a/crates/contacts_panel/src/contacts_panel.rs b/crates/contacts_panel/src/contacts_panel.rs index 91b86aaf0e151daedc6094266e56212d73def107..c06b2e17a16720f2cab6d63c12d9833ca800b845 100644 --- a/crates/contacts_panel/src/contacts_panel.rs +++ b/crates/contacts_panel/src/contacts_panel.rs @@ -1221,16 +1221,6 @@ mod tests { let project_store = cx.add_model(|_| ProjectStore::new(project::Db::open_fake())); let server = FakeServer::for_client(current_user_id, &client, cx).await; - let request = server.receive::().await.unwrap(); - server - .respond( - request.receipt(), - proto::GetPrivateUserInfoResponse { - metrics_id: "the-metrics-id".into(), - }, - ) - .await; - let fs = FakeFs::new(cx.background()); fs.insert_tree("/private_dir", json!({ "one.rs": "" })) .await; diff --git a/crates/rpc/proto/zed.proto b/crates/rpc/proto/zed.proto index 6a48ad1b9764d2ca8ff7e5e7f9370c751e3da789..37434a6d4e7252f589a81564b5736558b8865d32 100644 --- a/crates/rpc/proto/zed.proto +++ b/crates/rpc/proto/zed.proto @@ -755,6 +755,7 @@ message GetPrivateUserInfo {} message GetPrivateUserInfoResponse { string metrics_id = 1; + bool staff = 2; } // Entities