private void InsertSingleChatMessage(Messageobject msg) { App.Current.Dispatcher.Invoke(() => { ChatMessageList.Insert(0, msg.MessageObjectToBubbleItem()); }); }
/// <summary> /// 收到消息 /// </summary> /// <param name="msg">Message</param> public void ProcessNewMessage(Messageobject msg) { //处理撤回消息 switch (msg.type) { case kWCMessageType.RoomMemberNameChange: UpdateGroupMemberRemark(new MessageListItem { Jid = msg.fromUserId, ShowTitle = msg.content, Avator = Applicate.LocalConfigData.GetDisplayAvatorPath(msg.fromUserId) }); break; case kWCMessageType.Withdraw: var withdraw = ChatMessageList.FirstOrDefault(m => m.messageId == msg.content); if (withdraw != null) { ChatMessageList.Remove(withdraw); //移除对应消息 } break; case kWCMessageType.PokeMessage: //戳一戳 break; case kWCMessageType.RoomFileDelete: //文件删除 break; default: break; } }
/// <summary> /// 转<see cref="Messageobject"/>为 <see cref="ChatBubbleItemModel"/> /// </summary> /// <param name="msg">源</param> /// <returns>转换后</returns> public static ChatBubbleItemModel MessageObjectToBubbleItem(this Messageobject msg) { return(new ChatBubbleItemModel { type = msg.type, timeSend = msg.timeSend, messageId = msg.messageId, timeReceive = msg.timeReceive, fromUserId = msg.fromUserId, fromUserName = msg.fromUserName, toUserId = msg.toUserId, toUserName = msg.toUserName, content = msg.content, filePath = msg.filePath, fileName = msg.fileName, location_y = msg.location_y, location_x = msg.location_x, sendRead = msg.sendRead, isUpload = msg.isUpload, isDownload = msg.isDownload, messageState = msg.messageState, timeLen = msg.timeLen, fileSize = msg.fileSize, objectId = msg.objectId, sipStatus = msg.sipStatus, sipDuration = msg.sipDuration, isReadDel = msg.isReadDel, isEncrypt = msg.isEncrypt, reSendCount = msg.reSendCount, readPersons = msg.readPersons, readTime = msg.readTime, FromId = msg.FromId, ToId = msg.ToId, }); }
public void Initial(Messageobject msg = null) { if (msg == null) { return; } this.message = msg; membersList = new ObservableCollection <DataofMember>(); Friend = new DataOfUserDetial() { userId = msg.fromUserId, nickname = msg.fromUserName }; var roomVerify = JsonConvert.DeserializeObject <RoomVerify>(msg.objectId); room = new Room() { jid = roomVerify.roomJid }.GetByJid(); string[] userIds = roomVerify.userIds.Split(','); string[] nicknames = roomVerify.userNames.Split(','); if (roomVerify.isInvite == "0")//邀请进群 { InviteText = String.Format("{0} 邀请 {1} 位朋友加入群聊", msg.fromUserName, userIds.Length); } else { InviteText = String.Format("{0} 申请加入群聊", msg.fromUserName); } Reason = roomVerify.reason; if (userIds.Length > 0) { for (int i = 0; i < userIds.Length; i++) { string nk = ""; if (i < nicknames.Length) { nk = nicknames[i]; } membersList.Add(new DataofMember() { userId = userIds[i], nickname = nk }); } } if (msg.isDownload) { //已确认 BtnIsEnable = false; BtnContent = "已确认"; } else { BtnIsEnable = true; BtnContent = "确认邀请"; } }
/// <summary> /// 滚动时事件 /// </summary> /// <param name="eve">滚动相关数据</param> private void ChatListScrollChanged(ScrollChangedEventArgs eve) { ShowOrHideFAB(eve); if (eve.VerticalChange < 0)//滚动长度小于0 (往上滚动) { //Messenger.Default.Send(false, ChatBubbleListControl.ScrollChatBubbleMessageToBottom);//自动滚动 if (ChatMessageList.Count > 1)//如果显示消息不少于十条时显示 { var lastMsgOffset = 0.0; for (int i = 0; i < ChatMessageList.Count; i++) { lastMsgOffset += ChatMessageList[i].BubbleHeight; } lastMsgOffset = lastMsgOffset * 0.1; if (eve.VerticalOffset <= lastMsgOffset)//当只剩10%的长度时 { Task.Run(() => { Messageobject tmpMsg = new Messageobject() { FromId = Applicate.MyAccount.userId, ToId = ChatMessageList[0].jid }; List <Messageobject> msgList = tmpMsg.GetPageList(ChatMessageList.Count); //获取第二页消息 if (msgList.Count > 0) //如果查出消息才显示 { App.Current.Dispatcher.Invoke(() => { InsertChatMessage(msgList); Task.Run(() => { App.Current.Dispatcher.Invoke(() => { var scroll = eve.Source as ScrollViewer; //Get ScrollViewer var previousOffset = lastMsgOffset; //Get old messages' height for (int i = 0; i < msgList.Count; i++) //Plus new messages' height { previousOffset += ChatMessageList[i].BubbleHeight; } scroll.ScrollToVerticalOffset(previousOffset);//Do scroll }); }); });//插入和显示消息 } else//未查出消息 { GetMoreMessage();//从服务器获取消息 } }); } } } else//往下滚动 { //Messenger.Default.Send(true, ChatBubbleListControl.ScrollChatBubbleMessageToBottom);//自动滚动 } }
/// <summary> /// 删除消息 /// </summary> /// <param name="msg">需要删除的消息</param> private void RemoveMessage(Messageobject msg) { var msgItem = ChatMessageList.FirstOrDefault(m => m.messageId == msg.messageId);//获取 if (msgItem != null) { ChatMessageList.Remove(msgItem);//删除 } }
public void MsgReceipt(Messageobject msg) { var existsItem = ChatMessageList.FirstOrDefault(m => m.messageId == msg.messageId);//获取对应消息 if (existsItem != null) { existsItem.messageState = 1; //设为送达 existsItem.StateIcon = PackIconKind.Check; //设为送达 existsItem.MsgStateText = "送达"; existsItem.ReadToolTip = "送达"; } }
/// <summary> /// 显示单个消息气泡 /// </summary> /// <param name="message"></param> public void AddSingleChatMessage(Messageobject message) { if (ServiceLocator.Current.GetInstance <MainViewModel>().Sess.Jid == message.jid) { //Add the single to ChatMessageList ChatMessageList.Add(message.MessageObjectToBubbleItem()); Messenger.Default.Send(true, ChatBubbleListControl.ScrollChatBubbleMessageToBottom);//自动滚动 SendReadMsgAsync(new List <Messageobject> { message }); //发送已读 } }
public void SendTimeout(Messageobject msg) { var target = ChatMessageList.FirstOrDefault(m => m.messageId == msg.messageId); if (target != null) { target.messageState = -1; //target.StateIcon = PackIconKind.AlertCircle; target.UpdateMessageState(); //target = target; } }
public ChatRecord(string jid) { msgManager = new Messageobject() { fromUserId = Applicate.MyAccount.userId, toUserId = jid }; this.thisJid = jid; InitializeComponent(); var histmodel = new ChatHistoryViewModel(); histmodel.InitialHistory(jid);//初始化 this.DataContext = histmodel; }
/// <summary> /// 撤回消息 /// </summary> /// <param name="msg">需要撤回的消息</param> private void WithDrawMessage(Messageobject msg) { if (ChatMessageList.Count(c => c.messageId == msg.messageId) > 0) { var cmsg = ChatMessageList.FirstOrDefault(c => c.messageId == msg.messageId); cmsg.content = msg.content; //内容 cmsg.type = msg.type; //更新为撤回消息 #region 移除并添加 int index = ChatMessageList.IndexOf(cmsg); ChatMessageList.Remove(cmsg); ChatMessageList.Insert(index, cmsg); #endregion } }
private void Button_Click(object sender, RoutedEventArgs e) { message = new Messageobject() { messageId = message.messageId, fromUserId = message.fromUserId, FromId = message.FromId, toUserId = message.toUserId, ToId = message.ToId, }.GetModel(); if (message != null) { new RoomVerifyForm(message).ShowDialog(); } }
/// <summary> /// 处理新消息 /// </summary> /// <param name="msg">新消息</param> private void ProcessNewMsg(Messageobject msg) { switch (msg.type) { case kWCMessageType.RoomFileDelete: DeleteFileItem(msg.content); //删除文件 break; case kWCMessageType.RoomFileDownload: break; default: break; } }
/// <summary> /// 处理消息回执 /// </summary> /// <param name="msg">收到回执的消息</param> private void ProcessMsgReceipt(Messageobject msg) { switch (msg.type) { case kWCMessageType.RoomFileDelete: //DeleteFileItem(msg.fileName);//删除文件 break; case kWCMessageType.RoomFileDownload: break; default: break; } }
/// <summary> /// 清空聊天记录 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void EmptyRecords_Click(object sender, RoutedEventArgs e) { Messageobject msgService = new Messageobject(); int i = msgService.ClearAllMessage(); var mControl = ServiceLocator.Current.GetInstance <MainViewModel>(); if (mControl != null) { //mControl.SP_chatBottom.Children.Clear();//清理消息 mControl.RecentMessageList.ToList().ForEach(d => { d.UnReadCount = 0; d.MessageItemContent = ""; }); mControl.SetTotalUnReadCount(); mControl.UpdateMessageList(); } Snackbar.Enqueue("已清空"); ConsoleLog.Output("删除" + i.ToString()); }
/// <summary> /// 显示默认聊天信息(15条) /// </summary> public Messageobject ShowDefaultMessage() { var main = ServiceLocator.Current.GetInstance <MainViewModel>(); ChatMessageList.Clear(); var tmpMsg = new Messageobject() { FromId = Applicate.MyAccount.userId, ToId = main.Sess.Jid }; List <Messageobject> msgList = tmpMsg.GetPageList(0); ShowChatMessage(msgList); //显示消息气泡 SendReadMsgAsync(msgList); //发送已读 return(msgList.LastOrDefault()); }
public void InitialHistory(string jid) { msgManager = new Messageobject() { fromUserId = Applicate.MyAccount.userId, FromId = Applicate.MyAccount.userId, toUserId = jid, ToId = jid, }; this.thisJid = jid; keyWords = ""; msgList = new ObservableCollection <Messageobject>(); if (IsInDesignMode) { return; } showChatRecord(); }
public RoomVerifyForm(Messageobject msg) { InitializeComponent(); var rverifymodel = new RoomVerifyViewModel(); rverifymodel.Initial(msg); this.DataContext = rverifymodel; App.Current.Dispatcher.Invoke(() => { //UserId = userId; #region 添加右上角按钮 FormOperation operation = new FormOperation(this, false); Grid.SetColumnSpan(operation, 3);// operation.VerticalAlignment = VerticalAlignment.Top; operation.HorizontalAlignment = HorizontalAlignment.Right; //添加到窗口中 this.gd_main.Children.Add(operation); #endregion }); }
/// <summary> /// 显示默认消息 /// </summary> /// <param name="jid"></param> /// <returns></returns> public void ShowDefaultMessage(string jid) { App.Current.Dispatcher.Invoke(() => { ChatMessageList.Clear();// }); var tmpMsg = new Messageobject() { FromId = Applicate.MyAccount.userId, ToId = jid }; List <Messageobject> msgList = tmpMsg.GetPageList(0); ShowChatMessage(msgList); //显示消息气泡 SendReadMsgAsync(msgList); //发送已读 if (msgList.Count < 15) //如果消息数量不足15条则拉取100条存入数据库并显示15条 { GetMoreMessage(); } }
public JXRoomVerify(bool isgroup, Messageobject msg) { InitializeComponent(); this.message = msg; this.DataContext = this;//指定绑定的对象 if (msg.type == kWCMessageType.RoomIsVerify) { var mControl = ServiceLocator.Current.GetInstance <MainViewModel>(); Regex reg = new Regex("^[A-F0-9]{8}([A-F0-9]{4}){3}[A-F0-9]{12}$", RegexOptions.IgnoreCase); if (reg.IsMatch(msg.objectId)) { return; } var roomVerify = JsonConvert.DeserializeObject <RoomVerify>(msg.objectId); if (roomVerify.isInvite == "0")//邀请进群 { tb_prompt.Text = string.Format("{0} 邀请 {1} 位朋友加入群聊({2})", msg.fromUserName, roomVerify.userIds.Split(',').Length, Helpers.StampToDatetime(msg.timeSend).ToString("MM-dd HH:mm:ss")); } else { tb_prompt.Text = string.Format("{0} 申请加入群聊({1})", msg.fromUserName, Helpers.StampToDatetime(msg.timeSend).ToString("MM-dd HH:mm:ss")); } } }
/// <summary> /// 消息回执 /// </summary> /// <param name="msg"></param> public void MsgReceipt(Messageobject msg) { if (msg.type >= kWCMessageType.FriendRequest && msg.type <= kWCMessageType.CancelBlackFriend) { InVerifingWaiting = false; var mControl = ServiceLocator.Current.GetInstance <MainViewModel>(); var verifyItem = VerifyUserList.FirstOrDefault(v => v.toUserId == msg.toUserId); if (verifyItem == null) { verifyItem = new VerifingFriend() { toNickname = msg.toUserName, toUserId = msg.ToId }; } switch (msg.type) { case kWCMessageType.FriendRequest: //打招呼回执 verifyItem.VerifyStatus = -3; verifyItem.Content = "等待验证中..."; break; case kWCMessageType.RequestAgree: //通过验证回执 verifyItem.VerifyStatus = 1; verifyItem.Content = "我已通过对" + msg.toUserName /*((verifyItem.sex == 0) ? ("他") : ("她")) */ + "的验证"; var tmp = mControl.FriendList.FirstOrDefault(m => m.Jid == msg.toUserId); //mControl.MsgItemMouseDown(tmp); mControl.StartNewChatFromItem(tmp.Clone()); mControl.Snackbar.Enqueue(verifyItem.Content); // //ServiceLocator.Current.GetInstance<MainViewModel>().LoadAllFriendsByApi(); break; case kWCMessageType.RequestRefuse: //回话回执 InProgress = false; //不处于发送状态 DialogShow = false; //关闭对话框 AnswerContnt = ""; //清空文本 SnackBar.Enqueue("回话给" + msg.toUserName + "成功"); break; case kWCMessageType.DeleteFriend: verifyItem.Content = "已删除好友 " + msg.toUserName; verifyItem.toNickname = msg.toUserName; //此处为接收者Name verifyItem.VerifyStatus = -1; break; case kWCMessageType.BlackFriend: verifyItem.Content = "已将好友 " + msg.toUserName + " 拉黑"; verifyItem.toNickname = msg.toUserName; //此处为接收者Name break; case kWCMessageType.RequestFriendDirectly: //直接添加好友 verifyItem.VerifyStatus = 1; verifyItem.Content = "已添加好友" + msg.toUserName /*((verifyItem.sex == 0) ? ("他") : ("她"))*/; if (new DataOfFriends().ExistsLocal(msg.ToId)) //本地数据库有用户 { var dbFri = new DataOfFriends().GetByUserId(msg.ToId); dbFri.UpdateFriendState(msg.ToId, 2); //互为好友 } else { } Messenger.Default.Send(verifyItem.Content, MainViewNotifactions.SnacbarMessage); //提示 break; case kWCMessageType.CancelBlackFriend: var tuser = new DataOfFriends().GetByUserId(msg.toUserId); verifyItem.Content = "已将 " + tuser.toNickname + " 移出黑名单"; verifyItem.VerifyStatus = 1; //互为好友 break; default: break; } //更新最近用户中的内容 Messenger.Default.Send(new MessageListItem { Jid = "10001", MessageItemContent = verifyItem.Content, Avator = Applicate.LocalConfigData.GetDisplayAvatorPath("10001") }, MainViewNotifactions.UpdateRecentItemContent); AddOrUpdateToList(verifyItem); //更新UI verifyItem.InsertOrUpdate(); //存入数据库 verifyItem.Update(); //更新至数据库 } }
/// <summary> /// 收到消息时 /// </summary> /// <param name="msg">收到的新消息</param> public void ProcessNewMessage(Messageobject msg) { if (msg.type >= kWCMessageType.FriendRequest && msg.type <= kWCMessageType.PhoneContactToFriend) { var vItem = new VerifingFriend(); var mControl = ServiceLocator.Current.GetInstance <MainViewModel>(); if (VerifyUserList.FirstOrDefault(v => v.toUserId == msg.fromUserId) != null) { vItem = VerifyUserList.FirstOrDefault(v => v.toUserId == msg.fromUserId); } switch (msg.type) { case kWCMessageType.FriendRequest: vItem.VerifyStatus = -4; //对方添加己方 vItem.StatusTag = "通过验证"; vItem.Content = msg.content; //消息内容 break; case kWCMessageType.RequestAgree: vItem.VerifyStatus = 1; vItem.StatusTag = "已通过验证"; vItem.Content = "验证被" + msg.fromUserName /*((vItem.sex == 0) ? ("他") : ("她"))*/ + "通过了"; //mControl.AddToFriendList(msg.FromId);//添加到好友列表 var tmp = new MessageListItem() { Jid = msg.FromId, ShowTitle = msg.fromUserName, MessageTitle = msg.fromUserName, MessageItemType = ItemType.Message, Avator = Applicate.LocalConfigData.GetDisplayAvatorPath(msg.FromId) }; mControl.MsgItemMouseDown(tmp); mControl.StartNewChatFromItem(tmp.Clone()); break; case kWCMessageType.RequestRefuse: //对方回话 //item.StatusTag = ""; vItem.CanAnswer = true; vItem.Content = msg.content; //回话内容 DialogShow = false; AnswerContnt = ""; //清空文本 break; case kWCMessageType.DeleteFriend: //System.Windows.Forms.MessageBox.Show("删除成功"); vItem.Content = msg.fromUserName + " 已删除了我"; vItem.VerifyStatus = 0; break; case kWCMessageType.BlackFriend: vItem.VerifyStatus = 0; vItem.Content = msg.fromUserName + " 拉黑了我"; break; case kWCMessageType.RequestFriendDirectly: vItem.VerifyStatus = 1; //互为好友 vItem.Content = msg.fromUserName + " 添加你为好友"; //消息内容 break; case kWCMessageType.CancelBlackFriend: vItem.Content = msg.fromUserName + " 取消了黑名单"; Messenger.Default.Send(vItem.toUserId, MainViewNotifactions.CancelBlockItem); var tmpFriend = new DataOfFriends(); break; default: break; } //更新最近用户中的内容 Messenger.Default.Send(new MessageListItem { Jid = "10001", MessageItemContent = vItem.Content, Avator = Applicate.LocalConfigData.GetDisplayAvatorPath("10001") }, MainViewNotifactions.UpdateRecentItemContent); vItem.toUserId = msg.fromUserId; //UserId vItem.toNickname = msg.fromUserName; //昵称 vItem.Type = Convert.ToInt32(msg.type); //消息类型 vItem.InsertOrUpdate(); //存入数据库 AddOrUpdateToList(vItem); } }
/// <summary> /// 查看消息完成 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void GetMessagesComplete(object sender, UploadDataCompletedEventArgs e) { try { var resStr = Encoding.UTF8.GetString(e.Result);//使用 var afterHtmlTxt = Helpers.ClearHTML(resStr); var jsonRtn = JsonConvert.DeserializeObject <JsonParentMessage>(afterHtmlTxt); List <Messageobject> msgList = new List <Messageobject>(); #region 获取返回消息 foreach (var body in jsonRtn.data) { //body.Body = System.Web.HttpUtility.HtmlDecode(body.Body);//解码 Messageobject reciveJsonMsg = JsonConvert.DeserializeObject <Messageobject>(body.Body); if (reciveJsonMsg.isEncrypt == 1) { //string kyes = (Applicate.ApiKey + JsonMsg.timeSend + JsonMsg.messageId).MD5create(); reciveJsonMsg.content = AES.TDecrypt3Des(reciveJsonMsg.content, null);//解密 } //reciveJsonMsg.jid = roomId; #region 拼接完整消息 if (!string.IsNullOrWhiteSpace(body.room_jid_id)) //群聊 { reciveJsonMsg.ToId = body.room_jid_id; //群聊Jid reciveJsonMsg.FromId = body.sender; //发送者 } else//单聊 { if (string.IsNullOrWhiteSpace(reciveJsonMsg.ToId)) { reciveJsonMsg.ToId = body.direction == 1 ? body.sender : body.receiver;//设置接收者 } if (string.IsNullOrWhiteSpace(reciveJsonMsg.FromId)) { reciveJsonMsg.FromId = body.direction == 1 ? body.sender : body.receiver;//设置发送者 } } reciveJsonMsg.messageState = body.isRead == 1 ? 2 : 1;//设置已读或送达 #endregion reciveJsonMsg.isRead = body.isRead; msgList.Add(reciveJsonMsg); } #endregion Task.Run(() => { for (int i = 0; i < msgList.Count; i++)//插入数据库 { msgList[i].Insert(); } }); if (msgList.Count < 100)//如果返回数量小于100则为无更多消息 { //如果滚动页面中没有消息,或 滚动页面中最顶部一条消息位为 普通消息 if (ChatMessageList.Count == 0 || (ChatMessageList[0].type != kWCMessageType.LocalTypeNotice && !ChatMessageList[0].content.Contains("无更多聊天记录"))) { var tipmsg = new Messageobject() { content = "已无更多聊天记录", type = kWCMessageType.LocalTypeNotice, FromId = Applicate.MyAccount.userId, ToId = ServiceLocator.Current.GetInstance <MainViewModel>().Sess.Jid, timeSend = 126227520//设置发送时间为最早 }; Task.Run(() => { tipmsg.Insert(); }); InsertSingleChatMessage(tipmsg);//显示至页面 } } App.Current.Dispatcher.Invoke(() => { int historyCount = 15; if (msgList.Count < 15)//计算最大显示15条消息 { historyCount = msgList.Count; } #region 只显示15条消息 var tmplst = new List <Messageobject>(); for (int i = historyCount - 1; i >= 0; i--)//获取 { tmplst.Add(msgList[i]); } if (ChatMessageList[0].type == kWCMessageType.LocalTypeNotice && ChatMessageList[0].content == "已无更多聊天记录") { InsertChatMessage(tmplst, 1);//插入顶部的消息 } else { InsertChatMessage(tmplst);//插入顶部的消息 } #endregion Task.Run(() => { App.Current.Dispatcher.Invoke(() => { try { var previousOffset = 0.0; //Get old messages' height for (int i = 0; i < 5; i++) //获取5条消息记录的高度 { previousOffset += ChatMessageList[i].BubbleHeight; } for (int i = 0; i < tmplst.Count; i++)//Plus new messages' height { previousOffset += ChatMessageList[i].BubbleHeight; } Messenger.Default.Send(previousOffset, ChatBubbleListControl.ScrollChatMessageListVerticalOffset);//通知界面滚动至原始位置 } catch (Exception ex) { Console.WriteLine(ex); } }); }); }); } catch (Exception ex) { Console.WriteLine("GetMessagesCompleteError" + ex.Message); LogHelper.log.Error("-_-_-_MessagesCompleteError" + ex.Message, ex); } finally { App.Current.Dispatcher.Invoke(() => { IsLoading = false; }); ((HttpClient)sender).Dispose(); //完成后释放资源 HttpService = null; //初始化Http访问 } }