using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Win32;
using Netch.Controllers;
using Netch.Forms.Mode;
using Netch.Forms.Server;
using Netch.Models;
using Netch.Utils;
using Trojan = Netch.Forms.Server.Trojan;
using VMess = Netch.Forms.Server.VMess;
namespace Netch.Forms
{
public partial class MainForm : Form
{
///
/// 主控制器
///
private MainController _mainController = new MainController();
public MainForm()
{
InitializeComponent();
// 监听电源事件
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
CheckForIllegalCrossThreadCalls = false;
}
private void SaveConfigs()
{
Global.Settings.ServerComboBoxSelectedIndex = ServerComboBox.SelectedIndex;
if (ModeComboBox.Items.Count != 0 && ModeComboBox.SelectedItem != null)
{
if (ModeComboBox.Tag is object[] list)
{
Global.Settings.ModeComboBoxSelectedIndex = list.ToList().IndexOf(ModeComboBox.SelectedItem);
}
else
{
Global.Settings.ModeComboBoxSelectedIndex = ModeComboBox.Items.IndexOf(ModeComboBox.SelectedItem);
}
}
Configuration.Save();
}
private void MainForm_Load(object sender, EventArgs e)
{
// 计算 ComboBox绘制 目标宽度
_eWidth = ServerComboBox.Width / 10;
// 加载服务器
InitServer();
// 加载模式
InitMode();
// 加载翻译
InitText();
// 隐藏 NatTypeStatusLabel
NatTypeStatusText();
_sizeHeight = Size.Height;
_configurationGroupBoxHeight = ConfigurationGroupBox.Height;
_profileConfigurationHeight = ConfigurationGroupBox.Controls[0].Height / 3; // 因为 AutoSize, 所以得到的是Controls的总高度
_profileGroupboxHeight = ProfileGroupBox.Height;
// 加载快速配置
InitProfile();
// 自动检测延迟
Task.Run(() =>
{
while (true)
{
if (State == State.Waiting || State == State.Stopped)
{
TestServer();
Thread.Sleep(10000);
}
else
{
Thread.Sleep(200);
}
}
});
// 打开软件时启动加速,产生开始按钮点击事件
if (Global.Settings.StartWhenOpened)
{
ControlButton.PerformClick();
}
// 检查更新
if (Global.Settings.CheckUpdateWhenOpened)
{
CheckUpdate();
}
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing && State != State.Terminating)
{
// 取消"关闭窗口"事件
e.Cancel = true; // 取消关闭窗体
// 如果未勾选关闭窗口时退出,隐藏至右下角托盘图标
if (!Global.Settings.ExitWhenClosed)
{
// 使关闭时窗口向右下角缩小的效果
WindowState = FormWindowState.Minimized;
NotifyIcon.Visible = true;
if (_isFirstCloseWindow)
{
// 显示提示语
NotifyIcon.ShowBalloonTip(5,
UpdateChecker.Name,
i18N.Translate("Netch is now minimized to the notification bar, double click this icon to restore."),
ToolTipIcon.Info);
_isFirstCloseWindow = false;
}
Hide();
}
// 如果勾选了关闭时退出,自动点击退出按钮
else
{
Exit(true);
}
}
}
private void ControlButton_Click(object sender, EventArgs e)
{
ControlFun();
}
private void SettingsButton_Click(object sender, EventArgs e)
{
(Global.SettingForm = new SettingForm()).Show();
Hide();
}
private void MainForm_VisibleChanged(object sender, EventArgs e)
{
if (!Visible)
return;
if (i18N.LangCode != Global.Settings.Language)
{
i18N.Load(Global.Settings.Language);
InitText();
InitProfile();
}
if (ProfileButtons.Count != Global.Settings.ProfileCount)
InitProfile();
}
private void InitText()
{
ServerToolStripMenuItem.Text = i18N.Translate("Server");
ImportServersFromClipboardToolStripMenuItem.Text = i18N.Translate("Import Servers From Clipboard");
AddSocks5ServerToolStripMenuItem.Text = i18N.Translate("Add [Socks5] Server");
AddShadowsocksServerToolStripMenuItem.Text = i18N.Translate("Add [Shadowsocks] Server");
AddShadowsocksRServerToolStripMenuItem.Text = i18N.Translate("Add [ShadowsocksR] Server");
AddVMessServerToolStripMenuItem.Text = i18N.Translate("Add [VMess] Server");
AddTrojanServerToolStripMenuItem.Text = i18N.Translate("Add [Trojan] Server");
ModeToolStripMenuItem.Text = i18N.Translate("Mode");
CreateProcessModeToolStripMenuItem.Text = i18N.Translate("Create Process Mode");
SubscribeToolStripMenuItem.Text = i18N.Translate("Subscribe");
ManageSubscribeLinksToolStripMenuItem.Text = i18N.Translate("Manage Subscribe Links");
UpdateServersFromSubscribeLinksToolStripMenuItem.Text = i18N.Translate("Update Servers From Subscribe Links");
OptionsToolStripMenuItem.Text = i18N.Translate("Options");
ReloadModesToolStripMenuItem.Text = i18N.Translate("Reload Modes");
UninstallServiceToolStripMenuItem.Text = i18N.Translate("Uninstall Service");
CleanDNSCacheToolStripMenuItem.Text = i18N.Translate("Clean DNS Cache");
UpdateACLToolStripMenuItem.Text = i18N.Translate("Update ACL");
updateACLWithProxyToolStripMenuItem.Text = i18N.Translate("Update ACL with proxy");
reinstallTapDriverToolStripMenuItem.Text = i18N.Translate("Reinstall TUN/TAP driver");
OpenDirectoryToolStripMenuItem.Text = i18N.Translate("Open Directory");
AboutToolStripButton.Text = i18N.Translate("About");
// VersionLabel.Text = i18N.Translate("xxx");
exitToolStripMenuItem.Text = i18N.Translate("Exit");
RelyToolStripMenuItem.Text = i18N.Translate("Unable to start? Click me to download");
ConfigurationGroupBox.Text = i18N.Translate("Configuration");
ProfileLabel.Text = i18N.Translate("Profile");
ModeLabel.Text = i18N.Translate("Mode");
ServerLabel.Text = i18N.Translate("Server");
// UsedBandwidthLabel.Text = i18N.Translate("Used: 0 KB");
// DownloadSpeedLabel.Text = i18N.Translate("↓: 0 KB/s");
// UploadSpeedLabel.Text = i18N.Translate("↑: 0 KB/s");
NotifyIcon.Text = i18N.Translate("Netch");
ShowMainFormToolStripButton.Text = i18N.Translate("Show");
ExitToolStripButton.Text = i18N.Translate("Exit");
SettingsButton.Text = i18N.Translate("Settings");
ProfileGroupBox.Text = i18N.Translate("Profiles");
// 加载翻译
UsedBandwidthLabel.Text = $@"{i18N.Translate("Used", ": ")}0 KB";
UpdateStatus();
VersionLabel.Text = UpdateChecker.Version;
}
#region MISC
///
/// 监听电源事件,自动重启Netch服务
///
///
///
private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
//不对Netch命令等待状态的电源事件做任何处理
if (!State.Equals(State.Waiting))
{
switch (e.Mode)
{
case PowerModes.Suspend: //操作系统即将挂起
Logging.Info("操作系统即将挂起,自动停止===>" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
ControlFun();
break;
case PowerModes.Resume: //操作系统即将从挂起状态继续
Logging.Info("操作系统即将从挂起状态继续,自动重启===>" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
ControlFun();
break;
}
}
}
private void EditServerPictureBox_Click(object sender, EventArgs e)
{
SaveConfigs();
// 当前ServerComboBox中至少有一项
if (ServerComboBox.SelectedIndex != -1)
{
switch (Global.Settings.Server[ServerComboBox.SelectedIndex].Type)
{
case "Socks5":
new Socks5(ServerComboBox.SelectedIndex).Show();
break;
case "SS":
new Shadowsocks(ServerComboBox.SelectedIndex).Show();
break;
case "SSR":
new ShadowsocksR(ServerComboBox.SelectedIndex).Show();
break;
case "VMess":
new VMess(ServerComboBox.SelectedIndex).Show();
break;
case "Trojan":
new Trojan(ServerComboBox.SelectedIndex).Show();
break;
default:
return;
}
Hide();
}
else
{
MessageBoxX.Show(i18N.Translate("Please select a server first"));
}
}
private void SpeedPictureBox_Click(object sender, EventArgs e)
{
Enabled = false;
StatusText(i18N.Translate("Testing"));
Task.Run(() =>
{
TestServer();
Enabled = true;
StatusText(i18N.Translate("Test done"));
Refresh();
});
}
private void EditModePictureBox_Click(object sender, EventArgs e)
{
// 当前ModeComboBox中至少有一项
if (ModeComboBox.Items.Count > 0 && ModeComboBox.SelectedIndex != -1)
{
SaveConfigs();
var selectedMode = (Models.Mode) ModeComboBox.SelectedItem;
// 只允许修改进程加速的模式
if (selectedMode.Type == 0)
{
//Process.Start(Environment.CurrentDirectory + "\\mode\\" + selectedMode.FileName + ".txt");
var process = new Process(selectedMode);
process.Text = "Edit Process Mode";
process.Show();
Hide();
}
}
else
{
MessageBoxX.Show(i18N.Translate("Please select an mode first"));
}
}
private void DeleteModePictureBox_Click(object sender, EventArgs e)
{
// 当前ModeComboBox中至少有一项
if (ModeComboBox.Items.Count > 0 && ModeComboBox.SelectedIndex != -1)
{
var selectedMode = (Models.Mode) ModeComboBox.SelectedItem;
//删除模式文件
selectedMode.DeleteFile("mode");
ModeComboBox.Items.Clear();
Global.ModeFiles.Remove(selectedMode);
var array = Global.ModeFiles.ToArray();
Array.Sort(array, (a, b) => string.Compare(a.Remark, b.Remark, StringComparison.Ordinal));
ModeComboBox.Items.AddRange(array);
SelectLastMode();
Configuration.Save();
}
else
{
MessageBoxX.Show(i18N.Translate("Please select an mode first"));
}
}
private void CopyLinkPictureBox_Click(object sender, EventArgs e)
{
// 当前ServerComboBox中至少有一项
if (ServerComboBox.SelectedIndex != -1)
{
var selectedMode = (Models.Server) ServerComboBox.SelectedItem;
try
{
//听说巨硬BUG经常会炸,所以Catch一下 :D
Clipboard.SetText(ShareLink.GetShareLink(selectedMode));
}
catch (Exception)
{
// ignored
}
}
else
{
MessageBoxX.Show(i18N.Translate("Please select a server first"));
}
}
private void DeleteServerPictureBox_Click(object sender, EventArgs e)
{
// 当前 ServerComboBox 中至少有一项
if (ServerComboBox.SelectedIndex != -1)
{
var index = ServerComboBox.SelectedIndex;
Global.Settings.Server.Remove(ServerComboBox.SelectedItem as Models.Server);
ServerComboBox.Items.RemoveAt(index);
if (ServerComboBox.Items.Count > 0)
{
ServerComboBox.SelectedIndex = index != 0 ? index - 1 : index;
}
Configuration.Save();
}
else
{
MessageBoxX.Show(i18N.Translate("Please select a server first"));
}
}
private void Exit(bool forceExit = false)
{
if(IsDisposed) return;
// 已启动
if (State != State.Waiting && State != State.Stopped)
{
if (forceExit)
ControlFun();
else
{
if (!Global.Settings.StopWhenExited)
{
// 未开启自动停止
MessageBoxX.Show(i18N.Translate("Please press Stop button first"));
Visible = true;
ShowInTaskbar = true; // 显示在系统任务栏
WindowState = FormWindowState.Normal; // 还原窗体
NotifyIcon.Visible = true; // 托盘图标隐藏
return;
}
}
}
NotifyIcon.Visible = false;
Hide();
Task.Run(() =>
{
for (var i = 0; i < 16; i++)
{
if (State == State.Waiting || State == State.Stopped)
break;
Thread.Sleep(250);
}
SaveConfigs();
UpdateStatus(State.Terminating);
Dispose();
Environment.Exit(Environment.ExitCode);
});
}
#region NotifyIcon
private void ShowMainFormToolStripButton_Click(object sender, EventArgs e)
{
if (WindowState == FormWindowState.Minimized)
{
Visible = true;
ShowInTaskbar = true; // 显示在系统任务栏
WindowState = FormWindowState.Normal; // 还原窗体
NotifyIcon.Visible = true; // 托盘图标隐藏
}
Activate();
}
private void ExitToolStripButton_Click(object sender, EventArgs e)
{
Exit();
}
private void NotifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (WindowState == FormWindowState.Minimized)
{
Visible = true;
ShowInTaskbar = true; //显示在系统任务栏
WindowState = FormWindowState.Normal; //还原窗体
NotifyIcon.Visible = true; //托盘图标隐藏
}
Activate();
}
#endregion
#endregion
}
}