502 lines
22 KiB
C#
502 lines
22 KiB
C#
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("&", "&")}<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;
|
|
}
|
|
|
|
}
|
|
}
|