using Chat.Framework.QQSdk.Events; using Grant.Framework; using QQLite; using QQLite.Framework; using QQLite.Framework.Browser; using QQLite.Framework.Dapper; using QQLite.Framework.Entity; using QQLite.Framework.SDK; using System; using System.Collections.Generic; using System.Data.SQLite; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace Chat.Framework.QQSdk.PCQQ { public class QQClient : QQBase { private QQUser User; public QQLite.Framework.Client Client; private QQLitePlugin Plugin; /// /// 通过窗体登陆 /// public void Login(uint QQ) { this.QQ = QQ; new LoginLiteQQ(this).ShowDialog(); } private void SDK_LoginStatusChange(object sender, QQLite.Framework.Event.LoginStatusChangeEventArgs e) { try { var x = new QQLoginChangeEvents(this, e.LoginStatus == LoginStatus.Login, e.LoginStatusMessage); ChatClient.QQPool.OnEvent(x); this.OnLog(e.LoginStatusMessage); } catch (Exception ex) { this.OnLog($"{ex.Message} ~ {ex.StackTrace}"); } } public void SendVerifyCode(string code) { this.Client.SendVerifyCode(new QQLite.Framework.Event.VerifyCodeEventArgs() { Termination = true }, code); } ///// ///// 通过账号密码登陆 ///// ///// 账号 ///// 密码 //public void Login(string username, string userpass, bool pcqq = true) //{ // try // { // if (this.User != null && this.Client != null) this.Client.Logout(); // this.QQ = uint.Parse(username); // this.User = new QQUser(QQ, userpass); // base.Password = userpass; // base.IsEQQ = !pcqq; // this.Client = new Client(this.User); // this.Plugin = GetLitePlugin(this.Client);//装载QQ,数据库相关信息 // this.Plugin.SDK.LoginStatusChange += SDK_LoginStatusChange; // this.Plugin.EndSdk = new QQClientSDK(); // this.Plugin.EndSdk.SlipVerifyCode += EndSdk_SlipVerifyCode; // this.User.LoginMode = QQLite.Framework.QQEnum.QQStatus.const_3;//QQ登录状态(在线|Q我吧|离开...) // this.Client.SetTXProtocol(pcqq ? QQLite.Framework.QQEnum.TXProtocolType.QQ_9_1 : QQLite.Framework.QQEnum.TXProtocolType.QQEIM, true); // this.Client.Login(); // } // catch (Exception ex) // { // throw ex; // } //} /// /// 通过账号密码登陆 /// /// 账号 /// 密码 public void Login(QQLitePlugin plugin, Client client, string pass) { try { this.Client = client; this.User = client.QQUser; this.QQ = User.QQ; this.Password = pass; if (!this.IsLogin || !isRegisterLog) { isRegisterLog = true; this.Plugin = GetLitePlugin(this.Client);//装载QQ,数据库相关信息 this.Plugin.SDK.LoginStatusChange -= SDK_LoginStatusChange; this.Plugin.SDK.LoginStatusChange += SDK_LoginStatusChange; } this.Client.Login(); } catch (Exception ex) { } } bool isRegisterLog = false; bool isRegisterEvent = false; internal override void RegisterEvent() { if (this.Client != null) { this.Nickname = this.Client.QQUser.NickName; SendMessageQueue.InitQueueTimer(true, 1);//队列 this.Client.CanSendTime = DateTime.Now.AddSeconds(20); this.Client.AllowSendCluster = true; this.Client.AllowSendTempIM = true; this.Client.AllowSendQQ = true; this.Client.AllowSendDiscuss = true; this.Client.ClusterUseXml = false; this.Client.FriendUseXml = false; if (!isRegisterLog) { isRegisterLog = true; Plugin = GetLitePlugin(this.Client); Plugin.SDK.LoginStatusChange += SDK_LoginStatusChange; } IsRegisterEvent = true; if (!isRegisterEvent) { isRegisterEvent = true; Plugin.SDK.SlipVerifyCode += SDK_SlipVerifyCode; Plugin.SDK.ReceiveClusterIM += SDK_ReceiveClusterIM; //群消息 Plugin.SDK.ReceiveNormalIM += SDK_ReceiveNormalIM; //私人消息 Plugin.SDK.ReceiveTempSessionIM += SDK_ReceiveTempSessionIM; //临时会话 Plugin.SDK.ClusterMemberJoin += SDK_ClusterMemberJoin; //新用户加入群 Plugin.SDK.ClusterRequestJoin += SDK_ClusterRequestJoin; //用户请求加入群 Plugin.SDK.FriendRequestAddMeAuth += SDK_FriendRequestAddMeAuth;//请求加我为好友 Plugin.SDK.FriendAddSuccess += SDK_FriendAddSuccess; Plugin.SDK.FriendRequestAddMe += SDK_FriendRequestAddMe; //加我好友 } } } private void QQClient_GrantEvent(customer customer, string message) { if (!string.IsNullOrEmpty(message) && this.Client != null && this.Client.QQUser.QQ.ToString() == customer.cardname && "1002" == customer.softId.ToString()) { var x = new QQLoginChangeEvents(this, false, $"授权异常!{(string.IsNullOrEmpty(message) ? "" : message)}"); ChatClient.QQPool.OnEvent(x); } } private void SDK_SlipVerifyCode(object sender, QQLite.Framework.Event.VerifyCodeEventArgs e) { } //private void SDK_VerifyCode(object sender, QQLite.Framework.Event.VerifyCodeEventArgs e) //{ // try // { // this.OnLog($"验证码图片:{e.ImageFile}"); // //this.OnLog($"QQ({(Client == null ? 0 : Client.QQUser.QQ)})->【{e.QQ}】需要验证码"); // var evt = new QQVerifyCodeEvents(this) { ImageFile = e.ImageFile, QQ = e.QQ, Session = e.Session, Type = (VerifyCodeEventType)((int)e.Type) }; // ChatClient.QQPool.OnEvent(evt); // } // catch (Exception ex) // { // this.OnLog($"VerifyCode Error:{ex.Message}"); // } //} internal override void UnRegisterEvent() { if (this.Client != null && isRegisterEvent) { try { isRegisterEvent = false; IsRegisterEvent = false; Plugin.SDK.SlipVerifyCode -= SDK_SlipVerifyCode; Plugin.SDK.ReceiveClusterIM -= SDK_ReceiveClusterIM; //群消息 Plugin.SDK.ReceiveNormalIM -= SDK_ReceiveNormalIM; //私人消息 Plugin.SDK.ReceiveTempSessionIM -= SDK_ReceiveTempSessionIM; //临时会话 Plugin.SDK.ClusterMemberJoin -= SDK_ClusterMemberJoin; //新用户加入群 Plugin.SDK.ClusterRequestJoin -= SDK_ClusterRequestJoin; //用户请求加入群 Plugin.SDK.FriendAddSuccess -= SDK_FriendAddSuccess; // Plugin.SDK.FriendRequestAddMeAuth -= SDK_FriendRequestAddMeAuth;//请求加我为好友 Plugin.SDK.FriendRequestAddMe -= SDK_FriendRequestAddMe; //加我好友 Plugin.SDK.LoginStatusChange -= SDK_LoginStatusChange; if (ChatClient.QQPool.QQClients.ContainsKey(this.QQ)) { QQBase b; ChatClient.QQPool.QQClients.TryRemove(this.QQ, out b); } } catch (Exception) { } finally { RemovePlugin(Plugin); } } } /// /// 用户申请添加好友 /// /// /// private void SDK_FriendRequestAddMeAuth(object sender, QQLite.Framework.Event.FriendRequestAddMeEventArgs e) { try { this.OnLog($"QQ({(this.Client == null ? 0 : this.Client.QQUser.QQ)})->用户【{e.QQ}】申请添加好友!"); var evt = new QQAddMeNeedAuthEvents(this) { QQ = e.QQ, Message = e.Message }; ChatClient.QQPool.OnEvent(evt); } catch (Exception ex) { this.OnLog($"FRAddMeAuth Error:{ex.Message}"); } } private void SDK_FriendRequestAddMe(object sender, QQLite.Framework.Event.FriendRequestAddMeEventArgs e) { try { } catch (Exception ex) { this.OnLog($"FRAddMe Error:{ex.Message}"); } } private void SDK_FriendAddSuccess(object sender, QQLite.Framework.Event.FriendAddSuccessEventArgs e) { try { //this.OnLog($"QQ({(Client == null ? 0 : Client.QQUser.QQ)})->用户【{e.QQ}】申请添加好友!"); } catch (Exception ex) { this.OnLog($"FAddSuccess Error:{ex.Message}"); } } /// /// 新人申请入QQ群 /// /// /// private void SDK_ClusterRequestJoin(object sender, QQLite.Framework.Event.ClusterRequestJoinEventArgs e) { try { var evt = new QQAddToClusterNeedAuthEvents(this) { ClusterId = e.ClusterInfo.ClusterId, QQ = e.MemberQQ, Nickname = e.MemberName, Message = e.Message, GroupId = e.ClusterInfo.ExternalId, GroupName = e.ClusterInfo.Name, Creator = e.ClusterInfo.Creator }; ChatClient.QQPool.OnEvent(evt); } catch (Exception ex) { this.OnLog($"CRJoin Error:{ex.Message}"); } } /// /// 群加入新用户 /// /// /// private void SDK_ClusterMemberJoin(object sender, QQLite.Framework.Event.ClusterMemberJoinEventArgs e) { try { var evt = new QQNewGroupMemberEvents(this) { GroupId = e.ClusterInfo.ExternalId, GroupName = e.ClusterInfo.Name, Creator = e.ClusterInfo.Creator, NewFriendQQ = e.MemberQQ, NewFriendNick = e.MemberName, InviteQQ = e.InviteQQ, Operator = e.Operator, OperatorName = e.OperatorName }; ChatClient.QQPool.OnEvent(evt); } catch (Exception ex) { this.OnLog($"CMJoin Error:{ex.Message}"); } } /// /// 收到临时会话 /// /// /// private void SDK_ReceiveTempSessionIM(object sender, QQLite.Framework.Event.TempSessionIMEventArgs e) { try { Client = sender as Client; this.OnLog($"QQ({(Client == null ? 0 : Client.QQUser.QQ)})->临时消息->{e.SenderName}({e.Sender})说:{e.Message}"); var temp = new QQReceiveFriendMsgEvents(this) { Token = e.Token, TempMsgID = e.Sender, QQ = e.Sender, Nickname = e.SenderName, Message = e.Message }; ChatClient.QQPool.OnEvent(temp); } catch (Exception ex) { this.OnLog($"RTSIM Error:{ex.Message}"); } } /// /// 收到私人消息 /// /// /// private void SDK_ReceiveNormalIM(object sender, QQLite.Framework.Event.NormalIMEventArgs e) { try { if (e.Sender == this.QQ) return; Client = sender as Client; this.OnLog($"QQ({(Client == null ? 0 : Client.QQUser.QQ)})->私消息->{e.SenderName}({e.Sender})说:{e.Message}"); var temp = new QQReceiveFriendMsgEvents(this) { QQ = e.Sender, Message = e.Message, Nickname = e.SenderName }; ChatClient.QQPool.OnEvent(temp); } catch (Exception ex) { this.OnLog($"RNIM Error:{ex.Message}"); } } /// /// 收到群消息 /// /// /// private void SDK_ReceiveClusterIM(object sender, QQLite.Framework.Event.ClusterIMEventArgs e) { try { if (e.Sender == this.QQ) return;//忽略自己的消息 this.OnLog($"QQ({(this.Client == null ? 0 : this.Client.QQUser.QQ)})->群消息->{e.SenderName}({e.Sender})在[{e.ClusterInfo.Name}({e.ClusterInfo.ExternalId})]群说:{e.Message}"); var temp = new QQReceiveGroupMsgEvents(this) { QQ = e.Sender, Message = e.Message, Nickname = e.SenderName, GroupName = e.ClusterInfo.Name, GroupId = e.ClusterInfo.ExternalId }; ChatClient.QQPool.OnEvent(temp); } catch (Exception ex) { this.OnLog($"RCIM Error:{ex.Message}"); } } public override void SendFriendImage(uint QQ, string ImageSrc) { try { if (this.Client != null) this.Client.SendIM(QQ, $"[image]{ImageSrc}[/image]"); } catch (Exception) { } } public override void SendFriendMessage(uint QQ, string Message) { if (IsLogin) { try { QQMessagePack pack = new QQMessagePack(Message); do { var msg = pack.NextMessage(); msg = Regex.Replace(msg, @"(\[@\d+\])", ""); if (string.IsNullOrEmpty(msg)) break; var result = this.Client.SendIM(QQ, msg); } while (true); } catch (Exception) { } } } public override void SendGroupImage(uint GroupId, string ImageSrc) { try { if (this.Client != null) this.Client.SendClusterIM(GroupId, $"[image]{ImageSrc}[/image]"); } catch (Exception) { } } //public override void SendFriendVideo(uint toUsername, string videoSrc) //{ // try // { // if (this.Client != null) this.Client.SendIM(toUsername, $"[Video]{videoSrc}[/Video]"); // } // catch (Exception ex) // { } //} //public override void SendGroupVideo(uint GroupId, string ImageSrc) //{ // try // { // if (this.Client != null) this.Client.SendClusterIM(GroupId, $"[Video]{ImageSrc}[/Video]"); // } // catch (Exception) // { } //} /// /// 显示登录窗口 /// /// public override void ShowLogin(string Username) { if (!string.IsNullOrEmpty(Username)) this.QQ = uint.Parse(Username); var form = new LoginLiteQQ(this); form.ShowDialog(); } 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; var result = this.Client.SendClusterIM(GroupId, msg); } while (true); } catch (Exception) { } } } public override void SendTempMessage(uint QQ, string Message, byte[] Token) { if (IsLogin) { try { QQMessagePack pack = new QQMessagePack(Message); do { var msg = pack.NextMessage(); msg = Regex.Replace(msg, @"\[image.+image\]", "【临时消息不支持图片】"); if (string.IsNullOrEmpty(msg)) break; var result = this.Client.SendTempIM(QQ, msg, Token); } 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(); msg = Regex.Replace(msg, @"\[image.+image\]", "【临时消息不支持图片】"); if (string.IsNullOrEmpty(msg)) break; var result = this.Client.SendTempIM(QQ, msg); } while (true); } catch (Exception) { } } } public override void AerifyAddMe(uint QQ, bool Agree) { try { if (IsLogin) this.Client.FriendApprovedAddMe(QQ); } catch (Exception ex) { this.OnLog($"AAddMe Error:{ex.Message}"); } } public override void AerifyAddGroup(uint groupId, uint QQ) { try { if (IsLogin) { var result = this.Client.ClusterApproveInviteJoin(groupId, QQ); } } catch (Exception ex) { this.OnLog($"AerifyAddGroup Error:{ex.Message}"); } } public override void Logout() { try { if (this.Client != null && isRegisterEvent) { try { isRegisterEvent = false; IsRegisterEvent = false; Plugin.SDK.SlipVerifyCode -= SDK_SlipVerifyCode; Plugin.SDK.ReceiveClusterIM -= SDK_ReceiveClusterIM; //群消息 Plugin.SDK.ReceiveNormalIM -= SDK_ReceiveNormalIM; //私人消息 Plugin.SDK.ReceiveTempSessionIM -= SDK_ReceiveTempSessionIM; //临时会话 Plugin.SDK.ClusterMemberJoin -= SDK_ClusterMemberJoin; //新用户加入群 Plugin.SDK.ClusterRequestJoin -= SDK_ClusterRequestJoin; //用户请求加入群 Plugin.SDK.FriendAddSuccess -= SDK_FriendAddSuccess; // Plugin.SDK.FriendRequestAddMeAuth -= SDK_FriendRequestAddMeAuth;//请求加我为好友 Plugin.SDK.FriendRequestAddMe -= SDK_FriendRequestAddMe; //加我好友 Plugin.SDK.LoginStatusChange -= SDK_LoginStatusChange; } catch (Exception) { } } RemovePlugin(Plugin); } catch (Exception ex) { this.OnLog($"Logout Error:{ex.Message}"); } } public override void AutoLogin() { try { this.Client.Login(); } catch (Exception ex) { this.OnLog($"algn Error:{ex.Message}"); } } #region 内部类 class QQMessagePack { private string content; List needMessage; public QQMessagePack(string Message) { this.content = Message; this.needMessage = GetNeedMessage(); } #region 返回一个随机表情 private static string Expression = "[微笑],[憨笑],[呲牙],[爱心],[啤酒],[太阳],[礼物],[抱拳],[咖啡],[调皮],[激动],[回头],[色],[愉快],[爱情],[飞吻],[跳跳],[发抖],[转圈],[献吻],[耶],[红包],[嘿哈]"; private static List 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 GetNeedMessage() { List _msgs = new List(); 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("")) { _msgs.Add("暂不支持QQ卡片消息!"); } //发送图片消息 var matchs = Regex.Matches(message, @"\[图片\=([^\]]+)\]", RegexOptions.IgnoreCase); foreach (Match match in matchs) { _msgs.Add($"[image]{ match.Groups[1].Value}[/image]"); } 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) //{ // try // { // _msgs.Add($"[Video]{ item.Groups[1].Value}[/Video]"); // //var video = Util.StrToHex(temp); // //if (video != null) // //{ // // var video_json = Encoding.UTF8.GetString(video); // // var video_data = CsharpHttpHelper.HttpExtend.JsonToDictionary(video_json); // // if (video_data != null) // // { // // //暂不支持视频消息 // // } // //} // } // catch (Exception ex) // { } //} 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 ex) { } 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; } } #endregion #region 暂时固定写死 private static bool i5MxESGqfP(string string_0, string string_1) { bool result; try { if (string_1[string_1.Length - 1] != Path.DirectorySeparatorChar) { string_1 += Path.DirectorySeparatorChar.ToString(); } if (!Directory.Exists(string_1)) { Directory.CreateDirectory(string_1); } string[] fileSystemEntries = Directory.GetFileSystemEntries(string_0); foreach (string text in fileSystemEntries) { if (Directory.Exists(text)) { i5MxESGqfP(text, string_1 + Path.GetFileName(text)); } else { File.Copy(text, string_1 + Path.GetFileName(text), true); } } result = true; } catch { result = false; } return result; } /// /// 初始化QQ /// /// /// public static QQLite.QQLitePlugin GetLitePlugin(Client Client) { QQLite.QQLitePlugin plugin = null; DbBase.RobotQQ = Client.QQ; string text = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "QQ\\" + Client.QQ); if (!Directory.Exists(text)) { string text2 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "QQ\\0"); if (Directory.Exists(text2)) { i5MxESGqfP(text2, text); } else { Directory.CreateDirectory(text); } } text = Path.Combine(text, "QQLite.db"); if (!File.Exists(text)) { using (DbBase dbBase = new DbBase("Data Source=" + text + ";Pooling=true;FailIfMissing=false")) { dbBase.BeginTransation(); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("DROP TABLE IF EXISTS `QQLite_Config`;"); stringBuilder.AppendLine("CREATE TABLE IF NOT EXISTS `QQLite_Config` ("); stringBuilder.AppendLine("`ConfigId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"); stringBuilder.AppendLine("`PluginId` TEXT(255) NOT NULL DEFAULT ('qqrobot'),"); stringBuilder.AppendLine("`ConfigName` TEXT(20) NOT NULL COLLATE NOCASE ,"); stringBuilder.AppendLine("`ConfigInfo` TEXT(100) NOT NULL COLLATE NOCASE ,"); stringBuilder.AppendLine("`ConfigType` TEXT(10) NOT NULL COLLATE NOCASE DEFAULT ('string'),"); stringBuilder.AppendLine("`ConfigValue` TEXT COLLATE NOCASE ,"); stringBuilder.AppendLine("CONSTRAINT `ConfigId` UNIQUE (`ConfigId` ASC)"); stringBuilder.AppendLine(");"); stringBuilder.AppendLine("DROP TABLE IF EXISTS `QQLite_Plugin`;"); stringBuilder.AppendLine("CREATE TABLE IF NOT EXISTS `QQLite_Plugin` ("); stringBuilder.AppendLine("`Pid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"); stringBuilder.AppendLine("`PluginId` TEXT(255) NOT NULL ,"); stringBuilder.AppendLine("`IsInstall` INTEGER NOT NULL DEFAULT (0),"); stringBuilder.AppendLine("`IsEnabled` INTEGER NOT NULL DEFAULT (0),"); stringBuilder.AppendLine("`Priority` INTEGER NOT NULL DEFAULT (0),"); stringBuilder.AppendLine("`Version` TEXT(20) NOT NULL COLLATE NOCASE ,"); stringBuilder.AppendLine("CONSTRAINT `Pid` UNIQUE (`Pid` ASC)"); stringBuilder.AppendLine(");"); stringBuilder.AppendLine("DROP TABLE IF EXISTS `DBVersion`;"); stringBuilder.AppendLine("CREATE TABLE `DBVersion`("); stringBuilder.AppendLine("`Version` TEXT"); stringBuilder.AppendLine(");"); stringBuilder.AppendLine("CREATE UNIQUE INDEX IF NOT EXISTS `index_config_plugin` ON `QQLite_Config` (`PluginId` ASC, `ConfigName` ASC);"); stringBuilder.AppendLine("CREATE UNIQUE INDEX IF NOT EXISTS `index_qqlite_plugin` ON `QQLite_Plugin` (`PluginId` ASC);"); dbBase.Conn.Execute(stringBuilder.ToString(), null, dbBase.Tran, null, null); dbBase.Conn.Execute("INSERT INTO `DBVersion` (Version) VALUES (@Version)", new { Version = "1.0.0.1" }, dbBase.Tran, null, null); dbBase.EndTransaction(); ((SQLiteConnection)dbBase.Conn).ChangePassword("WomccServices.Desc"); } } else { using (DbBase dbBase2 = new DbBase("----------")) { dbBase2.BeginTransation(); //通过表名检测是否存在 if (dbBase2.Conn.Query("SELECT COUNT(*) as CNT FROM sqlite_master where type='table' and name='DBVersion'").FirstOrDefault() == 0) { StringBuilder stringBuilder2 = new StringBuilder(); stringBuilder2.AppendLine("DROP TABLE IF EXISTS `DBVersion`;"); stringBuilder2.AppendLine("CREATE TABLE `DBVersion`("); stringBuilder2.AppendLine("`Version` TEXT"); stringBuilder2.AppendLine(");"); dbBase2.Conn.Execute(stringBuilder2.ToString(), null, dbBase2.Tran, null, null); dbBase2.Conn.Execute("INSERT INTO `DBVersion` (Version) VALUES (@Version)", new { Version = "1.0.0.0" }, dbBase2.Tran, null, null); } string a = dbBase2.Conn.Query("SELECT Version FROM `DBVersion`").SingleOrDefault(); if (a == "1.0.0.0") { dbBase2.Conn.Execute("CREATE UNIQUE INDEX IF NOT EXISTS `index_config_plugin` ON `QQLite_Config` (`PluginId` ASC, `ConfigName` ASC);", dbBase2.Tran, null, null, null); dbBase2.Conn.Execute("ALTER TABLE `QQLite_Plugin` ADD COLUMN `IsInstall` INTEGER NOT NULL DEFAULT (0);", dbBase2.Tran, null, null, null); dbBase2.Conn.Execute("CREATE UNIQUE INDEX IF NOT EXISTS `index_qqlite_plugin` ON `QQLite_Plugin` (`PluginId` ASC);", dbBase2.Tran, null, null, null); dbBase2.Conn.Execute("UPDATE `DBVersion` SET Version=@Version", new { Version = "1.0.0.1" }, dbBase2.Tran, null, null); } dbBase2.EndTransaction(); } } plugin.PluginAction_StartAll(Client); plugin = Client.GetPlugin("QQLite.QQLitePlugin") as QQLitePlugin; plugin.SDK = new QQClientSDK(); return plugin; } public static void RemovePlugin(QQLitePlugin plugin) { try { if (plugin != null) { plugin.PluginAction_StopAll(); plugin.Stop(); } } catch (Exception ex) { } finally { plugin = null; } } #endregion } }