use super::*;
impl Client {
pub fn enable_auto_reconnect(&self, config: ReconnectConfig) {
let mut auto = self
.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner());
auto.enabled = true;
auto.handler = Some(ReconnectHandler::new(config));
auto.extra_events.clear();
auto.force_disconnect = false;
reset_auto_recovery_handlers(&mut auto);
}
pub fn enable_auto_reconnect_with_events(
&self,
config: ReconnectConfig,
extra_events: Vec<crate::events::Event>,
) {
let mut auto = self
.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner());
auto.enabled = true;
auto.handler = Some(ReconnectHandler::new(config));
auto.extra_events = dedupe_events(extra_events);
auto.force_disconnect = false;
reset_auto_recovery_handlers(&mut auto);
}
pub fn disable_auto_reconnect(&self) {
let mut auto = self
.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner());
auto.enabled = false;
auto.handler = None;
auto.login_handler = None;
auto.join_handler = None;
auto.login_gave_up = false;
auto.join_gave_up = false;
auto.recovery_completed = false;
auto.clear_phase_tracking();
auto.extra_events.clear();
auto.force_disconnect = false;
}
pub fn set_reconnect_workflow_config(&self, workflow: ReconnectWorkflowConfig) {
let mut auto = self
.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner());
auto.workflow = workflow;
reset_auto_recovery_handlers(&mut auto);
}
pub fn reconnect_workflow_config(&self) -> ReconnectWorkflowConfig {
self.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner())
.workflow
.clone()
}
pub fn set_reconnect_phase_timeouts(
&self,
timeouts: ReconnectPhaseTimeouts,
) -> Result<(), crate::events::Error> {
validate_phase_timeouts(&timeouts)?;
self.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner())
.phase_timeouts = timeouts;
Ok(())
}
pub fn reconnect_phase_timeouts(&self) -> ReconnectPhaseTimeouts {
self.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner())
.phase_timeouts
.clone()
}
pub fn enable_full_auto_reconnect(
&self,
connect_config: ReconnectConfig,
workflow: ReconnectWorkflowConfig,
connect_params: ConnectParamsOwned,
login_params: crate::client::users::LoginParams,
) {
self.enable_auto_reconnect(connect_config);
self.set_reconnect_workflow_config(workflow);
self.set_reconnect_params(connect_params);
self.set_login_params(login_params);
}
pub fn auto_reconnect_enabled(&self) -> bool {
self.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner())
.enabled
}
pub fn set_reconnect_params(&self, params: ConnectParamsOwned) {
self.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner())
.params = Some(params);
}
pub fn reconnect_params(&self) -> Option<ConnectParamsOwned> {
self.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner())
.params
.clone()
}
pub fn set_auto_reconnect_events(&self, extra_events: Vec<crate::events::Event>) {
self.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner())
.extra_events = dedupe_events(extra_events);
}
pub fn add_auto_reconnect_event(&self, event: crate::events::Event) {
let mut auto = self
.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner());
if auto
.extra_events
.iter()
.any(|existing| std::mem::discriminant(existing) == std::mem::discriminant(&event))
{
return;
}
auto.extra_events.push(event);
}
pub fn remove_auto_reconnect_event(&self, event: crate::events::Event) -> bool {
let mut auto = self
.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner());
let before = auto.extra_events.len();
auto.extra_events
.retain(|existing| std::mem::discriminant(existing) != std::mem::discriminant(&event));
auto.extra_events.len() != before
}
pub fn auto_reconnect_events(&self) -> Vec<crate::events::Event> {
self.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner())
.extra_events
.clone()
}
pub fn last_channel(&self) -> Option<crate::types::ChannelId> {
self.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner())
.last_channel
}
pub fn set_last_channel(&self, channel: crate::types::ChannelId, password: Option<&str>) {
let mut auto = self
.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner());
auto.last_channel = Some(channel);
auto.last_channel_password = match password {
Some(value) if !value.is_empty() => Some(value.to_string()),
_ => None,
};
auto.join_gave_up = false;
auto.clear_join_phase();
}
pub fn clear_last_channel(&self) {
let mut auto = self
.auto_reconnect
.lock()
.unwrap_or_else(|e| e.into_inner());
auto.last_channel = None;
auto.last_channel_password = None;
auto.clear_join_phase();
auto.join_gave_up = false;
}
}