Exemple #1
0
        private async void OnNewPresence(XMPPClient xmppClient, NewPresenceMessageEventArgs args)
        {
            string from = Utils.getBareJidFromFullJid(args.PRESENCE_MESSAGE.getFrom());

            // If received a presence message from your own account, ignore it:
            if (string.Equals(from, client.dbAccount.bareJid))
            {
                return;
            }

            ChatModel chat;

            using (SemaLock semaLock = DataCache.INSTANCE.NewChatSemaLock())
            {
                chat = DataCache.INSTANCE.GetChat(xmppClient.getXMPPAccount().getBareJid(), from, semaLock);
            }
            if (chat is null)
            {
                Logger.Warn("Received a presence message for an unknown chat from: " + from + ", to: " + client.dbAccount.bareJid);
                return;
            }

            // Answer presence probes:
            // TODO: answer those only for chats we are subscribed to.
            if (string.Equals(args.PRESENCE_MESSAGE.TYPE, "probe"))
            {
                await AnswerPresenceProbeAsync(from, client.dbAccount.bareJid, chat, args.PRESENCE_MESSAGE);

                return;
            }

            if (chat.chatType == ChatType.CHAT)
            {
                if (string.Equals(args.PRESENCE_MESSAGE.TYPE, "subscribe"))
                {
                    chat.subscription = args.PRESENCE_MESSAGE.TYPE;
                }

                if (!string.Equals(args.PRESENCE_MESSAGE.TYPE, "unsubscribe") && !string.Equals(args.PRESENCE_MESSAGE.TYPE, "subscribe"))
                {
                    switch (chat.subscription)
                    {
                    case "from":
                    case "none":
                    case "pending":
                    case null:
                        chat.presence = Presence.Unavailable;
                        break;

                    default:
                        chat.status   = args.PRESENCE_MESSAGE.STATUS;
                        chat.presence = args.PRESENCE_MESSAGE.PRESENCE;
                        break;
                    }
                }

                chat.Update();
            }
        }
Exemple #2
0
        private async void OnNewPresence(XMPPClient client, NewPresenceMessageEventArgs args)
        {
            string from = Utils.getBareJidFromFullJid(args.PRESENCE_MESSAGE.getFrom());

            // If received a presence message from your own account, ignore it:
            if (string.Equals(from, GetBareJid()))
            {
                return;
            }

            string    to   = GetBareJid();
            string    id   = ChatTable.generateId(from, to);
            ChatTable chat = ChatDBManager.INSTANCE.getChat(id);

            switch (args.PRESENCE_MESSAGE.TYPE)
            {
            case "subscribe":
            case "unsubscribed":
                if (chat is null)
                {
                    chat = new ChatTable(from, to);
                }
                chat.subscription = args.PRESENCE_MESSAGE.TYPE;
                break;

            // Answer presence probes:
            case "probe":
                await AnswerPresenceProbeAsync(from, to, chat, args.PRESENCE_MESSAGE);

                return;

            default:
                break;
            }

            if (chat != null)
            {
                chat.status   = args.PRESENCE_MESSAGE.STATUS;
                chat.presence = args.PRESENCE_MESSAGE.PRESENCE;
                ChatDBManager.INSTANCE.setChat(chat, false, true);
            }
            else
            {
                Logger.Warn("Received a presence message for an unknown chat from: " + from + ", to: " + to);
            }
        }