Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        //--------------------------------------------------------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);
            });
        }
Esempio n. 3
0
        //--------------------------------------------------------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();
            });
        }
Esempio n. 4
0
 //--------------------------------------------------------Constructor:----------------------------------------------------------------\\
 #region --Constructors--
 /// <summary>
 /// Basic Constructor
 /// </summary>
 /// <history>
 /// 06/02/2018 Created [Fabian Sauter]
 /// </history>
 public NewMUCMemberPresenceMessageEventArgs(MUCMemberPresenceMessage mucMemberPresenceMessage)
 {
     this.mucMemberPresenceMessage = mucMemberPresenceMessage;
 }