old_flsystem/应用/同步老妖联盟上下级关系/MainForm.cs

354 lines
14 KiB
C#
Raw Permalink Normal View History

2022-09-20 03:10:29 +00:00
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;
}
}
}