From a233c3bcd0a4e839c768f1d08b61fa53c9ecb4b9 Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Sat, 20 Jan 2024 03:48:05 +0100 Subject: [PATCH 1/7] Update some easy deps --- crates/teloxide/Cargo.toml | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/crates/teloxide/Cargo.toml b/crates/teloxide/Cargo.toml index 8286a3a7..bf698114 100644 --- a/crates/teloxide/Cargo.toml +++ b/crates/teloxide/Cargo.toml @@ -23,7 +23,11 @@ default = ["native-tls", "ctrlc_handler", "teloxide-core/default", "auto-send"] webhooks = ["rand"] webhooks-axum = ["webhooks", "axum", "tower", "tower-http"] -sqlite-storage-nativetls = ["sqlx", "sqlx/runtime-tokio-native-tls", "native-tls"] +sqlite-storage-nativetls = [ + "sqlx", + "sqlx/runtime-tokio-native-tls", + "native-tls", +] sqlite-storage-rustls = ["sqlx", "sqlx/runtime-tokio-rustls", "rustls"] redis-storage = ["redis"] cbor-serializer = ["serde_cbor"] @@ -94,15 +98,15 @@ derive_more = "0.99" thiserror = "1.0" futures = "0.3.15" pin-project = "1.0" -serde_with_macros = "1.4" -aquamarine = "0.1.11" +serde_with_macros = "3.4" +aquamarine = "0.5.0" either = "1.9.0" sqlx = { version = "0.7.3", optional = true, default-features = false, features = [ "macros", "sqlite", ] } -redis = { version = "0.21", features = ["tokio-comp"], optional = true } +redis = { version = "0.24", features = ["tokio-comp"], optional = true } serde_cbor = { version = "0.11", optional = true } bincode = { version = "1.3", optional = true } axum = { version = "0.6.0", optional = true } @@ -113,7 +117,7 @@ rand = { version = "0.8.5", optional = true } [dev-dependencies] rand = "0.8.3" -pretty_env_logger = "0.4.0" +pretty_env_logger = "0.5.0" serde = "1" serde_json = "1" tokio = { version = "1.8", features = ["fs", "rt-multi-thread", "macros"] } @@ -146,7 +150,11 @@ required-features = ["redis-storage", "cbor-serializer", "bincode-serializer"] [[test]] name = "sqlite" path = "tests/sqlite.rs" -required-features = ["sqlite-storage-nativetls", "cbor-serializer", "bincode-serializer"] +required-features = [ + "sqlite-storage-nativetls", + "cbor-serializer", + "bincode-serializer", +] [[example]] From 0e3ffc7e774e0007718f615fa0da9897d4f8818c Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Sun, 21 Jan 2024 17:58:13 +0100 Subject: [PATCH 2/7] Fix `cargo docs` and use `--cfg docsrs` in CI --- .cargo/config.toml | 10 +++++++++- .github/workflows/ci.yml | 2 +- crates/teloxide/Cargo.toml | 1 - 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index 8fe98bda..995e7435 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -3,6 +3,8 @@ # https://github.com/rust-lang/cargo/issues/10333 # # "tokio/macros" and "tokio/rt-multi-thread" are required for examples +# +# N.B.: when changing this, also change `package.metadata.docs.rs` docs = """doc -Zrustdoc-scrape-examples --features=full --features=nightly @@ -11,4 +13,10 @@ docs = """doc [build] # We pass "--cfg docsrs" when building docs to add `This is supported on feature="..." only.` -rustdocflags = ["--cfg", "docsrs", "-Znormalize-docs"] +# +# FIXME: add back `-Znormalize-docs` once is fixed +# or we don't depend on `generic-array` anymore +# +# N.B.: when changing this, also change `RUSTDOCFLAGS` in `.github/workflows/ci.yml` and +# `package.metadata.docs.rs.rustdoc-args` in `crates/teloxide/Cargo.toml` +rustdocflags = ["--cfg", "docsrs"] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0d6d70fa..a3f20a57 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ name: Continuous integration env: RUSTFLAGS: "--cfg CI_REDIS -Dwarnings" - RUSTDOCFLAGS: -Dwarnings + RUSTDOCFLAGS: "--cfg docsrs -Dwarnings" RUST_BACKTRACE: short CARGO_INCREMENTAL: 0 diff --git a/crates/teloxide/Cargo.toml b/crates/teloxide/Cargo.toml index bf698114..c3e445c5 100644 --- a/crates/teloxide/Cargo.toml +++ b/crates/teloxide/Cargo.toml @@ -129,7 +129,6 @@ tokio-stream = "0.1" [package.metadata.docs.rs] # NB: can't use `all-features = true`, because `sqlite-storage-nativetls` conflicts with `sqlite-storage-rustls` features = ["full", "nightly"] -# FIXME: Add back "-Znormalize-docs" when https://github.com/rust-lang/rust/issues/93703 is fixed rustdoc-args = ["--cfg", "docsrs"] rustc-args = ["--cfg", "dep_docsrs"] cargo-args = ["-Zunstable-options", "-Zrustdoc-scrape-examples"] From f09fc36b2e26be5be1abc0c8c89767bf1ccc01de Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Sun, 21 Jan 2024 17:58:48 +0100 Subject: [PATCH 3/7] Improve docs for `distribution_function` --- crates/teloxide/src/dispatching/dispatcher.rs | 64 +++++++++++++++++-- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/crates/teloxide/src/dispatching/dispatcher.rs b/crates/teloxide/src/dispatching/dispatcher.rs index 91db674a..b5403423 100644 --- a/crates/teloxide/src/dispatching/dispatcher.rs +++ b/crates/teloxide/src/dispatching/dispatcher.rs @@ -106,6 +106,59 @@ where /// Specifies the distribution function that decides how updates are grouped /// before execution. + /// + /// ## Update grouping + /// + /// When [`Dispatcher`] receives updates, it runs dispatching tree + /// (handlers) concurrently. This means that multiple updates can be + /// processed at the same time. + /// + /// However, this is not always convenient. For example, if you have global + /// state, then you may want to process some updates sequentially, to + /// prevent state inconsistencies. + /// + /// This is why `teloxide` allows grouping updates. Updates for which the + /// distribution function `f` returns the same "distribution key" `K` will + /// be run in sequence (while still being processed concurrently with the + /// updates with different distribution keys). + /// + /// Updates for which `f` returns `None` will always be processed in + /// parallel. + /// + /// ## Default distribution function + /// + /// By default the distribution function is equivalent to `|upd| + /// upd.chat().map(|chat| chat.id)`, so updates from the same chat will be + /// processed sequentially. + /// + /// This pair nicely with dialogue system, which has state attached to + /// chats. + /// + /// ## Examples + /// + /// Grouping updates by user who caused this update to happen: + /// + /// ``` + /// use teloxide::{dispatching::Dispatcher, dptree, Bot}; + /// + /// let bot = Bot::new("TOKEN"); + /// let handler = dptree::entry() /* ... */; + /// let dp = Dispatcher::builder(bot, handler) + /// .distribution_function(|upd| upd.from().map(|user| user.id)) + /// .build(); + /// # let _: Dispatcher<_, (), _> = dp; + /// ``` + /// + /// Not grouping updates at all, always processing updates concurrently: + /// + /// ``` + /// use teloxide::{dispatching::Dispatcher, dptree, Bot}; + /// + /// let bot = Bot::new("TOKEN"); + /// let handler = dptree::entry() /* ... */; + /// let dp = Dispatcher::builder(bot, handler).distribution_function(|_| None::<()>).build(); + /// # let _: Dispatcher<_, (), _> = dp; + /// ``` #[must_use] pub fn distribution_function( self, @@ -184,10 +237,13 @@ where /// The base for update dispatching. /// -/// Updates from different chats are handled concurrently, whereas updates from -/// the same chats are handled sequentially. If the dispatcher is unable to -/// determine a chat ID of an incoming update, it will be handled concurrently. -/// Note that this behaviour can be altered with [`distribution_function`]. +/// ## Update grouping +/// +/// `Dispatcher` generally processes updates concurrently. However, by default, +/// updates from the same chat are processed sequentially. [Learn more about +/// update grouping]. +/// +/// [update grouping]: distribution_function#update-grouping /// /// See also: ["Dispatching or /// REPLs?"](../dispatching/index.html#dispatching-or-repls) From d2a9db3b803649ce9ca7f24830ebc6d99051bc2e Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Sun, 21 Jan 2024 19:09:11 +0100 Subject: [PATCH 4/7] Update contributing guidelines --- CONTRIBUTING.md | 112 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 103 insertions(+), 9 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5fdbfd2f..c205850e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,15 +1,109 @@ # Contributing -Before contributing, please read [our code style](https://github.com/teloxide/teloxide/blob/master/CODE_STYLE.md) and [the license](https://github.com/teloxide/teloxide/blob/master/LICENSE). +Before contributing, please read [our code style](./CODE_STYLE.md) and [the license](./LICENSE). -To change the source code, fork the `master` branch of this repository and work inside your own branch. Then send us a PR into `master` branch and wait for the CI to check everything. However, you'd better check changes first locally: +> **Note** +> +> These contributing instructions might not be fully up-to-date or complete. +> However, they should be a good starting point. +> +> If you find inaccuracies / missing things, please expand this or contact us. -``` -cargo clippy --all --all-features --all-targets -cargo test --all -RUSTDOCFLAGS="--cfg docsrs" cargo doc --open --all-features -# Using nightly rustfmt -cargo +nightly fmt --all -- --check +## Reporting bugs, questions, feature requests + +To report a bug or suggest new functionality go to [issues](https://github.com/teloxide/teloxide/issues). +Try to make MRE (**M**inimal **R**eproducible **E**xample) and specify your teloxide version to let others help you. + +If you want to ask a question, you can either +- Open a new [github discussion](https://github.com/teloxide/teloxide/discussions), or +- Write to our telegram group ([eng](https://t.me/teloxide), [ru](https://t.me/teloxide_ru)) + +## Code + +### Git + +To change the source code, you need a local copy of it. +Fork the `master` branch of this repository via github and clone your fork locally. + +When working on a new thing, create a new branch with `git switch -c my-branch-name` (or other commands that work with branches). +This way it will be easier to manage when you want to do other things. + +When your changes are ready, you can open a github pull request. + +If your branch has conflicts with master please resolve them by doing something like this: +```shell +# Temporary switch to master branch +git switch master + +# Pull changes from the upstream. +# You may need to use something different from "origin", +# depending on how you setup your remotes. +git pull origin master + +# Switch back to your feature branch +git switch - + +# Move your changes on top of changes in master branch. +git rebase master + +# Here you'll need to resolve the conflicts, +# git commands will print some guidance. + +# Once conflicts are resolved, +# forcefully push the changes to your fork +git push --force-with-lease ``` -To report a bug, suggest new functionality, or ask a question, go to [Issues](https://github.com/teloxide/teloxide/issues). Try to make MRE (**M**inimal **R**eproducible **E**xample) and specify your teloxide version to let others help you. +### Testing + +When you open a PR it will be tested in CI. +We recommend you test the PR before opening it: + +```shell +# Formatting (use `-- --check` if you only want to check) +cargo fmt --all + +# Build +cargo build --features "full nightly" + +# Run linter +cargo clippy --all-targets --features "full nightly" + +# Running tests +cargo test --features "full nightly" + +# Documentation (use --open if you want to open it in a browser) +# (note the -s, `docs` is an alias to pass some additional flags to `rustdoc`) +cargo docs +``` + +## Teloxide bot + +Teloxide uses @teloxidebot as a helper to manage PRs and issues. +It's based on triagebot developed by rustc developers which docs can be found [here](https://forge.rust-lang.org/triagebot/index.html). + +We'll describe here a few most used @teloxidebot's features, but we still recommend you read the docs. + +### PR status tracking + +Teloxide uses `S-*` labels (mainly https://github.com/teloxide/teloxide/labels/S-waiting-on-author and https://github.com/teloxide/teloxide/labels/S-waiting-on-review) to track the status of pull requests. + +You can change the status with `@teloxidebot review` and `@teloxidebot ready` (set the status to https://github.com/teloxide/teloxide/labels/S-waiting-on-review) or `@teloxidebot author` (sets the status to https://github.com/teloxide/teloxide/labels/S-waiting-on-author). + +Requesting a review from PR's assignee via github ui will also change the status of the PR to waiting on review. +Similarly, submitting a review that requests changes will change the status of the PR to waiting on author. + +There is also https://github.com/teloxide/teloxide/labels/S-blocked which can be set with `@teloxidebot blocked`. + +Please note that your PR won't be reviewed unless it's waiting for review :) + +### Labels + +Normally github only allows privileged users to change labels. +@teloxidebot allows anyone to add or remove certain [labels](https://github.com/teloxide/teloxide/labels/) with `@teloxidebot label +additional_label -removed_label`. +See more in the [documentation](https://forge.rust-lang.org/triagebot/index.html). + +### PR assignment + +When a PR is created @teloxidebot will automatically assign one of the maintainers to it. +If you want to override this assignment, use `r? @ReviewerUsername`. From c934e678f6a9cbf0e367505b3fd1eb53ec358376 Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Wed, 14 Feb 2024 20:59:02 +0100 Subject: [PATCH 5/7] Expand on pull request & minor fixes to CONTRIBUTING.md --- CONTRIBUTING.md | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c205850e..d43544bf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,8 +1,8 @@ # Contributing -Before contributing, please read [our code style](./CODE_STYLE.md) and [the license](./LICENSE). +Before contributing, please read [the license](./LICENSE). -> **Note** +> [!NOTE] > > These contributing instructions might not be fully up-to-date or complete. > However, they should be a good starting point. @@ -20,6 +20,10 @@ If you want to ask a question, you can either ## Code +### Style guide + +Before writing code, please read [our code style](./CODE_STYLE.md). + ### Git To change the source code, you need a local copy of it. @@ -30,7 +34,28 @@ This way it will be easier to manage when you want to do other things. When your changes are ready, you can open a github pull request. +### Pull Requests + +If your pull request fixes/resolves an existing [github issue] please specify so in the PR description. +For example: + +> Fixes #991 + +You can learn more about [Using keywords in issues and pull requests] in github documentation. + +If your pull request suggests new functionality or new changes, +please explain your point of view and all the necessary details. +(pros, cons, why you chose design you chose, your use cases, etc) + +In general try to make PR title/description clear, as they are the primary ways of communicating your intent to the reviewer + +[github issue]: https://github.com/teloxide/teloxide/issues +[Using keywords in issues and pull requests]: https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests + +### Merge conflicts + If your branch has conflicts with master please resolve them by doing something like this: + ```shell # Temporary switch to master branch git switch master From 4ab24a0a0c6b2d7bd3e67e456e7a8187b92803e0 Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Thu, 15 Feb 2024 21:41:26 +0100 Subject: [PATCH 6/7] Review changes to CONTRIBUTING.md --- CONTRIBUTING.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d43544bf..ecb368b2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,5 @@ # Contributing -Before contributing, please read [the license](./LICENSE). - > [!NOTE] > > These contributing instructions might not be fully up-to-date or complete. @@ -43,11 +41,10 @@ For example: You can learn more about [Using keywords in issues and pull requests] in github documentation. -If your pull request suggests new functionality or new changes, -please explain your point of view and all the necessary details. +If your pull request suggests new functionality or new changes, please explain your point of view and all the necessary details. (pros, cons, why you chose design you chose, your use cases, etc) -In general try to make PR title/description clear, as they are the primary ways of communicating your intent to the reviewer +In general try to make PR title/description clear, as they are the primary ways of communicating your intent to the reviewer. [github issue]: https://github.com/teloxide/teloxide/issues [Using keywords in issues and pull requests]: https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests From 8669c87f6fd03b8885daeee136998aa215b0e2d6 Mon Sep 17 00:00:00 2001 From: Tima Kinsart Date: Fri, 16 Feb 2024 05:01:01 +0800 Subject: [PATCH 7/7] Improve the style of `CONTRIBUTING.md` --- CONTRIBUTING.md | 61 ++++++++++++++++++++----------------------------- 1 file changed, 25 insertions(+), 36 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ecb368b2..06b9d35d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,16 +5,15 @@ > These contributing instructions might not be fully up-to-date or complete. > However, they should be a good starting point. > -> If you find inaccuracies / missing things, please expand this or contact us. +> If you find inaccuracies/missing things, please expand this or contact us. ## Reporting bugs, questions, feature requests -To report a bug or suggest new functionality go to [issues](https://github.com/teloxide/teloxide/issues). -Try to make MRE (**M**inimal **R**eproducible **E**xample) and specify your teloxide version to let others help you. +To report a bug or suggest new functionality, go to the [issues](https://github.com/teloxide/teloxide/issues). Try to make MRE (**M**inimal **R**eproducible **E**xample) and specify your `teloxide` version to let others help you. If you want to ask a question, you can either -- Open a new [github discussion](https://github.com/teloxide/teloxide/discussions), or -- Write to our telegram group ([eng](https://t.me/teloxide), [ru](https://t.me/teloxide_ru)) +- open a new [GitHub discussion](https://github.com/teloxide/teloxide/discussions), or +- write to our Telegram group ([ENG](https://t.me/teloxide), [RU](https://t.me/teloxide_ru)). ## Code @@ -24,34 +23,30 @@ Before writing code, please read [our code style](./CODE_STYLE.md). ### Git -To change the source code, you need a local copy of it. -Fork the `master` branch of this repository via github and clone your fork locally. +To change the source code, you need a local copy of it. Fork the `master` branch of this repository via GitHub and clone your fork locally. -When working on a new thing, create a new branch with `git switch -c my-branch-name` (or other commands that work with branches). -This way it will be easier to manage when you want to do other things. +When working on a new thing, create a new branch with `git switch -c my-branch-name` (or other commands that work with branches). This way, it will be easier to manage when you want to do other things. -When your changes are ready, you can open a github pull request. +When your changes are ready, you can open a new GitHub pull request. ### Pull Requests -If your pull request fixes/resolves an existing [github issue] please specify so in the PR description. -For example: +If your pull request fixes/resolves an existing [GitHub issue], please specify so in the PR description. For example: -> Fixes #991 +> Fixes #991. -You can learn more about [Using keywords in issues and pull requests] in github documentation. +You can learn more about [using keywords in issues and pull requests] in the GitHub documentation. -If your pull request suggests new functionality or new changes, please explain your point of view and all the necessary details. -(pros, cons, why you chose design you chose, your use cases, etc) +If your pull request suggests new functionality or new changes, please explain your point of view and all the necessary details (pros, cons, why you chose the design you chose, your use cases, etc.) -In general try to make PR title/description clear, as they are the primary ways of communicating your intent to the reviewer. +In general, try to make PR title/description as clear as possible, as they are the primary ways of communicating your intent to the reviewer. -[github issue]: https://github.com/teloxide/teloxide/issues -[Using keywords in issues and pull requests]: https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests +[GitHub issue]: https://github.com/teloxide/teloxide/issues +[using keywords in issues and pull requests]: https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests ### Merge conflicts -If your branch has conflicts with master please resolve them by doing something like this: +If your branch has conflicts with master, please resolve them by doing something like this: ```shell # Temporary switch to master branch @@ -78,8 +73,7 @@ git push --force-with-lease ### Testing -When you open a PR it will be tested in CI. -We recommend you test the PR before opening it: +When you open a PR, it will be tested in the CI. We recommend you test the PR before opening it: ```shell # Formatting (use `-- --check` if you only want to check) @@ -99,33 +93,28 @@ cargo test --features "full nightly" cargo docs ``` -## Teloxide bot +## @teloxidebot -Teloxide uses @teloxidebot as a helper to manage PRs and issues. -It's based on triagebot developed by rustc developers which docs can be found [here](https://forge.rust-lang.org/triagebot/index.html). +`teloxide` uses @teloxidebot as a helper to manage PRs and issues. It is based on triagebot used by rustc developers, which docs can be found [here](https://forge.rust-lang.org/triagebot/index.html). -We'll describe here a few most used @teloxidebot's features, but we still recommend you read the docs. +We will describe here a few most used @teloxidebot's features, but we still recommend you to read the docs. ### PR status tracking -Teloxide uses `S-*` labels (mainly https://github.com/teloxide/teloxide/labels/S-waiting-on-author and https://github.com/teloxide/teloxide/labels/S-waiting-on-review) to track the status of pull requests. +`teloxide` uses `S-*` labels (mainly https://github.com/teloxide/teloxide/labels/S-waiting-on-author and https://github.com/teloxide/teloxide/labels/S-waiting-on-review) to track the status of pull requests. -You can change the status with `@teloxidebot review` and `@teloxidebot ready` (set the status to https://github.com/teloxide/teloxide/labels/S-waiting-on-review) or `@teloxidebot author` (sets the status to https://github.com/teloxide/teloxide/labels/S-waiting-on-author). +You can change the status with `@teloxidebot review` and `@teloxidebot ready` (sets the status to https://github.com/teloxide/teloxide/labels/S-waiting-on-review) or `@teloxidebot author` (sets the status to https://github.com/teloxide/teloxide/labels/S-waiting-on-author). -Requesting a review from PR's assignee via github ui will also change the status of the PR to waiting on review. -Similarly, submitting a review that requests changes will change the status of the PR to waiting on author. +Requesting a review from PR's assignee via GitHub UI will also change the status of the PR to waiting on review. Similarly, submitting a review that requests changes will change the status of the PR to waiting on author. -There is also https://github.com/teloxide/teloxide/labels/S-blocked which can be set with `@teloxidebot blocked`. +There is also https://github.com/teloxide/teloxide/labels/S-blocked, which can be set with `@teloxidebot blocked`. Please note that your PR won't be reviewed unless it's waiting for review :) ### Labels -Normally github only allows privileged users to change labels. -@teloxidebot allows anyone to add or remove certain [labels](https://github.com/teloxide/teloxide/labels/) with `@teloxidebot label +additional_label -removed_label`. -See more in the [documentation](https://forge.rust-lang.org/triagebot/index.html). +Normally, GitHub only allows privileged users to change labels. @teloxidebot allows anyone to add or remove certain [labels](https://github.com/teloxide/teloxide/labels/) with `@teloxidebot label +additional_label -removed_label`. See more in the [documentation](https://forge.rust-lang.org/triagebot/index.html). ### PR assignment -When a PR is created @teloxidebot will automatically assign one of the maintainers to it. -If you want to override this assignment, use `r? @ReviewerUsername`. +When a PR is created, @teloxidebot will automatically assign one of the maintainers to it. If you want to override this assignment, use `r? @ReviewerUsername`.