Skip to content

Commit 2bfcbe0

Browse files
committed
Check rerouted history for message references when fetching chathistory.
1 parent 25326a1 commit 2bfcbe0

File tree

5 files changed

+94
-15
lines changed

5 files changed

+94
-15
lines changed

data/src/history.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -663,7 +663,7 @@ impl History {
663663
let max_triggers_highlight =
664664
metadata::latest_triggers_highlight(messages);
665665
let chathistory_references =
666-
metadata::latest_can_reference(messages);
666+
metadata::latest_can_reference(messages, None);
667667

668668
let full_history = std::mem::replace(
669669
self,
@@ -760,14 +760,15 @@ impl History {
760760
match self {
761761
History::Partial { messages, .. }
762762
| History::Full { messages, .. } => {
763-
messages.iter().find(|message| message.can_reference())
763+
messages.iter().find(|message| message.can_reference(None))
764764
}
765765
}
766766
}
767767

768768
pub fn last_can_reference_before(
769769
&self,
770770
server_time: DateTime<Utc>,
771+
rerouted_from: Option<&Target>,
771772
) -> Option<MessageReferences> {
772773
match self {
773774
History::Partial {
@@ -778,7 +779,8 @@ impl History {
778779
.iter()
779780
.rev()
780781
.find(|message| {
781-
message.can_reference() && message.server_time < server_time
782+
message.can_reference(rerouted_from)
783+
&& message.server_time < server_time
782784
})
783785
.map_or(
784786
if chathistory_references.as_ref().is_some_and(
@@ -796,7 +798,8 @@ impl History {
796798
.iter()
797799
.rev()
798800
.find(|message| {
799-
message.can_reference() && message.server_time < server_time
801+
message.can_reference(rerouted_from)
802+
&& message.server_time < server_time
800803
})
801804
.map(Message::references),
802805
}

data/src/history/manager.rs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -519,8 +519,19 @@ impl Manager {
519519
target: Target,
520520
server_time: DateTime<Utc>,
521521
) -> Option<MessageReferences> {
522-
self.data
523-
.last_can_reference_before(server, target, server_time)
522+
let reroute_target = match &target {
523+
Target::Channel(_) => None,
524+
Target::Query(query) => {
525+
self.reroute_rules.history_kind_for_query(query, &server)
526+
}
527+
};
528+
529+
self.data.last_can_reference_before(
530+
server,
531+
target,
532+
server_time,
533+
reroute_target,
534+
)
524535
}
525536

526537
pub fn mark_as_read(&mut self, kind: &history::Kind) -> Option<ReadMarker> {
@@ -1636,12 +1647,22 @@ impl Data {
16361647
server: Server,
16371648
target: Target,
16381649
server_time: DateTime<Utc>,
1650+
reroute_target: Option<history::Kind>,
16391651
) -> Option<MessageReferences> {
1652+
let reroute_reference = reroute_target
1653+
.and_then(|kind| self.map.get(&kind))
1654+
.and_then(|history| {
1655+
history.last_can_reference_before(server_time, Some(&target))
1656+
});
1657+
16401658
let kind = history::Kind::from_target(server, target);
16411659

16421660
self.map
16431661
.get(&kind)
1644-
.and_then(|history| history.last_can_reference_before(server_time))
1662+
.and_then(|history| {
1663+
history.last_can_reference_before(server_time, None)
1664+
})
1665+
.max(reroute_reference)
16451666
}
16461667

16471668
fn mark_as_read(&mut self, kind: &history::Kind) -> Option<ReadMarker> {

data/src/history/metadata.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use tokio::fs;
1010
use crate::Message;
1111
use crate::history::{Error, Kind, dir_path};
1212
use crate::message::{MessageReferences, source};
13+
use crate::target::Target;
1314

1415
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
1516
pub struct Metadata {
@@ -97,11 +98,14 @@ pub fn latest_triggers_highlight(
9798
.map(|message| message.server_time)
9899
}
99100

100-
pub fn latest_can_reference(messages: &[Message]) -> Option<MessageReferences> {
101+
pub fn latest_can_reference(
102+
messages: &[Message],
103+
rerouted_from: Option<&Target>,
104+
) -> Option<MessageReferences> {
101105
messages
102106
.iter()
103107
.rev()
104-
.find(|message| message.can_reference())
108+
.find(|message| message.can_reference(rerouted_from))
105109
.map(Message::references)
106110
}
107111

@@ -124,7 +128,7 @@ pub async fn save(
124128
read_marker,
125129
last_triggers_unread: latest_triggers_unread(messages),
126130
last_triggers_highlight: latest_triggers_highlight(messages),
127-
chathistory_references: latest_can_reference(messages),
131+
chathistory_references: latest_can_reference(messages, None),
128132
})?;
129133

130134
let path = path(kind).await?;

data/src/history/reroute.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ use std::collections::HashMap;
22
use std::sync::Arc;
33

44
use crate::user::Nick;
5-
use crate::{Server, client, config, isupport, message, server, target};
5+
use crate::{
6+
Server, client, config, history, isupport, message, server, target,
7+
};
68

79
#[derive(Debug, Clone, PartialEq, Eq, Default)]
810
pub struct RerouteRules {
@@ -128,7 +130,7 @@ impl RerouteRules {
128130
})
129131
}
130132

131-
pub fn target_for_query(
133+
pub fn message_target_for_query(
132134
&self,
133135
query: &target::Query,
134136
server: &Server,
@@ -154,6 +156,27 @@ impl RerouteRules {
154156
})
155157
})
156158
}
159+
160+
pub fn history_kind_for_query(
161+
&self,
162+
query: &target::Query,
163+
server: &Server,
164+
) -> Option<history::Kind> {
165+
self.direct_messages.get(server).and_then(|reroute_rules| {
166+
reroute_rules.iter().find_map(|reroute_rule| {
167+
(query.as_normalized_str()
168+
== reroute_rule.from.as_normalized_str())
169+
.then_some(match &reroute_rule.to {
170+
DirectMessageRerouteTarget::Channel(channel) => {
171+
history::Kind::Channel(server.clone(), channel.clone())
172+
}
173+
DirectMessageRerouteTarget::Server => {
174+
history::Kind::Server(server.clone())
175+
}
176+
})
177+
})
178+
})
179+
}
157180
}
158181

159182
fn matches_server_label(rule_server: &str, server: &Server) -> bool {

data/src/message.rs

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ pub fn reroute_private_target(
109109
) -> Option<Target> {
110110
match target {
111111
Target::Query { query, source } => {
112-
reroute_rules.target_for_query(query, server, source)
112+
reroute_rules.message_target_for_query(query, server, source)
113113
}
114114
_ => None,
115115
}
@@ -335,11 +335,39 @@ impl Message {
335335
}
336336
}
337337

338-
pub fn can_reference(&self) -> bool {
338+
pub fn can_reference(
339+
&self,
340+
rerouted_from: Option<&target::Target>,
341+
) -> bool {
339342
if matches!(self.direction, Direction::Sent)
340343
|| self.is_echo
341344
|| matches!(self.target.source(), Source::Internal(_))
342-
|| is_rerouted_private_message(self)
345+
|| self.rerouted_from.as_ref().zip(rerouted_from).is_some_and(
346+
|(message_target, target)| match target {
347+
target::Target::Channel(channel) => {
348+
if let message::Target::Channel {
349+
channel: message_channel,
350+
..
351+
} = &message_target
352+
{
353+
*channel == *message_channel
354+
} else {
355+
false
356+
}
357+
}
358+
target::Target::Query(query) => {
359+
if let message::Target::Query {
360+
query: message_query,
361+
..
362+
} = &message_target
363+
{
364+
*query == *message_query
365+
} else {
366+
false
367+
}
368+
}
369+
},
370+
)
343371
{
344372
return false;
345373
} else if let Source::Server(Some(source)) = self.target.source()

0 commit comments

Comments
 (0)