Exemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        private void DoMainLogic()
        {
            _lblWait.BringToFront();
            ((Action)(delegate()
            {
                JObject init_result = wxs.WxInit();  //初始化
                #region 初始化个人信息和最近聊天列表
                List <object> contact_all = new List <object>();
                if (init_result != null)
                {
                    _me = new WXUser();
                    _me.UserName = init_result["User"]["UserName"].ToString();
                    _me.City = "";
                    _me.HeadImgUrl = init_result["User"]["HeadImgUrl"].ToString();
                    _me.NickName = init_result["User"]["NickName"].ToString();
                    _me.Province = "";
                    _me.PYQuanPin = init_result["User"]["PYQuanPin"].ToString();
                    _me.RemarkName = init_result["User"]["RemarkName"].ToString();
                    _me.RemarkPYQuanPin = init_result["User"]["RemarkPYQuanPin"].ToString();
                    _me.Sex = init_result["User"]["Sex"].ToString();
                    _me.Signature = init_result["User"]["Signature"].ToString();
                    _me.Alias = init_result["Alias"]["Alias"].ToString();

                    foreach (JObject contact in init_result["ContactList"])  //部分好友名单
                    {
                        WXUser user = new WXUser();
                        user.UserName = contact["UserName"].ToString();
                        user.City = contact["City"].ToString();
                        user.HeadImgUrl = contact["HeadImgUrl"].ToString();
                        user.NickName = contact["NickName"].ToString();
                        user.Province = contact["Province"].ToString();
                        user.PYQuanPin = contact["PYQuanPin"].ToString();
                        user.RemarkName = contact["RemarkName"].ToString();
                        user.RemarkPYQuanPin = contact["RemarkPYQuanPin"].ToString();
                        user.Sex = contact["Sex"].ToString();
                        user.Signature = contact["Signature"].ToString();

                        _contact_latest.Add(user);
                    }
                }
                #endregion
                #region 初始化通讯录
                JObject contact_result = wxs.GetContact(); //通讯录
                if (contact_result != null)
                {
                    foreach (JObject contact in contact_result["MemberList"])  //完整好友名单
                    {
                        WXUser user = new WXUser();
                        user.UserName = contact["UserName"].ToString();
                        user.City = contact["City"].ToString();
                        user.HeadImgUrl = contact["HeadImgUrl"].ToString();
                        user.NickName = contact["NickName"].ToString();
                        user.Province = contact["Province"].ToString();
                        user.PYQuanPin = contact["PYQuanPin"].ToString();
                        user.RemarkName = contact["RemarkName"].ToString();
                        user.RemarkPYQuanPin = contact["RemarkPYQuanPin"].ToString();
                        user.Sex = contact["Sex"].ToString();
                        user.Signature = contact["Signature"].ToString();
                        user.VerifyFlag = contact["VerifyFlag"].ToString();
                        user.Alias = contact["Alias"].ToString();

                        contact_all.Add(user);
                    }
                }
                #endregion
                #region 将个人信息、聊天信息、通讯录信息填充到控件中
                IOrderedEnumerable <object> list_all = contact_all.OrderBy(e => (e as WXUser).ShowPinYin);

                WXUser wx; string start_char;
                foreach (object o in list_all)
                {
                    wx = o as WXUser;
                    start_char = wx.ShowPinYin == "" ? "" : wx.ShowPinYin.Substring(0, 1);
                    if (!_contact_all.Contains(start_char.ToUpper()))
                    {
                        _contact_all.Add(start_char.ToUpper());
                    }
                    _contact_all.Add(o);
                }

                this.BeginInvoke((Action)(delegate()  //等待结束
                {
                    _lblWait.Visible = false;

                    wChatList1.Items.AddRange(_contact_latest.ToArray());  //近期联系人
                    wFriendsList1.Items.AddRange(_contact_all.ToArray());  //通讯录
                    wpersonalinfo.FriendUser = _me;
                }));
                #endregion
                #region 检查通讯录好友
                int.TryParse(System.Configuration.ConfigurationManager.AppSettings["GroupWaitTime"], out groupwaittime);
                var SpecialUsers = new string[] { "newsapp", "fmessage", "filehelper", "weibo", "qqmail", "tmessage", "qmessage", "qqsync", "floatbottle", "lbsapp", "shakeapp", "medianote", "qqfriend", "readerapp", "blogapp", "facebookapp", "masssendapp",
                                                  "meishiapp", "feedsapp", "voip", "blogappweixin", "weixin", "brandsessionholder", "weixinreminder", "wxid_novlwrv3lqwv11", "gh_22b87fa7cb3c", "officialaccounts", "notification_messages", "wxitil", "userexperience_alarm" };
                var persons = contact_all.Select(c => c as WXUser).Where(c => c.VerifyFlag == "0" &&
                                                                         !SpecialUsers.Contains(c.UserName) && !c.UserName.Contains("@@") && c.UserName != _me.UserName).ToList();
                int groupcount = 2, index = 0;
                string chatroomname = "";
                List <string> deletedlist = new List <string>(), blockedlist = new List <string>();
                Dictionary <string, string> addresult = new Dictionary <string, string>(), deleteresult = new Dictionary <string, string>();
                JObject temp;
                while (index < persons.Count)
                {
                    var groupperson = persons.Where((c, i) => i >= index && i < (index + groupcount)).Select(c => c.UserName);

                    if (chatroomname == "")
                    {
                        temp = wxs.CreateRoom(groupperson.ToList());
                        chatroomname = temp["ChatRoomName"].ToString();
                    }
                    else
                    {
                        temp = wxs.AddMember(chatroomname, groupperson.ToList());
                    }
                    foreach (JObject obj in temp["MemberList"])
                    {
                        if (obj["MemberStatus"].ToString() == "4")
                        {
                            deletedlist.Add(obj["UserName"].ToString());
                        }
                        else if (obj["MemberStatus"].ToString() == "3")
                        {
                            blockedlist.Add(obj["UserName"].ToString());
                        }
                    }
                    System.Threading.Thread.Sleep(groupwaittime);
                    var delres = wxs.DeleteMember(chatroomname, groupperson.ToList());
                    foreach (var p in groupperson)
                    {
                        addresult[p] = temp["BaseResponse"]["Ret"].ToString();
                        deleteresult[p] = delres["BaseResponse"]["Ret"].ToString();
                    }
                    index += groupcount;
                    System.Threading.Thread.Sleep(groupwaittime);
                }
                var deletednames = persons.Where(c => deletedlist.Contains(c.UserName))
                                   .Select(c => string.IsNullOrEmpty(c.RemarkName) ? c.NickName : c.RemarkName);
                var blockednames = persons.Where(c => blockedlist.Contains(c.UserName))
                                   .Select(c => string.IsNullOrEmpty(c.RemarkName) ? c.NickName : c.RemarkName);
                Helper.XmlHelper xh = new Helper.XmlHelper();
                xh.Root.SetAttribute("UserName", _me.UserName);
                xh.Root.SetAttribute("NickName", _me.NickName);
                xh.Root.SetAttribute("Alias", _me.Alias);
                xh.Root.SetAttribute("friendcount", persons.Count.ToString());
                xh.Root.SetAttribute("deletedcount", deletednames.Count().ToString());
                xh.Root.SetAttribute("blockedcount", blockednames.Count().ToString());
                xh.Root.SetAttribute("deletednames", string.Join(",", deletednames));
                xh.Root.SetAttribute("blockednames", string.Join(",", blockednames));
                xh.Root.SetAttribute("checktimesplit", groupwaittime.ToString());
                foreach (var p in persons)
                {
                    XmlElement ele = xh.Doc.CreateElement("Friend");
                    ele.SetAttribute("UserName", p.UserName);
                    ele.SetAttribute("NickName", p.NickName);
                    ele.SetAttribute("Alias", p.Alias);
                    ele.SetAttribute("Province", p.Province);
                    ele.SetAttribute("Sex", p.Sex);
                    ele.SetAttribute("HeadImgUrl", p.HeadImgUrl);
                    ele.SetAttribute("Province", p.Province);
                    ele.SetAttribute("City", p.City);
                    ele.SetAttribute("AddStatus", addresult[p.UserName]);
                    ele.SetAttribute("DeleteStatus", deleteresult[p.UserName]);
                    ele.SetAttribute("FriendStatus", deletedlist.Contains(p.UserName) ? "4" : blockednames.Contains(p.UserName) ? "3" : "0");
                    xh.AddEle(ele);
                }
                xh.Save(string.Format("{0}\\{1}{2}.xml", Environment.GetFolderPath(Environment.SpecialFolder.Desktop).TrimEnd('\\'), _me.UserName, DateTime.Now.ToString("yyyyMMddhhmmss")));
                //wxs.SendMsg(string.Format("删除名单有:{0} 拉黑名单有:{1}", string.Join(",", deletednames), string.Join(",", blockednames)), _me.UserName, chatroomname, 1);
                //MessageBox.Show(string.Format("删除名单有:{0} 拉黑名单有:{1}", string.Join(",", deletednames), string.Join(",", blockednames)));
                #endregion
                #region 保持和微信持续通讯
                System.Threading.Thread t1 = new System.Threading.Thread(new System.Threading.ThreadStart(cycletalk));
                t1.Start();
                #endregion
                #region 循环拉取微信消息
                //string sync_flag = "";
                //JObject sync_result;
                //while (true)
                //{
                //    sync_flag = wxs.WxSyncCheck();  //同步检查
                //    if (sync_flag == null)
                //    {
                //        continue;
                //    }
                //    //这里应该判断 sync_flag中selector的值
                //    else //有消息
                //    {
                //        sync_result = wxs.WxSync();  //进行同步
                //        if (sync_result != null)
                //        {
                //            if (sync_result["AddMsgCount"] != null && sync_result["AddMsgCount"].ToString() != "0")
                //            {
                //                foreach (JObject m in sync_result["AddMsgList"])
                //                {
                //                    string from = m["FromUserName"].ToString();
                //                    string to = m["ToUserName"].ToString();
                //                    string content = m["Content"].ToString();
                //                    string type = m["MsgType"].ToString();

                //                    WXMsg msg = new WXMsg();
                //                    msg.From = from;
                //                    msg.Msg = type == "1" ? content : "请在其他设备上查看消息";  //只接受文本消息
                //                    msg.Readed = false;
                //                    msg.Time = DateTime.Now;
                //                    msg.To = to;
                //                    msg.Type = int.Parse(type);

                //                    if (msg.Type == 51)  //屏蔽一些系统数据
                //                    {
                //                        continue;
                //                    }
                //                    this.BeginInvoke((Action)delegate()
                //                    {
                //                        WXUser user; bool exist_latest_contact = false;
                //                        foreach (Object u in wChatList1.Items)
                //                        {
                //                            user = u as WXUser;
                //                            if (user != null)
                //                            {
                //                                if (user.UserName == msg.From && msg.To == _me.UserName)  //接收别人消息
                //                                {
                //                                    wChatList1.Items.Remove(user);
                //                                    wChatList1.Items.Insert(0, user);
                //                                    exist_latest_contact = true;
                //                                    user.ReceiveMsg(msg);
                //                                    break;
                //                                }
                //                                else if (user.UserName == msg.To && msg.From == _me.UserName)  //同步自己在其他设备上发送的消息
                //                                {
                //                                    wChatList1.Items.Remove(user);
                //                                    wChatList1.Items.Insert(0, user);
                //                                    exist_latest_contact = true;
                //                                    user.SendMsg(msg,true);
                //                                    break;
                //                                }
                //                            }
                //                        }
                //                        if (!exist_latest_contact)
                //                        {
                //                            foreach (object o in wFriendsList1.Items)
                //                            {
                //                                WXUser friend = o as WXUser;
                //                                if (friend != null && friend.UserName == msg.From && msg.To == _me.UserName)
                //                                {
                //                                    wChatList1.Items.Insert(0, friend);
                //                                    friend.ReceiveMsg(msg);
                //                                    break;
                //                                }
                //                                if (friend != null && friend.UserName == msg.To && msg.From == _me.UserName)
                //                                {
                //                                    wChatList1.Items.Insert(0, friend);
                //                                    friend.SendMsg(msg,true);
                //                                    break;
                //                                }
                //                            }
                //                        }
                //                        wChatList1.Invalidate();
                //                    });
                //                }
                //            }
                //        }
                //    }
                //    System.Threading.Thread.Sleep(10);
                //}
                #endregion
            })).BeginInvoke(null, null);
        }