mirror of
https://github.com/Ranchero-Software/NetNewsWire.git
synced 2025-02-06 22:03:26 +01:00
Renamed Tweet to TwitterStatus since that matches the API better.
This commit is contained in:
parent
435c85218d
commit
07af483b36
@ -39,7 +39,7 @@
|
||||
5132AAC42448BAD90077840A /* FeedProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5132AAC12448BAD90077840A /* FeedProvider.swift */; };
|
||||
5132AAC52448BAD90077840A /* TwitterFeedProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5132AAC32448BAD90077840A /* TwitterFeedProvider.swift */; };
|
||||
5132DE812449159100806ADE /* TwitterUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5132DE802449159100806ADE /* TwitterUser.swift */; };
|
||||
5132DE832449306F00806ADE /* Tweet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5132DE822449306F00806ADE /* Tweet.swift */; };
|
||||
5132DE832449306F00806ADE /* TwitterStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5132DE822449306F00806ADE /* TwitterStatus.swift */; };
|
||||
513323082281070D00C30F19 /* AccountFeedbinSyncTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 513323072281070C00C30F19 /* AccountFeedbinSyncTest.swift */; };
|
||||
5133230A2281082F00C30F19 /* subscriptions_initial.json in Resources */ = {isa = PBXBuildFile; fileRef = 513323092281082F00C30F19 /* subscriptions_initial.json */; };
|
||||
5133230C2281088A00C30F19 /* subscriptions_add.json in Resources */ = {isa = PBXBuildFile; fileRef = 5133230B2281088A00C30F19 /* subscriptions_add.json */; };
|
||||
@ -279,7 +279,7 @@
|
||||
5132AAC12448BAD90077840A /* FeedProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedProvider.swift; sourceTree = "<group>"; };
|
||||
5132AAC32448BAD90077840A /* TwitterFeedProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwitterFeedProvider.swift; sourceTree = "<group>"; };
|
||||
5132DE802449159100806ADE /* TwitterUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwitterUser.swift; sourceTree = "<group>"; };
|
||||
5132DE822449306F00806ADE /* Tweet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tweet.swift; sourceTree = "<group>"; };
|
||||
5132DE822449306F00806ADE /* TwitterStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwitterStatus.swift; sourceTree = "<group>"; };
|
||||
513323072281070C00C30F19 /* AccountFeedbinSyncTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountFeedbinSyncTest.swift; sourceTree = "<group>"; };
|
||||
513323092281082F00C30F19 /* subscriptions_initial.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = subscriptions_initial.json; sourceTree = "<group>"; };
|
||||
5133230B2281088A00C30F19 /* subscriptions_add.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = subscriptions_add.json; sourceTree = "<group>"; };
|
||||
@ -568,7 +568,7 @@
|
||||
children = (
|
||||
5132AAC32448BAD90077840A /* TwitterFeedProvider.swift */,
|
||||
5132DE802449159100806ADE /* TwitterUser.swift */,
|
||||
5132DE822449306F00806ADE /* Tweet.swift */,
|
||||
5132DE822449306F00806ADE /* TwitterStatus.swift */,
|
||||
);
|
||||
path = Twitter;
|
||||
sourceTree = "<group>";
|
||||
@ -1130,7 +1130,7 @@
|
||||
552032FD229D5D5A009559E0 /* ReaderAPITagging.swift in Sources */,
|
||||
9EAEC62A23331EE70085D7C9 /* FeedlyOrigin.swift in Sources */,
|
||||
9E5EC15B23E01DEF00A4E503 /* FeedlyRTLTextSanitizer.swift in Sources */,
|
||||
5132DE832449306F00806ADE /* Tweet.swift in Sources */,
|
||||
5132DE832449306F00806ADE /* TwitterStatus.swift in Sources */,
|
||||
511B9804237CD4270028BCAA /* FeedIdentifier.swift in Sources */,
|
||||
84F73CF1202788D90000BCEF /* ArticleFetcher.swift in Sources */,
|
||||
841974251F6DDCE4006346C4 /* AccountDelegate.swift in Sources */,
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
final class Tweet: Codable {
|
||||
final class TwitterStatus: Codable {
|
||||
|
||||
let createdAt: Date?
|
||||
let idStr: String?
|
||||
@ -17,7 +17,8 @@ final class Tweet: Codable {
|
||||
let user: TwitterUser
|
||||
let truncated: Bool
|
||||
let retweeted: Bool
|
||||
let retweetedStatus: Tweet?
|
||||
let retweetedStatus: TwitterStatus?
|
||||
let quotedStatus: TwitterStatus?
|
||||
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case createdAt = "created_at"
|
||||
@ -28,6 +29,7 @@ final class Tweet: Codable {
|
||||
case truncated = "truncated"
|
||||
case retweeted = "retweeted"
|
||||
case retweetedStatus = "retweeted_status"
|
||||
case quotedStatus = "quoted_status"
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -214,7 +214,7 @@ private extension TwitterFeedProvider {
|
||||
}
|
||||
}
|
||||
|
||||
func retrieveTweets(api: String, completion: @escaping (Result<[Tweet], Error>) -> Void) {
|
||||
func retrieveTweets(api: String, completion: @escaping (Result<[TwitterStatus], Error>) -> Void) {
|
||||
let url = "\(Self.apiBase)\(api)"
|
||||
let parameters = ["tweet_mode": "extended"]
|
||||
|
||||
@ -232,7 +232,7 @@ private extension TwitterFeedProvider {
|
||||
try? jsonString?.write(toFile: url.path, atomically: true, encoding: .utf8)
|
||||
|
||||
do {
|
||||
let tweets = try decoder.decode([Tweet].self, from: response.data)
|
||||
let tweets = try decoder.decode([TwitterStatus].self, from: response.data)
|
||||
completion(.success(tweets))
|
||||
} catch {
|
||||
completion(.failure(error))
|
||||
@ -243,29 +243,27 @@ private extension TwitterFeedProvider {
|
||||
}
|
||||
}
|
||||
|
||||
func makeParsedItems(_ webFeedURL: String, _ tweets: [Tweet]) -> Set<ParsedItem> {
|
||||
func makeParsedItems(_ webFeedURL: String, _ statuses: [TwitterStatus]) -> Set<ParsedItem> {
|
||||
var parsedItems = Set<ParsedItem>()
|
||||
|
||||
for tweet in tweets {
|
||||
guard let idStr = tweet.idStr, let userScreenName = tweet.user.screenName else { continue }
|
||||
|
||||
let userURL = makeUserURL(userScreenName)
|
||||
for status in statuses {
|
||||
guard let idStr = status.idStr, let statusURL = status.url else { continue }
|
||||
|
||||
let parsedItem = ParsedItem(syncServiceID: idStr,
|
||||
uniqueID: idStr,
|
||||
feedURL: webFeedURL,
|
||||
url: "\(userURL)/status/\(idStr)",
|
||||
url: statusURL,
|
||||
externalURL: nil,
|
||||
title: nil,
|
||||
language: nil,
|
||||
contentHTML: makeTweetHTML(tweet),
|
||||
contentText: makeTweetText(tweet),
|
||||
contentHTML: status.renderAsHTML(),
|
||||
contentText: status.renderAsText(),
|
||||
summary: nil,
|
||||
imageURL: nil,
|
||||
bannerImageURL: nil,
|
||||
datePublished: tweet.createdAt,
|
||||
datePublished: status.createdAt,
|
||||
dateModified: nil,
|
||||
authors: makeParsedAuthors(tweet.user),
|
||||
authors: makeParsedAuthors(status.user),
|
||||
tags: nil,
|
||||
attachments: nil)
|
||||
parsedItems.insert(parsedItem)
|
||||
@ -278,23 +276,9 @@ private extension TwitterFeedProvider {
|
||||
return "https://twitter.com/\(screenName)"
|
||||
}
|
||||
|
||||
func makeParsedAuthors(_ user: TwitterUser) -> Set<ParsedAuthor> {
|
||||
return Set([ParsedAuthor(name: user.name, url: makeUserURL(user.screenName!), avatarURL: user.avatarURL, emailAddress: nil)])
|
||||
}
|
||||
|
||||
func makeTweetText(_ tweet: Tweet) -> String? {
|
||||
let tweetToUse = tweet.retweetedStatus != nil ? tweet.retweetedStatus! : tweet
|
||||
if let text = tweetToUse.fullText, let displayRange = tweetToUse.displayTextRange, displayRange.count > 1,
|
||||
let startIndex = text.index(text.startIndex, offsetBy: displayRange[0], limitedBy: text.endIndex),
|
||||
let endIndex = text.index(text.startIndex, offsetBy: displayRange[1], limitedBy: text.endIndex) {
|
||||
return String(text[startIndex..<endIndex])
|
||||
} else {
|
||||
return tweet.fullText
|
||||
}
|
||||
}
|
||||
|
||||
func makeTweetHTML(_ tweet: Tweet) -> String? {
|
||||
return nil
|
||||
func makeParsedAuthors(_ user: TwitterUser?) -> Set<ParsedAuthor>? {
|
||||
guard let user = user else { return nil }
|
||||
return Set([ParsedAuthor(name: user.name, url: user.url, avatarURL: user.avatarURL, emailAddress: nil)])
|
||||
}
|
||||
|
||||
}
|
||||
|
55
Frameworks/Account/FeedProvider/Twitter/TwitterStatus.swift
Normal file
55
Frameworks/Account/FeedProvider/Twitter/TwitterStatus.swift
Normal file
@ -0,0 +1,55 @@
|
||||
//
|
||||
// TwitterStatus.swift
|
||||
// Account
|
||||
//
|
||||
// Created by Maurice Parker on 4/16/20.
|
||||
// Copyright © 2020 Ranchero Software, LLC. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
final class TwitterStatus: Codable {
|
||||
|
||||
let createdAt: Date?
|
||||
let idStr: String?
|
||||
let fullText: String?
|
||||
let displayTextRange: [Int]?
|
||||
let user: TwitterUser?
|
||||
let truncated: Bool?
|
||||
let retweeted: Bool?
|
||||
let retweetedStatus: TwitterStatus?
|
||||
let quotedStatus: TwitterStatus?
|
||||
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case createdAt = "created_at"
|
||||
case idStr = "id_str"
|
||||
case fullText = "full_text"
|
||||
case displayTextRange = "display_text_range"
|
||||
case user = "user"
|
||||
case truncated = "truncated"
|
||||
case retweeted = "retweeted"
|
||||
case retweetedStatus = "retweeted_status"
|
||||
case quotedStatus = "quoted_status"
|
||||
}
|
||||
|
||||
var url: String? {
|
||||
guard let userURL = user?.url, let idStr = idStr else { return nil }
|
||||
return "\(userURL)/status/\(idStr)"
|
||||
}
|
||||
|
||||
func renderAsText() -> String? {
|
||||
let statusToRender = retweetedStatus != nil ? retweetedStatus! : self
|
||||
if let text = statusToRender.fullText, let displayRange = statusToRender.displayTextRange, displayRange.count > 1,
|
||||
let startIndex = text.index(text.startIndex, offsetBy: displayRange[0], limitedBy: text.endIndex),
|
||||
let endIndex = text.index(text.startIndex, offsetBy: displayRange[1], limitedBy: text.endIndex) {
|
||||
return String(text[startIndex..<endIndex])
|
||||
} else {
|
||||
return fullText
|
||||
}
|
||||
}
|
||||
|
||||
func renderAsHTML() -> String? {
|
||||
return nil
|
||||
}
|
||||
|
||||
}
|
@ -20,4 +20,8 @@ struct TwitterUser: Codable {
|
||||
case avatarURL = "profile_image_url_https"
|
||||
}
|
||||
|
||||
var url: String {
|
||||
return "https://twitter.com/\(screenName ?? "")"
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user