#include "stdafx.h" #include "NotifySettingsDlg.h" #include "NotifyManager.h" #include "context.h" NotifySettingsDlg::NotifySettingsDlg(CWnd* pParent) : CDialogLangEx(IDD_DIALOG_NOTIFY_SETTINGS, pParent) , m_powerShellAvailable(false) { } NotifySettingsDlg::~NotifySettingsDlg() { } void NotifySettingsDlg::DoDataExchange(CDataExchange* pDX) { CDialogLangEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_SMTP_SERVER, m_editSmtpServer); DDX_Control(pDX, IDC_EDIT_SMTP_PORT, m_editSmtpPort); DDX_Control(pDX, IDC_CHECK_SMTP_SSL, m_checkSmtpSSL); DDX_Control(pDX, IDC_EDIT_SMTP_USER, m_editSmtpUser); DDX_Control(pDX, IDC_EDIT_SMTP_PASS, m_editSmtpPass); DDX_Control(pDX, IDC_EDIT_SMTP_RECIPIENT, m_editSmtpRecipient); DDX_Control(pDX, IDC_CHECK_NOTIFY_ENABLED, m_checkNotifyEnabled); DDX_Control(pDX, IDC_COMBO_NOTIFY_TYPE, m_comboNotifyType); DDX_Control(pDX, IDC_COMBO_NOTIFY_COLUMN, m_comboNotifyColumn); DDX_Control(pDX, IDC_EDIT_NOTIFY_PATTERN, m_editNotifyPattern); DDX_Control(pDX, IDC_STATIC_NOTIFY_WARNING, m_staticWarning); } BEGIN_MESSAGE_MAP(NotifySettingsDlg, CDialogLangEx) ON_BN_CLICKED(IDC_BTN_TEST_EMAIL, &NotifySettingsDlg::OnBnClickedBtnTestEmail) ON_BN_CLICKED(IDC_CHECK_NOTIFY_ENABLED, &NotifySettingsDlg::OnBnClickedCheckNotifyEnabled) END_MESSAGE_MAP() BOOL NotifySettingsDlg::OnInitDialog() { CDialogLangEx::OnInitDialog(); // Set translatable text for static controls SetDlgItemText(IDC_GROUP_SMTP, _TR(_T("SMTP 配置"))); SetDlgItemText(IDC_STATIC_SMTP_SERVER, _TR(_T("服务器:"))); SetDlgItemText(IDC_STATIC_SMTP_PORT, _TR(_T("端口:"))); SetDlgItemText(IDC_CHECK_SMTP_SSL, _TR(_T("使用 SSL/TLS"))); SetDlgItemText(IDC_STATIC_SMTP_USER, _TR(_T("用户名:"))); SetDlgItemText(IDC_STATIC_SMTP_PASS, _TR(_T("密码:"))); SetDlgItemText(IDC_STATIC_SMTP_HINT, _TR(_T("(Gmail 需使用应用专用密码)"))); SetDlgItemText(IDC_STATIC_SMTP_RECIPIENT, _TR(_T("收件人:"))); SetDlgItemText(IDC_BTN_TEST_EMAIL, _TR(_T("测试"))); SetDlgItemText(IDC_GROUP_NOTIFY_RULE, _TR(_T("通知规则"))); SetDlgItemText(IDC_CHECK_NOTIFY_ENABLED, _TR(_T("启用通知"))); SetDlgItemText(IDC_STATIC_TRIGGER, _TR(_T("触发条件:"))); SetDlgItemText(IDC_STATIC_MATCH_COLUMN, _TR(_T("匹配列:"))); SetDlgItemText(IDC_STATIC_KEYWORDS, _TR(_T("关键词:"))); SetDlgItemText(IDC_STATIC_KEYWORDS_HINT, _TR(_T("(多个关键词用分号分隔,匹配任一项即触发通知)"))); SetDlgItemText(IDC_STATIC_NOTIFY_TIP, _TR(_T("提示: 同一主机 60 分钟内仅通知一次"))); SetDlgItemText(IDOK, _TR("确定")); SetDlgItemText(IDCANCEL, _TR("取消")); SetWindowText(_TR("通知设置")); // Check PowerShell availability m_powerShellAvailable = GetNotifyManager().IsPowerShellAvailable(); // Show warning if PowerShell is not available if (!m_powerShellAvailable) { m_staticWarning.SetWindowText(_T("Warning: Requires Windows 10 or later with PowerShell 5.1+")); // Disable all controls except OK/Cancel GetDlgItem(IDC_EDIT_SMTP_SERVER)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_SMTP_PORT)->EnableWindow(FALSE); GetDlgItem(IDC_CHECK_SMTP_SSL)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_SMTP_USER)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_SMTP_PASS)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_SMTP_RECIPIENT)->EnableWindow(FALSE); GetDlgItem(IDC_BTN_TEST_EMAIL)->EnableWindow(FALSE); GetDlgItem(IDC_CHECK_NOTIFY_ENABLED)->EnableWindow(FALSE); GetDlgItem(IDC_COMBO_NOTIFY_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_COMBO_NOTIFY_COLUMN)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NOTIFY_PATTERN)->EnableWindow(FALSE); } else { m_staticWarning.SetWindowText(_T("")); } PopulateComboBoxes(); LoadSettings(); UpdateControlStates(); return TRUE; } void NotifySettingsDlg::PopulateComboBoxes() { // Trigger type combo (currently only "Host Online") m_comboNotifyType.ResetContent(); m_comboNotifyType.AddString(_TR("主机上线")); m_comboNotifyType.SetItemData(0, NOTIFY_TRIGGER_HOST_ONLINE); m_comboNotifyType.SetCurSel(0); // Column combo - use translatable strings m_comboNotifyColumn.ResetContent(); struct { int id; const TCHAR* name; } columns[] = { { 0, _T("IP地址") }, { 1, _T("地址") }, { 2, _T("地理位置") }, { 3, _T("计算机名") }, { 4, _T("操作系统") }, { 5, _T("CPU") }, { 6, _T("摄像头") }, { 7, _T("延迟") }, { 8, _T("版本") }, { 9, _T("安装时间") }, { 10, _T("活动窗口") }, { 11, _T("客户端类型") }, }; for (const auto& col : columns) { CString item; item.Format(_T("%d - %s"), col.id, _TR(col.name)); m_comboNotifyColumn.AddString(item); m_comboNotifyColumn.SetItemData(m_comboNotifyColumn.GetCount() - 1, col.id); } m_comboNotifyColumn.SetCurSel(ONLINELIST_COMPUTER_NAME); // Default to computer name } void NotifySettingsDlg::LoadSettings() { // Get current config from manager m_config = GetNotifyManager().GetConfig(); // SMTP settings m_editSmtpServer.SetWindowText(CString(m_config.smtp.server.c_str())); CString portStr; portStr.Format(_T("%d"), m_config.smtp.port); m_editSmtpPort.SetWindowText(portStr); m_checkSmtpSSL.SetCheck(m_config.smtp.useSSL ? BST_CHECKED : BST_UNCHECKED); m_editSmtpUser.SetWindowText(CString(m_config.smtp.username.c_str())); m_editSmtpPass.SetWindowText(CString(m_config.smtp.password.c_str())); m_editSmtpRecipient.SetWindowText(CString(m_config.smtp.recipient.c_str())); // Rule settings const NotifyRule& rule = m_config.GetRule(); m_checkNotifyEnabled.SetCheck(rule.enabled ? BST_CHECKED : BST_UNCHECKED); // Set trigger type (currently only one option) m_comboNotifyType.SetCurSel(0); // Set column if (rule.columnIndex >= 0 && rule.columnIndex < m_comboNotifyColumn.GetCount()) { m_comboNotifyColumn.SetCurSel(rule.columnIndex); } m_editNotifyPattern.SetWindowText(CString(rule.matchPattern.c_str())); } void NotifySettingsDlg::SaveSettings() { CString str; // SMTP settings m_editSmtpServer.GetWindowText(str); m_config.smtp.server = CT2A(str, CP_UTF8); m_editSmtpPort.GetWindowText(str); m_config.smtp.port = _ttoi(str); m_config.smtp.useSSL = (m_checkSmtpSSL.GetCheck() == BST_CHECKED); m_editSmtpUser.GetWindowText(str); m_config.smtp.username = CT2A(str, CP_UTF8); m_editSmtpPass.GetWindowText(str); m_config.smtp.password = CT2A(str, CP_UTF8); m_editSmtpRecipient.GetWindowText(str); m_config.smtp.recipient = CT2A(str, CP_UTF8); // Rule settings NotifyRule& rule = m_config.GetRule(); rule.enabled = (m_checkNotifyEnabled.GetCheck() == BST_CHECKED); int sel = m_comboNotifyType.GetCurSel(); rule.triggerType = (sel >= 0) ? (NotifyTriggerType)m_comboNotifyType.GetItemData(sel) : NOTIFY_TRIGGER_HOST_ONLINE; sel = m_comboNotifyColumn.GetCurSel(); rule.columnIndex = (sel >= 0) ? (int)m_comboNotifyColumn.GetItemData(sel) : ONLINELIST_COMPUTER_NAME; m_editNotifyPattern.GetWindowText(str); rule.matchPattern = CT2A(str, CP_UTF8); // Update manager config and save GetNotifyManager().SetConfig(m_config); GetNotifyManager().SaveConfig(); } void NotifySettingsDlg::UpdateControlStates() { if (!m_powerShellAvailable) return; BOOL enabled = (m_checkNotifyEnabled.GetCheck() == BST_CHECKED); m_comboNotifyType.EnableWindow(enabled); m_comboNotifyColumn.EnableWindow(enabled); m_editNotifyPattern.EnableWindow(enabled); } void NotifySettingsDlg::OnOK() { SaveSettings(); CDialogLangEx::OnOK(); } void NotifySettingsDlg::OnBnClickedBtnTestEmail() { // Temporarily save current UI values to config for testing CString str; m_editSmtpServer.GetWindowText(str); m_config.smtp.server = CT2A(str, CP_UTF8); m_editSmtpPort.GetWindowText(str); m_config.smtp.port = _ttoi(str); m_config.smtp.useSSL = (m_checkSmtpSSL.GetCheck() == BST_CHECKED); m_editSmtpUser.GetWindowText(str); m_config.smtp.username = CT2A(str, CP_UTF8); m_editSmtpPass.GetWindowText(str); m_config.smtp.password = CT2A(str, CP_UTF8); m_editSmtpRecipient.GetWindowText(str); m_config.smtp.recipient = CT2A(str, CP_UTF8); // Update manager config temporarily NotifyConfig backup = GetNotifyManager().GetConfig(); NotifyConfig tempConfig = backup; tempConfig.smtp = m_config.smtp; GetNotifyManager().SetConfig(tempConfig); // Disable button during test GetDlgItem(IDC_BTN_TEST_EMAIL)->EnableWindow(FALSE); SetCursor(LoadCursor(NULL, IDC_WAIT)); // Send test email (synchronous) std::string result = GetNotifyManager().SendTestEmail(); // Restore config GetNotifyManager().SetConfig(backup); // Re-enable button GetDlgItem(IDC_BTN_TEST_EMAIL)->EnableWindow(TRUE); SetCursor(LoadCursor(NULL, IDC_ARROW)); // Show result if (result == "success") { MessageBox(_TR(_T("测试邮件发送成功!")), _TR(_T("测试邮件")), MB_OK | MB_ICONINFORMATION); } else { MessageBox(_TR(_T("测试邮件发送失败,请检查SMTP配置")), _TR(_T("测试邮件")), MB_OK | MB_ICONWARNING); } } void NotifySettingsDlg::OnBnClickedCheckNotifyEnabled() { UpdateControlStates(); }