old_flsystem/类库/Chat.Framework/QQSdk/PCQQ/PCQQClient.cs

497 lines
20 KiB
C#
Raw Permalink Normal View History

2022-09-20 03:10:29 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using Chat.Framework.QQSdk.Events;
using QQPlus.Framework;
using QQPlus.Framework.Entities;
using QQPlus.Framework.SDK;
namespace Chat.Framework.QQSdk.PCQQ
{
public class PCQQClient : QQBase
{
private void Close()
{
if (qqclient != null)
{
if (qqclient.User != null) qqclient.Logout();
qqclient.LoginSuccessed -= Qqclient_LoginSuccessed;
qqclient.LoginStatusChanged -= Qqclient_LoginStatusChanged;
}
this.UnRegisterEvent();
qqclient = null;
}
public override void AutoLogin()
{
this.Login(base.QQ.ToString(), base.Password);
}
private void Qqclient_LoginStatusChanged(object sender, LoginStatusChangedQQEventArgs e)
{
var msg = $"{e.LoginStatus}-{e.Other}";
if (msg.Contains("0836"))
{
qqclient.Login();
}
else
{
this.IsLogin = (e.LoginStatus == LoginStatus.Login);
if (!this.IsLogin) OnLog("状态修改为:" + e.Other);
if (IsLogin) this.Nickname = this.qqclient.User.NickName;
var x = new QQLoginChangeEvents(this, IsLogin, msg);
ChatClient.QQPool.OnEvent(x);
}
}
private void Qqclient_LoginSuccessed(object sender, LoginSuccessedQQEventArgs e)
{
var client = sender as QQClient;
var x = new QQLoginChangeEvents(this, true, $"登陆成功!");
ChatClient.QQPool.OnEvent(x);
OnLog($"QQ{(client == null ? string.Empty : client.User.NickName)}({(client == null ? 0 : client.User.QQ)}) 登陆成功!");
}
internal QQPlus.Framework.QQClient qqclient { get; private set; }
public bool IsUDP { get; private set; }
public string Version { get; private set; }
public void Login(string Username, string Userpass, string Version, bool IsUDP)
{
this.Version = Version;
this.IsUDP = IsUDP;
this.Login(Username, Userpass);
}
public override void Logout()
{
this.Close();
}
public override void Login(string Username, string Userpass)
{
uint QQ;
if (string.IsNullOrEmpty(Username) || string.IsNullOrEmpty(Userpass) || !uint.TryParse(Username, out QQ)) throw new Exception("您输入的QQ或密码格式不正确!");
this.Close();
this.QQ = QQ;
this.QQReLoginDic[QQ] = 0;//重置计时器
this.Password = Userpass;
qqclient = new QQPlus.Framework.QQClient(QQ, Userpass);
qqclient.User.IsUdp = this.IsUDP;
qqclient.Config.QQProtocol = this.Version;
qqclient.LoginSuccessed += Qqclient_LoginSuccessed;
qqclient.LoginStatusChanged += Qqclient_LoginStatusChanged;
qqclient.Login();
}
internal override void RegisterEvent()
{
if (qqclient != null && !IsRegisterEvent)
{
IsRegisterEvent = true;
qqclient.LostConnection += Qqclient_LostConnection;
qqclient.ReceiveNormalIM += Qqclient_ReceiveNormalIM;
qqclient.ReceiveClusterIM += Qqclient_ReceiveClusterIM;
qqclient.ReceiveTempIM += Qqclient_ReceiveTempIM;
qqclient.AddMeFriend += Qqclient_AddMeFriend;
qqclient.AddMeFriendNeedAuth += Qqclient_AddMeFriendNeedAuth;
qqclient.AddedToCluster += Qqclient_AddedToCluster;
//qqclient.AddToClusterNeedAuth += Qqclient_AddToClusterNeedAuth;
qqclient.AddedToClusterInvite += Qqclient_AddedToClusterInvite;
}
}
/// <summary>
/// QQ群新人申请进群需要审核
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Qqclient_AddedToClusterInvite(object sender, AddedToClusterInviteQQEventArgs e)
{
try
{
//var evt = new QQNewGroupMemberEvents(this) { GroupId = e.Cluster.ExternalId, GroupName = e.Cluster.Name, Creator = e.Cluster.Creator, NewFriendQQ = e.ClusterMember.QQ, NewFriendNick = e.ClusterMember.Nick == null ? string.Empty : e.ClusterMember.Nick, OldFriendNick = e.ClusterMemberAdmin.Nick, OldFriendQQ = e.ClusterMemberAdmin.QQ };
//ChatClient.QQPool.OnEvent(evt);
var evt = new InviteAddClusterNeedAuthEvents(this) { GroupId = e.Cluster.ExternalId, GroupName = e.Cluster.Name, Creator = e.Cluster.Creator, NewFriendQQ = e.ClusterMember.QQ, NewFriendNick = e.ClusterMember.Nick == null ? string.Empty : e.ClusterMember.Nick, OldFriendNick = e.ClusterMemberAdmin.Nick, OldFriendQQ = e.ClusterMemberAdmin.QQ };
ChatClient.QQPool.OnEvent(evt);
}
catch (Exception ex)
{
this.OnLog($"Qqclient_AddedToClusterInvite Error:{ex.Message}");
}
}
/// <summary>
/// 1视乎是通过群申请以后进这个事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Qqclient_AddedToCluster(object sender, AddedToClusterQQEventArgs e)
{
try
{
var evt = new QQNewGroupMemberEvents(this) { GroupId = e.Cluster.ExternalId, GroupName = e.Cluster.Name, Creator = e.Cluster.Creator, NewFriendQQ = e.ClusterMember.QQ, NewFriendNick = e.ClusterMember.Nick == null ? string.Empty : e.ClusterMember.Nick, OldFriendNick = e.ClusterMemberAdmin.Nick, OldFriendQQ = e.ClusterMemberAdmin.QQ };
ChatClient.QQPool.OnEvent(evt);
}
catch (Exception ex)
{
this.OnLog($"Qqclient_AddedToCluster Error:{ex.Message}");
}
}
private void Qqclient_AddMeFriend(object sender, AddMeFriendQQEventArgs e)
{
try
{
var friend = qqclient.GetFriend(e.QQ);
var evt = new QQNewFriendEvents(this) { QQ = e.QQ, Nickname = friend != null ? friend.NickName : string.Empty };
ChatClient.QQPool.OnEvent(evt);
}
catch (Exception ex)
{
this.OnLog($"Qqclient_AddMeFriend Error:{ex.Message}");
}
}
///// <summary>
///// 添加到集群需要验证
///// </summary>
///// <param name="sender"></param>
///// <param name="e"></param>
//private void Qqclient_AddToClusterNeedAuth(object sender, AddToClusterNeedAuthQQEventArgs e)
//{
// try
// {
// var evt = new QQAddToClusterNeedAuthEvents(this) { QQ = e.QQ, Message = e.Message, Cluster = e.Cluster };
// ChatClient.QQPool.OnEvent(evt);
// }
// catch (Exception ex)
// {
// this.OnLog($"Qqclient_AddToClusterNeedAuth Error:{ex.Message}");
// }
//}
private void Qqclient_AddMeFriendNeedAuth(object sender, AddMeFriendNeedAuthQQEventArgs e)
{
try
{
var evt = new QQAddMeNeedAuthEvents(this) { QQ = e.QQ, Nickname = e.Nick, Message = e.Message };
ChatClient.QQPool.OnEvent(evt);
}
catch (Exception ex)
{
this.OnLog($"Qqclient_AddMeFriendNeedAuth Error:{ex.Message}");
}
}
private void Qqclient_ReceiveTempIM(object sender, ReceiveTempIMQQEventArgs e)
{
try
{
var friend = qqclient.GetFriend(e.QQ);
var temp = new QQReceiveFriendMsgEvents(this) { TempMsgID = e.ExternalId, QQ = e.QQ, Message = e.Message, Nickname = (friend == null ? string.Empty : friend.NickName) };
ChatClient.QQPool.OnEvent(temp);
}
catch (Exception ex)
{
this.OnLog($"Qqclient_ReceiveTempIM Error:{ex.Message}");
}
}
/// <summary>
/// 记录QQ重新登录
/// </summary>
Dictionary<uint, int> QQReLoginDic = new Dictionary<uint, int>();
private void Qqclient_LostConnection(object sender, LostConnectionQQEventArgs e)
{
//看看是否有已登录的,并且自己还没有被移除
var v = ChatClient.QQPool.QQClients.Where(f => f.Value.IsLogin);
if (v != null && ChatClient.QQPool.QQClients.Values.Contains(this))
{
ChatClient.QQPool.OnEvent(new QQLostConnectionEvents(this, e.Message));
}
}
internal override void UnRegisterEvent()
{
if (qqclient != null && IsRegisterEvent)
{
IsRegisterEvent = false;
qqclient.ReceiveClusterIM -= Qqclient_ReceiveClusterIM;
qqclient.LostConnection -= Qqclient_LostConnection;
qqclient.ReceiveNormalIM -= Qqclient_ReceiveNormalIM;
qqclient.ReceiveTempIM -= Qqclient_ReceiveTempIM;
qqclient.AddMeFriend -= Qqclient_AddMeFriend;
qqclient.AddMeFriendNeedAuth -= Qqclient_AddMeFriendNeedAuth;
qqclient.AddedToCluster -= Qqclient_AddedToCluster;
//qqclient.AddToClusterNeedAuth -= Qqclient_AddToClusterNeedAuth;
}
}
private void Qqclient_ReceiveClusterIM(object sender, ReceiveClusterIMQQEventArgs e)
{
try
{
if (e.ClusterMember.QQ == this.QQ) return;
var client = sender as QQClient;
this.OnLog($"QQ({(client == null ? 0 : client.User.QQ)})->群消息->{e.ClusterMember.Nick}({e.ClusterMember.QQ})在[{e.Cluster.Name}({e.Cluster.ExternalId})]群说:{e.Message}");
var temp = new QQReceiveGroupMsgEvents(this) { QQ = e.ClusterMember.QQ, Message = e.Message, Nickname = e.ClusterMember.Nick, GroupName = e.Cluster.Name, GroupId = e.Cluster.ExternalId };
ChatClient.QQPool.OnEvent(temp);
}
catch (Exception ex)
{
this.OnLog($"Qqclient_ReceiveNormalIM Error:{ex.Message}");
}
}
private void Qqclient_ReceiveNormalIM(object sender, ReceiveNormalIMQQEventArgs e)
{
try
{
if (e.QQ == this.QQ) return;
var client = sender as QQClient;
this.OnLog($"QQ({(client == null ? 0 : client.User.QQ)})->私消息->{string.Empty}({e.QQ})说:{e.Message}");
var friend = qqclient.GetFriend(e.QQ);
var temp = new QQReceiveFriendMsgEvents(this) { QQ = e.QQ, Message = e.Message, Nickname = (friend != null ? friend.NickName : string.Empty) };
ChatClient.QQPool.OnEvent(temp);
}
catch (Exception ex)
{
this.OnLog($"Qqclient_ReceiveNormalIM Error:{ex.Message}");
}
}
public override void AerifyAddMe(uint QQ, bool Agree)
{
try
{
if (IsLogin) qqclient.AgreeFriendInvite(QQ, (byte)(Agree ? 4 : 5));
}
catch (Exception ex)
{
this.OnLog($"Qqclient_ReceiveNormalIM Error:{ex.Message}");
}
}
class QQMessagePack
{
private string content;
List<string> needMessage;
public QQMessagePack(string Message)
{
this.content = Message;
this.needMessage = GetNeedMessage();
}
#region
private static string Expression = "[微笑],[憨笑],[呲牙],[爱心],[啤酒],[太阳],[礼物],[抱拳],[咖啡],[调皮],[激动],[回头],[色],[愉快],[爱情],[飞吻],[跳跳],[发抖],[转圈],[献吻],[耶],[红包],[嘿哈]";
private static List<string> ExpressionList = null;
private static Random random = new Random();
public static string FindRandomExpression()
{
if (ExpressionList == null)
ExpressionList = Expression.Split(',').ToList();
return ExpressionList[random.Next(ExpressionList.Count)];
}
#endregion
private List<string> GetNeedMessage()
{
List<string> _msgs = new List<string>();
if (string.IsNullOrEmpty(content)) return _msgs;
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 message = msg.Trim();
if (string.IsNullOrEmpty(message)) continue;
message = message.Contains("[随机表情]") ? message.Replace("[随机表情]", FindRandomExpression()) : message;
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}");
//_msgs.Add(reg.Groups[1].Value);
}
}
//发送XML消息
if (message.StartsWith("<appmsg appid=") && message.EndsWith("</appmsg>"))
{
_msgs.Add("暂不支持微信卡片消息!");
}
//发送图片消息
var matchs = Regex.Matches(message, @"\[图片\=([^\]]+)\]", RegexOptions.IgnoreCase);
foreach (Match match in matchs)
{
_msgs.Add($"[image={ match.Groups[1].Value}]");
}
message = Regex.Replace(message, @"\[图片\=([^\]]+)\]", "");
//发送语音消息
matchs = Regex.Matches(message, @"\[语音\=([^\]]+)\]", RegexOptions.IgnoreCase);
foreach (Match item in matchs)
{
//暂不支持语音消息
}
message = Regex.Replace(message, @"\[语音\=([^\]]+)\]", "");
matchs = Regex.Matches(message, @"\[视频\=([^\]]+)\]", RegexOptions.IgnoreCase);
foreach (Match item in matchs)
{
var video = Util.StrToHex(item.Groups[1].Value);
if (video != null)
{
var video_json = Encoding.UTF8.GetString(video);
var video_data = CsharpHttpHelper.HttpExtend.JsonToDictionary(video_json);
if (video_data != null)
{
//暂不支持视频消息
}
}
}
message = Regex.Replace(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, @"\[卡片\=([^\]]+)\]", "");
if (string.IsNullOrEmpty(message)) continue;
if (message.StartsWith("\r\n")) message = message.Substring("\r\n".Length);
if (message.StartsWith("\n")) message = message.Substring("\n".Length);
_msgs.Add(message);
}
}
catch (Exception)
{
}
return _msgs;
}
private int index = 0;
public string NextMessage()
{
if (needMessage.Count == index) return string.Empty;
string msg = needMessage[index];
var reg = Regex.Match(msg, @"\[延迟=(\d+)\]");
if (reg.Success)
{
Thread.Sleep(int.Parse(reg.Groups[1].Value) * 1000);
}
index++;
return msg;
}
}
public override void SendFriendImage(uint QQ, string ImageSrc)
{
try
{
if (qqclient != null) qqclient.SendMessage(QQ, $"[image={ImageSrc}]");
}
catch (Exception)
{
}
}
public override void SendFriendMessage(uint QQ, string Message)
{
if (IsLogin)
{
try
{
QQMessagePack pack = new QQMessagePack(Message);
do
{
var msg = pack.NextMessage();
if (string.IsNullOrEmpty(msg)) break;
qqclient.SendMessage(QQ, msg);
} while (true);
}
catch (Exception)
{
}
}
}
public override void SendGroupImage(uint GroupId, string ImageSrc)
{
try
{
if (qqclient != null) qqclient.SendClusterMessage(GroupId, $"[image={ImageSrc}]");
}
catch (Exception)
{
}
}
public override void SendGroupMessage(uint GroupId, string Message)
{
if (IsLogin)
{
try
{
QQMessagePack pack = new QQMessagePack(Message);
do
{
var msg = pack.NextMessage();
if (string.IsNullOrEmpty(msg)) break;
//this.OnLog($"准备发送{GroupId}-{Message}");
qqclient.SendClusterMessage(GroupId, msg);
} while (true);
}
catch (Exception)
{
}
}
}
public override void SendTempMessage(uint QQ, string Message)
{
if (IsLogin)
{
try
{
QQMessagePack pack = new QQMessagePack(Message);
do
{
var msg = pack.NextMessage();
if (string.IsNullOrEmpty(msg)) break;
var result = qqclient.SendTempMessage(QQ, msg);
Console.WriteLine("result = " + result);
} while (true);
}
catch (Exception)
{
}
}
}
}
}