old_flsystem/类库/Api.Framework/SDK/ReciveIMEvent.cs

502 lines
22 KiB
C#
Raw Permalink Normal View History

2022-09-20 03:10:29 +00:00
using Api.Framework.Events;
using Api.Framework.Model;
using Api.Framework.Tools;
using Chat.Framework.QQSdk.QPlus;
using Chat.Framework.Utils;
using Chat.Framework.WXSdk;
using Chat.Framework.WXSdk.Implement;
using Robot.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
namespace Api.Framework.SDK
{
/// <summary>
/// 平台类型
/// </summary>
public enum ChatType : int
{
= 0,
QQ = 1,
= 2,
= 3,
= 4
}
/// <summary>
/// 通用消息事件
/// </summary>
public class ReciveIMEvent : BaseEvents
{
/// <summary>
/// 事件来源(机器人),强转即可 (注:机器人基类为:WeixinBase)
/// </summary>
public object Sender { get; private set; }
/// <summary>
/// 事件原形
/// </summary>
public object Event { get; private set; }
/// <summary>
/// 消息
/// </summary>
public string Message { get; private set; }
/// <summary>
/// 发送者昵称
/// </summary>
public string NickName { get; private set; }
/// <summary>
/// 发送者原始昵称
/// </summary>
public string RealNick { get; set; }
/// <summary>
/// 微信号
/// </summary>
public string Wechatid { get; set; }
/// <summary>
/// 发送者账号
/// </summary>
public string Username { get; private set; }
/// <summary>
/// 用户头像地址
/// </summary>
public string HeadUrl { get; private set; }
/// <summary>
/// 群号,私聊为空
/// </summary>
public string Groupid { get; private set; }
/// <summary>
/// 机器人类型
/// </summary>
public ChatType ChatType { get; private set; }
/// <summary>
/// 机器人账号
/// </summary>
public string RobotName { get; private set; }
/// <summary>
/// 机器人账号
/// </summary>
public string RobotNick { get; private set; }
private fl_robot_info _robotinfo;
/// <summary>
/// 机器人对象
/// </summary>
public fl_robot_info RobotInfo
{
get
{
if (_robotinfo == null)
{
var session = ApiClient.GetSession();
_robotinfo = session.FindRobotInfo(RobotName, ChatType);
}
return _robotinfo;
}
}
private fl_member_info fl_member_info;
/// <summary>
/// 获取用户对象方法
/// </summary>
/// <param name="refresh">刷新</param>
/// <returns></returns>
public fl_member_info GetMemberinfo(bool refresh = false)
{
bool is_first = fl_member_info == null ? true : false;
if (refresh || fl_member_info == null || string.IsNullOrWhiteSpace(fl_member_info.headurl))
{
var session = ApiClient.GetSession();
this.fl_member_info = session.FindMemberinfo(this);
if (this.fl_member_info != null)
{
if (is_first || string.IsNullOrWhiteSpace(fl_member_info.headurl))
{
if (is_first)
this.fl_member_info.chat_count++;
if (string.IsNullOrWhiteSpace(fl_member_info.headurl))
fl_member_info.headurl = HeadUrl;
session.SaveOrUpdate(this.fl_member_info);
}
}
}
return this.fl_member_info;
}
/// <summary>
/// 事件Type
/// </summary>
public Type EventType { get; private set; }
/// <summary>
/// 通用解析
/// </summary>
/// <param name="Sender"></param>
/// <param name="Event"></param>
public ReciveIMEvent(object Sender, object Event)
{
if (Sender.GetType() == typeof(Chat.Framework.WXSdk.Implement.WXClientImpl_IPAD))
{
var client = Sender as Chat.Framework.WXSdk.Implement.WXClientImpl_IPAD;
this.RobotName = client.WeixinHao;
this.RobotNick = client.User.Nick;
this.ChatType = ChatType.;
}
else if (Sender.GetType() == typeof(QQClientImpl_QQPlus))
{
var client = Sender as QQClientImpl_QQPlus;
this.RobotName = client.QQClient.User.QQ.ToString();
this.RobotNick = Util.RemoveEmoji(client.QQClient.User.NickName);
this.ChatType = ChatType.QQ;
}
else if (Sender.GetType() == typeof(Chat.Framework.WXSdk.Implement.WXClientImpl_HOOK))
{
var client = Sender as Chat.Framework.WXSdk.Implement.WXClientImpl_HOOK;
this.RobotName = client.WeixinHao;
this.RobotNick = Util.RemoveEmoji(client.User.Nick);
this.ChatType = ChatType.;
}
else if (Sender.GetType() == typeof(Chat.Framework.WXSdk.Implement.WXClientImpl_QYHOOK))
{
var client = Sender as Chat.Framework.WXSdk.Implement.WXClientImpl_QYHOOK;
this.RobotName = client.WeixinHao;
this.RobotNick = Util.RemoveEmoji(client.User.Nick);
this.ChatType = ChatType.;
}
this.Groupid = string.Empty;
this.Sender = Sender;
this.Event = Event;
//Console.WriteLine(Event.GetType().ToString());
this.EventType = Event.GetType();
if (EventType == typeof(Chat.Framework.QQSdk.Events.QQReceiveFriendMsgEvents))
{
this.ChatType = ChatType.QQ;
var e = Event as Chat.Framework.QQSdk.Events.QQReceiveFriendMsgEvents;
this.NickName = Util.RemoveEmoji(e.Nickname);
this.Message = e.Message;
this.RealNick = Util.RemoveEmoji(e.Nickname);
this.Username = e.QQ.ToString();
this.Wechatid = string.Empty;
this.HeadUrl = this.HeadUrl = $"http://q1.qlogo.cn/g?b=qq&nk={e.QQ}&s=640";
}
//else if (EventType == typeof(Chat.Framework.PCRobotSDK.WechatEvents.WechatReceiveMsgEvents))
//{
// ChatType = ChatType.微信;
// var evt = Event as Chat.Framework.PCRobotSDK.WechatEvents.WechatReceiveMsgEvents;
// this.RobotName = evt.Data.RobotUsername;
// this.RobotNick = Util.RemoveEmoji(evt.Data.RobotUsernick);
// this.NickName = Util.RemoveEmoji(evt.Data.FromUsernick == null ? string.Empty : evt.Data.FromUsernick); //evt.Data.FromUsernick;
// this.Username = evt.Data.FromUsername;
// this.Message = evt.Data.FromMessage;
// this.Groupid = evt.Data.FromGroupid;
//}
else if (EventType == typeof(Chat.Framework.QQSdk.Events.QQReceiveGroupMsgEvents))
{
this.ChatType = ChatType.QQ;
var e = Event as Chat.Framework.QQSdk.Events.QQReceiveGroupMsgEvents;
this.NickName = Util.RemoveEmoji(e.Nickname == null ? string.Empty : e.Nickname);
this.Message = e.Message;
this.RealNick = Util.RemoveEmoji(e.Nickname == null ? string.Empty : e.Nickname);
this.Groupid = e.GroupId.ToString();
this.Username = e.QQ.ToString();
this.Wechatid = string.Empty;
this.HeadUrl = $"http://q1.qlogo.cn/g?b=qq&nk={e.QQ}&s=640";
}
else if (EventType == typeof(Chat.Framework.WXSdk.Events.WXReceiveGroupMsg))
{
var e = Event as Chat.Framework.WXSdk.Events.WXReceiveGroupMsg;
this.RobotName = e.Client.WeixinHao;
this.Message = e.Message;
var realNick = e.Member.NickName;
var nick = e.Member.GetName();
if (string.IsNullOrWhiteSpace(Util.RemoveEmoji(nick)))
{
Friend friend = null;
if (Sender.GetType() == typeof(WXClientImpl_HOOK))
{
var wx = Sender as WXClientImpl_HOOK;
friend = wx.Friends.FirstOrDefault(f => f.Key == e.Member.Username).Value;
}
else if (Sender.GetType() == typeof(WXClientImpl_QYHOOK))
{
var wx = Sender as WXClientImpl_QYHOOK;
friend = wx.Friends.FirstOrDefault(f => f.Key == e.Member.Username).Value;
}
else if (Sender.GetType() == typeof(WXClientImpl_IPAD))
{
var wx = Sender as WXClientImpl_IPAD;
friend = wx.Friends.FirstOrDefault(f => f.Key == e.Member.Username).Value;
}
if (friend != null)
{
nick = friend.GetName();
realNick = friend.NickName;
}
}
this.RealNick = Util.RemoveEmoji(realNick);
this.NickName = Util.RemoveEmoji(nick);
this.Username = e.Member.Username;
this.Groupid = e.Group.UserName;
this.HeadUrl = e.Member.BigHeadImgUrl;
}
else if (EventType == typeof(Chat.Framework.WXSdk.Events.WXReiceveFriendMsg))
{
//this.ChatType = ChatType.微信;
var e = Event as Chat.Framework.WXSdk.Events.WXReiceveFriendMsg;
this.RobotName = e.Client.WeixinHao;
this.Message = e.Message;
var realNick = e.Friend.NickName;
var nick = e.Friend.GetName();
if (string.IsNullOrWhiteSpace(Util.RemoveEmoji(nick)))
{
Friend friend = null;
if (Sender.GetType() == typeof(WXClientImpl_HOOK))
{
var wx = Sender as WXClientImpl_HOOK;
friend = wx.Friends.FirstOrDefault(f => f.Key == e.Friend.UserName).Value;
}
else if (Sender.GetType() == typeof(WXClientImpl_QYHOOK))
{
var wx = Sender as WXClientImpl_QYHOOK;
friend = wx.Friends.FirstOrDefault(f => f.Key == e.Friend.UserName).Value;
}
else if (Sender.GetType() == typeof(WXClientImpl_IPAD))
{
var wx = Sender as WXClientImpl_IPAD;
friend = wx.Friends.FirstOrDefault(f => f.Key == e.Friend.UserName).Value;
}
if (friend != null)
{
nick = friend.GetName();
realNick = friend.NickName;
}
}
this.RealNick = Util.RemoveEmoji(realNick);
this.NickName = Util.RemoveEmoji(nick);
this.Username = e.Friend.UserName;
this.Wechatid = e.Friend.Alias;
this.HeadUrl = e.Friend.BigHeadImgUrl;
}
else if (EventType == typeof(DebugEvent))
{
this.RobotName = "系统调试";
this.RobotNick = "系统调试";
var e = Event as DebugEvent;
this.ChatType = e.chatType;
this.Message = e.content;
this.RealNick = "系统调试";
this.NickName = e.usernick;
this.Username = e.username;
}
else
{
}
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="Message">发送的消息</param>
/// <param name="SetCancel">是否取消传递消息给后续插件</param>
public void SendMessage(string Message, bool SetCancel = true)
{
if (string.IsNullOrWhiteSpace(Message)) return;
if (Message.Contains("[会员等级]"))
{
var session = ApiClient.GetSession();
var member = session.FindMemberinfo(this);
var group = session.FindGroup(member);
Message = Message.Replace("[会员等级]", group.name);
}
if (Message.Contains("[编号]"))
{
var session = ApiClient.GetSession();
var member = session.FindMemberinfo(this);
Message = Message.Replace("[编号]", member.id.ToString());
}
var msgTmp = Message
.Replace("[账号]", Username)
.Replace("[积分名称]", ApiClient.Setting.SystemConfig.PointName)
.Replace("[昵称]", string.IsNullOrWhiteSpace(Groupid) ? (string.IsNullOrEmpty(RealNick) ? NickName : RealNick) : (string.IsNullOrEmpty(RealNick) ? NickName : RealNick))
.Replace("[机器人账号]", RobotName)
.Replace("[机器人昵称]", RobotNick)
.Trim();
msgTmp = new VariateReplace().ReplaceUserVariate(msgTmp);
var msgs = msgTmp.Split(new string[] { "[分段]" }, StringSplitOptions.RemoveEmptyEntries);
foreach (var item in msgs)
{
var m = item;
var msg = m.RandomMess();
if (EventType == typeof(DebugEvent))
{
var e = Event as DebugEvent;
msg = msg.Replace("[@发送者账号]", e.username).Trim();
e.SendDebugMsg.Invoke(e.username, msg);
}
else if (EventType == typeof(Chat.Framework.WXSdk.Events.WXReceiveGroupMsg))
{
var e = Event as Chat.Framework.WXSdk.Events.WXReceiveGroupMsg;
string at = msg.Contains("[@发送者账号]") ? e.Member.Username : "";
msg = msg.Replace("[@发送者账号]", e.Member.GetName()).Trim();
e.Client.SendMessage(e.Group.UserName, msg, at);
}
else if (EventType == typeof(Chat.Framework.WXSdk.Events.WXReiceveFriendMsg))
{
var e = Event as Chat.Framework.WXSdk.Events.WXReiceveFriendMsg;
msg = msg.Replace("[@发送者账号]", "").Trim();
e.Client.SendMessage(e.Friend.UserName, msg);
}
else if (EventType == typeof(Chat.Framework.QQSdk.Events.QQReceiveFriendMsgEvents))
{
var e = Event as Chat.Framework.QQSdk.Events.QQReceiveFriendMsgEvents;
var session = ApiClient.GetSession();
var robot = session.FindRobotInfo(e.QQBase.QQ.ToString(), ChatType.QQ);
if (robot == null) return;
msg = msg.Replace("[@发送者账号]", "").Trim();
//if (e.TempMsgID == 0)
// e.QQBase.SendFriendMessage(e.QQ, msg);
//else
// e.QQBase.SendTempMessage(e.QQ, msg);
ApiClient.SendMessage(robot, e.QQ.ToString(), msg, e.IsTemp);
}
else if (EventType == typeof(Chat.Framework.QQSdk.Events.QQReceiveGroupMsgEvents))
{
var e = Event as Chat.Framework.QQSdk.Events.QQReceiveGroupMsgEvents;
var session = ApiClient.GetSession();
var robot = session.FindRobotInfo(e.QQBase.QQ.ToString(), ChatType.QQ);
if (robot == null) return;
msg = msg.Replace("[@发送者账号]", $"[@{e.QQ}]").Trim();
//e.QQBase.SendGroupMessage(e.GroupId, msg);
ApiClient.SendMessage(robot, e.QQ.ToString(), msg, e.GroupId.ToString());
}
else if (EventType == typeof(Chat.Framework.PCRobotSDK.WechatEvents.WechatReceiveMsgEvents))
{
var e = Event as Chat.Framework.PCRobotSDK.WechatEvents.WechatReceiveMsgEvents;
var session = ApiClient.GetSession();
var robot = session.FindRobotInfo(e.Data.RobotUsername, e.Data.RobotType == PCRobot.Pack.RobotType. ? ChatType. : ChatType.);
if (robot == null) return;
//Console.WriteLine(e.Data.FromGroupid);
msg = msg.Replace("\r\n", "\n").Trim().Replace("[时间]", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
try
{
msg = msg.Contains("[随机表情]") ? msg.Replace("[随机表情]", WXClientImpl_IPAD.FindRandomExpression()) : msg;
//if (message.StartsWith("[延迟="))
//{
// var reg = Regex.Match(message, @"\[延迟=(\d+)\]");
// if (reg.Success)
// {
// message = Regex.Replace(message, @"\[延迟=(\d+)\]", "").Trim();
// // this.WriteLog($"需要延迟{reg.Groups[1].Value}秒,再发送:{message}");
// Thread.Sleep(int.Parse(reg.Groups[1].Value) * 1000);
// }
//}
msg = DelayMess(msg);
//发送XML消息
if (msg.ToLower().Trim().StartsWith("<appmsg") && msg.ToLower().Trim().EndsWith("</appmsg>"))
{
msg = $@"<msg><fromusername>{Util.RemoveEmoji(e.Data.RobotUsernick)}</fromusername><scene>0</scene><commenturl></commenturl>{msg.Trim().Replace("&", "&amp;")}<appinfo><version>1</version><appname>Window wechat</appname></appinfo></msg>";
ApiClient.SendMessage(robot, e.Data.FromUsername, msg, e.Data.FromGroupid);
}
//发送图片消息
var matchs = Regex.Matches(msg, @"(\[图片\=[^\]]+\])", RegexOptions.IgnoreCase);
foreach (Match match in matchs)
{
ApiClient.SendMessage(robot, e.Data.FromUsername, match.Groups[1].Value, e.Data.FromGroupid);
}
msg = Regex.Replace(msg, @"\[图片\=([^\]]+)\]", "");
msg = DelayMess(msg);
//发送语音消息
matchs = Regex.Matches(msg, @"(\[语音\=[^\]]+\])", RegexOptions.IgnoreCase);
foreach (Match match in matchs)
{
ApiClient.SendMessage(robot, e.Data.FromUsername, match.Groups[1].Value, e.Data.FromGroupid);
}
msg = Regex.Replace(msg, @"\[语音\=([^\]]+)\]", "");
msg = DelayMess(msg);
matchs = Regex.Matches(msg, @"(\[视频\=[^\]]+\])", RegexOptions.IgnoreCase);
foreach (Match match in matchs)
{
ApiClient.SendMessage(robot, e.Data.FromUsername, match.Groups[1].Value, e.Data.FromGroupid);
}
msg = Regex.Replace(msg, @"\[视频\=([^\]]+)\]", "");
msg = DelayMess(msg);
//ToDo 卡片还没完成
//matchs = Regex.Matches(msg, @"\[卡片\=([^\]]+)\]", RegexOptions.IgnoreCase);
//foreach (Match match in matchs)
//{
// SendCard(username, match.Groups[1].Value == "自己" ? robot.name : match.Groups[1].Value);
//}
//msg = Regex.Replace(msg, @"\[卡片\=([^\]]+)\]", "");
msg = DelayMess(msg);
if (string.IsNullOrWhiteSpace(msg)) continue;
if (msg.StartsWith("\r\n")) msg = msg.Substring("\r\n".Length);
if (msg.StartsWith("\n")) msg = msg.Substring("\n".Length);
}
catch (Exception ex)
{
//("SendMessage ERROR:" + ex.Message);
}
ApiClient.SendMessage(robot, e.Data.FromUsername, msg, e.Data.FromGroupid);
}
}
Cancel = SetCancel;
}
/// <summary>
/// 消息延迟
/// </summary>
/// <param name="message">消息</param>
private string DelayMess(string message)
{
try
{
message = message.Trim();
if (message.StartsWith("[延迟="))
{
var reg = Regex.Match(message, @"\[延迟=(\d+)\]");
if (reg.Success)
{
message = Regex.Replace(message, @"\[延迟=(\d+)\]", "").Trim();
// this.WriteLog($"需要延迟{reg.Groups[1].Value}秒,再发送:{message}");
Thread.Sleep(int.Parse(reg.Groups[1].Value) * 1000);
}
}
}
catch (Exception ex)
{ }
return message;
}
}
}