DutyContent/DcControl.cs

445 lines
11 KiB
C#
Raw Normal View History

2021-03-17 18:14:48 +01:00
using Advanced_Combat_Tracker;
using System;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
2021-08-16 19:04:55 +02:00
using System.Net;
2021-03-17 18:14:48 +01:00
using System.Windows.Forms;
namespace DutyContent
{
public partial class DcControl : UserControl, IActPluginV1
{
public static string PluginName => "DutyContent";
private static DcControl _self;
public static DcControl Self => _self;
//
private ActPluginData _ffxiv_plugin_data;
private bool _is_form_loaded;
private bool _is_plugin_initializing;
private TabPage _act_tab;
private Label _act_label;
2021-03-20 19:43:05 +01:00
private System.Timers.Timer _save_timer;
private System.Timers.Timer _update_timer;
2021-03-17 18:14:48 +01:00
private ThirdParty.NativeMethods.ProcessHandle _game_process;
2021-03-20 19:43:05 +01:00
private long _game_connection_tick = DateTime.Now.Ticks;
2021-03-17 18:14:48 +01:00
private bool _game_exist;
private bool _game_active;
private string _game_zone;
2021-08-16 19:04:55 +02:00
private IPAddress _game_ipaddr = IPAddress.None;
2021-03-17 18:14:48 +01:00
2021-06-07 01:48:23 +02:00
//
private const int IntervalGameActive = 50;
private const int IntervalGameExist = 300;
private const int IntervalGameNone = 500;
2021-03-17 18:14:48 +01:00
//
public DcControl()
{
_self = this;
//
RegisterActAssemblies();
InitializeComponent();
foreach (var f in Application.OpenForms)
{
if (f == ActGlobals.oFormActMain)
{
_is_form_loaded = true;
break;
}
}
//
Tab.DutyForm dutyform = new Tab.DutyForm();
tabPageDuty.Controls.Add(dutyform.Controls[0]);
Tab.PingForm pingform = new Tab.PingForm();
tabPagePing.Controls.Add(pingform.Controls[0]);
2021-03-17 18:14:48 +01:00
Tab.ConfigForm configform = new Tab.ConfigForm();
tabPageConfig.Controls.Add(configform.Controls[0]);
Tab.LogForm logform = new Tab.LogForm();
tabPageLog.Controls.Add(logform.Controls[0]);
2021-03-17 18:14:48 +01:00
}
//
public void RegisterActAssemblies()
{
var pin = ActGlobals.oFormActMain.ActPlugins.FirstOrDefault(x => x.pluginFile.Name.Equals("DutyContent.dll"));
DcConfig.PluginPath = pin?.pluginFile.DirectoryName;
DcConfig.DataPath = Path.Combine(DcConfig.PluginPath, "Data");
DcConfig.PluginConfigPath = Path.Combine(DcConfig.PluginPath, "DutyContent.config");
var actdata = ActGlobals.oFormActMain.AppDataFolder.FullName;
DcConfig.ActConfigPath = Path.Combine(actdata, "Config", "DutyContent.config");
2021-03-17 18:14:48 +01:00
}
//
public void InitPlugin(TabPage tab, Label label)
{
_act_tab = tab;
_act_label = label;
if (_is_form_loaded)
ActPluginInitialize();
else
ActGlobals.oFormActMain.Shown += OFormActMain_Shown;
var actinfo = System.Reflection.Assembly.GetAssembly(typeof(ActGlobals));
Logger.I(5, actinfo.GetName().Version);
2021-03-17 18:14:48 +01:00
if (_ffxiv_plugin_data == null)
{
_ffxiv_plugin_data = ActGlobals.oFormActMain.ActPlugins.Where(x =>
2021-12-04 05:32:20 +01:00
x.pluginFile.Name.ToUpper().StartsWith("FFXIV_ACT_PLUGIN") &&
(x.lblPluginStatus.Text.ToUpper().StartsWith("FFXIV PLUGIN STARTED.") ||
x.lblPluginStatus.Text.ToUpper().StartsWith("FFXIV_ACT_PLUGIN STARTED.")))
2021-03-17 18:14:48 +01:00
.Select(x => x)
.FirstOrDefault();
}
if (_ffxiv_plugin_data == null)
Logger.E(2); // FFXIV plugin is missing!
2021-03-17 18:14:48 +01:00
else
{
var ids = ((FFXIV_ACT_Plugin.FFXIV_ACT_Plugin)_ffxiv_plugin_data.pluginObj).DataSubscription;
ids.NetworkReceived -= FFXIVPlugin_NetworkReceived;
ids.NetworkReceived += FFXIVPlugin_NetworkReceived;
ids.ZoneChanged -= FFXIVPlugin_ZoneChanged;
ids.ZoneChanged += FFXIVPlugin_ZoneChanged;
Logger.I(6, System.Diagnostics.FileVersionInfo.GetVersionInfo(_ffxiv_plugin_data.pluginFile.FullName).FileVersion);
2021-03-17 18:14:48 +01:00
}
// begin region check - from cacbot "VersionChecker.cs"
try
{
var mach = System.Reflection.Assembly.Load("Machina.FFXIV");
var opcode_manager_type = mach.GetType("Machina.FFXIV.Headers.Opcodes.OpcodeManager");
var opcode_manager = opcode_manager_type.GetProperty("Instance").GetValue(null);
var machina_region = opcode_manager_type.GetProperty("GameRegion").GetValue(opcode_manager).ToString();
switch (machina_region)
{
//case "Chinese": // no chinese support now
case "Korean":
DcConfig.GameRegion = 1;
break;
default:
DcConfig.GameRegion = 0;
break;
}
Logger.I(45, machina_region, DcConfig.GameRegion);
}
catch (Exception ex)
{
Logger.Ex(ex, 44);
DcConfig.GameRegion = 0;
}
if (DcConfig.GameRegion != 0)
DcConfig.Duty.PacketForLocal = true;
// end region check
2021-03-20 19:43:05 +01:00
_save_timer = new System.Timers.Timer() { Interval = 5000 };
_save_timer.Elapsed += (sender, e) =>
{
DcConfig.SaveConfig();
_save_timer.Enabled = false;
};
2021-06-07 01:48:23 +02:00
_update_timer = new System.Timers.Timer() { Interval = IntervalGameExist };
2021-03-20 19:43:05 +01:00
_update_timer.Elapsed += (sender, e) =>
2021-03-17 18:14:48 +01:00
{
UpdateAndCheckProc();
_update_timer.Interval = _game_exist ? _game_active ?
2021-06-07 01:48:23 +02:00
IntervalGameActive : IntervalGameExist : IntervalGameNone;
2021-03-17 18:14:48 +01:00
};
2021-03-20 19:43:05 +01:00
_update_timer.Start();
2021-03-17 18:14:48 +01:00
}
//
public void DeInitPlugin()
{
2021-03-20 19:43:05 +01:00
_update_timer.Stop();
_save_timer.Stop();
2021-03-17 18:14:48 +01:00
DcConfig.PluginEnable = false;
Tab.UpdateNotifyForm.Self?.PluginDeinitialize();
Tab.PingForm.Self?.PluginDeinitialize();
2021-03-17 18:14:48 +01:00
Tab.DutyForm.Self?.PluginDeinitialize();
Tab.ConfigForm.Self?.PluginDeinitialize();
Tab.LogForm.Self?.PluginDeinitialize();
2021-03-17 18:14:48 +01:00
DcConfig.SaveConfig();
_act_tab = null;
if (_act_label != null)
{
_act_label.Text = "Closed";
_act_label = null;
}
}
private void OFormActMain_Shown(object sender, EventArgs e)
{
_is_form_loaded = true;
ActPluginInitialize();
}
//
private void ActPluginInitialize()
{
if (_is_plugin_initializing)
return;
_is_plugin_initializing = true;
_act_label.Text = "Starting...";
//
Locale.Initialize(Properties.Resources.DefaultMessage);
2021-03-17 18:14:48 +01:00
Logger.I(4, DcConfig.PluginVersion.ToString());
2021-03-20 19:43:05 +01:00
2021-06-14 11:45:49 +02:00
DcConfig.LoadConfig();
ShowStatusBarAsConfig(true);
2021-03-17 18:14:48 +01:00
DcConfig.ReadLanguage(true);
DcContent.ReadContent();
DcConfig.ReadPacket();
2021-03-17 18:14:48 +01:00
UpdateUiLocale();
lblStatusLeft.Text = Locale.Text(99, DcConfig.PluginVersion); // once here
2021-03-17 18:14:48 +01:00
//
Dock = DockStyle.Fill;
_act_tab.Controls.Add(this);
//
Tab.LogForm.Self?.PluginInitialize();
2021-03-17 18:14:48 +01:00
Tab.ConfigForm.Self?.PluginInitialize();
Tab.DutyForm.Self?.PluginInitialize();
Tab.PingForm.Self?.PluginInitialize();
2021-03-17 18:14:48 +01:00
tabMain.SelectedTab = tabPageDuty;
//
if (DcConfig.DataRemoteUpdate)
{
var tag = Updater.CheckPluginUpdate(out string body);
if (tag > DcConfig.PluginTag)
{
Tab.UpdateNotifyForm frm = new Tab.UpdateNotifyForm(tag, body);
frm.PluginInitialize();
frm.UpdateUiLocale();
TabPage tp = new TabPage(Locale.Text(206));
try
{
// why? sometimes trouble
tp.Controls.Add(frm.Controls[0]);
}
catch (Exception ex)
{
Logger.Ex(ex);
}
tabMain.TabPages.Add(tp);
if (DcConfig.LastUpdatedPlugin < tag)
{
tabMain.SelectedTab = tp;
DcConfig.LastUpdatedPlugin = tag;
DcConfig.SaveConfig();
}
Logger.C(Color.Aquamarine, 207, DcConfig.PluginTag, tag);
}
}
2021-03-17 18:14:48 +01:00
//
DcConfig.PluginEnable = true;
_is_plugin_initializing = false;
}
//
private void TabMain_DrawItem(object sender, DrawItemEventArgs e)
{
var g = e.Graphics;
TabPage p = tabMain.TabPages[e.Index];
Rectangle r = tabMain.GetTabRect(e.Index);
StringFormat s = new StringFormat()
{
Alignment = StringAlignment.Near,
LineAlignment = StringAlignment.Center,
};
Brush b, h;
Font f;
if (tabMain.SelectedIndex == e.Index)
{
f = new Font(tabMain.Font.FontFamily, 14.0f, FontStyle.Bold, GraphicsUnit.Pixel);
2021-03-17 18:14:48 +01:00
#if false
b = new SolidBrush(Color.Black);
h = SystemBrushes.Window;
#else
b = new SolidBrush(Color.White);
h = SystemBrushes.Highlight;
#endif
}
//else if (p.col)
else
{
f = new Font(tabMain.Font.FontFamily, 14.0f, FontStyle.Regular, GraphicsUnit.Pixel);
2021-03-17 18:14:48 +01:00
b = new SolidBrush(Color.DarkSlateGray);
h = SystemBrushes.Control;
}
g.FillRectangle(h, r);
g.DrawString(p.Text, f, b, r, new StringFormat(s));
}
2021-03-20 19:43:05 +01:00
//
public void RefreshSaveConfig(int interval = 5000)
2021-03-20 19:43:05 +01:00
{
_save_timer.Enabled = false;
_save_timer.Interval = interval;
_save_timer.Start();
}
2021-03-17 18:14:48 +01:00
//
private void UpdateAndCheckProc()
{
if (_game_process == null || _game_process.Process.HasExited)
{
_game_exist = false;
_game_active = false;
// will be update game status next time
var p = (from x in Process.GetProcessesByName("ffxiv_dx11") where !x.HasExited && x.MainModule != null && x.MainModule.ModuleName == "ffxiv_dx11.exe" select x).FirstOrDefault<Process>();
if (p != null && p.HasExited)
p = null;
if (((_game_process == null) != (p == null)) ||
(_game_process != null && p != null && _game_process.Process.Id != p.Id))
{
_game_process = p != null ? new ThirdParty.NativeMethods.ProcessHandle(p) : null;
}
}
else
{
_game_exist = true;
2021-03-20 19:43:05 +01:00
//
2021-03-17 18:14:48 +01:00
var fgw = ThirdParty.NativeMethods.GetForegroundWindow();
ThirdParty.NativeMethods.GetWindowThreadProcessId(fgw, out int id);
_game_active = _game_process.Process.Id == id;
2021-03-20 19:43:05 +01:00
//
var now = DateTime.Now.Ticks;
var delta = now - _game_connection_tick;
var span = new TimeSpan(delta);
if (span.TotalSeconds > 2)
{
_game_connection_tick = now;
2021-08-16 19:04:55 +02:00
DcConfig.Connections.BuildConnections(_game_process.Process, out var retaddr);
if (!_game_ipaddr.Equals(retaddr))
{
if (!retaddr.Equals(IPAddress.None))
Logger.I(42, retaddr);
else
Logger.I(42, Locale.Text(43));
_game_ipaddr = retaddr;
Tab.DutyForm.Self?.ResetContentItems();
}
2021-03-20 19:43:05 +01:00
}
2021-03-17 18:14:48 +01:00
}
var zone = ActGlobals.oFormActMain.CurrentZone;
if (_game_zone == null || !zone.Equals(_game_zone))
_game_zone = zone;
}
//
private void FFXIVPlugin_NetworkReceived(string connection, long epoch, byte[] message)
{
if (message.Length < 32)
return;
Tab.DutyForm.Self?.PacketHandler(connection, message);
}
//
private void FFXIVPlugin_ZoneChanged(uint zone_id, string zone_name)
{
Tab.DutyForm.Self?.ZoneChanged(zone_id, zone_name);
lblStatusLeft.Text = Locale.Text(34, zone_name, zone_id);
2021-03-17 18:14:48 +01:00
}
//
public void UpdateUiLocale()
{
ThirdParty.FontUtilities.SimpleChangeFont(this, DcConfig.UiFontFamily, true);
_act_label.Text = Locale.Text(1); // Duty ready
_act_tab.Text = Locale.Text(0); // FFXIV dc
tabPageDuty.Text = Locale.Text(300);
2021-03-17 18:14:48 +01:00
Tab.DutyForm.Self?.UpdateUiLocale();
tabPagePing.Text = Locale.Text(400);
Tab.PingForm.Self?.UpdateUiLocale();
tabPageConfig.Text = Locale.Text(200);
2021-03-17 18:14:48 +01:00
Tab.ConfigForm.Self?.UpdateUiLocale();
tabPageLog.Text = Locale.Text(500);
Tab.LogForm.Self?.UpdateUiLocale();
Tab.UpdateNotifyForm.Self?.UpdateUiLocale();
2021-03-17 18:14:48 +01:00
}
//
2021-08-16 19:04:55 +02:00
public void ShowStatusBarAsConfig(bool force = false)
{
if (DcConfig.StatusBar)
{
if (!lblStatusLeft.Visible || force)
{
tabMain.Dock = DockStyle.None;
lblStatusLeft.Visible = true;
}
}
else
{
if (lblStatusLeft.Visible || force)
{
lblStatusLeft.Visible = false;
tabMain.Dock = DockStyle.Fill;
}
}
}
2021-03-17 18:14:48 +01:00
}
}