using Api.Framework; using Chat.Framework.WXSdk.Implement; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using 同步老妖联盟上下级关系.Entitys; using 同步老妖联盟上下级关系.Utils; namespace 同步老妖联盟上下级关系 { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } public void CloseForm() { try { if (!this.IsDisposed) { this.Invoke(new Action(delegate { this.Close(); this.Dispose(); })); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void MainForm_Load(object sender, EventArgs e) { try { EventLog.LogEvent += EventLog_LogEvent1; if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) { var path = folderBrowserDialog1.SelectedPath; if (Directory.Exists(path)) { var dataPath = Path.Combine(path, "数据.db"); if (!File.Exists(dataPath)) throw new Exception("数据库不存在"); DBClient.ConnPath = textBox1.Text = dataPath; } else throw new Exception("选择的目录路径存在异常"); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } /// /// 刷新机器人列表 /// /// /// private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { try { comboBox1.DataSource = null; var clients = Chat.Framework.ChatClient.WXClient.Values.Where(f => f.Status == Chat.Framework.WXSdk.WxStatus.在线 && f.WeixinType == Chat.Framework.WXSdk.Implement.WeixinType.Grpc微信).ToList(); var result = new ArrayList(); result.Add(new TextAndValue("请选择机器人", "请选择机器人")); foreach (var item in clients) { result.Add(new TextAndValue(item.User.Nick, item.WeixinHao)); } comboBox1.DataSource = result; comboBox1.DisplayMember = "DisplayText"; comboBox1.ValueMember = "RealValue"; comboBox1.SelectedIndex = 0; } catch (Exception ex) { MessageBox.Show(ex.Message + " - " + ex.StackTrace); } } /// /// 刷新群列表 /// /// /// private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { try { if (comboBox1.SelectedIndex == 0) throw new Exception("请选择机器人"); comboBox2.DataSource = null; var result = new ArrayList(); var groupids = DBClient.DbBase.Queryable().GroupBy(f => f.groupid).Select(f => f.groupid).ToList(); result.Add(new TextAndValue("请选择同步群", "请选择同步群")); foreach (var groupid in groupids) { var temp = DBClient.DbBase.Queryable().First(f => f.groupnick != string.Empty && f.groupid == groupid); if (temp != null) result.Add(new TextAndValue(temp.groupnick, groupid)); } comboBox2.DataSource = result; comboBox2.DisplayMember = "DisplayText"; comboBox2.ValueMember = "RealValue"; comboBox2.SelectedIndex = 0; } catch (Exception ex) { MessageBox.Show(ex.Message + " - " + ex.StackTrace); } } class TextAndValue { private string _RealValue = ""; private string _DisplayText = ""; public string DisplayText { get { return _DisplayText; } } public string RealValue { get { return _RealValue; } } public TextAndValue(string ShowText, string RealVal) { _DisplayText = ShowText; _RealValue = RealVal; } public override string ToString() { return _RealValue.ToString(); } } private void button2_Click(object sender, EventArgs e) { try { if (comboBox1.SelectedIndex == 0) throw new Exception("请选择机器人"); if (comboBox1.SelectedIndex == 0) throw new Exception("请选择同步群"); } catch (Exception ex) { MessageBox.Show(ex.Message); return; } var robotid = comboBox1.SelectedValue.ToString(); var groupid = comboBox2.SelectedValue.ToString(); var groupNick = comboBox2.Text.ToString(); Task.Run(() => { try { var t = Task.Run(() => { this.Invoke(new Action(() => { button2.Enabled = false; })); try { EventLog.OnEvent(this, $"开始获取机器人..."); var client = Chat.Framework.ChatClient.WXClient.Values.Where(f => f.Status == Chat.Framework.WXSdk.WxStatus.在线 && f.WeixinType == WeixinType.Grpc微信).FirstOrDefault(f => f.WeixinHao == robotid); if (client == null) throw new Exception("数据异常"); var wx = client as WXClientImpl_IPAD; if (wx == null) throw new Exception("异常1"); EventLog.OnEvent(this, $"获取群{groupid}用户..."); var members = wx.GetMembers(groupid, true); EventLog.OnEvent(this, $"获取群用户数量:{(members == null ? 0 : members.Length)}"); var mInfos = DBClient.DbBase.Queryable().Where(f => f.groupid == groupid).ToList(); EventLog.OnEvent(this, $"获取数据库群{groupid}用户..."); if (mInfos == null) throw new Exception("获取用户数据为空"); EventLog.OnEvent(this, $"获取数据库用户数量:{(mInfos == null ? 0 : mInfos.Count)}"); var mInfosTemp = DBClient.DbBase.Queryable().Where(f => f.groupid == groupid).ToList(); var invDic = new Dictionary(); EventLog.OnEvent(this, $"开始规整上下级数据...数量:{members.Length}"); for (int z = 0; z < members.Length; z++) { var item = members[z]; var tmp = mInfosTemp.FirstOrDefault(f => f.username == item.Username); if (tmp != null) mInfosTemp.Remove(tmp); var member = mInfos.FirstOrDefault(f => f.groupid == groupid && f.username == item.Username); if (member == null) { member = new MemberInfo() { username = item.Username, groupid = groupid, groupnick = groupNick, avatar = item.SmallHeadImgUrl, join_time = (long)(DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds, sex = -1 }; mInfos.Add(member); } member.usernick = item.NickName; member.avatar = item.SmallHeadImgUrl; member.invited_num = 0; member.quit_time = 0; member.inviter = 0; if (!string.IsNullOrWhiteSpace(item.InviterUserName)) { var iMember = mInfos.FirstOrDefault(f => f.groupid == groupid && f.username == item.InviterUserName); if (iMember == null) { iMember = new MemberInfo() { username = item.InviterUserName, usernick = string.Empty, avatar = string.Empty, join_time = (long)(DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds, invited_num = 0, sex = -1 }; var isExist = members.FirstOrDefault(f => f.Username == item.InviterUserName); if (isExist == null) iMember.quit_time = iMember.join_time; iMember.groupid = groupid; iMember.groupnick = groupNick; iMember = DBClient.DbBase.Insertable(iMember).ExecuteReturnEntity(); mInfos.Add(iMember); } if (!invDic.ContainsKey(item.InviterUserName)) invDic.Add(item.InviterUserName, 1); else { var num = invDic[item.InviterUserName]; num++; invDic[item.InviterUserName] = num; } member.inviter = iMember.id; //result.Add(member); } member = DBClient.DbBase.Saveable(member).ExecuteReturnEntity(); } EventLog.OnEvent(this, $"保存上下级数据完毕"); EventLog.OnEvent(this, $"开始重新计算邀请人数..."); foreach (KeyValuePair item in invDic) { var m = DBClient.DbBase.Queryable().First(f => f.groupid == groupid && f.username == item.Key); if (m != null) { m.invited_num = item.Value; DBClient.DbBase.Saveable(m).ExecuteCommand(); } else { } } EventLog.OnEvent(this, $"重新统计邀请人数完毕"); foreach (var item in mInfosTemp) { item.quit_time = (long)(DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds; item.groupnick = groupNick; item.robotname = client.User.Username; } DBClient.DbBase.Saveable(mInfosTemp).ExecuteCommand(); } catch (Exception ex) { EventClient.OnEvent("异常_", ex.Message + "_" + ex.StackTrace); } finally { this.Invoke(new Action(() => { button2.Enabled = true; })); } }); Task.WaitAll(t); EventLog.OnEvent(this, $"同步用户完毕"); } catch (Exception ex) { EventLog.OnEvent(this, ex.Message + " - " + ex.StackTrace); } }); } private void EventLog_LogEvent1(object sender, LogEvent e) { this.Invoke(new Action(() => { try { if (memoEdit1.Text.Length >= 1000) { memoEdit1.Text = memoEdit1.Text.Remove(300); } memoEdit1.Text = $@"{e.Message.Trim()} {memoEdit1.Text}"; //memoEdit3.SelectionStart = memoEdit3.Text.Length; } catch (Exception ex) { MessageBox.Show(ex.Message + "__ " + ex.StackTrace); } })); } private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { EventLog.LogEvent -= EventLog_LogEvent1; } } }