greatly simplify blocked status by removing temporary failure state
This commit is contained in:
@@ -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
@@ -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
@@ -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() {
|
||||||
|
|||||||
@@ -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,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user