{
struct CitContext *cptr;
int nContexts, i;
- int aide = (CC->user.axlevel >= 6);
cprintf("<query xmlns=\"jabber:iq:roster\">");
-
cptr = CtdlGetContextArray(&nContexts);
if (cptr) {
for (i=0; i<nContexts; i++) {
- if (cptr[i].logged_in) {
- if (
- (((cptr[i].cs_flags&CS_STEALTH)==0) || (aide))
- && (cptr[i].user.usernum != CC->user.usernum)
- ) {
- xmpp_roster_item(&cptr[i]);
- }
+ if (xmpp_is_visible(&cptr[i], CC)) {
+ CtdlLogPrintf(CTDL_DEBUG, "Rosterizing %s\n", cptr[i].user.fullname);
+ xmpp_roster_item(&cptr[i]);
}
}
free (cptr);
void xmpp_query_namespace(char *iq_id, char *iq_from, char *iq_to, char *query_xmlns)
{
int supported_namespace = 0;
+ int roster_query = 0;
/* We need to know before we begin the response whether this is a supported namespace, so
* unfortunately all supported namespaces need to be defined here *and* down below where
*/
if (!strcasecmp(query_xmlns, "jabber:iq:roster:query")) {
+ roster_query = 1;
xmpp_iq_roster_query();
}
}
cprintf("</iq>");
+
+ /* If we told the client who is on the roster, we also need to tell the client
+ * who is *not* on the roster. (It's down here because we can't do it in the same
+ * stanza; this will be an unsolicited push.)
+ */
+ if (roster_query) {
+ xmpp_delete_old_buddies_who_no_longer_exist_from_the_client_roster();
+ }
}