Plugins/Twitter Plugin/MGTwitterEngine/MGTwitterStatusesParser.m
author Zachary West <zacw@adium.im>
Thu Nov 19 21:12:23 2009 -0500 (2009-11-19)
changeset 2768 85857106a45e
parent 776 243d6da010b2
child 2914 597b3a38a84a
permissions -rw-r--r--
Implement the Retweet API. This means checking home_timeline and sending proper retweet messages. Fixes #12556.

On an annoying note, home_timeline (despite saying "Returns the 20 most recent statuses, including retweets, posted by the authenticating user and that user's friends") does not include outgoing retweets. This will either be fixed by Twitter quickly, or not. I'm tired of Twitter's inconsistent and buggy API. So, as such, there's currently no way to remove a retweet done by yourself.
zacw@776
     1
//
zacw@776
     2
//  MGTwitterStatusesParser.m
zacw@776
     3
//  MGTwitterEngine
zacw@776
     4
//
zacw@776
     5
//  Created by Matt Gemmell on 11/02/2008.
zacw@776
     6
//  Copyright 2008 Instinctive Code.
zacw@776
     7
//
zacw@776
     8
zacw@776
     9
#import "MGTwitterStatusesParser.h"
zacw@776
    10
zacw@776
    11
zacw@776
    12
@implementation MGTwitterStatusesParser
zacw@776
    13
zacw@776
    14
zacw@776
    15
#pragma mark NSXMLParser delegate methods
zacw@776
    16
zacw@776
    17
zacw@776
    18
- (void)parser:(NSXMLParser *)theParser didStartElement:(NSString *)elementName 
zacw@776
    19
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
zacw@776
    20
    attributes:(NSDictionary *)attributeDict
zacw@776
    21
{
zacw@776
    22
    //NSLog(@"Started element: %@ (%@)", elementName, attributeDict);
zacw@776
    23
    [self setLastOpenedElement:elementName];
zacw@776
    24
    
zacw@776
    25
    if ([elementName isEqualToString:@"status"]) {
zacw@776
    26
        // Make new entry in parsedObjects.
zacw@776
    27
        NSMutableDictionary *newNode = [NSMutableDictionary dictionaryWithCapacity:0];
zacw@776
    28
        [parsedObjects addObject:newNode];
zacw@2768
    29
        currentNode = newNode;		
zacw@776
    30
    } else if ([elementName isEqualToString:@"user"]) {
zacw@776
    31
        // Add a 'user' dictionary to current node.
zacw@776
    32
        NSMutableDictionary *newNode = [NSMutableDictionary dictionaryWithCapacity:0];
zacw@776
    33
        [currentNode setObject:newNode forKey:elementName];
zacw@776
    34
        currentNode = newNode;
zacw@2768
    35
	} else if ([elementName isEqualToString:@"retweeted_status"]) {
zacw@2768
    36
        // Add a 'retweeted_status' dictionary to current node.
zacw@2768
    37
        NSMutableDictionary *newNode = [NSMutableDictionary dictionaryWithCapacity:0];
zacw@2768
    38
        [currentNode setObject:newNode forKey:elementName];
zacw@2768
    39
        currentNode = newNode;		
zacw@776
    40
    } else if (currentNode) {
zacw@776
    41
        // Create relevant name-value pair.
zacw@776
    42
        [currentNode setObject:[NSMutableString string] forKey:elementName];
zacw@776
    43
    }
zacw@776
    44
}
zacw@776
    45
zacw@776
    46
zacw@776
    47
- (void)parser:(NSXMLParser *)theParser foundCharacters:(NSString *)characters
zacw@776
    48
{
zacw@776
    49
    //NSLog(@"Found characters: %@", characters);
zacw@776
    50
    // Append found characters to value of lastOpenedElement in currentNode.
zacw@776
    51
    if (lastOpenedElement && currentNode) {
zacw@776
    52
        [[currentNode objectForKey:lastOpenedElement] appendString:characters];
zacw@776
    53
    }
zacw@776
    54
}
zacw@776
    55
zacw@776
    56
zacw@776
    57
- (void)parser:(NSXMLParser *)theParser didEndElement:(NSString *)elementName 
zacw@776
    58
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
zacw@776
    59
{
zacw@776
    60
    [super parser:theParser didEndElement:elementName namespaceURI:namespaceURI qualifiedName:qName];
zacw@776
    61
    
zacw@2768
    62
    if ([elementName isEqualToString:@"user"] || [elementName isEqualToString:@"retweeted_status"]) {
zacw@776
    63
        currentNode = [parsedObjects lastObject];
zacw@776
    64
    } else if ([elementName isEqualToString:@"status"]) {
zacw@776
    65
        [self addSource];
zacw@776
    66
        currentNode = nil;
zacw@776
    67
    }
zacw@776
    68
}
zacw@776
    69
zacw@776
    70
zacw@776
    71
@end