Skip to content

Commit

Permalink
Switch history events to using historic user IDs instead of duplicati…
Browse files Browse the repository at this point in the history
…ng the entire user state
  • Loading branch information
spb committed May 27, 2024
1 parent d79f306 commit d2b5975
Show file tree
Hide file tree
Showing 22 changed files with 568 additions and 385 deletions.
50 changes: 22 additions & 28 deletions sable_ircd/src/capability/account_tag.rs
Original file line number Diff line number Diff line change
@@ -1,31 +1,25 @@
use super::*;
use crate::messages::OutboundMessageTag;
use sable_network::prelude::NetworkStateChange;
use sable_network::{network::Network, prelude::NetworkStateChange};

fn account_for_tag(update: &NetworkStateChange) -> Option<String> {
match update {
NetworkStateChange::UserNickChange(detail) => detail.user.account,
NetworkStateChange::UserAwayChange(detail) => detail.user.account,
NetworkStateChange::UserQuit(detail) => detail.user.account,
NetworkStateChange::MembershipFlagChange(detail) => detail.user.account,
NetworkStateChange::ChannelJoin(detail) => detail.user.account,
NetworkStateChange::ChannelPart(detail) => detail.user.account,
NetworkStateChange::UserLoginChange(detail) => detail.user.account,
fn account_for_tag(update: &NetworkStateChange, net: &Network) -> Option<String> {
let id = match update {
NetworkStateChange::UserNickChange(detail) => Some(&detail.user),
NetworkStateChange::UserAwayChange(detail) => Some(&detail.user),
NetworkStateChange::UserQuit(detail) => Some(&detail.user),
NetworkStateChange::MembershipFlagChange(detail) => Some(&detail.user),
NetworkStateChange::ChannelJoin(detail) => Some(&detail.user),
NetworkStateChange::ChannelPart(detail) => Some(&detail.user),
NetworkStateChange::UserLoginChange(detail) => Some(&detail.user),

NetworkStateChange::ChannelRename(detail) => detail.source.user().and_then(|u| u.account),
NetworkStateChange::ChannelInvite(detail) => detail.source.user().and_then(|u| u.account),
NetworkStateChange::NewMessage(detail) => detail.source.user().and_then(|u| u.account),
NetworkStateChange::ChannelKick(detail) => detail.source.user().and_then(|u| u.account),
NetworkStateChange::ChannelModeChange(detail) => {
detail.changed_by.user().and_then(|u| u.account)
}
NetworkStateChange::ChannelTopicChange(detail) => {
detail.setter.user().and_then(|u| u.account)
}
NetworkStateChange::ListModeAdded(detail) => detail.set_by.user().and_then(|u| u.account),
NetworkStateChange::ListModeRemoved(detail) => {
detail.removed_by.user().and_then(|u| u.account)
}
NetworkStateChange::ChannelRename(detail) => detail.source.user(),
NetworkStateChange::ChannelInvite(detail) => detail.source.user(),
NetworkStateChange::NewMessage(detail) => detail.source.user(),
NetworkStateChange::ChannelKick(detail) => detail.source.user(),
NetworkStateChange::ChannelModeChange(detail) => detail.changed_by.user(),
NetworkStateChange::ChannelTopicChange(detail) => detail.setter.user(),
NetworkStateChange::ListModeAdded(detail) => detail.set_by.user(),
NetworkStateChange::ListModeRemoved(detail) => detail.removed_by.user(),
NetworkStateChange::NewUser(_) => None,
NetworkStateChange::NewUserConnection(_) => None,
NetworkStateChange::UserConnectionDisconnected(_) => None,
Expand All @@ -35,12 +29,12 @@ fn account_for_tag(update: &NetworkStateChange) -> Option<String> {
NetworkStateChange::NewAuditLogEntry(_) => None,
NetworkStateChange::ServicesUpdate(_) => None,
NetworkStateChange::EventComplete(_) => None,
}
.map(|n| n.to_string())
}?;
Some(net.historic_user(*id).ok()?.account?.to_string())
}

pub fn account_tag(update: &NetworkStateChange) -> Option<OutboundMessageTag> {
account_for_tag(update).map(|account| {
pub fn account_tag(update: &NetworkStateChange, net: &Network) -> Option<OutboundMessageTag> {
account_for_tag(update, net).map(|account| {
OutboundMessageTag::new("account", Some(account), ClientCapability::AccountTag)
})
}
8 changes: 4 additions & 4 deletions sable_ircd/src/capability/with_tags.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
use crate::messages::OutboundClientMessage;
use sable_network::history::HistoryItem;
use sable_network::{history::HistoryItem, network::Network};

use super::*;

pub(crate) trait WithSupportedTags {
fn with_tags_from(self, from_update: &impl HistoryItem) -> Self;
fn with_tags_from(self, from_update: &impl HistoryItem, net: &Network) -> Self;
}

impl WithSupportedTags for OutboundClientMessage {
fn with_tags_from(self, from_update: &impl HistoryItem) -> Self {
fn with_tags_from(self, from_update: &impl HistoryItem, net: &Network) -> Self {
let server_time_tag = server_time::server_time_tag(from_update.timestamp());

let mut result = self.with_tag(server_time_tag);
if let Some(account_tag) = account_tag::account_tag(from_update.change()) {
if let Some(account_tag) = account_tag::account_tag(from_update.change(), net) {
result = result.with_tag(account_tag);
}

Expand Down
44 changes: 30 additions & 14 deletions sable_ircd/src/command/handlers/chathistory.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use super::*;
use crate::{capability::ClientCapability, utils};
use messages::send_history::SendHistoryItem;
use sable_network::network::state::HistoricMessageTarget;
use sable_network::network::state::HistoricMessageTargetId;

use std::cmp::{max, min};

Expand Down Expand Up @@ -231,16 +231,22 @@ fn handle_chathistory(
// Helper to extract the target name for chathistory purposes from a given event.
// This might be the source or target of the actual event, or might be None if it's
// an event type that we don't include in history playback
fn target_name_for_entry(for_user: UserId, entry: &HistoryLogEntry) -> Option<String> {
fn target_name_for_entry(
for_user: UserId,
entry: &HistoryLogEntry,
net: &Network,
) -> Option<String> {
match &entry.details {
NetworkStateChange::NewMessage(message) => {
if matches!(&message.target, HistoricMessageTarget::User(user) if user.id() == for_user)
{
Some(messages::MessageTarget::format(&message.source))
} else {
Some(message.target.format())
NetworkStateChange::NewMessage(message) => match &message.target {
HistoricMessageTargetId::User(user) if user.user() == &for_user => {
let source = net.historic_user(*user).ok()?;
Some(messages::MessageTarget::format(source))
}
}
_ => {
let target = net.message_target(&message.target).ok()?;
Some(target.format())
}
},
_ => None,
}
}
Expand Down Expand Up @@ -269,7 +275,7 @@ fn list_targets(
break;
}

if let Some(target_name) = target_name_for_entry(source.id(), entry) {
if let Some(target_name) = target_name_for_entry(source.id(), entry, &server.network()) {
found_targets.entry(target_name).or_insert(entry.timestamp);
}

Expand Down Expand Up @@ -327,7 +333,8 @@ fn send_history_for_target(
break;
}

if let Some(event_target) = target_name_for_entry(source.id(), entry) {
if let Some(event_target) = target_name_for_entry(source.id(), entry, &server.network())
{
if event_target == target {
backward_entries.push(entry);
}
Expand All @@ -350,7 +357,8 @@ fn send_history_for_target(
break;
}

if let Some(event_target) = target_name_for_entry(source.id(), entry) {
if let Some(event_target) = target_name_for_entry(source.id(), entry, &server.network())
{
if event_target == target {
forward_entries.push(entry);
}
Expand All @@ -362,10 +370,18 @@ fn send_history_for_target(
}
}

send_history_entries(into, subcommand, target, backward_entries, forward_entries)
send_history_entries(
server,
into,
subcommand,
target,
backward_entries,
forward_entries,
)
}

fn send_history_entries<'a>(
server: &ClientServer,
into: impl MessageSink,
subcommand: &str,
target: &str,
Expand Down Expand Up @@ -393,7 +409,7 @@ fn send_history_entries<'a>(
.rev()
.chain(forward_entries.into_iter())
{
entry.send_to(&batch, entry)?;
server.send_item(entry, &batch, entry)?;
}
}

Expand Down
Loading

0 comments on commit d2b5975

Please sign in to comment.