+- (void)contactManager: (XMPPContactManager*)manager
+ didAddContact: (XMPPContact*)contact
+{
+ XMPPRosterItem *rosterItem = contact.rosterItem;
+ OFString *subscription = rosterItem.subscription;
+ OFString *bareJID = [rosterItem.JID bareJID];
+
+ if ([subscription isEqual: @"from"] || [subscription isEqual: @"both"])
+ [_subRequests removeObject: bareJID];
+}
+
+- (void)contactManager: (XMPPContactManager*)manager
+ didReceiveSubscriptionRequest: (XMPPPresence*)presence
+{
+ OFString *bareJID = [presence.from bareJID];
+ [_subRequests addObject: bareJID];
+ [of_stdout writeFormat: @"\r" BOLD("%@") @" send a request to "
+ @"subscribe to your presence\r\n"
+ @"Use the :subs command to answer it\n",
+ bareJID];
+ [[Linenoise sharedLinenoise] refreshLine];
+}
+
+- (void)contact: (XMPPContact*)contact
+ willUpdateWithRosterItem: (XMPPRosterItem*)rosterItem
+{
+ OFString *subscription = rosterItem.subscription;
+ OFString *bareJID = [rosterItem.JID bareJID];
+
+ if ([subscription isEqual: @"from"] || [subscription isEqual: @"both"])
+ [_subRequests removeObject: bareJID];
+}
+