/// <summary> /// 在指定范围内寻找图片 /// </summary> /// <param name="dmGuid"></param> /// <param name="key">资源键值</param> /// <param name="rect"></param> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> public bool FindPic(string dmGuid, object key, WxRect rect, out int x, out int y) { if (!m_picResources.ContainsKey(key)) { x = -1; y = -1; WxLog.Debug($"DMService.FindPic No Pic Resource With Key <{key}>"); return(false); } var dm = GetDM(dmGuid); var resource = m_picResources[key]; var result = dm.FindPicMem(rect.Left, rect.Top, rect.Right, rect.Bottom, resource.Info, "202020", 0.8, 0, out var xx, out var yy); if (result > -1) { x = (int)xx; y = (int)yy; return(true); } x = -1; y = -1; return(false); }
/// <summary> /// 为当前错误截图 /// </summary> /// <param name="message"></param> private void CaptureError(string message) { if (string.IsNullOrEmpty(DMGuid)) { return; } var fileName = $"Error{DateTime.Now:yyyyMMddHHmmss}_{message}.bmp"; if (!Directory.Exists("error")) { Directory.CreateDirectory("error"); } var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "error", fileName); try { DMService.Instance.Capture(DMGuid, WlyUtilityBiz.GameWndRect, filePath); } catch (Exception ex) { WxLog.Error($"WlyEntity.CaptureError <{ex}>"); } }
/// <summary> /// 获取军令数量 /// </summary> /// <param name="dmGuid"></param> /// <returns></returns> public static int GetPoint(string dmGuid) { // 首先跳转到主界面 WlyViewMgr.GoTo(dmGuid, WlyViewType.场景_主界面); var pointRect = new WxRect(119, 106, 163, 123); var words = string.Empty; var wait = FlowLogicHelper.RepeatRun(() => { words = DMService.Instance.GetWords(dmGuid, pointRect, "f3f3da-202020"); return(!string.IsNullOrEmpty(words)); }, TimeSpan.FromSeconds(20)); if (!wait) { throw new InvalidOperationException("无法获取军令信息"); } var result = int.TryParse(words.Split('/')[0], out var point); if (!result) { WxLog.Debug($"WlyUtilityBiz.GetPoint <{words}>"); return(0); } return(point); }
/// <summary> /// 通过指定的属性注册处理器 /// </summary> /// <param name="obj"></param> /// <param name="attributeType"></param> public void RegisterHandlersByAttribute(object obj, Type attributeType) { // 初始化注册函数 var register = GetType().GetMethod(nameof(RegisterHandler), BindingFlags.Public | BindingFlags.Instance); if (register == null) { throw new InvalidOperationException("Method RegisterHandler Not Found!"); } // 反射加载所有的消息处理器 var methods = obj.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (var method in methods) { try { var attribute = method.GetCustomAttribute(attributeType); if (attribute == null) { continue; } var para = method.GetParameters().First().ParameterType; var handler = typeof(Action <>).MakeGenericType(para); register.MakeGenericMethod(para).Invoke(this, new object[] { method.CreateDelegate(handler, obj) }); } catch (Exception ex) { WxLog.Error($"WxDispatcher.RegisterHandlersByAttribute Error <{ex}>"); } } }
public void Execute(object parameter) { if (null == m_execute) { return; } if (!CanExecute(parameter)) { return; } if (!m_isAsync) { m_execute(parameter); return; } Task.Run(() => { try { m_execute(parameter); } catch (Exception ex) { WxLog.Debug($"WxCommand.Execute {ex}"); } }); }
/// <summary> /// 执行任务 /// </summary> /// <param name="entity"></param> /// <returns></returns> protected override WlyTaskInfo InternalRun(WlyEntity entity) { var sub = (SubEntity)entity; var dmGuid = entity.DMGuid; WlyViewMgr.GoTo(dmGuid, WlyViewType.场景_主界面); // 获取名称 var name = DMService.Instance.GetWords(dmGuid, new WxRect(54, 0, 134, 24), "eae7d0-000000"); if (!name.Contains("海潮")) { WxLog.Error($"任务_名称检测.InternalRun Invalid Name <{name}> Account <{entity.Account}> Psw <{entity.Password}> UID<{entity.AccountInfo.UID}>"); return(new WlyTaskInfo(ID) { NextRunTime = DateTime.Now.AddDays(7) }); } try { sub.Info.Name = name; sub.Info.Index = int.Parse(name.Substring(2)); entity.Stop(); return(new WlyTaskInfo(ID, true)); } catch (Exception ex) { WxLog.Error($"任务_名称检测.InternalRun Name<{name}> Error <{ex}>"); return(new WlyTaskInfo(ID, DateTime.Now.AddDays(7))); } }
public static WlySystemInfo Load(string file) { WlySystemInfo info = null; try { if (File.Exists(file)) { info = JsonHelper.LoadFromXmlFile <WlySystemInfo>(file); info.m_configFile = file; } else { info = new WlySystemInfo(file); } } catch (Exception ex) { WxLog.Error($"WlySystemInfo.Load Error <{ex}>"); } var gameInterval = (int)(DateTime.Now - _gameStart).TotalDays; info.m_gameTime = $"{180 + (gameInterval / 4)}年 {_seasons[gameInterval % 4]}"; return(info); }
/// <summary> /// 使用 sql 语句与参数查询数据库 /// </summary> /// <param name="sqlString"></param> /// <param name="parameters"></param> /// <returns></returns> public override DataSet Query(string sqlString, IEnumerable <object> parameters) { try { // 构建命令 MySqlCommand cmd = new MySqlCommand { CommandText = sqlString, Connection = m_connection }; if (parameters != null) { foreach (var value in parameters) { cmd.Parameters.Add(new MySqlParameter { Value = value }); } } // 获取数据 MySqlDataAdapter adapter = new MySqlDataAdapter(cmd); var dataSet = new DataSet(); lock (m_executeLocker) { adapter.Fill(dataSet); } return(dataSet); } catch (Exception ex) { WxLog.Debug($"MySqlDatabase.Query \n\tsql<{sqlString}>\n\tex<{ex}>"); return(null); } }
/// <summary> /// 执行 sql 语句 /// </summary> /// <param name="sqlString"></param> /// <param name="parameters"></param> /// <returns></returns> public override bool Execute(string sqlString, IEnumerable <object> parameters) { try { MySqlCommand cmd = new MySqlCommand { CommandText = sqlString, Connection = m_connection }; if (parameters != null) { foreach (var value in parameters) { cmd.Parameters.Add(new MySqlParameter { Value = value }); } } lock (m_executeLocker) { return(cmd.ExecuteNonQuery() == 0); } } catch (Exception ex) { WxLog.Error($"MySqlDatabase.Execute \n\tsqlString<{sqlString}>\n\tex<{ex}>"); return(false); } }
/// <summary> /// 创建账号,写入数据库 /// </summary> /// <param name="user"></param> /// <param name="psw"></param> private void CreateAccount(string user, string psw) { var sql = "insert into AccountInfo(UID, Account, Psw, LastLoginTime) values (?, ?, ?, ?);"; var uid = MathHelper.GetNewGuid(); var result = m_mySqlDatabase.Execute(sql, new object[] { uid, user, psw, DateTime.MinValue }); WxLog.Debug($"RegEntity.CreateAccount <{user} | {psw}> Result<{result}>"); }
public void Start() { m_accountInfo = MainAccountInfo.LoadAccount(m_mainFile); if (!File.Exists(m_mainFile)) { m_accountInfo.Save(); } m_mainEntity = new MainEntity(m_accountInfo); MainTaskMgr.Instance.InitEntityTasks(m_mainEntity); m_mainEntity.DescriptionChanged += MainEntityOnDescriptionChanged; m_mainEntity.Start(); foreach (var t in WxHelper.GetEnumValues <WlySwitchType>()) { var info = m_accountInfo.GetSwitchInfo(t); var wrapper = new WlyTaskSwitchWrapper(info); wrapper.Changed += WrapperOnChanged; Switches.Add(wrapper); } // 主账号监测 m_cancellationTokenSource = new CancellationTokenSource(); var token = m_cancellationTokenSource.Token; Task.Run(() => { while (!token.IsCancellationRequested) { try { Thread.Sleep(TimeSpan.FromMinutes(1)); if (!m_mainEntity.Run) { WxLog.Debug($"WlyAutoVM.Start 对主账号进行重置 <{DateTime.Now}>"); m_mainEntity.Stop(); m_mainEntity.DescriptionChanged -= MainEntityOnDescriptionChanged; MainEntity = new MainEntity(m_accountInfo); MainTaskMgr.Instance.InitEntityTasks(m_mainEntity); m_mainEntity.DescriptionChanged += MainEntityOnDescriptionChanged; m_mainEntity.Start(); } } catch (Exception ex) { WxLog.Error($"WlyAutoVM.Start Error <{ex}>"); } } WxLog.Debug($"WlyAutoVM.Start Stop On <{ResetTime}>"); }, token); //StartSubCmdExecute(this); }
/// <summary> /// 根据数据库类型创建对应数据库实体 /// </summary> /// <param name="type">数据库类型</param> /// <returns></returns> /// <exception cref="WxException">不支持的数据库类型.</exception> public IWxDatabase CreateDatabase(WxDatabaseType type) { WxLog.Debug($"WxDatabasePlugin.CreateDatabase \t<{type}>"); switch (type) { case WxDatabaseType.MySql: return(new MySqlDatabase()); default: return(null); } }
static ResourceFactory() { var assembly = typeof(ResourceFactory).Assembly; foreach (var res in assembly.GetManifestResourceNames()) { WxLog.Debug($"ResourceFactory.ResourceFactory Res <{res}>"); var stream = assembly.GetManifestResourceStream(res); var resource = new BizResouce(res, stream); m_dict.TryAdd(resource.Name, resource); } }
/// <summary> /// 开始运行脚本 /// </summary> private void StartGame() { if (m_process != null) { m_process.Close(); m_process.Kill(); m_process = null; } m_process = Process.Start(new ProcessStartInfo { UseShellExecute = false, FileName = m_programPath }); var result = Login(); if (!result) { // 启动失败,等待重启 State = RunningState.Stopped; return; } // 设置开始时间 StartTime = DateTime.Now; // 获取新窗口句柄 m_dmsoft = DMFactory.Instance.CreateDMSoft(); while (true) { var handle = m_dmsoft.EnumWindowByProcessId(m_process.Id, "", "MacromediaFlashPlayerActiveX", 2); WxLog.Debug($"AppEntity.StartGame Handl <{handle}>"); var hs = handle.Split(','); foreach (var h in hs) { try { var it = int.Parse(h); m_dmsoft.BindWindow(it, "gdi", "windows", "windows", 101); var title = m_dmsoft.GetWindowClass(it); WxLog.Debug($"AppEntity.StartGame {title}"); } catch { } } Thread.Sleep(10000); } }
public virtual void Init(ITestOutputHelper output) { lock (m_locker) { if (m_isInit) { return; } m_isInit = true; WxLog.RegisterOutput(log => { output.WriteLine(log); }); WxFrameworkService.Instance.Init(); } }
/// <summary> /// 构建大漠插件实体 /// </summary> /// <returns></returns> public dmsoft CreateDMSoft() { while (true) { var dm = new dmsoft(); var result = dm.Reg(m_code, ""); if (result == 1) { return(dm); } WxLog.Debug($"DMFactory.CreateDMSoft Result <{result}> ReCreate"); Thread.Sleep(1000); } }
/// <summary> /// 关闭聊天窗 /// </summary> private void CloseChat() { while (true) { var result = DMFactory.Instance.FindPic(m_dm, ResourceEnum.CloseChat, out var x, out var y); if (result) { WxLog.Debug($"MainEntity.CloseChat Location:{x},{y}"); m_dm.MoveTo(x + 5, y + 5); m_dm.LeftClick(); Thread.Sleep(100); } WxLog.Debug($"MainEntity.CloseChat Finish"); break; } }
/// <summary>将源值转换为绑定目标的值。 数据绑定引擎在将该值从源绑定传播到绑定目标时会调用此方法。</summary> /// <param name="values"> /// <see cref="T:System.Windows.Data.MultiBinding" /> 中的源绑定生成的值的数组。 值 <see cref="F:System.Windows.DependencyProperty.UnsetValue" /> 指示源绑定没有可供转换的值。</param> /// <param name="targetType">绑定目标属性的类型。</param> /// <param name="parameter">要使用的转换器参数。</param> /// <param name="culture">要用在转换器中的区域性。</param> /// <returns>转换后的值。如果该方法返回 null,则会使用有效的 null 值。<see cref="T:System.Windows.DependencyProperty" />。<see cref="F:System.Windows.DependencyProperty.UnsetValue" /> 的返回值指示转换器没有生成值,并且绑定将使用 <see cref="P:System.Windows.Data.BindingBase.FallbackValue" />(如果可用),或者将使用默认值。<see cref="T:System.Windows.Data.Binding" /><see cref="F:System.Windows.Data.Binding.DoNothing" /> 的返回值指示绑定不会传输该值,或不使用 <see cref="P:System.Windows.Data.BindingBase.FallbackValue" /> 或默认值。</returns> public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { try { DateTime current = (DateTime)values[0]; DateTime target = (DateTime)values[1]; if (target < current) { return("可执行"); } return($"{target - current:hh\\:mm\\:ss}"); } catch (Exception ex) { WxLog.Error($"TimeToLastConverter.Convert Error <{ex}>"); return("可执行"); } }
/// <summary> /// 连接数据库 /// </summary> /// <param name="username"></param> /// <param name="password"></param> /// <param name="ip"></param> /// <param name="dbname"></param> /// <returns></returns> public override bool Connect(string username, string password, string ip, string dbname) { try { m_connectionString = $"server={ip};User Id={username};password={password};Database={dbname}"; m_connection = new MySqlConnection(m_connectionString); m_connection.Open(); WxLog.Debug($"MySqlDatabase.Connect \t<{m_connectionString}>"); // 初始化命令队列线程 var cmdQueueThread = new Thread(HandleCmdQueue); cmdQueueThread.Start(); WxLog.Debug("MySqlDatabase.Connect CmdQueueThead Start!"); return(true); } catch (Exception ex) { WxLog.Debug($"MySqlDatabase.Connect \t<{ex}>"); return(false); } }
protected override void InternalBackupWorkThread() { // 小号无其他任务则直接停止 WxLog.Debug($"SubEntity.InternalBackupWorkThread No More Tasks <{Account}>"); var time = WlyUtilityBiz.GetRefreshTime(); foreach (var runner in TaskList.ToList()) { var info = AccountInfo.GetTaskInfo(runner.Task.ID); if (info.NextRunTime < time) { time = info.NextRunTime; } } m_subAccountInfo.NextLoginTime = time; WxLog.Debug($"SubEntity.InternalBackupWorkThread Name<{m_subAccountInfo.Name}> " + $"NextLoginTime<{m_subAccountInfo.NextLoginTime:yyyy-MM-dd HH:mm:ss}>"); m_subAccountInfo.Save(); Stop(); }
/// <summary> /// 反注册处理器 /// </summary> /// <typeparam name="TIn"></typeparam> /// <param name="handler"></param> /// <returns></returns> public bool UnRegisterHandler <TIn>(Action <TIn> handler) { try { if (handler == null) { return(false); } var type = typeof(TIn); if (m_msgHandlers.ContainsKey(type)) { m_msgHandlers[type] = Delegate.Remove(m_msgHandlers[type], handler); } return(true); } catch (Exception ex) { WxLog.Error($"WxDispatcher.UnRegisterHandler Error <{ex}>"); return(false); } }
/// <summary> /// 关闭进程 /// </summary> protected void CloseProcess() { try { if (EntityProcess != null) { EntityProcess.Kill(); EntityProcess.Close(); EntityProcess.Dispose(); EntityProcess = null; } } catch (Exception ex) { WxLog.Error($"WlyEntity.CloseProcess Error <{ex}>"); } if (!string.IsNullOrEmpty(DMGuid)) { DMService.Instance.ReleaseDMSoft(DMGuid); DMGuid = null; } }
private void KeepAliveElapsed(object sender, ElapsedEventArgs e) { m_timer.Stop(); var now = DateTime.Now; try { foreach (var entity in entityList.ToList()) { if ((entity.State == RunningState.Stopped) || ((now - entity.StartTime).TotalMinutes > 10)) { entity.Stop(); entityList.Remove(entity); var newEntity = new AppEntity(entity); entityList.Add(newEntity); newEntity.Start(m_config.ProgramPath); } } foreach (var reg in regList) { if (!reg.Run) { reg.Start(m_config.ProgramPath, reg.Index); } } } catch (Exception ex) { WxLog.Error($"MainWindowViewModel.KeepAliveElapsed Ex <{ex}>"); } finally { m_timer.Start(); } }
/// <summary> /// 命令队列处理函数 /// </summary> private void HandleCmdQueue() { while (true) { m_queueSemaphore.WaitOne(); IList <MySqlCommand> cmdList; lock (m_queueLocker) { WxLog.Warn($"MySqlDatabase.HandleCmdQueue \t<{m_sqlCommands.Count}>"); cmdList = m_sqlCommands.ToList(); m_sqlCommands.Clear(); } // 执行批量命令 MySqlTransaction tx = m_connection.BeginTransaction(); foreach (MySqlCommand mySqlCommand in cmdList) { mySqlCommand.Connection = m_connection; mySqlCommand.Transaction = tx; mySqlCommand.ExecuteNonQuery(); } lock (m_executeLocker) { tx.Commit(); } // 消灭多余的信号量 for (var i = 0; i < (cmdList.Count - 1); i++) { m_queueSemaphore.WaitOne(); } Thread.Sleep(1000); } }
protected override void InternalAfterLogin() { SubTaskMgr.Instance.InitEntityTasks(this); m_loginFlag = true; if (!m_subAccountInfo.Check) { var wait = FlowLogicHelper.RepeatRun(() => { var view = WlyViewMgr.GetView(WlyViewType.略_防沉迷验证); var view1 = WlyViewMgr.GetView(WlyViewType.略_跳过); return(DMService.Instance.FindPic(DMGuid, WlyPicType.择国家, WlyUtilityBiz.GameWndRect) || view.IsCurrentView(DMGuid) || view1.IsCurrentView(DMGuid)); }, TimeSpan.FromSeconds(30)); if (wait && DMService.Instance.FindPic(DMGuid, WlyPicType.择国家, WlyUtilityBiz.GameWndRect)) { CreateRole(AutoPlayerVM.Instance.GetAvailableName()); } } WxLog.Debug($"SubEntity.InternalAfterLogin AutoPlay Start <{m_subAccountInfo.Name}>"); // 先检测主公等级 var level = WlyUtilityBiz.GetMainLevel(DMGuid); if (level > m_subAccountInfo.Level) { WlyMainLevelMgr.Upgrade(DMGuid); m_subAccountInfo.Level = level; m_subAccountInfo.Save(); } // 检测银币数量是否到达上限 var result = WlyUtilityBiz.GetPercent(DMGuid, new WxRect(133, 26, 217, 47), "f3f3da-000000", out var percent); if (!result) { throw new InvalidOperationException("Cannot Get Money Amount"); } // 银币超过上限了,想尽办法进行使用 if (percent >= 0.9) { GetEuqipments(); UpgradeEquipments(); } // 如果可以捐国政了,则捐国政 var now = DateTime.Now; var timeNotOK = (now.DayOfWeek == DayOfWeek.Sunday) && (now.Hour >= 4) && (now.Hour < 21); if ((percent >= 0.5) && (m_subAccountInfo.GetBuildingInfo(WlyBuildingType.主城).Level >= 130) && !timeNotOK) { // 捐款2600万获取100政绩 WlyViewMgr.GoTo(DMGuid, WlyViewType.场景_国政); // 点开内政 var wait = FlowLogicHelper.RepeatRun(() => { DMService.Instance.LeftClick(DMGuid, new WxPoint(95, 42)); if (DMService.Instance.FindStr(DMGuid, new WxRect(483, 100, 516, 120), "国政", WlyColor.Normal)) { return(true); } Thread.Sleep(500); return(false); }, TimeSpan.FromSeconds(10)); if (!wait) { throw new InvalidOperationException(); } // 捐款铸造 DMService.Instance.LeftClick(DMGuid, new WxPoint(560, 270)); DMService.Instance.LeftClick(DMGuid, new WxPoint(613, 438)); DMService.Instance.SendString(DMGuid, WndHwnd, "50000000"); wait = FlowLogicHelper.RepeatRun(() => { if (WlyUtilityBiz.GetAmount(DMGuid, new WxRect(577, 429, 671, 447), "e7e7fd-000000", out var amount)) { return(true); } Thread.Sleep(500); return(false); }, TimeSpan.FromSeconds(10)); if (!wait) { throw new InvalidOperationException(); } DMService.Instance.LeftClick(DMGuid, new WxPoint(739, 438)); } // 如果可以进行开发,则马上开发并立刻结束 //if (DevelopTime < DateTime.Now) //{ // WlyUtilityBiz.GetAmount(DMGuid, new WxRect(133, 26, 217, 47), "f3f3da-000000", out var amount); // if (amount > 500000) // { // DevelopCity(); // //Stop(); // } //} }
private void WxLog_Test_Fatal() { WxLog.Fatal("Test"); }
private void WxLog_Test_Warn() { WxLog.Warn("Test"); }
private void WxLog_Test_Info() { WxLog.Info("Test"); }
private void WxLog_Test_Debug() { WxLog.Debug("Test"); }
private void TestMethod(TestEntityB B) { ResultB = B; WxLog.Debug($"TestMethodBussiness.TestMethod {B.GetType().FullName}"); }