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

497 lines
20 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
{
}
}
}
}
}