Skip to content

Commit 0348fc1

Browse files
authored
Show Zulip details in 'show-person'. (#1356)
Show `zulip_id` if present. In addition, if ZULIP_USER and ZULIP_TOKEN are set, try to look up the user's name (as shown in Zulip itself). This is useful for finding people whose Zulip name differs from their GitHub name.
1 parent efdfbb4 commit 0348fc1

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed

src/main.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const USER_AGENT: &str = "https://github.com/rust-lang/team (infra@rust-lang.org
1313

1414
use data::Data;
1515
use schema::{Email, Team, TeamKind};
16+
use zulip::ZulipApi;
1617

1718
use crate::schema::RepoPermission;
1819
use anyhow::{bail, format_err, Error};
@@ -292,8 +293,23 @@ fn run() -> Result<(), Error> {
292293
println!();
293294

294295
println!("github: @{}", person.github());
296+
if let Some(zulip_id) = person.zulip_id() {
297+
let zulip = ZulipApi::new();
298+
match zulip.require_auth() {
299+
Ok(()) => match zulip.get_user(zulip_id) {
300+
Ok(user) => println!("zulip: {} ({zulip_id})", user.name),
301+
Err(err) => {
302+
println!("zulip_id: {zulip_id} # Failed to look up Zulip name: {err}")
303+
}
304+
},
305+
Err(err) => {
306+
// We have no authentication credentials, so don't even attempt the network access.
307+
println!("zulip_id: {zulip_id} # Skipped name lookup: {err}");
308+
}
309+
}
310+
}
295311
if let Email::Present(email) = person.email() {
296-
println!("email: {}", email);
312+
println!("email: {}", email);
297313
}
298314
println!();
299315

src/zulip.rs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,7 @@ impl ZulipApi {
3636

3737
pub(crate) fn require_auth(&self) -> Result<(), Error> {
3838
if self.auth.is_none() {
39-
bail!(
40-
"missing {} and/or {} environment variables",
41-
USER_VAR,
42-
TOKEN_VAR
43-
);
39+
bail!("missing {USER_VAR} and/or {TOKEN_VAR} environment variables");
4440
}
4541
Ok(())
4642
}
@@ -56,6 +52,17 @@ impl ZulipApi {
5652
Ok(response)
5753
}
5854

55+
/// Get a single user of the Rust Zulip instance
56+
pub(crate) fn get_user(&self, user_id: u64) -> Result<ZulipUser, Error> {
57+
let response = self
58+
.req(Method::GET, &format!("/users/{user_id}"), None)?
59+
.error_for_status()?
60+
.json::<ZulipOneUser>()?
61+
.user;
62+
63+
Ok(response)
64+
}
65+
5966
/// Perform a request against the Zulip API
6067
fn req(
6168
&self,
@@ -78,12 +85,18 @@ impl ZulipApi {
7885
}
7986
}
8087

81-
/// A collection of Zulip users
88+
/// A collection of Zulip users, as returned from '/users'
8289
#[derive(Deserialize)]
8390
struct ZulipUsers {
8491
members: Vec<ZulipUser>,
8592
}
8693

94+
/// A collection of exactly one Zulip user, as returned from '/users/{user_id}'
95+
#[derive(Deserialize)]
96+
struct ZulipOneUser {
97+
user: ZulipUser,
98+
}
99+
87100
/// A single Zulip user
88101
#[derive(Clone, Deserialize, PartialEq, Eq, Hash)]
89102
pub(crate) struct ZulipUser {

0 commit comments

Comments
 (0)