private bool onChangeNickMessage(PresenceMessage msg) { if (msg is MUCMemberPresenceMessage) { // Success: MUCMemberPresenceMessage mPMessage = msg as MUCMemberPresenceMessage; if (mPMessage.STATUS_CODES.Contains(MUCPresenceStatusCode.PRESENCE_SELFE_REFERENCE) && (mPMessage.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_NICK_CHANGED) || mPMessage.STATUS_CODES.Contains(MUCPresenceStatusCode.ROOM_NICK_CHANGED))) { Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { MUCInfo.nickname = mPMessage.NICKNAME; MUCChatInfoTable info = MUCInfo; Task.Run(() => MUCDBManager.INSTANCE.setMUCChatInfo(info, false, false)); nickname_stbx.Text = mPMessage.NICKNAME; nickname_stbx.onSavingDone(); notificationBanner_ian.Show("Successfully changed nickname to: " + mPMessage.NICKNAME, 5000); }).AsTask(); return(true); } } // Error: else if (msg is MUCErrorMessage && Equals(msg.ID, changeNickHelper.sendId)) { MUCErrorMessage errorMessage = msg as MUCErrorMessage; Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { nickname_stbx.Text = MUCInfo.nickname; nickname_stbx.onSavingDone(); notificationBanner_ian.Show("Changing nickname failed:\nCode: " + errorMessage.ERROR_CODE + "\nType: " + errorMessage.ERROR_TYPE + "\nMessage:\n" + errorMessage.ERROR_MESSAGE); }).AsTask(); } return(false); }
//--------------------------------------------------------Events:---------------------------------------------------------------------\\ #region --Events-- private void C_NewMUCMemberPresenceMessage(XMPPClient client, XMPP_API.Classes.Network.Events.NewMUCMemberPresenceMessageEventArgs args) { Task.Run(() => { MUCMemberPresenceMessage msg = args.mucMemberPresenceMessage; string roomJid = Utils.getBareJidFromFullJid(msg.getFrom()); if (roomJid is null) { return; } string chatId = ChatTable.generateId(roomJid, client.getXMPPAccount().getBareJid()); MUCOccupantTable member = MUCDBManager.INSTANCE.getMUCOccupant(chatId, msg.FROM_NICKNAME); if (member is null) { member = new MUCOccupantTable { id = MUCOccupantTable.generateId(chatId, msg.FROM_NICKNAME), nickname = msg.FROM_NICKNAME, chatId = chatId }; } member.affiliation = msg.AFFILIATION; member.role = msg.ROLE; member.jid = msg.JID; bool isUnavailable = Equals(msg.TYPE, "unavailable"); if (isUnavailable) { if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.PRESENCE_SELFE_REFERENCE)) { // Nickname got changed by user or room: if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_NICK_CHANGED) || msg.STATUS_CODES.Contains(MUCPresenceStatusCode.ROOM_NICK_CHANGED)) { // Update MUC info: MUCDBManager.INSTANCE.setMUCInfoNickname(chatId, msg.NICKNAME, true); // Add new member: MUCDBManager.INSTANCE.setMUCOccupant(new MUCOccupantTable { id = MUCOccupantTable.generateId(chatId, msg.NICKNAME), nickname = msg.NICKNAME, chatId = member.chatId, affiliation = member.affiliation, role = member.role, jid = member.jid, }, false, true); } // Occupant got kicked: else if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_GOT_KICKED)) { // Update MUC state: MUCDBManager.INSTANCE.setMUCState(chatId, MUCState.KICKED, true); } else if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_GOT_BANED)) { // Update MUC state: MUCDBManager.INSTANCE.setMUCState(chatId, MUCState.BANED, true); } else { // Update MUC state: MUCDBManager.INSTANCE.setMUCState(chatId, MUCState.DISCONNECTED, true); } } if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_GOT_KICKED)) { // Add kicked chat message: addOccupantKickedMessage(chatId, roomJid, member.nickname); } if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_GOT_BANED)) { // Add baned chat message: addOccupantBanedMessage(chatId, roomJid, member.nickname); } } // If the type equals 'unavailable', a user left the room: MUCDBManager.INSTANCE.setMUCOccupant(member, isUnavailable, true); }); }
//--------------------------------------------------------Events:---------------------------------------------------------------------\\ #region --Events-- private void OnNewMucMemberPresenceMessage(XMPPClient client, NewMUCMemberPresenceMessageEventArgs args) { Task.Run(async() => { MUCMemberPresenceMessage msg = args.mucMemberPresenceMessage; string roomJid = Utils.getBareJidFromFullJid(msg.getFrom()); if (roomJid is null) { return; } SemaLock semaLock = DataCache.INSTANCE.NewChatSemaLock(); ChatModel chat = DataCache.INSTANCE.GetChat(client.getXMPPAccount().getBareJid(), roomJid, semaLock); semaLock.Dispose(); if (chat is null || chat.muc is null) { return; } // Prevent multiple accesses to the same occupant at the same time: await OCCUPANT_CREATION_SEMA.WaitAsync(); MucOccupantModel occupant = chat.muc.occupants.Where(o => string.Equals(o.nickname, msg.FROM_NICKNAME)).FirstOrDefault(); bool newOccupant = occupant is null; if (newOccupant) { occupant = new MucOccupantModel() { nickname = msg.FROM_NICKNAME }; } occupant.affiliation = msg.AFFILIATION; occupant.role = msg.ROLE; occupant.fullJid = msg.JID; bool isUnavailable = Equals(msg.TYPE, "unavailable"); bool nicknameChanged = false; if (isUnavailable) { if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.PRESENCE_SELFE_REFERENCE)) { // Nickname got changed by user or room: if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_NICK_CHANGED) || msg.STATUS_CODES.Contains(MUCPresenceStatusCode.ROOM_NICK_CHANGED)) { nicknameChanged = true; // Update MUC info: chat.muc.nickname = msg.NICKNAME; // Update the user nickname: occupant.nickname = msg.NICKNAME; } // Occupant got kicked: else if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_GOT_KICKED)) { chat.muc.state = MucState.KICKED; } else if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_GOT_BANED)) { chat.muc.state = MucState.BANED; } else { chat.muc.state = MucState.DISCONNECTED; } } if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_GOT_KICKED)) { // Add kicked chat message: AddOccupantKickedMessage(chat, roomJid, occupant.nickname); } if (msg.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_GOT_BANED)) { // Add baned chat message: AddOccupantBanedMessage(chat, roomJid, occupant.nickname); } } using (SemaLock mucSemaLock = chat.muc.NewSemaLock()) { using (SemaLock occupantSemaLock = occupant.NewSemaLock()) { // If the type equals 'unavailable', a user left the room: if (isUnavailable && !nicknameChanged) { if (!newOccupant) { using (MainDbContext ctx = new MainDbContext()) { chat.muc.occupants.Remove(occupant); chat.muc.OnOccupantsChanged(); ctx.Update(chat.muc); } using (MainDbContext ctx = new MainDbContext()) { ctx.Remove(occupant); } } } else { if (newOccupant) { occupant.Add(); chat.muc.occupants.Add(occupant); chat.muc.OnOccupantsChanged(); using (MainDbContext ctx = new MainDbContext()) { ctx.Update(chat.muc); } } else { using (MainDbContext ctx = new MainDbContext()) { ctx.Update(occupant); } } } } } OCCUPANT_CREATION_SEMA.Release(); }); }
//--------------------------------------------------------Constructor:----------------------------------------------------------------\\ #region --Constructors-- /// <summary> /// Basic Constructor /// </summary> /// <history> /// 06/02/2018 Created [Fabian Sauter] /// </history> public NewMUCMemberPresenceMessageEventArgs(MUCMemberPresenceMessage mucMemberPresenceMessage) { this.mucMemberPresenceMessage = mucMemberPresenceMessage; }