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(); } }
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); } }