greatly simplify blocked status by removing temporary failure state

This commit is contained in:
2025-11-22 09:27:02 +00:00
parent 28486174f2
commit 660a478fbb
4 changed files with 20 additions and 69 deletions
+10 -50
View File
@@ -8,9 +8,7 @@ use crate::{
use std::{ use std::{
error::Error, error::Error,
path::{Path, PathBuf}, path::{Path, PathBuf},
time::{Duration, Instant},
}; };
use strum::{Display, EnumIter};
use windows::{ use windows::{
Win32::{ Win32::{
NetworkManagement::WindowsFirewall::{ NetworkManagement::WindowsFirewall::{
@@ -28,44 +26,21 @@ use windows::{
const FILTER_NAME_EXE: &str = "[GTA Tools] Block outbound traffic for all of GTA V"; const FILTER_NAME_EXE: &str = "[GTA Tools] Block outbound traffic for all of GTA V";
const FILTER_NAME_SAVE_SERVER: &str = "[GTA Tools] Block outbound traffic to Rockstar save server"; const FILTER_NAME_SAVE_SERVER: &str = "[GTA Tools] Block outbound traffic to Rockstar save server";
const INTERVAL: Duration = Duration::from_secs(3);
#[derive(Clone, Copy, Debug, Display, PartialEq, Eq, EnumIter)]
pub enum BlockedStatus {
Blocked,
Failed,
Unblocked,
}
impl From<bool> for BlockedStatus {
fn from(value: bool) -> Self {
if value {
Self::Blocked
} else {
Self::Unblocked
}
}
}
#[derive(Debug)] #[derive(Debug)]
pub struct GameNetworking { pub struct GameNetworking {
com_initialized: bool, com_initialized: bool,
pub blocked_status: BlockedStatus, pub blocked: bool,
timer: Instant,
counting: bool,
} }
impl Default for GameNetworking { impl Default for GameNetworking {
fn default() -> Self { fn default() -> Self {
Self { Self {
blocked_status: if Self::is_save_server_blocked().unwrap() { blocked: if Self::is_save_server_blocked().unwrap() {
Self::is_save_server_blocked().unwrap().into() Self::is_save_server_blocked().unwrap()
} else { } else {
Self::is_exe_blocked().unwrap().into() Self::is_exe_blocked().unwrap()
}, },
com_initialized: unsafe { CoInitializeEx(None, COINIT_MULTITHREADED) }.is_ok(), com_initialized: unsafe { CoInitializeEx(None, COINIT_MULTITHREADED) }.is_ok(),
timer: Instant::now(),
counting: false,
} }
} }
} }
@@ -130,17 +105,16 @@ impl GameNetworking {
pub fn block_exe(&mut self, system_info: &mut SystemInfo) -> Result<(), Box<dyn Error>> { pub fn block_exe(&mut self, system_info: &mut SystemInfo) -> Result<(), Box<dyn Error>> {
let Some(exe_path) = get_game_exe_path(system_info) else { let Some(exe_path) = get_game_exe_path(system_info) else {
self.blocked_status = BlockedStatus::Failed;
return Ok(()); return Ok(());
}; };
self.block_generic(Mode::EntireGame(exe_path.to_path_buf()))?; self.block_generic(Mode::EntireGame(exe_path.to_path_buf()))?;
self.blocked_status = Self::is_exe_blocked()?.into(); self.blocked = Self::is_exe_blocked()?;
Ok(()) Ok(())
} }
pub fn unblock_exe(&mut self) -> Result<(), Box<dyn Error>> { pub fn unblock_exe(&mut self) -> Result<(), Box<dyn Error>> {
self.unblock_generic(FILTER_NAME_EXE)?; self.unblock_generic(FILTER_NAME_EXE)?;
self.blocked_status = Self::is_exe_blocked()?.into(); self.blocked = Self::is_exe_blocked()?;
Ok(()) Ok(())
} }
@@ -150,13 +124,13 @@ impl GameNetworking {
pub fn block_save_server(&mut self, save_server_ip: &str) -> Result<(), Box<dyn Error>> { pub fn block_save_server(&mut self, save_server_ip: &str) -> Result<(), Box<dyn Error>> {
self.block_generic(Mode::SaveServer(save_server_ip.to_owned()))?; self.block_generic(Mode::SaveServer(save_server_ip.to_owned()))?;
self.blocked_status = Self::is_save_server_blocked()?.into(); self.blocked = Self::is_save_server_blocked()?;
Ok(()) Ok(())
} }
pub fn unblock_save_server(&mut self) -> Result<(), Box<dyn Error>> { pub fn unblock_save_server(&mut self) -> Result<(), Box<dyn Error>> {
self.unblock_generic(FILTER_NAME_SAVE_SERVER)?; self.unblock_generic(FILTER_NAME_SAVE_SERVER)?;
self.blocked_status = Self::is_save_server_blocked()?.into(); self.blocked = Self::is_save_server_blocked()?;
Ok(()) Ok(())
} }
@@ -164,34 +138,20 @@ impl GameNetworking {
Self::is_blocked_generic(FILTER_NAME_SAVE_SERVER) Self::is_blocked_generic(FILTER_NAME_SAVE_SERVER)
} }
pub fn reset_indicator_if_failed(&mut self) {
if self.blocked_status == BlockedStatus::Failed && !self.counting {
self.counting = true;
self.timer = Instant::now();
}
if self.blocked_status == BlockedStatus::Failed
&& self.counting
&& self.timer.elapsed() >= INTERVAL
{
self.counting = false;
self.blocked_status = Self::is_exe_blocked().unwrap().into();
}
}
pub fn ensure_not_both_blocked_simultaneously(&mut self, block_method: BlockMethod) { pub fn ensure_not_both_blocked_simultaneously(&mut self, block_method: BlockMethod) {
match block_method { match block_method {
BlockMethod::EntireGame => { BlockMethod::EntireGame => {
if Self::is_save_server_blocked().unwrap() { if Self::is_save_server_blocked().unwrap() {
// ignoring the return because if this is an error the user can just thug it out at that point // ignoring the return because if this is an error the user can just thug it out at that point
let _ = self.unblock_save_server(); let _ = self.unblock_save_server();
self.blocked_status = Self::is_exe_blocked().unwrap().into(); self.blocked = Self::is_exe_blocked().unwrap();
} }
} }
BlockMethod::SaveServer => { BlockMethod::SaveServer => {
if Self::is_exe_blocked().unwrap() { if Self::is_exe_blocked().unwrap() {
// ignoring the return because if this is an error the user can just thug it out at that point // ignoring the return because if this is an error the user can just thug it out at that point
let _ = self.unblock_exe(); let _ = self.unblock_exe();
self.blocked_status = Self::is_save_server_blocked().unwrap().into(); self.blocked = Self::is_save_server_blocked().unwrap();
} }
} }
} }
+5 -2
View File
@@ -164,8 +164,11 @@ impl App {
BlockMethod::SaveServer => ui.label("Rockstar save server access"), BlockMethod::SaveServer => ui.label("Rockstar save server access"),
}; };
ui.add_space(1.0); ui.add_space(1.0);
ui.create_indicator_dot(self.game_networking.blocked_status); ui.create_indicator_dot(if self.game_networking.blocked {
self.game_networking.reset_indicator_if_failed(); colours::RED
} else {
colours::GREEN
});
label label
}); });
ui.allocate_ui_with_layout( ui.allocate_ui_with_layout(
+5 -5
View File
@@ -2,7 +2,6 @@ use crate::{
gui::{ gui::{
app::{App, WINDOW_SIZE}, app::{App, WINDOW_SIZE},
tools, tools,
ui_ext::UiExt,
}, },
util::consts::{ util::consts::{
game::{EXE_ENHANCED, EXE_LEGACY}, game::{EXE_ENHANCED, EXE_LEGACY},
@@ -30,11 +29,12 @@ impl App {
ui.label(format!("focused: \"{current_title}\"")); ui.label(format!("focused: \"{current_title}\""));
}); });
ui.horizontal(|ui| { ui.horizontal(|ui| {
ui.label("blocked_status"); ui.label("blocked");
egui::ComboBox::from_id_salt("blocked_status") egui::ComboBox::from_id_salt("blocked")
.selected_text(self.game_networking.blocked_status.to_string()) .selected_text(self.game_networking.blocked.to_string())
.show_ui(ui, |ui| { .show_ui(ui, |ui| {
ui.build_menu(&mut self.game_networking.blocked_status); ui.selectable_value(&mut self.game_networking.blocked, true, "true");
ui.selectable_value(&mut self.game_networking.blocked, false, "false");
}); });
}); });
if ui.add(egui::Button::new("force refresh theme")).clicked() { if ui.add(egui::Button::new("force refresh theme")).clicked() {
-12
View File
@@ -15,20 +15,8 @@ pub mod game {
} }
pub mod colours { pub mod colours {
use crate::features::game_networking::BlockedStatus;
use eframe::egui; use eframe::egui;
pub const RED: egui::Color32 = egui::Color32::from_rgb(255, 96, 96); pub const RED: egui::Color32 = egui::Color32::from_rgb(255, 96, 96);
pub const YELLOW: egui::Color32 = egui::Color32::from_rgb(255, 255, 96);
pub const GREEN: egui::Color32 = egui::Color32::from_rgb(96, 255, 96); pub const GREEN: egui::Color32 = egui::Color32::from_rgb(96, 255, 96);
impl From<BlockedStatus> for egui::Color32 {
fn from(value: BlockedStatus) -> Self {
match value {
BlockedStatus::Blocked => RED,
BlockedStatus::Failed => YELLOW,
BlockedStatus::Unblocked => GREEN,
}
}
}
} }