using Api.Framework.Events; using Api.Framework.Model; using Api.Framework.SDK; using Api.Framework.Tools; using Chat.Framework; using Chat.Framework.WXSdk; using Chat.Framework.WXSdk.Events; using Chat.Framework.WXSdk.Implement; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Api.Framework { /// /// 事件管理 /// public class EventClient { static EventClient() { ChatClient.Events.WXApplyFriendEvent += OnEvent; ChatClient.Events.WXApplyGroupEvent += OnEvent; ChatClient.Events.WXChangeStatusEvent += OnEvent; ChatClient.Events.WXNewFriendEvent += OnEvent; ChatClient.Events.WXNewMemerEvent += OnEvent; ChatClient.Events.WXReceiveGroupMsgEvent += OnEvent; ChatClient.Events.WXReiceveFriendMsgEvent += OnEvent; ChatClient.Events.WXSendMessageEvent += OnEvent; ChatClient.Events.WXWXReicevePayEvent += OnEvent; ChatClient.Events.WXRefreshContactSuccessEvent += OnEvent; ChatClient.Events.WXOpenWindowEvent += OnEvent; ChatClient.QQEvents.QQReceiveFriendMsgEvents += OnEvent; ChatClient.QQEvents.QQReceiveGroupMsgEvents += OnEvent; ChatClient.QQEvents.QQAddMeNeedAuthEvents += OnEvent; ChatClient.QQEvents.QQNewFriendEvents += OnEvent; ChatClient.QQEvents.QQNewGroupMemberEvents += OnEvent; ChatClient.QQEvents.QQAddToClusterNeedAuthEvents += OnEvent; //ChatClient.QQEvents.QQVerifyCodeEvents += QQPool_QQVerifyCodeEvents; ChatClient.QQEvents.QQLogEvents += QQPool_QQLogEvents; } private static void QQPool_QQLogEvents(object sender, Chat.Framework.QQSdk.Events.QQLogEvents e) { LogEvent(sender, new LogEvents(e.Message)); } /// /// 是否传递插件 /// public static bool StopParsing { get; set; } /// /// 给插件传递消息 /// /// /// public static void OnEvent(object _sender, object _e) { if (StopParsing) return; object sender = _sender; object e = _e; var method = new Action(delegate () //Task.Factory.StartNew(delegate () { var msgId = Guid.NewGuid().ToString(); try { var plugins = new List(PluginClient.Plugins); var type = e.GetType(); if (e is Chat.Framework.ChatEvent) { //通用消息解析 var b = e as Chat.Framework.ChatEvent; if (b.IsToString) EventClient.OnEvent(sender, e.ToString()); if (type == typeof(Chat.Framework.PCRobotSDK.WechatEvents.WechatReceiveMsgEvents) || type == typeof(Chat.Framework.QQSdk.Events.QQReceiveGroupMsgEvents) || type == typeof(Chat.Framework.QQSdk.Events.QQReceiveFriendMsgEvents) || type == typeof(Chat.Framework.WXSdk.Events.WXReceiveGroupMsg) || type == typeof(Chat.Framework.WXSdk.Events.WXReiceveFriendMsg) || type == typeof(DebugEvent)) { var _time = DateTime.Now; var c = new ReciveIMEvent(sender, e); #region 不处理不接受的机器人 var session = ApiClient.GetSession(); var robots = session.FindRobots(); if (null != robots.FirstOrDefault(f => f.is_receives == Enums.SwitchType.关闭 && c.RobotInfo.name == f.name)) return; #endregion #region 企业微信这里判断用户是否存在,如果存在创建事件 if (c.Sender.GetType() == typeof(WXClientImpl_QYHOOK)) { var qyhook = c.Sender as WXClientImpl_QYHOOK; var member = session.FindSingle("select * from fl_member_info where robot_type = @robot_type and username = @username", new { username = c.Username, robot_type = c.ChatType }); if (member == null) { c.GetMemberinfo(); Friend friend = null; friend = qyhook.GetContact(c.Username);//这里很大概率获取不到用户的昵称,新用户 if (friend == null) { return; } friend.NickName = Util.RemoveEmoji(friend.NickName); EventClient.OnEvent(qyhook, new WXNewFriend(qyhook, friend)); //return; } } #endregion var m = c.GetMemberinfo(); Dictionary time = new Dictionary(); foreach (var plugin in plugins) { if (!plugin.IsRun) continue;//未运行 var _t = DateTime.Now; plugin.SDK.OnEvent(sender, c); time[plugin.Name] = (DateTime.Now - _t).TotalSeconds; if (c.Cancel) { break; //return;//取消传递 } } ApiClient.GetSession().Insertable(new fl_debug_log() { crt_time = DateTime.Now, message = b.ToString(), token = CsharpHttpHelper.HttpHelper.ObjectToJson(time), time = (DateTime.Now - _time).TotalSeconds, userid = m.id }).ExecuteCommandAsync(); return; } //正常事件解析 foreach (var plugin in plugins) { if (!plugin.IsRun) continue;//未运行 if (b.Cancel) return;//已取消传递 plugin.SDK.OnEvent(sender, e); } } else if (e is BaseEvents) { var b = e as BaseEvents; //解析API事件 foreach (var plugin in plugins) { if (!plugin.IsRun) continue;//未运行 if (b.Cancel) return;//已取消传递 plugin.SDK.OnEvent(sender, e); } } } catch (Exception ex) { //OnEvent(null, $"{msgId} - 异常:"+ex.Message); } }); method.BeginInvoke(null, null); } /// /// 日志事件 /// public static event EventHandler LogEvent; /// /// 输出日志触发 /// /// /// public static void OnEvent(object sender, string log) { OnEvent(sender, new LogEvents(log)); } /// /// 输出日志触发 /// /// /// internal static void OnEvent(object sender, LogEvents e) { if (LogEvent != null) { LogEvent.Invoke(sender, e); } } public static event EventHandler DyyNoticeEvent; /// /// 触发代运营通知事件 /// /// /// public static void OnDyyNoticeEvent(object sender, DyyNoticeEvent e) { if (DyyNoticeEvent != null) { DyyNoticeEvent.Invoke(sender, e); } } public static event EventHandler SharedEvent; /// /// 触发通用事件 /// internal static void OnSharedEvent(object sender, SharedEvents e) { if (LogEvent != null) { SharedEvent.Invoke(sender, e); } } /// /// 刷新刷新传递事件(刷新某些数据或者页面数据) /// public static event EventHandler MethodEvent; /// /// 刷新事件触发 /// public static void OnEvent(object sender, MethodType e) { if (MethodEvent != null) { MethodEvent.Invoke(sender, e); } } /// /// 替换短网址链接 /// public static Func ReplaceURL; } }