//--------------------------------------------------------Events:---------------------------------------------------------------------\\ #region --Events-- private void CLIENT_NewMUCMemberPresenceMessage(XMPPClient client, XMPP_API.Classes.Network.Events.NewMUCMemberPresenceMessageEventArgs args) { string roomJId = Utils.getBareJidFromFullJid(args.mucMemberPresenceMessage.getFrom()); if (!Equals(roomJId, MUC.chatJabberId)) { return; } switch (INFO.state) { case MUCState.ENTERING: // Evaluate status codes: foreach (MUCPresenceStatusCode statusCode in args.mucMemberPresenceMessage.STATUS_CODES) { switch (statusCode) { case MUCPresenceStatusCode.PRESENCE_SELFE_REFERENCE: // Remove event subscription: CLIENT.NewMUCMemberPresenceMessage -= CLIENT_NewMUCMemberPresenceMessage; // Update MUC info: INFO.state = MUCState.ENTERD; saveMUCEnterState(); Logger.Info("Entered MUC room '" + roomJId + "' as '" + INFO.nickname + '\''); break; default: break; } } break; } }
//--------------------------------------------------------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); }); }