]> cgit.babelmonkeys.de Git - jubjub.git/blobdiff - src/gui/cli/JubCLIUI.m
Move away from BOOL
[jubjub.git] / src / gui / cli / JubCLIUI.m
index 3cf59c2b05b96b5e5fb6a57ce528c4b77c7c6672..bcae48044ff354aec8d4dc68593bf161ea652f0c 100644 (file)
@@ -134,10 +134,45 @@ BEGINCLICOMMAND(JubCLIRosterCommand, @":roster", nil, @"Shows your roster")
 }
 ENDCLICOMMAND
 
+BEGINCLICOMMAND(JubCLISubsCommand, @":subs",
+    @"[list | ack <who> | nak <who>]",
+    @"Lists, acknowledges or denies subscription requests")
+{
+       if ([parameters count] < 1) {
+               [of_stdout writeLine: @"Syntax: ':subs "
+                   @"[list | ack <who> | nak <who>]'"];
+               return;
+       }
+
+       OFString *action = parameters[0];
+       if (![action isEqual: @"list"] && ([parameters count] != 2)) {
+               [of_stdout writeLine: @"Syntax: ':subs "
+                   @"[list | ack <who> | nak <who>]'"];
+               return;
+       }
+
+       if ([action isEqual: @"list"]) {
+               for (OFString *request in _ui.subRequests)
+                       [of_stdout writeLine: request];
+               return;
+       }
+
+       XMPPJID *JID = [XMPPJID JIDWithString: parameters[1]];
+
+       if ([action isEqual: @"ack"])
+               [_ui.client.contactManager sendSubscribedToJID: JID];
+       else if ([action isEqual: @"nak"])
+               [_ui.client.contactManager sendUnsubscribedToJID: JID];
+
+       [_ui.subRequests removeObject: parameters[1]];
+}
+ENDCLICOMMAND
+
 @implementation JubCLIUI
 @synthesize client = _client;
 @synthesize lastIn = _lastIn;
 @synthesize sink = _sink;
+@synthesize subRequests = _subRequests;
 
 - initWithClient: (JubChatClient*)client
 {
@@ -145,6 +180,7 @@ ENDCLICOMMAND
 
        @try {
                _commands =  [OFMutableDictionary new];
+               _subRequests =  [OFMutableSet new];
                _client = [client retain];
                _contactManager = client.contactManager;
                [_contactManager addDelegate: self];
@@ -163,6 +199,8 @@ ENDCLICOMMAND
 
                [self addCommand: [[[JubCLIRosterCommand alloc]
                                       initWithCLIUI: self] autorelease]];
+               [self addCommand: [[[JubCLISubsCommand alloc]
+                                      initWithCLIUI: self] autorelease]];
        } @catch (id e) {
                [self release];
                @throw e;
@@ -175,6 +213,7 @@ ENDCLICOMMAND
 {
        [_contactManager removeDelegate: self];
        [_client release];
+       [_subRequests release];
        [_commands release];
        [super dealloc];
 }
@@ -259,7 +298,7 @@ static void completionCallback(OFString *buf, OFList *lc)
                      forKey: command.command];
 }
 
-- (BOOL)Jub_userInputWithStream: (OFStream*)stream
+- (bool)Jub_userInputWithStream: (OFStream*)stream
                           line: (OFString*)line
                      exception: (OFException*)exception
 {
@@ -267,18 +306,18 @@ static void completionCallback(OFString *buf, OFList *lc)
                [OFApplication terminate];
 
        if ([line length] == 0)
-               return YES;
+               return true;
 
        if ([line characterAtIndex: 0] != ':') {
                if (_sink == nil) {
                        [of_stdout writeLine: @"No default sink selected, "
                            @"type `:h` for help"];
-                       return YES;
+                       return true;
                }
 
                [_sink send: line];
 
-               return YES;
+               return true;
        }
 
        line = [line stringByDeletingTrailingWhitespaces];
@@ -320,7 +359,7 @@ static void completionCallback(OFString *buf, OFList *lc)
                        [of_stdout writeFormat: @"- %@\n", command.help];
                };
 
-               return YES;
+               return true;
        }
 
        id<JubCLICommand> command = _commands[input[0]];
@@ -329,12 +368,45 @@ static void completionCallback(OFString *buf, OFList *lc)
                [command callWithParameters:
                    [input arrayByRemovingObject: [input firstObject]]];
 
-               return YES;
+               return true;
        }
 
        [of_stdout writeLine: @"Invalid command, type `:h` for help"];
 
-       return YES;
+       return true;
+}
+
+- (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];
 }
 
 -  (void)contact: (XMPPContact*)contact