1024 lines
40 KiB
C#
1024 lines
40 KiB
C#
using Chat.Framework.QQSdk.Events;
|
||
using Chat.Framework.Utils;
|
||
using Robot.Framework;
|
||
using Robot.Framework.SDK;
|
||
using System;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Text.RegularExpressions;
|
||
using System.Threading;
|
||
using System.Threading.Tasks;
|
||
using LoginStatus = Robot.Framework.Entities.LoginStatus;
|
||
|
||
namespace Chat.Framework.QQSdk.QPlus
|
||
{
|
||
/// <summary>
|
||
/// QQ客户端管理
|
||
/// </summary>
|
||
public class QQClientImpl_QQPlus : QQBase, IDisposable
|
||
{
|
||
/// <summary>
|
||
/// QQ客户端
|
||
/// </summary>
|
||
public QQClient QQClient { get; internal set; }
|
||
|
||
/// <summary>
|
||
/// 启动时间
|
||
/// </summary>
|
||
private DateTime StartTime = DateTime.MinValue;
|
||
|
||
private QQClientImpl_QQPlus() { }
|
||
|
||
int register = 1;
|
||
internal QQClientImpl_QQPlus(QQClient QQClient)
|
||
{
|
||
this.QQClient = QQClient;
|
||
this.QQ = QQClient.User?.QQ ?? 0;
|
||
this.Nickname = QQClient.User?.NickName ??string.Empty;
|
||
this.IsLogin = (QQClient.User?.LoginStatus ?? LoginStatus.Logout) == LoginStatus.Login;
|
||
//this.Password = Robot.Framework.Utils.Util.ToHex(QQClient.User.md5_1, "", "{0}");
|
||
//this.Password = QQClient.ToString();
|
||
this.IsEQQ = QQClient.QQProtocol != "PCQQ";
|
||
if (QQClient != null)
|
||
{
|
||
LogHelper.GetSingleObj().Debug("登录日志", $"账号:{QQ},注册事件 {register}");
|
||
register++;
|
||
StartTime = DateTime.Now;
|
||
QQClient.LoginStatusChanged += client_LoginStatusChanged;
|
||
//QQClient.LoginSuccessed += client_LoginSuccessed;
|
||
QQClient.SystemMessage += client_SystemMessage;
|
||
QQClient.ReceiveNormalIM += client_ReceiveNormalIM;
|
||
QQClient.AddedToCluster += client_AddedToCluster;
|
||
QQClient.AddedToClusterInvite += client_AddedToClusterInvite;
|
||
QQClient.AddMeFriend += client_AddMeFriend;
|
||
QQClient.AddMeFriendNeedAuth += client_AddMeFriendNeedAuth;
|
||
QQClient.AddToClusterNeedAuth += client_AddToClusterNeedAuth;
|
||
QQClient.CardChanged += client_CardChanged;
|
||
QQClient.ClusterAdminChanged += client_ClusterAdminChanged;
|
||
QQClient.KeepAlive += client_KeepAlive;
|
||
QQClient.LostConnection += client_LostConnection;
|
||
QQClient.MemberExitCluster += client_MemberExitCluster;
|
||
QQClient.QQLevel += client_QQLevel;
|
||
QQClient.ReceiveClusterIM += client_ReceiveClusterIM;
|
||
QQClient.ReceiveSubjectIM += client_ReceiveSubjectIM;
|
||
QQClient.ReceiveTempIM += client_ReceiveTempIM;
|
||
QQClient.ReceiveVibration += client_ReceiveVibration;
|
||
QQClient.RejectJoinCluster += client_RejectJoinCluster;
|
||
QQClient.SignatureChanged += client_SignatureChanged;
|
||
QQClient.StatusChanged += client_StatusChanged;
|
||
QQClient.ClusterEvent += client_ClusterEvent;
|
||
QQClient.ClusterNoticeChanged += client_ClusterNoticeChanged;
|
||
QQClient.VerifyImage += client_VerifyImage;
|
||
QQClient.AddMeSubject += client_AddMeSubject;
|
||
QQClient.QQClientStatusChanged += client_QQClientStatusChanged;
|
||
QQClient.SilencedQQEvent += client_SilencedQQEvent;
|
||
QQClient.SignQQEvent += client_SignQQEvent;
|
||
QQClient.QQPayEvent += client_QQPayEvent;
|
||
QQClient.RecallEvent += client_RecallEvent;
|
||
QQClient.RedBagEvent += Client_RedBagEvent;
|
||
}
|
||
}
|
||
|
||
//public override void Login(string Username, string Userpass)
|
||
//{
|
||
// QQClient.Login();
|
||
//}
|
||
|
||
public override void Login()
|
||
{
|
||
QQClient.Login();
|
||
}
|
||
|
||
public override void Logout()
|
||
{
|
||
Dispose();
|
||
QQClient.Logout();
|
||
}
|
||
|
||
public override void SendTempMessage(uint QQ, string Message)
|
||
{
|
||
QQClient.SendTempMessage(QQ, Message);
|
||
}
|
||
|
||
public override void SendTempMessage(uint QQ, string Message, byte[] Token)
|
||
{
|
||
QQClient.SendTempMessage(QQ, Message);
|
||
}
|
||
|
||
public override void SendFriendImage(uint QQ, string ImageSrc)
|
||
{
|
||
QQClient.SendMessage(QQ, $"[图片={ImageSrc}/]");
|
||
}
|
||
|
||
public override void SendFriendMessage(uint QQ, string Message)
|
||
{
|
||
QQClient.SendMessage(QQ, Message);
|
||
LogHelper.GetSingleObj().Debug("发送私聊消息", $"接收:{QQ},内容:{Message}");
|
||
}
|
||
|
||
public override void SendGroupImage(uint GroupId, string ImageSrc)
|
||
{
|
||
count++;
|
||
StringBuilder strb = new StringBuilder();
|
||
strb.AppendLine($"发送群图片:群:{GroupId},内容:{ImageSrc}");
|
||
var flag = QQClient.SendClusterMessage(GroupId, ImageSrc);
|
||
strb.AppendLine($"发送状态:{flag}");
|
||
LogHelper.GetSingleObj().Debug("发送群图片", $"{strb} -> {count}");
|
||
}
|
||
public int count = 0;
|
||
public override void SendGroupMessage(uint GroupId, string Message)
|
||
{
|
||
count++;
|
||
StringBuilder strb = new StringBuilder();
|
||
strb.AppendLine($"发送群消息:群:{GroupId},内容:{Message}");
|
||
var flag = QQClient.SendClusterMessage(GroupId, Message);
|
||
strb.AppendLine($"发送状态:{flag} -> " + count);
|
||
LogHelper.GetSingleObj().Debug("发送群消息", $"{strb}");
|
||
}
|
||
|
||
//---------------
|
||
|
||
private void client_SystemMessage(object sender, SystemMessageQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
Console.WriteLine("##########" + e.Message);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
private void client_LoginStatusChanged(object sender, LoginStatusChangedQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
if (sender is QQClient)
|
||
{
|
||
var client = sender as QQClient;
|
||
ChatClient.QQEvents.OnEvent(new QQLogEvents(null) { Message = $"QQ({client.User.NickName}【{client.User.QQ}】) {e.LoginStatus} {e.Other}" });
|
||
|
||
var logstatusTmp = client.User.LoginStatus;
|
||
this.QQClient = client;
|
||
if (e.LoginStatus == LoginStatus.Login)
|
||
{
|
||
this.QQ = QQClient.User.QQ;
|
||
this.Nickname = QQClient.User.NickName;
|
||
this.IsLogin = QQClient.User.LoginStatus == LoginStatus.Login;
|
||
//this.Password = Robot.Framework.Utils.Util.ToHex(QQClient.User.md5_1, "", "{0}");
|
||
ChatClient.UpdateQQClient(this);
|
||
|
||
//if (client != null && logstatusTmp != e.LoginStatus)
|
||
{
|
||
QQBase qBase = null;
|
||
if (ChatClient.QQClients.ContainsKey(client.QQ.ToString()))
|
||
qBase = ChatClient.QQClients[client.QQ.ToString()];
|
||
else
|
||
qBase = new QQClientImpl_QQPlus(client);
|
||
var x = new QQLoginChangeEvents(qBase, true, "在线");
|
||
ChatClient.QQEvents.OnEvent(x);
|
||
}
|
||
}
|
||
else if (e.LoginStatus == LoginStatus.Logout || e.LoginStatus == LoginStatus.WrongPassword || e.LoginStatus == LoginStatus.JiHuo)
|
||
{
|
||
this.IsLogin = QQClient.User.LoginStatus == LoginStatus.Login;
|
||
ChatClient.LoginOutQQ(this.QQ.ToString());
|
||
}
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 用户被邀请进群
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void client_AddedToCluster(object sender, AddedToClusterQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
QQNewGroupMemberEvents evt = null;
|
||
if (e.IsInvite)
|
||
{
|
||
evt = new QQNewGroupMemberEvents(this) { GroupId = e.Cluster.ExternalId, GroupName = e.Cluster.Name, Creator = e.ClusterMemberAdmin.QQ, InviteQQ = e.ClusterMemberInviter.QQ, InviteNick = e.ClusterMemberInviter.OldCard, NewFriendNick = e.ClusterMember.Nick, NewFriendQQ = e.ClusterMember.QQ };
|
||
}
|
||
else
|
||
{
|
||
evt = new QQNewGroupMemberEvents(this) { GroupId = e.Cluster.ExternalId, GroupName = e.Cluster.Name, Creator = e.ClusterMemberAdmin.QQ, InviteQQ = 0, NewFriendNick = e.ClusterMember.Nick, NewFriendQQ = e.ClusterMember.QQ };
|
||
}
|
||
ChatClient.QQEvents.OnEvent(evt);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 用户进群
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void client_AddedToClusterInvite(object sender, AddedToClusterInviteQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
var evt = new QQNewGroupMemberEvents(this) { GroupId = e.Cluster.ExternalId, GroupName = e.Cluster.Name, Creator = e.ClusterMemberAdmin.QQ, InviteQQ = e.ClusterMemberAdmin.QQ, InviteNick = e.ClusterMemberAdmin.CardOrName, NewFriendNick = e.ClusterMember.Nick, NewFriendQQ = e.ClusterMember.QQ };
|
||
ChatClient.QQEvents.OnEvent(evt);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
private void client_AddMeFriend(object sender, AddMeFriendQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加好友需要审核
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void client_AddMeFriendNeedAuth(object sender, AddMeFriendNeedAuthQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
//OnLog($"QQ({this.QQ})->用户【{e.Nick}({e.QQ})】申请添加好友!");
|
||
var evt = new QQAddMeNeedAuthEvents(this) { QQ = e.QQ, Message = e.Message, Nickname = e.Nick };
|
||
ChatClient.QQEvents.OnEvent(evt);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加群需要审核
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void client_AddToClusterNeedAuth(object sender, AddToClusterNeedAuthQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
//OnLog($"QQ({this.QQ})->用户({e.QQ})申请加入群 {e.Cluster.Name}({e.Cluster.ExternalId}) 申请内容:{e.Message}");
|
||
var evt = new QQAddToClusterNeedAuthEvents(this) { QQ = e.QQ, Message = e.Message, Nickname = string.Empty, ClusterId = e.Cluster.ExternalId, GroupId = e.Cluster.GroupId, Creator = e.Cluster.Creator, GroupName = e.Cluster.Name };
|
||
ChatClient.QQEvents.OnEvent(evt);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
public override void AerifyAddMe(uint QQ, byte Agree = 4, string Message = "")
|
||
{
|
||
QQClient.AgreeFriendInvite(QQ, Agree, Message);
|
||
}
|
||
|
||
public override void AerifyAddGroup(uint groupId, uint QQ, bool Agree = true, string Message = "")
|
||
{
|
||
QQClient.AgreeJoinCluster(groupId, QQ);
|
||
}
|
||
|
||
private void client_CardChanged(object sender, CardChangedQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 群管理变更
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void client_ClusterAdminChanged(object sender, ClusterAdminChangedQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 心跳
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void client_KeepAlive(object sender, KeepAliveQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 断开连接
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void client_LostConnection(object sender, LostConnectionQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
this.Login();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 用户退出群
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void client_MemberExitCluster(object sender, MemberExitClusterQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
private void client_QQLevel(object sender, QQLevelQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 群消息
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void client_ReceiveClusterIM(object sender, ReceiveClusterIMQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
if (StartTime.AddSeconds(20) > DateTime.Now)
|
||
return;
|
||
if (e.SendTime.AddSeconds(60) < DateTime.Now)
|
||
return;
|
||
|
||
QQClient q = null;
|
||
if (sender is QQClient)
|
||
{
|
||
q = sender as QQClient;
|
||
if (q != null && q.QQ == e.ClusterMember.QQ)
|
||
return;
|
||
}
|
||
var nickname = string.Empty;
|
||
if (e.ClusterMember != null && !string.IsNullOrWhiteSpace(e.ClusterMember.CardOrName))
|
||
{
|
||
nickname = e.ClusterMember.CardOrName;
|
||
}
|
||
else
|
||
{
|
||
if (q != null && q.User.Friends != null)
|
||
{
|
||
var friend = q.User.Friends.FirstOrDefault(f => f.QQ == e.ClusterMember.QQ);
|
||
if (friend != null)
|
||
nickname = friend.NickName;
|
||
}
|
||
}
|
||
var mess = QQMessReplace(e.Message);
|
||
if (string.IsNullOrWhiteSpace(mess)) return;
|
||
ChatClient.QQEvents.OnEvent(new Events.QQReceiveGroupMsgEvents(this) { QQ = e.ClusterMember.QQ, GroupId = e.Cluster.ExternalId, GroupName = e.Cluster.Name, Nickname = nickname, Message = mess });
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
private void client_ReceiveSubjectIM(object sender, ReceiveSubjectIMQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 正常私人消息
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void client_ReceiveNormalIM(object sender, ReceiveNormalIMQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
if (StartTime.AddSeconds(20) > DateTime.Now)
|
||
return;
|
||
if (e.SendTime.AddSeconds(60) < DateTime.Now)
|
||
return;
|
||
|
||
var nickname = string.Empty;
|
||
if (sender is QQClient)
|
||
{
|
||
var q = sender as QQClient;
|
||
if (q != null && q.User.Friends != null)
|
||
{
|
||
var friend = q.User.Friends.FirstOrDefault(f => f.QQ == e.QQ);
|
||
if (friend != null)
|
||
nickname = friend.NickName;
|
||
}
|
||
}
|
||
//你的QQ暂不支持查看视频短片,请期待后续版本。[视频=51A933ED15D1F8969C0D12CD423F54F5.mp4/]
|
||
var mess = QQMessReplace(e.Message);
|
||
if (string.IsNullOrWhiteSpace(mess)) return;
|
||
ChatClient.QQEvents.OnEvent(new Events.QQReceiveFriendMsgEvents(this) { QQ = e.QQ, Nickname = nickname, Message = mess });
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 过来QQ的消息
|
||
/// </summary>
|
||
/// <param name="_mess"></param>
|
||
/// <returns></returns>
|
||
private string QQMessReplace(string _mess)
|
||
{
|
||
try
|
||
{
|
||
var mess = _mess;
|
||
mess = mess.Replace("你的QQ暂不支持查看视频短片,请期待后续版本。", "");
|
||
mess = Regex.Replace(mess, @"(\[(?:声音|图片|视频)=.+?/\])", "", RegexOptions.IgnoreCase);
|
||
return mess;
|
||
}
|
||
catch (Exception ex)
|
||
{ }
|
||
return _mess;
|
||
}
|
||
|
||
private void client_ReceiveTempIM(object sender, ReceiveTempIMQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
if (StartTime.AddSeconds(20) > DateTime.Now)
|
||
return;
|
||
if (e.SendTime.AddSeconds(60) < DateTime.Now)
|
||
return;
|
||
|
||
var nickname = string.Empty;
|
||
if (sender is QQClient)
|
||
{
|
||
var q = sender as QQClient;
|
||
if (q != null && q.User.Friends != null)
|
||
{
|
||
var friend = q.User.Friends.FirstOrDefault(f => f.QQ == e.QQ);
|
||
if (friend != null)
|
||
nickname = friend.NickName;
|
||
}
|
||
}
|
||
var mess = QQMessReplace(e.Message);
|
||
if (string.IsNullOrWhiteSpace(mess)) return;
|
||
ChatClient.QQEvents.OnEvent(new Events.QQReceiveFriendMsgEvents(this) { QQ = e.QQ, Nickname = nickname, Message = mess, IsTemp = true });
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 震动
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void client_ReceiveVibration(object sender, ReceiveVibrationQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
private void client_RejectJoinCluster(object sender, RejectJoinClusterQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
private void client_SignatureChanged(object sender, SignatureChangedQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
private void client_StatusChanged(object sender, StatusChangedQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
private void client_ClusterEvent(object sender, ClusterEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 群公告修改
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void client_ClusterNoticeChanged(object sender, ClusterNoticeChangedEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
private void client_VerifyImage(object sender, VerifyImageQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
private void client_AddMeSubject(object sender, AddMeSubjectQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
private void client_QQClientStatusChanged(object sender, QQClientStatusChangedQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
private void client_SilencedQQEvent(object sender, SilencedQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
private void client_SignQQEvent(object sender, SignQQEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// QQ支付
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void client_QQPayEvent(object sender, QQPayEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 撤回
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void client_RecallEvent(object sender, RecallEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 红包
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
private void Client_RedBagEvent(object sender, RedBagEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
OnLog(System.Reflection.MethodBase.GetCurrentMethod().Name + " : " + ex.Message + " - " + ex.StackTrace);
|
||
}
|
||
}
|
||
|
||
public void Dispose()
|
||
{
|
||
if (QQClient != null)
|
||
{
|
||
QQClient.LoginStatusChanged -= client_LoginStatusChanged;
|
||
//QQClient.LoginSuccessed -= client_LoginSuccessed;
|
||
QQClient.SystemMessage -= client_SystemMessage;
|
||
QQClient.ReceiveNormalIM -= client_ReceiveNormalIM;
|
||
QQClient.AddedToCluster -= client_AddedToCluster;
|
||
QQClient.AddedToClusterInvite -= client_AddedToClusterInvite;
|
||
QQClient.AddMeFriend -= client_AddMeFriend;
|
||
QQClient.AddMeFriendNeedAuth -= client_AddMeFriendNeedAuth;
|
||
QQClient.AddToClusterNeedAuth -= client_AddToClusterNeedAuth;
|
||
QQClient.CardChanged -= client_CardChanged;
|
||
QQClient.ClusterAdminChanged -= client_ClusterAdminChanged;
|
||
QQClient.KeepAlive -= client_KeepAlive;
|
||
QQClient.LostConnection -= client_LostConnection;
|
||
QQClient.MemberExitCluster -= client_MemberExitCluster;
|
||
QQClient.QQLevel -= client_QQLevel;
|
||
QQClient.ReceiveClusterIM -= client_ReceiveClusterIM;
|
||
QQClient.ReceiveSubjectIM -= client_ReceiveSubjectIM;
|
||
QQClient.ReceiveTempIM -= client_ReceiveTempIM;
|
||
QQClient.ReceiveVibration -= client_ReceiveVibration;
|
||
QQClient.RejectJoinCluster -= client_RejectJoinCluster;
|
||
QQClient.SignatureChanged -= client_SignatureChanged;
|
||
QQClient.StatusChanged -= client_StatusChanged;
|
||
QQClient.ClusterEvent -= client_ClusterEvent;
|
||
QQClient.ClusterNoticeChanged -= client_ClusterNoticeChanged;
|
||
QQClient.VerifyImage -= client_VerifyImage;
|
||
QQClient.AddMeSubject -= client_AddMeSubject;
|
||
QQClient.QQClientStatusChanged -= client_QQClientStatusChanged;
|
||
QQClient.SilencedQQEvent -= client_SilencedQQEvent;
|
||
QQClient.SignQQEvent -= client_SignQQEvent;
|
||
QQClient.QQPayEvent -= client_QQPayEvent;
|
||
QQClient.RecallEvent -= client_RecallEvent;
|
||
QQClient.RedBagEvent -= Client_RedBagEvent;
|
||
}
|
||
}
|
||
|
||
public override Task<bool> SendMessage(uint _username, string _content, bool _isGroup = false, bool _isTemp = false)
|
||
{
|
||
uint username = _username;
|
||
string content = _content;
|
||
bool isGroup = _isGroup;
|
||
bool isTemp = _isTemp;
|
||
|
||
return Task.Run(() =>
|
||
{
|
||
if (string.IsNullOrEmpty(content)) return true;
|
||
content = content.Replace("\r\n", "\n").Trim().Replace("[时间]", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
|
||
var msgs = content.Split(new string[] { "[分段]" }, StringSplitOptions.RemoveEmptyEntries);
|
||
|
||
try
|
||
{
|
||
foreach (var msg in msgs)
|
||
{
|
||
var m = msg.Trim();
|
||
if (string.IsNullOrEmpty(m)) continue;
|
||
|
||
var message = m.RandomMess();
|
||
|
||
message = message.Contains("[随机表情]") ? message.Replace("[随机表情]", "") : message;
|
||
|
||
message = DelayMess(message);
|
||
|
||
//发送XML消息
|
||
//if (message.StartsWith("<appmsg appid=") && message.EndsWith("</appmsg>"))
|
||
//{
|
||
// WechatPack pack = new WechatPack(this);
|
||
// var sendJson = new
|
||
// {
|
||
// ToUserName = username,
|
||
// AppId = "",
|
||
// Type = 5,
|
||
// Content = message
|
||
// };
|
||
// pack.SendAll(WechatCmd.发送XML消息, false, sendJson);
|
||
// return true;
|
||
//}
|
||
|
||
////发送公告消息
|
||
//var matchs = Regex.Matches(message, @"\[公告\=([^\]]+)\]", RegexOptions.IgnoreCase);
|
||
//if (username.Contains("@"))
|
||
//{
|
||
// foreach (Match match in matchs)
|
||
// {
|
||
// SetRoomNotice(match.Groups[1].Value, username);
|
||
// }
|
||
//}
|
||
//message = Regex.Replace(message, @"\[公告\=([^\]]+)\]", "");
|
||
//message = DelayMess(message);
|
||
|
||
//发送图片消息
|
||
var matchs = Regex.Matches(message, @"\[图片\=([^\]]+)\]", RegexOptions.IgnoreCase);
|
||
foreach (Match match in matchs)
|
||
{
|
||
if (isGroup)
|
||
SendGroupMessage(username, $"[图片={match.Groups[1].Value}/]");
|
||
else
|
||
{
|
||
if (isTemp)
|
||
SendTempMessage(username, $"[图片={match.Groups[1].Value}/]");
|
||
else
|
||
SendFriendMessage(username, $"[图片={match.Groups[1].Value}/]");
|
||
}
|
||
}
|
||
message = Regex.Replace(message, @"\[图片\=([^\]]+)\]", "");
|
||
message = DelayMess(message);
|
||
|
||
//发送语音消息
|
||
matchs = Regex.Matches(message, @"\[语音\=([^\]]+)\]", RegexOptions.IgnoreCase);
|
||
foreach (Match item in matchs)
|
||
{
|
||
if (isGroup)
|
||
{
|
||
var g = QQClient.GetCluster(username);
|
||
QQClient.SendClusterAudio(g, $"{item.Groups[1].Value}");
|
||
}
|
||
else
|
||
{
|
||
if (isTemp)
|
||
{
|
||
//SendTempMessage(username, $"[语音={item.Groups[1].Value}/]");
|
||
}
|
||
else
|
||
QQClient.SendAudio(username, $"{item.Groups[1].Value}");
|
||
}
|
||
}
|
||
message = Regex.Replace(message, @"\[语音\=([^\]]+)\]", "");
|
||
message = DelayMess(message);
|
||
matchs = Regex.Matches(message, @"\[视频\=([^\]]+)\]", RegexOptions.IgnoreCase);
|
||
//foreach (Match item in matchs)
|
||
//{
|
||
// var temp = item.Groups[1].Value;
|
||
// if (!File.Exists(temp)) continue;
|
||
// if (isGroup)
|
||
// SendGroupMessage(username, $"[视频={item.Groups[1].Value}/]");
|
||
// else
|
||
// {
|
||
// if (isTemp)
|
||
// SendTempMessage(username, $"[视频={item.Groups[1].Value}/]");
|
||
// else
|
||
// SendFriendMessage(username, $"[视频={item.Groups[1].Value}]");
|
||
// }
|
||
//}
|
||
message = Regex.Replace(message, @"\[视频\=([^\]]+)\]", "");
|
||
message = DelayMess(message);
|
||
|
||
matchs = Regex.Matches(message, @"\[卡片\=([^\]]+)\]", RegexOptions.IgnoreCase);
|
||
foreach (Match item in matchs)
|
||
{
|
||
//SendCard(username, item.Groups[1].Value == "自己" ? User.Username : item.Groups[1].Value);
|
||
}
|
||
message = Regex.Replace(message, @"\[卡片\=([^\]]+)\]", "");
|
||
message = DelayMess(message);
|
||
if (string.IsNullOrWhiteSpace(message)) continue;
|
||
if (message.StartsWith("\r\n")) message = message.Substring("\r\n".Length);
|
||
if (message.StartsWith("\n")) message = message.Substring("\n".Length);
|
||
|
||
//QQchatPack send = new QQchatPack(this);
|
||
|
||
#region 提取艾特用户id
|
||
|
||
//List<string> atWxidList = new List<string>();
|
||
//var regTmp = Regex.Matches(message, @"(?<全部>\[@(?<账号>[A-Za-z0-9_]+)\])");
|
||
//foreach (Match item in regTmp)
|
||
//{
|
||
// if (item.Success)
|
||
// {
|
||
// var name = item.Groups["账号"].Value;
|
||
// atWxidList.Add(name);
|
||
// var friend = GetContact(name);
|
||
// if (friend != null)
|
||
// message = message.Replace(item.Groups["全部"].Value, $"@{friend.NickName} ");
|
||
// }
|
||
//}
|
||
|
||
//if (atWxidList.Count != 0)
|
||
//{
|
||
// atUsername = string.Join(",", atWxidList);
|
||
//}
|
||
#endregion
|
||
|
||
//var sendData = new { ToUserName = username, Content = message.Trim(), Type = 0, MsgSource = atUsername };
|
||
//send.SetNextData(new WechatPack.PackMsg() { cmd = WechatCmd.发送文本消息, data = sendData });
|
||
//RunSendMessageQueue(send);
|
||
|
||
if (isGroup)
|
||
SendGroupMessage(username, message.Trim());
|
||
else
|
||
{
|
||
if (isTemp)
|
||
SendTempMessage(username, message.Trim());
|
||
else
|
||
SendFriendMessage(username, message.Trim());
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
this.OnLog("QQSendMessage ERROR:" + ex.Message + "," + ex.StackTrace);
|
||
return false;
|
||
}
|
||
});
|
||
}
|
||
|
||
/// <summary>
|
||
/// 消息延迟
|
||
/// </summary>
|
||
/// <param name="message"></param>
|
||
public 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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 需要发送的消息队列
|
||
/// </summary>
|
||
//private ConcurrentQueue<QQchatPack> SendMessageQueue { get; set; } = new ConcurrentQueue<QQchatPack>();
|
||
//private object lock_sendmessage = new object();
|
||
//private bool lock_sendmessage_ing = false;
|
||
//Thread SendMessageThread;
|
||
//private DateTime fragmentTime = DateTime.MinValue;
|
||
//private int fragmentCount = 0;
|
||
|
||
//private void RunSendMessageQueue(QQchatPack sendPack)
|
||
//{
|
||
// SendMessageQueue.Enqueue(sendPack);
|
||
// if (lock_sendmessage_ing) return;
|
||
|
||
// lock (lock_sendmessage)
|
||
// {
|
||
// if (lock_sendmessage_ing) return;
|
||
// lock_sendmessage_ing = true;
|
||
// ThreadPool.QueueUserWorkItem(x =>
|
||
// {
|
||
// try
|
||
// {
|
||
// QQchatPack pack = null;
|
||
// while (SendMessageQueue.TryDequeue(out pack))
|
||
// {
|
||
// if (this.IsLogin)
|
||
// {
|
||
// pack.SendNextData();
|
||
|
||
// #region 消息防止频繁,休眠操作
|
||
// if (ChatClient.MessFrequentSleepTime != 0)
|
||
// {
|
||
// fragmentCount++;
|
||
// var totalSeconds = (DateTime.Now - fragmentTime).TotalSeconds;//上次休眠的时间差
|
||
// bool rest = totalSeconds > 10;
|
||
// if (fragmentCount >= 10 && totalSeconds <= 10)
|
||
// {
|
||
// rest = true;
|
||
// Thread.Sleep(ChatClient.MessFrequentSleepTime * 1000);
|
||
// }
|
||
|
||
// if (rest)
|
||
// {
|
||
// fragmentCount = 1;
|
||
// fragmentTime = DateTime.Now;
|
||
// }
|
||
// }
|
||
// #endregion
|
||
// }
|
||
// }
|
||
// }
|
||
// catch (Exception)
|
||
// {
|
||
// }
|
||
// finally
|
||
// {
|
||
// lock_sendmessage_ing = false;
|
||
// }
|
||
// });
|
||
// }
|
||
//}
|
||
|
||
}
|
||
}
|