コード例 #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);
        }
コード例 #2
0
        private void updateNick()
        {
            nickname_stbx.onStartSaving();

            if (string.IsNullOrEmpty(nickname_stbx.Text))
            {
                notificationBanner_ian.Show("Invalid nickname!");
                nickname_stbx.onSavingDone();
                return;
            }

            notificationBanner_ian.Dismiss();

            if (isMUCEntered())
            {
                changeNickHelper = Client.MUC_COMMAND_HELPER.changeNickname(Chat.chatJabberId, nickname_stbx.Text, onChangeNickMessage, onChangeNickTimeout);
            }
            else
            {
                MUCInfo.nickname = nickname_stbx.Text;
                MUCChatInfoTable info = MUCInfo;
                Task.Run(() => MUCDBManager.INSTANCE.setMUCChatInfo(info, false, false));
                nickname_stbx.onSavingDone();
            }
        }
コード例 #3
0
        /// <summary>
        /// Updates the nickname in the local DB.
        /// Also updates bookmarks if any exist.
        /// </summary>
        /// <returns>Returns true on success.</returns>
        public async Task <bool> SaveAsync(ChatTable chat, MUCChatInfoTable mucInfo, XMPPClient client)
        {
            MODEL.IsSaving = true;
            bool success = await Task.Run(async() =>
            {
                mucInfo.nickname = MODEL.Nickname;

                // Try to update the nickname at the chat room:
                bool result = await UpdateNicknameAsync(chat, mucInfo, client);
                if (!result)
                {
                    return(false);
                }

                // Update the DB entry since the server could respond with a different nickname:
                MUCDBManager.INSTANCE.setMUCChatInfo(mucInfo, false, true);

                // Update bookmarks:
                return(chat.inRoster ? await UpdateBookmarksAsync(chat, client) : true);
            });

            MODEL.IsSaving = false;
            MODEL.Error    = !success;
            if (success)
            {
                Logger.Info("Updating nickname to \"" + MODEL.Nickname + "\" in chat \"" + MODEL.MucName + "\" was successful!");
            }
            else
            {
                Logger.Info("Updating nickname to \"" + MODEL.Nickname + "\" in chat \"" + MODEL.MucName + "\" failed!");
            }
            return(success);
        }
コード例 #4
0
 public bool UpdateMUCInfo(MUCChatInfoTable mucInfo)
 {
     lock (SyncRoot)
     {
         return(CHATS.UpdateMUCInfo(mucInfo));
     }
 }
コード例 #5
0
        private void enterAllMUCs(XMPPClient client)
        {
            Task.Run(async() =>
            {
                // Delay joining MUCs for a couple of seconds to prevent a message overload:
                if (!await delayAsync(client.getXMPPAccount().getBareJid()))
                {
                    // Delay has been canceled:
                    return;
                }

                foreach (ChatTable muc in ChatDBManager.INSTANCE.getAllMUCs(client.getXMPPAccount().getBareJid()))
                {
                    MUCChatInfoTable info = MUCDBManager.INSTANCE.getMUCInfo(muc.id);
                    if (info is null)
                    {
                        info = new MUCChatInfoTable()
                        {
                            chatId        = muc.id,
                            state         = MUCState.DISCONNECTED,
                            nickname      = muc.userAccountId,
                            autoEnterRoom = true
                        };
                        MUCDBManager.INSTANCE.setMUCChatInfo(info, false, true);
                    }
                    if (info.autoEnterRoom)
                    {
                        await enterMUCAsync(client, muc, info);
                    }
                }
            });
        }
コード例 #6
0
 private void enterAllMUCs(XMPPClient client)
 {
     Task.Run(async() =>
     {
         foreach (ChatTable muc in ChatDBManager.INSTANCE.getAllMUCs(client.getXMPPAccount().getBareJid()))
         {
             MUCChatInfoTable info = MUCDBManager.INSTANCE.getMUCInfo(muc.id);
             if (info is null)
             {
                 info = new MUCChatInfoTable()
                 {
                     chatId        = muc.id,
                     state         = MUCState.DISCONNECTED,
                     nickname      = muc.userAccountId,
                     autoEnterRoom = true
                 };
                 MUCDBManager.INSTANCE.setMUCChatInfo(info, false, true);
             }
             if (info.autoEnterRoom)
             {
                 await enterMUCAsync(client, muc, info);
             }
         }
     });
 }
コード例 #7
0
        private async Task <bool> UpdateNicknameAsync(ChatTable chat, MUCChatInfoTable mucInfo, XMPPClient client)
        {
            MessageResponseHelperResult <MUCMemberPresenceMessage> result = await client.MUC_COMMAND_HELPER.changeNicknameAsync(chat.chatJabberId, mucInfo.nickname);

            if (!string.IsNullOrEmpty(result.RESULT.ERROR_TYPE))
            {
                Logger.Warn("Failed to change nickname for room \"" + chat.chatJabberId + "\" to \"" + mucInfo.nickname + "\" with: " + result.RESULT.ERROR_MESSAGE);
                return(false);
            }
            // Nickname has been updated successfully:
            else if (result.RESULT.STATUS_CODES.Contains(MUCPresenceStatusCode.MEMBER_NICK_CHANGED))
            {
                return(true);
            }
            // The room has change the nickname:
            else if (result.RESULT.STATUS_CODES.Contains(MUCPresenceStatusCode.ROOM_NICK_CHANGED))
            {
                if (!Utils.isFullJid(result.RESULT.JID))
                {
                    Logger.Error("Expected a full JID as a MUC nickname changed message with status code 210, but received: " + result.RESULT.JID);
                    return(false);
                }
                mucInfo.nickname = Utils.getJidResourcePart(result.RESULT.JID);
                return(true);
            }
            // Should not happen:
            Logger.Error("Unknown MUC member presence status code combination received. This should not happen!");
            return(false);
        }
コード例 #8
0
        private void C_NewBookmarksResultMessage(XMPPClient client, NewBookmarksResultMessageEventArgs args)
        {
            foreach (ConferenceItem c in args.BOOKMARKS_MESSAGE.STORAGE.CONFERENCES)
            {
                bool   newMUC = false;
                string to     = client.getXMPPAccount().getIdAndDomain();
                string from   = c.jid;
                string id     = ChatTable.generateId(from, to);

                // Create / update chat:
                ChatTable chat = ChatDBManager.INSTANCE.getChat(id);
                if (chat == null)
                {
                    chat = new ChatTable()
                    {
                        id            = id,
                        chatJabberId  = from,
                        userAccountId = to,
                        ask           = null,
                        lastActive    = DateTime.Now,
                        muted         = false,
                        status        = null,
                        subscription  = null
                    };
                    newMUC = true;
                }
                chat.chatType = ChatType.MUC;
                chat.inRoster = true;
                chat.presence = Presence.Unavailable;

                ChatDBManager.INSTANCE.setChat(chat, false, true);

                // Create / update MUC info:
                MUCChatInfoTable info = MUCDBManager.INSTANCE.getMUCInfo(chat.id);
                if (info == null)
                {
                    info = new MUCChatInfoTable
                    {
                        chatId  = chat.id,
                        subject = null
                    };
                    newMUC = true;
                }

                info.autoEnterRoom = c.autoJoin;
                info.name          = c.name;
                info.nickname      = c.nick;
                info.password      = c.password;

                MUCDBManager.INSTANCE.setMUCChatInfo(info, false, true);


                // Enter MUC manually if the MUC is new for this client:
                if (newMUC && info.autoEnterRoom && !Settings.getSettingBoolean(SettingsConsts.DISABLE_AUTO_JOIN_MUC))
                {
                    Task.Run(() => MUCHandler.INSTANCE.enterMUCAsync(client, chat, info));
                }
            }
        }
コード例 #9
0
        public async Task enterMUCAsync(XMPPClient client, ChatTable muc, MUCChatInfoTable info)
        {
            MUCJoinHelper helper = new MUCJoinHelper(client, muc, info);

            TIMED_LIST.addTimed(helper);

            await helper.enterRoomAsync();
        }
コード例 #10
0
 //--------------------------------------------------------Constructor:----------------------------------------------------------------\\
 #region --Constructors--
 public ChangeNicknameDialog(ChatTable chat, MUCChatInfoTable mucInfo, XMPPClient client)
 {
     CHAT     = chat;
     MUC_INFO = mucInfo;
     CLIENT   = client;
     VIEW_MODEL.UpdateView(chat, mucInfo);
     InitializeComponent();
 }
コード例 #11
0
 public ChatTemplate(XMPPClient client, ChatTable chat, MUCChatInfoTable mucInfo, BitmapImage image)
 {
     this._client  = client;
     this._chat    = chat;
     this._mucInfo = mucInfo;
     this._image   = image;
     this.index    = -1;
 }
コード例 #12
0
        public async Task leaveRoomAsync(XMPPClient client, ChatTable muc, MUCChatInfoTable info)
        {
            stopMUCJoinHelper(muc);

            MUCDBManager.INSTANCE.setMUCState(info.chatId, MUCState.DISCONNECTING, true);
            await sendMUCLeaveMessageAsync(client, muc, info);

            MUCDBManager.INSTANCE.setMUCState(info.chatId, MUCState.DISCONNECTED, true);
        }
コード例 #13
0
        private void onMUCInfoChanged(string chatId)
        {
            MUCChatInfoTable info = getMUCInfo(chatId);

            if (info != null)
            {
                MUCInfoChanged?.Invoke(this, new MUCInfoChangedEventArgs(info, false));
            }
        }
コード例 #14
0
 private async void INSTANCE_MUCInfoChanged(MUCDBManager handler, MUCInfoChangedEventArgs args)
 {
     await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
     {
         if (Chat != null && Chat.id.Equals(args.MUC_INFO.chatId))
         {
             MUCInfo = args.MUC_INFO;
         }
     });
 }
コード例 #15
0
        private void savePassword()
        {
            password_spwbx.onStartSaving();
            notificationBanner_ian.Dismiss();
            MUCInfo.password = password_spwbx.Password;
            MUCChatInfoTable info = MUCInfo;

            Task.Run(() => MUCDBManager.INSTANCE.setMUCChatInfo(info, false, true));
            password_spwbx.onSavingDone();
            notificationBanner_ian.Show("Successfully saved password!", 5000);
        }
コード例 #16
0
        /// <summary>
        /// Tries to add the room.
        /// </summary>
        /// <returns>Returns true if the account got added.</returns>
        private bool addRoom()
        {
            if (checkUserInputAndWarn())
            {
                XMPPClient client = accountSelection_asc.getSelectedAccount();

                string roomJid = roomName_tbx.Text + '@' + server_asbx.Text.ToLower();

                ChatTable muc = new ChatTable()
                {
                    id            = ChatTable.generateId(roomJid, client.getXMPPAccount().getIdAndDomain()),
                    ask           = null,
                    chatJabberId  = roomJid,
                    userAccountId = client.getXMPPAccount().getIdAndDomain(),
                    chatType      = ChatType.MUC,
                    inRoster      = (bool)bookmark_cbx.IsChecked,
                    muted         = false,
                    lastActive    = DateTime.Now,
                    subscription  = "none"
                };
                ChatDBManager.INSTANCE.setChat(muc, false, true);

                MUCChatInfoTable info = new MUCChatInfoTable()
                {
                    chatId        = muc.id,
                    subject       = null,
                    state         = MUCState.DISCONNECTED,
                    name          = null,
                    password      = null,
                    nickname      = nick_tbx.Text,
                    autoEnterRoom = (bool)autoJoin_cbx.IsChecked
                };
                if ((bool)enablePassword_cbx.IsChecked)
                {
                    info.password = password_pwb.Password;
                }
                MUCDBManager.INSTANCE.setMUCChatInfo(info, false, true);

                if (info.autoEnterRoom)
                {
                    Task t = MUCHandler.INSTANCE.enterMUCAsync(client, muc, info);
                }

                if ((bool)bookmark_cbx.IsChecked)
                {
                    List <ConferenceItem> conferenceItems = MUCDBManager.INSTANCE.getXEP0048ConferenceItemsForAccount(client.getXMPPAccount().getIdAndDomain());
                    setBookmarkHelper = client.PUB_SUB_COMMAND_HELPER.setBookmars_xep_0048(conferenceItems, onMessage, onTimeout);
                }

                return(true);
            }
            return(false);
        }
コード例 #17
0
        private async Task onMUCErrorMessageAsync(XMPPClient client, MUCErrorMessage errorMessage)
        {
            string room = Utils.getBareJidFromFullJid(errorMessage.getFrom());

            if (room != null)
            {
                string    chatId = ChatTable.generateId(room, client.getXMPPAccount().getBareJid());
                ChatTable muc    = ChatDBManager.INSTANCE.getChat(chatId);
                if (muc != null)
                {
                    MUCChatInfoTable info = MUCDBManager.INSTANCE.getMUCInfo(chatId);
                    if (info != null)
                    {
                        Logger.Error("Received an error message for MUC: " + muc.chatJabberId + "\n" + errorMessage.ERROR_MESSAGE);

                        stopMUCJoinHelper(muc);

                        if (info.state != MUCState.DISCONNECTED)
                        {
                            await sendMUCLeaveMessageAsync(client, muc, info);
                        }

                        switch (errorMessage.ERROR_CODE)
                        {
                        // No access - user got baned:
                        case 403:
                            MUCDBManager.INSTANCE.setMUCState(info.chatId, MUCState.BANED, true);
                            addChatInfoMessage(info.chatId, room, "Unable to join room!\nYou are baned from this room.");
                            return;

                        default:
                            MUCDBManager.INSTANCE.setMUCState(info.chatId, MUCState.ERROR, true);
                            break;
                        }

                        // Add an error chat message:
                        ChatMessageTable msg = new ChatMessageTable()
                        {
                            id       = ChatMessageTable.generateErrorMessageId(errorMessage.ID ?? AbstractMessage.getRandomId(), muc.id),
                            chatId   = muc.id,
                            date     = DateTime.Now,
                            fromUser = errorMessage.getFrom(),
                            isImage  = false,
                            message  = "Code: " + errorMessage.ERROR_CODE + "\nType: " + errorMessage.ERROR_TYPE + "\nMessage:\n" + errorMessage.ERROR_MESSAGE,
                            state    = MessageState.UNREAD,
                            type     = MessageMessage.TYPE_ERROR
                        };
                        ChatDBManager.INSTANCE.setChatMessage(msg, true, false);
                    }
                }
            }
        }
コード例 #18
0
 private void UpdateView(MUCChatInfoTable mucInfo)
 {
     MODEL.MucSubject        = mucInfo.subject;
     MODEL.MucState          = mucInfo.state;
     MODEL.EnterMucAvailable = mucInfo.state != MUCState.ENTERD && mucInfo.state != MUCState.ENTERING;
     MODEL.AutoJoin          = mucInfo.autoEnterRoom;
     MODEL.Nickname          = mucInfo.nickname;
     if (!string.IsNullOrEmpty(mucInfo.name))
     {
         MODEL.MucName          = mucInfo.name;
         MODEL.DifferentMucName = !string.Equals(MODEL.ChatBareJid, MODEL.MucName);
     }
 }
コード例 #19
0
        private async Task AddMucAsync(XMPPClient client, string roomBareJid, string nickname, string password, bool bookmark, bool autoJoin)
        {
            ChatTable muc = new ChatTable(roomBareJid, client.getXMPPAccount().getBareJid())
            {
                chatType     = ChatType.MUC,
                inRoster     = bookmark,
                subscription = "none",
                isChatActive = true
            };

            MUCChatInfoTable info = new MUCChatInfoTable()
            {
                chatId        = muc.id,
                subject       = null,
                state         = MUCState.DISCONNECTED,
                name          = null,
                password      = string.IsNullOrEmpty(password) ? null : password,
                nickname      = nickname,
                autoEnterRoom = autoJoin,
            };

            await Task.Run(() =>
            {
                ChatDBManager.INSTANCE.setChat(muc, false, true);
                MUCDBManager.INSTANCE.setMUCChatInfo(info, false, true);
            });

            if (info.autoEnterRoom)
            {
                await MUCHandler.INSTANCE.enterMUCAsync(client, muc, info);
            }

            if (bookmark)
            {
                List <ConferenceItem> conferenceItems          = MUCDBManager.INSTANCE.getXEP0048ConferenceItemsForAccount(client.getXMPPAccount().getBareJid());
                MessageResponseHelperResult <IQMessage> result = await client.PUB_SUB_COMMAND_HELPER.setBookmars_xep_0048Async(conferenceItems);

                if (result.STATE == MessageResponseHelperResultState.SUCCESS)
                {
                    if (result.RESULT is IQErrorMessage errMsg)
                    {
                        Logger.Warn("Failed to set bookmarks: " + errMsg.ToString());
                    }
                }
                else
                {
                    Logger.Warn("Failed to set bookmarks: " + result.STATE);
                }
            }
        }
コード例 #20
0
        public async Task ToggleMucAutoJoinAsync(MUCChatInfoTable mucInfo)
        {
            if (mucInfo is null)
            {
                return;
            }

            await Task.Run(() =>
            {
                mucInfo.autoEnterRoom = !mucInfo.autoEnterRoom;
                UpdateView(mucInfo);
                MUCDBManager.INSTANCE.setMUCChatInfo(mucInfo, false, true);
            }).ConfAwaitFalse();
        }
コード例 #21
0
        public void UpdateViewMuc(ChatTable chat, MUCChatInfoTable muc)
        {
            if (!(muc is null) && !(chat is null))
            {
                NameText             = string.IsNullOrWhiteSpace(muc.name) ? chat.chatJabberId : muc.name;
                RemoveFromRosterText = chat.inRoster ? "Remove bookmark" : "Bookmark";

                // Account image:
                AccountPresence = muc.getMUCPresence();
                AccountInitials = "\uE125";

                MucState = muc.state;
            }
        }
コード例 #22
0
        protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
        {
            if (item is ChatMessageDataTemplate)
            {
                ChatMessageDataTemplate template = item as ChatMessageDataTemplate;
                if (template.message != null && template.chat != null)
                {
                    switch (template.message.type)
                    {
                    case MessageMessage.TYPE_ERROR:
                        return(errorMessageTemplate);

                    case MessageMessage.TYPE_GROUPCHAT:
                        if (!requestedMUCInfo)
                        {
                            mucInfo          = getMUCInfo(container);
                            requestedMUCInfo = true;
                        }

                        if (mucInfo != null && Equals(mucInfo.nickname, template.message.fromUser))
                        {
                            return(sendMessageTemplate);
                        }
                        else
                        {
                            return(receivedMessageTemplate);
                        }

                    case DirectMUCInvitationMessage.TYPE_MUC_DIRECT_INVITATION:
                        return(mucDirectInvitationTemplate);

                    case MUCHandler.TYPE_CHAT_INFO:
                        return(infoMessageTemplate);

                    default:
                        if (template.chat.userAccountId.Equals(template.message.fromUser))
                        {
                            return(sendMessageTemplate);
                        }
                        else
                        {
                            return(receivedMessageTemplate);
                        }
                    }
                }
            }
            return(base.SelectTemplateCore(item, container));
        }
コード例 #23
0
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            if (e.Parameter is NavigatedToMUCInfoEventArgs)
            {
                NavigatedToMUCInfoEventArgs args = e.Parameter as NavigatedToMUCInfoEventArgs;

                Client  = args.CLIENT;
                Chat    = args.CHAT;
                MUCInfo = args.MUC_INFO;

                ChatDBManager.INSTANCE.ChatChanged   -= INSTANCE_ChatChanged;
                ChatDBManager.INSTANCE.ChatChanged   += INSTANCE_ChatChanged;
                MUCDBManager.INSTANCE.MUCInfoChanged -= INSTANCE_MUCInfoChanged;
                MUCDBManager.INSTANCE.MUCInfoChanged += INSTANCE_MUCInfoChanged;
            }
        }
コード例 #24
0
        public void UpdateViewChat(ChatTable chat, MUCChatInfoTable muc)
        {
            if (!(chat is null))
            {
                // Do not reload chat messages, if for example only the presence changes:
                if (!isDummy && (this.chat is null || !string.Equals(chat.id, this.chat.id)))
                {
                    LoadChatMessages(chat, muc);
                }
                this.chat = chat;
                if (isDummy)
                {
                    AccountText = chat.userAccountId;
                }

                if (chat.chatType == ChatType.MUC)
                {
                    OmemoVisability = Visibility.Collapsed;

                    if (muc.state != MUCState.ENTERD && muc.state != MUCState.ENTERING)
                    {
                        EnterMucVisability = Visibility.Visible;
                        LeaveMucVisability = Visibility.Collapsed;
                    }
                    else
                    {
                        EnterMucVisability = Visibility.Collapsed;
                        LeaveMucVisability = Visibility.Visible;
                    }
                }
                else
                {
                    NameText           = chat.chatJabberId ?? "";
                    StatusText         = chat.chatState ?? chat.status ?? "";
                    EnterMucVisability = Visibility.Collapsed;
                    LeaveMucVisability = Visibility.Collapsed;
                    OmemoEnabled       = chat.omemoEnabled;
                    OmemoVisability    = Visibility.Visible;
                }

                // Account image:
                AccountPresence = chat.presence;
                AccountInitials = "\uE77B";
            }
コード例 #25
0
        public void setMUCChatInfo(MUCChatInfoTable info, bool delete, bool triggerMUCChanged)
        {
            if (info != null)
            {
                if (delete)
                {
                    dB.Delete(info);
                }
                else
                {
                    update(info);
                }

                if (triggerMUCChanged)
                {
                    MUCInfoChanged?.Invoke(this, new MUCInfoChangedEventArgs(info, delete));
                }
            }
        }
コード例 #26
0
        private async Task SendChatMessageAsync(ChatTable chat, string message)
        {
            AccountTable account = AccountDBManager.INSTANCE.getAccount(chat.userAccountId);

            if (account is null)
            {
                Logger.Warn("Unable to send message - no such account: " + chat.userAccountId);
                return;
            }

            string fromBareJid     = account.userId + '@' + account.domain;
            string fromFullJid     = fromBareJid + '/' + account.resource;
            string to              = chat.chatJabberId;
            string chatType        = chat.chatType == ChatType.CHAT ? MessageMessage.TYPE_CHAT : MessageMessage.TYPE_GROUPCHAT;
            bool   reciptRequested = true;

            MessageMessage toSendMsg;

            if (chat.omemoEnabled)
            {
                if (chat.chatType == ChatType.CHAT)
                {
                    toSendMsg = new OmemoMessageMessage(fromFullJid, to, message, chatType, reciptRequested);
                }
                else
                {
                    // ToDo: Add MUC OMEMO support
                    throw new NotImplementedException("Sending encrypted messages for MUC is not supported right now!");
                }
            }
            else if (chat.chatType == ChatType.CHAT)
            {
                toSendMsg = new MessageMessage(fromFullJid, to, message, chatType, reciptRequested);
            }
            else
            {
                MUCChatInfoTable mucInfo = MUCDBManager.INSTANCE.getMUCInfo(chat.id);
                toSendMsg = new MessageMessage(fromFullJid, to, message, chatType, mucInfo.nickname, reciptRequested);
            }

            // Create a copy for the DB:
            ChatMessageTable toSendMsgDB = new ChatMessageTable(toSendMsg, chat)
            {
                state = toSendMsg is OmemoMessageMessage ? MessageState.TO_ENCRYPT : MessageState.SENDING
            };

            // Set the chat message id for later identification:
            toSendMsg.chatMessageId = toSendMsgDB.id;

            // Update chat last active:
            chat.lastActive = DateTime.Now;

            // Update DB:
            ChatDBManager.INSTANCE.setChatMessage(toSendMsgDB, true, false);
            ChatDBManager.INSTANCE.setChat(chat, false, true);

            Logger.Info("Added to send message in background");

            if (isRunning)
            {
                XMPPClient client = ConnectionHandler.INSTANCE.getClient(fromBareJid);
                if (client is null)
                {
                    Logger.Error("Unable to send message in background - no such client: " + fromBareJid);
                }
                // Send the message:
                else if (toSendMsg is OmemoMessageMessage toSendOmemoMsg)
                {
                    await client.sendOmemoMessageAsync(toSendOmemoMsg, chat.chatJabberId, client.getXMPPAccount().getBareJid());
                }
                else
                {
                    await client.SendAsync(toSendMsg);
                }
            }
            else
            {
                ToastHelper.showWillBeSendLaterToast(chat);
            }
        }
コード例 #27
0
 //--------------------------------------------------------Constructor:----------------------------------------------------------------\\
 #region --Constructors--
 /// <summary>
 /// Basic Constructor
 /// </summary>
 /// <history>
 /// 05/02/2018 Created [Fabian Sauter]
 /// </history>
 public NavigatedToMUCInfoEventArgs(ChatTable chat, XMPPClient client, MUCChatInfoTable mucInfo)
 {
     this.CHAT     = chat;
     this.CLIENT   = client;
     this.MUC_INFO = mucInfo;
 }
コード例 #28
0
 //--------------------------------------------------------Constructor:----------------------------------------------------------------\\
 #region --Constructors--
 public NavigatedToMucInfoPageEventArgs(XMPPClient client, ChatTable chat, MUCChatInfoTable mucInfo)
 {
     CHAT     = chat;
     CLIENT   = client;
     MUC_INFO = mucInfo;
 }
コード例 #29
0
        private async void C_NewChatMessage(XMPPClient client, XMPP_API.Classes.Network.Events.NewChatMessageEventArgs args)
        {
            MessageMessage msg = args.getMessage();

            // Handel MUC room subject messages:
            if (msg is MUCRoomSubjectMessage)
            {
                MUCHandler.INSTANCE.onMUCRoomSubjectMessage(msg as MUCRoomSubjectMessage);
                return;
            }

            string from = Utils.getBareJidFromFullJid(msg.getFrom());
            string to   = Utils.getBareJidFromFullJid(msg.getTo());
            string id;

            if (msg.CC_TYPE == CarbonCopyType.SENT)
            {
                id = ChatTable.generateId(to, from);
            }
            else
            {
                id = ChatTable.generateId(from, to);
            }

            // Check if device id is valid and if, decrypt the OMEMO messages:
            if (msg is OmemoMessageMessage omemoMessage)
            {
                OmemoHelper helper = client.getOmemoHelper();
                if (helper is null)
                {
                    C_OmemoSessionBuildError(client, new OmemoSessionBuildErrorEventArgs(id, OmemoSessionBuildError.KEY_ERROR, new List <OmemoMessageMessage> {
                        omemoMessage
                    }));
                    Logger.Error("Failed to decrypt OMEMO message - OmemoHelper is null");
                    return;
                }
                else if (!client.getXMPPAccount().checkOmemoKeys())
                {
                    C_OmemoSessionBuildError(client, new OmemoSessionBuildErrorEventArgs(id, OmemoSessionBuildError.KEY_ERROR, new List <OmemoMessageMessage> {
                        omemoMessage
                    }));
                    Logger.Error("Failed to decrypt OMEMO message - keys are corrupted");
                    return;
                }
                else if (!await omemoMessage.decryptAsync(client.getOmemoHelper(), client.getXMPPAccount().omemoDeviceId))
                {
                    return;
                }
            }

            ChatTable chat        = ChatDBManager.INSTANCE.getChat(id);
            bool      chatChanged = false;

            // Spam detection:
            if (Settings.getSettingBoolean(SettingsConsts.SPAM_DETECTION_ENABLED))
            {
                if (Settings.getSettingBoolean(SettingsConsts.SPAM_DETECTION_FOR_ALL_CHAT_MESSAGES) || chat is null)
                {
                    if (SpamDBManager.INSTANCE.isSpam(msg.MESSAGE))
                    {
                        Logger.Warn("Received spam message from " + from);
                        return;
                    }
                }
            }

            if (chat is null)
            {
                chatChanged = true;
                chat        = new ChatTable(from, to)
                {
                    lastActive = msg.getDelay(),
                    chatType   = string.Equals(msg.TYPE, MessageMessage.TYPE_GROUPCHAT) ? ChatType.MUC : ChatType.CHAT
                };
            }

            ChatMessageTable message = new ChatMessageTable(msg, chat);

            // Handle MUC invite messages:
            if (msg is DirectMUCInvitationMessage)
            {
                DirectMUCInvitationMessage inviteMessage = msg as DirectMUCInvitationMessage;
                bool doesRoomExist = ChatDBManager.INSTANCE.doesMUCExist(ChatTable.generateId(inviteMessage.ROOM_JID, msg.getTo()));
                bool doesOutstandingInviteExist = ChatDBManager.INSTANCE.doesOutstandingMUCInviteExist(id, inviteMessage.ROOM_JID);

                if (doesRoomExist && doesOutstandingInviteExist)
                {
                    return;
                }

                MUCDirectInvitationTable inviteTable = new MUCDirectInvitationTable(inviteMessage, message.id);
                ChatDBManager.INSTANCE.setMUCDirectInvitation(inviteTable);
            }

            bool             isMUCMessage     = string.Equals(MessageMessage.TYPE_GROUPCHAT, message.type);
            ChatMessageTable existingMessage  = ChatDBManager.INSTANCE.getChatMessageById(message.id);
            bool             doesMessageExist = existingMessage != null;

            if (isMUCMessage)
            {
                MUCChatInfoTable mucInfo = MUCDBManager.INSTANCE.getMUCInfo(chat.id);
                if (mucInfo != null)
                {
                    if (Equals(message.fromUser, mucInfo.nickname))
                    {
                        // Filter MUC messages that already exist:
                        // ToDo: Allow MUC messages being edited and detect it
                        if (doesMessageExist)
                        {
                            return;
                        }
                        else
                        {
                            message.state = MessageState.SEND;
                        }
                    }
                    else
                    {
                        if (doesMessageExist)
                        {
                            message.state = existingMessage.state;
                        }
                    }
                }
            }

            if (chat.lastActive.CompareTo(msg.getDelay()) < 0)
            {
                chatChanged     = true;
                chat.lastActive = msg.getDelay();
            }

            if (chatChanged)
            {
                ChatDBManager.INSTANCE.setChat(chat, false, true);
            }

            // Send XEP-0184 (Message Delivery Receipts) reply:
            if (msg.RECIPT_REQUESTED && id != null && !Settings.getSettingBoolean(SettingsConsts.DONT_SEND_CHAT_MESSAGE_RECEIVED_MARKERS))
            {
                await Task.Run(async() =>
                {
                    DeliveryReceiptMessage receiptMessage = new DeliveryReceiptMessage(client.getXMPPAccount().getFullJid(), from, msg.ID);
                    await client.sendAsync(receiptMessage);
                });
            }

            ChatDBManager.INSTANCE.setChatMessage(message, !doesMessageExist, doesMessageExist && !isMUCMessage);

            // Show toast:
            if (!doesMessageExist && !chat.muted)
            {
                await Task.Run(() =>
                {
                    try
                    {
                        switch (msg.TYPE)
                        {
                        case MessageMessage.TYPE_GROUPCHAT:
                        case MessageMessage.TYPE_CHAT:
                            if (!message.isCC)
                            {
                                if (message.isImage)
                                {
                                    ToastHelper.showChatTextImageToast(message, chat);
                                }
                                else
                                {
                                    ToastHelper.showChatTextToast(message, chat);
                                }
                            }
                            break;

                        default:
                            break;
                        }
                    }
                    catch (Exception e)
                    {
                        Logger.Error("Failed to send toast notification!", e);
                    }
                });
            }
        }
コード例 #30
0
 private async Task sendMUCLeaveMessageAsync(XMPPClient client, ChatTable muc, MUCChatInfoTable info)
 {
     string           from = client.getXMPPAccount().getFullJid();
     string           to   = muc.chatJabberId + '/' + info.nickname;
     LeaveRoomMessage msg  = new LeaveRoomMessage(from, to);
     await client.sendAsync(msg);
 }