#define NS_DISCO_INFO @"http://jabber.org/protocol/disco#info"
-@interface AppDelegate: OFObject
-#ifdef OF_HAVE_OPTIONAL_PROTOCOLS
- <OFApplicationDelegate, XMPPConnectionDelegate>
-#endif
-
-OFString *discoID;
-PEPThread *pepper;
+@interface AppDelegate: OFObject <OFApplicationDelegate, XMPPConnectionDelegate>
+{
+ PEPThread *pepper;
+ MPDConnection *mpdConn;
+}
@end
OF_APPLICATION_DELEGATE(AppDelegate)
- (void)applicationDidFinishLaunching
{
XMPPConnection *conn;
+
+ OFString *mpd_host;
+ uint16_t mpd_port;
+ OFString *mpd_port_string;
+
+ OFDictionary *environment = [OFApplication environment];
OFArray *arguments = [OFApplication arguments];
conn = [[XMPPConnection alloc] init];
- [conn setDelegate: self];
+ [conn addDelegate: self];
- if ([arguments count] != 3) {
- of_log(@"Invalid count of command line arguments!");
+ if (arguments.count != 3) {
+ [of_stdout writeFormat: @"Usage: %@ <server> <user> <passwd>\n",
+ [OFApplication programName]];
[OFApplication terminateWithStatus: 1];
}
- [conn setDomain: [arguments objectAtIndex: 0]];
- [conn setUsername: [arguments objectAtIndex: 1]];
- [conn setPassword: [arguments objectAtIndex: 2]];
- [conn setResource: @"ObjXMPP"];
+ conn.domain = [arguments objectAtIndex: 0];
+ conn.username = [arguments objectAtIndex: 1];
+ conn.password = [arguments objectAtIndex: 2];
+ conn.resource = @"ObjXMPP";
+
+ mpd_host = [environment objectForKey: @"MPD_HOST"];
+ if (mpd_host == nil)
+ mpd_host = @"localhost";
+
+ mpd_port_string = [environment objectForKey: @"MPD_PORT"];
+ if (mpd_port_string && [mpd_port_string decimalValue] <= UINT16_MAX)
+ mpd_port = (uint16_t) [mpd_port_string decimalValue];
+ else
+ mpd_port = 6600;
+
+ mpdConn = [[MPDConnection alloc] initWithHost: mpd_host
+ port: mpd_port];
+ [mpdConn connect];
@try {
[conn connect];
[conn handleConnection];
} @catch (id e) {
- of_log(@"%@", e);
+ [of_stderr writeFormat: @"%@\n", e];
}
}
- (void)connectionWasAuthenticated: (XMPPConnection*)conn
{
- of_log(@"Auth successful");
+ [of_stdout writeLine: @"Auth successful"];
}
- (void)connection: (XMPPConnection*)conn
{
XMPPPresence *pres;
XMPPIQ *disco;
+ OFString *discoID;
- of_log(@"Bound to JID: %@", [jid fullJID]);
+ [of_stdout writeFormat: @"Bound to JID: %@\n", [jid fullJID]];
pres = [XMPPPresence presence];
[pres addPriority: 0];
ID: discoID];
disco.to = [XMPPJID JIDWithString: [[conn JID] bareJID]];
[disco addChild: [OFXMLElement
- elementWithName: @"query"
- namespace: NS_DISCO_INFO]];
+ elementWithName: @"query"
+ namespace: NS_DISCO_INFO]];
- [conn sendStanza: disco];
+ [conn sendIQ: disco
+ withCallbackObject: self
+ selector: @selector(mpdbot_handleDiscoForConnection:withIQ:)];
}
-- (BOOL)connection: (XMPPConnection*)conn
- didReceiveIQ: (XMPPIQ*)iq
+- (BOOL)mpdbot_handleDiscoForConnection: (XMPPConnection*)conn
+ withIQ: (XMPPIQ*)iq
{
OFXMLElement *query = [iq elementForName: @"query"
namespace: NS_DISCO_INFO];
- if ([[iq ID] isEqual: discoID]) {
- for (OFXMLElement *identity
- in [query elementsForName: @"identity"
- namespace: NS_DISCO_INFO]) {
- if ([[[identity attributeForName: @"category"]
- stringValue] isEqual: @"pubsub"] &&
- [[[identity attributeForName: @"type"] stringValue]
- isEqual: @"pep"]) {
- pepper = [[PEPThread alloc]
- initWithObject: conn];
- [pepper start];
- return YES;
- }
+ for (OFXMLElement *identity in [query elementsForName: @"identity"
+ namespace: NS_DISCO_INFO]) {
+ if ([[[identity attributeForName: @"category"]
+ stringValue] isEqual: @"pubsub"] &&
+ [[[identity attributeForName: @"type"] stringValue]
+ isEqual: @"pep"]) {
+ pepper = [[PEPThread alloc] initWithObject: conn];
+ [pepper start];
+
+ return YES;
}
}
+ [of_stderr writeLine: @"Server does NOT support PEP"];
return NO;
}
-- (void)connection: (XMPPConnection*)conn
- didReceiveMessage: (XMPPMessage*)msg
+- (void)connection: (XMPPConnection*)conn
+ didReceivePresence: (XMPPPresence*)pres
{
- of_log(@"Message: %@", msg);
+ if ([pres.type isEqual: @"subscribe"]) {
+ XMPPPresence *answer;
+ answer = [XMPPPresence presenceWithType: @"subscribed"
+ ID: pres.ID];
+ answer.to = [XMPPJID JIDWithString: [pres.from bareJID]];
+ [conn sendStanza: answer];
+ }
}
-- (void)connection: (XMPPConnection*)conn
- didReceivePresence: (XMPPPresence*)pres
+- (void)connection: (XMPPConnection*)conn
+ didReceiveMessage: (XMPPMessage*)mesg
{
- of_log(@"Presence: %@", pres);
+ if ([mesg.body isEqual: @"pause"]) {
+ [mpdConn send: @"pause"];
+ [mpdConn response];
+ }
}
- (void)connectionWasClosed: (XMPPConnection*)conn
{
- of_log(@"Connection was closed!");
+ [of_stdout writeLine: @"Connection was closed!"];
}
@end