Skip to content

Commit 70d7c67

Browse files
committed
make generic event matches fn
1 parent 273982e commit 70d7c67

File tree

5 files changed

+36
-29
lines changed

5 files changed

+36
-29
lines changed

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ authors = [ "Astavie <astavie@pm.me>" ]
77
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
88

99
[dependencies]
10-
derive_setters = "0.1.5"
1110
serde = { version = "1.0.126", features = ["derive"] }
1211
serde_json = "1.0.96"
1312
tokio = { version = "1.27.0", features = ["full"] }

src/cah/read.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,18 @@ impl Ingame {
1919
}
2020
pub fn create_read(&mut self, msg: &mut GameMessage, event: &Event) -> Option<Action> {
2121
if let PlayerKind::User(user) = self.czar {
22-
if let Some(i) = event
23-
.custom_id_number("#", user)
24-
.filter(|&i| i < self.players.len() - 1)
25-
{
22+
if let Some(i) = event.matches(|i| {
23+
if i.user.id != user {
24+
None
25+
} else {
26+
let s = i.data.custom_id.strip_prefix('#')?;
27+
let c = s.chars().next()?;
28+
B64_TABLE
29+
.iter()
30+
.position(|&p| p == c)
31+
.filter(|&i| i < self.players.len() - 1)
32+
}
33+
}) {
2634
return self.create_winner(msg, i);
2735
}
2836
}

src/cah/write.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ impl Ingame {
5959
if self.czar != PlayerKind::User(user) {
6060
changed = msg.create_select_grid(
6161
event,
62-
user,
6362
self.cards,
6463
&mut player.selected,
6564
|selected| {

src/game/widget.rs

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,11 @@ impl<'a> Event<'a> {
2121
}
2222
}
2323

24-
pub fn custom_id(&self) -> Option<&str> {
25-
Some(&self.interaction?.data.custom_id)
26-
}
27-
pub fn custom_id_number(&self, prefix: &str, user: Snowflake<User>) -> Option<usize> {
28-
if self.interaction?.user.id != user {
29-
return None;
30-
}
31-
32-
let id = &self.interaction?.data.custom_id;
33-
let s = id.strip_prefix(prefix)?;
34-
let c = s.chars().next()?;
35-
B64_TABLE.iter().position(|&p| p == c)
36-
}
37-
pub fn values(&self, id: &str) -> Option<&Vec<String>> {
38-
match self.interaction {
39-
Some(i) if i.data.custom_id == id => Some(&i.data.values),
40-
_ => None,
41-
}
24+
pub fn matches<T>(
25+
&self,
26+
f: impl FnOnce(&'a Interaction<MessageComponent>) -> Option<T>,
27+
) -> Option<T> {
28+
f(self.interaction?)
4229
}
4330

4431
pub fn button(
@@ -83,7 +70,13 @@ impl GameMessage {
8370
selected: &mut Vec<usize>,
8471
) {
8572
// get selected values
86-
let changed = match event.values(&name) {
73+
let changed = match event.matches(|i| {
74+
if i.data.custom_id == name {
75+
Some(&i.data.values)
76+
} else {
77+
None
78+
}
79+
}) {
8780
Some(v) => {
8881
*selected = v
8982
.iter()
@@ -134,7 +127,7 @@ impl GameMessage {
134127
max: i32,
135128
) {
136129
// get value
137-
match event.custom_id().and_then(|s| s.strip_prefix(&name)) {
130+
match event.matches(|i| i.data.custom_id.strip_prefix(&name)) {
138131
Some("__min") => *val = val.saturating_sub(1).max(min),
139132
Some("__max") => *val = val.saturating_add(1).min(max),
140133
_ => (),
@@ -199,17 +192,26 @@ impl GameMessage {
199192
pub fn create_select_grid(
200193
&mut self,
201194
event: &Event,
202-
user: Snowflake<User>,
203195
count: usize,
204196
selected: &mut Vec<Option<usize>>,
205197
done: impl FnOnce(&Vec<Option<usize>>) -> bool,
206198
) -> bool {
207199
// TODO: scrolling if too big
208200

209201
let mut changed = false;
202+
203+
// for some reason rust-analyzer thinks this is unused
204+
#[allow(unused_assignments)]
210205
let mut is_done = false;
211206

212-
if let Some(i) = event.custom_id_number("#", user).filter(|&i| i < count) {
207+
if let Some(i) = event.matches(|i| {
208+
let s = i.data.custom_id.strip_prefix('#')?;
209+
let c = s.chars().next()?;
210+
B64_TABLE
211+
.iter()
212+
.position(|&p| p == c)
213+
.filter(|&i| i < count)
214+
}) {
213215
if selected.contains(&Some(i)) {
214216
// we are not done anymore
215217
changed = done(selected);

0 commit comments

Comments
 (0)