Showing preview only (4,070K chars total). Download the full file or copy to clipboard to get everything.
Repository: DanielaSfregola/twitter4s
Branch: main
Commit: ea764e6f9e3a
Files: 590
Total size: 3.7 MB
Directory structure:
gitextract_z8tpb3no/
├── .circleci/
│ └── config.yml
├── .gitignore
├── .mergify.yml
├── .scalafmt.conf
├── LICENSE
├── README.md
├── build.sbt
├── project/
│ ├── build.properties
│ └── plugins.sbt
├── sonatype.sbt
└── src/
├── main/
│ ├── resources/
│ │ └── reference.conf
│ └── scala/
│ └── com/
│ └── danielasfregola/
│ └── twitter4s/
│ ├── TwitterAuthenticationClient.scala
│ ├── TwitterRestClient.scala
│ ├── TwitterRestV2Client.scala
│ ├── TwitterStreamingClient.scala
│ ├── entities/
│ │ ├── AccessToken.scala
│ │ ├── Accuracy.scala
│ │ ├── Area.scala
│ │ ├── Banners.scala
│ │ ├── Category.scala
│ │ ├── Configuration.scala
│ │ ├── ConsumerToken.scala
│ │ ├── Contributor.scala
│ │ ├── Coordinate.scala
│ │ ├── Coordinates.scala
│ │ ├── DirectMessage.scala
│ │ ├── DirectMessageEvent.scala
│ │ ├── DirectMessageEventList.scala
│ │ ├── Entities.scala
│ │ ├── ExtendedTweet.scala
│ │ ├── Geo.scala
│ │ ├── GeoBoundingBox.scala
│ │ ├── GeoCode.scala
│ │ ├── GeoPlace.scala
│ │ ├── GeoSearch.scala
│ │ ├── HashTag.scala
│ │ ├── Image.scala
│ │ ├── LanguageDetails.scala
│ │ ├── Location.scala
│ │ ├── LocationTrends.scala
│ │ ├── LookupEntities.scala
│ │ ├── LookupMapped.scala
│ │ ├── LookupRelationship.scala
│ │ ├── LookupTweet.scala
│ │ ├── LookupUser.scala
│ │ ├── Media.scala
│ │ ├── MediaDetails.scala
│ │ ├── MediaUpload.scala
│ │ ├── OEmbedTweet.scala
│ │ ├── PrivacyPolicy.scala
│ │ ├── ProfileImage.scala
│ │ ├── ProfileUpdate.scala
│ │ ├── RateLimit.scala
│ │ ├── RateLimits.scala
│ │ ├── RatedData.scala
│ │ ├── Relationship.scala
│ │ ├── SavedSearch.scala
│ │ ├── Settings.scala
│ │ ├── SettingsOptions.scala
│ │ ├── Size.scala
│ │ ├── StatusMediaDetails.scala
│ │ ├── Suggestions.scala
│ │ ├── Symbol.scala
│ │ ├── TermsOfService.scala
│ │ ├── Tweet.scala
│ │ ├── TweetId.scala
│ │ ├── TweetSearch.scala
│ │ ├── TweetUpdate.scala
│ │ ├── TwitterList.scala
│ │ ├── TwitterListUpdate.scala
│ │ ├── TwitterLists.scala
│ │ ├── UploadedMedia.scala
│ │ ├── Url.scala
│ │ ├── User.scala
│ │ ├── UserIds.scala
│ │ ├── UserMention.scala
│ │ ├── UserStringifiedIds.scala
│ │ ├── Users.scala
│ │ ├── Variant.scala
│ │ ├── Video.scala
│ │ ├── VideoInfo.scala
│ │ ├── Webhook.scala
│ │ ├── authentication/
│ │ │ ├── OAuthAccessToken.scala
│ │ │ └── OAuthRequestToken.scala
│ │ ├── enums/
│ │ │ ├── AccessType.scala
│ │ │ ├── Alignment.scala
│ │ │ ├── ContributorType.scala
│ │ │ ├── DisconnectionCode.scala
│ │ │ ├── EventCode.scala
│ │ │ ├── FilterLevel.scala
│ │ │ ├── Granularity.scala
│ │ │ ├── Hour.scala
│ │ │ ├── Language.scala
│ │ │ ├── Measure.scala
│ │ │ ├── MediaType.scala
│ │ │ ├── Mode.scala
│ │ │ ├── Resource.scala
│ │ │ ├── ResultType.scala
│ │ │ ├── TimeZone.scala
│ │ │ ├── TweetMode.scala
│ │ │ ├── WidgetType.scala
│ │ │ └── WithFilter.scala
│ │ ├── streaming/
│ │ │ ├── StreamingUpdate.scala
│ │ │ ├── common/
│ │ │ │ ├── DisconnectMessage.scala
│ │ │ │ ├── LimitNotice.scala
│ │ │ │ ├── LocationDeletionNotice.scala
│ │ │ │ ├── StatusDeletionNotice.scala
│ │ │ │ ├── StatusWithheldNotice.scala
│ │ │ │ ├── UserWithheldNotice.scala
│ │ │ │ └── WarningMessage.scala
│ │ │ ├── site/
│ │ │ │ ├── ControlMessage.scala
│ │ │ │ └── UserEnvelop.scala
│ │ │ └── user/
│ │ │ ├── Event.scala
│ │ │ └── FriendsLists.scala
│ │ └── v2/
│ │ ├── Error.scala
│ │ ├── Media.scala
│ │ ├── Meta.scala
│ │ ├── Place.scala
│ │ ├── Poll.scala
│ │ ├── Tweet.scala
│ │ ├── TweetEntities.scala
│ │ ├── TweetIncludes.scala
│ │ ├── User.scala
│ │ ├── UserEntities.scala
│ │ ├── UserIncludes.scala
│ │ ├── Withheld.scala
│ │ ├── enums/
│ │ │ ├── CoordinatesType.scala
│ │ │ ├── MediaType.scala
│ │ │ ├── ReferencedTweetType.scala
│ │ │ ├── TweetReplySetting.scala
│ │ │ ├── WithheldScope.scala
│ │ │ ├── expansions/
│ │ │ │ ├── TweetExpansions.scala
│ │ │ │ └── UserExpansions.scala
│ │ │ ├── fields/
│ │ │ │ ├── MediaFields.scala
│ │ │ │ ├── PlaceFields.scala
│ │ │ │ ├── PollFields.scala
│ │ │ │ ├── TweetFields.scala
│ │ │ │ └── UserFields.scala
│ │ │ └── rest/
│ │ │ └── TimelineExclude.scala
│ │ └── responses/
│ │ ├── TweetResponse.scala
│ │ ├── TweetsResponse.scala
│ │ ├── UserResponse.scala
│ │ └── UsersResponse.scala
│ ├── exceptions/
│ │ └── TwitterException.scala
│ ├── http/
│ │ ├── clients/
│ │ │ ├── Client.scala
│ │ │ ├── CommonClient.scala
│ │ │ ├── OAuthClient.scala
│ │ │ ├── authentication/
│ │ │ │ ├── AuthenticationClient.scala
│ │ │ │ └── oauth/
│ │ │ │ ├── TwitterOAuthClient.scala
│ │ │ │ └── parameters/
│ │ │ │ ├── AccessTokenParameters.scala
│ │ │ │ └── RequestTokenParameters.scala
│ │ │ ├── rest/
│ │ │ │ ├── RestClient.scala
│ │ │ │ ├── account/
│ │ │ │ │ ├── TwitterAccountClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ └── CredentialsParameters.scala
│ │ │ │ ├── accountactivity/
│ │ │ │ │ ├── TwitterAccountActivityClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ └── WebhooksParameters.scala
│ │ │ │ ├── application/
│ │ │ │ │ ├── TwitterApplicationClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ └── RatesParameters.scala
│ │ │ │ ├── blocks/
│ │ │ │ │ ├── TwitterBlockClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── BlockParameters.scala
│ │ │ │ │ ├── BlockedUserIdsParameters.scala
│ │ │ │ │ └── BlockedUsersParameters.scala
│ │ │ │ ├── directmessages/
│ │ │ │ │ ├── TwitterDirectMessageClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── CreateEventParameters.scala
│ │ │ │ │ ├── CreateParameters.scala
│ │ │ │ │ ├── DestroyParameters.scala
│ │ │ │ │ ├── EventListParameters.scala
│ │ │ │ │ ├── ReceivedParameters.scala
│ │ │ │ │ ├── SentParameters.scala
│ │ │ │ │ └── ShowParameters.scala
│ │ │ │ ├── favorites/
│ │ │ │ │ ├── TwitterFavoriteClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── FavoriteParameters.scala
│ │ │ │ │ └── FavoritesParameters.scala
│ │ │ │ ├── followers/
│ │ │ │ │ ├── TwitterFollowerClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── FollowersParameters.scala
│ │ │ │ │ └── FollowingParameters.scala
│ │ │ │ ├── friends/
│ │ │ │ │ ├── TwitterFriendClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── FriendParameters.scala
│ │ │ │ │ └── FriendsParameters.scala
│ │ │ │ ├── friendships/
│ │ │ │ │ ├── TwitterFriendshipClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── BlockedParameters.scala
│ │ │ │ │ ├── FollowParameters.scala
│ │ │ │ │ ├── FriendshipParameters.scala
│ │ │ │ │ ├── NotificationParameters.scala
│ │ │ │ │ ├── RelationshipParameters.scala
│ │ │ │ │ ├── RelationshipsParameters.scala
│ │ │ │ │ └── UnfollowParameters.scala
│ │ │ │ ├── geo/
│ │ │ │ │ ├── TwitterGeoClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── GeoSearchParameters.scala
│ │ │ │ │ └── ReverseGeoCodeParameters.scala
│ │ │ │ ├── help/
│ │ │ │ │ └── TwitterHelpClient.scala
│ │ │ │ ├── lists/
│ │ │ │ │ ├── TwitterListClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── AddMemberParameters.scala
│ │ │ │ │ ├── CreateListParameters.scala
│ │ │ │ │ ├── ListMembersParameters.scala
│ │ │ │ │ ├── ListParameters.scala
│ │ │ │ │ ├── ListTimelineParameters.scala
│ │ │ │ │ ├── ListsParameters.scala
│ │ │ │ │ ├── MemberParameters.scala
│ │ │ │ │ ├── MembersParameters.scala
│ │ │ │ │ ├── MembershipsParameters.scala
│ │ │ │ │ ├── OwnershipsParameters.scala
│ │ │ │ │ ├── RemoveMemberParameters.scala
│ │ │ │ │ ├── RemoveMembersParameters.scala
│ │ │ │ │ ├── SubscribersParameters.scala
│ │ │ │ │ ├── SubscriptionsParameters.scala
│ │ │ │ │ └── UpdateListParameters.scala
│ │ │ │ ├── media/
│ │ │ │ │ ├── TwitterMediaClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── MediaAppendParameters.scala
│ │ │ │ │ ├── MediaFinalizeParameters.scala
│ │ │ │ │ ├── MediaInitParameters.scala
│ │ │ │ │ ├── MediaMetadataCreation.scala
│ │ │ │ │ └── MediaStatusParameters.scala
│ │ │ │ ├── mutes/
│ │ │ │ │ ├── TwitterMuteClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── MuteParameters.scala
│ │ │ │ │ ├── MutedUsersIdsParameters.scala
│ │ │ │ │ └── MutedUsersParameters.scala
│ │ │ │ ├── savedsearches/
│ │ │ │ │ ├── TwitterSavedSearchClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ └── SaveSearchParameters.scala
│ │ │ │ ├── search/
│ │ │ │ │ ├── TwitterSearchClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ └── TweetSearchParameters.scala
│ │ │ │ ├── statuses/
│ │ │ │ │ ├── TwitterStatusClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── HomeTimelineParameters.scala
│ │ │ │ │ ├── LookupParameters.scala
│ │ │ │ │ ├── MentionsParameters.scala
│ │ │ │ │ ├── OEmbedParameters.scala
│ │ │ │ │ ├── PostParameters.scala
│ │ │ │ │ ├── RetweetersIdsParameters.scala
│ │ │ │ │ ├── RetweetsOfMeParameters.scala
│ │ │ │ │ ├── RetweetsParameters.scala
│ │ │ │ │ ├── ShowParameters.scala
│ │ │ │ │ └── UserTimelineParameters.scala
│ │ │ │ ├── suggestions/
│ │ │ │ │ ├── TwitterSuggestionClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ └── SuggestionsParameters.scala
│ │ │ │ ├── trends/
│ │ │ │ │ ├── TwitterTrendClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── LocationParameters.scala
│ │ │ │ │ └── TrendsParameters.scala
│ │ │ │ ├── users/
│ │ │ │ │ ├── TwitterUserClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── BannersParameters.scala
│ │ │ │ │ ├── UserParameters.scala
│ │ │ │ │ ├── UserSearchParameters.scala
│ │ │ │ │ └── UsersParameters.scala
│ │ │ │ └── v2/
│ │ │ │ ├── tweets/
│ │ │ │ │ ├── TwitterSearchTweetsClient.scala
│ │ │ │ │ ├── TwitterTimelinesClient.scala
│ │ │ │ │ ├── TwitterTweetLookupClient.scala
│ │ │ │ │ └── paramaters/
│ │ │ │ │ ├── SearchTweetsParameters.scala
│ │ │ │ │ ├── TimelineMentionsParameters.scala
│ │ │ │ │ ├── TimelineTweetsParameters.scala
│ │ │ │ │ ├── TweetParameters.scala
│ │ │ │ │ └── TweetsParameters.scala
│ │ │ │ └── users/
│ │ │ │ ├── TwitterUserLookupClient.scala
│ │ │ │ └── parameters/
│ │ │ │ ├── UserByUsernameParameters.scala
│ │ │ │ ├── UserParameters.scala
│ │ │ │ ├── UsersByUsernamesParameters.scala
│ │ │ │ └── UsersParameters.scala
│ │ │ └── streaming/
│ │ │ ├── ErrorHandler.scala
│ │ │ ├── StreamingClient.scala
│ │ │ ├── TwitterStream.scala
│ │ │ ├── sites/
│ │ │ │ ├── TwitterSiteClient.scala
│ │ │ │ └── parameters/
│ │ │ │ └── SiteParameters.scala
│ │ │ ├── statuses/
│ │ │ │ ├── TwitterStatusClient.scala
│ │ │ │ └── parameters/
│ │ │ │ ├── StatusFilters.scala
│ │ │ │ ├── StatusFirehoseParameters.scala
│ │ │ │ └── StatusSampleParameters.scala
│ │ │ └── users/
│ │ │ ├── TwitterUserClient.scala
│ │ │ └── parameters/
│ │ │ └── UserParameters.scala
│ │ ├── marshalling/
│ │ │ ├── BodyEncoder.scala
│ │ │ └── Parameters.scala
│ │ ├── oauth/
│ │ │ └── OAuth1Provider.scala
│ │ ├── package.scala
│ │ └── serializers/
│ │ ├── CustomFormats.scala
│ │ ├── EnumFormats.scala
│ │ ├── FormSupport.scala
│ │ ├── FormatsComposer.scala
│ │ ├── JsonSupport.scala
│ │ └── StreamingMessageFormats.scala
│ ├── processors/
│ │ └── TwitterProcessor.scala
│ ├── providers/
│ │ ├── ExecutionContextProvider.scala
│ │ └── TokenProvider.scala
│ └── util/
│ ├── Configurations.scala
│ ├── Encoder.scala
│ ├── MediaReader.scala
│ ├── SystemShutdown.scala
│ └── UriHelpers.scala
└── test/
├── resources/
│ ├── fixtures/
│ │ ├── rest/
│ │ │ ├── account/
│ │ │ │ ├── settings.json
│ │ │ │ └── user.json
│ │ │ ├── accountactivity/
│ │ │ │ └── webhook.json
│ │ │ ├── application/
│ │ │ │ └── rate_limits.json
│ │ │ ├── blocks/
│ │ │ │ ├── blocked_users.json
│ │ │ │ ├── ids.json
│ │ │ │ ├── stringified_ids.json
│ │ │ │ └── user.json
│ │ │ ├── directmessages/
│ │ │ │ ├── destroy.json
│ │ │ │ ├── event.json
│ │ │ │ ├── list.json
│ │ │ │ ├── new.json
│ │ │ │ ├── received.json
│ │ │ │ ├── sent.json
│ │ │ │ └── show.json
│ │ │ ├── favorites/
│ │ │ │ ├── favorite.json
│ │ │ │ ├── favorites.json
│ │ │ │ └── unfavorite.json
│ │ │ ├── followers/
│ │ │ │ ├── followers.json
│ │ │ │ ├── followers_ids.json
│ │ │ │ └── followers_ids_stringified.json
│ │ │ ├── friends/
│ │ │ │ ├── friends_ids.json
│ │ │ │ ├── friends_ids_stringified.json
│ │ │ │ └── users.json
│ │ │ ├── friendships/
│ │ │ │ ├── blocked_users.json
│ │ │ │ ├── blocked_users_stringified.json
│ │ │ │ ├── follow.json
│ │ │ │ ├── incoming_friendships_ids.json
│ │ │ │ ├── incoming_friendships_ids_stringified.json
│ │ │ │ ├── outgoing_friendships_ids.json
│ │ │ │ ├── outgoing_friendships_ids_stringified.json
│ │ │ │ ├── relationship.json
│ │ │ │ ├── relationships.json
│ │ │ │ ├── unfollow.json
│ │ │ │ └── update.json
│ │ │ ├── geo/
│ │ │ │ ├── advanced_search.json
│ │ │ │ ├── geo_place.json
│ │ │ │ ├── reverse_geocode.json
│ │ │ │ └── search.json
│ │ │ ├── help/
│ │ │ │ ├── configuration.json
│ │ │ │ ├── languages.json
│ │ │ │ ├── privacy.json
│ │ │ │ └── tos.json
│ │ │ ├── lists/
│ │ │ │ ├── create.json
│ │ │ │ ├── destroy.json
│ │ │ │ ├── lists.json
│ │ │ │ ├── member.json
│ │ │ │ ├── members.json
│ │ │ │ ├── memberships.json
│ │ │ │ ├── ownerships.json
│ │ │ │ ├── show.json
│ │ │ │ ├── subscribers.json
│ │ │ │ ├── subscriptions.json
│ │ │ │ └── timeline.json
│ │ │ ├── media/
│ │ │ │ ├── img_media_details.json
│ │ │ │ └── media_details.json
│ │ │ ├── mutes/
│ │ │ │ ├── muted_users_ids.json
│ │ │ │ ├── user.json
│ │ │ │ └── users.json
│ │ │ ├── savedsearches/
│ │ │ │ ├── create.json
│ │ │ │ ├── destroy.json
│ │ │ │ ├── list.json
│ │ │ │ └── show.json
│ │ │ ├── search/
│ │ │ │ └── tweets.json
│ │ │ ├── statuses/
│ │ │ │ ├── destroy.json
│ │ │ │ ├── direct_message.json
│ │ │ │ ├── home_timeline.json
│ │ │ │ ├── lookup.json
│ │ │ │ ├── lookup_extended.json
│ │ │ │ ├── lookup_mapped.json
│ │ │ │ ├── lookup_mapped_extended.json
│ │ │ │ ├── mentions_timeline.json
│ │ │ │ ├── oembed.json
│ │ │ │ ├── retweet.json
│ │ │ │ ├── retweeters_ids.json
│ │ │ │ ├── retweeters_ids_stringified.json
│ │ │ │ ├── retweets.json
│ │ │ │ ├── retweets_of_me.json
│ │ │ │ ├── show.json
│ │ │ │ ├── update.json
│ │ │ │ └── user_timeline.json
│ │ │ ├── suggestions/
│ │ │ │ ├── categories.json
│ │ │ │ ├── slug_suggestions.json
│ │ │ │ └── suggestions_members.json
│ │ │ ├── trends/
│ │ │ │ ├── available_locations.json
│ │ │ │ ├── closest_locations.json
│ │ │ │ └── trends.json
│ │ │ └── users/
│ │ │ ├── profile_banner.json
│ │ │ ├── user.json
│ │ │ └── users.json
│ │ └── streaming/
│ │ ├── common/
│ │ │ ├── disconnect_messages.json
│ │ │ ├── limit_notices.json
│ │ │ ├── location_deletion_notices.json
│ │ │ ├── status_deletion_notices.json
│ │ │ ├── status_withheld_notices.json
│ │ │ ├── tweets.json
│ │ │ ├── user_withheld_notices.json
│ │ │ └── warning_messages.json
│ │ ├── site/
│ │ │ ├── control_messages.json
│ │ │ ├── user_envelop_direct_message.json
│ │ │ ├── user_envelop_direct_message_stringified.json
│ │ │ ├── user_envelop_simple_event.json
│ │ │ ├── user_envelop_simple_event_stringified.json
│ │ │ ├── user_envelop_tweet.json
│ │ │ ├── user_envelop_tweet_event.json
│ │ │ ├── user_envelop_tweet_event_stringified.json
│ │ │ ├── user_envelop_tweet_stringified.json
│ │ │ ├── user_envelop_twitter_list_event.json
│ │ │ ├── user_envelop_twitter_list_event_stringified.json
│ │ │ ├── user_envelop_warning_message.json
│ │ │ ├── user_envelop_warning_message_stringified.json
│ │ │ ├── user_envelops_friends_list.json
│ │ │ └── user_envelops_friends_list_stringified.json
│ │ └── user/
│ │ ├── direct_messages.json
│ │ ├── events.json
│ │ ├── friends_lists.json
│ │ └── friends_lists_stringified.json
│ └── twitter/
│ ├── authentication/
│ │ ├── access_token.txt
│ │ └── request_token.txt
│ ├── rest/
│ │ ├── account/
│ │ │ ├── settings.json
│ │ │ └── user.json
│ │ ├── accountactivity/
│ │ │ └── webhook.json
│ │ ├── application/
│ │ │ └── rate_limits.json
│ │ ├── blocks/
│ │ │ ├── blocked_users.json
│ │ │ ├── ids.json
│ │ │ ├── stringified_ids.json
│ │ │ └── user.json
│ │ ├── directmessages/
│ │ │ ├── destroy.json
│ │ │ ├── event.json
│ │ │ ├── list.json
│ │ │ ├── new.json
│ │ │ ├── received.json
│ │ │ ├── sent.json
│ │ │ └── show.json
│ │ ├── favorites/
│ │ │ ├── favorite.json
│ │ │ ├── favorites.json
│ │ │ └── unfavorite.json
│ │ ├── followers/
│ │ │ ├── followers.json
│ │ │ ├── followers_ids.json
│ │ │ └── followers_ids_stringified.json
│ │ ├── friends/
│ │ │ ├── friends_ids.json
│ │ │ ├── friends_ids_stringified.json
│ │ │ └── users.json
│ │ ├── friendships/
│ │ │ ├── blocked_users.json
│ │ │ ├── blocked_users_stringified.json
│ │ │ ├── follow.json
│ │ │ ├── incoming_friendships_ids.json
│ │ │ ├── incoming_friendships_ids_stringified.json
│ │ │ ├── outgoing_friendships_ids.json
│ │ │ ├── outgoing_friendships_ids_stringified.json
│ │ │ ├── relationship.json
│ │ │ ├── relationships.json
│ │ │ ├── unfollow.json
│ │ │ └── update.json
│ │ ├── geo/
│ │ │ ├── advanced_search.json
│ │ │ ├── geo_place.json
│ │ │ ├── reverse_geocode.json
│ │ │ └── search.json
│ │ ├── help/
│ │ │ ├── configuration.json
│ │ │ ├── languages.json
│ │ │ ├── privacy.json
│ │ │ └── tos.json
│ │ ├── lists/
│ │ │ ├── create.json
│ │ │ ├── destroy.json
│ │ │ ├── lists.json
│ │ │ ├── member.json
│ │ │ ├── members.json
│ │ │ ├── memberships.json
│ │ │ ├── ownerships.json
│ │ │ ├── show.json
│ │ │ ├── subscribers.json
│ │ │ ├── subscriptions.json
│ │ │ └── timeline.json
│ │ ├── media/
│ │ │ └── media_details.json
│ │ ├── mutes/
│ │ │ ├── muted_users_ids.json
│ │ │ ├── user.json
│ │ │ └── users.json
│ │ ├── savedsearches/
│ │ │ ├── create.json
│ │ │ ├── destroy.json
│ │ │ ├── list.json
│ │ │ └── show.json
│ │ ├── search/
│ │ │ └── tweets.json
│ │ ├── statuses/
│ │ │ ├── destroy.json
│ │ │ ├── direct_message.json
│ │ │ ├── home_timeline.json
│ │ │ ├── lookup.json
│ │ │ ├── lookup_extended.json
│ │ │ ├── lookup_mapped.json
│ │ │ ├── lookup_mapped_extended.json
│ │ │ ├── mentions_timeline.json
│ │ │ ├── oembed.json
│ │ │ ├── retweet.json
│ │ │ ├── retweeters_ids.json
│ │ │ ├── retweeters_ids_stringified.json
│ │ │ ├── retweets.json
│ │ │ ├── retweets_of_me.json
│ │ │ ├── show.json
│ │ │ ├── update.json
│ │ │ └── user_timeline.json
│ │ ├── suggestions/
│ │ │ ├── categories.json
│ │ │ ├── slug_suggestions.json
│ │ │ └── suggestions_members.json
│ │ ├── trends/
│ │ │ ├── available_locations.json
│ │ │ ├── closest_locations.json
│ │ │ └── trends.json
│ │ ├── users/
│ │ │ ├── empty-user-profile-url.json
│ │ │ ├── profile_banner.json
│ │ │ ├── user.json
│ │ │ └── users.json
│ │ └── v2/
│ │ ├── tweets/
│ │ │ ├── tweet.json
│ │ │ └── tweets.json
│ │ └── users/
│ │ ├── user.json
│ │ └── users.json
│ └── streaming/
│ ├── common/
│ │ ├── disconnect_messages.json
│ │ ├── limit_notices.json
│ │ ├── location_deletion_notices.json
│ │ ├── status_deletion_notices.json
│ │ ├── status_withheld_notices.json
│ │ ├── tweets.json
│ │ ├── user_withheld_notices.json
│ │ └── warning_messages.json
│ ├── site/
│ │ ├── control_messages.json
│ │ ├── user_envelop_direct_message.json
│ │ ├── user_envelop_direct_message_stringified.json
│ │ ├── user_envelop_simple_event.json
│ │ ├── user_envelop_simple_event_stringified.json
│ │ ├── user_envelop_tweet.json
│ │ ├── user_envelop_tweet_event.json
│ │ ├── user_envelop_tweet_event_stringified.json
│ │ ├── user_envelop_tweet_stringified.json
│ │ ├── user_envelop_twitter_list_event.json
│ │ ├── user_envelop_twitter_list_event_stringified.json
│ │ ├── user_envelop_warning_message.json
│ │ ├── user_envelop_warning_message_stringified.json
│ │ ├── user_envelops_friends_list.json
│ │ └── user_envelops_friends_list_stringified.json
│ └── user/
│ ├── direct_messages.json
│ ├── events.json
│ ├── friends_lists.json
│ └── friends_lists_stringified.json
└── scala/
└── com/
└── danielasfregola/
└── twitter4s/
├── entities/
│ ├── DeserializationRoundtripSpec.scala
│ ├── ProfileImageSpec.scala
│ ├── RateLimitSpec.scala
│ └── SerializationRoundtripSpec.scala
├── helpers/
│ ├── AwaitableFuture.scala
│ ├── ClientSpec.scala
│ ├── FixturesSupport.scala
│ ├── JsonDiffSupport.scala
│ ├── RequestDSL.scala
│ ├── Spec.scala
│ ├── TestActorSystem.scala
│ └── TestExecutionContext.scala
├── http/
│ ├── clients/
│ │ ├── authentication/
│ │ │ └── oauth/
│ │ │ └── TwitterOAuthClientSpec.scala
│ │ ├── rest/
│ │ │ ├── RestClientSpec.scala
│ │ │ ├── account/
│ │ │ │ └── TwitterAccountClientSpec.scala
│ │ │ ├── accountactivity/
│ │ │ │ └── TwitterAccountActivityClientSpec.scala
│ │ │ ├── application/
│ │ │ │ └── TwitterApplicationClientSpec.scala
│ │ │ ├── blocks/
│ │ │ │ └── TwitterBlockClientSpec.scala
│ │ │ ├── directmessages/
│ │ │ │ └── TwitterDirectMessageClientSpec.scala
│ │ │ ├── favorites/
│ │ │ │ └── TwitterFavoriteClientSpec.scala
│ │ │ ├── followers/
│ │ │ │ └── TwitterFollowerClientSpec.scala
│ │ │ ├── friends/
│ │ │ │ └── TwitterFriendClientSpec.scala
│ │ │ ├── friendships/
│ │ │ │ └── TwitterFriendshipClientSpec.scala
│ │ │ ├── geo/
│ │ │ │ └── TwitterGeoClientSpec.scala
│ │ │ ├── help/
│ │ │ │ └── TwitterHelpClientSpec.scala
│ │ │ ├── lists/
│ │ │ │ └── TwitterListClientSpec.scala
│ │ │ ├── media/
│ │ │ │ └── TwitterMediaClientSpec.scala
│ │ │ ├── mutes/
│ │ │ │ └── TwitterMuteClientSpec.scala
│ │ │ ├── savedsearches/
│ │ │ │ └── TwitterSavedSearchClientSpec.scala
│ │ │ ├── search/
│ │ │ │ └── TwitterSearchClientSpec.scala
│ │ │ ├── statuses/
│ │ │ │ ├── TwitterStatusClientSpec.scala
│ │ │ │ └── parameters/
│ │ │ │ ├── HomeTimelineParametersSpec.scala
│ │ │ │ ├── LookupParametersSpec.scala
│ │ │ │ ├── MentionsParametersSpec.scala
│ │ │ │ ├── OEmbedParametersSpec.scala
│ │ │ │ ├── PostParametersSpec.scala
│ │ │ │ ├── RetweetersIdsParametersSpec.scala
│ │ │ │ ├── RetweetsOfMeParametersSpec.scala
│ │ │ │ ├── RetweetsParametersSpec.scala
│ │ │ │ ├── ShowParametersSpec.scala
│ │ │ │ └── UserTimelineParametersSpec.scala
│ │ │ ├── suggestions/
│ │ │ │ └── TwitterSuggestionClientSpec.scala
│ │ │ ├── trends/
│ │ │ │ └── TwitterTrendClientSpec.scala
│ │ │ ├── users/
│ │ │ │ └── TwitterUserClientSpec.scala
│ │ │ └── v2/
│ │ │ ├── tweets/
│ │ │ │ ├── TwitterSearchTweetsClientSpec.scala
│ │ │ │ ├── TwitterTimelinesClientSpec.scala
│ │ │ │ ├── TwitterTweetLookupClientSpec.scala
│ │ │ │ └── deserialization/
│ │ │ │ ├── TweetsDeserializationSpec.scala
│ │ │ │ └── fixtures/
│ │ │ │ ├── TweetResponseFixture.scala
│ │ │ │ └── TweetsResponseFixture.scala
│ │ │ ├── users/
│ │ │ │ ├── TwitterUserLookupClientSpec.scala
│ │ │ │ └── deserialization/
│ │ │ │ ├── UsersResponseDeserializationSpec.scala
│ │ │ │ └── fixtures/
│ │ │ │ ├── UserResponseFixture.scala
│ │ │ │ └── UsersResponseFixture.scala
│ │ │ └── utils/
│ │ │ └── V2SpecQueryHelper.scala
│ │ └── streaming/
│ │ ├── StreamingClientSpec.scala
│ │ ├── sites/
│ │ │ └── TwitterSiteClientSpec.scala
│ │ ├── statuses/
│ │ │ └── TwitterStatusClientSpec.scala
│ │ └── users/
│ │ └── TwitterUserClientSpec.scala
│ ├── marshalling/
│ │ └── BodyEncoderSpec.scala
│ ├── oauth/
│ │ └── OAuth1ProviderSpec.scala
│ ├── packageHttpSpec.scala
│ └── serializers/
│ └── FormSupportSpec.scala
└── util/
├── ConfigurationDetectorSpec.scala
├── EncoderSpec.scala
└── UriHelpersSpec.scala
================================================
FILE CONTENTS
================================================
================================================
FILE: .circleci/config.yml
================================================
# Scala CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/sample-config/ for more details
#
version: 2
jobs:
build:
docker:
# specify the version you desire here
- image: circleci/openjdk:15-jdk-buster
# Specify service dependencies here if necessary
# CircleCI maintains a library of pre-built images
# documented at https://circleci.com/docs/2.0/circleci-images/
# - image: circleci/postgres:9.4
working_directory: ~/repo
environment:
# Customize the JVM maximum heap limit
JVM_OPTS: -Xmx3200m
TERM: dumb
steps:
- checkout
# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "build.sbt" }}
# fallback to using the latest cache if no exact match is found
- v1-dependencies-
- run:
name:
Check Formatting
command:
cat /dev/null | sbt scalafmt::test test:scalafmt::test sbt:scalafmt::test
- run:
name:
Compile
command:
cat /dev/null | sbt test:compile
- save_cache:
paths:
- ~/.m2
key: v1-dependencies--{{ checksum "build.sbt" }}
# run tests!
- run:
name:
Test
command:
cat /dev/null | sbt test:test
================================================
FILE: .gitignore
================================================
# Created by .ignore support plugin (hsz.mobi)
### SBT template
# Simple Build Tool
# http://www.scala-sbt.org/release/docs/Getting-Started/Directories.html#configuring-version-control
target/
lib_managed/
src_managed/
project/boot/
.history
.cache
### Scala template
*.class
*.log
# sbt specific
.cache
.history
.lib/
dist/*
target/
lib_managed/
src_managed/
project/boot/
project/plugins/project/
# Scala-IDE specific
.scala_dependencies
.worksheet
.idea
.bsp
================================================
FILE: .mergify.yml
================================================
pull_request_rules:
- name: automatically merge scala-steward's PRs
conditions:
- author=scala-steward
- "status-success=ci/circleci: validate"
actions:
merge:
method: merge
comment:
message: "Thank you Scala Steward! :heart:"
================================================
FILE: .scalafmt.conf
================================================
maxColumn = 120
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
twitter4s
=========
[](https://index.scala-lang.org/danielasfregola/twitter4s/twitter4s)
[](https://circleci.com/gh/DanielaSfregola/twitter4s/tree/main) [](http://codecov.io/github/DanielaSfregola/twitter4s?branch=master) [](http://www.apache.org/licenses/LICENSE-2.0.txt) [](https://scala-steward.org) [](https://gitter.im/twitter4s/Lobby)
An asynchronous non-blocking Scala Twitter Client, implemented using Akka-Http and json4s.
Prerequisites
-------------
* JDK 8
* Scala 2.12+
- Go to https://developer.twitter.com/, login with your twitter account and register your application to get a consumer key and a consumer secret.
- Once the app has been created, generate a access key and access secret with the desired permission level.
NOTE: v1.1 endpoints are unaccessible for new users. More information at https://twittercommunity.com/t/ushering-in-a-new-era-for-the-twitter-developer-platform-with-the-twitter-api-v2/162087
Rate Limits
-----------
Be aware that the Twitter REST Api has rate limits specific to each endpoint. For more information, please have a look at the Twitter developers website [here](https://developer.twitter.com/en/docs/basics/rate-limiting).
For all the endpoints that are affected these limitations, information on the current rates together with the requested data is provided by the [RatedData](http://danielasfregola.github.io/twitter4s/5.5/api/com/danielasfregola/twitter4s/entities/RatedData.html) case class.
Setup
-----
If you don't have it already, make sure you add the Maven Central as resolver in your SBT settings:
```scala
resolvers += Resolver.sonatypeRepo("releases")
```
Also, you need to include the library as your dependency:
```scala
libraryDependencies += "com.danielasfregola" %% "twitter4s" % "8.0"
```
Giter8
------
If you are starting from scratch, you can use [`twitter4s.g8`](https://github.com/DanielaSfregola/twitter4s.g8) template to start your project. This template contains examples for both REST and Streaming client.
```bash
> sbt new DanielaSfregola/twitter4s.g8
```
Usage
-----
Add your consumer and access token as either environment variables or as part of your configuration.
Twitter4s will look for the following environment variables:
```bash
export TWITTER_CONSUMER_TOKEN_KEY='my-consumer-key'
export TWITTER_CONSUMER_TOKEN_SECRET='my-consumer-secret'
export TWITTER_ACCESS_TOKEN_KEY='my-access-key'
export TWITTER_ACCESS_TOKEN_SECRET='my-access-secret'
```
You can also add them to your configuration file, usually called `application.conf`:
```scala
twitter {
consumer {
key = "my-consumer-key"
secret = "my-consumer-secret"
}
access {
key = "my-access-key"
secret = "my-access-secret"
}
}
```
These configurations will be automatically loaded when creating a twitter client, so all you have to do is to initialize your clients as following:
```scala
import com.danielasfregola.twitter4s.TwitterRestClient
import com.danielasfregola.twitter4s.TwitterStreamingClient
val restClient = TwitterRestClient()
val streamingClient = TwitterStreamingClient()
```
Alternatively, you can also specify your tokens directly when creating the client:
```scala
import com.danielasfregola.twitter4s.TwitterRestClient
import com.danielasfregola.twitter4s.TwitterStreamingClient
import com.danielasfregola.twitter4s.entities.{AccessToken, ConsumerToken}
val consumerToken = ConsumerToken(key = "my-consumer-key", secret = "my-consumer-secret")
val accessToken = AccessToken(key = "my-access-key", secret = "my-access-secret")
val restClient = TwitterRestClient(consumerToken, accessToken)
val streamingClient = TwitterStreamingClient(consumerToken, accessToken)
```
Once you have instantiated your client you are ready to use it! :smile:
Twitter Streaming Client
-----------------------
[TwitterStreamingClient](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/TwitterStreamingClient) is the client to support stream connections offered by the Twitter Streaming Api.
You can initialize the client as follows:
```scala
import com.danielasfregola.twitter4s.TwitterStreamingClient
val client = TwitterStreamingClient()
```
There are three types of streams, each with different streaming message types: [Public Stream](https://github.com/DanielaSfregola/twitter4s#public-stream), [User Stream](https://github.com/DanielaSfregola/twitter4s#user-stream), [Site Stream](https://github.com/DanielaSfregola/twitter4s#site-stream).
Each stream requires a partial function that indicates how to process messages. If a message type is not specified, it is ignored. See the section of each stream for more information.
For example, you can create the following function to print the text of a tweet:
```scala
import com.danielasfregola.twitter4s.entities.Tweet
import com.danielasfregola.twitter4s.entities.streaming.StreamingMessage
def printTweetText: PartialFunction[StreamingMessage, Unit] = {
case tweet: Tweet => println(tweet.text)
}
```
All you need to do is attach your processing function to the stream:
```scala
client.sampleStatuses(stall_warnings = true)(printTweetText)
```
...and you are done, happy days! :dancers:
Have a look at [TwitterProcessor](https://github.com/DanielaSfregola/twitter4s/blob/master/src/main/scala/com/danielasfregola/twitter4s/processors/TwitterProcessor.scala) for some predefined processing functions.
### Close or Replace a Stream
Each stream function returns a `Future[TwitterStream]`.
`TwitterStream` represents the stream received by Twitter and it can be used to close or replace the current stream.
For example, consider the following snippet:
```scala
// TERRIBLE CODE! NEVER BLOCK! Code for demo purposes only!
def simulateNextActionAfterMillis(millis: Long): Future[Unit] = Future{ Thread.sleep(millis); println() }
for {
streamA <- client.sampleStatuses(languages = Seq(Language.English)){ case t: Tweet => print("o")}
_ <- simulateNextActionAfterMillis(10000)
streamB <- streamA.sampleStatuses(languages = Seq(Language.Spanish)){ case t: Tweet => print("+")}
_ <- simulateNextActionAfterMillis(10000)
} yield streamB.close()
```
The above code can output something similar to the following:
```bash
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
+++++++++++++++
```
In this example, we can see that there are more English tweets than Spanish tweets.
### Public Stream
Have a look at the complete scaladoc for the [Public Stream Client](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/streaming/statuses/TwitterStatusClient).
#### Available streams
- filterStatusesFilter
- sampleStatusesSample
- firehoseStatuses
#### CommonStreamingMessage types:
- [Tweet](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/Tweet)
- [DisconnectMessage](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/common/DisconnectMessage)
- [LimitNotice](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/common/LimitNotice)
- [LocationDeletionNotice](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/common/LocationDeletionNotice)
- [StatusDeletionNotice](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/common/StatusDeletionNotice)
- [StatusWithheldNotice](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/common/StatusWithheldNotice)
- [UserWithheldNotice](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/common/UserWithheldNotice)
- [WarningMessage](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/common/WarningMessage)
### User Stream
Have a look at the complete scaladoc for the [User Stream Client](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/streaming/users/TwitterUserClient).
#### Available streams
- userEvents
#### UserStreamingMessage types:
- All the instances of `CommonStreamingMessage` -- see the [Public Stream Section](https://github.com/DanielaSfregola/twitter4s#public-stream)
- [FriendsLists](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/user/FriendsLists) and [FriendsListsStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/user/FriendsListsStringified)
- [SimpleEvent](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/user/SimpleEvent)
- [TweetEvent](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/user/TweetEvent)
- [TwitterListEvent](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/user/TwitterListEvent)
### Site Stream
Have a look at the complete scaladoc for the [Site Stream Client](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/streaming/sites/TwitterSiteClient).
#### Available streams
- siteEvents
#### SiteStreamingMessage types:
- All the `CommonStreamingMessage`s -- see the [Public Stream Section](https://github.com/DanielaSfregola/twitter4s#public-stream)
- [ControlMessage](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/ControlMessage)
- [UserEnvelopTweet](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopTweet) and [UserEnvelopTweetStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopTweetStringified)
- [UserEnvelopDirectMessage](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopDirectMessage) and [UserEnvelopDirectMessageStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopDirectMessageStringified)
- [UserEnvelopSimpleEvent](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopSimpleEvent) and [UserEnvelopSimpleEventStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopSimpleEventStringified)
- [UserEnvelopTweetEvent](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopTweetEvent) and [UserEnvelopTweetEventStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopTweetEventStringified)
- [UserEnvelopTwitterListEvent](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopTwitterListEvent) and [UserEnvelopTwitterListEventStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopTwitterListEventStringified)
- [UserEnvelopFriendsLists](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopFriendsLists) and [UserEnvelopFriendsListsEventStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopFriendsListsStringified)
- [UserEnvelopWarningMessage](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopWarningMessage) and [UserEnvelopWarningMessageStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopWarningMessageStringified)
### Documentation
The complete scaladoc with all the available streams for the `TwitterStreamingClient` can be found [here](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/TwitterStreamingClient).
Twitter REST Client
-------------------
[TwitterRestClient](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/TwitterRestClient) is the client for the REST endpoints offered by the Twitter REST Api.
Once you have configured your consumer and access token, you can initialize an instance of `TwitterRestClient` as follows:
```scala
import com.danielasfregola.twitter4s.TwitterRestClient
val client = TwitterRestClient()
```
For example, you can get the home timeline of the authenticated user:
```scala
client.homeTimeline()
```
or you can get the timeline of a specific user:
```scala
client.userTimelineForUser("DanielaSfregola")
```
You can also update your tweet status:
```scala
client.tweet(status = "Test")
```
Asynchronous upload of images or short videos is also supported:
```scala
for {
upload <- client.uploadMediaFromPath("/path/to/file.png")
tweet <- client.tweet(status = "Test with media", media_ids = Seq(upload.media_id))
} yield tweet
```
### Documentation
The complete scaladoc with all the available functionalities for the `TwitterRestClient` can be found [here](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/TwitterRestClient).
[TwitterRestClient](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/TwitterRestClient) is composed by several traits. A list of the supported resources is following:
- [account](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/account/TwitterAccountClient)
- [application](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/application/TwitterApplicationClient)
- [blocks](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/blocks/TwitterBlockClient)
- [direct_messages](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/directmessages/TwitterDirectMessageClient)
- [favorites](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/favorites/TwitterFavoriteClient)
- [followers](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/followers/TwitterFollowerClient)
- [friends](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/friends/TwitterFriendClient)
- [friendships](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/friendships/TwitterFriendshipClient)
- [geo](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/geo/TwitterGeoClient)
- [help](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/help/TwitterHelpClient)
- [lists](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/lists/TwitterListClient)
- [mutes](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/mutes/TwitterMuteClient)
- [saved_searches](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/savedsearches/TwitterSavedSearchClient)
- [searches](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/search/TwitterSearchClient)
- [statuses](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/statuses/TwitterStatusClient)
- [suggestions](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/suggestions/TwitterSuggestionClient)
- [users](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/users/TwitterUserClient)
- [trends](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/trends/TwitterTrendClient)
- [media](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/media/TwitterMediaClient)
Proxy Support
-------------
If needed, you can redefine the domain used for each of the twitter api by overriding the following settings in your configuration file:
```scala
twitter {
rest {
api = "https://api.twitter.com"
media = "https://upload.twitter.com"
}
streaming {
public = "https://stream.twitter.com"
user = "https://userstream.twitter.com"
site = "https://sitestream.twitter.com"
}
}
```
Logging
-------
Twitter4s uses [scala-logging](https://github.com/typesafehub/scala-logging) and can be used in your `twitter4s` application.
In your application you will need a logging backend (logback, logstash). [logback-classic](https://github.com/qos-ch/logback) is easy to use and will suit most needs.
You can find a sample configuration in [twitter4s-demo](https://github.com/DanielaSfregola/twitter4s-demo) and in the Giter8 template [twitter4s.g8](https://github.com/DanielaSfregola/twitter4s.g8)
Examples
--------
Have a look at the repository [twitter4s-demo](https://github.com/DanielaSfregola/twitter4s-demo) for more examples on how to use `twitter4s`.
Snapshot Versions
-----------------
To use a snapshot version of this library, make sure you have the resolver for maven central (snapshot repositories) in your SBT settings:
```scala
resolvers += Resolver.sonatypeRepo("snapshots")
```
Then, add the library as your dependency:
```scala
libraryDependencies += "com.danielasfregola" %% "twitter4s" % "8.1-SNAPSHOT"
```
Coming up Features
---------------
- OAuth1 support
- Advanced query support
- Support for dump to file
- ...
How to Contribute
-----------------
Contributions and feature requests are always welcome!
- Fork the repo and checkout the code
- Make sure to run sbt with jdk8+
- Run the tests with `sbt test`
- ...you can now do your magic and submit a PR when you are ready! :dancers:
================================================
FILE: build.sbt
================================================
import com.typesafe.sbt.SbtGit.{GitKeys => git}
enablePlugins(GhpagesPlugin, SiteScaladocPlugin)
name := "twitter4s"
version := "8.1-SNAPSHOT"
scalaVersion := "2.13.6"
resolvers ++= Seq(
Resolver.sonatypeRepo("releases"),
Resolver.jcenterRepo
)
libraryDependencies ++= {
val Typesafe = "1.4.2"
val Akka = "2.6.19"
val AkkaHttp = "10.2.9"
val AkkaHttpJson4s = "1.39.2"
val Json4s = "4.0.5"
val Specs2 = "4.15.0"
val ScalaLogging = "3.9.4"
val RandomDataGenerator = "2.8"
Seq(
"com.typesafe" % "config" % Typesafe,
"com.typesafe.akka" %% "akka-actor" % Akka,
"com.typesafe.akka" %% "akka-stream" % Akka,
"com.typesafe.akka" %% "akka-http" % AkkaHttp,
"de.heikoseeberger" %% "akka-http-json4s" % AkkaHttpJson4s,
"org.json4s" %% "json4s-native" % Json4s,
"org.json4s" %% "json4s-ext" % Json4s,
"com.typesafe.scala-logging" %% "scala-logging" % ScalaLogging,
"org.specs2" %% "specs2-core" % Specs2 % "test",
"org.specs2" %% "specs2-mock" % Specs2 % "test",
"com.typesafe.akka" %% "akka-testkit" % Akka % "test",
"com.danielasfregola" %% "random-data-generator" % RandomDataGenerator % "test"
)
}
ThisBuild / scalacOptions ++= Seq("-language:postfixOps",
"-language:implicitConversions",
"-language:existentials",
"-Xfatal-warnings",
"-feature",
"-deprecation:false")
lazy val standardSettings = Seq(
organization := "com.danielasfregola",
licenses += ("Apache-2.0", url("http://www.apache.org/licenses/LICENSE-2.0.html")),
homepage := Some(url("https://github.com/DanielaSfregola/twitter4s")),
scmInfo := Some(
ScmInfo(url("https://github.com/DanielaSfregola/twitter4s"),
"scm:git:git@github.com:DanielaSfregola/twitter4s.git")),
apiURL := Some(url("http://DanielaSfregola.github.io/twitter4s/latest/api/")),
crossScalaVersions := Seq(scalaVersion.value, "2.12.15"),
pomExtra :=
<developers>
<developer>
<id>DanielaSfregola</id>
<name>Daniela Sfregola</name>
<url>http://danielasfregola.com/</url>
</developer>
</developers>,
publishMavenStyle := true,
publishTo := {
if (version.value.trim.endsWith("SNAPSHOT")) Some(Opts.resolver.sonatypeSnapshots)
else Some(Opts.resolver.sonatypeStaging)
},
git.gitRemoteRepo := "git@github.com:DanielaSfregola/twitter4s.git",
scalacOptions ++= Seq(
"-encoding",
"UTF-8",
"-Xlint",
"-deprecation:false",
"-Xfatal-warnings",
"-feature",
"-language:postfixOps",
"-unchecked"
),
Compile / doc / scalacOptions ++= Seq("-sourcepath", baseDirectory.value.getAbsolutePath),
autoAPIMappings := true,
Compile / doc / scalacOptions ++= {
val branch = if (version.value.trim.endsWith("SNAPSHOT")) "master" else version.value
Seq(
"-doc-source-url",
"https://github.com/DanielaSfregola/twitter4s/tree/" + branch + "€{FILE_PATH}.scala"
)
}
)
lazy val coverageSettings = Seq(
coverageExcludedPackages := "com.danielasfregola.twitter4s.processors.*;com.danielasfregola.twitter4s.Twitter*Client",
coverageMinimum := 85
)
ThisBuild / scalafmtOnCompile := true
ThisBuild / scalafmtTestOnCompile := true
SiteScaladoc / siteSubdirName := version + "/api"
lazy val root = (project in file("."))
.settings(standardSettings ++ coverageSettings)
.settings(
name := "twitter4s"
)
================================================
FILE: project/build.properties
================================================
sbt.version = 1.6.2
================================================
FILE: project/plugins.sbt
================================================
addSbtPlugin("com.typesafe.sbt" % "sbt-site" % "1.4.1")
addSbtPlugin("com.typesafe.sbt" % "sbt-ghpages" % "0.6.3")
addSbtPlugin("com.github.sbt" % "sbt-unidoc" % "0.5.0")
resolvers += Classpaths.sbtPluginReleases
addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.6.0")
addSbtPlugin("org.scoverage" % "sbt-coveralls" % "1.3.2")
addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "3.9.12")
addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2")
addSbtPlugin("com.lucidchart" % "sbt-scalafmt-coursier" % "1.16")
Test / parallelExecution := false
================================================
FILE: sonatype.sbt
================================================
sonatypeProfileName := "com.danielasfregola"
================================================
FILE: src/main/resources/reference.conf
================================================
twitter {
rest {
api = "https://api.twitter.com"
media = "https://upload.twitter.com"
}
streaming {
public = "https://stream.twitter.com"
user = "https://userstream.twitter.com"
site = "https://sitestream.twitter.com"
}
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/TwitterAuthenticationClient.scala
================================================
package com.danielasfregola.twitter4s
import akka.actor.ActorSystem
import com.danielasfregola.twitter4s.entities.ConsumerToken
import com.danielasfregola.twitter4s.http.clients.authentication.AuthenticationClient
import com.danielasfregola.twitter4s.http.clients.authentication.oauth.TwitterOAuthClient
import com.danielasfregola.twitter4s.util.Configurations._
import com.danielasfregola.twitter4s.util.SystemShutdown
/** Represents the functionalities offered by the Twitter REST API for authentication
*/
class TwitterAuthenticationClient private (val consumerToken: ConsumerToken)(implicit _system: ActorSystem =
ActorSystem("twitter4s-auth"))
extends TwitterAuthClients
with SystemShutdown {
protected val system = _system
protected val authenticationClient = new AuthenticationClient(consumerToken)
}
trait TwitterAuthClients extends TwitterOAuthClient
object TwitterAuthenticationClient {
def apply(): TwitterAuthenticationClient = {
val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
apply(consumerToken)
}
def apply(consumerToken: ConsumerToken): TwitterAuthenticationClient =
new TwitterAuthenticationClient(consumerToken)
def withActorSystem(system: ActorSystem): TwitterAuthenticationClient = {
val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
withActorSystem(consumerToken)(system)
}
def withActorSystem(consumerToken: ConsumerToken)(system: ActorSystem): TwitterAuthenticationClient =
new TwitterAuthenticationClient(consumerToken)(system)
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/TwitterRestClient.scala
================================================
package com.danielasfregola.twitter4s
import akka.actor.ActorSystem
import com.danielasfregola.twitter4s.entities.{AccessToken, ConsumerToken}
import com.danielasfregola.twitter4s.http.clients.rest.RestClient
import com.danielasfregola.twitter4s.http.clients.rest.account.TwitterAccountClient
import com.danielasfregola.twitter4s.http.clients.rest.accountactivity.TwitterAccountActivityClient
import com.danielasfregola.twitter4s.http.clients.rest.application.TwitterApplicationClient
import com.danielasfregola.twitter4s.http.clients.rest.blocks.TwitterBlockClient
import com.danielasfregola.twitter4s.http.clients.rest.directmessages.TwitterDirectMessageClient
import com.danielasfregola.twitter4s.http.clients.rest.favorites.TwitterFavoriteClient
import com.danielasfregola.twitter4s.http.clients.rest.followers.TwitterFollowerClient
import com.danielasfregola.twitter4s.http.clients.rest.friends.TwitterFriendClient
import com.danielasfregola.twitter4s.http.clients.rest.friendships.TwitterFriendshipClient
import com.danielasfregola.twitter4s.http.clients.rest.geo.TwitterGeoClient
import com.danielasfregola.twitter4s.http.clients.rest.help.TwitterHelpClient
import com.danielasfregola.twitter4s.http.clients.rest.lists.TwitterListClient
import com.danielasfregola.twitter4s.http.clients.rest.media.TwitterMediaClient
import com.danielasfregola.twitter4s.http.clients.rest.mutes.TwitterMuteClient
import com.danielasfregola.twitter4s.http.clients.rest.savedsearches.TwitterSavedSearchClient
import com.danielasfregola.twitter4s.http.clients.rest.search.TwitterSearchClient
import com.danielasfregola.twitter4s.http.clients.rest.statuses.TwitterStatusClient
import com.danielasfregola.twitter4s.http.clients.rest.suggestions.TwitterSuggestionClient
import com.danielasfregola.twitter4s.http.clients.rest.trends.TwitterTrendClient
import com.danielasfregola.twitter4s.http.clients.rest.users.TwitterUserClient
import com.danielasfregola.twitter4s.util.Configurations._
import com.danielasfregola.twitter4s.util.SystemShutdown
/** Represents the functionalities offered by the Twitter REST API
*/
class TwitterRestClient(val consumerToken: ConsumerToken, val accessToken: AccessToken)(implicit _system: ActorSystem =
ActorSystem("twitter4s-rest"))
extends RestClients
with SystemShutdown {
protected val system = _system
protected val restClient = new RestClient(consumerToken, accessToken)
}
trait RestClients
extends TwitterAccountClient
with TwitterAccountActivityClient
with TwitterApplicationClient
with TwitterBlockClient
with TwitterDirectMessageClient
with TwitterFavoriteClient
with TwitterFollowerClient
with TwitterFriendClient
with TwitterFriendshipClient
with TwitterGeoClient
with TwitterHelpClient
with TwitterListClient
with TwitterMediaClient
with TwitterMuteClient
with TwitterSavedSearchClient
with TwitterSearchClient
with TwitterStatusClient
with TwitterSuggestionClient
with TwitterTrendClient
with TwitterUserClient
object TwitterRestClient {
def apply(): TwitterRestClient = {
val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
val accessToken = AccessToken(key = accessTokenKey, secret = accessTokenSecret)
apply(consumerToken, accessToken)
}
def apply(consumerToken: ConsumerToken, accessToken: AccessToken): TwitterRestClient =
new TwitterRestClient(consumerToken, accessToken)
def withActorSystem(system: ActorSystem): TwitterRestClient = {
val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
val accessToken = AccessToken(key = accessTokenKey, secret = accessTokenSecret)
withActorSystem(consumerToken, accessToken)(system)
}
def withActorSystem(consumerToken: ConsumerToken, accessToken: AccessToken)(system: ActorSystem): TwitterRestClient =
new TwitterRestClient(consumerToken, accessToken)(system)
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/TwitterRestV2Client.scala
================================================
package com.danielasfregola.twitter4s
import akka.actor.ActorSystem
import com.danielasfregola.twitter4s.entities.{AccessToken, ConsumerToken}
import com.danielasfregola.twitter4s.http.clients.rest.RestClient
import com.danielasfregola.twitter4s.http.clients.rest.v2.tweets.{
TwitterSearchTweetsClient,
TwitterTimelinesClient,
TwitterTweetLookupClient
}
import com.danielasfregola.twitter4s.http.clients.rest.v2.users.TwitterUserLookupClient
import com.danielasfregola.twitter4s.util.Configurations._
import com.danielasfregola.twitter4s.util.SystemShutdown
/** Represents the functionalities offered by the V2 Twitter REST API
*/
class TwitterRestV2Client(val consumerToken: ConsumerToken, val accessToken: AccessToken)(
implicit _system: ActorSystem = ActorSystem("twitter4s-rest-v2"))
extends V2RestClients
with SystemShutdown {
protected val system = _system
protected val restClient = new RestClient(consumerToken, accessToken)
}
trait V2RestClients
extends TwitterTimelinesClient
with TwitterTweetLookupClient
with TwitterSearchTweetsClient
with TwitterUserLookupClient
object TwitterRestV2Client {
def apply(): TwitterRestV2Client = {
val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
val accessToken = AccessToken(key = accessTokenKey, secret = accessTokenSecret)
apply(consumerToken, accessToken)
}
def apply(consumerToken: ConsumerToken, accessToken: AccessToken): TwitterRestV2Client =
new TwitterRestV2Client(consumerToken, accessToken)
def withActorSystem(system: ActorSystem): TwitterRestV2Client = {
val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
val accessToken = AccessToken(key = accessTokenKey, secret = accessTokenSecret)
withActorSystem(consumerToken, accessToken)(system)
}
def withActorSystem(consumerToken: ConsumerToken, accessToken: AccessToken)(
system: ActorSystem): TwitterRestV2Client =
new TwitterRestV2Client(consumerToken, accessToken)(system)
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/TwitterStreamingClient.scala
================================================
package com.danielasfregola.twitter4s
import akka.actor.ActorSystem
import com.danielasfregola.twitter4s.entities.{AccessToken, ConsumerToken}
import com.danielasfregola.twitter4s.http.clients.streaming.StreamingClient
import com.danielasfregola.twitter4s.http.clients.streaming.sites.TwitterSiteClient
import com.danielasfregola.twitter4s.http.clients.streaming.statuses.TwitterStatusClient
import com.danielasfregola.twitter4s.http.clients.streaming.users.TwitterUserClient
import com.danielasfregola.twitter4s.util.Configurations._
import com.danielasfregola.twitter4s.util.SystemShutdown
/** Represents the functionalities offered by the Twitter Streaming API
*/
class TwitterStreamingClient private (val consumerToken: ConsumerToken, val accessToken: AccessToken)(
implicit _system: ActorSystem = ActorSystem("twitter4s-streaming"))
extends StreamingClients
with SystemShutdown {
protected val system = _system
protected val streamingClient = new StreamingClient(consumerToken, accessToken)
}
trait StreamingClients extends TwitterStatusClient with TwitterUserClient with TwitterSiteClient
object TwitterStreamingClient {
def apply(): TwitterStreamingClient = {
val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
val accessToken = AccessToken(key = accessTokenKey, secret = accessTokenSecret)
apply(consumerToken, accessToken)
}
def apply(consumerToken: ConsumerToken, accessToken: AccessToken): TwitterStreamingClient =
new TwitterStreamingClient(consumerToken, accessToken)
def withActorSystem(system: ActorSystem): TwitterStreamingClient = {
val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
val accessToken = AccessToken(key = accessTokenKey, secret = accessTokenSecret)
withActorSystem(consumerToken, accessToken)(system)
}
def withActorSystem(consumerToken: ConsumerToken, accessToken: AccessToken)(
system: ActorSystem): TwitterStreamingClient =
new TwitterStreamingClient(consumerToken, accessToken)(system)
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/AccessToken.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class AccessToken(key: String, secret: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Accuracy.scala
================================================
package com.danielasfregola.twitter4s.entities
import com.danielasfregola.twitter4s.entities.enums.Measure
import com.danielasfregola.twitter4s.entities.enums.Measure.Measure
final case class Accuracy(amount: Int, unit: Measure) {
override def toString = s"$amount$unit"
}
object Accuracy {
val Default = Accuracy(0, Measure.Meter)
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Area.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Area(coordinates: Seq[Seq[Seq[Double]]], `type`: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Banners.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Banners(sizes: Map[String, Banner] = Map.empty)
final case class Banner(h: Int, w: Int, url: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Category.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Category(name: String, slug: String, size: Int)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Configuration.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Configuration(dm_text_character_limit: Long,
characters_reserved_per_media: Int,
max_media_per_upload: Int,
non_username_paths: Seq[String] = Seq.empty,
photo_size_limit: Long,
photo_sizes: Map[String, Size] = Map.empty,
short_url_length: Int,
short_url_length_https: Int)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/ConsumerToken.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class ConsumerToken(key: String, secret: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Contributor.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Contributor(id: Long, id_str: String, screen_name: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Coordinate.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Coordinate(longitude: Double, latitude: Double) {
def toLngLatPair: (Double, Double) =
(longitude, latitude)
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Coordinates.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Coordinates(coordinates: Seq[Double] = Seq.empty, `type`: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/DirectMessage.scala
================================================
package com.danielasfregola.twitter4s.entities
import java.time.Instant
import com.danielasfregola.twitter4s.entities.streaming.UserStreamingMessage
final case class DirectMessage(created_at: Instant,
entities: Option[Entities],
id: Long,
id_str: String,
recipient: User,
recipient_id: Long,
recipient_id_str: String,
recipient_screen_name: String,
sender: User,
sender_id: Long,
sender_id_str: String,
sender_screen_name: String,
text: String)
extends UserStreamingMessage
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/DirectMessageEvent.scala
================================================
package com.danielasfregola.twitter4s.entities
import java.time.Instant
final case class DirectMessageEvent(`type`: String,
id: String,
created_timestamp: Instant,
message_create: MessageCreate)
final case class MessageCreate(target: Target, sender_id: Option[String], message_data: MessageData)
final case class Target(recipient_id: String)
final case class MessageData(text: String, entities: Option[Entities] = None, attachment: Option[Attachment] = None)
final case class Attachment(`type`: String, media: Media)
final case class Apps(id: String, name: String, url: String)
final case class Event(event: DirectMessageEvent, apps: Map[String, App] = Map.empty)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/DirectMessageEventList.scala
================================================
package com.danielasfregola.twitter4s.entities
import com.danielasfregola.twitter4s.entities.streaming.UserStreamingMessage
final case class DirectMessageEventList(events: List[DirectMessageEvent],
apps: Map[String, Apps] = Map.empty,
next_cursor: Option[String])
extends UserStreamingMessage
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Entities.scala
================================================
package com.danielasfregola.twitter4s.entities
// TODO - conversion to clean this representation? see url vs urls
// unfortunately Twitter is not consistent when representing this entity...
final case class Entities(hashtags: Seq[HashTag] = Seq.empty,
media: Seq[Media] = Seq.empty,
symbols: Seq[Symbol] = Seq.empty,
url: Option[Urls] = None,
urls: Seq[UrlDetails] = Seq.empty,
user_mentions: Seq[UserMention] = Seq.empty,
description: Option[Urls] = None)
final case class Urls(urls: Seq[UrlDetails] = Seq.empty)
final case class UrlDetails(url: String, expanded_url: String, display_url: String, indices: Seq[Int])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/ExtendedTweet.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class ExtendedTweet(full_text: String,
display_text_range: Seq[Int] = Seq.empty,
entities: Option[Entities] = None,
extended_entities: Option[Entities] = None)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Geo.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Geo(coordinates: Seq[Double] = Seq.empty, `type`: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/GeoBoundingBox.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class GeoBoundingBox(southwest: Coordinate, northeast: Coordinate) {
def toLngLatPairs: Seq[(Double, Double)] =
Seq(southwest.toLngLatPair, northeast.toLngLatPair)
}
object GeoBoundingBox {
def toLngLatPairs(boundingBoxes: Seq[GeoBoundingBox]): Seq[(Double, Double)] = {
boundingBoxes.flatMap(_.toLngLatPairs)
}
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/GeoCode.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class GeoCode(latitude: Double, longitude: Double, radius: Accuracy) {
override def toString = s"$latitude,$longitude,$radius"
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/GeoPlace.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class GeoPlace(attributes: Map[String, String],
bounding_box: Area,
country: String,
country_code: String,
full_name: String,
id: String,
name: String,
place_type: String,
url: String,
contained_within: Seq[GeoPlace],
centroid: Seq[Double] = Seq.empty,
polylines: Seq[String] = Seq.empty)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/GeoSearch.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class GeoSearch(query: GeoQuery, result: GeoResult)
final case class GeoQuery(params: GeoParams, `type`: String, url: String)
final case class GeoResult(places: Seq[GeoPlace] = Seq.empty)
final case class GeoParams(accuracy: String,
granularity: String,
coordinates: Option[Coordinates] = None,
query: Option[String] = None,
autocomplete: Boolean = false,
trim_place: Boolean = false)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/HashTag.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class HashTag(text: String, indices: Seq[Int])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Image.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Image(w: Int, h: Int, image_type: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/LanguageDetails.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class LanguageDetails(code: String, status: String, name: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Location.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Location(country: String,
countryCode: Option[String],
name: String,
parentid: Long,
placeType: PlaceType,
url: String,
woeid: Long)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/LocationTrends.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class LocationTrends(as_of: String, // TODO - convert to Instant? Different date format here...
created_at: String, // TODO - convert to Instant? Different date format here...
locations: Seq[LocationOverview] = Seq.empty,
trends: Seq[Trend] = Seq.empty)
final case class LocationOverview(name: String, woeid: Long)
// TODO - support 'promoted_content' and 'events'
final case class Trend(name: String, query: String, url: String, tweet_volume: Option[Long])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/LookupEntities.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class LookupEntities(url: LookupUrls, description: LookupUrls)
final case class LookupUrls(urls: Seq[LookupUrl])
final case class LookupUrl(url: String, expanded_url: String, display_url: String, indices: Seq[Int])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/LookupMapped.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class LookupMapped(id: Map[String, Tweet] = Map.empty)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/LookupRelationship.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class LookupRelationship(connections: Seq[String] = Seq.empty,
id: Long,
id_str: String,
name: String,
screen_name: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/LookupTweet.scala
================================================
package com.danielasfregola.twitter4s.entities
import java.time.Instant
final case class LookupTweet(
contributors: Seq[Contributor],
coordinates: Seq[Seq[Seq[Double]]] = Seq.empty,
created_at: Instant,
entities: Option[Entities],
favorite_count: Int = 0,
favorited: Boolean = false,
id: Long,
id_str: String,
in_reply_to_screen_name: Option[String],
in_reply_to_status_id: Option[Long],
in_reply_to_status_id_str: Option[String],
in_reply_to_user_id: Option[Long],
in_reply_to_user_id_str: Option[String],
is_quote_status: Boolean = false,
lang: Option[String],
place: Option[GeoPlace],
possibly_sensitive: Boolean = false,
retweet_count: Long = 0,
retweeted: Boolean = false,
source: String,
text: String,
truncated: Boolean = false,
user: Option[LookupUser]
)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/LookupUser.scala
================================================
package com.danielasfregola.twitter4s.entities
import java.time.Instant
final case class LookupUser(
contributors_enabled: Boolean = false,
created_at: Instant,
default_profile: Boolean = false,
default_profile_image: Boolean = false,
description: Option[String] = None,
entities: Option[LookupEntities] = None,
favourites_count: Int,
follow_request_sent: Boolean = false,
following: Boolean = false,
followers_count: Int,
friends_count: Int,
geo_enabled: Boolean = false,
has_extended_profile: Boolean = false,
id: Long,
id_str: String,
is_translator: Boolean = false,
is_translation_enabled: Boolean = false,
lang: String,
listed_count: Int,
location: Option[String] = None,
name: String,
notifications: Boolean = false,
profile_background_color: String,
profile_background_image_url: String,
profile_background_image_url_https: String,
profile_background_tile: Boolean = false,
profile_banner_url: Option[String] = None,
profile_image_url: Option[ProfileImage],
profile_image_url_https: Option[ProfileImage],
profile_link_color: String,
profile_sidebar_border_color: String,
profile_sidebar_fill_color: String,
profile_text_color: String,
profile_use_background_image: Boolean = false,
`protected`: Boolean = false,
screen_name: String,
statuses_count: Int,
time_zone: Option[String] = None,
url: Option[String] = None,
utc_offset: Option[Int] = None,
verified: Boolean = false,
withheld_in_countries: Option[String] = None,
withheld_scope: Option[String] = None
)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Media.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Media(display_url: String,
expanded_url: String,
id: Long,
id_str: String,
indices: Seq[Int],
media_url: String,
media_url_https: String,
sizes: Map[String, Size],
source_status_id: Option[Long],
source_status_id_str: Option[String],
`type`: String,
url: String,
video_info: Option[VideoInfo])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/MediaDetails.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class MediaDetails(media_id: Long,
media_id_string: String,
expires_after_secs: Option[Int] = None,
size: Option[Long] = None,
image: Option[Image] = None,
video: Option[Video] = None,
processing_info: Option[ProcessingInfo] = None)
final case class ProcessingInfo(state: String,
progress_percent: Option[Long],
check_after_secs: Option[Int],
error: Option[ProcessingError])
final case class ProcessingError(code: Int, name: String, message: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/MediaUpload.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class MediaUpload(media: String, additional_owners: Option[String])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/OEmbedTweet.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class OEmbedTweet(author_name: Option[String],
author_url: Option[String],
cache_age: Option[String],
height: Option[Int],
html: String,
provider_url: Option[String],
provider_name: Option[String],
title: Option[String],
`type`: String,
url: String,
version: String,
width: Option[Int])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/PrivacyPolicy.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class PrivacyPolicy(privacy: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/ProfileImage.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class ProfileImage(mini: String, normal: String, bigger: String, default: String)
object ProfileImage {
def apply(original: String): ProfileImage = {
val mini = resize(original, "_mini")
val normal = resize(original, "_normal")
val big = resize(original, "_bigger")
val default = resize(original, "")
apply(mini, normal, big, default)
}
private def resize(original: String, size: String): String = {
val lastUnderscore = original.lastIndexOf('_')
val lastDot = original.lastIndexOf('.')
val prefix = original.substring(0, lastUnderscore)
val suffix = original.substring(lastDot)
s"$prefix$size$suffix"
}
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/ProfileUpdate.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class ProfileUpdate(name: Option[String] = None,
url: Option[String] = None,
description: Option[String] = None,
location: Option[String] = None,
profile_link_color: Option[String] = None,
include_entities: Boolean = true,
skip_status: Boolean = false)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/RateLimit.scala
================================================
package com.danielasfregola.twitter4s.entities
import java.time.Instant
import akka.http.scaladsl.model.{HttpHeader, StatusCodes}
import com.danielasfregola.twitter4s.exceptions.TwitterException
final case class RateLimit(limit: Int, remaining: Int, reset: Instant)
object RateLimit {
def apply(limit: Int, remaining: Int, reset: Long): RateLimit =
apply(limit, remaining, Instant.ofEpochSecond(reset))
def apply(headers: Seq[HttpHeader]): RateLimit = {
val errorMsg =
s"""Rate Information expected but not found.
|
|Please report it at https://github.com/DanielaSfregola/twitter4s/issues/new
|Headers names were: ${headers.map(_.lowercaseName).mkString(", ")}""".stripMargin
def extractHeaderValue[T](name: String)(f: String => T): T =
headers
.find(_.lowercaseName == name)
.map(h => f(h.value))
.getOrElse(throw TwitterException(StatusCodes.InternalServerError, errorMsg))
val limit = extractHeaderValue("x-rate-limit-limit")(_.toInt)
val remaining = extractHeaderValue("x-rate-limit-remaining")(_.toInt)
val reset = extractHeaderValue("x-rate-limit-reset")(_.toLong)
apply(limit, remaining, reset)
}
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/RateLimits.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class RateLimits(rate_limit_context: RateLimitContext, resources: Resources)
final case class RateLimitContext(access_token: String)
final case class Resources(lists: Map[String, RateLimit] = Map.empty,
application: Map[String, RateLimit] = Map.empty,
mutes: Map[String, RateLimit] = Map.empty,
friendships: Map[String, RateLimit] = Map.empty,
blocks: Map[String, RateLimit] = Map.empty,
geo: Map[String, RateLimit] = Map.empty,
users: Map[String, RateLimit] = Map.empty,
followers: Map[String, RateLimit] = Map.empty,
collections: Map[String, RateLimit] = Map.empty,
statuses: Map[String, RateLimit] = Map.empty,
contacts: Map[String, RateLimit] = Map.empty,
moments: Map[String, RateLimit] = Map.empty,
help: Map[String, RateLimit] = Map.empty,
friends: Map[String, RateLimit] = Map.empty,
direct_messages: Map[String, RateLimit] = Map.empty,
account: Map[String, RateLimit] = Map.empty,
favorites: Map[String, RateLimit] = Map.empty,
device: Map[String, RateLimit] = Map.empty,
saved_searches: Map[String, RateLimit] = Map.empty,
search: Map[String, RateLimit] = Map.empty,
trends: Map[String, RateLimit] = Map.empty)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/RatedData.scala
================================================
package com.danielasfregola.twitter4s.entities
/** A wrapper for data that have rate limitation.
* Have a look at `rate_limit` for more information on current rates usage.
*/
final case class RatedData[T](rate_limit: RateLimit, data: T)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Relationship.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Relationship(relationship: RelationshipOverview)
final case class RelationshipOverview(source: RelationshipSource, target: RelationshipTarget)
final case class RelationshipSource(id: Long,
id_str: String,
screen_name: String,
following: Boolean = false,
followed_by: Boolean = false,
following_received: Boolean = false,
following_requested: Boolean = false,
notifications_enabled: Boolean = false,
can_dm: Boolean = false,
blocking: Boolean = false,
blocked_by: Boolean = false,
muting: Boolean = false,
want_retweets: Boolean = false,
all_replies: Boolean = false,
marked_spam: Boolean = false)
final case class RelationshipTarget(id: Long,
id_str: String,
screen_name: String,
following: Boolean = false,
followed_by: Boolean = false,
following_received: Boolean = false,
following_requested: Boolean = false)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/SavedSearch.scala
================================================
package com.danielasfregola.twitter4s.entities
import java.time.Instant
final case class SavedSearch(created_at: Instant, id: Long, id_str: String, name: String, query: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Settings.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Settings(allow_contributor_request: String,
allow_dm_groups_from: String,
allow_dms_from: String,
always_use_https: Boolean = false,
discoverable_by_email: Boolean = false,
discoverable_by_mobile_phone: Boolean = false,
geo_enabled: Boolean = false,
language: String,
`protected`: Boolean = false,
screen_name: String,
sleep_time: SleepTime,
show_all_inline_media: Boolean = false,
use_cookie_personalization: Boolean = false,
time_zone: Option[TimeZoneRecord] = None,
trend_location: Seq[Location] = Seq.empty)
final case class SleepTime(enabled: Boolean = false, end_time: Option[String] = None, start_time: Option[String] = None)
final case class TimeZoneRecord(name: String, tzinfo_name: String, utc_offset: Int)
final case class PlaceType(code: String, name: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/SettingsOptions.scala
================================================
package com.danielasfregola.twitter4s.entities
import com.danielasfregola.twitter4s.entities.enums.ContributorType.ContributorType
import com.danielasfregola.twitter4s.entities.enums.Hour.Hour
import com.danielasfregola.twitter4s.entities.enums.Language.Language
import com.danielasfregola.twitter4s.entities.enums.TimeZone.TimeZone
/**
* woeid: "Where on Earth Identifiers, by Yahoo!! see http://woeid.rosselliot.co.nz/"
* */
final case class SettingsOptions(allow_contributor_request: Option[ContributorType] = None,
sleep_time_enabled: Option[Boolean] = None,
start_sleep_time: Option[Hour] = None,
end_sleep_time: Option[Hour] = None,
lang: Option[Language] = None,
time_zone: Option[TimeZone] = None,
trend_location_woeid: Option[Long] = None)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Size.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Size(h: Int, resize: String, w: Int)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/StatusMediaDetails.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class StatusMediaDetails(media_id: Long, media_id_string: String, expires_after_secs: Int)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Suggestions.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Suggestions(name: String, slug: String, size: Int, users: Seq[User] = Seq.empty)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Symbol.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Symbol(text: String, indices: Seq[Int])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/TermsOfService.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class TermsOfService(tos: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Tweet.scala
================================================
package com.danielasfregola.twitter4s.entities
import java.time.Instant
import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage
final case class Tweet(contributors: Seq[Contributor] = Seq.empty,
coordinates: Option[Coordinates] = None,
created_at: Instant,
current_user_retweet: Option[TweetId] = None,
entities: Option[Entities] = None,
extended_entities: Option[Entities] = None,
extended_tweet: Option[ExtendedTweet] = None,
favorite_count: Int = 0,
favorited: Boolean = false,
filter_level: Option[String] = None,
geo: Option[Geo] = None,
id: Long,
id_str: String,
in_reply_to_screen_name: Option[String] = None,
in_reply_to_status_id: Option[Long] = None,
in_reply_to_status_id_str: Option[String] = None,
in_reply_to_user_id: Option[Long] = None,
in_reply_to_user_id_str: Option[String] = None,
is_quote_status: Boolean = false,
lang: Option[String] = None,
place: Option[GeoPlace] = None,
possibly_sensitive: Boolean = false,
quoted_status_id: Option[Long] = None,
quoted_status_id_str: Option[String] = None,
quoted_status: Option[Tweet] = None,
scopes: Map[String, Boolean] = Map.empty,
retweet_count: Long = 0,
retweeted: Boolean = false,
retweeted_status: Option[Tweet] = None,
source: String,
text: String,
truncated: Boolean = false,
display_text_range: Option[Seq[Int]] = None,
user: Option[User] = None,
withheld_copyright: Boolean = false,
withheld_in_countries: Seq[String] = Seq.empty,
withheld_scope: Option[String] = None,
metadata: Option[StatusMetadata] = None)
extends CommonStreamingMessage
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/TweetId.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class TweetId(id: Long, id_str: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/TweetSearch.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class StatusSearch(statuses: List[Tweet], search_metadata: SearchMetadata)
final case class SearchMetadata(completed_in: Double,
max_id: Long,
max_id_str: String,
next_results: Option[String],
query: String,
refresh_url: Option[String],
count: Int,
since_id: Long,
since_id_str: String)
final case class StatusMetadata(iso_language_code: String, result_type: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/TweetUpdate.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class TweetUpdate(status: String,
in_reply_to_status_id: Option[Long] = None,
possibly_sensitive: Boolean = false,
lat: Option[Long] = None,
long: Option[Long] = None,
place_id: Option[String] = None,
display_coordinates: Boolean = false,
trim_user: Boolean = false,
media_ids: Seq[Long] = Seq.empty)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/TwitterList.scala
================================================
package com.danielasfregola.twitter4s.entities
import java.time.Instant
final case class TwitterList(created_at: Instant,
description: String,
following: Boolean,
full_name: String,
id: Long,
id_str: String,
name: String,
subscriber_count: Int,
uri: String,
member_count: Int,
mode: String,
slug: String,
user: User)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/TwitterListUpdate.scala
================================================
package com.danielasfregola.twitter4s.entities
import com.danielasfregola.twitter4s.entities.enums.Mode.Mode
final case class TwitterListUpdate(description: Option[String] = None,
mode: Option[Mode] = None,
name: Option[String] = None)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/TwitterLists.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class TwitterLists(lists: Seq[TwitterList] = Seq.empty, next_cursor: Long, previous_cursor: Long)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/UploadedMedia.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class UploadedMedia(media_id: Long,
media_id_str: String,
size: Int,
image: Option[Image] = None,
video: Option[Video] = None)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Url.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Url(indices: Seq[Int] = Seq.empty, url: String, display_url: String, expanded_url: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/User.scala
================================================
package com.danielasfregola.twitter4s.entities
import java.time.Instant
final case class User(blocked_by: Boolean = false,
blocking: Boolean = false,
contributors_enabled: Boolean = false,
created_at: Instant,
default_profile: Boolean = false,
default_profile_image: Boolean = false,
description: Option[String] = None,
email: Option[String] = None,
entities: Option[Entities] = None,
favourites_count: Int,
follow_request_sent: Boolean = false,
following: Boolean = false,
followers_count: Int,
friends_count: Int,
geo_enabled: Boolean = false,
has_extended_profile: Boolean = false,
id: Long,
id_str: String,
is_translation_enabled: Boolean = false,
is_translator: Boolean = false,
lang: String,
listed_count: Int,
location: Option[String] = None,
muting: Boolean = false,
name: String,
notifications: Boolean = false,
profile_background_color: String,
profile_background_image_url: String,
profile_background_image_url_https: String,
profile_background_tile: Boolean = false,
profile_banner_url: Option[String] = None,
profile_image_url: Option[ProfileImage],
profile_image_url_https: Option[ProfileImage],
profile_link_color: String,
profile_location: Option[String],
profile_sidebar_border_color: String,
profile_sidebar_fill_color: String,
profile_text_color: String,
profile_use_background_image: Boolean = false,
`protected`: Boolean = false,
screen_name: String,
show_all_inline_media: Boolean = false,
status: Option[Tweet] = None,
statuses_count: Int,
time_zone: Option[String] = None,
translator_type: Option[String] = None,
url: Option[String] = None,
utc_offset: Option[Int] = None,
verified: Boolean = false,
withheld_in_countries: Option[String] = None,
withheld_scope: Option[String] = None)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/UserIds.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class UserIds(ids: Seq[Long] = Seq.empty, next_cursor: Long, previous_cursor: Long)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/UserMention.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class UserMention(id: Long, id_str: String, indices: Seq[Int] = Seq.empty, name: String, screen_name: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/UserStringifiedIds.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class UserStringifiedIds(ids: Seq[String] = Seq.empty, next_cursor: Long, previous_cursor: Long)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Users.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Users(users: Seq[User] = Seq.empty, next_cursor: Long, previous_cursor: Long)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Variant.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Variant(bitrate: Option[Long], content_type: String, url: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Video.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class Video(video_type: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/VideoInfo.scala
================================================
package com.danielasfregola.twitter4s.entities
final case class VideoInfo(aspect_ratio: Seq[Int], duration_millis: Option[Long], variants: Seq[Variant])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Webhook.scala
================================================
package com.danielasfregola.twitter4s.entities
import java.time.ZonedDateTime
final case class Webhook(id: String, url: String, valid: Boolean, created_timestamp: ZonedDateTime)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/authentication/OAuthAccessToken.scala
================================================
package com.danielasfregola.twitter4s.entities.authentication
import com.danielasfregola.twitter4s.entities.AccessToken
import com.danielasfregola.twitter4s.http.serializers.FromMap
final case class OAuthAccessToken(accessToken: AccessToken, user_id: Long, screen_name: String)
object OAuthAccessToken {
implicit val oAuthAccessTokenFromMap = new FromMap[OAuthAccessToken] {
def apply(m: Map[String, String]): Option[OAuthAccessToken] =
for {
key <- m.get("oauth_token")
secret <- m.get("oauth_token_secret")
userId <- m.get("user_id")
screenName <- m.get("screen_name")
} yield OAuthAccessToken(AccessToken(key, secret), userId.toLong, screenName)
}
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/authentication/OAuthRequestToken.scala
================================================
package com.danielasfregola.twitter4s.entities.authentication
import com.danielasfregola.twitter4s.http.serializers.FromMap
final case class OAuthRequestToken(token: RequestToken, oauth_callback_confirmed: Boolean)
final case class RequestToken(key: String, secret: String)
object OAuthRequestToken {
implicit val oAuthRequestTokenFromMap = new FromMap[OAuthRequestToken] {
def apply(m: Map[String, String]): Option[OAuthRequestToken] =
for {
key <- m.get("oauth_token")
secret <- m.get("oauth_token_secret")
callbackConfirmed <- m.get("oauth_callback_confirmed")
} yield OAuthRequestToken(RequestToken(key, secret), toBoolean(callbackConfirmed))
}
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/AccessType.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object AccessType extends Enumeration {
type AccessType = Value
val Read = Value("read")
val Write = Value("write")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/Alignment.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object Alignment extends Enumeration {
type Alignment = Value
val Left = Value("left")
val Right = Value("right")
val Center = Value("center")
val None = Value("none")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/ContributorType.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object ContributorType extends Enumeration {
type ContributorType = Value
val All = Value("all")
val Following = Value("following")
val `None` = Value("none")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/DisconnectionCode.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object DisconnectionCode extends Enumeration {
type DisconnectionCode = Value
val Shutdown = Value(1)
val DuplicateStream = Value(2)
val ControlRequest = Value(3)
val Stall = Value(4)
val Normal = Value(5)
val TokenRevoked = Value(6)
val AdminLogout = Value(7)
val Internal = Value(8)
val MaxMessageLimit = Value(9)
val StreamException = Value(10)
val BrokerStall = Value(11)
val ShedLoad = Value(12)
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/EventCode.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
abstract class EventCode extends Enumeration
object SimpleEventCode extends EventCode {
type SimpleEventCode = Value
val AccessRevoked = Value("access_revoked")
val Block = Value("block")
val Unblock = Value("unblock")
val Follow = Value("follow")
val Unfollow = Value("unfollow")
val UserUpdate = Value("user_update")
}
object TweetEventCode extends EventCode {
type TweetEventCode = Value
val Favorite = Value("favorite")
val FavoritedRetweet = Value("favorited_retweet")
val Unfavorite = Value("unfavorite")
val QuotedTweet = Value("quoted_tweet")
}
object TwitterListEventCode extends EventCode {
type TwitterListEventCode = Value
val ListCreated = Value("list_created")
val ListDestroyed = Value("list_destroyed")
val ListUpdated = Value("list_updated")
val ListMemberAdded = Value("list_member_added")
val ListMemberRemoved = Value("list_member_removed")
val ListUserSubscribed = Value("list_user_subscribed")
val ListUserUnsubscribed = Value("list_user_unsubscribed")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/FilterLevel.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object FilterLevel extends Enumeration {
type FilterLevel = Value
val None = Value("none")
val Low = Value("low")
val Medium = Value("medium")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/Granularity.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object Granularity extends Enumeration {
type Granularity = Value
val Admin = Value("admim")
val City = Value("city")
val Country = Value("country")
val Neighborhood = Value("neighborhood")
val Poi = Value("poi")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/Hour.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object Hour extends Enumeration {
type Hour = Value
val MIDNIGHT = Value("00")
val ONE_AM = Value("01")
val TWO_AM = Value("02")
val THREE_AM = Value("03")
val FOUR_AM = Value("04")
val FIVE_AM = Value("05")
val SIX_AM = Value("06")
val SEVEN_AM = Value("07")
val EIGHT_AM = Value("08")
val NIGHT_AM = Value("09")
val TEN_AM = Value("10")
val ELEVEN_AM = Value("11")
val MIDDAY = Value("12")
val ONE_PM = Value("13")
val TWO_PM = Value("14")
val THREE_PM = Value("15")
val FOUR_PM = Value("16")
val FIVE_PM = Value("17")
val SIX_PM = Value("18")
val SEVEN_PM = Value("19")
val EIGHT_PM = Value("20")
val NIGHT_PM = Value("21")
val TEN_PM = Value("22")
val ELEVEN_PM = Value("23")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/Language.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object Language extends Enumeration {
type Language = Value
val English = Value("en")
val Arabic = Value("ar")
val Bengali = Value("bn")
val Czech = Value("cs")
val Danish = Value("da")
val German = Value("de")
val Greek = Value("el")
val Spanish = Value("es")
val Persian = Value("fa")
val Finnish = Value("fi")
val Filipino = Value("fil")
val French = Value("fr")
val Hebrew = Value("he")
val Hindi = Value("hi")
val Hungarian = Value("hu")
val Indonesian = Value("id")
val Italian = Value("it")
val Japanese = Value("ja")
val Korean = Value("ko")
val Malay = Value("msa")
val Dutch = Value("nl")
val Norwegian = Value("no")
val Polish = Value("pl")
val Portuguese = Value("pt")
val Romanian = Value("ro")
val Russian = Value("ru")
val Swedish = Value("sv")
val Thai = Value("th")
val Turkish = Value("tr")
val Ukrainian = Value("uk")
val Urdu = Value("ur")
val Vietnamese = Value("vi")
val ChineseSimplified = Value("zh-cn")
val Chinese = Value("zh-tw")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/Measure.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object Measure extends Enumeration {
type Measure = Value
val Meter = Value("m")
val Feet = Value("ft")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/MediaType.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object MediaType extends Enumeration {
type MediaType = Value
val PNG = Value("image/png")
val JPG = Value("image/jpeg")
val GIF = Value("image/gif")
val WEBP = Value("image/webp")
val MP4 = Value("video/mp4")
val MOV = Value("video/quicktime")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/Mode.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object Mode extends Enumeration {
type Mode = Value
val Private = Value("private")
val Public = Value("public")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/Resource.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object Resource extends Enumeration {
type Resource = Value
val Account = Value("account")
val Application = Value("application")
val Blocks = Value("blocks")
val Collections = Value("collections")
val Contacts = Value("contacts")
val Device = Value("device")
val DirectMessages = Value("direct_messages")
val Favorites = Value("favorites")
val Followers = Value("followers")
val Friends = Value("friends")
val Friendships = Value("friendships")
val Geo = Value("geo")
val Help = Value("help")
val Lists = Value("lists")
val Moments = Value("moments")
val Mutes = Value("mutes")
val SavedSearches = Value("saved_searches")
val Search = Value("search")
val Statuses = Value("statuses")
val Trends = Value("trends")
val Users = Value("users")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/ResultType.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object ResultType extends Enumeration {
type ResultType = Value
val Mixed = Value("mixed")
val Recent = Value("recent")
val Popular = Value("popular")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/TimeZone.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object TimeZone extends Enumeration {
type TimeZone = Value
val Africa_Algiers = Value("Africa/Algiers")
val Africa_Cairo = Value("Africa/Cairo")
val Africa_Casablanca = Value("Africa/Casablanca")
val Africa_Harare = Value("Africa/Harare")
val Africa_Johannesburg = Value("Africa/Johannesburg")
val Africa_Monrovia = Value("Africa/Monrovia")
val Africa_Nairobi = Value("Africa/Nairobi")
val America_Argentina_Buenos_Aires = Value("America/Argentina_Buenos_Aires")
val America_Bogota = Value("America/Bogota")
val America_Caracas = Value("America/Caracas")
val America_Chicago = Value("America/Chicago")
val America_Chihuahua = Value("America/Chihuahua")
val America_Denver = Value("America/Denver")
val America_Godthab = Value("America/Godthab")
val America_Guatemala = Value("America/Guatemala")
val America_Guyana = Value("America/Guyana")
val America_Halifax = Value("America/Halifax")
val America_Indiana_Indianapolis = Value("America/Indiana_Indianapolis")
val America_Juneau = Value("America/Juneau")
val America_La_Paz = Value("America/La_Paz")
val America_Lima = Value("America/Lima")
val America_Los_Angeles = Value("America/Los_Angeles")
val America_Mazatlan = Value("America/Mazatlan")
val America_Mexico_City = Value("America/Mexico_City")
val America_Monterrey = Value("America/Monterrey")
val America_Montevideo = Value("America/Montevideo")
val America_New_York = Value("America/New_York")
val America_Phoenix = Value("America/Phoenix")
val America_Regina = Value("America/Regina")
val America_Santiago = Value("America/Santiago")
val America_Sao_Paulo = Value("America/Sao_Paulo")
val America_St_Johns = Value("America/St_Johns")
val America_Tijuana = Value("America/Tijuana")
val Asia_Almaty = Value("Asia/Almaty")
val Asia_Baghdad = Value("Asia/Baghdad")
val Asia_Baku = Value("Asia/Baku")
val Asia_Bangkok = Value("Asia/Bangkok")
val Asia_Chongqing = Value("Asia/Chongqing")
val Asia_Colombo = Value("Asia/Colombo")
val Asia_Dhaka = Value("Asia/Dhaka")
val Asia_Hong_Kong = Value("Asia/Hong_Kong")
val Asia_Irkutsk = Value("Asia/Irkutsk")
val Asia_Jakarta = Value("Asia/Jakarta")
val Asia_Jerusalem = Value("Asia/Jerusalem")
val Asia_Kabul = Value("Asia/Kabul")
val Asia_Kamchatka = Value("Asia/Kamchatka")
val Asia_Karachi = Value("Asia/Karachi")
val Asia_Kathmandu = Value("Asia/Kathmandu")
val Asia_Kolkata = Value("Asia/Kolkata")
val Asia_Krasnoyarsk = Value("Asia/Krasnoyarsk")
val Asia_Kuala_Lumpur = Value("Asia/Kuala_Lumpur")
val Asia_Kuwait = Value("Asia/Kuwait")
val Asia_Magadan = Value("Asia/Magadan")
val Asia_Muscat = Value("Asia/Muscat")
val Asia_Novosibirsk = Value("Asia/Novosibirsk")
val Asia_Rangoon = Value("Asia/Rangoon")
val Asia_Riyadh = Value("Asia/Riyadh")
val Asia_Seoul = Value("Asia/Seoul")
val Asia_Shanghai = Value("Asia/Shanghai")
val Asia_Singapore = Value("Asia/Singapore")
val Asia_Srednekolymsk = Value("Asia/Srednekolymsk")
val Asia_Taipei = Value("Asia/Taipei")
val Asia_Tashkent = Value("Asia/Tashkent")
val Asia_Tbilisi = Value("Asia/Tbilisi")
val Asia_Tehran = Value("Asia/Tehran")
val Asia_Tokyo = Value("Asia/Tokyo")
val Asia_Ulaanbaatar = Value("Asia/Ulaanbaatar")
val Asia_Urumqi = Value("Asia/Urumqi")
val Asia_Vladivostok = Value("Asia/Vladivostok")
val Asia_Yakutsk = Value("Asia/Yakutsk")
val Asia_Yekaterinburg = Value("Asia/Yekaterinburg")
val Asia_Yerevan = Value("Asia/Yerevan")
val Atlantic_Azores = Value("Atlantic/Azores")
val Atlantic_Cape_Verde = Value("Atlantic/Cape_Verde")
val Atlantic_South_Georgia = Value("Atlantic/South_Georgia")
val Australia_Adelaide = Value("Australia_Adelaide")
val Australia_Brisbane = Value("Australia_Brisbane")
val Australia_Darwin = Value("Australia_Darwin")
val Australia_Hobart = Value("Australia_Hobart")
val Australia_Melbourne = Value("Australia_Melbourne")
val Australia_Perth = Value("Australia_Perth")
val Australia_Sydney = Value("Australia_Sydney")
val Etc_UTC = Value("Etc_UTC")
val Europe_Amsterdam = Value("Europe/Amsterdam")
val Europe_Athens = Value("Europe/Athens")
val Europe_Belgrade = Value("Europe/Belgrade")
val Europe_Berlin = Value("Europe/Berlin")
val Europe_Bratislava = Value("Europe/Bratislava")
val Europe_Brussels = Value("Europe/Brussels")
val Europe_Bucharest = Value("Europe/Bucharest")
val Europe_Budapest = Value("Europe/Budapest")
val Europe_Copenhagen = Value("Europe/Copenhagen")
val Europe_Dublin = Value("Europe/Dublin")
val Europe_Helsinki = Value("Europe/Helsinki")
val Europe_Istanbul = Value("Europe/Istanbul")
val Europe_Kaliningrad = Value("Europe/Kaliningrad")
val Europe_Kiev = Value("Europe/Kiev")
val Europe_Lisbon = Value("Europe/Lisbon")
val Europe_Ljubljana = Value("Europe/Ljubljana")
val Europe_London = Value("Europe/London")
val Europe_Madrid = Value("Europe/Madrid")
val Europe_Minsk = Value("Europe/Minsk")
val Europe_Moscow = Value("Europe/Moscow")
val Europe_Paris = Value("Europe/Paris")
val Europe_Prague = Value("Europe/Prague")
val Europe_Riga = Value("Europe/Riga")
val Europe_Rome = Value("Europe/Rome")
val Europe_Samara = Value("Europe/Samara")
val Europe_Sarajevo = Value("Europe/Sarajevo")
val Europe_Skopje = Value("Europe/Skopje")
val Europe_Sofia = Value("Europe/Sofia")
val Europe_Stockholm = Value("Europe/Stockholm")
val Europe_Tallinn = Value("Europe/Tallinn")
val Europe_Vienna = Value("Europe/Vienna")
val Europe_Vilnius = Value("Europe/Vilnius")
val Europe_Volgograd = Value("Europe/Volgograd")
val Europe_Warsaw = Value("Europe/Warsaw")
val Europe_Zagreb = Value("Europe/Zagreb")
val Pacific_Apia = Value("Pacific/Apia")
val Pacific_Auckland = Value("Pacific/Auckland")
val Pacific_Chatham = Value("Pacific/Chatham")
val Pacific_Fakaofo = Value("Pacific/Fakaofo")
val Pacific_Fiji = Value("Pacific/Fiji")
val Pacific_Guadalcanal = Value("Pacific/Guadalcanal")
val Pacific_Guam = Value("Pacific/Guam")
val Pacific_Honolulu = Value("Pacific/Honolulu")
val Pacific_Majuro = Value("Pacific/Majuro")
val Pacific_Midway = Value("Pacific/Midway")
val Pacific_Noumea = Value("Pacific/Noumea")
val Pacific_Pago_Pago = Value("Pacific/Pago_Pago")
val Pacific_Port_Moresby = Value("Pacific/Port_Moresby")
val Pacific_Tongatapu = Value("Pacific/Tongatapu")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/TweetMode.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object TweetMode extends Enumeration {
type TweetMode = Value
val Extended = Value("extended")
val Classic = Value("")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/WidgetType.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object WidgetType extends Enumeration {
type WidgetType = Value
val Video = Value("video")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/WithFilter.scala
================================================
package com.danielasfregola.twitter4s.entities.enums
object WithFilter extends Enumeration {
type WithFilter = Value
val User = Value("user")
val Followings = Value("followings")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/StreamingUpdate.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming
final case class StreamingUpdate(streamingEvent: StreamingMessage)
trait StreamingMessage
trait CommonStreamingMessage extends UserStreamingMessage with SiteStreamingMessage
trait UserStreamingMessage extends StreamingMessage
trait SiteStreamingMessage extends StreamingMessage
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/DisconnectMessage.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.common
import com.danielasfregola.twitter4s.entities.enums.DisconnectionCode.DisconnectionCode
import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage
/** Streams may be shut down for a variety of reasons.
* The streaming API will attempt to deliver a message indicating why a stream was closed.
* Note that if the disconnect was due to network issues or a client reading too slowly,
* it is possible that this message will not be received.
* For more information see
* <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
* https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
*/
final case class DisconnectMessage(disconnect: DisconnectMessageInfo) extends CommonStreamingMessage
final case class DisconnectMessageInfo(code: DisconnectionCode, stream_name: String, reason: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/LimitNotice.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.common
import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage
/** These messages indicate that a filtered stream has matched more Tweets
* than its current rate limit allows to be delivered. Limit notices contain
* a total count of the number of undelivered Tweets since the connection was opened,
* making them useful for tracking counts of track terms, for example.
* Note that the counts do not specify which filter predicates undelivered messages matched.
* For more information see
* <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
* https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
*/
final case class LimitNotice(limit: LimitTrack) extends CommonStreamingMessage
final case class LimitTrack(track: Long)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/LocationDeletionNotice.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.common
import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage
/** These messages indicate that geolocated data must be stripped from a range of Tweets.
* Clients must honor these messages by deleting geocoded data from Tweets which fall before
* the given status ID and belong to the specified user. These messages may also arrive before
* a Tweet which falls into the specified range, although this is rare.
* For more information see
* <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
* https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
*/
final case class LocationDeletionNotice(scrub_geo: LocationDeletionId) extends CommonStreamingMessage
final case class LocationDeletionId(user_id: Long,
user_id_str: String,
up_to_status_id: Long,
up_to_status_id_str: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/StatusDeletionNotice.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.common
import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage
/** These messages indicate that a given Tweet has been deleted.
* Client code must honor these messages by clearing the referenced Tweet from memory and any
* storage or archive, even in the rare case where a deletion message arrives earlier
* in the stream that the Tweet it references.
* For more information see
* <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
* https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
*/
final case class StatusDeletionNotice(delete: StatusDeletionNoticeInfo) extends CommonStreamingMessage
final case class StatusDeletionNoticeInfo(status: StatusDeletionId)
final case class StatusDeletionId(id: Long, id_str: String, user_id: Long, user_id_str: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/StatusWithheldNotice.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.common
import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage
/** These events contain an id field indicating the status ID, a user_id indicating the user,
* and a collection of withheld_in_countries uppercase two-letter country codes.
* For more information see
* <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
* https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
*/
final case class StatusWithheldNotice(status_withheld: StatusWithheldId) extends CommonStreamingMessage
final case class StatusWithheldId(id: Long, user_id: Long, withheld_in_countries: List[String])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/UserWithheldNotice.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.common
import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage
/** These events contain an id field indicating the user ID and a collection of
* withheld_in_countries uppercase two-letter country codes.
* For more information see
* <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
* https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
*/
final case class UserWithheldNotice(user_withheld: UserWithheldId) extends CommonStreamingMessage
final case class UserWithheldId(id: Long, withheld_in_countries: List[String])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/WarningMessage.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.common
import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage
/** When connected to a stream using the stall_warnings parameter,
* you may receive status notices indicating the current health of the connection.
* For more information see
* <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
* https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
*/
final case class WarningMessage(warning: WarningMessageInfo) extends CommonStreamingMessage
final case class WarningMessageInfo(code: String,
message: String,
percent_full: Option[Int] = None,
user_id: Option[Long] = None)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/site/ControlMessage.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.site
import com.danielasfregola.twitter4s.entities.streaming.SiteStreamingMessage
/** New Site Streams connections will receive a control message which may be used to modify the Site Streams connection without reconnecting.
* See <a href="https://dev.twitter.com/streaming/sitestreams/controlstreams" target="_blank">Control Streams for Site Streams</a> for details. Note that this message will not necessarily be the first message delivered on a Site Streams connection.
* For more information see <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
* https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>
*/
final case class ControlMessage(control: ControlMessageInfo) extends SiteStreamingMessage
final case class ControlMessageInfo(control_uri: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelop.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.site
import com.danielasfregola.twitter4s.entities.streaming._
import com.danielasfregola.twitter4s.entities.streaming.common.WarningMessage
import com.danielasfregola.twitter4s.entities.streaming.user._
import com.danielasfregola.twitter4s.entities.{DirectMessage, Tweet}
/** Site Streams are sent the same messages as User Streams (including friends lists in the preamble),
* but for multiple users instead of a single user.The same types of messages are streamed, but to identify the target of each message,
* an additional wrapper is placed around every message, except for blank keep-alive lines.
* For more information see <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
* https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>
*/
abstract class UserEnvelop[T <: StreamingMessage](for_user: Long, message: T) extends SiteStreamingMessage
final case class UserEnvelopTweet(for_user: Long, message: Tweet) extends UserEnvelop(for_user, message)
final case class UserEnvelopDirectMessage(for_user: Long, message: DirectMessage) extends UserEnvelop(for_user, message)
final case class UserEnvelopSimpleEvent(for_user: Long, message: SimpleEvent) extends UserEnvelop(for_user, message)
final case class UserEnvelopTweetEvent(for_user: Long, message: TweetEvent) extends UserEnvelop(for_user, message)
final case class UserEnvelopTwitterListEvent(for_user: Long, message: TwitterListEvent)
extends UserEnvelop(for_user, message)
final case class UserEnvelopFriendsLists(for_user: Long, message: FriendsLists) extends UserEnvelop(for_user, message)
final case class UserEnvelopWarningMessage(for_user: Long, message: WarningMessage)
extends UserEnvelop(for_user, message)
/** Site Streams are sent the same messages as User Streams (including friends lists in the preamble),
* but for multiple users instead of a single user.The same types of messages are streamed, but to identify the target of each message,
* an additional wrapper is placed around every message, except for blank keep-alive lines.
* For more information see <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
* https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>
*/
abstract class UserEnvelopStringified[T <: StreamingMessage](for_user: String, message: StreamingMessage)
extends SiteStreamingMessage
final case class UserEnvelopTweetStringified(for_user: String, message: Tweet)
extends UserEnvelopStringified[Tweet](for_user, message)
final case class UserEnvelopDirectMessageStringified(for_user: String, message: DirectMessage)
extends UserEnvelopStringified[DirectMessage](for_user, message)
final case class UserEnvelopSimpleEventStringified(for_user: String, message: SimpleEvent)
extends UserEnvelopStringified[SimpleEvent](for_user, message)
final case class UserEnvelopTweetEventStringified(for_user: String, message: TweetEvent)
extends UserEnvelopStringified[TweetEvent](for_user, message)
final case class UserEnvelopTwitterListEventStringified(for_user: String, message: TwitterListEvent)
extends UserEnvelopStringified[TwitterListEvent](for_user, message)
final case class UserEnvelopFriendsListsStringified(for_user: String, message: FriendsLists)
extends UserEnvelopStringified[FriendsLists](for_user, message)
final case class UserEnvelopWarningMessageStringified(for_user: String, message: WarningMessage)
extends UserEnvelopStringified[WarningMessage](for_user, message)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/user/Event.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.user
import java.time.Instant
import com.danielasfregola.twitter4s.entities.enums.EventCode
import com.danielasfregola.twitter4s.entities.enums.SimpleEventCode.SimpleEventCode
import com.danielasfregola.twitter4s.entities.enums.TweetEventCode.TweetEventCode
import com.danielasfregola.twitter4s.entities.enums.TwitterListEventCode.TwitterListEventCode
import com.danielasfregola.twitter4s.entities.streaming.UserStreamingMessage
import com.danielasfregola.twitter4s.entities.{Tweet, TwitterList, User}
/** Notifications about non-Tweet events are also sent over a user stream.
* The values present will be different based on the type of event.
* For more information see
* <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
* https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
*/
abstract class Event[T](created_at: Instant,
event: EventCode#Value,
target: User,
source: User,
target_object: Option[T])
extends UserStreamingMessage
final case class SimpleEvent(created_at: Instant,
event: SimpleEventCode,
target: User,
source: User,
target_object: Option[String])
extends Event(created_at, event, target, source, target_object)
final case class TweetEvent(created_at: Instant,
event: TweetEventCode,
target: User,
source: User,
target_object: Tweet)
extends Event(created_at, event, target, source, Some(target_object))
final case class TwitterListEvent(created_at: Instant,
event: TwitterListEventCode,
target: User,
source: User,
target_object: TwitterList)
extends Event(created_at, event, target, source, Some(target_object))
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/user/FriendsLists.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.user
import com.danielasfregola.twitter4s.entities.streaming.UserStreamingMessage
/** Upon establishing a User Stream connection, Twitter will send a preamble before starting regular message delivery.
* This preamble contains a list of the user’s friends. This is represented as an array of user ids as longs.
* For more information see <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
* https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>
*/
final case class FriendsLists(friends: Seq[Long]) extends UserStreamingMessage
/** Upon establishing a User Stream connection, Twitter will send a preamble before starting regular message delivery.
* This preamble contains a list of the user’s friends. This is represented as an array of user ids as strings.
* For more information see <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
* https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>
*/
final case class FriendsListsStringified(friends: Seq[String]) extends UserStreamingMessage
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/Error.scala
================================================
package com.danielasfregola.twitter4s.entities.v2
final case class Error(detail: String,
field: Option[String],
parameter: Option[String],
resource_id: Option[String],
resource_type: Option[String],
section: Option[String],
title: String,
`type`: Option[String],
value: Option[String])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/Media.scala
================================================
package com.danielasfregola.twitter4s.entities.v2
import com.danielasfregola.twitter4s.entities.v2.enums.MediaType.MediaType
final case class Media(media_key: String,
`type`: MediaType,
duration_ms: Option[Int],
height: Option[Int],
non_public_metrics: Option[MediaNonPublicMetrics],
organic_metrics: Option[MediaOrganicMetrics],
preview_image_url: Option[String],
promoted_metrics: Option[MediaPromotedMetrics],
public_metrics: Option[MediaPublicMetrics],
url: Option[String],
width: Option[Int])
final case class MediaNonPublicMetrics(playback_0_count: Int,
playback_100_count: Int,
playback_25_count: Int,
playback_50_count: Int,
playback_75_count: Int)
final case class MediaOrganicMetrics(playback_0_count: Int,
playback_100_count: Int,
playback_25_count: Int,
playback_50_count: Int,
playback_75_count: Int,
view_count: Int)
final case class MediaPromotedMetrics(playback_0_count: Int,
playback_100_count: Int,
playback_25_count: Int,
playback_50_count: Int,
playback_75_count: Int,
view_count: Int)
final case class MediaPublicMetrics(view_count: Int)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/Meta.scala
================================================
package com.danielasfregola.twitter4s.entities.v2
final case class Meta(result_count: Int,
newest_id: Option[String],
oldest_id: Option[String],
next_token: Option[String],
previous_token: Option[String])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/Place.scala
================================================
package com.danielasfregola.twitter4s.entities.v2
// https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/place
final case class Place(full_name: String,
id: String,
contained_within: Seq[String],
country: Option[String],
country_code: Option[String],
geo: Option[GeoJSON],
name: Option[String],
place_type: Option[String])
final case class GeoJSON(value: String) extends AnyVal
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/Poll.scala
================================================
package com.danielasfregola.twitter4s.entities.v2
import java.time.Instant
// https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/poll
final case class Poll(id: String,
options: Seq[PollOption],
duration_minutes: Option[Int],
end_datetime: Option[Instant],
voting_status: Option[String])
final case class PollOption(position: Int, label: String, votes: Int)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/Tweet.scala
================================================
package com.danielasfregola.twitter4s.entities.v2
import com.danielasfregola.twitter4s.entities.v2.enums.CoordinatesType.CoordinatesType
import com.danielasfregola.twitter4s.entities.v2.enums.ReferencedTweetType.ReferencedTweetType
import com.danielasfregola.twitter4s.entities.v2.enums.TweetReplySetting.TweetReplySetting
import java.time.Instant
final case class Tweet(id: String,
text: String,
attachments: Option[TweetAttachments],
author_id: Option[String],
context_annotations: Option[Seq[TweetContextAnnotation]],
conversation_id: Option[String],
created_at: Option[Instant],
entities: Option[TweetEntities],
geo: Option[TweetGeo],
in_reply_to_user_id: Option[String],
lang: Option[String],
non_public_metrics: Option[TweetNonPublicMetrics],
organic_metrics: Option[TweetOrganicMetrics],
possibly_sensitive: Option[Boolean],
promoted_metrics: Option[TweetPromotedMetrics],
public_metrics: Option[TweetPublicMetrics],
referenced_tweets: Option[Seq[TweetReferencedTweet]],
reply_settings: Option[TweetReplySetting],
source: Option[String],
withheld: Option[Withheld])
final case class TweetAttachments(media_keys: Seq[String], poll_ids: Seq[String])
final case class TweetContextAnnotation(domain: TweetDomain, entity: TweetEntity)
final case class TweetGeo(coordinates: Option[TweetCoordinates], place_id: Option[String])
final case class TweetCoordinates(`type`: CoordinatesType, coordinates: (Double, Double))
final case class TweetNonPublicMetrics(impression_count: Int, url_link_clicks: Option[Int], user_profile_clicks: Int)
final case class TweetOrganicMetrics(impression_count: Int,
url_link_clicks: Option[Int],
user_profile_clicks: Int,
retweet_count: Int,
reply_count: Int,
like_count: Int)
final case class TweetPromotedMetrics(impression_count: Int,
url_link_clicks: Option[Int],
user_profile_clicks: Int,
retweet_count: Int,
reply_count: Int,
like_count: Int)
final case class TweetPublicMetrics(retweet_count: Int, reply_count: Int, like_count: Int, quote_count: Int)
final case class TweetReferencedTweet(`type`: ReferencedTweetType, id: String)
final case class TweetDomain(id: String, name: String, description: Option[String])
final case class TweetEntity(id: String, name: String, description: Option[String])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/TweetEntities.scala
================================================
package com.danielasfregola.twitter4s.entities.v2
final case class TweetEntities(annotations: Seq[TweetEntitiesAnnotation],
urls: Seq[TweetEntitiesURL],
hashtags: Seq[TweetEntitiesHashtag],
mentions: Seq[TweetEntitiesMention],
cashtags: Seq[TweetEntitiesCashtag])
final case class TweetEntitiesAnnotation(start: Int,
end: Int,
probability: Float,
`type`: String,
normalized_text: String)
final case class TweetEntitiesURL(start: Int,
end: Int,
url: String,
expanded_url: String,
display_url: String,
unwound_url: Option[String])
final case class TweetEntitiesHashtag(start: Int, end: Int, tag: String)
final case class TweetEntitiesMention(start: Int, end: Int, username: Option[String], id: Option[String])
final case class TweetEntitiesCashtag(start: Int, end: Int, tag: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/TweetIncludes.scala
================================================
package com.danielasfregola.twitter4s.entities.v2
final case class TweetIncludes(tweets: Seq[Tweet],
users: Seq[User],
media: Seq[Media],
places: Seq[Place],
polls: Seq[Poll])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/User.scala
================================================
package com.danielasfregola.twitter4s.entities.v2
import java.time.Instant
final case class User(id: String,
name: String,
username: String,
created_at: Option[Instant],
`protected`: Option[Boolean],
withheld: Option[Withheld],
location: Option[String],
url: Option[String],
description: Option[String],
verified: Option[Boolean],
entities: Option[UserEntities],
profile_image_url: Option[String],
public_metrics: Option[UserPublicMetrics],
pinned_tweet_id: Option[String])
final case class UserPublicMetrics(followers_count: Int, following_count: Int, tweet_count: Int, listed_count: Int)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/UserEntities.scala
================================================
package com.danielasfregola.twitter4s.entities.v2
final case class UserEntities(url: Option[UserURLContainer], description: Option[UserEntitiesDescription])
final case class UserURLContainer(urls: Seq[UserEntitiesURL])
final case class UserEntitiesURL(start: Int, end: Int, url: String, expanded_url: String, display_url: String)
final case class UserEntitiesDescription(urls: Seq[UserEntitiesURL],
hashtags: Seq[UserEntitiesHashtag],
mentions: Seq[UserEntitiesMention],
cashtags: Seq[UserEntitiesCashtag])
final case class UserEntitiesHashtag(start: Int, end: Int, tag: String)
final case class UserEntitiesMention(start: Int, end: Int, username: String)
final case class UserEntitiesCashtag(start: Int, end: Int, tag: String)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/UserIncludes.scala
================================================
package com.danielasfregola.twitter4s.entities.v2
case class UserIncludes(tweets: Seq[Tweet], users: Seq[User])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/Withheld.scala
================================================
package com.danielasfregola.twitter4s.entities.v2
import com.danielasfregola.twitter4s.entities.v2.enums.WithheldScope.WithheldScope
final case class Withheld(copyright: Boolean, country_codes: Seq[String], scope: WithheldScope)
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/CoordinatesType.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums
object CoordinatesType extends Enumeration {
type CoordinatesType = Value
val Point = Value("Point")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/MediaType.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums
object MediaType extends Enumeration {
type MediaType = Value
val AnimatedGIF = Value("animated_gif")
val Photo = Value("photo")
val Video = Value("video")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/ReferencedTweetType.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums
object ReferencedTweetType extends Enumeration {
type ReferencedTweetType = Value
val Retweeted = Value("retweeted")
val Quoted = Value("quoted")
val RepliedTo = Value("replied_to")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/TweetReplySetting.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums
object TweetReplySetting extends Enumeration {
type TweetReplySetting = Value
val Everyone = Value("everyone")
val MentionedUsers = Value("mentioned_users")
val Followers = Value("followers")
val Following = Value("following")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/WithheldScope.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums
object WithheldScope extends Enumeration {
type WithheldScope = Value
val Tweet = Value("tweet")
val User = Value("user")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/expansions/TweetExpansions.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.expansions
object TweetExpansions extends Enumeration {
type TweetExpansions = Value
val `Attachments.PollIds` = Value("attachments.poll_ids")
val `Attachments.MediaKeys` = Value("attachments.media_keys")
val AuthorId = Value("author_id")
val `Entities.Mentions.Username` = Value("entities.mentions.username")
val `Geo.PlaceId` = Value("geo.place_id")
val InReplyToUser = Value("in_reply_to_user_id")
val `ReferencedTweets.Id` = Value("referenced_tweets.id")
val `ReferencedTweets.Id.AuthorId` = Value("referenced_tweets.id.author_id")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/expansions/UserExpansions.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.expansions
object UserExpansions extends Enumeration {
type UserExpansions = Value
val PinnedTweetId = Value("pinned_tweet_id")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/MediaFields.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.fields
object MediaFields extends Enumeration {
type MediaFields = Value
val DurationMs = Value("duration_ms")
val Height = Value("height")
val MediaKey = Value("media_key")
val PreviewImageUrl = Value("preview_image_url")
val Type = Value("type")
val Url = Value("url")
val Width = Value("width")
val PublicMetrics = Value("public_metrics")
val NonPublicMetrics = Value("non_public_metrics")
val OrganicMetrics = Value("organic_metrics")
val PromotedMetrics = Value("promoted_metrics")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/PlaceFields.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.fields
object PlaceFields extends Enumeration {
type PlaceFields = Value
val ContainedWithin = Value("contained_within")
val Country = Value("country")
val CountryCode = Value("country_code")
val FullName = Value("full_name")
val Geo = Value("geo")
val Id = Value("id")
val Name = Value("name")
val PlaceType = Value("place_type")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/PollFields.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.fields
object PollFields extends Enumeration {
type PollFields = Value
val DurationMinutes = Value("duration_minutes")
val EndDatetime = Value("end_datetime")
val Id = Value("id")
val Options = Value("options")
val VotingStatus = Value("voting_status")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/TweetFields.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.fields
object TweetFields extends Enumeration {
type TweetFields = Value
val Attachments = Value("attachments")
val AuthorId = Value("author_id")
val ContextAnnotations = Value("context_annotations")
val ConversationId = Value("conversation_id")
val CreatedAt = Value("created_at")
val Entities = Value("entities")
val Geo = Value("geo")
val Id = Value("id")
val InReplyToUserId = Value("in_reply_to_user_id")
val Lang = Value("lang")
val NonPublicMetrics = Value("non_public_metrics")
val PublicMetrics = Value("public_metrics")
val OrganicMetrics = Value("organic_metrics")
val PromotedMetrics = Value("promoted_metrics")
val PossiblySensitive = Value("possibly_sensitive")
val ReferencedTweets = Value("referenced_tweets")
val ReplySettings = Value("reply_settings")
val Source = Value("source")
val Text = Value("text")
val Withheld = Value("withheld")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/UserFields.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.fields
object UserFields extends Enumeration {
type UserFields = Value
val CreatedAt = Value("created_at")
val Description = Value("description")
val Entities = Value("entities")
val Id = Value("id")
val Location = Value("location")
val Name = Value("name")
val PinnedTweetId = Value("pinned_tweet_id")
val ProfileImageUrl = Value("profile_image_url")
val Protected = Value("protected")
val PublicMetrics = Value("public_metrics")
val Url = Value("url")
val Username = Value("username")
val Verified = Value("verified")
val Withheld = Value("withheld")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/rest/TimelineExclude.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.rest
object TimelineExclude extends Enumeration {
type TimelineExclude = Value
val Retweets = Value("retweets")
val Replies = Value("replies")
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/TweetResponse.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.responses
import com.danielasfregola.twitter4s.entities.v2.{Error, TweetIncludes, Tweet}
final case class TweetResponse(data: Option[Tweet], includes: Option[TweetIncludes], errors: Seq[Error])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/TweetsResponse.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.responses
import com.danielasfregola.twitter4s.entities.v2.{Error, Meta, Tweet, TweetIncludes}
final case class TweetsResponse(data: Seq[Tweet],
includes: Option[TweetIncludes],
meta: Option[Meta],
errors: Seq[Error])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/UserResponse.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.responses
import com.danielasfregola.twitter4s.entities.v2.{Error, UserIncludes, User}
case class UserResponse(data: Option[User], includes: Option[UserIncludes], errors: Seq[Error])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/UsersResponse.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.responses
import com.danielasfregola.twitter4s.entities.v2.{User, UserIncludes, Error}
case class UsersResponse(data: Seq[User], includes: Option[UserIncludes], errors: Seq[Error])
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/exceptions/TwitterException.scala
================================================
package com.danielasfregola.twitter4s.exceptions
import akka.http.scaladsl.model.StatusCode
final case class TwitterError(message: String, code: Int) {
override def toString = s"$message ($code)"
}
final case class Errors(errors: TwitterError*) {
override def toString = errors.mkString(", ")
}
object Errors {
def apply(throwable: Throwable): Errors = {
val error = TwitterError(throwable.getMessage, code = -1)
apply(error)
}
def apply(msg: String): Errors = {
val error = TwitterError(msg, code = -1)
apply(error)
}
}
final case class TwitterException(code: StatusCode, errors: Errors) extends Exception(s"[$code] $errors")
object TwitterException {
def apply(code: StatusCode, msg: String): TwitterException = {
val error = TwitterError(msg, code.intValue)
TwitterException(code, Errors(error))
}
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/Client.scala
================================================
package com.danielasfregola.twitter4s.http.clients
import akka.actor.ActorSystem
import akka.http.scaladsl.model.{HttpRequest, HttpResponse}
import akka.stream.Materializer
import akka.stream.scaladsl.{Sink, Source}
import com.danielasfregola.twitter4s.http.oauth.OAuth1Provider
import scala.concurrent.Future
trait Client extends OAuthClient {
val withLogRequest = false
val withLogRequestResponse = true
def oauthProvider: OAuth1Provider
protected def sendAndReceive[T](request: HttpRequest, f: HttpResponse => Future[T])(
implicit system: ActorSystem,
materializer: Materializer): Future[T] = {
implicit val r: HttpRequest = request
val requestStartTime = System.currentTimeMillis
if (withLogRequest) logRequest
Source
.single(request)
.via(connection)
.mapAsync(1)(implicit response => unmarshal(requestStartTime, f))
.runWith(Sink.head)
}
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/CommonClient.scala
================================================
package com.danielasfregola.twitter4s.http.clients
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.{HttpEntity, HttpRequest, HttpResponse}
import akka.stream.Materializer
import com.danielasfregola.twitter4s.exceptions.{Errors, TwitterException}
import com.danielasfregola.twitter4s.http.serializers.JsonSupport
import com.typesafe.scalalogging.LazyLogging
import org.json4s.native.Serialization
import scala.concurrent.Future
import scala.concurrent.duration._
import scala.util.Try
private[twitter4s] trait CommonClient extends JsonSupport with LazyLogging {
def withLogRequest: Boolean
def withLogRequestResponse: Boolean
protected def connection(implicit request: HttpRequest, system: ActorSystem) = {
val scheme = request.uri.scheme
val host = request.uri.authority.host.toString
val port = request.uri.effectivePort
if (scheme == "https") Http().outgoingConnectionHttps(host, port)
else Http().outgoingConnection(host, port)
}
protected def unmarshal[T](requestStartTime: Long, f: HttpResponse => Future[T])(implicit request: HttpRequest,
response: HttpResponse,
materializer: Materializer) = {
implicit val ec = materializer.executionContext
if (withLogRequestResponse) logRequestResponse(requestStartTime)
if (response.status.isSuccess) f(response)
else parseFailedResponse(response).flatMap(Future.failed)
}
protected def parseFailedResponse(response: HttpResponse)(implicit materializer: Materializer) = {
implicit val ec = materializer.executionContext
response.entity.toStrict(50 seconds).map { sink =>
val body = sink.data.utf8String
val errors = Try {
Serialization.read[Errors](body)
} getOrElse Errors(body)
TwitterException(response.status, errors)
}
}
// TODO - logRequest, logRequestResponse customisable?
def logRequest(implicit request: HttpRequest, materializer: Materializer): HttpRequest = {
implicit val ec = materializer.executionContext
logger.info(s"${request.method.value} ${request.uri}")
if (logger.underlying.isDebugEnabled) {
for {
requestBody <- toBody(request.entity)
} yield logger.debug(s"${request.method.value} ${request.uri} | $requestBody")
}
request
}
def logRequestResponse(requestStartTime: Long)(implicit request: HttpRequest,
materializer: Materializer): HttpResponse => HttpResponse = {
response =>
implicit val ec = materializer.executionContext
val elapsed = System.currentTimeMillis - requestStartTime
logger.info(s"${request.method.value} ${request.uri} (${response.status}) | ${elapsed}ms")
if (logger.underlying.isDebugEnabled) {
for {
responseBody <- toBody(response.entity)
} yield
logger.debug(
s"${request.method.value} ${request.uri} (${response.status}) | ${response.headers.mkString(", ")} | $responseBody")
}
response
}
private def toBody(entity: HttpEntity)(implicit materializer: Materializer): Future[String] = {
implicit val ec = materializer.executionContext
entity.toStrict(5 seconds).map(_.data.decodeString("UTF-8"))
}
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/OAuthClient.scala
================================================
package com.danielasfregola.twitter4s.http.clients
import akka.http.scaladsl.client.RequestBuilding
import akka.http.scaladsl.model.HttpMethods._
import akka.http.scaladsl.model._
import akka.stream.Materializer
import com.danielasfregola.twitter4s.http.marshalling.{BodyEncoder, Parameters}
import com.danielasfregola.twitter4s.http.oauth.OAuth1Provider
import scala.concurrent.{ExecutionContext, Future}
private[twitter4s] trait OAuthClient extends CommonClient with RequestBuilding {
def oauthProvider: OAuth1Provider
def withOAuthHeader(callback: Option[String])(
implicit materializer: Materializer): HttpRequest => Future[HttpRequest] = { request =>
implicit val ec = materializer.executionContext
for {
authorizationHeader <- oauthProvider.oauth1Header(callback)(request, materializer)
} yield request.withHeaders(request.headers :+ authorizationHeader)
}
def withSimpleOAuthHeader(callback: Option[String])(
implicit materializer: Materializer): HttpRequest => Future[HttpRequest] = { request =>
implicit val ec = materializer.executionContext
for {
authorizationHeader <- oauthProvider.oauth1Header(callback)(request.withEntity(HttpEntity.Empty), materializer)
} yield request.withHeaders(request.headers :+ authorizationHeader)
}
override val Get = new OAuthRequestBuilder(GET)
override val Post = new OAuthRequestBuilder(POST)
override val Put = new OAuthRequestBuilder(PUT)
override val Patch = new OAuthRequestBuilder(PATCH)
override val Delete = new OAuthRequestBuilder(DELETE)
override val Options = new OAuthRequestBuilder(OPTIONS)
override val Head = new OAuthRequestBuilder(HEAD)
private[twitter4s] class OAuthRequestBuilder(method: HttpMethod) extends RequestBuilder(method) with BodyEncoder {
def apply(uri: String, parameters: Parameters): HttpRequest =
if (parameters.toString.nonEmpty) apply(s"$uri?$parameters") else apply(uri)
def apply(uri: String, content: Product): HttpRequest = {
val data = toBodyAsEncodedParams(content)
val contentType = ContentType(MediaTypes.`application/x-www-form-urlencoded`)
apply(uri, data, contentType)
}
def asJson[A <: AnyRef](uri: String, content: A): HttpRequest = {
val jsonData = org.json4s.native.Serialization.write(content)
val contentType = ContentType(MediaTypes.`application/json`)
apply(uri, jsonData, contentType)
}
def apply(uri: String, content: Product, contentType: ContentType): HttpRequest = {
val data = toBodyAsParams(content)
apply(uri, data, contentType)
}
def apply(uri: String, data: String, contentType: ContentType): HttpRequest =
apply(uri).withEntity(HttpEntity(data).withContentType(contentType))
def apply(uri: String, multipartFormData: Multipart.FormData)(implicit ec: ExecutionContext): HttpRequest =
apply(Uri(uri), Some(multipartFormData))
}
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/AuthenticationClient.scala
================================================
package com.danielasfregola.twitter4s.http.clients.authentication
import akka.actor.ActorSystem
import akka.http.scaladsl.model.HttpRequest
import akka.stream.{ActorMaterializer, Materializer}
import com.danielasfregola.twitter4s.entities.ConsumerToken
import com.danielasfregola.twitter4s.http.clients.Client
import com.danielasfregola.twitter4s.http.oauth.OAuth1Provider
import com.danielasfregola.twitter4s.http.serializers.{FormSupport, FromMap}
import scala.concurrent.Future
private[twitter4s] class AuthenticationClient(val consumerToken: ConsumerToken)(implicit val system: ActorSystem)
extends Client {
lazy val oauthProvider = new OAuth1Provider(consumerToken, None)
private[twitter4s] implicit class RichRestHttpRequest(val request: HttpRequest) {
implicit val materializer = ActorMaterializer()
implicit val ec = materializer.executionContext
def respondAs[T: Manifest](implicit fromMap: FromMap[T]): Future[T] = respondAs[T](None)
def respondAs[T: Manifest](callback: Option[String])(implicit fromMap: FromMap[T]): Future[T] =
for {
requestWithAuth <- withOAuthHeader(callback)(materializer)(request)
t <- sendReceiveAs[T](requestWithAuth)
} yield t
}
def sendReceiveAs[T: Manifest](httpRequest: HttpRequest)(implicit system: ActorSystem,
materializer: Materializer,
fromMap: FromMap[T]): Future[T] = {
sendAndReceive(httpRequest, response => FormSupport.unmarshallText(response))
}
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/oauth/TwitterOAuthClient.scala
================================================
package com.danielasfregola.twitter4s.http
package clients.authentication.oauth
import com.danielasfregola.twitter4s.entities.authentication.{OAuthAccessToken, OAuthRequestToken, RequestToken}
import com.danielasfregola.twitter4s.entities.enums.AccessType.AccessType
import com.danielasfregola.twitter4s.http.clients.authentication.AuthenticationClient
import com.danielasfregola.twitter4s.http.clients.authentication.oauth.parameters.{
AccessTokenParameters,
RequestTokenParameters
}
import com.danielasfregola.twitter4s.util.Configurations._
import scala.concurrent.Future
/** Implements the available requests for the `oauth` resource.
* */
trait TwitterOAuthClient {
protected val authenticationClient: AuthenticationClient
private val oauthUrl = s"$apiTwitterUrl/oauth"
/** Allows a Consumer application to obtain an OAuth Request Token to request user authorization.
* This method fulfills <a href="http://oauth.net/core/1.0/#auth_step1">Section 6.1</a> of the
* <a href="http://oauth.net/core/1.0/#anchor9">OAuth 1.0 authentication flow</a>.
* For more information see
* <a href="https://developer.twitter.com/en/docs/basics/authentication/api-reference/request_token" target="_blank">
* https://developer.twitter.com/en/docs/basics/authentication/api-reference/request_token</a>.
*
* @param oauth_callback : Optional, by default is `None`.
* For OAuth 1.0a compliance this parameter is required.
* The value you specify here will be used as the URL a user is redirected
* to should they approve your application’s access to their account.
* Set this to oob for out-of-band pin mode. This is also how you specify
* custom callbacks for use in desktop/mobile applications.
* @param x_auth_access_type : Optional, by default is `None`.
* Overrides the access level an application requests to a users account.
* Supported values are read or write . This parameter is intended to
* allow a developer to register a read/write application but also request
* read only access when appropriate.
* @return : The authentication request token.
* */
def requestToken(oauth_callback: Option[String] = None,
x_auth_access_type: Option[AccessType] = None): Future[OAuthRequestToken] = {
import authenticationClient._
val parameters = RequestTokenParameters(x_auth_access_type)
Post(s"$oauthUrl/request_token", parameters).respondAs[OAuthRequestToken](oauth_callback)
}
/** Allows a Consumer application to use an OAuth request_token to request user authorization.
* This method is a replacement of <a href="http://oauth.net/core/1.0/#auth_step2">Section 6.2</a>
* of the <a href="http://oauth.net/core/1.0/#anchor9">OAuth 1.0 authentication flow</a>
* for applications using the callback authentication flow.
* The method will use the currently logged in user as the account for access authorization unless
* the `force_login` parameter is set to true.
* This method differs from [[authorizeUrl]] in that if the user has already granted the application permission,
* the redirect will occur without the user having to re-approve the application.
* To realize this behavior, you must enable the `Use Sign in with Twitter` setting on your
* <a href="https://apps.twitter.com/">application record</a>.
* For more information see
* <a href="https://developer.twitter.com/en/docs/basics/authentication/api-reference/authenticate" target="_blank">
* https://developer.twitter.com/en/docs/basics/authentication/api-reference/authenticate</a>.
*
* @param token : The OAuthRequestToken.token obtained from [[requestToken]]
* @param force_login : By default is `false`. When set to `true`, it forces the user to
* enter their credentials to ensure the correct users account is authorized.
* @param screen_name : Optional, by default it is `None`.
* It prefills the username input box of the OAuth login screen with the given value.
* @return : The authentication url to use in a web browser for the user to complete the authentication process.
* */
def authenticateUrl(token: RequestToken, force_login: Boolean = false, screen_name: Option[String] = None): String =
genericOAuthUrl("authenticate")(token, force_login, screen_name)
/** Allows a Consumer application to use an OAuth Request Token to request user authorization.
* This method fulfills <a href="http://oauth.net/core/1.0/#auth_step2">Section 6.2</a>
* of the <a href="http://oauth.net/core/1.0/#anchor9">OAuth 1.0 authentication flow</a>.
* Desktop applications must use this method (and cannot use [[authenticateUrl]]).
* For more information see
* <a href="https://developer.twitter.com/en/docs/basics/authentication/api-reference/authenticate" target="_blank">
* https://developer.twitter.com/en/docs/basics/authentication/api-reference/authenticate</a>.
*
* @param token : The OAuthRequestToken.token obtained from [[requestToken]]
* @param force_login : By default is `false`. When set to `true`, it forces the user to
* enter their credentials to ensure the correct users account is authorized.
* @param screen_name : Optional, by default it is `None`.
* It prefills the username input box of the OAuth login screen with the given value.
* @return : The url to use in a web browser for the user to complete the authorization process.
* */
def authorizeUrl(token: RequestToken, force_login: Boolean = false, screen_name: Option[String] = None): String =
genericOAuthUrl("authorize")(token, force_login, screen_name)
private def genericOAuthUrl(
path: String)(token: RequestToken, force_login: Boolean, screen_name: Option[String]): String = {
val params = {
val queryParams = List(Some("oauth_token" -> token.key),
Some("force_login" -> force_login),
screen_name.map(n => "screen_name" -> n))
queryParams.flatten.map { case (key, value) => s"$key=$value" }.mkString("&")
}
s"$oauthUrl/$path?$params"
}
/** Allows a Consumer application to exchange the OAuth Request Token for an OAuth Access Token using xAuth.
* This method fulfills <a class="reference external" href="http://oauth.net/core/1.0/#auth_step3">Section 6.3</a>
* of the <a class="reference external" href="http://oauth.net/core/1.0/#anchor9">OAuth 1.0 authentication flow</a>.
* For more information see
* <a href="https://developer.twitter.com/en/docs/basics/authentication/api-reference/access_token" target="_blank">
* https://developer.twitter.com/en/docs/basics/authentication/api-reference/access_token</a>.
*
* @param x_auth_username : The username of the user to obtain a token for.
* @param x_auth_password : The password of the user for which to obtain a token for.
* @return : The access token for the requested user.
* */
def accessToken(x_auth_username: String, x_auth_password: String): Future[OAuthAccessToken] = {
val parameters = AccessTokenParameters(x_auth_username = Some(x_auth_username),
x_auth_password = Some(x_auth_password),
x_auth_mode = Some("client_auth"))
import authenticationClient._
Post(s"$oauthUrl/access_token", parameters).respondAs[OAuthAccessToken]
}
/** Allows a Consumer application to exchange the OAuth Request Token for an OAuth Access Token using OAuth 1.0.
* This method fulfills <a class="reference external" href="http://oauth.net/core/1.0/#auth_step3">Section 6.3</a>
* of the <a class="reference external" href="http://oauth.net/core/1.0/#anchor9">OAuth 1.0 authentication flow</a>.
* For more information see
* <a href="https://developer.twitter.com/en/docs/basics/authentication/api-reference/access_token" target="_blank">
* https://developer.twitter.com/en/docs/basics/authentication/api-reference/access_token</a>.
*
* @param token : The OAuthRequestToken.token obtained from [[requestToken]]
* @param oauth_verifier : the `oauth_verifier` returned in the callback of the URL
* provided by [[authenticateUrl]] or [[authorizeUrl]].
* @return : The access token for the requested user.
* */
def accessToken(token: RequestToken, oauth_verifier: String): Future[OAuthAccessToken] = {
val parameters = AccessTokenParameters(oauth_token = Some(token.key), oauth_verifier = Some(oauth_verifier))
import authenticationClient._
Post(s"$oauthUrl/access_token", parameters).respondAs[OAuthAccessToken]
}
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/oauth/parameters/AccessTokenParameters.scala
================================================
package com.danielasfregola.twitter4s.http.clients.authentication.oauth.parameters
import com.danielasfregola.twitter4s.http.marshalling.Parameters
private[twitter4s] final case class AccessTokenParameters(x_auth_username: Option[String] = None,
x_auth_password: Option[String] = None,
x_auth_mode: Option[String] = None,
oauth_verifier: Option[String] = None,
oauth_token: Option[String] = None)
extends Parameters
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/oauth/parameters/RequestTokenParameters.scala
================================================
package com.danielasfregola.twitter4s.http.clients.authentication.oauth.parameters
import com.danielasfregola.twitter4s.entities.enums.AccessType.AccessType
import com.danielasfregola.twitter4s.http.marshalling.Parameters
private[twitter4s] final case class RequestTokenParameters(x_auth_access_type: Option[AccessType]) extends Parameters
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/RestClient.scala
================================================
package com.danielasfregola.twitter4s.http.clients.rest
import akka.actor.ActorSystem
import akka.http.scaladsl.model.{HttpRequest, HttpResponse}
import akka.http.scaladsl.unmarshalling.Unmarshal
import akka.stream.{ActorMaterializer, Materializer}
import com.danielasfregola.twitter4s.entities.{AccessToken, ConsumerToken, RateLimit, RatedData}
import com.danielasfregola.twitter4s.http.clients.Client
import com.danielasfregola.twitter4s.http.oauth.OAuth1Provider
import scala.concurrent.Future
private[twitter4s] class RestClient(val consumerToken: ConsumerToken, val accessToken: AccessToken)(
implicit val system: ActorSystem)
extends Client {
lazy val oauthProvider = new OAuth1Provider(consumerToken, Some(accessToken))
private[twitter4s] implicit class RichRestHttpRequest(val request: HttpRequest) {
implicit val materializer = ActorMaterializer()
implicit val ec = materializer.executionContext
def respondAs[T: Manifest]: Future[T] =
for {
requestWithAuth <- withOAuthHeader(None)(materializer)(request)
t <- sendReceiveAs[T](requestWithAuth)
} yield t
def respondAsRated[T: Manifest]: Future[RatedData[T]] =
for {
requestWithAuth <- withOAuthHeader(None)(materializer)(request)
t <- sendReceiveAsRated[T](requestWithAuth)
} yield t
def sendAsFormData: Future[Unit] =
for {
requestWithAuth <- withSimpleOAuthHeader(None)(materializer)(request)
_ <- sendIgnoreResponse(requestWithAuth)
} yield ()
}
def sendIgnoreResponse(httpRequest: HttpRequest)(implicit system: ActorSystem,
materializer: Materializer): Future[Unit] = {
sendAndReceive(httpRequest, _ => Future.successful((): Unit))
}
def sendReceiveAs[T: Manifest](httpRequest: HttpRequest)(implicit system: ActorSystem,
materializer: Materializer): Future[T] = {
implicit val ec = materializer.executionContext
implicit val jsonSerialization = serialization
sendAndReceive(httpRequest, response => Unmarshal(response.entity).to[T])
}
def sendReceiveAsRated[T: Manifest](httpRequest: HttpRequest)(implicit system: ActorSystem,
materializer: Materializer): Future[RatedData[T]] = {
implicit val ec = materializer.executionContext
implicit val jsonSerialization = serialization
val unmarshallRated: HttpResponse => Future[RatedData[T]] = { response =>
val rate = RateLimit(response.headers)
val data = Unmarshal(response.entity).to[T]
data.map(d => RatedData(rate, d))
}
sendAndReceive(httpRequest, unmarshallRated)
}
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/account/TwitterAccountClient.scala
================================================
package com.danielasfregola.twitter4s.http.clients.rest.account
import com.danielasfregola.twitter4s.entities._
import com.danielasfregola.twitter4s.entities.enums.ContributorType.ContributorType
import com.danielasfregola.twitter4s.entities.enums.Hour._
import com.danielasfregola.twitter4s.entities.enums.Language._
import com.danielasfregola.twitter4s.entities.enums.TimeZone._
import com.danielasfregola.twitter4s.http.clients.rest.RestClient
import com.danielasfregola.twitter4s.http.clients.rest.account.parameters.CredentialsParameters
import com.danielasfregola.twitter4s.util.Configurations._
import scala.concurrent.Future
/** Implements the available requests for the `account` resource.
* */
trait TwitterAccountClient {
protected val restClient: RestClient
private val accountUrl = s"$apiTwitterUrl/$twitterVersion/account"
/** Returns settings (including current trend, geo and sleep time information) for the authenticating user.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/get-account-settings" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/get-account-settings</a>.
*
* @return : The account settings for the authenticating user.
* */
def settings(): Future[RatedData[Settings]] = {
import restClient._
Get(s"$accountUrl/settings.json").respondAsRated[Settings]
}
/** Updates the authenticating user’s settings.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-remove_profile_banner" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-remove_profile_banner</a>.
*
* @param allow_contributor_request : Optional, by default it is `None`.
* Whether to allow others to include user as contributor.
* Possible values include `All` (anyone can include user),
* `Following` (only followers can include user) or `None`.
* @param sleep_time_enabled : Optional, by default it is `None`.
* When set to `true`, will enable sleep time for the user.
* Sleep time is the time when push or SMS notifications should not be sent to the user.
* @param start_sleep_time : Optional, by default it is `None`.
* The hour that sleep time should begin if it is enabled.
* The time is considered to be in the same timezone as the user’s time_zone setting.
* @param end_sleep_time : Optional, by default it is `None`.
* The hour that sleep time should end if it is enabled.
* The time is considered to be in the same timezone as the user’s time_zone setting.
* @param lang : Optional, by default it is `None`.
* The language which Twitter should render in for this user.
* @param time_zone : Optional, by default it is `None`.
* The timezone dates and times should be displayed in for the user.
* @param trend_location_woeid : Optional, by default it is `None`.
* The Yahoo! Where On Earth ID to use as the user’s default trend location.
* Global information is available by using 1 as the WOEID.
* The woeid must be one of the locations returned by [node:59].
* @return : The updated settings.
* */
def updateSettings(allow_contributor_request: Option[ContributorType] = None,
sleep_time_enabled: Option[Boolean] = None,
start_sleep_time: Option[Hour] = None,
end_sleep_time: Option[Hour] = None,
lang: Option[Language] = None,
time_zone: Option[TimeZone] = None,
trend_location_woeid: Option[Long] = None): Future[Settings] = {
val options = SettingsOptions(allow_contributor_request,
sleep_time_enabled,
start_sleep_time,
end_sleep_time,
lang,
time_zone,
trend_location_woeid)
updateSettings(options)
}
/** Updates the authenticating user’s settings.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-remove_profile_banner" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-remove_profile_banner</a>.
*
* @param settings_options : The setting options to update. Only the parameters specified will be updated.
* @return : The updated settings.
* */
def updateSettings(settings_options: SettingsOptions): Future[Settings] = {
import restClient._
Post(s"$accountUrl/settings.json", settings_options).respondAs[Settings]
}
/** Returns a representation of the requesting user if authentication was successful; it throws a [[com.danielasfregola.twitter4s.exceptions.TwitterException]] if not.
* Use this method to test if supplied user credentials are valid.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/get-account-verify_credentials" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/get-account-verify_credentials</a>.
*
* @param include_entities : By default it is `true`.
* The parameters node will not be included when set to false.
* @param skip_status : By default it is `false`.
* When set to either `true` statuses will not be included in the returned user object.
* @param include_email : By default it is `false`.
* When set to `true` email will be returned in the user objects.
* If the user does not have an email address on their account, or if the email address is un-verified, null will be returned.
* @return : The user representation.
* */
def verifyCredentials(include_entities: Boolean = true,
skip_status: Boolean = false,
include_email: Boolean = false): Future[RatedData[User]] = {
import restClient._
val parameters = CredentialsParameters(include_entities, skip_status, include_email)
Get(s"$accountUrl/verify_credentials.json", parameters).respondAsRated[User]
}
/** Sets the name that users are able to set under the “Account” tab of their settings page.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile</a>.
*
* @param name : Full name associated with the profile. Maximum of 20 characters.
* @param include_entities : By default it is `true`.
* The parameters node will not be included when set to false.
* @param skip_status : By default it is `false`.
* When set to either `true` statuses will not be included in the returned user object.
* @return : The user representation.
* */
def updateProfileName(name: String, include_entities: Boolean = true, skip_status: Boolean = false): Future[User] = {
val update = ProfileUpdate(name = Some(name), include_entities = include_entities, skip_status = skip_status)
updateProfile(update)
}
/** Sets the url that users are able to set under the “Account” tab of their settings page.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile</a>.
*
* @param url : URL associated with the profile. Will be prepended with “http://” if not present.
* Maximum of 100 characters.
* @param include_entities : By default it is `true`.
* The parameters node will not be included when set to false.
* @param skip_status : By default it is `false`.
* When set to either `true` statuses will not be included in the returned user object.
* @return : The user representation.
* */
def updateProfileUrl(url: String, include_entities: Boolean = true, skip_status: Boolean = false): Future[User] = {
val update = ProfileUpdate(url = Some(url), include_entities = include_entities, skip_status = skip_status)
updateProfile(update)
}
/** Sets the location that users are able to set under the “Account” tab of their settings page.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile</a>.
*
* @param location : The city or country describing where the user of the account is located.
* The contents are not normalized or geocoded in any way. Maximum of 30 characters.
* @param include_entities : By default it is `true`.
* The parameters node will not be included when set to false.
* @param skip_status : By default it is `false`.
* When set to either `true` statuses will not be included in the returned user object.
* @return : The user representation.
* */
def updateProfileLocation(location: String,
include_entities: Boolean = true,
skip_status: Boolean = false): Future[User] = {
val update =
ProfileUpdate(location = Some(location), include_entities = include_entities, skip_status = skip_status)
updateProfile(update)
}
/** Sets the description that users are able to set under the “Account” tab of their settings page.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile</a>.
*
* @param description : A description of the user owning the account. Maximum of 160 characters.
* @param include_entities : By default it is `true`.
* The parameters node will not be included when set to false.
* @param skip_status : By default it is `false`.
* When set to either `true` statuses will not be included in the returned user object.
* @return : The user representation.
* */
def updateProfileDescription(description: String,
include_entities: Boolean = true,
skip_status: Boolean = false): Future[User] = {
val update =
ProfileUpdate(description = Some(description), include_entities = include_entities, skip_status = skip_status)
updateProfile(update)
}
/** Sets the link color that users are able to set under the “Account” tab of their settings page.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile</a>.
*
* @param link_color : Sets a hex value that controls the color scheme of links used on the authenticating user’s profile page on twitter.com.
* This must be a valid hexadecimal value, and may be either three or six characters (ex: F00 or FF0000).
* @param include_entities : By default it is `true`.
* The parameters node will not be included when set to false.
* @param skip_status : By default it is `false`.
* When set to either `true` statuses will not be included in the returned user object.
* @return : The user representation.
* */
def updateProfileLinkColor(link_color: String,
include_entities: Boolean = true,
skip_status: Boolean = false): Future[User] = {
val update = ProfileUpdate(profile_link_color = Some(link_color),
include_entities = include_entities,
skip_status = skip_status)
updateProfile(update)
}
/** Sets some values that users are able to set under the “Account” tab of their settings page. Only the parameters specified will be updated.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile</a>.
*
* @param update : The profile values to update.
* @return : The user representation.
* */
def updateProfile(update: ProfileUpdate): Future[User] = {
import restClient._
Post(s"$accountUrl/update_profile.json", update).respondAs[User]
}
/** Removes the uploaded profile banner for the authenticating user.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-remove_profile_banner" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-remove_profile_banner</a>.
* */
def removeProfileBanner(): Future[Unit] = {
import restClient._
Post(s"$accountUrl/remove_profile_banner.json").respondAs[Unit]
}
// TODO - support update_profile_backgroung_image
// TODO - support update_profile_image
// TODO - support update_profile_banner
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/account/parameters/CredentialsParameters.scala
================================================
package com.danielasfregola.twitter4s.http.clients.rest.account.parameters
import com.danielasfregola.twitter4s.http.marshalling.Parameters
private[twitter4s] final case class CredentialsParameters(include_entities: Boolean,
skip_status: Boolean,
include_email: Boolean)
extends Parameters
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/accountactivity/TwitterAccountActivityClient.scala
================================================
package com.danielasfregola.twitter4s.http.clients.rest.accountactivity
import com.danielasfregola.twitter4s.entities._
import com.danielasfregola.twitter4s.http.clients.rest.RestClient
import com.danielasfregola.twitter4s.http.clients.rest.accountactivity.parameters.WebhooksParameters
import com.danielasfregola.twitter4s.util.Configurations._
import scala.concurrent.Future
/** Implements the available requests for the `account_activity` resource.
* */
trait TwitterAccountActivityClient {
protected val restClient: RestClient
private val accountUrl = s"$apiTwitterUrl/$twitterVersion/account_activity/all"
/** Registers a webhook URL for your environment.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#post-account-activity-all-env-name-webhooks" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#post-account-activity-all-env-name-webhooks</a>.
*
* @param env_name : The environment name is the name of the App that provide the access to the Account Activity API.
* @param url : The encoded URL for the webhook callback endpoint.
* @return : The webhook representation.
* */
def registerWebhook(env_name: String, url: String): Future[Webhook] = {
import restClient._
val parameters = WebhooksParameters(url)
Post(s"$accountUrl/$env_name/webhooks.json", parameters).respondAs[Webhook]
}
/** Removes the webhook from the provided application.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#delete-account-activity-all-env-name-webhooks-webhook-id" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#delete-account-activity-all-env-name-webhooks-webhook-id</a>.
*
* @param env_name : The environment name is the name of the App that provide the access to the Account Activity API.
* @param webhookId : The id of the webhook that you want to remove.
* */
def removeWebhook(env_name: String, webhookId: String): Future[Unit] = {
import restClient._
Delete(s"$accountUrl/$env_name/webhooks/$webhookId.json").sendAsFormData
}
/** Reenables the webhook by setting its status to valid. It triggers the challenge response check (CRC) for the given enviroments webhook for all activites.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#put-account-activity-all-env-name-webhooks-webhook-id" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#put-account-activity-all-env-name-webhooks-webhook-id</a>.
*
* @param env_name : The environment name is the name of the App that provide the access to the Account Activity API.
* @param webhookId : The id of the webhook that you want to remove.
* */
def reenableWebhook(env_name: String, webhookId: String): Future[Unit] = {
import restClient._
Put(s"$accountUrl/$env_name/webhooks/$webhookId.json").sendAsFormData
}
/** Subscribes the provided application to all events for the provided environment for all message types.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#post-account-activity-all-env-name-subscriptions" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#post-account-activity-all-env-name-subscriptions</a>.
*
* @param env_name : The environment name is the name of the App that provide the access to the Account Activity API.
* */
def subscribeAll(env_name: String): Future[Unit] = {
import restClient._
Post(s"$accountUrl/$env_name/subscriptions.json").sendAsFormData
}
/** Deactivates subscription(s) for the provided user context and application for all activities.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#delete-account-activity-all-env-name-subscriptions-deprecated-" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#delete-account-activity-all-env-name-subscriptions-deprecated-</a>.
*
* @param env_name : The environment name is the name of the App that provide the access to the Account Activity API.
* */
def unsubscribeAll(env_name: String): Future[Unit] = {
import restClient._
Delete(s"$accountUrl/$env_name/subscriptions.json").sendAsFormData
}
/** Provides a way to determine if a webhook configuration is subscribed to the provided user’s events. If the provided user context has an active subscription with provided application, returns 204 OK. If the response code is not 204, then the user does not have an active subscription.
* For more information see
* <a href="https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#get-account-activity-all-env-name-subscriptions" target="_blank">
* https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#get-account-activity-all-env-name-subscriptions</a>.
*
* @param env_name : The environment name is the name of the App that provide the access to the Account Activity API.
* */
def isUserSubscribed(env_name: String): Future[Unit] = {
import restClient._
Get(s"$accountUrl/$env_name/subscriptions.json").sendAsFormData
}
// The following routes require a Bearer token to authenticate the corresponding requests
// TODO - GET webhooks.json https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#get-account-activity-all-webhooks
// TODO - GET subscriptions/count.json https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#get-account-activity-all-subscriptions-count
// TODO - GET :env_name/subscriptions/list.json https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#get-account-activity-all-env-name-subscriptions-list
// TODO - DELETE :env_name/subscriptions/:user_id.json (deprecate unsubscribeAll when implementing this endpoint) https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#delete-account-activity-all-env-name-subscriptions-user-id-json
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/accountactivity/parameters/WebhooksParameters.scala
================================================
package com.danielasfregola.twitter4s.http.clients.rest.accountactivity.parameters
import com.danielasfregola.twitter4s.http.marshalling.Parameters
private[twitter4s] final case class WebhooksParameters(url: String) extends Parameters
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/application/TwitterApplicationClient.scala
================================================
package com.danielasfregola.twitter4s.http.clients.rest.application
import com.danielasfregola.twitter4s.entities.enums.Resource.Resource
import com.danielasfregola.twitter4s.entities.{RateLimits, RatedData}
import com.danielasfregola.twitter4s.http.clients.rest.RestClient
import com.danielasfregola.twitter4s.http.clients.rest.application.parameters.RatesParameters
import com.danielasfregola.twitter4s.util.Configurations._
import scala.concurrent.Future
/** Implements the available requests for the `application` resource.
*/
trait TwitterApplicationClient {
protected val restClient: RestClient
private val applicationUrl = s"$apiTwitterUrl/$twitterVersion/application"
/** Returns the current rate limits for methods belonging to the specified resource families.
* For more information see
* <a href="https://developer.twitter.com/en/docs/developer-utilities/rate-limit-status/api-reference/get-application-rate_limit_status" target="_blank">
* https://developer.twitter.com/en/docs/developer-utilities/rate-limit-status/api-reference/get-application-rate_limit_status</a>.
*
* @param resources : A comma-separated list of resource families you want to know the current rate limit disposition for.
* If no resources are specified, all the resources are considered.
* @return : The current rate limits for methods belonging to the specified resource families.
*/
def rateLimits(resources: Resource*): Future[RatedData[RateLimits]] = {
import restClient._
val parameters = RatesParameters(Option(resources.mkString(",")).filter(_.trim.nonEmpty))
Get(s"$applicationUrl/rate_limit_status.json", parameters).respondAsRated[RateLimits]
}
}
================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/application/parameters/RatesParameters.scala
================================================
package com.danielasfregola.twitter4s.http.clients.rest.application.parameters
import com.danielasfr
gitextract_z8tpb3no/
├── .circleci/
│ └── config.yml
├── .gitignore
├── .mergify.yml
├── .scalafmt.conf
├── LICENSE
├── README.md
├── build.sbt
├── project/
│ ├── build.properties
│ └── plugins.sbt
├── sonatype.sbt
└── src/
├── main/
│ ├── resources/
│ │ └── reference.conf
│ └── scala/
│ └── com/
│ └── danielasfregola/
│ └── twitter4s/
│ ├── TwitterAuthenticationClient.scala
│ ├── TwitterRestClient.scala
│ ├── TwitterRestV2Client.scala
│ ├── TwitterStreamingClient.scala
│ ├── entities/
│ │ ├── AccessToken.scala
│ │ ├── Accuracy.scala
│ │ ├── Area.scala
│ │ ├── Banners.scala
│ │ ├── Category.scala
│ │ ├── Configuration.scala
│ │ ├── ConsumerToken.scala
│ │ ├── Contributor.scala
│ │ ├── Coordinate.scala
│ │ ├── Coordinates.scala
│ │ ├── DirectMessage.scala
│ │ ├── DirectMessageEvent.scala
│ │ ├── DirectMessageEventList.scala
│ │ ├── Entities.scala
│ │ ├── ExtendedTweet.scala
│ │ ├── Geo.scala
│ │ ├── GeoBoundingBox.scala
│ │ ├── GeoCode.scala
│ │ ├── GeoPlace.scala
│ │ ├── GeoSearch.scala
│ │ ├── HashTag.scala
│ │ ├── Image.scala
│ │ ├── LanguageDetails.scala
│ │ ├── Location.scala
│ │ ├── LocationTrends.scala
│ │ ├── LookupEntities.scala
│ │ ├── LookupMapped.scala
│ │ ├── LookupRelationship.scala
│ │ ├── LookupTweet.scala
│ │ ├── LookupUser.scala
│ │ ├── Media.scala
│ │ ├── MediaDetails.scala
│ │ ├── MediaUpload.scala
│ │ ├── OEmbedTweet.scala
│ │ ├── PrivacyPolicy.scala
│ │ ├── ProfileImage.scala
│ │ ├── ProfileUpdate.scala
│ │ ├── RateLimit.scala
│ │ ├── RateLimits.scala
│ │ ├── RatedData.scala
│ │ ├── Relationship.scala
│ │ ├── SavedSearch.scala
│ │ ├── Settings.scala
│ │ ├── SettingsOptions.scala
│ │ ├── Size.scala
│ │ ├── StatusMediaDetails.scala
│ │ ├── Suggestions.scala
│ │ ├── Symbol.scala
│ │ ├── TermsOfService.scala
│ │ ├── Tweet.scala
│ │ ├── TweetId.scala
│ │ ├── TweetSearch.scala
│ │ ├── TweetUpdate.scala
│ │ ├── TwitterList.scala
│ │ ├── TwitterListUpdate.scala
│ │ ├── TwitterLists.scala
│ │ ├── UploadedMedia.scala
│ │ ├── Url.scala
│ │ ├── User.scala
│ │ ├── UserIds.scala
│ │ ├── UserMention.scala
│ │ ├── UserStringifiedIds.scala
│ │ ├── Users.scala
│ │ ├── Variant.scala
│ │ ├── Video.scala
│ │ ├── VideoInfo.scala
│ │ ├── Webhook.scala
│ │ ├── authentication/
│ │ │ ├── OAuthAccessToken.scala
│ │ │ └── OAuthRequestToken.scala
│ │ ├── enums/
│ │ │ ├── AccessType.scala
│ │ │ ├── Alignment.scala
│ │ │ ├── ContributorType.scala
│ │ │ ├── DisconnectionCode.scala
│ │ │ ├── EventCode.scala
│ │ │ ├── FilterLevel.scala
│ │ │ ├── Granularity.scala
│ │ │ ├── Hour.scala
│ │ │ ├── Language.scala
│ │ │ ├── Measure.scala
│ │ │ ├── MediaType.scala
│ │ │ ├── Mode.scala
│ │ │ ├── Resource.scala
│ │ │ ├── ResultType.scala
│ │ │ ├── TimeZone.scala
│ │ │ ├── TweetMode.scala
│ │ │ ├── WidgetType.scala
│ │ │ └── WithFilter.scala
│ │ ├── streaming/
│ │ │ ├── StreamingUpdate.scala
│ │ │ ├── common/
│ │ │ │ ├── DisconnectMessage.scala
│ │ │ │ ├── LimitNotice.scala
│ │ │ │ ├── LocationDeletionNotice.scala
│ │ │ │ ├── StatusDeletionNotice.scala
│ │ │ │ ├── StatusWithheldNotice.scala
│ │ │ │ ├── UserWithheldNotice.scala
│ │ │ │ └── WarningMessage.scala
│ │ │ ├── site/
│ │ │ │ ├── ControlMessage.scala
│ │ │ │ └── UserEnvelop.scala
│ │ │ └── user/
│ │ │ ├── Event.scala
│ │ │ └── FriendsLists.scala
│ │ └── v2/
│ │ ├── Error.scala
│ │ ├── Media.scala
│ │ ├── Meta.scala
│ │ ├── Place.scala
│ │ ├── Poll.scala
│ │ ├── Tweet.scala
│ │ ├── TweetEntities.scala
│ │ ├── TweetIncludes.scala
│ │ ├── User.scala
│ │ ├── UserEntities.scala
│ │ ├── UserIncludes.scala
│ │ ├── Withheld.scala
│ │ ├── enums/
│ │ │ ├── CoordinatesType.scala
│ │ │ ├── MediaType.scala
│ │ │ ├── ReferencedTweetType.scala
│ │ │ ├── TweetReplySetting.scala
│ │ │ ├── WithheldScope.scala
│ │ │ ├── expansions/
│ │ │ │ ├── TweetExpansions.scala
│ │ │ │ └── UserExpansions.scala
│ │ │ ├── fields/
│ │ │ │ ├── MediaFields.scala
│ │ │ │ ├── PlaceFields.scala
│ │ │ │ ├── PollFields.scala
│ │ │ │ ├── TweetFields.scala
│ │ │ │ └── UserFields.scala
│ │ │ └── rest/
│ │ │ └── TimelineExclude.scala
│ │ └── responses/
│ │ ├── TweetResponse.scala
│ │ ├── TweetsResponse.scala
│ │ ├── UserResponse.scala
│ │ └── UsersResponse.scala
│ ├── exceptions/
│ │ └── TwitterException.scala
│ ├── http/
│ │ ├── clients/
│ │ │ ├── Client.scala
│ │ │ ├── CommonClient.scala
│ │ │ ├── OAuthClient.scala
│ │ │ ├── authentication/
│ │ │ │ ├── AuthenticationClient.scala
│ │ │ │ └── oauth/
│ │ │ │ ├── TwitterOAuthClient.scala
│ │ │ │ └── parameters/
│ │ │ │ ├── AccessTokenParameters.scala
│ │ │ │ └── RequestTokenParameters.scala
│ │ │ ├── rest/
│ │ │ │ ├── RestClient.scala
│ │ │ │ ├── account/
│ │ │ │ │ ├── TwitterAccountClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ └── CredentialsParameters.scala
│ │ │ │ ├── accountactivity/
│ │ │ │ │ ├── TwitterAccountActivityClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ └── WebhooksParameters.scala
│ │ │ │ ├── application/
│ │ │ │ │ ├── TwitterApplicationClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ └── RatesParameters.scala
│ │ │ │ ├── blocks/
│ │ │ │ │ ├── TwitterBlockClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── BlockParameters.scala
│ │ │ │ │ ├── BlockedUserIdsParameters.scala
│ │ │ │ │ └── BlockedUsersParameters.scala
│ │ │ │ ├── directmessages/
│ │ │ │ │ ├── TwitterDirectMessageClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── CreateEventParameters.scala
│ │ │ │ │ ├── CreateParameters.scala
│ │ │ │ │ ├── DestroyParameters.scala
│ │ │ │ │ ├── EventListParameters.scala
│ │ │ │ │ ├── ReceivedParameters.scala
│ │ │ │ │ ├── SentParameters.scala
│ │ │ │ │ └── ShowParameters.scala
│ │ │ │ ├── favorites/
│ │ │ │ │ ├── TwitterFavoriteClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── FavoriteParameters.scala
│ │ │ │ │ └── FavoritesParameters.scala
│ │ │ │ ├── followers/
│ │ │ │ │ ├── TwitterFollowerClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── FollowersParameters.scala
│ │ │ │ │ └── FollowingParameters.scala
│ │ │ │ ├── friends/
│ │ │ │ │ ├── TwitterFriendClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── FriendParameters.scala
│ │ │ │ │ └── FriendsParameters.scala
│ │ │ │ ├── friendships/
│ │ │ │ │ ├── TwitterFriendshipClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── BlockedParameters.scala
│ │ │ │ │ ├── FollowParameters.scala
│ │ │ │ │ ├── FriendshipParameters.scala
│ │ │ │ │ ├── NotificationParameters.scala
│ │ │ │ │ ├── RelationshipParameters.scala
│ │ │ │ │ ├── RelationshipsParameters.scala
│ │ │ │ │ └── UnfollowParameters.scala
│ │ │ │ ├── geo/
│ │ │ │ │ ├── TwitterGeoClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── GeoSearchParameters.scala
│ │ │ │ │ └── ReverseGeoCodeParameters.scala
│ │ │ │ ├── help/
│ │ │ │ │ └── TwitterHelpClient.scala
│ │ │ │ ├── lists/
│ │ │ │ │ ├── TwitterListClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── AddMemberParameters.scala
│ │ │ │ │ ├── CreateListParameters.scala
│ │ │ │ │ ├── ListMembersParameters.scala
│ │ │ │ │ ├── ListParameters.scala
│ │ │ │ │ ├── ListTimelineParameters.scala
│ │ │ │ │ ├── ListsParameters.scala
│ │ │ │ │ ├── MemberParameters.scala
│ │ │ │ │ ├── MembersParameters.scala
│ │ │ │ │ ├── MembershipsParameters.scala
│ │ │ │ │ ├── OwnershipsParameters.scala
│ │ │ │ │ ├── RemoveMemberParameters.scala
│ │ │ │ │ ├── RemoveMembersParameters.scala
│ │ │ │ │ ├── SubscribersParameters.scala
│ │ │ │ │ ├── SubscriptionsParameters.scala
│ │ │ │ │ └── UpdateListParameters.scala
│ │ │ │ ├── media/
│ │ │ │ │ ├── TwitterMediaClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── MediaAppendParameters.scala
│ │ │ │ │ ├── MediaFinalizeParameters.scala
│ │ │ │ │ ├── MediaInitParameters.scala
│ │ │ │ │ ├── MediaMetadataCreation.scala
│ │ │ │ │ └── MediaStatusParameters.scala
│ │ │ │ ├── mutes/
│ │ │ │ │ ├── TwitterMuteClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── MuteParameters.scala
│ │ │ │ │ ├── MutedUsersIdsParameters.scala
│ │ │ │ │ └── MutedUsersParameters.scala
│ │ │ │ ├── savedsearches/
│ │ │ │ │ ├── TwitterSavedSearchClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ └── SaveSearchParameters.scala
│ │ │ │ ├── search/
│ │ │ │ │ ├── TwitterSearchClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ └── TweetSearchParameters.scala
│ │ │ │ ├── statuses/
│ │ │ │ │ ├── TwitterStatusClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── HomeTimelineParameters.scala
│ │ │ │ │ ├── LookupParameters.scala
│ │ │ │ │ ├── MentionsParameters.scala
│ │ │ │ │ ├── OEmbedParameters.scala
│ │ │ │ │ ├── PostParameters.scala
│ │ │ │ │ ├── RetweetersIdsParameters.scala
│ │ │ │ │ ├── RetweetsOfMeParameters.scala
│ │ │ │ │ ├── RetweetsParameters.scala
│ │ │ │ │ ├── ShowParameters.scala
│ │ │ │ │ └── UserTimelineParameters.scala
│ │ │ │ ├── suggestions/
│ │ │ │ │ ├── TwitterSuggestionClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ └── SuggestionsParameters.scala
│ │ │ │ ├── trends/
│ │ │ │ │ ├── TwitterTrendClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── LocationParameters.scala
│ │ │ │ │ └── TrendsParameters.scala
│ │ │ │ ├── users/
│ │ │ │ │ ├── TwitterUserClient.scala
│ │ │ │ │ └── parameters/
│ │ │ │ │ ├── BannersParameters.scala
│ │ │ │ │ ├── UserParameters.scala
│ │ │ │ │ ├── UserSearchParameters.scala
│ │ │ │ │ └── UsersParameters.scala
│ │ │ │ └── v2/
│ │ │ │ ├── tweets/
│ │ │ │ │ ├── TwitterSearchTweetsClient.scala
│ │ │ │ │ ├── TwitterTimelinesClient.scala
│ │ │ │ │ ├── TwitterTweetLookupClient.scala
│ │ │ │ │ └── paramaters/
│ │ │ │ │ ├── SearchTweetsParameters.scala
│ │ │ │ │ ├── TimelineMentionsParameters.scala
│ │ │ │ │ ├── TimelineTweetsParameters.scala
│ │ │ │ │ ├── TweetParameters.scala
│ │ │ │ │ └── TweetsParameters.scala
│ │ │ │ └── users/
│ │ │ │ ├── TwitterUserLookupClient.scala
│ │ │ │ └── parameters/
│ │ │ │ ├── UserByUsernameParameters.scala
│ │ │ │ ├── UserParameters.scala
│ │ │ │ ├── UsersByUsernamesParameters.scala
│ │ │ │ └── UsersParameters.scala
│ │ │ └── streaming/
│ │ │ ├── ErrorHandler.scala
│ │ │ ├── StreamingClient.scala
│ │ │ ├── TwitterStream.scala
│ │ │ ├── sites/
│ │ │ │ ├── TwitterSiteClient.scala
│ │ │ │ └── parameters/
│ │ │ │ └── SiteParameters.scala
│ │ │ ├── statuses/
│ │ │ │ ├── TwitterStatusClient.scala
│ │ │ │ └── parameters/
│ │ │ │ ├── StatusFilters.scala
│ │ │ │ ├── StatusFirehoseParameters.scala
│ │ │ │ └── StatusSampleParameters.scala
│ │ │ └── users/
│ │ │ ├── TwitterUserClient.scala
│ │ │ └── parameters/
│ │ │ └── UserParameters.scala
│ │ ├── marshalling/
│ │ │ ├── BodyEncoder.scala
│ │ │ └── Parameters.scala
│ │ ├── oauth/
│ │ │ └── OAuth1Provider.scala
│ │ ├── package.scala
│ │ └── serializers/
│ │ ├── CustomFormats.scala
│ │ ├── EnumFormats.scala
│ │ ├── FormSupport.scala
│ │ ├── FormatsComposer.scala
│ │ ├── JsonSupport.scala
│ │ └── StreamingMessageFormats.scala
│ ├── processors/
│ │ └── TwitterProcessor.scala
│ ├── providers/
│ │ ├── ExecutionContextProvider.scala
│ │ └── TokenProvider.scala
│ └── util/
│ ├── Configurations.scala
│ ├── Encoder.scala
│ ├── MediaReader.scala
│ ├── SystemShutdown.scala
│ └── UriHelpers.scala
└── test/
├── resources/
│ ├── fixtures/
│ │ ├── rest/
│ │ │ ├── account/
│ │ │ │ ├── settings.json
│ │ │ │ └── user.json
│ │ │ ├── accountactivity/
│ │ │ │ └── webhook.json
│ │ │ ├── application/
│ │ │ │ └── rate_limits.json
│ │ │ ├── blocks/
│ │ │ │ ├── blocked_users.json
│ │ │ │ ├── ids.json
│ │ │ │ ├── stringified_ids.json
│ │ │ │ └── user.json
│ │ │ ├── directmessages/
│ │ │ │ ├── destroy.json
│ │ │ │ ├── event.json
│ │ │ │ ├── list.json
│ │ │ │ ├── new.json
│ │ │ │ ├── received.json
│ │ │ │ ├── sent.json
│ │ │ │ └── show.json
│ │ │ ├── favorites/
│ │ │ │ ├── favorite.json
│ │ │ │ ├── favorites.json
│ │ │ │ └── unfavorite.json
│ │ │ ├── followers/
│ │ │ │ ├── followers.json
│ │ │ │ ├── followers_ids.json
│ │ │ │ └── followers_ids_stringified.json
│ │ │ ├── friends/
│ │ │ │ ├── friends_ids.json
│ │ │ │ ├── friends_ids_stringified.json
│ │ │ │ └── users.json
│ │ │ ├── friendships/
│ │ │ │ ├── blocked_users.json
│ │ │ │ ├── blocked_users_stringified.json
│ │ │ │ ├── follow.json
│ │ │ │ ├── incoming_friendships_ids.json
│ │ │ │ ├── incoming_friendships_ids_stringified.json
│ │ │ │ ├── outgoing_friendships_ids.json
│ │ │ │ ├── outgoing_friendships_ids_stringified.json
│ │ │ │ ├── relationship.json
│ │ │ │ ├── relationships.json
│ │ │ │ ├── unfollow.json
│ │ │ │ └── update.json
│ │ │ ├── geo/
│ │ │ │ ├── advanced_search.json
│ │ │ │ ├── geo_place.json
│ │ │ │ ├── reverse_geocode.json
│ │ │ │ └── search.json
│ │ │ ├── help/
│ │ │ │ ├── configuration.json
│ │ │ │ ├── languages.json
│ │ │ │ ├── privacy.json
│ │ │ │ └── tos.json
│ │ │ ├── lists/
│ │ │ │ ├── create.json
│ │ │ │ ├── destroy.json
│ │ │ │ ├── lists.json
│ │ │ │ ├── member.json
│ │ │ │ ├── members.json
│ │ │ │ ├── memberships.json
│ │ │ │ ├── ownerships.json
│ │ │ │ ├── show.json
│ │ │ │ ├── subscribers.json
│ │ │ │ ├── subscriptions.json
│ │ │ │ └── timeline.json
│ │ │ ├── media/
│ │ │ │ ├── img_media_details.json
│ │ │ │ └── media_details.json
│ │ │ ├── mutes/
│ │ │ │ ├── muted_users_ids.json
│ │ │ │ ├── user.json
│ │ │ │ └── users.json
│ │ │ ├── savedsearches/
│ │ │ │ ├── create.json
│ │ │ │ ├── destroy.json
│ │ │ │ ├── list.json
│ │ │ │ └── show.json
│ │ │ ├── search/
│ │ │ │ └── tweets.json
│ │ │ ├── statuses/
│ │ │ │ ├── destroy.json
│ │ │ │ ├── direct_message.json
│ │ │ │ ├── home_timeline.json
│ │ │ │ ├── lookup.json
│ │ │ │ ├── lookup_extended.json
│ │ │ │ ├── lookup_mapped.json
│ │ │ │ ├── lookup_mapped_extended.json
│ │ │ │ ├── mentions_timeline.json
│ │ │ │ ├── oembed.json
│ │ │ │ ├── retweet.json
│ │ │ │ ├── retweeters_ids.json
│ │ │ │ ├── retweeters_ids_stringified.json
│ │ │ │ ├── retweets.json
│ │ │ │ ├── retweets_of_me.json
│ │ │ │ ├── show.json
│ │ │ │ ├── update.json
│ │ │ │ └── user_timeline.json
│ │ │ ├── suggestions/
│ │ │ │ ├── categories.json
│ │ │ │ ├── slug_suggestions.json
│ │ │ │ └── suggestions_members.json
│ │ │ ├── trends/
│ │ │ │ ├── available_locations.json
│ │ │ │ ├── closest_locations.json
│ │ │ │ └── trends.json
│ │ │ └── users/
│ │ │ ├── profile_banner.json
│ │ │ ├── user.json
│ │ │ └── users.json
│ │ └── streaming/
│ │ ├── common/
│ │ │ ├── disconnect_messages.json
│ │ │ ├── limit_notices.json
│ │ │ ├── location_deletion_notices.json
│ │ │ ├── status_deletion_notices.json
│ │ │ ├── status_withheld_notices.json
│ │ │ ├── tweets.json
│ │ │ ├── user_withheld_notices.json
│ │ │ └── warning_messages.json
│ │ ├── site/
│ │ │ ├── control_messages.json
│ │ │ ├── user_envelop_direct_message.json
│ │ │ ├── user_envelop_direct_message_stringified.json
│ │ │ ├── user_envelop_simple_event.json
│ │ │ ├── user_envelop_simple_event_stringified.json
│ │ │ ├── user_envelop_tweet.json
│ │ │ ├── user_envelop_tweet_event.json
│ │ │ ├── user_envelop_tweet_event_stringified.json
│ │ │ ├── user_envelop_tweet_stringified.json
│ │ │ ├── user_envelop_twitter_list_event.json
│ │ │ ├── user_envelop_twitter_list_event_stringified.json
│ │ │ ├── user_envelop_warning_message.json
│ │ │ ├── user_envelop_warning_message_stringified.json
│ │ │ ├── user_envelops_friends_list.json
│ │ │ └── user_envelops_friends_list_stringified.json
│ │ └── user/
│ │ ├── direct_messages.json
│ │ ├── events.json
│ │ ├── friends_lists.json
│ │ └── friends_lists_stringified.json
│ └── twitter/
│ ├── authentication/
│ │ ├── access_token.txt
│ │ └── request_token.txt
│ ├── rest/
│ │ ├── account/
│ │ │ ├── settings.json
│ │ │ └── user.json
│ │ ├── accountactivity/
│ │ │ └── webhook.json
│ │ ├── application/
│ │ │ └── rate_limits.json
│ │ ├── blocks/
│ │ │ ├── blocked_users.json
│ │ │ ├── ids.json
│ │ │ ├── stringified_ids.json
│ │ │ └── user.json
│ │ ├── directmessages/
│ │ │ ├── destroy.json
│ │ │ ├── event.json
│ │ │ ├── list.json
│ │ │ ├── new.json
│ │ │ ├── received.json
│ │ │ ├── sent.json
│ │ │ └── show.json
│ │ ├── favorites/
│ │ │ ├── favorite.json
│ │ │ ├── favorites.json
│ │ │ └── unfavorite.json
│ │ ├── followers/
│ │ │ ├── followers.json
│ │ │ ├── followers_ids.json
│ │ │ └── followers_ids_stringified.json
│ │ ├── friends/
│ │ │ ├── friends_ids.json
│ │ │ ├── friends_ids_stringified.json
│ │ │ └── users.json
│ │ ├── friendships/
│ │ │ ├── blocked_users.json
│ │ │ ├── blocked_users_stringified.json
│ │ │ ├── follow.json
│ │ │ ├── incoming_friendships_ids.json
│ │ │ ├── incoming_friendships_ids_stringified.json
│ │ │ ├── outgoing_friendships_ids.json
│ │ │ ├── outgoing_friendships_ids_stringified.json
│ │ │ ├── relationship.json
│ │ │ ├── relationships.json
│ │ │ ├── unfollow.json
│ │ │ └── update.json
│ │ ├── geo/
│ │ │ ├── advanced_search.json
│ │ │ ├── geo_place.json
│ │ │ ├── reverse_geocode.json
│ │ │ └── search.json
│ │ ├── help/
│ │ │ ├── configuration.json
│ │ │ ├── languages.json
│ │ │ ├── privacy.json
│ │ │ └── tos.json
│ │ ├── lists/
│ │ │ ├── create.json
│ │ │ ├── destroy.json
│ │ │ ├── lists.json
│ │ │ ├── member.json
│ │ │ ├── members.json
│ │ │ ├── memberships.json
│ │ │ ├── ownerships.json
│ │ │ ├── show.json
│ │ │ ├── subscribers.json
│ │ │ ├── subscriptions.json
│ │ │ └── timeline.json
│ │ ├── media/
│ │ │ └── media_details.json
│ │ ├── mutes/
│ │ │ ├── muted_users_ids.json
│ │ │ ├── user.json
│ │ │ └── users.json
│ │ ├── savedsearches/
│ │ │ ├── create.json
│ │ │ ├── destroy.json
│ │ │ ├── list.json
│ │ │ └── show.json
│ │ ├── search/
│ │ │ └── tweets.json
│ │ ├── statuses/
│ │ │ ├── destroy.json
│ │ │ ├── direct_message.json
│ │ │ ├── home_timeline.json
│ │ │ ├── lookup.json
│ │ │ ├── lookup_extended.json
│ │ │ ├── lookup_mapped.json
│ │ │ ├── lookup_mapped_extended.json
│ │ │ ├── mentions_timeline.json
│ │ │ ├── oembed.json
│ │ │ ├── retweet.json
│ │ │ ├── retweeters_ids.json
│ │ │ ├── retweeters_ids_stringified.json
│ │ │ ├── retweets.json
│ │ │ ├── retweets_of_me.json
│ │ │ ├── show.json
│ │ │ ├── update.json
│ │ │ └── user_timeline.json
│ │ ├── suggestions/
│ │ │ ├── categories.json
│ │ │ ├── slug_suggestions.json
│ │ │ └── suggestions_members.json
│ │ ├── trends/
│ │ │ ├── available_locations.json
│ │ │ ├── closest_locations.json
│ │ │ └── trends.json
│ │ ├── users/
│ │ │ ├── empty-user-profile-url.json
│ │ │ ├── profile_banner.json
│ │ │ ├── user.json
│ │ │ └── users.json
│ │ └── v2/
│ │ ├── tweets/
│ │ │ ├── tweet.json
│ │ │ └── tweets.json
│ │ └── users/
│ │ ├── user.json
│ │ └── users.json
│ └── streaming/
│ ├── common/
│ │ ├── disconnect_messages.json
│ │ ├── limit_notices.json
│ │ ├── location_deletion_notices.json
│ │ ├── status_deletion_notices.json
│ │ ├── status_withheld_notices.json
│ │ ├── tweets.json
│ │ ├── user_withheld_notices.json
│ │ └── warning_messages.json
│ ├── site/
│ │ ├── control_messages.json
│ │ ├── user_envelop_direct_message.json
│ │ ├── user_envelop_direct_message_stringified.json
│ │ ├── user_envelop_simple_event.json
│ │ ├── user_envelop_simple_event_stringified.json
│ │ ├── user_envelop_tweet.json
│ │ ├── user_envelop_tweet_event.json
│ │ ├── user_envelop_tweet_event_stringified.json
│ │ ├── user_envelop_tweet_stringified.json
│ │ ├── user_envelop_twitter_list_event.json
│ │ ├── user_envelop_twitter_list_event_stringified.json
│ │ ├── user_envelop_warning_message.json
│ │ ├── user_envelop_warning_message_stringified.json
│ │ ├── user_envelops_friends_list.json
│ │ └── user_envelops_friends_list_stringified.json
│ └── user/
│ ├── direct_messages.json
│ ├── events.json
│ ├── friends_lists.json
│ └── friends_lists_stringified.json
└── scala/
└── com/
└── danielasfregola/
└── twitter4s/
├── entities/
│ ├── DeserializationRoundtripSpec.scala
│ ├── ProfileImageSpec.scala
│ ├── RateLimitSpec.scala
│ └── SerializationRoundtripSpec.scala
├── helpers/
│ ├── AwaitableFuture.scala
│ ├── ClientSpec.scala
│ ├── FixturesSupport.scala
│ ├── JsonDiffSupport.scala
│ ├── RequestDSL.scala
│ ├── Spec.scala
│ ├── TestActorSystem.scala
│ └── TestExecutionContext.scala
├── http/
│ ├── clients/
│ │ ├── authentication/
│ │ │ └── oauth/
│ │ │ └── TwitterOAuthClientSpec.scala
│ │ ├── rest/
│ │ │ ├── RestClientSpec.scala
│ │ │ ├── account/
│ │ │ │ └── TwitterAccountClientSpec.scala
│ │ │ ├── accountactivity/
│ │ │ │ └── TwitterAccountActivityClientSpec.scala
│ │ │ ├── application/
│ │ │ │ └── TwitterApplicationClientSpec.scala
│ │ │ ├── blocks/
│ │ │ │ └── TwitterBlockClientSpec.scala
│ │ │ ├── directmessages/
│ │ │ │ └── TwitterDirectMessageClientSpec.scala
│ │ │ ├── favorites/
│ │ │ │ └── TwitterFavoriteClientSpec.scala
│ │ │ ├── followers/
│ │ │ │ └── TwitterFollowerClientSpec.scala
│ │ │ ├── friends/
│ │ │ │ └── TwitterFriendClientSpec.scala
│ │ │ ├── friendships/
│ │ │ │ └── TwitterFriendshipClientSpec.scala
│ │ │ ├── geo/
│ │ │ │ └── TwitterGeoClientSpec.scala
│ │ │ ├── help/
│ │ │ │ └── TwitterHelpClientSpec.scala
│ │ │ ├── lists/
│ │ │ │ └── TwitterListClientSpec.scala
│ │ │ ├── media/
│ │ │ │ └── TwitterMediaClientSpec.scala
│ │ │ ├── mutes/
│ │ │ │ └── TwitterMuteClientSpec.scala
│ │ │ ├── savedsearches/
│ │ │ │ └── TwitterSavedSearchClientSpec.scala
│ │ │ ├── search/
│ │ │ │ └── TwitterSearchClientSpec.scala
│ │ │ ├── statuses/
│ │ │ │ ├── TwitterStatusClientSpec.scala
│ │ │ │ └── parameters/
│ │ │ │ ├── HomeTimelineParametersSpec.scala
│ │ │ │ ├── LookupParametersSpec.scala
│ │ │ │ ├── MentionsParametersSpec.scala
│ │ │ │ ├── OEmbedParametersSpec.scala
│ │ │ │ ├── PostParametersSpec.scala
│ │ │ │ ├── RetweetersIdsParametersSpec.scala
│ │ │ │ ├── RetweetsOfMeParametersSpec.scala
│ │ │ │ ├── RetweetsParametersSpec.scala
│ │ │ │ ├── ShowParametersSpec.scala
│ │ │ │ └── UserTimelineParametersSpec.scala
│ │ │ ├── suggestions/
│ │ │ │ └── TwitterSuggestionClientSpec.scala
│ │ │ ├── trends/
│ │ │ │ └── TwitterTrendClientSpec.scala
│ │ │ ├── users/
│ │ │ │ └── TwitterUserClientSpec.scala
│ │ │ └── v2/
│ │ │ ├── tweets/
│ │ │ │ ├── TwitterSearchTweetsClientSpec.scala
│ │ │ │ ├── TwitterTimelinesClientSpec.scala
│ │ │ │ ├── TwitterTweetLookupClientSpec.scala
│ │ │ │ └── deserialization/
│ │ │ │ ├── TweetsDeserializationSpec.scala
│ │ │ │ └── fixtures/
│ │ │ │ ├── TweetResponseFixture.scala
│ │ │ │ └── TweetsResponseFixture.scala
│ │ │ ├── users/
│ │ │ │ ├── TwitterUserLookupClientSpec.scala
│ │ │ │ └── deserialization/
│ │ │ │ ├── UsersResponseDeserializationSpec.scala
│ │ │ │ └── fixtures/
│ │ │ │ ├── UserResponseFixture.scala
│ │ │ │ └── UsersResponseFixture.scala
│ │ │ └── utils/
│ │ │ └── V2SpecQueryHelper.scala
│ │ └── streaming/
│ │ ├── StreamingClientSpec.scala
│ │ ├── sites/
│ │ │ └── TwitterSiteClientSpec.scala
│ │ ├── statuses/
│ │ │ └── TwitterStatusClientSpec.scala
│ │ └── users/
│ │ └── TwitterUserClientSpec.scala
│ ├── marshalling/
│ │ └── BodyEncoderSpec.scala
│ ├── oauth/
│ │ └── OAuth1ProviderSpec.scala
│ ├── packageHttpSpec.scala
│ └── serializers/
│ └── FormSupportSpec.scala
└── util/
├── ConfigurationDetectorSpec.scala
├── EncoderSpec.scala
└── UriHelpersSpec.scala
Condensed preview — 590 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,333K chars).
[
{
"path": ".circleci/config.yml",
"chars": 1398,
"preview": "# Scala CircleCI 2.0 configuration file\n#\n# Check https://circleci.com/docs/2.0/sample-config/ for more details\n#\nversio"
},
{
"path": ".gitignore",
"chars": 469,
"preview": "# Created by .ignore support plugin (hsz.mobi)\n### SBT template\n# Simple Build Tool\n# http://www.scala-sbt.org/release/d"
},
{
"path": ".mergify.yml",
"chars": 277,
"preview": "pull_request_rules:\n - name: automatically merge scala-steward's PRs\n conditions:\n - author=scala-steward\n "
},
{
"path": ".scalafmt.conf",
"chars": 16,
"preview": "maxColumn = 120\n"
},
{
"path": "LICENSE",
"chars": 11358,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 19117,
"preview": "twitter4s\n=========\n\n[\n\nname := \"twitter4s\"\nv"
},
{
"path": "project/build.properties",
"chars": 20,
"preview": "sbt.version = 1.6.2\n"
},
{
"path": "project/plugins.sbt",
"chars": 550,
"preview": "addSbtPlugin(\"com.typesafe.sbt\" % \"sbt-site\" % \"1.4.1\")\n\naddSbtPlugin(\"com.typesafe.sbt\" % \"sbt-ghpages\" % \"0.6.3\")\n\nadd"
},
{
"path": "sonatype.sbt",
"chars": 45,
"preview": "sonatypeProfileName := \"com.danielasfregola\"\n"
},
{
"path": "src/main/resources/reference.conf",
"chars": 252,
"preview": "twitter {\n\n rest {\n api = \"https://api.twitter.com\"\n media = \"https://upload.twitter.com\"\n }\n\n streaming {\n "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/TwitterAuthenticationClient.scala",
"chars": 1673,
"preview": "package com.danielasfregola.twitter4s\n\nimport akka.actor.ActorSystem\nimport com.danielasfregola.twitter4s.entities.Consu"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/TwitterRestClient.scala",
"chars": 4049,
"preview": "package com.danielasfregola.twitter4s\n\nimport akka.actor.ActorSystem\nimport com.danielasfregola.twitter4s.entities.{Acce"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/TwitterRestV2Client.scala",
"chars": 2060,
"preview": "package com.danielasfregola.twitter4s\n\nimport akka.actor.ActorSystem\nimport com.danielasfregola.twitter4s.entities.{Acce"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/TwitterStreamingClient.scala",
"chars": 2077,
"preview": "package com.danielasfregola.twitter4s\n\nimport akka.actor.ActorSystem\nimport com.danielasfregola.twitter4s.entities.{Acce"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/AccessToken.scala",
"chars": 106,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class AccessToken(key: String, secret: String)\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Accuracy.scala",
"chars": 341,
"preview": "package com.danielasfregola.twitter4s.entities\n\nimport com.danielasfregola.twitter4s.entities.enums.Measure\nimport com.d"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Area.scala",
"chars": 122,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Area(coordinates: Seq[Seq[Seq[Double]]], `type`: String"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Banners.scala",
"chars": 167,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Banners(sizes: Map[String, Banner] = Map.empty)\n\nfinal "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Category.scala",
"chars": 113,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Category(name: String, slug: String, size: Int)\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Configuration.scala",
"chars": 555,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Configuration(dm_text_character_limit: Long,\n "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/ConsumerToken.scala",
"chars": 108,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class ConsumerToken(key: String, secret: String)\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Contributor.scala",
"chars": 124,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Contributor(id: Long, id_str: String, screen_name: Stri"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Coordinate.scala",
"chars": 182,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Coordinate(longitude: Double, latitude: Double) {\n def"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Coordinates.scala",
"chars": 131,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Coordinates(coordinates: Seq[Double] = Seq.empty, `type"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/DirectMessage.scala",
"chars": 853,
"preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nimport com.danielasfregola.twitter4s.entities."
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/DirectMessageEvent.scala",
"chars": 779,
"preview": "package com.danielasfregola.twitter4s.entities\nimport java.time.Instant\n\nfinal case class DirectMessageEvent(`type`: Str"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/DirectMessageEventList.scala",
"chars": 378,
"preview": "package com.danielasfregola.twitter4s.entities\nimport com.danielasfregola.twitter4s.entities.streaming.UserStreamingMess"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Entities.scala",
"chars": 777,
"preview": "package com.danielasfregola.twitter4s.entities\n\n// TODO - conversion to clean this representation? see url vs urls\n// un"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/ExtendedTweet.scala",
"chars": 312,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class ExtendedTweet(full_text: String,\n "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Geo.scala",
"chars": 123,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Geo(coordinates: Seq[Double] = Seq.empty, `type`: Strin"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/GeoBoundingBox.scala",
"chars": 388,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class GeoBoundingBox(southwest: Coordinate, northeast: Coordi"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/GeoCode.scala",
"chars": 190,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class GeoCode(latitude: Double, longitude: Double, radius: Ac"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/GeoPlace.scala",
"chars": 634,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class GeoPlace(attributes: Map[String, String],\n "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/GeoSearch.scala",
"chars": 582,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class GeoSearch(query: GeoQuery, result: GeoResult)\n\nfinal ca"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/HashTag.scala",
"chars": 106,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class HashTag(text: String, indices: Seq[Int])\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Image.scala",
"chars": 107,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Image(w: Int, h: Int, image_type: String)\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/LanguageDetails.scala",
"chars": 125,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class LanguageDetails(code: String, status: String, name: Str"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Location.scala",
"chars": 354,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Location(country: String,\n cou"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/LocationTrends.scala",
"chars": 615,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class LocationTrends(as_of: String, // TODO - convert to Inst"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/LookupEntities.scala",
"chars": 276,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class LookupEntities(url: LookupUrls, description: LookupUrls"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/LookupMapped.scala",
"chars": 114,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class LookupMapped(id: Map[String, Tweet] = Map.empty)\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/LookupRelationship.scala",
"chars": 327,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class LookupRelationship(connections: Seq[String] = Seq.empty"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/LookupTweet.scala",
"chars": 857,
"preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nfinal case class LookupTweet(\n contributors"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/LookupUser.scala",
"chars": 1642,
"preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nfinal case class LookupUser(\n contributors_"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Media.scala",
"chars": 635,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Media(display_url: String,\n expan"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/MediaDetails.scala",
"chars": 787,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class MediaDetails(media_id: Long,\n "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/MediaUpload.scala",
"chars": 127,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class MediaUpload(media: String, additional_owners: Option[St"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/OEmbedTweet.scala",
"chars": 665,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class OEmbedTweet(author_name: Option[String],\n "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/PrivacyPolicy.scala",
"chars": 96,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class PrivacyPolicy(privacy: String)\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/ProfileImage.scala",
"chars": 716,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class ProfileImage(mini: String, normal: String, bigger: Stri"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/ProfileUpdate.scala",
"chars": 498,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class ProfileUpdate(name: Option[String] = None,\n "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/RateLimit.scala",
"chars": 1212,
"preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nimport akka.http.scaladsl.model.{HttpHeader, S"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/RateLimits.scala",
"chars": 1722,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class RateLimits(rate_limit_context: RateLimitContext, resour"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/RatedData.scala",
"chars": 242,
"preview": "package com.danielasfregola.twitter4s.entities\n\n/** A wrapper for data that have rate limitation.\n * Have a look at `ra"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Relationship.scala",
"chars": 1601,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Relationship(relationship: RelationshipOverview)\n\nfinal"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/SavedSearch.scala",
"chars": 179,
"preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nfinal case class SavedSearch(created_at: Insta"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Settings.scala",
"chars": 1204,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Settings(allow_contributor_request: String,\n "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/SettingsOptions.scala",
"chars": 953,
"preview": "package com.danielasfregola.twitter4s.entities\n\nimport com.danielasfregola.twitter4s.entities.enums.ContributorType.Cont"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Size.scala",
"chars": 102,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Size(h: Int, resize: String, w: Int)\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/StatusMediaDetails.scala",
"chars": 150,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class StatusMediaDetails(media_id: Long, media_id_string: Str"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Suggestions.scala",
"chars": 146,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Suggestions(name: String, slug: String, size: Int, user"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Symbol.scala",
"chars": 105,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Symbol(text: String, indices: Seq[Int])\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/TermsOfService.scala",
"chars": 93,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class TermsOfService(tos: String)\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Tweet.scala",
"chars": 2396,
"preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nimport com.danielasfregola.twitter4s.entities."
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/TweetId.scala",
"chars": 99,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class TweetId(id: Long, id_str: String)\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/TweetSearch.scala",
"chars": 684,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class StatusSearch(statuses: List[Tweet], search_metadata: Se"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/TweetUpdate.scala",
"chars": 592,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class TweetUpdate(status: String,\n "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/TwitterList.scala",
"chars": 667,
"preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nfinal case class TwitterList(created_at: Insta"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/TwitterListUpdate.scala",
"chars": 308,
"preview": "package com.danielasfregola.twitter4s.entities\n\nimport com.danielasfregola.twitter4s.entities.enums.Mode.Mode\n\nfinal cas"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/TwitterLists.scala",
"chars": 157,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class TwitterLists(lists: Seq[TwitterList] = Seq.empty, next_"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/UploadedMedia.scala",
"chars": 310,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class UploadedMedia(media_id: Long,\n "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Url.scala",
"chars": 156,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Url(indices: Seq[Int] = Seq.empty, url: String, display"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/User.scala",
"chars": 2811,
"preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nfinal case class User(blocked_by: Boolean = fa"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/UserIds.scala",
"chars": 143,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class UserIds(ids: Seq[Long] = Seq.empty, next_cursor: Long, "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/UserMention.scala",
"chars": 169,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class UserMention(id: Long, id_str: String, indices: Seq[Int]"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/UserStringifiedIds.scala",
"chars": 156,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class UserStringifiedIds(ids: Seq[String] = Seq.empty, next_c"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Users.scala",
"chars": 143,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Users(users: Seq[User] = Seq.empty, next_cursor: Long, "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Variant.scala",
"chars": 131,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Variant(bitrate: Option[Long], content_type: String, ur"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Video.scala",
"chars": 91,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Video(video_type: String)\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/VideoInfo.scala",
"chars": 154,
"preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class VideoInfo(aspect_ratio: Seq[Int], duration_millis: Opti"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/Webhook.scala",
"chars": 180,
"preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.ZonedDateTime\n\nfinal case class Webhook(id: String, url"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/authentication/OAuthAccessToken.scala",
"chars": 710,
"preview": "package com.danielasfregola.twitter4s.entities.authentication\n\nimport com.danielasfregola.twitter4s.entities.AccessToken"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/authentication/OAuthRequestToken.scala",
"chars": 701,
"preview": "package com.danielasfregola.twitter4s.entities.authentication\n\nimport com.danielasfregola.twitter4s.http.serializers.Fro"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/AccessType.scala",
"chars": 179,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject AccessType extends Enumeration {\n type AccessType = Value\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/Alignment.scala",
"chars": 235,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject Alignment extends Enumeration {\n type Alignment = Value\n\n "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/ContributorType.scala",
"chars": 224,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject ContributorType extends Enumeration {\n type ContributorTyp"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/DisconnectionCode.scala",
"chars": 485,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject DisconnectionCode extends Enumeration {\n type Disconnectio"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/EventCode.scala",
"chars": 1077,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nabstract class EventCode extends Enumeration\n\nobject SimpleEventCo"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/FilterLevel.scala",
"chars": 208,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject FilterLevel extends Enumeration {\n type FilterLevel = Valu"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/Granularity.scala",
"chars": 282,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject Granularity extends Enumeration {\n type Granularity = Valu"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/Hour.scala",
"chars": 787,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject Hour extends Enumeration {\n type Hour = Value\n\n val MIDNI"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/Language.scala",
"chars": 1084,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject Language extends Enumeration {\n type Language = Value\n\n v"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/Measure.scala",
"chars": 167,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject Measure extends Enumeration {\n type Measure = Value\n\n val"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/MediaType.scala",
"chars": 317,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject MediaType extends Enumeration {\n type MediaType = Value\n\n "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/Mode.scala",
"chars": 175,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject Mode extends Enumeration {\n type Mode = Value\n\n val Priva"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/Resource.scala",
"chars": 843,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject Resource extends Enumeration {\n type Resource = Value\n\n v"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/ResultType.scala",
"chars": 216,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject ResultType extends Enumeration {\n type ResultType = Value\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/TimeZone.scala",
"chars": 6463,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject TimeZone extends Enumeration {\n type TimeZone = Value\n\n v"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/TweetMode.scala",
"chars": 182,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject TweetMode extends Enumeration {\n type TweetMode = Value\n\n "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/WidgetType.scala",
"chars": 153,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject WidgetType extends Enumeration {\n type WidgetType = Value\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/WithFilter.scala",
"chars": 189,
"preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject WithFilter extends Enumeration {\n type WithFilter = Value\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/StreamingUpdate.scala",
"chars": 338,
"preview": "package com.danielasfregola.twitter4s.entities.streaming\n\nfinal case class StreamingUpdate(streamingEvent: StreamingMess"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/DisconnectMessage.scala",
"chars": 992,
"preview": "package com.danielasfregola.twitter4s.entities.streaming.common\n\nimport com.danielasfregola.twitter4s.entities.enums.Dis"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/LimitNotice.scala",
"chars": 932,
"preview": "package com.danielasfregola.twitter4s.entities.streaming.common\n\nimport com.danielasfregola.twitter4s.entities.streaming"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/LocationDeletionNotice.scala",
"chars": 1093,
"preview": "package com.danielasfregola.twitter4s.entities.streaming.common\n\nimport com.danielasfregola.twitter4s.entities.streaming"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/StatusDeletionNotice.scala",
"chars": 969,
"preview": "package com.danielasfregola.twitter4s.entities.streaming.common\n\nimport com.danielasfregola.twitter4s.entities.streaming"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/StatusWithheldNotice.scala",
"chars": 782,
"preview": "package com.danielasfregola.twitter4s.entities.streaming.common\n\nimport com.danielasfregola.twitter4s.entities.streaming"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/UserWithheldNotice.scala",
"chars": 725,
"preview": "package com.danielasfregola.twitter4s.entities.streaming.common\n\nimport com.danielasfregola.twitter4s.entities.streaming"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/WarningMessage.scala",
"chars": 888,
"preview": "package com.danielasfregola.twitter4s.entities.streaming.common\n\nimport com.danielasfregola.twitter4s.entities.streaming"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/site/ControlMessage.scala",
"chars": 936,
"preview": "package com.danielasfregola.twitter4s.entities.streaming.site\n\nimport com.danielasfregola.twitter4s.entities.streaming.S"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelop.scala",
"chars": 3722,
"preview": "package com.danielasfregola.twitter4s.entities.streaming.site\n\nimport com.danielasfregola.twitter4s.entities.streaming._"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/user/Event.scala",
"chars": 2196,
"preview": "package com.danielasfregola.twitter4s.entities.streaming.user\n\nimport java.time.Instant\n\nimport com.danielasfregola.twit"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/user/FriendsLists.scala",
"chars": 1285,
"preview": "package com.danielasfregola.twitter4s.entities.streaming.user\n\nimport com.danielasfregola.twitter4s.entities.streaming.U"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/Error.scala",
"chars": 471,
"preview": "package com.danielasfregola.twitter4s.entities.v2\n\nfinal case class Error(detail: String,\n field: "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/Media.scala",
"chars": 1826,
"preview": "package com.danielasfregola.twitter4s.entities.v2\n\nimport com.danielasfregola.twitter4s.entities.v2.enums.MediaType.Medi"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/Meta.scala",
"chars": 294,
"preview": "package com.danielasfregola.twitter4s.entities.v2\n\nfinal case class Meta(result_count: Int,\n newest"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/Place.scala",
"chars": 568,
"preview": "package com.danielasfregola.twitter4s.entities.v2\n\n// https://developer.twitter.com/en/docs/twitter-api/data-dictionary/"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/Poll.scala",
"chars": 476,
"preview": "package com.danielasfregola.twitter4s.entities.v2\n\nimport java.time.Instant\n\n// https://developer.twitter.com/en/docs/tw"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/Tweet.scala",
"chars": 3060,
"preview": "package com.danielasfregola.twitter4s.entities.v2\n\nimport com.danielasfregola.twitter4s.entities.v2.enums.CoordinatesTyp"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/TweetEntities.scala",
"chars": 1245,
"preview": "package com.danielasfregola.twitter4s.entities.v2\n\nfinal case class TweetEntities(annotations: Seq[TweetEntitiesAnnotati"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/TweetIncludes.scala",
"chars": 301,
"preview": "package com.danielasfregola.twitter4s.entities.v2\n\nfinal case class TweetIncludes(tweets: Seq[Tweet],\n "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/User.scala",
"chars": 879,
"preview": "package com.danielasfregola.twitter4s.entities.v2\n\nimport java.time.Instant\n\nfinal case class User(id: String,\n "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/UserEntities.scala",
"chars": 858,
"preview": "package com.danielasfregola.twitter4s.entities.v2\n\nfinal case class UserEntities(url: Option[UserURLContainer], descript"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/UserIncludes.scala",
"chars": 113,
"preview": "package com.danielasfregola.twitter4s.entities.v2\n\ncase class UserIncludes(tweets: Seq[Tweet], users: Seq[User])\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/Withheld.scala",
"chars": 231,
"preview": "package com.danielasfregola.twitter4s.entities.v2\n\nimport com.danielasfregola.twitter4s.entities.v2.enums.WithheldScope."
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/CoordinatesType.scala",
"chars": 165,
"preview": "package com.danielasfregola.twitter4s.entities.v2.enums\n\nobject CoordinatesType extends Enumeration {\n type Coordinates"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/MediaType.scala",
"chars": 224,
"preview": "package com.danielasfregola.twitter4s.entities.v2.enums\n\nobject MediaType extends Enumeration {\n type MediaType = Value"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/ReferencedTweetType.scala",
"chars": 250,
"preview": "package com.danielasfregola.twitter4s.entities.v2.enums\n\nobject ReferencedTweetType extends Enumeration {\n type Referen"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/TweetReplySetting.scala",
"chars": 297,
"preview": "package com.danielasfregola.twitter4s.entities.v2.enums\n\nobject TweetReplySetting extends Enumeration {\n type TweetRepl"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/WithheldScope.scala",
"chars": 188,
"preview": "package com.danielasfregola.twitter4s.entities.v2.enums\n\nobject WithheldScope extends Enumeration {\n type WithheldScope"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/expansions/TweetExpansions.scala",
"chars": 614,
"preview": "package com.danielasfregola.twitter4s.entities.v2.enums.expansions\n\nobject TweetExpansions extends Enumeration {\n type "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/expansions/UserExpansions.scala",
"chars": 192,
"preview": "package com.danielasfregola.twitter4s.entities.v2.enums.expansions\n\nobject UserExpansions extends Enumeration {\n type U"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/MediaFields.scala",
"chars": 571,
"preview": "package com.danielasfregola.twitter4s.entities.v2.enums.fields\n\nobject MediaFields extends Enumeration {\n type MediaFie"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/PlaceFields.scala",
"chars": 409,
"preview": "package com.danielasfregola.twitter4s.entities.v2.enums.fields\n\nobject PlaceFields extends Enumeration {\n type PlaceFie"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/PollFields.scala",
"chars": 325,
"preview": "package com.danielasfregola.twitter4s.entities.v2.enums.fields\n\nobject PollFields extends Enumeration {\n type PollField"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/TweetFields.scala",
"chars": 959,
"preview": "package com.danielasfregola.twitter4s.entities.v2.enums.fields\n\nobject TweetFields extends Enumeration {\n type TweetFie"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/UserFields.scala",
"chars": 643,
"preview": "package com.danielasfregola.twitter4s.entities.v2.enums.fields\n\nobject UserFields extends Enumeration {\n type UserField"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/rest/TimelineExclude.scala",
"chars": 209,
"preview": "package com.danielasfregola.twitter4s.entities.v2.enums.rest\n\nobject TimelineExclude extends Enumeration {\n type Timeli"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/TweetResponse.scala",
"chars": 246,
"preview": "package com.danielasfregola.twitter4s.entities.v2.responses\n\nimport com.danielasfregola.twitter4s.entities.v2.{Error, Tw"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/TweetsResponse.scala",
"chars": 366,
"preview": "package com.danielasfregola.twitter4s.entities.v2.responses\n\nimport com.danielasfregola.twitter4s.entities.v2.{Error, Me"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/UserResponse.scala",
"chars": 235,
"preview": "package com.danielasfregola.twitter4s.entities.v2.responses\n\nimport com.danielasfregola.twitter4s.entities.v2.{Error, Us"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/UsersResponse.scala",
"chars": 233,
"preview": "package com.danielasfregola.twitter4s.entities.v2.responses\n\nimport com.danielasfregola.twitter4s.entities.v2.{User, Use"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/exceptions/TwitterException.scala",
"chars": 852,
"preview": "package com.danielasfregola.twitter4s.exceptions\n\nimport akka.http.scaladsl.model.StatusCode\n\nfinal case class TwitterEr"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/Client.scala",
"chars": 917,
"preview": "package com.danielasfregola.twitter4s.http.clients\n\nimport akka.actor.ActorSystem\nimport akka.http.scaladsl.model.{HttpR"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/CommonClient.scala",
"chars": 3407,
"preview": "package com.danielasfregola.twitter4s.http.clients\n\nimport akka.actor.ActorSystem\nimport akka.http.scaladsl.Http\nimport "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/OAuthClient.scala",
"chars": 2932,
"preview": "package com.danielasfregola.twitter4s.http.clients\n\nimport akka.http.scaladsl.client.RequestBuilding\nimport akka.http.sc"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/AuthenticationClient.scala",
"chars": 1587,
"preview": "package com.danielasfregola.twitter4s.http.clients.authentication\n\nimport akka.actor.ActorSystem\nimport akka.http.scalad"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/oauth/TwitterOAuthClient.scala",
"chars": 8998,
"preview": "package com.danielasfregola.twitter4s.http\npackage clients.authentication.oauth\n\nimport com.danielasfregola.twitter4s.en"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/oauth/parameters/AccessTokenParameters.scala",
"chars": 654,
"preview": "package com.danielasfregola.twitter4s.http.clients.authentication.oauth.parameters\n\nimport com.danielasfregola.twitter4s"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/oauth/parameters/RequestTokenParameters.scala",
"chars": 342,
"preview": "package com.danielasfregola.twitter4s.http.clients.authentication.oauth.parameters\n\nimport com.danielasfregola.twitter4s"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/RestClient.scala",
"chars": 2752,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest\n\nimport akka.actor.ActorSystem\nimport akka.http.scaladsl.model.{"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/account/TwitterAccountClient.scala",
"chars": 14770,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.account\n\nimport com.danielasfregola.twitter4s.entities._\nimport "
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/account/parameters/CredentialsParameters.scala",
"chars": 412,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.account.parameters\n\nimport com.danielasfregola.twitter4s.http.ma"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/accountactivity/TwitterAccountActivityClient.scala",
"chars": 6898,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.accountactivity\n\nimport com.danielasfregola.twitter4s.entities._"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/accountactivity/parameters/WebhooksParameters.scala",
"chars": 237,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.accountactivity.parameters\n\nimport com.danielasfregola.twitter4s"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/application/TwitterApplicationClient.scala",
"chars": 1723,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.application\n\nimport com.danielasfregola.twitter4s.entities.enums"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/application/parameters/RatesParameters.scala",
"chars": 244,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.application.parameters\n\nimport com.danielasfregola.twitter4s.htt"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/blocks/TwitterBlockClient.scala",
"chars": 10051,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.blocks\n\nimport com.danielasfregola.twitter4s.entities._\nimport c"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/blocks/parameters/BlockParameters.scala",
"chars": 473,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.blocks.parameters\n\nimport com.danielasfregola.twitter4s.http.mar"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/blocks/parameters/BlockedUserIdsParameters.scala",
"chars": 259,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.blocks.parameters\n\nimport com.danielasfregola.twitter4s.http.mar"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/blocks/parameters/BlockedUsersParameters.scala",
"chars": 404,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.blocks.parameters\n\nimport com.danielasfregola.twitter4s.http.mar"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/TwitterDirectMessageClient.scala",
"chars": 12005,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages\n\nimport com.danielasfregola.twitter4s.entities._\n"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/parameters/CreateEventParameters.scala",
"chars": 1081,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages.parameters\n\nimport com.danielasfregola.twitter4s."
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/parameters/CreateParameters.scala",
"chars": 411,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages.parameters\n\nimport com.danielasfregola.twitter4s."
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/parameters/DestroyParameters.scala",
"chars": 259,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages.parameters\n\nimport com.danielasfregola.twitter4s."
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/parameters/EventListParameters.scala",
"chars": 264,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages.parameters\nimport com.danielasfregola.twitter4s.h"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/parameters/ReceivedParameters.scala",
"chars": 554,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages.parameters\n\nimport com.danielasfregola.twitter4s."
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/parameters/SentParameters.scala",
"chars": 523,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages.parameters\n\nimport com.danielasfregola.twitter4s."
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/parameters/ShowParameters.scala",
"chars": 231,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages.parameters\n\nimport com.danielasfregola.twitter4s."
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/favorites/TwitterFavoriteClient.scala",
"chars": 7180,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.favorites\n\nimport com.danielasfregola.twitter4s.entities.{RatedD"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/favorites/parameters/FavoriteParameters.scala",
"chars": 255,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.favorites.parameters\n\nimport com.danielasfregola.twitter4s.http."
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/favorites/parameters/FavoritesParameters.scala",
"chars": 640,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.favorites.parameters\n\nimport com.danielasfregola.twitter4s.http."
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/followers/TwitterFollowerClient.scala",
"chars": 13628,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.followers\n\nimport com.danielasfregola.twitter4s.entities.{RatedD"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/followers/parameters/FollowersParameters.scala",
"chars": 635,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.followers.parameters\n\nimport com.danielasfregola.twitter4s.http."
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/followers/parameters/FollowingParameters.scala",
"chars": 549,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.followers.parameters\n\nimport com.danielasfregola.twitter4s.http."
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friends/TwitterFriendClient.scala",
"chars": 13700,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.friends\n\nimport com.danielasfregola.twitter4s.entities.{RatedDat"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friends/parameters/FriendParameters.scala",
"chars": 532,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.friends.parameters\n\nimport com.danielasfregola.twitter4s.http.ma"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friends/parameters/FriendsParameters.scala",
"chars": 621,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.friends.parameters\n\nimport com.danielasfregola.twitter4s.http.ma"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/TwitterFriendshipClient.scala",
"chars": 22855,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships\n\nimport com.danielasfregola.twitter4s.entities._\nimp"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/parameters/BlockedParameters.scala",
"chars": 243,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships.parameters\n\nimport com.danielasfregola.twitter4s.htt"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/parameters/FollowParameters.scala",
"chars": 397,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships.parameters\n\nimport com.danielasfregola.twitter4s.htt"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/parameters/FriendshipParameters.scala",
"chars": 260,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships.parameters\n\nimport com.danielasfregola.twitter4s.htt"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/parameters/NotificationParameters.scala",
"chars": 808,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships.parameters\n\nimport com.danielasfregola.twitter4s.htt"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/parameters/RelationshipParameters.scala",
"chars": 561,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships.parameters\n\nimport com.danielasfregola.twitter4s.htt"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/parameters/RelationshipsParameters.scala",
"chars": 283,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships.parameters\n\nimport com.danielasfregola.twitter4s.htt"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/parameters/UnfollowParameters.scala",
"chars": 276,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships.parameters\n\nimport com.danielasfregola.twitter4s.htt"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/geo/TwitterGeoClient.scala",
"chars": 8993,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.geo\n\nimport com.danielasfregola.twitter4s.entities.enums.Granula"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/geo/parameters/GeoSearchParameters.scala",
"chars": 1120,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.geo.parameters\n\nimport com.danielasfregola.twitter4s.entities.Ac"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/geo/parameters/ReverseGeoCodeParameters.scala",
"chars": 783,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.geo.parameters\n\nimport com.danielasfregola.twitter4s.entities.Ac"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/help/TwitterHelpClient.scala",
"chars": 2950,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.help\n\nimport com.danielasfregola.twitter4s.entities._\nimport com"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/TwitterListClient.scala",
"chars": 92752,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists\n\nimport com.danielasfregola.twitter4s.entities._\nimport co"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/AddMemberParameters.scala",
"chars": 697,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.http.mars"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/CreateListParameters.scala",
"chars": 337,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.entities."
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/ListMembersParameters.scala",
"chars": 834,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.http.mars"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/ListParameters.scala",
"chars": 499,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.http.mars"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/ListTimelineParameters.scala",
"chars": 1101,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.entities."
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/ListsParameters.scala",
"chars": 389,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.http.mars"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/MemberParameters.scala",
"chars": 834,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.http.mars"
},
{
"path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/MembersParameters.scala",
"chars": 687,
"preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.http.mars"
}
]
// ... and 390 more files (download for full content)
About this extraction
This page contains the full source code of the DanielaSfregola/twitter4s GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 590 files (3.7 MB), approximately 1.0M tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.