354 lines
14 KiB
C#
354 lines
14 KiB
C#
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);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 刷新机器人列表
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
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);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 刷新群列表
|
|
/// </summary>
|
|
/// <param name="sender"></param>
|
|
/// <param name="e"></param>
|
|
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<MemberInfo>().GroupBy(f => f.groupid).Select(f => f.groupid).ToList();
|
|
|
|
result.Add(new TextAndValue("请选择同步群", "请选择同步群"));
|
|
foreach (var groupid in groupids)
|
|
{
|
|
var temp = DBClient.DbBase.Queryable<MemberInfo>().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<MemberInfo>().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<MemberInfo>().Where(f => f.groupid == groupid).ToList();
|
|
|
|
var invDic = new Dictionary<string, int>();
|
|
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<string, int> item in invDic)
|
|
{
|
|
var m = DBClient.DbBase.Queryable<MemberInfo>().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;
|
|
}
|
|
}
|
|
}
|