diff --git a/.gitignore b/.gitignore index 5584fa9..68c1f40 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,10 @@ *~ src/twitter examples/example -examples/credential.json +credential.json nimcache/ *.swp twitter test.jpg test.mp4 +examples/v2example/v2example \ No newline at end of file diff --git a/README.md b/README.md index 904cd49..4e39d52 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,18 @@ -# twitter ![.github/workflows/tests.yml](https://github.com/snus-kin/twitter.nim/workflows/.github/workflows/tests.yml/badge.svg?branch=master) +# twitter ![.github/workflows/tests.yml](https://github.com/snus-kin/twitter.nim/workflows/.github/workflows/tests.yml/badge.svg?branch=master) ![](https://img.shields.io/endpoint?url=https%3A%2F%2Ftwbadges.glitch.me%2Fbadges%2Fstandard) ![](https://img.shields.io/endpoint?url=https%3A%2F%2Ftwbadges.glitch.me%2Fbadges%2Fv2) -Low-level twitter API wrapper library for Nim. +Low-level Twitter API wrapper library for Nim. [Documentation](https://snus-kin.github.io/twitter.nim/twitter.html) ## Installation + From Nimble: + ```console $ nimble install twitter ``` -From Github: +From GitHub: ```console $ git clone git://github.com/snus-kin/twitter.nim @@ -18,14 +20,16 @@ $ cd twitter.nim && nimble install ``` ## Usage -To use the library, `import twitter` and compile with `-d:ssl` -Note: only the standard (free) endpoints are wrapped. All mentioned in the +To use the library, `import twitter` and compile with `-d:ssl` + +Note: only the free endpoints are wrapped. All mentioned in the [API Reference Index](https://developer.twitter.com/en/docs/api-reference-index) have been implemented, please open an issue if you find one that isn't in this -reference. +reference or if anything new's been added I haven't seen yet. ## Example + ```nim import twitter, json, strtabs @@ -39,27 +43,23 @@ when isMainModule: parsed["AccessTokenSecret"].str) # Simply get. - var resp = twitterAPI.get("account/verify_credentials.json") + var resp = twitterAPI.get("1.1/account/verify_credentials.json") echo resp.status - # Using proc corresponding twitter REST APIs. - resp = twitterAPI.userTimeline() - echo parseJson(resp.body) - # ditto, but selected by screen name. - resp = twitterAPI.usersLookup("sn_fk_n") + resp = twitter.v1.usersLookup(twitterAPI, "sn_fk_n") echo pretty parseJson(resp.body) - # Using `callAPI` template. - let status = {"status": "Hello world!"}.newStringTable - resp = twitterAPI.callAPI(statusesUpdate, status) + # Using proc corresponding twitter REST APIs. + resp = twitter.v1.statusesUserTimeline(twitterAPI) echo pretty parseJson(resp.body) - # Upload media - var ubody = {"media_type": "twitter_image"}.newStringTable - var image = readFile("example.png") - resp = twitterAPI.post("media/upload.json", ubody, media=true, data=image) - echo parseJson(resp.body) + # Using `callAPI` template. + let status = {"status": "hello world"}.newStringTable + resp = twitterAPI.callAPI(twitter.v1.statusesUpdate, status) + echo pretty parseJson(resp.body) ``` See also: `examples/` for more extensive examples on the library's use. + +To use basic auth, you will have to construct the request using the bare request object. \ No newline at end of file diff --git a/examples/README.md b/examples/v1example/README.md similarity index 100% rename from examples/README.md rename to examples/v1example/README.md diff --git a/examples/v1example/example b/examples/v1example/example new file mode 100755 index 0000000..3953dd4 Binary files /dev/null and b/examples/v1example/example differ diff --git a/examples/example.nim b/examples/v1example/example.nim similarity index 76% rename from examples/example.nim rename to examples/v1example/example.nim index 2dfc1be..1099be2 100644 --- a/examples/example.nim +++ b/examples/v1example/example.nim @@ -1,5 +1,5 @@ import json, strtabs, httpclient, streams, os -import ../src/twitter +import ../../src/twitter when isMainModule: var parsed = parseFile("credential.json") @@ -11,20 +11,20 @@ when isMainModule: parsed["AccessTokenSecret"].str) # Simply get. - var resp = twitterAPI.get("account/verify_credentials.json") + var resp = twitterAPI.get("1.1/account/verify_credentials.json") echo resp.status # ditto, but selected by screen name. - resp = twitterAPI.usersLookup("sn_fk_n") + resp = twitter.v1.usersLookup(twitterAPI, "sn_fk_n") echo pretty parseJson(resp.body) # Using proc corresponding twitter REST APIs. - resp = twitterAPI.statusesUserTimeline() + resp = twitter.v1.statusesUserTimeline(twitterAPI) echo pretty parseJson(resp.body) # Using `callAPI` template. let status = {"status": "hello world"}.newStringTable - resp = twitterAPI.callAPI(statusesUpdate, status) + resp = twitterAPI.callAPI(twitter.v1.statusesUpdate, status) echo pretty parseJson(resp.body) # Upload files in a stream @@ -33,7 +33,7 @@ when isMainModule: let mediaSize = "test.jpg".getFileSize # INIT - resp = twitterAPI.mediaUploadInit("image/jpg", $ mediaSize) + resp = twitter.v1.mediaUploadInit(twitterAPI, "image/jpg", $ mediaSize) let initResp = parseJson(resp.body) echo pretty initResp let mediaId = initResp["media_id_string"].getStr @@ -45,7 +45,7 @@ when isMainModule: while not mediaStream.atEnd(): buffer = mediaStream.readStr(buffersize) echo "Uploading segment: ", segment - resp = twitterAPI.mediaUploadAppend(mediaId, $ segment, buffer) + resp = twitter.v1.mediaUploadAppend(twitterAPI, mediaId, $ segment, buffer) # Response should be 204 if resp.status != "204 No Content": stderr.writeLine "Error when uploading, server returned: " & resp.status @@ -53,7 +53,7 @@ when isMainModule: segment += 1 # FINALIZE - resp = twitterAPI.mediaUploadFinalize(mediaId) + resp = twitter.v1.mediaUploadFinalize(twitterAPI, mediaId) echo pretty parseJson(resp.body) let finalResp = parseJson(resp.body) let finalMediaId = finalResp["media_id_string"].getStr @@ -64,12 +64,12 @@ when isMainModule: # STATUS # If the API tells use it has to process the media if finalResp.hasKey("processing_info"): - resp = twitterAPI.mediaUploadStatus(finalMediaId) + resp = twitter.v1.mediaUploadStatus(twitterAPI, finalMediaId) var respBody = parseJson(resp.body) # Loop until it reaches the end state of 'failed' or 'succeeded' while respBody["processing_info"]["state"].getStr notin ["failed", "succeeded"]: echo pretty parseJson(resp.body) - resp = twitterAPI.mediaUploadStatus(finalMediaId) + resp = twitter.v1.mediaUploadStatus(twitterAPI, finalMediaId) respBody = parseJson(resp.body) # Sleep for the amount of seconds it tells you to sleep(respBody["processing_info"]["check_after_secs"].getInt * 100) @@ -79,10 +79,10 @@ when isMainModule: # Attach metadata let mediaMetadata = %* {"media_id": mediaId, "alt_text":{"text":"This is an example of alt text"}} - resp = twitterAPI.mediaMetadataCreate(mediaMetadata) + resp = twitter.v1.mediaMetadataCreate(twitterAPI, mediaMetadata) # This should be 2xx echo resp.status # Send a tweet with that media let mediaStatus = {"media_ids": finalMediaId}.newStringTable - resp = twitterAPI.statusesUpdate("This is a media upload test", mediaStatus) + resp = twitter.v1.statusesUpdate(twitterAPI, "This is a media upload test", mediaStatus) diff --git a/examples/example.nim.cfg b/examples/v1example/example.nim.cfg similarity index 100% rename from examples/example.nim.cfg rename to examples/v1example/example.nim.cfg diff --git a/examples/v2example/v2example.nim b/examples/v2example/v2example.nim new file mode 100644 index 0000000..a254959 --- /dev/null +++ b/examples/v2example/v2example.nim @@ -0,0 +1,10 @@ +import json, strtabs, httpclient, streams, os +import ../../src/twitter + +when isMainModule: + let parsed = parseFile("credential.json") + var twitterAPI = newTwitterAPI(parsed["BearerToken"].str) + + # Bearer token get info about an account + let resp = twitter.v2.usersId(twitterAPI, "1140672492220162052") + echo pretty parseJson(resp.body) \ No newline at end of file diff --git a/examples/v2example/v2example.nim.cfg b/examples/v2example/v2example.nim.cfg new file mode 100644 index 0000000..5ae5d0b --- /dev/null +++ b/examples/v2example/v2example.nim.cfg @@ -0,0 +1,2 @@ + +-d:ssl \ No newline at end of file diff --git a/src/endpoints/auth.nim b/src/auth.nim similarity index 82% rename from src/endpoints/auth.nim rename to src/auth.nim index ea07f73..9d926bf 100644 --- a/src/endpoints/auth.nim +++ b/src/auth.nim @@ -1,5 +1,5 @@ import strtabs, httpclient -import ../utility/[requests, types] +import utility/[requests, types] # -------------- # authentication # -------------- @@ -66,3 +66,13 @@ proc oauth2Token*(twitter: TwitterAPI, grantType: string, else: return post(twitter, "oauth2/token", { "grant_type": grantType}.newStringTable) + +proc v2oauth2Token*(twitter: TwitterAPI, grantType: string, + additionalParams: StringTableRef = nil): Response = + ## `oauth2/token` endpoint, I'm not sure how this is different to the previous endpoint, as of now I have no clarification. + if additionalParams != nil: + additionalParams["grant_type"] = grantType + return post(twitter, "2/oauth2/token", additionalParams) + else: + return post(twitter, "2/oauth2/token", { + "grant_type": grantType}.newStringTable) diff --git a/src/twitter.nim b/src/twitter.nim index 82ab373..f25f11b 100644 --- a/src/twitter.nim +++ b/src/twitter.nim @@ -1,403 +1,8 @@ import httpclient, strtabs, json import utility/[types, requests] -include endpoints/[lists, followers, auth, collections, users, statuses, directmessages, media] - -export types, requests - -# ------------------- -# developer utilities -# ------------------- - - -proc applicationRateLimitData*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `application/rate_limit_status.json` endpoint - return get(twitter, "application/rate_limit_status.json", additionalParams) - - -proc helpConfiguration*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `help/configuration.json` endpoint - return get(twitter, "help/configuration.json", additionalParams) - - -proc helpLanguages*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `help/languages.json` endpoint - return get(twitter, "help/languages.json", additionalParams) - - -# ------- -# account -# ------- - - -proc accountSettings*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `account/settings.json` endpoint - return get(twitter, "account/settings.json", additionalParams) - - -proc accountVerifyCredentials*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `account/verify_credentials.json` endpoint - return get(twitter, "account/verify_credentials.json", additionalParams) - - -proc accountRemoveProfileBanner*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `account/remove_profile_banner.json` endpoint - return post(twitter, "account/remove_profile_banner.json", additionalParams) - - -proc accountUpdateSettings*(twitter: TwitterAPI, - additionalParams: StringTableRef): Response = - ## `account/update_settings.json` endpoint - return post(twitter, "account/update_settings.json", additionalParams) - - -proc accountUpdateProfile*(twitter: TwitterAPI, - additionalParams: StringTableRef): Response = - ## `account/update_profile.json` endpoint - return post(twitter, "account/update_profile.json", additionalParams) - - -proc accountUpdateProfileBanner*(twitter: TwitterAPI, banner: string, - additionalParams: StringTableRef = nil): Response = - ## `account/update_profile_banner.json` endpoint - if additionalParams != nil: - additionalParams["banner"] = banner - return post(twitter, "account/update_profile_banner.json", additionalParams) - else: - return post(twitter, "account/update_profile_banner.json", { - "banner": banner}.newStringTable) - - -proc accountUpdateProfileImage*(twitter: TwitterAPI, image: string, - additionalParams: StringTableRef = nil): Response = - ## `account/update_profile_image.json` endpoint - if additionalParams != nil: - additionalParams["image"] = image - return post(twitter, "account/update_profile_image.json", additionalParams) - else: - return post(twitter, "account/update_profile_image.json", { - "image": image}.newStringTable) - - -# -------------- -# saved_searches -# -------------- - - -proc savedSeachesList*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `saved_searches/list.json` endpoint - return get(twitter, "saved_searches/list.json", additionalParams) - - -proc savedSearchesShow*(twitter: TwitterAPI, id: int, - additionalParams: StringTableRef = nil): Response = - ## `saved_searches/show/:id.json` endpoint - return get(twitter, "saved_searches/show/" & $id & ".json", additionalParams) - - -proc savedSearchesCreate*(twitter: TwitterAPI, query: string, - additionalParams: StringTableRef = nil): Response = - ## `saved_searches/create.json` endpoint - if additionalParams != nil: - additionalParams["query"] = query - return post(twitter, "saved_searches/create.json", additionalParams) - else: - return post(twitter, "saved_searches/create.json", { - "query": query}.newStringTable) - - -proc savedSeachesDestroy*(twitter: TwitterAPI, id: int, - additionalParams: StringTableRef = nil): Response = - ## `saved_searches/destroy/:id.json` endpoint - return post(twitter, "saved_searches/destroy/" & $id & ".json", additionalParams) - - -# -------------- -# blocks / mutes -# -------------- - - -proc blocksIds*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `blocks/ids.json` endpoint - return get(twitter, "blocks/ids.json", additionalParams) - - -proc blocksList*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `blocks/list.json` endpoint - return get(twitter, "blocks/list.json", additionalParams) - - -proc mutesUsersIds*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `mutes/users/ids.json` endpoint - return get(twitter, "mutes/users/ids.json", additionalParams) - - -proc mutesUsersList*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `mutes/users/list.json` endpoint - return get(twitter, "mutes/users/list.json", additionalParams) - - -proc blocksCreate*(twitter: TwitterAPI, screenName: string, - additionalParams: StringTableRef = nil): Response = - # `blocks/create.json` endpoint for screen name - if additionalParams != nil: - additionalParams["user_id"] = $screenName - return post(twitter, "blocks/create.json", additionalParams) - else: - return post(twitter, "blocks/create.json", { - "screen_name": $screenName}.newStringTable) - - -proc blocksCreate*(twitter: TwitterAPI, userId: int, - additionalParams: StringTableRef = nil): Response = - # `blocks/create.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return post(twitter, "blocks/create.json", additionalParams) - else: - return post(twitter, "blocks/create.json", { - "user_id": $userId}.newStringTable) - - -proc blocksDestroy*(twitter: TwitterAPI, screenName: string, - additionalParams: StringTableRef = nil): Response = - # `blocks/destroy.json` endpoint for screen name - if additionalParams != nil: - additionalParams["user_id"] = $screenName - return post(twitter, "blocks/destroy.json", additionalParams) - else: - return post(twitter, "blocks/destroy.json", { - "screen_name": $screenName}.newStringTable) - - -proc blocksDestroy*(twitter: TwitterAPI, userId: int, - additionalParams: StringTableRef = nil): Response = - # `blocks/destroy.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return post(twitter, "blocks/destroy.json", additionalParams) - else: - return post(twitter, "blocks/destroy.json", { - "user_id": $userId}.newStringTable) - - -proc mutesUsersCreate*(twitter: TwitterAPI, screenName: string, - additionalParams: StringTableRef = nil): Response = - # `mutes/users/create.json` endpoint for screen name - if additionalParams != nil: - additionalParams["user_id"] = $screenName - return post(twitter, "mutes/users/create.json", additionalParams) - else: - return post(twitter, "mutes/users/create.json", { - "screen_name": $screenName}.newStringTable) - - -proc mutesUsersCreate*(twitter: TwitterAPI, userId: int, - additionalParams: StringTableRef = nil): Response = - # `mutes/users/create.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return post(twitter, "mutes/users/create.json", additionalParams) - else: - return post(twitter, "mutes/users/create.json", { - "user_id": $userId}.newStringTable) - - -proc mutesUsersDestroy*(twitter: TwitterAPI, screenName: string, - additionalParams: StringTableRef = nil): Response = - # `mutes/users/destroy.json` endpoint for screen name - if additionalParams != nil: - additionalParams["user_id"] = $screenName - return post(twitter, "mutes/users/destroy.json", additionalParams) - else: - return post(twitter, "mutes/users/destroy.json", { - "screen_name": $screenName}.newStringTable) - - -proc mutesUsersDestroy*(twitter: TwitterAPI, userId: int, - additionalParams: StringTableRef = nil): Response = - # `mutes/users/destroy.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return post(twitter, "mutes/users/destroy.json", additionalParams) - else: - return post(twitter, "mutes/users/destroy.json", { - "user_id": $userId}.newStringTable) - - -# --------- -# favorites -# --------- - - -proc favoritesList*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `favorites/list.json` endpoint - return get(twitter, "favorites/list.json", additionalParams) - - -proc favoritesCreate*(twitter: TwitterAPI, id: int, - additionalParams: StringTableRef = nil): Response = - ## `favorites/create.json` endpoint - if additionalParams != nil: - additionalParams["id"] = $id - return post(twitter, "favorites/create.json", additionalParams) - else: - return post(twitter, "favorites/create.json", {"id": $id}.newStringTable) - - -proc favoritesDestroy*(twitter: TwitterAPI, id: int, - additionalParams: StringTableRef = nil): Response = - ## `favorites/destroy.json` endpoint - if additionalParams != nil: - additionalParams["id"] = $id - return post(twitter, "favorites/destroy.json", additionalParams) - else: - return post(twitter, "favorites/destroy.json", {"id": $id}.newStringTable) - - -# ------ -# search -# ------ - - -proc searchTweets*(twitter: TwitterAPI, q: string, - additionalParams: StringTableRef = nil): Response = - ## `search/tweets.json` endpoint - ## - ## Standard tier search endpoint - if additionalParams != nil: - additionalParams["q"] = q - return get(twitter, "search/tweets.json", additionalParams) - else: - return get(twitter, "search/tweets.json", {"q": q}.newStringTable) - - -# --------------- -# custom_profiles -# --------------- - - -proc customProfilesDestroy*(twitter: TwitterAPI, id: int, - additionalParams: StringTableRef = nil): Response = - ## `custom_profiles/destroy.json` endpoint - if additionalParams != nil: - additionalParams["id"] = $id - return delete(twitter, "custom_profiles/destroy.json", additionalParams) - else: - return delete(twitter, "custom_profiles/destroy.json", { - "id": $id}.newStringTable) - - -proc customProfilesId*(twitter: TwitterAPI, id: int, - additionalParams: StringTableRef = nil): Response = - ## `custom_profiles/:id.json` endpoint - return get(twitter, "custom_profiles/" & $id & ".json", additionalParams) - - -proc customProfilesLists*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `custom_profiles/list.json` endpoint - return get(twitter, "custom_profiles/list.json", additionalParams) - - -proc customProfilesNew*(twitter: TwitterAPI, jsonBody: JsonNode): Response = - ## `custom_profiles/new.json` endpoint - return post(twitter, "custom_profiles/new.json", jsonBody) - - -# ------ -# trends -# ------ - - -proc trendsAvailable*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `trends/available.json` endpoint - return get(twitter, "trends/available.json", additionalParams) - - -proc trendsClosest*(twitter: TwitterAPI, lat: float, lon: float, - additionalParams: StringTableRef = nil): Response = - ## `trends/closest.json` endpoint - if additionalParams != nil: - additionalParams["lat"] = $ lat - additionalParams["lon"] = $ lon - return get(twitter, "trends/closest.json", additionalParams) - else: - return get(twitter, "trends/closest.json", {"lat": $lat, - "lon": $lon}.newStringTable) - - -proc trendsPlace*(twitter: TwitterAPI, id: int32, - additionalParams: StringTableRef = nil): Response = - ## `trends/place.json` endpoint - # id is explicitly int32 since it is Yahoo WOED which uses 32 bit ints - if additionalParams != nil: - additionalParams["id"] = $ id - return get(twitter, "trends/place.json", additionalParams) - else: - return get(twitter, "trends/place.json", {"id": $id}.newStringTable) - - -# --- -# geo -# --- - - -proc geoId*(twitter: TwitterAPI, id: string, - additionalParams: StringTableRef = nil): Response = - ## `geo/id/:place_id.json` endpoint - return get(twitter, "geo/id/" & id & ".json", additionalParams) - - -proc geoReverseGeocode*(twitter: TwitterAPI, lat: float, lon: float, - additionalParams: StringTableRef = nil): Response = - ## `geo/reverse_geocode.json` endpoint - if additionalParams != nil: - additionalParams["lat"] = $ lat - additionalParams["lon"] = $ lon - return get(twitter, "geo/reverse_geocode.json", additionalParams) - else: - return get(twitter, "geo/reverse_geocode.json", {"lat": $lat, - "lon": $lon}.newStringTable) - - -proc geoSearch*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `geo/search.json` endpoint - return get(twitter, "geo/search.json", additionalParams) - - -# -------- -# insights -# -------- - - -proc insightsEngagementTotals*(twitter: TwitterAPI, - jsonBody: JsonNode): Response = - ## `insights/enagement/totals.json` endpoint - return post(twitter, "insights/enagement/totals.json", jsonBody) - - -proc insightsEngagementHistorical*(twitter: TwitterAPI, - jsonBody: JsonNode): Response = - ## `insights/enagement/historical.json` endpoint - return post(twitter, "insights/enagement/historical.json", jsonBody) - - -proc insightsEngagement28h*(twitter: TwitterAPI, jsonBody: JsonNode): Response = - ## `insights/enagement/28h.json` endpoint - return post(twitter, "insights/enagement/28h.json", jsonBody) - +import v1, v2, auth +export types, requests, v1, v2, auth # ------- # utility @@ -413,7 +18,7 @@ proc uploadFile*(twitter: TwitterAPI, filename: string, var ubody = additionalParams ubody["media_type"] = mediaType let data = $ readFile(filename) - return post(twitter, "media/upload.json", ubody, true, data) + return post(twitter, "1.1/media/upload.json", ubody, true, data) template callAPI*(twitter: TwitterAPI, api: untyped, @@ -423,5 +28,5 @@ template callAPI*(twitter: TwitterAPI, api: untyped, ## Example: ## ```nim ## var testStatus = {"status": "test"}.newStringTable - ## var resp = twitterAPI.callAPI(statusesUpdate, testStatus)``` + ## var resp = twitterAPI.callAPI(twitter.v1.statusesUpdate, testStatus)``` api(twitter, additionalParams) diff --git a/src/twitterv2.nim b/src/twitterv2.nim deleted file mode 100644 index e69de29..0000000 diff --git a/src/utility/requests.nim b/src/utility/requests.nim index 6bd258d..d4c1839 100644 --- a/src/utility/requests.nim +++ b/src/utility/requests.nim @@ -10,10 +10,18 @@ import hmac import ./types -const baseUrl = "https://api.twitter.com/1.1/" +# v1.1 : add 1.1/ +# v2 : add 2/ +const baseUrl = "https://api.twitter.com/" const uploadUrl = "https://upload.twitter.com/1.1/" const publishUrl = "https://publish.twitter.com" -const clientUserAgent = "twitter.nim/1.1.0" + +# TODO investigate this, seems to be new? +# I'm not sure if this is outside of free twitter endpoints, +# you should be able to request to it using the request method manually +# const dataAPIUrl = "https://data-api.twitter.com" + +const clientUserAgent = "twitter.nim/2.0.0" # Stolen from cgi.nim proc encodeUrl*(s: string): string = @@ -47,12 +55,14 @@ proc signature(consumerSecret, accessTokenSecret, httpMethod, url: string, proc buildParams(consumerKey, accessToken: string, additionalParams: StringTableRef = nil): StringTableRef = - var params: StringTableRef = {"oauth_version": "1.0", - "oauth_consumer_key": consumerKey, - "oauth_nonce": $genUUID(), - "oauth_signature_method": "HMAC-SHA1", - "oauth_timestamp": $(epochTime().toInt), - "oauth_token": accessToken}.newStringTable + var params: StringTableRef = { + "oauth_version": "1.0", + "oauth_consumer_key": consumerKey, + "oauth_nonce": $genUUID(), + "oauth_signature_method": "HMAC-SHA1", + "oauth_timestamp": $(epochTime().toInt), + "oauth_token": accessToken + }.newStringTable for key, value in params: params[key] = encodeUrl(value) @@ -63,7 +73,7 @@ proc buildParams(consumerKey, accessToken: string, proc buildParams(additionalParams: StringTableRef = nil): StringTableRef = - var params: StringTableRef + var params: StringTableRef = newStringTable() if additionalParams != nil: for key, value in additionalParams: params[key] = encodeUrl(value) @@ -72,7 +82,8 @@ proc buildParams(additionalParams: StringTableRef = nil): StringTableRef = proc request*(twitter: TwitterAPI, endPoint, httpMethod: string, additionalParams: StringTableRef = nil, - requestUrl: string = baseUrl, data: string = ""): Response = + requestUrl: string = baseUrl, data: string = "", + username: string = "", password: string = ""): Response = let url = requestUrl & endPoint var keys: seq[string] = @[] @@ -93,8 +104,14 @@ proc request*(twitter: TwitterAPI, endPoint, httpMethod: string, authorize = authorize & key & "=" & params[key] & "," else: keys.add(key) + elif username != "": + # Basic authentication + authorize = username & ":" & password + for key in params.keys: + keys.add(key) else: # OAuth2 flow + # TODO can we do this ? https://developer.twitter.com/en/docs/authentication/oauth-2-0/authorization-code params = buildParams(additionalParams) for key in params.keys: keys.add(key) diff --git a/src/v1.nim b/src/v1.nim new file mode 100644 index 0000000..31582bd --- /dev/null +++ b/src/v1.nim @@ -0,0 +1 @@ +include v1endpoints/[lists, followers, collections, users, statuses, directmessages, media, misc] \ No newline at end of file diff --git a/src/endpoints/collections.nim b/src/v1endpoints/collections.nim similarity index 67% rename from src/endpoints/collections.nim rename to src/v1endpoints/collections.nim index 570db62..a580efd 100644 --- a/src/endpoints/collections.nim +++ b/src/v1endpoints/collections.nim @@ -10,9 +10,9 @@ proc collectionsEntries*(twitter: TwitterAPI, id: string, ## `collections/entries.json` endpoint if additionalParams != nil: additionalParams["id"] = id - return get(twitter, "collections/entries.json", additionalParams) + return get(twitter, "1.1/collections/entries.json", additionalParams) else: - return get(twitter, "collections/entries.json", {"id": id}.newStringTable) + return get(twitter, "1.1/collections/entries.json", {"id": id}.newStringTable) proc collectionsList*(twitter: TwitterAPI, id: int, @@ -20,9 +20,9 @@ proc collectionsList*(twitter: TwitterAPI, id: int, ## `collections/list.json` endpoint for twitter user id if additionalParams != nil: additionalParams["id"] = $id - return get(twitter, "collections/list.json", additionalParams) + return get(twitter, "1.1/collections/list.json", additionalParams) else: - return get(twitter, "collections/list.json", {"id": $id}.newStringTable) + return get(twitter, "1.1/collections/list.json", {"id": $id}.newStringTable) proc collectionsList*(twitter: TwitterAPI, screenName: string, @@ -30,9 +30,9 @@ proc collectionsList*(twitter: TwitterAPI, screenName: string, ## `collections/list.json` for twitter user screen name if additionalParams != nil: additionalParams["screen_name"] = screenName - return get(twitter, "collections/list.json", additionalParams) + return get(twitter, "1.1/collections/list.json", additionalParams) else: - return get(twitter, "collections/list.json", { + return get(twitter, "1.1/collections/list.json", { "screen_name": screenName}.newStringTable) @@ -41,9 +41,9 @@ proc collectionsShow*(twitter: TwitterAPI, id: string, ## `collections/show.json` endpoint if additionalParams != nil: additionalParams["id"] = id - return get(twitter, "collections/show.json", additionalParams) + return get(twitter, "1.1/collections/show.json", additionalParams) else: - return get(twitter, "collections/show.json", {"id": id}.newStringTable) + return get(twitter, "1.1/collections/show.json", {"id": id}.newStringTable) proc collectionsCreate*(twitter: TwitterAPI, name: string, @@ -51,9 +51,9 @@ proc collectionsCreate*(twitter: TwitterAPI, name: string, ## `collections/create.json` endpoint if additionalParams != nil: additionalParams["name"] = name - return post(twitter, "collections/create.json", additionalParams) + return post(twitter, "1.1/collections/create.json", additionalParams) else: - return post(twitter, "collections/create.json", { + return post(twitter, "1.1/collections/create.json", { "name": name}.newStringTable) @@ -61,9 +61,9 @@ proc collectionsDestroy*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = if additionalParams != nil: additionalParams["id"] = id - return post(twitter, "collections/destroy.json", additionalParams) + return post(twitter, "1.1/collections/destroy.json", additionalParams) else: - return post(twitter, "collections/destroy.json", {"id": id}.newStringTable) + return post(twitter, "1.1/collections/destroy.json", {"id": id}.newStringTable) proc collectionsEntriesAdd*(twitter: TwitterAPI, id: string, tweet_id: int, @@ -72,9 +72,9 @@ proc collectionsEntriesAdd*(twitter: TwitterAPI, id: string, tweet_id: int, if additionalParams != nil: additionalParams["id"] = id additionalParams["tweet_id"] = $tweet_id - return post(twitter, "collections/entries/add.json", additionalParams) + return post(twitter, "1.1/collections/entries/add.json", additionalParams) else: - return post(twitter, "collections/entries/add.json", {"id": id, + return post(twitter, "1.1/collections/entries/add.json", {"id": id, "tweet_id": $tweet_id}.newStringTable) @@ -82,7 +82,7 @@ proc collectionsEntriesCurate*(twitter: TwitterAPI, jsonBody: JsonNode): Response = ## `collections/entries/curate.json` endpoint # This is honestly one of the worst parts of the API docs. I can't work out what it does. - return post(twitter, "collections/entries/curate.json", jsonBody) + return post(twitter, "1.1/collections/entries/curate.json", jsonBody) proc collectionsEntriesMove*(twitter: TwitterAPI, id: string, tweet_id: int, @@ -92,9 +92,9 @@ proc collectionsEntriesMove*(twitter: TwitterAPI, id: string, tweet_id: int, additionalParams["id"] = id additionalParams["tweet_id"] = $tweet_id additionalParams["relative_to"] = $relative_to - return post(twitter, "collections/entries/move.json", additionalParams) + return post(twitter, "1.1/collections/entries/move.json", additionalParams) else: - return post(twitter, "collections/entries/move.json", {"id": id, + return post(twitter, "1.1/collections/entries/move.json", {"id": id, "tweet_id": $tweet_id, "relative_to": $relative_to}.newStringTable) @@ -104,9 +104,9 @@ proc collectionsEntriesRemove*(twitter: TwitterAPI, id: string, tweet_id: int, if additionalParams != nil: additionalParams["id"] = id additionalParams["tweet_id"] = $tweet_id - return post(twitter, "collections/entries/remove.json", additionalParams) + return post(twitter, "1.1/collections/entries/remove.json", additionalParams) else: - return post(twitter, "collections/entries/remove.json", {"id": id, + return post(twitter, "1.1/collections/entries/remove.json", {"id": id, "tweet_id": $tweet_id}.newStringTable) @@ -115,6 +115,6 @@ proc collectionsUpdate*(twitter: TwitterAPI, id: string, ## `collections/update.json` endpoint if additionalParams != nil: additionalParams["id"] = id - return post(twitter, "collections/update.json", additionalParams) + return post(twitter, "1.1/collections/update.json", additionalParams) else: - return post(twitter, "collections/update.json", {"id": id}.newStringTable) + return post(twitter, "1.1/collections/update.json", {"id": id}.newStringTable) diff --git a/src/endpoints/directmessages.nim b/src/v1endpoints/directmessages.nim similarity index 67% rename from src/endpoints/directmessages.nim rename to src/v1endpoints/directmessages.nim index 00a1449..53d015a 100644 --- a/src/endpoints/directmessages.nim +++ b/src/v1endpoints/directmessages.nim @@ -10,16 +10,16 @@ proc directMessagesEventsDestroy*(twitter: TwitterAPI, id: int, ## `direct_messages/events/destroy.json` endpoint if additionalParams != nil: additionalParams["id"] = $id - return delete(twitter, "direct_messages/events/destroy.json", additionalParams) + return delete(twitter, "1.1/direct_messages/events/destroy.json", additionalParams) else: - return delete(twitter, "direct_messages/events/destroy.json", { + return delete(twitter, "1.1/direct_messages/events/destroy.json", { "id": $id}.newStringTable) proc directMessagsEventsList*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `direct_messages/events/list.json` endpoint - return get(twitter, "direct_messages/events/list.json", additionalParams) + return get(twitter, "1.1/direct_messages/events/list.json", additionalParams) proc directMessagesEventsShow*(twitter: TwitterAPI, id: int, @@ -27,22 +27,22 @@ proc directMessagesEventsShow*(twitter: TwitterAPI, id: int, ## `direct_messages/events/show.json` endpoint if additionalParams != nil: additionalParams["id"] = $id - return get(twitter, "direct_messages/events/show.json", additionalParams) + return get(twitter, "1.1/direct_messages/events/show.json", additionalParams) else: - return get(twitter, "direct_messages/events/show.json", { + return get(twitter, "1.1/direct_messages/events/show.json", { "id": $id}.newStringTable) proc directMessagesEventsNew*(twitter: TwitterAPI, jsonBody: JsonNode): Response = ## `direct_messages/events/new.json` endpoint (message_create) - return post(twitter, "direct_messages/events/new.json", jsonBody) + return post(twitter, "1.1/direct_messages/events/new.json", jsonBody) proc directMessagesIndicateTyping*(twitter: TwitterAPI, jsonBody: JsonNode): Response = ## `direct_messages/indicate_typing.json` endpoint - return post(twitter, "direct_messages/indicate_typing.json", jsonBody) + return post(twitter, "1.1/direct_messages/indicate_typing.json", jsonBody) proc directMessagesMarkRead*(twitter: TwitterAPI, lastReadEventId: int, @@ -51,9 +51,9 @@ proc directMessagesMarkRead*(twitter: TwitterAPI, lastReadEventId: int, if additionalParams != nil: additionalParams["last_read_event_id"] = $lastReadEventId additionalParams["recipient_id"] = $recipientId - return post(twitter, "direct_messages/mark_read.json", additionalParams) + return post(twitter, "1.1/direct_messages/mark_read.json", additionalParams) else: - return post(twitter, "direct_messages/mark_read.json", { + return post(twitter, "1.1/direct_messages/mark_read.json", { "last_read_event_id": $lastReadEventId, "recipient_id": $recipientId}.newStringTable) @@ -63,9 +63,9 @@ proc directMessagesWelcomeMessagesDestroy*(twitter: TwitterAPI, id: int, ## `direct_messages/welcome_messages/destroy.json` endpoint if additionalParams != nil: additionalParams["id"] = $id - return delete(twitter, "direct_messages/welcome_messages/destroy.json", additionalParams) + return delete(twitter, "1.1/direct_messages/welcome_messages/destroy.json", additionalParams) else: - return delete(twitter, "direct_messages/welcome_messages/destroy.json", { + return delete(twitter, "1.1/direct_messages/welcome_messages/destroy.json", { "id": $id}.newStringTable) @@ -74,9 +74,9 @@ proc directMessagesWelcomeMessagesRulesDestroy*(twitter: TwitterAPI, id: int, ## `direct_messages/welcome_messages/rules/destroy.json` endpoint if additionalParams != nil: additionalParams["id"] = $id - return delete(twitter, "direct_messages/rules/welcome_messages/destroy.json", additionalParams) + return delete(twitter, "1.1/direct_messages/rules/welcome_messages/destroy.json", additionalParams) else: - return delete(twitter, "direct_messages/rules/welcome_messages/destroy.json", + return delete(twitter, "1.1/direct_messages/rules/welcome_messages/destroy.json", {"id": $id}.newStringTable) @@ -85,22 +85,22 @@ proc directMessagesWelcomeMessagesUpdate*(twitter: TwitterAPI, id: int, ## `direct_messages/welcome_messages/update.json` endpoint if additionalParams != nil: additionalParams["id"] = $id - return put(twitter, "direct_messages/welcome_messages/update.json", additionalParams) + return put(twitter, "1.1/direct_messages/welcome_messages/update.json", additionalParams) else: - return put(twitter, "direct_messages/welcome_messages/update.json", { + return put(twitter, "1.1/direct_messages/welcome_messages/update.json", { "id": $id}.newStringTable) proc directMessagesWelcomeMessagesList*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `direct_messages/welcome_messages/list.json` endpoint - return get(twitter, "direct_messages/welcome_messages/list.json", additionalParams) + return get(twitter, "1.1/direct_messages/welcome_messages/list.json", additionalParams) proc directMessagesWelcomeMessagesRulesList*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `direct_messages/welcome_messages/rules/list.json` endpoint - return get(twitter, "direct_messages/welcome_messages/rules/list.json", additionalParams) + return get(twitter, "1.1/direct_messages/welcome_messages/rules/list.json", additionalParams) proc directMessagesWelcomeMessagesRulesShow*(twitter: TwitterAPI, id: int, @@ -108,9 +108,9 @@ proc directMessagesWelcomeMessagesRulesShow*(twitter: TwitterAPI, id: int, ## `direct_messages/welcome_messages/rules/show.json` endpoint if additionalParams != nil: additionalParams["id"] = $ id - return get(twitter, "direct_messages/welcome_messages/rules/show.json", additionalParams) + return get(twitter, "1.1/direct_messages/welcome_messages/rules/show.json", additionalParams) else: - return get(twitter, "direct_messages/welcome_messages/rules/show.json", { + return get(twitter, "1.1/direct_messages/welcome_messages/rules/show.json", { "id": $id}.newStringTable) @@ -119,21 +119,21 @@ proc directMessagesWelcomeMessagesShow*(twitter: TwitterAPI, id: int, ## `direct_messages/welcome_messages/show.json` endpoint if additionalParams != nil: additionalParams["id"] = $ id - return get(twitter, "direct_messages/welcome_messages/show.json", additionalParams) + return get(twitter, "1.1/direct_messages/welcome_messages/show.json", additionalParams) else: - return get(twitter, "direct_messages/welcome_messages/show.json", { + return get(twitter, "1.1/direct_messages/welcome_messages/show.json", { "id": $id}.newStringTable) proc directMessagesWelcomeMessagesNew*(twitter: TwitterAPI, jsonBody: JsonNode): Response = ## `direct_messages/welcome_messages/new.json` endpoint - return post(twitter, "direct_messages/welcome_messages/new.json", jsonBody) + return post(twitter, "1.1/direct_messages/welcome_messages/new.json", jsonBody) proc directMessagesWelcomeMessagesRulesNew*(twitter: TwitterAPI, jsonBody: JsonNode): Response = ## `direct_messages/welcome_messages/rules/new.json` endpoint - return post(twitter, "direct_messages/welcome_messages/rules/new.json", jsonBody) + return post(twitter, "1.1/direct_messages/welcome_messages/rules/new.json", jsonBody) diff --git a/src/endpoints/followers.nim b/src/v1endpoints/followers.nim similarity index 70% rename from src/endpoints/followers.nim rename to src/v1endpoints/followers.nim index e7efafa..2e5e1eb 100644 --- a/src/endpoints/followers.nim +++ b/src/v1endpoints/followers.nim @@ -9,9 +9,9 @@ proc followersIds*(twitter: TwitterAPI, screenName: string, ## `followers/ids.json` endpoint for screen name if additionalParams != nil: additionalParams["screen_name"] = screenName - return get(twitter, "followers/ids.json", additionalParams) + return get(twitter, "1.1/followers/ids.json", additionalParams) else: - return get(twitter, "followers/ids.json", { + return get(twitter, "1.1/followers/ids.json", { "screen_name": screenName}.newStringTable) @@ -20,9 +20,9 @@ proc followersIds*(twitter: TwitterAPI, userId: int, ## `followers/id.json` endpoint for user id if additionalParams != nil: additionalParams["user_id"] = $userId - return get(twitter, "followers/ids.json", additionalParams) + return get(twitter, "1.1/followers/ids.json", additionalParams) else: - return get(twitter, "followers/ids.json", { + return get(twitter, "1.1/followers/ids.json", { "user_id": $userId}.newStringTable) @@ -31,9 +31,9 @@ proc followersList*(twitter: TwitterAPI, screenName: string, ## `followers/list.json` endpoint for screen name if additionalParams != nil: additionalParams["screen_name"] = screenName - return get(twitter, "followers/list.json", additionalParams) + return get(twitter, "1.1/followers/list.json", additionalParams) else: - return get(twitter, "followers/list.json", { + return get(twitter, "1.1/followers/list.json", { "screen_name": screenName}.newStringTable) @@ -42,9 +42,9 @@ proc followersList*(twitter: TwitterAPI, userId: int, ## `followers/list.json` endpoint for user id if additionalParams != nil: additionalParams["user_id"] = $userId - return get(twitter, "followers/list.json", additionalParams) + return get(twitter, "1.1/followers/list.json", additionalParams) else: - return get(twitter, "followers/list.json", { + return get(twitter, "1.1/followers/list.json", { "user_id": $userId}.newStringTable) @@ -53,9 +53,9 @@ proc friendsIds*(twitter: TwitterAPI, screenName: string, ## `friends/ids.json` endpoint for screen name if additionalParams != nil: additionalParams["screen_name"] = screenName - return get(twitter, "friends/ids.json", additionalParams) + return get(twitter, "1.1/friends/ids.json", additionalParams) else: - return get(twitter, "friends/ids.json", { + return get(twitter, "1.1/friends/ids.json", { "screen_name": screenName}.newStringTable) @@ -64,9 +64,9 @@ proc friendsIds*(twitter: TwitterAPI, userId: int, ## `friends/id.json` endpoint for user id if additionalParams != nil: additionalParams["user_id"] = $userId - return get(twitter, "friends/ids.json", additionalParams) + return get(twitter, "1.1/friends/ids.json", additionalParams) else: - return get(twitter, "friends/ids.json", {"user_id": $userId}.newStringTable) + return get(twitter, "1.1/friends/ids.json", {"user_id": $userId}.newStringTable) proc friendsList*(twitter: TwitterAPI, screenName: string, @@ -74,9 +74,9 @@ proc friendsList*(twitter: TwitterAPI, screenName: string, ## `friends/list.json` endpoint for screen name if additionalParams != nil: additionalParams["screen_name"] = screenName - return get(twitter, "friends/list.json", additionalParams) + return get(twitter, "1.1/friends/list.json", additionalParams) else: - return get(twitter, "friends/list.json", { + return get(twitter, "1.1/friends/list.json", { "screen_name": screenName}.newStringTable) @@ -85,34 +85,34 @@ proc friendsList*(twitter: TwitterAPI, userId: int, ## `friends/list.json` endpoint for user id if additionalParams != nil: additionalParams["user_id"] = $userId - return get(twitter, "friends/list.json", additionalParams) + return get(twitter, "1.1/friends/list.json", additionalParams) else: - return get(twitter, "friends/list.json", { + return get(twitter, "1.1/friends/list.json", { "user_id": $userId}.newStringTable) proc friendshipsIncoming*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `friendships/incoming.json` endpoint - return get(twitter, "friendships/incoming.json", additionalParams) + return get(twitter, "1.1/friendships/incoming.json", additionalParams) proc friendshipsLookup*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `friendships/lookup.json` endpoint - return get(twitter, "friendships/lookup.json", additionalParams) + return get(twitter, "1.1/friendships/lookup.json", additionalParams) proc friendshipsNoRetweetsIds*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `friendships/no_retweets/ids.json` - return get(twitter, "friendships/no_retweets/ids.json", additionalParams) + return get(twitter, "1.1/friendships/no_retweets/ids.json", additionalParams) proc friendshipsOutgoing*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `friendships/outgoing.json` endpoint - return get(twitter, "friendships/outgoing.json", additionalParams) + return get(twitter, "1.1/friendships/outgoing.json", additionalParams) proc friendshipsShow*(twitter: TwitterAPI, sourceId: int, targetId: int, @@ -121,9 +121,9 @@ proc friendshipsShow*(twitter: TwitterAPI, sourceId: int, targetId: int, if additionalParams != nil: additionalParams["source_id"] = $sourceId additionalParams["target_id"] = $targetId - return get(twitter, "friendships/show.json", additionalParams) + return get(twitter, "1.1/friendships/show.json", additionalParams) else: - return get(twitter, "friendships/show.json", {"source_id": $sourceId, + return get(twitter, "1.1/friendships/show.json", {"source_id": $sourceId, "target_id": $targetId}.newStringTable) @@ -134,9 +134,9 @@ proc friendshipsShow*(twitter: TwitterAPI, sourceScreenName: string, if additionalParams != nil: additionalParams["source_screen_name"] = sourceScreenName additionalParams["target_screen_name"] = targetScreenName - return get(twitter, "friendships/show.json", additionalParams) + return get(twitter, "1.1/friendships/show.json", additionalParams) else: - return get(twitter, "friendships/show.json", { + return get(twitter, "1.1/friendships/show.json", { "source_screen_name": sourceScreenName, "target_screen_name": targetScreenName}.newStringTable) @@ -146,9 +146,9 @@ proc friendshipsCreate*(twitter: TwitterAPI, screenName: string, ## `friendships/create.json` endpoint if additionalParams != nil: additionalParams["screen_name"] = screenName - return post(twitter, "friendships/create.json", additionalParams) + return post(twitter, "1.1/friendships/create.json", additionalParams) else: - return post(twitter, "friendships/create.json", { + return post(twitter, "1.1/friendships/create.json", { "screen_name": screenName}.newStringTable) @@ -157,9 +157,9 @@ proc friendshipsCreate*(twitter: TwitterAPI, userId: int, ## `friendships/create.json` endpoint if additionalParams != nil: additionalParams["user_id"] = $userId - return post(twitter, "friendships/create.json", additionalParams) + return post(twitter, "1.1/friendships/create.json", additionalParams) else: - return post(twitter, "friendships/create.json", { + return post(twitter, "1.1/friendships/create.json", { "user_id": $userId}.newStringTable) @@ -168,9 +168,9 @@ proc friendshipsDestroy*(twitter: TwitterAPI, screenName: string, ## `friendships/destroy.json` endpoint if additionalParams != nil: additionalParams["screen_name"] = screenName - return post(twitter, "friendships/destroy.json", additionalParams) + return post(twitter, "1.1/friendships/destroy.json", additionalParams) else: - return post(twitter, "friendships/destroy.json", { + return post(twitter, "1.1/friendships/destroy.json", { "screen_name": screenName}.newStringTable) @@ -179,9 +179,9 @@ proc friendshipsDestroy*(twitter: TwitterAPI, userId: int, ## `friendships/destroy.json` endpoint if additionalParams != nil: additionalParams["user_id"] = $userId - return post(twitter, "friendships/destroy.json", additionalParams) + return post(twitter, "1.1/friendships/destroy.json", additionalParams) else: - return post(twitter, "friendships/destroy.json", { + return post(twitter, "1.1/friendships/destroy.json", { "user_id": $userId}.newStringTable) @@ -190,9 +190,9 @@ proc friendshipsUpdate*(twitter: TwitterAPI, screenName: string, ## `friendships/update.json` endpoint if additionalParams != nil: additionalParams["screen_name"] = screenName - return post(twitter, "friendships/update.json", additionalParams) + return post(twitter, "1.1/friendships/update.json", additionalParams) else: - return post(twitter, "friendships/update.json", { + return post(twitter, "1.1/friendships/update.json", { "screen_name": screenName}.newStringTable) @@ -201,7 +201,7 @@ proc friendshipsUpdate*(twitter: TwitterAPI, userId: int, ## `friendships/update.json` endpoint if additionalParams != nil: additionalParams["user_id"] = $userId - return post(twitter, "friendships/update.json", additionalParams) + return post(twitter, "1.1/friendships/update.json", additionalParams) else: - return post(twitter, "friendships/update.json", { + return post(twitter, "1.1/friendships/update.json", { "user_id": $userId}.newStringTable) diff --git a/src/endpoints/lists.nim b/src/v1endpoints/lists.nim similarity index 68% rename from src/endpoints/lists.nim rename to src/v1endpoints/lists.nim index d7699ed..65f2cda 100644 --- a/src/endpoints/lists.nim +++ b/src/v1endpoints/lists.nim @@ -8,9 +8,9 @@ proc listsList*(twitter: TwitterAPI, screenName: string, ## `lists/list.json` endpoint for screen name if additionalParams != nil: additionalParams["screen_name"] = screenName - return get(twitter, "lists/list.json", additionalParams) + return get(twitter, "1.1/lists/list.json", additionalParams) else: - return get(twitter, "lists/list.json", { + return get(twitter, "1.1/lists/list.json", { "screen_name": screenName}.newStringTable) @@ -19,9 +19,9 @@ proc listsList*(twitter: TwitterAPI, userId: int, ## `lists/list.json` endpoint for user id if additionalParams != nil: additionalParams["user_id"] = $userId - return get(twitter, "lists/list.json", additionalParams) + return get(twitter, "1.1/lists/list.json", additionalParams) else: - return get(twitter, "lists/list.json", {"user_id": $userId}.newStringTable) + return get(twitter, "1.1/lists/list.json", {"user_id": $userId}.newStringTable) proc listsMembers*(twitter: TwitterAPI, slug: string, @@ -29,9 +29,9 @@ proc listsMembers*(twitter: TwitterAPI, slug: string, ## `lists/members.json` endpoint for slug if additionalParams != nil: additionalParams["slug"] = slug - return get(twitter, "lists/members.json", additionalParams) + return get(twitter, "1.1/lists/members.json", additionalParams) else: - return get(twitter, "lists/members.json", {"slug": slug}.newStringTable) + return get(twitter, "1.1/lists/members.json", {"slug": slug}.newStringTable) proc listsMembers*(twitter: TwitterAPI, listId: int, @@ -39,9 +39,9 @@ proc listsMembers*(twitter: TwitterAPI, listId: int, ## `lists/members.json` endpoint for list id if additionalParams != nil: additionalParams["list_id"] = $listId - return get(twitter, "lists/members.json", additionalParams) + return get(twitter, "1.1/lists/members.json", additionalParams) else: - return get(twitter, "lists/members.json", { + return get(twitter, "1.1/lists/members.json", { "list_id": $listId}.newStringTable) @@ -50,9 +50,9 @@ proc listsMembersShow*(twitter: TwitterAPI, slug: string, ## `lists/members/show.json` endpoint for slug if additionalParams != nil: additionalParams["slug"] = slug - return get(twitter, "lists/members/show.json", additionalParams) + return get(twitter, "1.1/lists/members/show.json", additionalParams) else: - return get(twitter, "lists/members/show.json", { + return get(twitter, "1.1/lists/members/show.json", { "slug": slug}.newStringTable) @@ -61,9 +61,9 @@ proc listsMembersShow*(twitter: TwitterAPI, listId: int, ## `lists/members/show.json` endpoint for list id if additionalParams != nil: additionalParams["list_id"] = $listId - return get(twitter, "lists/members/show.json", additionalParams) + return get(twitter, "1.1/lists/members/show.json", additionalParams) else: - return get(twitter, "lists/members/show.json", { + return get(twitter, "1.1/lists/members/show.json", { "list_id": $listId}.newStringTable) @@ -72,9 +72,9 @@ proc listsMemberships*(twitter: TwitterAPI, screenName: string, ## `lists/memberships.json` endpoint for screen name if additionalParams != nil: additionalParams["screen_name"] = screenName - return get(twitter, "lists/memberships.json", additionalParams) + return get(twitter, "1.1/lists/memberships.json", additionalParams) else: - return get(twitter, "lists/memberships.json", { + return get(twitter, "1.1/lists/memberships.json", { "screen_name": screenName}.newStringTable) @@ -83,9 +83,9 @@ proc listsMemberships*(twitter: TwitterAPI, userId: int, ## `lists/memberships.json` endpoint for user id if additionalParams != nil: additionalParams["user_id"] = $userId - return get(twitter, "lists/memberships.json", additionalParams) + return get(twitter, "1.1/lists/memberships.json", additionalParams) else: - return get(twitter, "lists/memberships.json", { + return get(twitter, "1.1/lists/memberships.json", { "user_id": $userId}.newStringTable) @@ -94,9 +94,9 @@ proc listsOwnerships*(twitter: TwitterAPI, screenName: string, ## `lists/ownerships.json` endpoint for screen name if additionalParams != nil: additionalParams["screen_name"] = screenName - return get(twitter, "lists/ownerships.json", additionalParams) + return get(twitter, "1.1/lists/ownerships.json", additionalParams) else: - return get(twitter, "lists/ownerships.json", { + return get(twitter, "1.1/lists/ownerships.json", { "screen_name": screenName}.newStringTable) @@ -105,9 +105,9 @@ proc listsOwnerships*(twitter: TwitterAPI, userId: int, ## `lists/ownerships.json` endpoint for user id if additionalParams != nil: additionalParams["user_id"] = $userId - return get(twitter, "lists/ownerships.json", additionalParams) + return get(twitter, "1.1/lists/ownerships.json", additionalParams) else: - return get(twitter, "lists/ownerships.json", { + return get(twitter, "1.1/lists/ownerships.json", { "user_id": $userId}.newStringTable) @@ -116,9 +116,9 @@ proc listsShow*(twitter: TwitterAPI, slug: string, ## `lists/show.json` endpoint for slug if additionalParams != nil: additionalParams["slug"] = slug - return get(twitter, "lists/show.json", additionalParams) + return get(twitter, "1.1/lists/show.json", additionalParams) else: - return get(twitter, "lists/show.json", {"slug": slug}.newStringTable) + return get(twitter, "1.1/lists/show.json", {"slug": slug}.newStringTable) proc listsShow*(twitter: TwitterAPI, listId: int, @@ -126,9 +126,9 @@ proc listsShow*(twitter: TwitterAPI, listId: int, ## `lists/show.json` endpoint for list id if additionalParams != nil: additionalParams["list_id"] = $listId - return get(twitter, "lists/show.json", additionalParams) + return get(twitter, "1.1/lists/show.json", additionalParams) else: - return get(twitter, "lists/show.json", {"list_id": $listId}.newStringTable) + return get(twitter, "1.1/lists/show.json", {"list_id": $listId}.newStringTable) proc listsStatuses*(twitter: TwitterAPI, slug: string, @@ -136,9 +136,9 @@ proc listsStatuses*(twitter: TwitterAPI, slug: string, ## `lists/statuses.json` endpoint for slug if additionalParams != nil: additionalParams["slug"] = slug - return get(twitter, "lists/statuses.json", additionalParams) + return get(twitter, "1.1/lists/statuses.json", additionalParams) else: - return get(twitter, "lists/statuses.json", {"slug": slug}.newStringTable) + return get(twitter, "1.1/lists/statuses.json", {"slug": slug}.newStringTable) proc listsStatuses*(twitter: TwitterAPI, listId: int, @@ -146,9 +146,9 @@ proc listsStatuses*(twitter: TwitterAPI, listId: int, ## `lists/statuses.json` endpoint for list id if additionalParams != nil: additionalParams["list_id"] = $listId - return get(twitter, "lists/statuses.json", additionalParams) + return get(twitter, "1.1/lists/statuses.json", additionalParams) else: - return get(twitter, "lists/statuses.json", { + return get(twitter, "1.1/lists/statuses.json", { "list_id": $listId}.newStringTable) @@ -157,9 +157,9 @@ proc listsSubscribers*(twitter: TwitterAPI, slug: string, ## `lists/subscribers.json` endpoint for slug if additionalParams != nil: additionalParams["slug"] = slug - return get(twitter, "lists/subscribers.json", additionalParams) + return get(twitter, "1.1/lists/subscribers.json", additionalParams) else: - return get(twitter, "lists/subscribers.json", {"slug": slug}.newStringTable) + return get(twitter, "1.1/lists/subscribers.json", {"slug": slug}.newStringTable) proc listsSubscribers*(twitter: TwitterAPI, listId: int, @@ -167,9 +167,9 @@ proc listsSubscribers*(twitter: TwitterAPI, listId: int, ## `lists/subscribers.json` endpoint for list id if additionalParams != nil: additionalParams["list_id"] = $listId - return get(twitter, "lists/subscribers.json", additionalParams) + return get(twitter, "1.1/lists/subscribers.json", additionalParams) else: - return get(twitter, "lists/subscribers.json", { + return get(twitter, "1.1/lists/subscribers.json", { "list_id": $listId}.newStringTable) @@ -177,7 +177,7 @@ proc listsSubscribersShow*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `lists/subscribers/show.json` endpoint # NB: this could be, I think 4, overloading procs but I have decided not to for simplicity - return get(twitter, "lists/subscribers/show.json", additionalParams) + return get(twitter, "1.1/lists/subscribers/show.json", additionalParams) proc listsSubscriptions*(twitter: TwitterAPI, screenName: string, @@ -185,9 +185,9 @@ proc listsSubscriptions*(twitter: TwitterAPI, screenName: string, ## `lists/subscriptions.json` endpoint for screen name if additionalParams != nil: additionalParams["screen_name"] = screenName - return get(twitter, "lists/subscriptions.json", additionalParams) + return get(twitter, "1.1/lists/subscriptions.json", additionalParams) else: - return get(twitter, "lists/subscriptions.json", { + return get(twitter, "1.1/lists/subscriptions.json", { "screen_name": screenName}.newStringTable) @@ -196,9 +196,9 @@ proc listsSubscriptions*(twitter: TwitterAPI, userId: int, ## `lists/subscriptions.json` endpoint for user id if additionalParams != nil: additionalParams["user_id"] = $userId - return get(twitter, "lists/subscriptions.json", additionalParams) + return get(twitter, "1.1/lists/subscriptions.json", additionalParams) else: - return get(twitter, "lists/subscriptions.json", { + return get(twitter, "1.1/lists/subscriptions.json", { "user_id": $userId}.newStringTable) @@ -207,9 +207,9 @@ proc listsCreate*(twitter: TwitterAPI, slug: string, ## `lists/create.json` endpoint for slug if additionalParams != nil: additionalParams["slug"] = slug - return post(twitter, "lists/create.json", additionalParams) + return post(twitter, "1.1/lists/create.json", additionalParams) else: - return post(twitter, "lists/create.json", {"slug": slug}.newStringTable) + return post(twitter, "1.1/lists/create.json", {"slug": slug}.newStringTable) proc listsCreate*(twitter: TwitterAPI, listId: int, @@ -217,9 +217,9 @@ proc listsCreate*(twitter: TwitterAPI, listId: int, ## `lists/create.json` endpoint for list id if additionalParams != nil: additionalParams["list_id"] = $listId - return post(twitter, "lists/create.json", additionalParams) + return post(twitter, "1.1/lists/create.json", additionalParams) else: - return post(twitter, "lists/create.json", { + return post(twitter, "1.1/lists/create.json", { "list_id": $listId}.newStringTable) @@ -228,9 +228,9 @@ proc listsDestroy*(twitter: TwitterAPI, slug: string, ## `lists/destroy.json` endpoint for slug if additionalParams != nil: additionalParams["slug"] = slug - return post(twitter, "lists/destroy.json", additionalParams) + return post(twitter, "1.1/lists/destroy.json", additionalParams) else: - return post(twitter, "lists/destroy.json", {"slug": slug}.newStringTable) + return post(twitter, "1.1/lists/destroy.json", {"slug": slug}.newStringTable) proc listsDestroy*(twitter: TwitterAPI, listId: int, @@ -238,9 +238,9 @@ proc listsDestroy*(twitter: TwitterAPI, listId: int, ## `lists/destroy.json` endpoint for list id if additionalParams != nil: additionalParams["list_id"] = $listId - return post(twitter, "lists/destroy.json", additionalParams) + return post(twitter, "1.1/lists/destroy.json", additionalParams) else: - return post(twitter, "lists/destroy.json", { + return post(twitter, "1.1/lists/destroy.json", { "list_id": $listId}.newStringTable) @@ -248,7 +248,7 @@ proc listsMembersCreate*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `lists/members/create.json` endpoint # NB: this could be, I think 4, overloading procs but I have decided not to for simplicity - return post(twitter, "lists/members/create.json", additionalParams) + return post(twitter, "1.1/lists/members/create.json", additionalParams) proc listsMembersCreateAll*(twitter: TwitterAPI, listId: int, @@ -256,9 +256,9 @@ proc listsMembersCreateAll*(twitter: TwitterAPI, listId: int, ## `lists/members/create_all.json` endpoint for list id if additionalParams != nil: additionalParams["list_id"] = $listId - return post(twitter, "lists/members/create_all.json", additionalParams) + return post(twitter, "1.1/lists/members/create_all.json", additionalParams) else: - return post(twitter, "lists/members/create_all.json", { + return post(twitter, "1.1/lists/members/create_all.json", { "list_id": $listId}.newStringTable) @@ -267,9 +267,9 @@ proc listsMembersCreateAll*(twitter: TwitterAPI, slug: string, ## `lists/members/create_all.json` endpoint for slug if additionalParams != nil: additionalParams["slug"] = slug - return post(twitter, "lists/members/create_all.json", additionalParams) + return post(twitter, "1.1/lists/members/create_all.json", additionalParams) else: - return post(twitter, "lists/members/create_all.json", { + return post(twitter, "1.1/lists/members/create_all.json", { "slug": slug}.newStringTable) @@ -277,7 +277,7 @@ proc listsMembersDestroy*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `lists/members/destroy.json` endpoint # NB: this could be, I think 4, overloading procs but I have decided not to for simplicity - return post(twitter, "lists/members/destroy.json", additionalParams) + return post(twitter, "1.1/lists/members/destroy.json", additionalParams) proc listsMembersDestroyAll*(twitter: TwitterAPI, listId: int, @@ -285,9 +285,9 @@ proc listsMembersDestroyAll*(twitter: TwitterAPI, listId: int, ## `lists/members/destroy_all.json` endpoint for list id if additionalParams != nil: additionalParams["list_id"] = $listId - return post(twitter, "lists/members/destroy_all.json", additionalParams) + return post(twitter, "1.1/lists/members/destroy_all.json", additionalParams) else: - return post(twitter, "lists/members/destroy_all.json", { + return post(twitter, "1.1/lists/members/destroy_all.json", { "list_id": $listId}.newStringTable) @@ -296,9 +296,9 @@ proc listsMembersDestroyAll*(twitter: TwitterAPI, slug: string, ## `lists/members/destroy_all.json` endpoint for slug if additionalParams != nil: additionalParams["slug"] = slug - return post(twitter, "lists/members/destroy_all.json", additionalParams) + return post(twitter, "1.1/lists/members/destroy_all.json", additionalParams) else: - return post(twitter, "lists/members/destroy_all.json", { + return post(twitter, "1.1/lists/members/destroy_all.json", { "slug": slug}.newStringTable) @@ -307,9 +307,9 @@ proc listsSubscribersCreate*(twitter: TwitterAPI, slug: string, ## `lists/subscribers/create.json` endpoint for slug if additionalParams != nil: additionalParams["slug"] = slug - return post(twitter, "lists/subscribers/create.json", additionalParams) + return post(twitter, "1.1/lists/subscribers/create.json", additionalParams) else: - return post(twitter, "lists/subscribers/create.json", { + return post(twitter, "1.1/lists/subscribers/create.json", { "slug": slug}.newStringTable) @@ -318,9 +318,9 @@ proc listsSubscribersCreate*(twitter: TwitterAPI, listId: int, ## `lists/subscribers/create.json` endpoint for list id if additionalParams != nil: additionalParams["list_id"] = $listId - return post(twitter, "lists/subscribers/create.json", additionalParams) + return post(twitter, "1.1/lists/subscribers/create.json", additionalParams) else: - return post(twitter, "lists/subscribers/create.json", { + return post(twitter, "1.1/lists/subscribers/create.json", { "list_id": $listId}.newStringTable) @@ -329,9 +329,9 @@ proc listsSubscribersDestroy*(twitter: TwitterAPI, slug: string, ## `lists/subscribers/destroy.json` endpoint for slug if additionalParams != nil: additionalParams["slug"] = slug - return post(twitter, "lists/subscribers/destroy.json", additionalParams) + return post(twitter, "1.1/lists/subscribers/destroy.json", additionalParams) else: - return post(twitter, "lists/subscribers/destroy.json", { + return post(twitter, "1.1/lists/subscribers/destroy.json", { "slug": slug}.newStringTable) @@ -340,9 +340,9 @@ proc listsSubscribersDestroy*(twitter: TwitterAPI, listId: int, ## `lists/subscribers/destroy.json` endpoint for list id if additionalParams != nil: additionalParams["list_id"] = $listId - return post(twitter, "lists/subscribers/destroy.json", additionalParams) + return post(twitter, "1.1/lists/subscribers/destroy.json", additionalParams) else: - return post(twitter, "lists/subscribers/destroy.json", { + return post(twitter, "1.1/lists/subscribers/destroy.json", { "list_id": $listId}.newStringTable) @@ -351,9 +351,9 @@ proc listsUpdate*(twitter: TwitterAPI, slug: string, ## `lists/update.json` endpoint for slug if additionalParams != nil: additionalParams["slug"] = slug - return post(twitter, "lists/update.json", additionalParams) + return post(twitter, "1.1/lists/update.json", additionalParams) else: - return post(twitter, "lists/update.json", {"slug": slug}.newStringTable) + return post(twitter, "1.1/lists/update.json", {"slug": slug}.newStringTable) proc listsUpdate*(twitter: TwitterAPI, listId: int, @@ -361,7 +361,7 @@ proc listsUpdate*(twitter: TwitterAPI, listId: int, ## `lists/update.json` endpoint for list id if additionalParams != nil: additionalParams["list_id"] = $listId - return post(twitter, "lists/update.json", additionalParams) + return post(twitter, "1.1/lists/update.json", additionalParams) else: - return post(twitter, "lists/update.json", { + return post(twitter, "1.1/lists/update.json", { "list_id": $listId}.newStringTable) diff --git a/src/endpoints/media.nim b/src/v1endpoints/media.nim similarity index 81% rename from src/endpoints/media.nim rename to src/v1endpoints/media.nim index 46de296..5f73de6 100644 --- a/src/endpoints/media.nim +++ b/src/v1endpoints/media.nim @@ -19,9 +19,9 @@ proc mediaUploadInit*(twitter: TwitterAPI, additionalParams["command"] = "INIT" additionalParams["media_type"] = mediaType additionalParams["total_bytes"] = totalBytes - return post(twitter, "media/upload.json", additionalParams, true) + return post(twitter, "1.1/media/upload.json", additionalParams, true) else: - return post(twitter, "media/upload.json", {"command": "INIT", + return post(twitter, "1.1/media/upload.json", {"command": "INIT", "media_type": mediaType, "total_bytes": totalBytes}.newStringTable, true) @@ -36,9 +36,9 @@ proc mediaUploadAppend*(twitter: TwitterAPI, mediaId: string, segmentId: string, additionalParams["command"] = "APPEND" additionalParams["media_id"] = mediaId additionalParams["segment_index"] = segmentId - return post(twitter, "media/upload.json", additionalParams, true, data) + return post(twitter, "1.1/media/upload.json", additionalParams, true, data) else: - return post(twitter, "media/upload.json", {"command": "APPEND", + return post(twitter, "1.1/media/upload.json", {"command": "APPEND", "media_id": mediaId, "segment_index": segmentId}.newStringTable, true, data) @@ -54,9 +54,9 @@ proc mediaUploadStatus*(twitter: TwitterAPI, mediaId: string, if additionalParams != nil: additionalParams["command"] = "STATUS" additionalParams["media_id"] = mediaId - return get(twitter, "media/upload.json", additionalParams, true) + return get(twitter, "1.1/media/upload.json", additionalParams, true) else: - return get(twitter, "media/upload.json", {"command": "STATUS", + return get(twitter, "1.1/media/upload.json", {"command": "STATUS", "media_id": mediaId}.newStringTable, true) @@ -72,9 +72,9 @@ proc mediaUploadFinalize*(twitter: TwitterAPI, mediaId: string, if additionalParams != nil: additionalParams["command"] = "FINALIZE" additionalParams["media_id"] = mediaId - return post(twitter, "media/upload.json", additionalParams, true) + return post(twitter, "1.1/media/upload.json", additionalParams, true) else: - return post(twitter, "media/upload.json", {"command": "FINALIZE", + return post(twitter, "1.1/media/upload.json", {"command": "FINALIZE", "media_id": mediaId}.newStringTable, true) @@ -82,18 +82,18 @@ proc mediaMetadataCreate*(twitter: TwitterAPI, jsonBody: JsonNode): Response = ## `media/metadata/create.json` endpoint ## ## Docs: https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-metadata-create - return post(twitter, "media/metadata/create.json", jsonBody, media = true) + return post(twitter, "1.1/media/metadata/create.json", jsonBody, media = true) proc mediaSubtitlesCreate*(twitter: TwitterAPI, jsonBody: JsonNode): Response = ## `media/subtitles/create.json` endpoint ## ## Docs: https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-subtitles-create - return post(twitter, "media/subtitles/create.json", jsonBody, media = true) + return post(twitter, "1.1/media/subtitles/create.json", jsonBody, media = true) proc mediaSubtitlesDelete*(twitter: TwitterAPI, jsonBody: JsonNode): Response = ## `media/subtitles/delete.json` endpoint ## ## Docs: https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-subtitles-create - return post(twitter, "media/subtitles/delete.json", jsonBody, media = true) + return post(twitter, "1.1/media/subtitles/delete.json", jsonBody, media = true) diff --git a/src/v1endpoints/misc.nim b/src/v1endpoints/misc.nim new file mode 100644 index 0000000..3dd7a70 --- /dev/null +++ b/src/v1endpoints/misc.nim @@ -0,0 +1,392 @@ +# ------------------- +# developer utilities +# ------------------- + + +proc applicationRateLimitData*(twitter: TwitterAPI, + additionalParams: StringTableRef = nil): Response = + ## `application/rate_limit_status.json` endpoint + return get(twitter, "1.1/application/rate_limit_status.json", additionalParams) + + +proc helpConfiguration*(twitter: TwitterAPI, + additionalParams: StringTableRef = nil): Response = + ## `help/configuration.json` endpoint + return get(twitter, "1.1/help/configuration.json", additionalParams) + + +proc helpLanguages*(twitter: TwitterAPI, + additionalParams: StringTableRef = nil): Response = + ## `help/languages.json` endpoint + return get(twitter, "1.1/help/languages.json", additionalParams) + + +# ------- +# account +# ------- + + +proc accountSettings*(twitter: TwitterAPI, + additionalParams: StringTableRef = nil): Response = + ## `account/settings.json` endpoint + return get(twitter, "1.1/account/settings.json", additionalParams) + + +proc accountVerifyCredentials*(twitter: TwitterAPI, + additionalParams: StringTableRef = nil): Response = + ## `account/verify_credentials.json` endpoint + return get(twitter, "1.1/account/verify_credentials.json", additionalParams) + + +proc accountRemoveProfileBanner*(twitter: TwitterAPI, + additionalParams: StringTableRef = nil): Response = + ## `account/remove_profile_banner.json` endpoint + return post(twitter, "1.1/account/remove_profile_banner.json", additionalParams) + + +proc accountUpdateSettings*(twitter: TwitterAPI, + additionalParams: StringTableRef): Response = + ## `account/update_settings.json` endpoint + return post(twitter, "1.1/account/update_settings.json", additionalParams) + + +proc accountUpdateProfile*(twitter: TwitterAPI, + additionalParams: StringTableRef): Response = + ## `account/update_profile.json` endpoint + return post(twitter, "1.1/account/update_profile.json", additionalParams) + + +proc accountUpdateProfileBanner*(twitter: TwitterAPI, banner: string, + additionalParams: StringTableRef = nil): Response = + ## `account/update_profile_banner.json` endpoint + if additionalParams != nil: + additionalParams["banner"] = banner + return post(twitter, "1.1/account/update_profile_banner.json", additionalParams) + else: + return post(twitter, "1.1/account/update_profile_banner.json", { + "banner": banner}.newStringTable) + + +proc accountUpdateProfileImage*(twitter: TwitterAPI, image: string, + additionalParams: StringTableRef = nil): Response = + ## `account/update_profile_image.json` endpoint + if additionalParams != nil: + additionalParams["image"] = image + return post(twitter, "1.1/account/update_profile_image.json", additionalParams) + else: + return post(twitter, "1.1/account/update_profile_image.json", { + "image": image}.newStringTable) + + +# -------------- +# saved_searches +# -------------- + + +proc savedSeachesList*(twitter: TwitterAPI, + additionalParams: StringTableRef = nil): Response = + ## `saved_searches/list.json` endpoint + return get(twitter, "1.1/saved_searches/list.json", additionalParams) + + +proc savedSearchesShow*(twitter: TwitterAPI, id: int, + additionalParams: StringTableRef = nil): Response = + ## `saved_searches/show/:id.json` endpoint + return get(twitter, "1.1/saved_searches/show/" & $id & ".json", additionalParams) + + +proc savedSearchesCreate*(twitter: TwitterAPI, query: string, + additionalParams: StringTableRef = nil): Response = + ## `saved_searches/create.json` endpoint + if additionalParams != nil: + additionalParams["query"] = query + return post(twitter, "1.1/saved_searches/create.json", additionalParams) + else: + return post(twitter, "1.1/saved_searches/create.json", { + "query": query}.newStringTable) + + +proc savedSeachesDestroy*(twitter: TwitterAPI, id: int, + additionalParams: StringTableRef = nil): Response = + ## `saved_searches/destroy/:id.json` endpoint + return post(twitter, "1.1/saved_searches/destroy/" & $id & ".json", additionalParams) + + +# -------------- +# blocks / mutes +# -------------- + + +proc blocksIds*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = + ## `blocks/ids.json` endpoint + return get(twitter, "1.1/blocks/ids.json", additionalParams) + + +proc blocksList*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = + ## `blocks/list.json` endpoint + return get(twitter, "1.1/blocks/list.json", additionalParams) + + +proc mutesUsersIds*(twitter: TwitterAPI, + additionalParams: StringTableRef = nil): Response = + ## `mutes/users/ids.json` endpoint + return get(twitter, "1.1/mutes/users/ids.json", additionalParams) + + +proc mutesUsersList*(twitter: TwitterAPI, + additionalParams: StringTableRef = nil): Response = + ## `mutes/users/list.json` endpoint + return get(twitter, "1.1/mutes/users/list.json", additionalParams) + + +proc blocksCreate*(twitter: TwitterAPI, screenName: string, + additionalParams: StringTableRef = nil): Response = + # `blocks/create.json` endpoint for screen name + if additionalParams != nil: + additionalParams["user_id"] = $screenName + return post(twitter, "1.1/blocks/create.json", additionalParams) + else: + return post(twitter, "1.1/blocks/create.json", { + "screen_name": $screenName}.newStringTable) + + +proc blocksCreate*(twitter: TwitterAPI, userId: int, + additionalParams: StringTableRef = nil): Response = + # `blocks/create.json` endpoint for user id + if additionalParams != nil: + additionalParams["user_id"] = $userId + return post(twitter, "1.1/blocks/create.json", additionalParams) + else: + return post(twitter, "1.1/blocks/create.json", { + "user_id": $userId}.newStringTable) + + +proc blocksDestroy*(twitter: TwitterAPI, screenName: string, + additionalParams: StringTableRef = nil): Response = + # `blocks/destroy.json` endpoint for screen name + if additionalParams != nil: + additionalParams["user_id"] = $screenName + return post(twitter, "1.1/blocks/destroy.json", additionalParams) + else: + return post(twitter, "1.1/blocks/destroy.json", { + "screen_name": $screenName}.newStringTable) + + +proc blocksDestroy*(twitter: TwitterAPI, userId: int, + additionalParams: StringTableRef = nil): Response = + # `blocks/destroy.json` endpoint for user id + if additionalParams != nil: + additionalParams["user_id"] = $userId + return post(twitter, "1.1/blocks/destroy.json", additionalParams) + else: + return post(twitter, "1.1/blocks/destroy.json", { + "user_id": $userId}.newStringTable) + + +proc mutesUsersCreate*(twitter: TwitterAPI, screenName: string, + additionalParams: StringTableRef = nil): Response = + # `mutes/users/create.json` endpoint for screen name + if additionalParams != nil: + additionalParams["user_id"] = $screenName + return post(twitter, "1.1/mutes/users/create.json", additionalParams) + else: + return post(twitter, "1.1/mutes/users/create.json", { + "screen_name": $screenName}.newStringTable) + + +proc mutesUsersCreate*(twitter: TwitterAPI, userId: int, + additionalParams: StringTableRef = nil): Response = + # `mutes/users/create.json` endpoint for user id + if additionalParams != nil: + additionalParams["user_id"] = $userId + return post(twitter, "1.1/mutes/users/create.json", additionalParams) + else: + return post(twitter, "1.1/mutes/users/create.json", { + "user_id": $userId}.newStringTable) + + +proc mutesUsersDestroy*(twitter: TwitterAPI, screenName: string, + additionalParams: StringTableRef = nil): Response = + # `mutes/users/destroy.json` endpoint for screen name + if additionalParams != nil: + additionalParams["user_id"] = $screenName + return post(twitter, "1.1/mutes/users/destroy.json", additionalParams) + else: + return post(twitter, "1.1/mutes/users/destroy.json", { + "screen_name": $screenName}.newStringTable) + + +proc mutesUsersDestroy*(twitter: TwitterAPI, userId: int, + additionalParams: StringTableRef = nil): Response = + # `mutes/users/destroy.json` endpoint for user id + if additionalParams != nil: + additionalParams["user_id"] = $userId + return post(twitter, "1.1/mutes/users/destroy.json", additionalParams) + else: + return post(twitter, "1.1/mutes/users/destroy.json", { + "user_id": $userId}.newStringTable) + + +# --------- +# favorites +# --------- + + +proc favoritesList*(twitter: TwitterAPI, + additionalParams: StringTableRef = nil): Response = + ## `favorites/list.json` endpoint + return get(twitter, "1.1/favorites/list.json", additionalParams) + + +proc favoritesCreate*(twitter: TwitterAPI, id: int, + additionalParams: StringTableRef = nil): Response = + ## `favorites/create.json` endpoint + if additionalParams != nil: + additionalParams["id"] = $id + return post(twitter, "1.1/favorites/create.json", additionalParams) + else: + return post(twitter, "1.1/favorites/create.json", {"id": $id}.newStringTable) + + +proc favoritesDestroy*(twitter: TwitterAPI, id: int, + additionalParams: StringTableRef = nil): Response = + ## `favorites/destroy.json` endpoint + if additionalParams != nil: + additionalParams["id"] = $id + return post(twitter, "1.1/favorites/destroy.json", additionalParams) + else: + return post(twitter, "1.1/favorites/destroy.json", {"id": $id}.newStringTable) + + +# ------ +# search +# ------ + + +proc searchTweets*(twitter: TwitterAPI, q: string, + additionalParams: StringTableRef = nil): Response = + ## `search/tweets.json` endpoint + ## + ## Standard tier search endpoint + if additionalParams != nil: + additionalParams["q"] = q + return get(twitter, "1.1/search/tweets.json", additionalParams) + else: + return get(twitter, "1.1/search/tweets.json", {"q": q}.newStringTable) + + +# --------------- +# custom_profiles +# --------------- + + +proc customProfilesDestroy*(twitter: TwitterAPI, id: int, + additionalParams: StringTableRef = nil): Response = + ## `custom_profiles/destroy.json` endpoint + if additionalParams != nil: + additionalParams["id"] = $id + return delete(twitter, "1.1/custom_profiles/destroy.json", additionalParams) + else: + return delete(twitter, "1.1/custom_profiles/destroy.json", { + "id": $id}.newStringTable) + + +proc customProfilesId*(twitter: TwitterAPI, id: int, + additionalParams: StringTableRef = nil): Response = + ## `custom_profiles/:id.json` endpoint + return get(twitter, "1.1/custom_profiles/" & $id & ".json", additionalParams) + + +proc customProfilesLists*(twitter: TwitterAPI, + additionalParams: StringTableRef = nil): Response = + ## `custom_profiles/list.json` endpoint + return get(twitter, "1.1/custom_profiles/list.json", additionalParams) + + +proc customProfilesNew*(twitter: TwitterAPI, jsonBody: JsonNode): Response = + ## `custom_profiles/new.json` endpoint + return post(twitter, "1.1/custom_profiles/new.json", jsonBody) + + +# ------ +# trends +# ------ + + +proc trendsAvailable*(twitter: TwitterAPI, + additionalParams: StringTableRef = nil): Response = + ## `trends/available.json` endpoint + return get(twitter, "1.1/trends/available.json", additionalParams) + + +proc trendsClosest*(twitter: TwitterAPI, lat: float, lon: float, + additionalParams: StringTableRef = nil): Response = + ## `trends/closest.json` endpoint + if additionalParams != nil: + additionalParams["lat"] = $ lat + additionalParams["lon"] = $ lon + return get(twitter, "1.1/trends/closest.json", additionalParams) + else: + return get(twitter, "1.1/trends/closest.json", {"lat": $lat, + "lon": $lon}.newStringTable) + + +proc trendsPlace*(twitter: TwitterAPI, id: int32, + additionalParams: StringTableRef = nil): Response = + ## `trends/place.json` endpoint + # id is explicitly int32 since it is Yahoo WOED which uses 32 bit ints + if additionalParams != nil: + additionalParams["id"] = $ id + return get(twitter, "1.1/trends/place.json", additionalParams) + else: + return get(twitter, "1.1/trends/place.json", {"id": $id}.newStringTable) + + +# --- +# geo +# --- + + +proc geoId*(twitter: TwitterAPI, id: string, + additionalParams: StringTableRef = nil): Response = + ## `geo/id/:place_id.json` endpoint + return get(twitter, "1.1/geo/id/" & id & ".json", additionalParams) + + +proc geoReverseGeocode*(twitter: TwitterAPI, lat: float, lon: float, + additionalParams: StringTableRef = nil): Response = + ## `geo/reverse_geocode.json` endpoint + if additionalParams != nil: + additionalParams["lat"] = $ lat + additionalParams["lon"] = $ lon + return get(twitter, "1.1/geo/reverse_geocode.json", additionalParams) + else: + return get(twitter, "1.1/geo/reverse_geocode.json", {"lat": $lat, + "lon": $lon}.newStringTable) + + +proc geoSearch*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = + ## `geo/search.json` endpoint + return get(twitter, "1.1/geo/search.json", additionalParams) + + +# -------- +# insights +# -------- + + +proc insightsEngagementTotals*(twitter: TwitterAPI, + jsonBody: JsonNode): Response = + ## `insights/enagement/totals.json` endpoint + return post(twitter, "1.1/insights/enagement/totals.json", jsonBody) + + +proc insightsEngagementHistorical*(twitter: TwitterAPI, + jsonBody: JsonNode): Response = + ## `insights/enagement/historical.json` endpoint + return post(twitter, "1.1/insights/enagement/historical.json", jsonBody) + + +proc insightsEngagement28h*(twitter: TwitterAPI, jsonBody: JsonNode): Response = + ## `insights/enagement/28h.json` endpoint + return post(twitter, "1.1/insights/enagement/28h.json", jsonBody) \ No newline at end of file diff --git a/src/endpoints/statuses.nim b/src/v1endpoints/statuses.nim similarity index 68% rename from src/endpoints/statuses.nim rename to src/v1endpoints/statuses.nim index 770f2a5..4b24dec 100644 --- a/src/endpoints/statuses.nim +++ b/src/v1endpoints/statuses.nim @@ -8,25 +8,25 @@ import ../utility/[requests, types] proc statusesFilter*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `statuses/filter.json` endpoint - return post(twitter, "statuses/filter.json", additionalParams) + return post(twitter, "1.1/statuses/filter.json", additionalParams) proc statusesUserTimeline*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `statuses/user_timeline.json` endpoint - return get(twitter, "statuses/user_timeline.json", additionalParams) + return get(twitter, "1.1/statuses/user_timeline.json", additionalParams) proc statusesHomeTimeline*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `statuses/home_timeline.json` endpoint - return get(twitter, "statuses/home_timeline.json", additionalParams) + return get(twitter, "1.1/statuses/home_timeline.json", additionalParams) proc statusesMentionsTimeline*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `statuses/mentions_timeline.json` endpoint - return get(twitter, "statuses/mentions_timeline.json", additionalParams) + return get(twitter, "1.1/statuses/mentions_timeline.json", additionalParams) proc statusesLookup*(twitter: TwitterAPI, ids: string, @@ -36,9 +36,9 @@ proc statusesLookup*(twitter: TwitterAPI, ids: string, ## ids is a string of comma seperated tweet ids if additionalParams != nil: additionalParams["id"] = ids - return get(twitter, "statuses/lookup.json", additionalParams) + return get(twitter, "1.1/statuses/lookup.json", additionalParams) else: - return get(twitter, "statuses/lookup.json", {"id": ids}.newStringTable) + return get(twitter, "1.1/statuses/lookup.json", {"id": ids}.newStringTable) proc statusesOembed*(twitter: TwitterAPI, url: string, @@ -48,10 +48,10 @@ proc statusesOembed*(twitter: TwitterAPI, url: string, ## Used for generating embeds from tweets, uses publish.twitter.com as a url if additionalParams != nil: additionalParams["url"] = url - return get(twitter, "statuses/retweeters/ids.json", additionalParams, + return get(twitter, "1.1/statuses/retweeters/ids.json", additionalParams, publish = true) else: - return get(twitter, "statuses/retweeters/ids.json", { + return get(twitter, "1.1/statuses/retweeters/ids.json", { "url": url}.newStringTable, publish = true) @@ -60,22 +60,22 @@ proc statusesRetweetersIds*(twitter: TwitterAPI, id: int, ## `statuses/retweeters/ids.json` endpoint if additionalParams != nil: additionalParams["id"] = $id - return get(twitter, "statuses/retweeters/ids.json", additionalParams) + return get(twitter, "1.1/statuses/retweeters/ids.json", additionalParams) else: - return get(twitter, "statuses/retweeters/ids.json", { + return get(twitter, "1.1/statuses/retweeters/ids.json", { "id": $id}.newStringTable) proc statusesRetweets*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = ## `statuses/retweets/:id.json` endpoint - return get(twitter, "statuses/retweets/" & $id & ".json", additionalParams) + return get(twitter, "1.1/statuses/retweets/" & $id & ".json", additionalParams) proc statusesRetweetsOfMe*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `statuses/retweets_of_me.json` endpoint - return get(twitter, "statuses/retweets_of_me.json", additionalParams) + return get(twitter, "1.1/statuses/retweets_of_me.json", additionalParams) proc statusesShow*(twitter: TwitterAPI, id: int, @@ -83,27 +83,27 @@ proc statusesShow*(twitter: TwitterAPI, id: int, ## `statuses/show.json` endpoint if additionalParams != nil: additionalParams["id"] = $id - return get(twitter, "statuses/show.json", additionalParams) + return get(twitter, "1.1/statuses/show.json", additionalParams) else: - return get(twitter, "statuses/show.json", {"id": $id}.newStringTable) + return get(twitter, "1.1/statuses/show.json", {"id": $id}.newStringTable) proc statusesDestroy*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = ## `statuses/destroy/:id.json` endpoint - return post(twitter, "statuses/destroy/" & $id & ".json", additionalParams) + return post(twitter, "1.1/statuses/destroy/" & $id & ".json", additionalParams) proc statusesRetweet*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = ## `statuses/retweet/:id` endpoint - return post(twitter, "statuses/retweet/" & $id & ".json", additionalParams) + return post(twitter, "1.1/statuses/retweet/" & $id & ".json", additionalParams) proc statusesUnretweet*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = ## `statuses/unretweet/:id.json` endpoint - return post(twitter, "statuses/unretweet/" & $id & ".json", additionalParams) + return post(twitter, "1.1/statuses/unretweet/" & $id & ".json", additionalParams) proc statusesUpdate*(twitter: TwitterAPI, status: string, @@ -111,21 +111,21 @@ proc statusesUpdate*(twitter: TwitterAPI, status: string, ## `statuses/update.json` endpoint if additionalParams != nil: additionalParams["status"] = status - return post(twitter, "statuses/update.json", additionalParams) + return post(twitter, "1.1/statuses/update.json", additionalParams) else: - return post(twitter, "statuses/update.json", { + return post(twitter, "1.1/statuses/update.json", { "status": status}.newStringTable) proc statusesUpdate*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `statuses/update.json` endpoint - return post(twitter, "statuses/update.json", additionalParams) + return post(twitter, "1.1/statuses/update.json", additionalParams) proc statusesSample*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = ## `statuses/sample.json` endpoint - return get(twitter, "statuses/sample.json", additionalParams) + return get(twitter, "1.1/statuses/sample.json", additionalParams) diff --git a/src/endpoints/users.nim b/src/v1endpoints/users.nim similarity index 69% rename from src/endpoints/users.nim rename to src/v1endpoints/users.nim index 213e474..25a5108 100644 --- a/src/endpoints/users.nim +++ b/src/v1endpoints/users.nim @@ -10,9 +10,9 @@ proc usersLookup*(twitter: TwitterAPI, userId: int, ## `users/lookup.json` endpoint for user id if additionalParams != nil: additionalParams["user_id"] = $userId - return post(twitter, "users/lookup.json", additionalParams) + return post(twitter, "1.1/users/lookup.json", additionalParams) else: - return post(twitter, "users/lookup.json", { + return post(twitter, "1.1/users/lookup.json", { "user_id": $userId}.newStringTable) @@ -21,9 +21,9 @@ proc usersLookup*(twitter: TwitterAPI, screenName: string, ## `users/lookup.json` endpoint for screen name if additionalParams != nil: additionalParams["screen_name"] = screenName - return post(twitter, "users/lookup.json", additionalParams) + return post(twitter, "1.1/users/lookup.json", additionalParams) else: - return post(twitter, "users/lookup.json", { + return post(twitter, "1.1/users/lookup.json", { "screen_name": screenName}.newStringTable) @@ -32,9 +32,9 @@ proc usersSearch*(twitter: TwitterAPI, q: string, ## `users/search.json` endpoint if additionalParams != nil: additionalParams["q"] = q - return get(twitter, "users/search.json", additionalParams) + return get(twitter, "1.1/users/search.json", additionalParams) else: - return get(twitter, "users/search.json", {"q": q}.newStringTable) + return get(twitter, "1.1/users/search.json", {"q": q}.newStringTable) proc usersProfileBanner*(twitter: TwitterAPI, screenName: string, @@ -42,9 +42,9 @@ proc usersProfileBanner*(twitter: TwitterAPI, screenName: string, ## `users/profile_banner.json` endpoint if additionalParams != nil: additionalParams["screen_name"] = screenName - return get(twitter, "users/profile_banner.json", additionalParams) + return get(twitter, "1.1/users/profile_banner.json", additionalParams) else: - return get(twitter, "users/profile_banner.json", { + return get(twitter, "1.1/users/profile_banner.json", { "screen_name": screenName}.newStringTable) @@ -53,9 +53,9 @@ proc usersProfileBanner*(twitter: TwitterAPI, userId: int, ## `users/profile_banner.json` endpoint if additionalParams != nil: additionalParams["user_id"] = $userId - return get(twitter, "users/profile_banner.json", additionalParams) + return get(twitter, "1.1/users/profile_banner.json", additionalParams) else: - return get(twitter, "users/profile_banner.json", { + return get(twitter, "1.1/users/profile_banner.json", { "user_id": $userId}.newStringTable) @@ -64,9 +64,9 @@ proc usersShow*(twitter: TwitterAPI, screenName: string, ## `users/show.json` endpoint for screen names (@username) if additionalParams != nil: additionalParams["screen_name"] = screenName - return get(twitter, "users/show.json", additionalParams) + return get(twitter, "1.1/users/show.json", additionalParams) else: - return get(twitter, "users/show.json", { + return get(twitter, "1.1/users/show.json", { "screen_name": screenName}.newStringTable) @@ -75,9 +75,9 @@ proc usersShow*(twitter: TwitterAPI, userId: int, ## `users/show.json` endpoint for user id (e.g. `783214 => @twitter`) if additionalParams != nil: additionalParams["user_id"] = $userId - return get(twitter, "users/show.json", additionalParams) + return get(twitter, "1.1/users/show.json", additionalParams) else: - return get(twitter, "users/show.json", {"user_id": $userId}.newStringTable) + return get(twitter, "1.1/users/show.json", {"user_id": $userId}.newStringTable) proc usersReportSpam*(twitter: TwitterAPI, screenName: string, @@ -85,9 +85,9 @@ proc usersReportSpam*(twitter: TwitterAPI, screenName: string, ## `users/report_spam.json` endpoint for screen name if additionalParams != nil: additionalParams["user_id"] = $screenName - return get(twitter, "users/report_spam.json", additionalParams) + return get(twitter, "1.1/users/report_spam.json", additionalParams) else: - return get(twitter, "users/report_spam.json", { + return get(twitter, "1.1/users/report_spam.json", { "screen_name": $screenName}.newStringTable) @@ -96,7 +96,7 @@ proc usersReportSpam*(twitter: TwitterAPI, userId: int, ## `users/report_spam.json` endpoint for user id if additionalParams != nil: additionalParams["user_id"] = $userId - return get(twitter, "users/report_spam.json", additionalParams) + return get(twitter, "1.1/users/report_spam.json", additionalParams) else: - return get(twitter, "users/report_spam.json", { + return get(twitter, "1.1/users/report_spam.json", { "user_id": $userId}.newStringTable) diff --git a/src/v2.nim b/src/v2.nim new file mode 100644 index 0000000..0ef4b35 --- /dev/null +++ b/src/v2.nim @@ -0,0 +1 @@ +include v2endpoints/[compliance, lists, spaces, tweets, users] \ No newline at end of file diff --git a/src/v2endpoints/compliance.nim b/src/v2endpoints/compliance.nim new file mode 100644 index 0000000..c6fc37d --- /dev/null +++ b/src/v2endpoints/compliance.nim @@ -0,0 +1,19 @@ +import strtabs, httpclient, json +import ../utility/[requests, types] + +proc complianceJobs*(twitter: TwitterAPI, `type`: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/compliance/jobs` endpoint + if additionalParams != nil: + additionalParams["type"] = `type` + return get(twitter, "2/compliance/jobs", additionalParams) + else: + return get(twitter, "2/compliance/jobs", {"type": `type`}.newStringTable) + +proc complianceJobs*(twitter: TwitterAPI, `type`: string, jsonBody: JsonNode) : Response = + ## `POST /2/compliance/jobs` endpoint + return post(twitter, "2/compliance/jobs", jsonBody) + +proc complianceJobsId*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/compliance/jobs/:id` endpoint + # inline ID type stuff needs to work better I think? + return get(twitter, "2/compliance/jobs/" & id, additionalParams) \ No newline at end of file diff --git a/src/v2endpoints/lists.nim b/src/v2endpoints/lists.nim new file mode 100644 index 0000000..d77f0ba --- /dev/null +++ b/src/v2endpoints/lists.nim @@ -0,0 +1,93 @@ +import strtabs, httpclient, json +import ../utility/[requests, types] + +# ------------------------ +# List Tweets lookup +# ------------------------ +proc listsIdTweets*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/lists/:id/tweets` endpoint + return get(twitter, "2/lists/" & id & "/tweets", additionalParams) + +# ------------------------ +# List follows +# ------------------------ +proc usersSourceFollowedListsTarget*(twitter: TwitterAPI, sourceUserId: string, targetUserId: string, additionalParams: StringTableRef = nil): Response = + ## `DELETE /2/users/:id/followed_lists/:list_id` endpoint + return delete(twitter, "2/users/" & sourceUserId & "/followed_lists/" & targetUserId, additionalParams) + +proc listsIdFollowers*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/lists/:id/followers` endpoint + return get(twitter, "2/lists/" & id & "/followers", additionalParams) + +proc usersIdFollowedLists*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/:id/followed_lists` endpoint + return get(twitter, "2/users/" & id & "/followedLists", additionalParams) + +proc usersIdMembers*(twitter: TwitterAPI, id: string, jsonBody: JsonNode): Response = + ## `POST /2/users/:id/followed_lists` endpoint + return post(twitter, "2/users/" & id & "/followed_lists", jsonBody) + +# ------------------------ +# List lookup +# ------------------------ +proc listsId*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/lists/:id` endpoint + return get(twitter, "2/lists/" & id, additionalParams) + +proc usersIdOwnedLists*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/:id/owned_lists` endpoint + return get(twitter, "2/users/" & id & "/owned_lists", additionalParams) + +# ------------------------ +# List members +# ------------------------ +proc listsIdMembersListsUserId*(twitter: TwitterAPI, id: string, userId: string, additionalParams: StringTableRef = nil): Response = + ## `DELETE /2/lists/:id/members/:user_id` endpoint + return delete(twitter, "2/lists/" & id & "/members/" & userId, additionalParams) + +proc listsIdFollowedLists*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/lists/:id/members` endpoint + return get(twitter, "2/lists/" & id & "/members", additionalParams) + +proc usersIdListMemberships*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/:id/list_memberships` endpoint + return get(twitter, "2/users/" & id & "/list_memberships", additionalParams) + +proc listsIdMembers*(twitter: TwitterAPI, id: string, jsonBody: JsonNode): Response = + ## `POST /2/lists/:id/members` endpoint + return post(twitter, "2/lists/" & id & "/members", jsonBody) + +# ------------------------ +# Manage Lists +# ------------------------ +proc listsIdDelete(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `DELETE /2/lists/:id` endpoint + ## Sorry about this breaking the naming convention, this overlaps with the GET method so I couldn't override it + ## The same to be said about the PUT endpoint too + return delete(twitter, "2/lists/" & id, additionalParams) + +proc listsIdPut(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `PUT /2/lists/:id` endpoint + ## Sorry about this breaking the naming convention + return put(twitter, "2/lists/" & id, additionalParams) + +proc lists*(twitter: TwitterAPI, jsonBody: JsonNode): Response = + ## `POST /2/lists` endpoint + + # This is a weirdly simple one lol + return post(twitter, "2/lists", jsonBody) + +# ------------------------ +# Pinned Lists +# ------------------------ +proc usersIdPinnedListsListId*(twitter: TwitterAPI, id: string, userId: string, additionalParams: StringTableRef = nil): Response = + # `DELETE /2/users/:id/pinned_lists/:list_id` endpoint + return delete(twitter, "2/users/" & id & "/pinned_lists/" & userId, additionalParams) + +proc usersIdPinnedLists(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/:id/pinned_lists` endpoint + return get(twitter, "2/users/" & id & "/pinned_lists", additionalParams) + +proc usersIdPinnedLists*(twitter: TwitterAPI, id: string, jsonBody: JsonNode): Response = + ## `POST /2/users/:id/pinned_lists` endpoint + return post(twitter, "2/users/" & id & "/pinned_lists", jsonBody) \ No newline at end of file diff --git a/src/v2endpoints/spaces.nim b/src/v2endpoints/spaces.nim new file mode 100644 index 0000000..e8bfd22 --- /dev/null +++ b/src/v2endpoints/spaces.nim @@ -0,0 +1,47 @@ +import strtabs, httpclient, json +import ../utility/[requests, types] + +# ------------------------ +# Search Spaces +# ------------------------ +proc spacesSearch*(twitter: TwitterAPI, query: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/spaces/search` endpoint + if additionalParams != nil: + additionalParams["query"] = query + return get(twitter, "2/spaces/search", additionalParams) + else: + return get(twitter, "2/spaces/search", { + "query": query}.newStringTable) + +# ------------------------ +# Spaces lookup +# ------------------------ +proc spaces*(twitter: TwitterAPI, ids: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/spaces` endpoint + if additionalParams != nil: + additionalParams["ids"] = ids + return get(twitter, "2/spaces", additionalParams) + else: + return get(twitter, "2/spaces", { + "ids": ids}.newStringTable) + +proc spacesId*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/spaces/:id` endpoint + return get(twitter, "2/spaces/" & id, additionalParams) + +proc spacesIdBuyers*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/spaces/:id/buyers` endpoint + return get(twitter, "2/spaces/" & id & "/buyers", additionalParams) + +proc spacesIdTweets*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/spaces/:id/tweets` endpoint + return get(twitter, "2/spaces/" & id & "/tweets", additionalParams) + +proc spacesByCreatorIds*(twitter: TwitterAPI, ids: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/spaces/by/creator_ids` endpoint + if additionalParams != nil: + additionalParams["ids"] = ids + return get(twitter, "2/spaces/by/creator_ids", additionalParams) + else: + return get(twitter, "2/spaces/by/creator_ids", { + "ids": ids}.newStringTable) \ No newline at end of file diff --git a/src/v2endpoints/tweets.nim b/src/v2endpoints/tweets.nim new file mode 100644 index 0000000..fc3bdce --- /dev/null +++ b/src/v2endpoints/tweets.nim @@ -0,0 +1,194 @@ +import strtabs, httpclient, json +import ../utility/[requests, types] + +# ------------------------ +# Bookmarks +# ------------------------ +proc usersIdBookmarksTweetId*(twitter: TwitterAPI, id: string, tweetId: string, additionalParams: StringTableRef = nil): Response = + ## `DELETE /2/users/:id/bookmarks/:tweet_id` endpoint + return delete(twitter, "2/users/" & id & "/bookmarks/" & tweetId, additionalParams) + +proc usersIdBookmarks*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/:id/bookmarks` endpoint + return get(twitter, "2/users/" & id & "/bookmarks", additionalParams) + +proc usersIdBookmarks*(twitter: TwitterAPI, id: string, jsonBody: JsonNode): Response = + ## `POST /2/users/:id/bookmarks` endpoint + return post(twitter, "2/users/" & id & "/bookmarks", jsonBody) + +# ------------------------ +# COVID-19 stream +# ------------------------ +# do I do these? they are uber niche +# NB these are labs endpoints but included in the V2 docs ? weird +proc tweetsStreamCompliance*(twitter: TwitterAPI, partition: string, additionalParams: StringTableRef = nil): Response = + ## `GET /labs/1/tweets/stream/compliance` endpoint + if additionalParams != nil: + additionalParams["partition"] = partition + return get(twitter, "labs/1/tweets/stream/compliance", additionalParams) + else: + return get(twitter, "labs/1/tweets/stream/compliance", { + "partition": partition}.newStringTable) + +proc tweetsStreamCovid19*(twitter: TwitterAPI, partition: string, additionalParams: StringTableRef = nil): Response = + ## `GET /labs/1/tweets/stream/covid19` endpoint + if additionalParams != nil: + additionalParams["partition"] = partition + return get(twitter, "labs/1/tweets/stream/covid19", additionalParams) + else: + return get(twitter, "labs/1/tweets/stream/covid19", { + "partition": partition}.newStringTable) + +# ------------------------ +# Filtered stream +# ------------------------ +proc tweetsSearchStream*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = + ## `GET /2/tweets/search/stream` endpoint + return get(twitter, "2/tweets/search/stream", additionalParams) + +proc tweetsSearchStreamRules*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = + ## `GET /2/tweets/search/stream/rules` endpoint + return get(twitter, "2/tweets/search/stream/rules", additionalParams) + +proc tweetsSearchStreamRules*(twitter: TwitterAPI, jsonBody: JsonNode): Response = + ## `POST /2/tweets/search/stream/rules` endpoint + return post(twitter, "2/users/search/stream/rules", jsonBody) + +# ------------------------ +# Hide replies +# ------------------------ +proc tweetsIdHidden*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/:id/hidden` endpoint + return get(twitter, "2/tweets/" & id & "/hidden", additionalParams) + +# ------------------------ +# Likes +# ------------------------ +proc usersIdLikesTweetId*(twitter: TwitterAPI, id: string, tweetId: string, additionalParams: StringTableRef = nil): Response = + ## `DELETE /2/users/:id/likes/:tweet_id` endpoint + return delete(twitter, "2/users/" & id & "/likes/" & tweetId, additionalParams) + +proc tweetsIdLikingUsers*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/tweets/:id/liking_users` endpoint + return get(twitter, "2/tweets/" & id & "/liking_users", additionalParams) + +proc tweetsIdLikedTweets*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/:id/liked_tweets` endpoint + return get(twitter, "2/tweets/" & id & "/liked_tweets", additionalParams) + +proc usersIdLikes*(twitter: TwitterAPI, id: string, jsonBody: JsonNode): Response = + ## `POST /2/users/:id/likes` endpoint + return post(twitter, "2/users/" & id & "/likes", jsonBody) + +# ------------------------ +# Manage Tweets +# ------------------------ +proc tweetsDelete*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `DELETE /2/tweets/:id` endpoint + return delete(twitter, "2/tweets/" & id, additionalParams) + +proc tweets*(twitter: TwitterAPI, jsonBody: JsonNode): Response = + ## `POST /2/tweets` endpoint + return post(twitter, "2/tweets", jsonBody) + +# ------------------------ +# Quote Tweets +# ------------------------ +proc tweetsIdQuoteTweets*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `get /2/tweets/:id/quote_tweets` endpoint + return get(twitter, "2/tweets/" & id & "/quote_tweets", additionalParams) + +# ------------------------ +# Retweets +# ------------------------ +proc usersIdRetweetsSourceTweetId*(twitter: TwitterAPI, id: string, sourceTweetId: string, additionalParams: StringTableRef = nil): Response = + ## `DELETE /2/users/:id/retweets/:source_tweet_id` endpoint + return delete(twitter, "2/users/" & id & "/retweets/" & sourceTweetId, additionalParams) + +proc tweetsIdRetweetedBy*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/tweets/:id/retweeted_by` endpoint + return get(twitter, "2/tweets/" & id & "/retweeted_by", additionalParams) + +proc usersIdRetweets*(twitter: TwitterAPI, id: string, jsonBody: JsonNode): Response = + ## `POST /2/users/:id/retweets` endpoint + return post(twitter, "2/users/" & id & "/retweets", jsonBody) + +# ------------------------ +# Search Tweets +# ------------------------ +proc tweetsSearchAll*(twitter: TwitterAPI, query: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/tweets/search/all` endpoint + if additionalParams != nil: + additionalParams["query"] = query + return get(twitter, "2/tweets/search/all", additionalParams) + else: + return get(twitter, "2/tweets/search/all", { + "query": query}.newStringTable) + +proc tweetsSearchRecent*(twitter: TwitterAPI, query: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/tweets/search/recent` endpoint + if additionalParams != nil: + additionalParams["query"] = query + return get(twitter, "2/tweets/search/recent", additionalParams) + else: + return get(twitter, "2/tweets/search/recent", { + "query": query}.newStringTable) + +# ------------------------ +# Timelines +# ------------------------ +proc usersIdMentions*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/:id/mentions` endpoint + return get(twitter, "2/users/" & id & "/mentions", additionalParams) + +proc usersIdTimelinesReverseChronological*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/:id/timelines/reverse_chronological` endpoint + return get(twitter, "2/users/" & id & "/timelines/reverse_chronological", additionalParams) + +proc usersIdTweets*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/:id/tweets` endpoint + return get(twitter, "2/users/" & id & "/tweets", additionalParams) + +# ------------------------ +# Tweet counts +# ------------------------ +proc tweetsCountsAll*(twitter: TwitterAPI, query: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/tweets/counts/all` endpoint + if additionalParams != nil: + additionalParams["query"] = query + return get(twitter, "2/tweets/counts/all", additionalParams) + else: + return get(twitter, "2/tweets/counts/all", { + "query": query}.newStringTable) + +proc tweetsCountsRecent*(twitter: TwitterAPI, query: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/tweets/counts/recent` endpoint + if additionalParams != nil: + additionalParams["query"] = query + return get(twitter, "2/tweets/counts/recent", additionalParams) + else: + return get(twitter, "2/tweets/counts/recent", { + "query": query}.newStringTable) + +# ------------------------ +# Tweets lookup +# ------------------------ +proc tweets*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/tweets` endpoint + if additionalParams != nil: + additionalParams["id"] = id + return get(twitter, "2/tweets", additionalParams) + else: + return get(twitter, "2/tweets", { + "id": id}.newStringTable) + +proc tweetsId*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/tweets/:id` endpoint + return get(twitter, "2/tweets/" & id, additionalParams) + +# ------------------------ +# Volume streams +# ------------------------ +proc tweetsSampleStream*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = + ## `GET /2/tweets/sample/stream` endpoint + return get(twitter, "2/tweets/sample/stream", additionalParams) \ No newline at end of file diff --git a/src/v2endpoints/users.nim b/src/v2endpoints/users.nim new file mode 100644 index 0000000..0886862 --- /dev/null +++ b/src/v2endpoints/users.nim @@ -0,0 +1,86 @@ +import strtabs, httpclient, json +import ../utility/[requests, types] + +# ------------------------ +# Blocks +# ------------------------ +proc usersSourceBlockingTarget*(twitter: TwitterAPI, sourceUserId: string, targetUserId: string, additionalParams: StringTableRef = nil): Response = + ## `DELETE /2/users/:source_user_id/blocking/:target_user_id` endpoint + return delete(twitter, "2/users/" & sourceUserId & "/blocking/" & targetUserId, additionalParams) + +proc usersIdBlocking*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/:id/blocking` endpoint + return get(twitter, "2/users/" & id & "/blocking", additionalParams) + +proc usersIdBlocking*(twitter: TwitterAPI, id: string, jsonBody: JsonNode): Response = + ## `POST /2/users/:id/blocking` endpoint + return post(twitter, "2/users/" & id & "/blocking", jsonBody) + +# ------------------------ +# Follows +# ------------------------ +proc usersSourceFollowingTarget*(twitter: TwitterAPI, sourceUserId: string, targetUserId: string, additionalParams: StringTableRef = nil): Response = + ## `DELETE /2/users/:source_user_id/following/:target_user_id` endpoint + ## Allows a user ID to unfollow another user. + return delete(twitter, "2/users/" & sourceUserId & "/following/" & targetUserId, additionalParams) + +proc usersIdFollowers*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/:id/followers` endpoint + return get(twitter, "2/users/" & id & "/followers", additionalParams) + +proc usersIdFollowing*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/:id/following` endpoint + return get(twitter, "2/users/" & id & "/following", additionalParams) + +proc usersIdFollowing*(twitter: TwitterAPI, id: string, jsonBody: JsonNode): Response = + ## `POST /2/users/:id/following` endpoint + return post(twitter, "2/users/" & id & "/following", jsonBody) + +# ------------------------ +# Mutes +# ------------------------ +proc usersSourceMutingTarget*(twitter: TwitterAPI, sourceUserId: string, targetUserId: string, additionalParams: StringTableRef = nil): Response = + ## `DELETE /2/users/:source_user_id/muting/:target_user_id` endpoint + ## Allows an authenticated user ID to unmute the target user. + return delete(twitter, "2/users/" & sourceUserId & "muting/" & targetUserId, additionalParams) + +proc usersIdMuting*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/:id/muting` endpoint + ## Returns a list of users who are muted by the specified user ID. + return get(twitter, "2/users/" & id & "/muting", additionalParams) + +proc usersIdMuting*(twitter: TwitterAPI, id: string, jsonBody: JsonNode): Response = + ## `POST /2/users/:id/muting` endpoint + ## Allows an authenticated user ID to mute the target user. + return post(twitter, "2/users/" & id & "/muting", jsonBody) + +# ------------------------ +# Users lookup +# ------------------------ +proc users*(twitter: TwitterAPI, ids: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users` endpoint + if additionalParams != nil: + additionalParams["ids"] = ids + return get(twitter, "2/users", additionalParams) + else: + return get(twitter, "2/users", {"ids": ids}.newStringTable) + +proc usersId*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/:id` endpoint + return get(twitter, "2/users/" & id, additionalParams) + +proc usersBy*(twitter: TwitterAPI, usernames: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/by` endpoint + if additionalParams != nil: + additionalParams["usernames"] = usernames + return get(twitter, "2/users/by", additionalParams) + else: + return get(twitter, "2/users/by", {"usernames": usernames}.newStringTable) + +proc usersByUsernameUsername*(twitter: TwitterAPI, username: string, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/by/username/:username` endpoint + return get(twitter, "2/users/by/username" & username, additionalParams) + +proc usersMe*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = + ## `GET /2/users/me` endpoint + return get(twitter, "2/users/me", additionalParams) \ No newline at end of file diff --git a/twitter.nim b/twitter.nim deleted file mode 100644 index 8d3ec46..0000000 --- a/twitter.nim +++ /dev/null @@ -1,1645 +0,0 @@ -import algorithm -import base64 -import httpclient -import sequtils -import strtabs -import strutils -import times -import uuids -import hmac -import json - - -const baseUrl = "https://api.twitter.com/" -const uploadUrl = "https://upload.twitter.com/1.1/" -const publishUrl = "https://publish.twitter.com" -const clientUserAgent = "twitter.nim/1.0.1" - - -type - ConsumerTokenImpl = object - consumerKey: string - consumerSecret: string - - ConsumerToken* = ref ConsumerTokenImpl ## \ - ## Consumer token object with a `consumerKey` and `consumerSecret` - - TwitterAPIImpl = object - consumerToken: ConsumerToken - accessToken: string - accessTokenSecret: string - - TwitterAPI* = ref TwitterAPIImpl ## \ - ## TwitterAPI token object with a `consumerToken`, `accessToken`, and `accessTokenSecret` - - -proc newConsumerToken*(consumerKey, consumerSecret: string): ConsumerToken = - return ConsumerToken(consumerKey: consumerKey, - consumerSecret: consumerSecret) - - -proc newTwitterAPI*(consumerToken: ConsumerToken, accessToken, accessTokenSecret: string): TwitterAPI = - return TwitterAPI(consumerToken: consumerToken, - accessToken: accessToken, - accessTokenSecret: accessTokenSecret) - - -proc newTwitterAPI*(consumerKey, consumerSecret, - accessToken, accessTokenSecret: string): TwitterAPI = - let consumerToken: ConsumerToken = ConsumerToken(consumerKey: consumerKey, - consumerSecret: consumerSecret) - return TwitterAPI(consumerToken: consumerToken, - accessToken: accessToken, - accessTokenSecret: accessTokenSecret) - - -# Stolen from cgi.nim -proc encodeUrl(s: string): string = - ## Exclude A..Z a..z 0..9 - . _ ~ - ## See https://dev.twitter.com/oauth/overview/percent-encoding-parameters - result = newStringOfCap(s.len + s.len shr 2) # assume 12% non-alnum-chars - for i in 0..s.len-1: - case s[i] - of 'a'..'z', 'A'..'Z', '0'..'9', '_', '-', '.', '~': - add(result, s[i]) - else: - add(result, '%') - add(result, toHex(ord(s[i]), 2)) - - -proc signature(consumerSecret, accessTokenSecret, httpMethod, url: string, params: StringTableRef): string = - var keys: seq[string] = @[] - - for key in params.keys: - keys.add(key) - - keys.sort(cmpIgnoreCase) - var query: string = keys.map(proc(x: string): string = x & "=" & params[x]).join("&") - let key: string = encodeUrl(consumerSecret) & "&" & encodeUrl(accessTokenSecret) - let base: string = httpMethod & "&" & encodeUrl(url) & "&" & encodeUrl(query) - - return encodeUrl(encode(hmac_sha1(key, base))) - - -proc buildParams(consumerKey, accessToken: string, - additionalParams: StringTableRef = nil): StringTableRef = - var params: StringTableRef = { "oauth_version": "1.0", - "oauth_consumer_key": consumerKey, - "oauth_nonce": $genUUID(), - "oauth_signature_method": "HMAC-SHA1", - "oauth_timestamp": $(epochTime().toInt), - "oauth_token": accessToken }.newStringTable - - for key, value in params: - params[key] = encodeUrl(value) - if additionalParams != nil: - for key, value in additionalParams: - params[key] = encodeUrl(value) - return params - - -proc request*(twitter: TwitterAPI, endPoint, httpMethod: string, - additionalParams: StringTableRef = nil, - requestUrl: string = baseUrl, data: string = ""): Response = - let url = requestUrl & endPoint - var keys: seq[string] = @[] - - var params = buildParams(twitter.consumerToken.consumerKey, - twitter.accessToken, - additionalParams) - params["oauth_signature"] = signature(twitter.consumerToken.consumerSecret, - twitter.accessTokenSecret, - httpMethod, url, params) - - for key in params.keys: - keys.add(key) - - let authorizeKeys = keys.filter(proc(x: string): bool = x.startsWith("oauth_")) - let authorize = "OAuth " & authorizeKeys.map(proc(x: string): string = x & "=" & "\"" & params[x] & "\"").join(",") - let path = keys.map(proc(x: string): string = x & "=" & params[x]).join("&") - let client = newHttpClient(userAgent = clientUserAgent) - client.headers = newHttpHeaders({ "Authorization": authorize }) - - # Data must be in a multipart - if data != "": - var mediaMultipart = newMultiPartData() - mediaMultipart["media"] = data - if httpMethod == "POST": - return httpclient.post(client, url & "?" & path, multipart=mediaMultipart) - else: - raise newException(ValueError, "Can only POST with data") - - if httpMethod == "GET": - return httpclient.get(client, url & "?" & path) - elif httpMethod == "POST": - return httpclient.post(client, url & "?" & path) - elif httpMethod == "DELETE": - return httpclient.delete(client, url & "?" & path) - elif httpMethod == "PUT": - return httpclient.put(client, url & "?" & path) - - -proc request*(twitter: TwitterAPI, endPoint: string, jsonBody: JsonNode = nil, - requestUrl: string = baseUrl): Response = - ## Request proc for endpoints requiring `application/json` bodies - # You can only send JSON with POST - let httpMethod = "POST" - let url = requestUrl & endPoint - var keys: seq[string] = @[] - - var params = buildParams(twitter.consumerToken.consumerKey, - twitter.accessToken) - params["oauth_signature"] = signature(twitter.consumerToken.consumerSecret, - twitter.accessTokenSecret, - httpMethod, url, params) - - for key in params.keys: - keys.add(key) - - let authorize = "OAuth " & keys.map(proc(x: string): string = x & "=" & "\"" & params[x] & "\"").join(",") - let client = newHttpClient(userAgent = clientUserAgent) - client.headers = newHttpHeaders({"Authorization": authorize, "Content-Type": "application/json; charset=UTF-8"}) - - if httpMethod == "POST": - return httpclient.post(client, url, body= $jsonBody) - - -proc get*(twitter: TwitterAPI, endPoint: string, - additionalParams: StringTableRef = nil, media: bool = false, publish: bool = false): Response = - ## Raw get proc. `media` optional parameter changes request URL to - ## `upload.twitter.com` - if media: - return request(twitter, endPoint, "GET", additionalParams, requestUrl=uploadUrl) - elif publish: - return request(twitter, endPoint, "GET", additionalParams, requestUrl=publishUrl) - return request(twitter, endPoint, "GET", additionalParams) - - -proc post*(twitter: TwitterAPI, endPoint: string, - additionalParams: StringTableRef = nil, media: bool = false): Response = - ## Raw post proc. `media` optional parameter changes request URL to - ## `upload.twitter.com` - if media: - return request(twitter, endPoint, "POST", additionalParams, requestUrl=uploadUrl) - return request(twitter, endPoint, "POST", additionalParams) - - -proc post*(twitter: TwitterAPI, endPoint: string, - additionalParams: StringTableRef = nil, media: bool = false, - data: string): Response = - ## Overload for post that includes binary data e.g. images / video to upload - return request(twitter, endPoint, "POST", additionalParams, requestUrl=uploadUrl, data) - - -proc post*(twitter: TwitterAPI, endPoint: string, - jsonBody: JsonNode, media: bool = false): Response = - if media: - return request(twitter, endPoint, jsonBody, requestUrl=uploadUrl) - return request(twitter, endPoint, jsonBody) - - -proc delete*(twitter: TwitterAPI, endPoint: string, - additionalParams: StringTableRef = nil): Response = - return request(twitter, endPoint, "DELETE", additionalParams) - - -proc put*(twitter: TwitterAPI, endPoint: string, - additionalParams: StringTableRef = nil): Response = - return request(twitter, endPoint, "PUT", additionalParams) - - -# ------------------- -# developer utilities -# ------------------- - - -proc applicationRateLimitData*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `application/rate_limit_status.json` endpoint - return get(twitter, "application/rate_limit_status.json", additionalParams) - - -proc helpConfiguration*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `help/configuration.json` endpoint - return get(twitter, "help/configuration.json", additionalParams) - - -proc helpLanguages*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `help/languages.json` endpoint - return get(twitter, "help/languages.json", additionalParams) - - -# -------------- -# authentication -# -------------- - - -proc oauthAuthenticate*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `oauth/authenticate` endpoint - return get(twitter, "oauth/authenticate", additionalParams) - - -proc oauthAuthorize*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `oauth/authorize` endpoint - return get(twitter, "oauth/authorize", additionalParams) - - -proc oauthAccessToken*(twitter: TwitterAPI, oauthToken: string, oauthVerifier: string, additionalParams: StringTableRef = nil): Response = - ## `oauth/access_token` endpoint - if additionalParams != nil: - additionalParams["oauth_token"] = oauthToken - additionalParams["oauth_verifier"] = oauthVerifier - return post(twitter, "oauth/access_token", additionalParams) - else: - return post(twitter, "oauth/access_token", {"oauth_token": oauthToken, "oauth_verifier": oauthVerifier}.newStringTable) - - -proc oauthInvalidateToken*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `oauth/invalidate_token` endpoint - return post(twitter, "oauth/invalidate_token", additionalParams) - - -proc oauthRequestToken*(twitter: TwitterAPI, oauthCallback: string, additionalParams: StringTableRef = nil): Response = - ## `oauth/request_token` endpoint - if additionalParams != nil: - additionalParams["oauth_callback"] = oauthCallback - return post(twitter, "oauth/request_token", additionalParams) - else: - return post(twitter, "oauth/request_token", {"oauth_callback": oauthCallback}.newStringTable) - - -proc oauth2InvalidateToken*(twitter: TwitterAPI, accessToken: string, additionalParams: StringTableRef = nil): Response = - ## `oauth2/invalidate_token` endpoint - if additionalParams != nil: - additionalParams["access_token"] = accessToken - return post(twitter, "oauth2/invalidate_token", additionalParams) - else: - return post(twitter, "oauth2/invalidate_token", {"access_token": accessToken}.newStringTable) - - -proc oauth2Token*(twitter: TwitterAPI, grantType: string, additionalParams: StringTableRef = nil): Response = - ## `oauth2/token` endpoint - if additionalParams != nil: - additionalParams["grant_type"] = grantType - return post(twitter, "oauth2/token", additionalParams) - else: - return post(twitter, "oauth2/token", {"grant_type": grantType}.newStringTable) - -# ----- -# lists -# ----- -proc listsList*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - ## `lists/list.json` endpoint for screen name - if additionalParams != nil: - additionalParams["screen_name"] = screenName - return get(twitter, "lists/list.json", additionalParams) - else: - return get(twitter, "lists/list.json", {"screen_name": screenName}.newStringTable) - - -proc listsList*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/list.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return get(twitter, "lists/list.json", additionalParams) - else: - return get(twitter, "lists/list.json", {"user_id": $userId}.newStringTable) - - -proc listsMembers*(twitter: TwitterAPI, slug: string, additionalParams: StringTableRef = nil): Response = - ## `lists/members.json` endpoint for slug - if additionalParams != nil: - additionalParams["slug"] = slug - return get(twitter, "lists/members.json", additionalParams) - else: - return get(twitter, "lists/members.json", {"slug": slug}.newStringTable) - - -proc listsMembers*(twitter: TwitterAPI, listId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/members.json` endpoint for list id - if additionalParams != nil: - additionalParams["list_id"] = $listId - return get(twitter, "lists/members.json", additionalParams) - else: - return get(twitter, "lists/members.json", {"list_id": $listId}.newStringTable) - - -proc listsMembersShow*(twitter: TwitterAPI, slug: string, additionalParams: StringTableRef = nil): Response = - ## `lists/members/show.json` endpoint for slug - if additionalParams != nil: - additionalParams["slug"] = slug - return get(twitter, "lists/members/show.json", additionalParams) - else: - return get(twitter, "lists/members/show.json", {"slug": slug}.newStringTable) - - -proc listsMembersShow*(twitter: TwitterAPI, listId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/members/show.json` endpoint for list id - if additionalParams != nil: - additionalParams["list_id"] = $listId - return get(twitter, "lists/members/show.json", additionalParams) - else: - return get(twitter, "lists/members/show.json", {"list_id": $listId}.newStringTable) - - -proc listsMemberships*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - ## `lists/memberships.json` endpoint for screen name - if additionalParams != nil: - additionalParams["screen_name"] = screenName - return get(twitter, "lists/memberships.json", additionalParams) - else: - return get(twitter, "lists/memberships.json", {"screen_name": screenName}.newStringTable) - - -proc listsMemberships*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/memberships.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return get(twitter, "lists/memberships.json", additionalParams) - else: - return get(twitter, "lists/memberships.json", {"user_id": $userId}.newStringTable) - - -proc listsOwnerships*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - ## `lists/ownerships.json` endpoint for screen name - if additionalParams != nil: - additionalParams["screen_name"] = screenName - return get(twitter, "lists/ownerships.json", additionalParams) - else: - return get(twitter, "lists/ownerships.json", {"screen_name": screenName}.newStringTable) - - -proc listsOwnerships*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/ownerships.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return get(twitter, "lists/ownerships.json", additionalParams) - else: - return get(twitter, "lists/ownerships.json", {"user_id": $userId}.newStringTable) - - -proc listsShow*(twitter: TwitterAPI, slug: string, additionalParams: StringTableRef = nil): Response = - ## `lists/show.json` endpoint for slug - if additionalParams != nil: - additionalParams["slug"] = slug - return get(twitter, "lists/show.json", additionalParams) - else: - return get(twitter, "lists/show.json", {"slug": slug}.newStringTable) - - -proc listsShow*(twitter: TwitterAPI, listId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/show.json` endpoint for list id - if additionalParams != nil: - additionalParams["list_id"] = $listId - return get(twitter, "lists/show.json", additionalParams) - else: - return get(twitter, "lists/show.json", {"list_id": $listId}.newStringTable) - - -proc listsStatuses*(twitter: TwitterAPI, slug: string, additionalParams: StringTableRef = nil): Response = - ## `lists/statuses.json` endpoint for slug - if additionalParams != nil: - additionalParams["slug"] = slug - return get(twitter, "lists/statuses.json", additionalParams) - else: - return get(twitter, "lists/statuses.json", {"slug": slug}.newStringTable) - - -proc listsStatuses*(twitter: TwitterAPI, listId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/statuses.json` endpoint for list id - if additionalParams != nil: - additionalParams["list_id"] = $listId - return get(twitter, "lists/statuses.json", additionalParams) - else: - return get(twitter, "lists/statuses.json", {"list_id": $listId}.newStringTable) - - -proc listsSubscribers*(twitter: TwitterAPI, slug: string, additionalParams: StringTableRef = nil): Response = - ## `lists/subscribers.json` endpoint for slug - if additionalParams != nil: - additionalParams["slug"] = slug - return get(twitter, "lists/subscribers.json", additionalParams) - else: - return get(twitter, "lists/subscribers.json", {"slug": slug}.newStringTable) - - -proc listsSubscribers*(twitter: TwitterAPI, listId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/subscribers.json` endpoint for list id - if additionalParams != nil: - additionalParams["list_id"] = $listId - return get(twitter, "lists/subscribers.json", additionalParams) - else: - return get(twitter, "lists/subscribers.json", {"list_id": $listId}.newStringTable) - - -proc listsSubscribersShow*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `lists/subscribers/show.json` endpoint - # NB: this could be, I think 4, overloading procs but I have decided not to for simplicity - return get(twitter, "lists/subscribers/show.json", additionalParams) - - -proc listsSubscriptions*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - ## `lists/subscriptions.json` endpoint for screen name - if additionalParams != nil: - additionalParams["screen_name"] = screenName - return get(twitter, "lists/subscriptions.json", additionalParams) - else: - return get(twitter, "lists/subscriptions.json", {"screen_name": screenName}.newStringTable) - - -proc listsSubscriptions*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/subscriptions.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return get(twitter, "lists/subscriptions.json", additionalParams) - else: - return get(twitter, "lists/subscriptions.json", {"user_id": $userId}.newStringTable) - - -proc listsCreate*(twitter: TwitterAPI, slug: string, additionalParams: StringTableRef = nil): Response = - ## `lists/create.json` endpoint for slug - if additionalParams != nil: - additionalParams["slug"] = slug - return post(twitter, "lists/create.json", additionalParams) - else: - return post(twitter, "lists/create.json", {"slug": slug}.newStringTable) - - -proc listsCreate*(twitter: TwitterAPI, listId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/create.json` endpoint for list id - if additionalParams != nil: - additionalParams["list_id"] = $listId - return post(twitter, "lists/create.json", additionalParams) - else: - return post(twitter, "lists/create.json", {"list_id": $listId}.newStringTable) - - -proc listsDestroy*(twitter: TwitterAPI, slug: string, additionalParams: StringTableRef = nil): Response = - ## `lists/destroy.json` endpoint for slug - if additionalParams != nil: - additionalParams["slug"] = slug - return post(twitter, "lists/destroy.json", additionalParams) - else: - return post(twitter, "lists/destroy.json", {"slug": slug}.newStringTable) - - -proc listsDestroy*(twitter: TwitterAPI, listId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/destroy.json` endpoint for list id - if additionalParams != nil: - additionalParams["list_id"] = $listId - return post(twitter, "lists/destroy.json", additionalParams) - else: - return post(twitter, "lists/destroy.json", {"list_id": $listId}.newStringTable) - - -proc listsMembersCreate*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `lists/members/create.json` endpoint - # NB: this could be, I think 4, overloading procs but I have decided not to for simplicity - return post(twitter, "lists/members/create.json", additionalParams) - - -proc listsMembersCreateAll*(twitter: TwitterAPI, listId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/members/create_all.json` endpoint for list id - if additionalParams != nil: - additionalParams["list_id"] = $listId - return post(twitter, "lists/members/create_all.json", additionalParams) - else: - return post(twitter, "lists/members/create_all.json", {"list_id": $listId}.newStringTable) - - -proc listsMembersCreateAll*(twitter: TwitterAPI, slug: string, additionalParams: StringTableRef = nil): Response = - ## `lists/members/create_all.json` endpoint for slug - if additionalParams != nil: - additionalParams["slug"] = slug - return post(twitter, "lists/members/create_all.json", additionalParams) - else: - return post(twitter, "lists/members/create_all.json", {"slug": slug}.newStringTable) - - -proc listsMembersDestroy*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `lists/members/destroy.json` endpoint - # NB: this could be, I think 4, overloading procs but I have decided not to for simplicity - return post(twitter, "lists/members/destroy.json", additionalParams) - - -proc listsMembersDestroyAll*(twitter: TwitterAPI, listId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/members/destroy_all.json` endpoint for list id - if additionalParams != nil: - additionalParams["list_id"] = $listId - return post(twitter, "lists/members/destroy_all.json", additionalParams) - else: - return post(twitter, "lists/members/destroy_all.json", {"list_id": $listId}.newStringTable) - - -proc listsMembersDestroyAll*(twitter: TwitterAPI, slug: string, additionalParams: StringTableRef = nil): Response = - ## `lists/members/destroy_all.json` endpoint for slug - if additionalParams != nil: - additionalParams["slug"] = slug - return post(twitter, "lists/members/destroy_all.json", additionalParams) - else: - return post(twitter, "lists/members/destroy_all.json", {"slug": slug}.newStringTable) - - -proc listsSubscribersCreate*(twitter: TwitterAPI, slug: string, additionalParams: StringTableRef = nil): Response = - ## `lists/subscribers/create.json` endpoint for slug - if additionalParams != nil: - additionalParams["slug"] = slug - return post(twitter, "lists/subscribers/create.json", additionalParams) - else: - return post(twitter, "lists/subscribers/create.json", {"slug": slug}.newStringTable) - - -proc listsSubscribersCreate*(twitter: TwitterAPI, listId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/subscribers/create.json` endpoint for list id - if additionalParams != nil: - additionalParams["list_id"] = $listId - return post(twitter, "lists/subscribers/create.json", additionalParams) - else: - return post(twitter, "lists/subscribers/create.json", {"list_id": $listId}.newStringTable) - - -proc listsSubscribersDestroy*(twitter: TwitterAPI, slug: string, additionalParams: StringTableRef = nil): Response = - ## `lists/subscribers/destroy.json` endpoint for slug - if additionalParams != nil: - additionalParams["slug"] = slug - return post(twitter, "lists/subscribers/destroy.json", additionalParams) - else: - return post(twitter, "lists/subscribers/destroy.json", {"slug": slug}.newStringTable) - - -proc listsSubscribersDestroy*(twitter: TwitterAPI, listId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/subscribers/destroy.json` endpoint for list id - if additionalParams != nil: - additionalParams["list_id"] = $listId - return post(twitter, "lists/subscribers/destroy.json", additionalParams) - else: - return post(twitter, "lists/subscribers/destroy.json", {"list_id": $listId}.newStringTable) - - -proc listsUpdate*(twitter: TwitterAPI, slug: string, additionalParams: StringTableRef = nil): Response = - ## `lists/update.json` endpoint for slug - if additionalParams != nil: - additionalParams["slug"] = slug - return post(twitter, "lists/update.json", additionalParams) - else: - return post(twitter, "lists/update.json", {"slug": slug}.newStringTable) - - -proc listsUpdate*(twitter: TwitterAPI, listId: int, additionalParams: StringTableRef = nil): Response = - ## `lists/update.json` endpoint for list id - if additionalParams != nil: - additionalParams["list_id"] = $listId - return post(twitter, "lists/update.json", additionalParams) - else: - return post(twitter, "lists/update.json", {"list_id": $listId}.newStringTable) - - -# --------------------------------- -# followers / friends / friendships -# --------------------------------- - -proc followersIds*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - ## `followers/ids.json` endpoint for screen name - if additionalParams != nil: - additionalParams["screen_name"] = screenName - return get(twitter, "followers/ids.json", additionalParams) - else: - return get(twitter, "followers/ids.json", {"screen_name": screenName}.newStringTable) - - -proc followersIds*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - ## `followers/id.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return get(twitter, "followers/ids.json", additionalParams) - else: - return get(twitter, "followers/ids.json", {"user_id": $userId}.newStringTable) - - -proc followersList*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - ## `followers/list.json` endpoint for screen name - if additionalParams != nil: - additionalParams["screen_name"] = screenName - return get(twitter, "followers/list.json", additionalParams) - else: - return get(twitter, "followers/list.json", {"screen_name": screenName}.newStringTable) - - -proc followersList*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - ## `followers/list.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return get(twitter, "followers/list.json", additionalParams) - else: - return get(twitter, "followers/list.json", {"user_id": $userId}.newStringTable) - - -proc friendsIds*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - ## `friends/ids.json` endpoint for screen name - if additionalParams != nil: - additionalParams["screen_name"] = screenName - return get(twitter, "friends/ids.json", additionalParams) - else: - return get(twitter, "friends/ids.json", {"screen_name": screenName}.newStringTable) - - -proc friendsIds*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - ## `friends/id.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return get(twitter, "friends/ids.json", additionalParams) - else: - return get(twitter, "friends/ids.json", {"user_id": $userId}.newStringTable) - - -proc friendsList*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - ## `friends/list.json` endpoint for screen name - if additionalParams != nil: - additionalParams["screen_name"] = screenName - return get(twitter, "friends/list.json", additionalParams) - else: - return get(twitter, "friends/list.json", {"screen_name": screenName}.newStringTable) - - -proc friendsList*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - ## `friends/list.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return get(twitter, "friends/list.json", additionalParams) - else: - return get(twitter, "friends/list.json", {"user_id": $userId}.newStringTable) - - -proc friendshipsIncoming*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `friendships/incoming.json` endpoint - return get(twitter, "friendships/incoming.json", additionalParams) - - -proc friendshipsLookup*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `friendships/lookup.json` endpoint - return get(twitter, "friendships/lookup.json", additionalParams) - - -proc friendshipsNoRetweetsIds*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `friendships/no_retweets/ids.json` - return get(twitter, "friendships/no_retweets/ids.json", additionalParams) - - -proc friendshipsOutgoing*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `friendships/outgoing.json` endpoint - return get(twitter, "friendships/outgoing.json", additionalParams) - - -proc friendshipsShow*(twitter: TwitterAPI, sourceId: int, targetId: int, additionalParams: StringTableRef = nil): Response = - ## `friendships/show.json` endpoint - if additionalParams != nil: - additionalParams["source_id"] = $sourceId - additionalParams["target_id"] = $targetId - return get(twitter, "friendships/show.json", additionalParams) - else: - return get(twitter, "friendships/show.json", {"source_id": $sourceId, "target_id": $targetId}.newStringTable) - - -proc friendshipsShow*(twitter: TwitterAPI, sourceScreenName: string, targetScreenName: string, additionalParams: StringTableRef = nil): Response = - ## `friendships/show.json` endpoint - if additionalParams != nil: - additionalParams["source_screen_name"] = sourceScreenName - additionalParams["target_screen_name"] = targetScreenName - return get(twitter, "friendships/show.json", additionalParams) - else: - return get(twitter, "friendships/show.json", {"source_screen_name": sourceScreenName, "target_screen_name": targetScreenName}.newStringTable) - - -proc friendshipsCreate*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - ## `friendships/create.json` endpoint - if additionalParams != nil: - additionalParams["screen_name"] = screenName - return post(twitter, "friendships/create.json", additionalParams) - else: - return post(twitter, "friendships/create.json", {"screen_name": screenName}.newStringTable) - - -proc friendshipsCreate*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - ## `friendships/create.json` endpoint - if additionalParams != nil: - additionalParams["user_id"] = $userId - return post(twitter, "friendships/create.json", additionalParams) - else: - return post(twitter, "friendships/create.json", {"user_id": $userId}.newStringTable) - - -proc friendshipsDestroy*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - ## `friendships/destroy.json` endpoint - if additionalParams != nil: - additionalParams["screen_name"] = screenName - return post(twitter, "friendships/destroy.json", additionalParams) - else: - return post(twitter, "friendships/destroy.json", {"screen_name": screenName}.newStringTable) - - -proc friendshipsDestroy*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - ## `friendships/destroy.json` endpoint - if additionalParams != nil: - additionalParams["user_id"] = $userId - return post(twitter, "friendships/destroy.json", additionalParams) - else: - return post(twitter, "friendships/destroy.json", {"user_id": $userId}.newStringTable) - - -proc friendshipsUpdate*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - ## `friendships/update.json` endpoint - if additionalParams != nil: - additionalParams["screen_name"] = screenName - return post(twitter, "friendships/update.json", additionalParams) - else: - return post(twitter, "friendships/update.json", {"screen_name": screenName}.newStringTable) - - -proc friendshipsUpdate*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - ## `friendships/update.json` endpoint - if additionalParams != nil: - additionalParams["user_id"] = $userId - return post(twitter, "friendships/update.json", additionalParams) - else: - return post(twitter, "friendships/update.json", {"user_id": $userId}.newStringTable) - - -# ----- -# users -# ----- - - -proc usersLookup*(twitter:TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - ## `users/lookup.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return post(twitter, "users/lookup.json", additionalParams) - else: - return post(twitter, "users/lookup.json", {"user_id": $userId}.newStringTable) - - -proc usersLookup*(twitter:TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - ## `users/lookup.json` endpoint for screen name - if additionalParams != nil: - additionalParams["screen_name"] = screenName - return post(twitter, "users/lookup.json", additionalParams) - else: - return post(twitter, "users/lookup.json", {"screen_name": screenName}.newStringTable) - - -proc usersSearch*(twitter:TwitterAPI, q: string, additionalParams: StringTableRef = nil): Response = - ## `users/search.json` endpoint - if additionalParams != nil: - additionalParams["q"] = q - return get(twitter, "users/search.json", additionalParams) - else: - return get(twitter, "users/search.json", {"q": q}.newStringTable) - - -proc usersProfileBanner*(twitter:TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - ## `users/profile_banner.json` endpoint - if additionalParams != nil: - additionalParams["screen_name"] = screenName - return get(twitter, "users/profile_banner.json", additionalParams) - else: - return get(twitter, "users/profile_banner.json", {"screen_name": screenName}.newStringTable) - - -proc usersProfileBanner*(twitter:TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - ## `users/profile_banner.json` endpoint - if additionalParams != nil: - additionalParams["user_id"] = $userId - return get(twitter, "users/profile_banner.json", additionalParams) - else: - return get(twitter, "users/profile_banner.json", {"user_id": $userId}.newStringTable) - - -proc usersShow*(twitter: TwitterAPI, screenName: string, - additionalParams: StringTableRef = nil): Response = - ## `users/show.json` endpoint for screen names (@username) - if additionalParams != nil: - additionalParams["screen_name"] = screenName - return get(twitter, "users/show.json", additionalParams) - else: - return get(twitter, "users/show.json", {"screen_name": screenName}.newStringTable) - - -proc usersShow*(twitter: TwitterAPI, userId: int, - additionalParams: StringTableRef = nil): Response = - ## `users/show.json` endpoint for user id (e.g. `783214 => @twitter`) - if additionalParams != nil: - additionalParams["user_id"] = $userId - return get(twitter, "users/show.json", additionalParams) - else: - return get(twitter, "users/show.json", {"user_id": $userId}.newStringTable) - - -proc usersReportSpam*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - ## `users/report_spam.json` endpoint for screen name - if additionalParams != nil: - additionalParams["user_id"] = $screenName - return get(twitter, "users/report_spam.json", additionalParams) - else: - return get(twitter, "users/report_spam.json", {"screen_name": $screenName}.newStringTable) - - -proc usersReportSpam*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - ## `users/report_spam.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return get(twitter, "users/report_spam.json", additionalParams) - else: - return get(twitter, "users/report_spam.json", {"user_id": $userId}.newStringTable) - - -# ------- -# account -# ------- - - -proc accountSettings*(twitter:TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `account/settings.json` endpoint - return get(twitter, "account/settings.json", additionalParams) - - -proc accountVerifyCredentials*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `account/verify_credentials.json` endpoint - return get(twitter, "account/verify_credentials.json", additionalParams) - - -proc accountRemoveProfileBanner*(twitter:TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `account/remove_profile_banner.json` endpoint - return post(twitter, "account/remove_profile_banner.json", additionalParams) - - -proc accountUpdateSettings*(twitter:TwitterAPI, additionalParams: StringTableRef): Response = - ## `account/update_settings.json` endpoint - return post(twitter, "account/update_settings.json", additionalParams) - - -proc accountUpdateProfile*(twitter:TwitterAPI, additionalParams: StringTableRef): Response = - ## `account/update_profile.json` endpoint - return post(twitter, "account/update_profile.json", additionalParams) - - -proc accountUpdateProfileBanner*(twitter: TwitterAPI, banner: string, additionalParams: StringTableRef = nil): Response = - ## `account/update_profile_banner.json` endpoint - if additionalParams != nil: - additionalParams["banner"] = banner - return post(twitter, "account/update_profile_banner.json", additionalParams) - else: - return post(twitter, "account/update_profile_banner.json", {"banner": banner}.newStringTable) - - -proc accountUpdateProfileImage*(twitter: TwitterAPI, image: string, additionalParams: StringTableRef = nil): Response = - ## `account/update_profile_image.json` endpoint - if additionalParams != nil: - additionalParams["image"] = image - return post(twitter, "account/update_profile_image.json", additionalParams) - else: - return post(twitter, "account/update_profile_image.json", {"image": image}.newStringTable) - - -# -------------- -# saved_searches -# -------------- - - -proc savedSeachesList*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `saved_searches/list.json` endpoint - return get(twitter, "saved_searches/list.json", additionalParams) - - -proc savedSearchesShow*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `saved_searches/show/:id.json` endpoint - return get(twitter, "saved_searches/show/" & $id & ".json", additionalParams) - - -proc savedSearchesCreate*(twitter: TwitterAPI, query: string, additionalParams: StringTableRef = nil): Response = - ## `saved_searches/create.json` endpoint - if additionalParams != nil: - additionalParams["query"] = query - return post(twitter, "saved_searches/create.json", additionalParams) - else: - return post(twitter, "saved_searches/create.json", {"query": query}.newStringTable) - - -proc savedSeachesDestroy*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `saved_searches/destroy/:id.json` endpoint - return post(twitter, "saved_searches/destroy/" & $id & ".json", additionalParams) - - -# -------------- -# blocks / mutes -# -------------- - - -proc blocksIds*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `blocks/ids.json` endpoint - return get(twitter, "blocks/ids.json", additionalParams) - - -proc blocksList*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `blocks/list.json` endpoint - return get(twitter, "blocks/list.json", additionalParams) - - -proc mutesUsersIds*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `mutes/users/ids.json` endpoint - return get(twitter, "mutes/users/ids.json", additionalParams) - - -proc mutesUsersList*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `mutes/users/list.json` endpoint - return get(twitter, "mutes/users/list.json", additionalParams) - - -proc blocksCreate*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - # `blocks/create.json` endpoint for screen name - if additionalParams != nil: - additionalParams["user_id"] = $screenName - return post(twitter, "blocks/create.json", additionalParams) - else: - return post(twitter, "blocks/create.json", {"screen_name": $screenName}.newStringTable) - - -proc blocksCreate*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - # `blocks/create.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return post(twitter, "blocks/create.json", additionalParams) - else: - return post(twitter, "blocks/create.json", {"user_id": $userId}.newStringTable) - - -proc blocksDestroy*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - # `blocks/destroy.json` endpoint for screen name - if additionalParams != nil: - additionalParams["user_id"] = $screenName - return post(twitter, "blocks/destroy.json", additionalParams) - else: - return post(twitter, "blocks/destroy.json", {"screen_name": $screenName}.newStringTable) - - -proc blocksDestroy*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - # `blocks/destroy.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return post(twitter, "blocks/destroy.json", additionalParams) - else: - return post(twitter, "blocks/destroy.json", {"user_id": $userId}.newStringTable) - - -proc mutesUsersCreate*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - # `mutes/users/create.json` endpoint for screen name - if additionalParams != nil: - additionalParams["user_id"] = $screenName - return post(twitter, "mutes/users/create.json", additionalParams) - else: - return post(twitter, "mutes/users/create.json", {"screen_name": $screenName}.newStringTable) - - -proc mutesUsersCreate*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - # `mutes/users/create.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return post(twitter, "mutes/users/create.json", additionalParams) - else: - return post(twitter, "mutes/users/create.json", {"user_id": $userId}.newStringTable) - - -proc mutesUsersDestroy*(twitter: TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - # `mutes/users/destroy.json` endpoint for screen name - if additionalParams != nil: - additionalParams["user_id"] = $screenName - return post(twitter, "mutes/users/destroy.json", additionalParams) - else: - return post(twitter, "mutes/users/destroy.json", {"screen_name": $screenName}.newStringTable) - - -proc mutesUsersDestroy*(twitter: TwitterAPI, userId: int, additionalParams: StringTableRef = nil): Response = - # `mutes/users/destroy.json` endpoint for user id - if additionalParams != nil: - additionalParams["user_id"] = $userId - return post(twitter, "mutes/users/destroy.json", additionalParams) - else: - return post(twitter, "mutes/users/destroy.json", {"user_id": $userId}.newStringTable) - - -# ----------- -# collections -# ----------- - - -proc collectionsEntries*(twitter:TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = - ## `collections/entries.json` endpoint - if additionalParams != nil: - additionalParams["id"] = id - return get(twitter, "collections/entries.json", additionalParams) - else: - return get(twitter, "collections/entries.json", {"id": id}.newStringTable) - - -proc collectionsList*(twitter:TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `collections/list.json` endpoint for twitter user id - if additionalParams != nil: - additionalParams["id"] = $id - return get(twitter, "collections/list.json", additionalParams) - else: - return get(twitter, "collections/list.json", {"id": $id}.newStringTable) - - -proc collectionsList*(twitter:TwitterAPI, screenName: string, additionalParams: StringTableRef = nil): Response = - ## `collections/list.json` for twitter user screen name - if additionalParams != nil: - additionalParams["screen_name"] = screenName - return get(twitter, "collections/list.json", additionalParams) - else: - return get(twitter, "collections/list.json", {"screen_name": screenName}.newStringTable) - - -proc collectionsShow*(twitter:TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = - ## `collections/show.json` endpoint - if additionalParams != nil: - additionalParams["id"] = id - return get(twitter, "collections/show.json", additionalParams) - else: - return get(twitter, "collections/show.json", {"id": id}.newStringTable) - - -proc collectionsCreate*(twitter:TwitterAPI, name: string, additionalParams: StringTableRef = nil): Response = - ## `collections/create.json` endpoint - if additionalParams != nil: - additionalParams["name"] = name - return post(twitter, "collections/create.json", additionalParams) - else: - return post(twitter, "collections/create.json", {"name": name}.newStringTable) - - -proc collectionsDestroy*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = - if additionalParams != nil: - additionalParams["id"] = id - return post(twitter, "collections/destroy.json", additionalParams) - else: - return post(twitter, "collections/destroy.json", {"id": id}.newStringTable) - - -proc collectionsEntriesAdd*(twitter: TwitterAPI, id: string, tweet_id: int, additionalParams: StringTableRef = nil): Response = - ## `collections/entries/add.json` endpoint - if additionalParams != nil: - additionalParams["id"] = id - additionalParams["tweet_id"] = $tweet_id - return post(twitter, "collections/entries/add.json", additionalParams) - else: - return post(twitter, "collections/entries/add.json", {"id": id, "tweet_id": $tweet_id}.newStringTable) - - -proc collectionsEntriesCurate*(twitter: TwitterAPI, jsonBody: JsonNode): Response = - ## `collections/entries/curate.json` endpoint - # This is honestly one of the worst parts of the API docs. I can't work out what it does. - return post(twitter, "collections/entries/curate.json", jsonBody) - - -proc collectionsEntriesMove*(twitter: TwitterAPI, id: string, tweet_id: int, relative_to: int, additionalParams: StringTableRef = nil): Response = - ## `collections/entries/move.json` endpoint - if additionalParams != nil: - additionalParams["id"] = id - additionalParams["tweet_id"] = $tweet_id - additionalParams["relative_to"] = $relative_to - return post(twitter, "collections/entries/move.json", additionalParams) - else: - return post(twitter, "collections/entries/move.json", {"id": id, "tweet_id": $tweet_id, "relative_to": $relative_to}.newStringTable) - - -proc collectionsEntriesRemove*(twitter: TwitterAPI, id: string, tweet_id: int, additionalParams: StringTableRef = nil): Response = - ## `collections/entries/remove.json` endpoint - if additionalParams != nil: - additionalParams["id"] = id - additionalParams["tweet_id"] = $tweet_id - return post(twitter, "collections/entries/remove.json", additionalParams) - else: - return post(twitter, "collections/entries/remove.json", {"id": id, "tweet_id": $tweet_id}.newStringTable) - - -proc collectionsUpdate*(twitter: TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = - ## `collections/update.json` endpoint - if additionalParams != nil: - additionalParams["id"] = id - return post(twitter, "collections/update.json", additionalParams) - else: - return post(twitter, "collections/update.json", {"id": id}.newStringTable) - - -# -------- -# statuses -# -------- - - -proc statusesFilter*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `statuses/filter.json` endpoint - return post(twitter, "statuses/filter.json", additionalParams) - - -proc statusesUserTimeline*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `statuses/user_timeline.json` endpoint - return get(twitter, "statuses/user_timeline.json", additionalParams) - - -proc statusesHomeTimeline*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `statuses/home_timeline.json` endpoint - return get(twitter, "statuses/home_timeline.json", additionalParams) - - -proc statusesMentionsTimeline*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `statuses/mentions_timeline.json` endpoint - return get(twitter, "statuses/mentions_timeline.json", additionalParams) - - -proc statusesLookup*(twitter: TwitterAPI, ids: string, additionalParams: StringTableRef = nil): Response = - ## `statuses/lookup.json` endpoint - ## - ## ids is a string of comma seperated tweet ids - if additionalParams != nil: - additionalParams["id"] = ids - return get(twitter, "statuses/lookup.json", additionalParams) - else: - return get(twitter, "statuses/lookup.json", {"id": ids}.newStringTable) - - -proc statusesOembed*(twitter: TwitterAPI, url: string, additionalParams: StringTableRef = nil): Response = - ## `oembed` endpoint - ## - ## Used for generating embeds from tweets, uses publish.twitter.com as a url - if additionalParams != nil: - additionalParams["url"] = url - return get(twitter, "statuses/retweeters/ids.json", additionalParams, publish=true) - else: - return get(twitter, "statuses/retweeters/ids.json", {"url": url}.newStringTable, publish=true) - - -proc statusesRetweetersIds*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `statuses/retweeters/ids.json` endpoint - if additionalParams != nil: - additionalParams["id"] = $id - return get(twitter, "statuses/retweeters/ids.json", additionalParams) - else: - return get(twitter, "statuses/retweeters/ids.json", {"id": $id}.newStringTable) - - -proc statusesRetweets*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `statuses/retweets/:id.json` endpoint - return get(twitter, "statuses/retweets/" & $id & ".json", additionalParams) - - -proc statusesRetweetsOfMe*(twitter: TwitterAPI, - additionalParams: StringTableRef = nil): Response = - ## `statuses/retweets_of_me.json` endpoint - return get(twitter, "statuses/retweets_of_me.json", additionalParams) - - -proc statusesShow*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `statuses/show.json` endpoint - if additionalParams != nil: - additionalParams["id"] = $id - return get(twitter, "statuses/show.json", additionalParams) - else: - return get(twitter, "statuses/show.json", {"id": $id}.newStringTable) - - -proc statusesDestroy*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `statuses/destroy/:id.json` endpoint - return post(twitter, "statuses/destroy/" & $id & ".json", additionalParams) - - -proc statusesRetweet*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `statuses/retweet/:id` endpoint - return post(twitter, "statuses/retweet/" & $id & ".json", additionalParams) - - -proc statusesUnretweet*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `statuses/unretweet/:id.json` endpoint - return post(twitter, "statuses/unretweet/" & $id & ".json", additionalParams) - - -proc statusesUpdate*(twitter: TwitterAPI, status: string, - additionalParams: StringTableRef = nil): Response = - ## `statuses/update.json` endpoint - if additionalParams != nil: - additionalParams["status"] = status - return post(twitter, "statuses/update.json", additionalParams) - else: - return post(twitter, "statuses/update.json", {"status": status}.newStringTable) - - -proc statusesSample*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `statuses/sample.json` endpoint - return get(twitter, "statuses/sample.json", additionalParams) - - -# --------- -# favorites -# --------- - - -proc favoritesList*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `favorites/list.json` endpoint - return get(twitter, "favorites/list.json", additionalParams) - - -proc favoritesCreate*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `favorites/create.json` endpoint - if additionalParams != nil: - additionalParams["id"] = $id - return post(twitter, "favorites/create.json", additionalParams) - else: - return post(twitter, "favorites/create.json", {"id": $id}.newStringTable) - - -proc favoritesDestroy*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `favorites/destroy.json` endpoint - if additionalParams != nil: - additionalParams["id"] = $id - return post(twitter, "favorites/destroy.json", additionalParams) - else: - return post(twitter, "favorites/destroy.json", {"id": $id}.newStringTable) - - -# ------ -# search -# ------ - - -proc searchTweets*(twitter:TwitterAPI, q: string, additionalParams: StringTableRef = nil): Response = - ## `search/tweets.json` endpoint - ## - ## Standard tier search endpoint - if additionalParams != nil: - additionalParams["q"] = q - return get(twitter, "search/tweets.json", additionalParams) - else: - return get(twitter, "search/tweets.json", {"q": q}.newStringTable) - - -# --------------- -# custom_profiles -# --------------- - - -proc customProfilesDestroy*(twitter:TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `custom_profiles/destroy.json` endpoint - if additionalParams != nil: - additionalParams["id"] = $id - return delete(twitter, "custom_profiles/destroy.json", additionalParams) - else: - return delete(twitter, "custom_profiles/destroy.json", {"id": $id}.newStringTable) - - -proc customProfilesId*(twitter:TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `custom_profiles/:id.json` endpoint - return get(twitter, "custom_profiles/" & $id & ".json", additionalParams) - - -proc customProfilesLists*(twitter:TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `custom_profiles/list.json` endpoint - return get(twitter, "custom_profiles/list.json", additionalParams) - - -proc customProfilesNew*(twitter:TwitterAPI, jsonBody: JsonNode): Response = - ## `custom_profiles/new.json` endpoint - return post(twitter, "custom_profiles/new.json", jsonBody) - - -# --------------- -# direct_messages -# --------------- - - -proc directMessagesEventsDestroy*(twitter: TwitterAPI, id: int, - additionalParams: StringTableRef = nil): Response = - ## `direct_messages/events/destroy.json` endpoint - if additionalParams != nil: - additionalParams["id"] = $id - return delete(twitter, "direct_messages/events/destroy.json", additionalParams) - else: - return delete(twitter, "direct_messages/events/destroy.json", {"id": $id}.newStringTable) - - -proc directMessagsEventsList*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `direct_messages/events/list.json` endpoint - return get(twitter, "direct_messages/events/list.json", additionalParams) - - -proc directMessagesEventsShow*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `direct_messages/events/show.json` endpoint - if additionalParams != nil: - additionalParams["id"] = $id - return get(twitter, "direct_messages/events/show.json", additionalParams) - else: - return get(twitter, "direct_messages/events/show.json", {"id": $id}.newStringTable) - - -proc directMessagesEventsNew*(twitter: TwitterAPI, jsonBody: JsonNode): Response = - ## `direct_messages/events/new.json` endpoint (message_create) - return post(twitter, "direct_messages/events/new.json", jsonBody) - - -proc directMessagesIndicateTyping*(twitter: TwitterAPI, jsonBody: JsonNode): Response = - ## `direct_messages/indicate_typing.json` endpoint - return post(twitter, "direct_messages/indicate_typing.json", jsonBody) - - -proc directMessagesMarkRead*(twitter: TwitterAPI, lastReadEventId: int, recipientId: int, additionalParams: StringTableRef = nil): Response = - ## `direct_messages/mark_read.json` endpoint - if additionalParams != nil: - additionalParams["last_read_event_id"] = $lastReadEventId - additionalParams["recipient_id"] = $recipientId - return post(twitter, "direct_messages/mark_read.json", additionalParams) - else: - return post(twitter, "direct_messages/mark_read.json", {"last_read_event_id": $lastReadEventId, "recipient_id": $recipientId}.newStringTable) - - -proc directMessagesWelcomeMessagesDestroy*(twitter: TwitterAPI, id: int, - additionalParams: StringTableRef = nil): Response = - ## `direct_messages/welcome_messages/destroy.json` endpoint - if additionalParams != nil: - additionalParams["id"] = $id - return delete(twitter, "direct_messages/welcome_messages/destroy.json", additionalParams) - else: - return delete(twitter, "direct_messages/welcome_messages/destroy.json", {"id": $id}.newStringTable) - - -proc directMessagesWelcomeMessagesRulesDestroy*(twitter: TwitterAPI, id: int, - additionalParams: StringTableRef = nil): Response = - ## `direct_messages/welcome_messages/rules/destroy.json` endpoint - if additionalParams != nil: - additionalParams["id"] = $id - return delete(twitter, "direct_messages/rules/welcome_messages/destroy.json", additionalParams) - else: - return delete(twitter, "direct_messages/rules/welcome_messages/destroy.json", {"id": $id}.newStringTable) - - -proc directMessagesWelcomeMessagesUpdate*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `direct_messages/welcome_messages/update.json` endpoint - if additionalParams != nil: - additionalParams["id"] = $id - return put(twitter, "direct_messages/welcome_messages/update.json", additionalParams) - else: - return put(twitter, "direct_messages/welcome_messages/update.json", {"id": $id}.newStringTable) - - -proc directMessagesWelcomeMessagesList*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `direct_messages/welcome_messages/list.json` endpoint - return get(twitter, "direct_messages/welcome_messages/list.json", additionalParams) - - -proc directMessagesWelcomeMessagesRulesList*(twitter: TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `direct_messages/welcome_messages/rules/list.json` endpoint - return get(twitter, "direct_messages/welcome_messages/rules/list.json", additionalParams) - - -proc directMessagesWelcomeMessagesRulesShow*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `direct_messages/welcome_messages/rules/show.json` endpoint - if additionalParams != nil: - additionalParams["id"] = $ id - return get(twitter, "direct_messages/welcome_messages/rules/show.json", additionalParams) - else: - return get(twitter, "direct_messages/welcome_messages/rules/show.json", {"id": $id}.newStringTable) - - -proc directMessagesWelcomeMessagesShow*(twitter: TwitterAPI, id: int, additionalParams: StringTableRef = nil): Response = - ## `direct_messages/welcome_messages/show.json` endpoint - if additionalParams != nil: - additionalParams["id"] = $ id - return get(twitter, "direct_messages/welcome_messages/show.json", additionalParams) - else: - return get(twitter, "direct_messages/welcome_messages/show.json", {"id": $id}.newStringTable) - - -proc directMessagesWelcomeMessagesNew*(twitter: TwitterAPI, jsonBody: JsonNode): Response = - ## `direct_messages/welcome_messages/new.json` endpoint - return post(twitter, "direct_messages/welcome_messages/new.json", jsonBody) - - -proc directMessagesWelcomeMessagesRulesNew*(twitter: TwitterAPI, jsonBody: JsonNode): Response = - ## `direct_messages/welcome_messages/rules/new.json` endpoint - return post(twitter, "direct_messages/welcome_messages/rules/new.json", jsonBody) - - -# ----- -# media -# ----- - -proc mediaUploadInit*(twitter: TwitterAPI, - mediaType: string, totalBytes: string, - additionalParams: StringTableRef = nil): Response = - ## `INIT` command for `media/upload.json` endpoint - ## - ## Docs: https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload-init - ## - ## `mediaType` should be the MIME type for the data you are sending. - ## - ## The response returned from this will contain a media_id field that you - ## need to provide to the other `mediaUpload` procs - if additionalParams != nil: - additionalParams["command"] = "INIT" - additionalParams["media_type"] = mediaType - additionalParams["total_bytes"] = totalBytes - return post(twitter, "media/upload.json", additionalParams, true) - else: - return post(twitter, "media/upload.json", {"command":"INIT", "media_type":mediaType, "total_bytes":totalBytes}.newStringTable, true) - - -proc mediaUploadAppend*(twitter: TwitterAPI, mediaId: string, segmentId: string, - data: string, additionalParams: StringTableRef = nil): Response = - ## `APPEND` command for `media/upload.json` endpoint - ## - ## Docs: https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload-append - ## - ## Appends a chunk of data to a media upload, can accept base64 or binary - if additionalParams != nil: - additionalParams["command"] = "APPEND" - additionalParams["media_id"] = mediaId - additionalParams["segment_index"] = segmentId - return post(twitter, "media/upload.json", additionalParams, true, data) - else: - return post(twitter, "media/upload.json", {"command":"APPEND", "media_id":mediaId, "segment_index":segmentId}.newStringTable, true, data) - - -proc mediaUploadStatus*(twitter: TwitterAPI, mediaId: string, - additionalParams: StringTableRef = nil): Response= - ## `STATUS` command for `media/upload.json` endpoint - ## - ## Docs: https://developer.twitter.com/en/docs/media/upload-media/api-reference/get-media-upload-status - ## - ## Used to check the processing status of an upload. This should only be run - ## when mediaUploadFinalize_ returns a `processing_info` field otherwise a - ## 404 will be generated - if additionalParams != nil: - additionalParams["command"] = "STATUS" - additionalParams["media_id"] = mediaId - return get(twitter, "media/upload.json", additionalParams, true) - else: - return get(twitter, "media/upload.json", {"command":"STATUS", "media_id":mediaId}.newStringTable, true) - - -proc mediaUploadFinalize*(twitter: TwitterAPI, mediaId: string, - additionalParams: StringTableRef = nil): Response= - ## `FINALIZE` command for `media/upload.json` endpoint - ## - ## Docs: https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload-finalize - ## - ## Used to tell twitter your upload is finished. Will return a response - ## with a `processing_info` field if further processing needs to be done use - ## mediaUploadStatus_ to poll until completion. - if additionalParams != nil: - additionalParams["command"] = "FINALIZE" - additionalParams["media_id"] = mediaId - return post(twitter, "media/upload.json", additionalParams, true) - else: - return post(twitter, "media/upload.json", {"command":"FINALIZE", "media_id":mediaId}.newStringTable, true) - - -proc mediaMetadataCreate*(twitter: TwitterAPI, jsonBody: JsonNode): Response = - ## `media/metadata/create.json` endpoint - ## - ## Docs: https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-metadata-create - return post(twitter, "media/metadata/create.json", jsonBody, media=true) - - -proc mediaSubtitlesCreate*(twitter: TwitterAPI, jsonBody: JsonNode): Response = - ## `media/subtitles/create.json` endpoint - ## - ## Docs: https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-subtitles-create - return post(twitter, "media/subtitles/create.json", jsonBody, media=true) - - -proc mediaSubtitlesDelete*(twitter: TwitterAPI, jsonBody: JsonNode): Response = - ## `media/subtitles/delete.json` endpoint - ## - ## Docs: https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-subtitles-create - return post(twitter, "media/subtitles/delete.json", jsonBody, media=true) - - -# ------ -# trends -# ------ - - -proc trendsAvailable*(twitter:TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `trends/available.json` endpoint - return get(twitter, "trends/available.json", additionalParams) - - -proc trendsClosest*(twitter:TwitterAPI, lat: float, lon: float, additionalParams: StringTableRef = nil): Response = - ## `trends/closest.json` endpoint - if additionalParams != nil: - additionalParams["lat"] = $ lat - additionalParams["lon"] = $ lon - return get(twitter, "trends/closest.json", additionalParams) - else: - return get(twitter, "trends/closest.json", {"lat": $lat, "lon": $lon}.newStringTable) - - -proc trendsPlace*(twitter:TwitterAPI, id: int32, additionalParams: StringTableRef = nil): Response = - ## `trends/place.json` endpoint - # id is explicitly int32 since it is Yahoo WOED which uses 32 bit ints - if additionalParams != nil: - additionalParams["id"] = $ id - return get(twitter, "trends/place.json", additionalParams) - else: - return get(twitter, "trends/place.json", {"id": $id}.newStringTable) - - -# --- -# geo -# --- - - -proc geoId*(twitter:TwitterAPI, id: string, additionalParams: StringTableRef = nil): Response = - ## `geo/id/:place_id.json` endpoint - return get(twitter, "geo/id/" & id & ".json", additionalParams) - - -proc geoReverseGeocode*(twitter:TwitterAPI, lat: float, lon: float, - additionalParams: StringTableRef = nil): Response = - ## `geo/reverse_geocode.json` endpoint - if additionalParams != nil: - additionalParams["lat"] = $ lat - additionalParams["lon"] = $ lon - return get(twitter, "geo/reverse_geocode.json", additionalParams) - else: - return get(twitter, "geo/reverse_geocode.json", {"lat": $lat, "lon": $lon}.newStringTable) - - -proc geoSearch*(twitter:TwitterAPI, additionalParams: StringTableRef = nil): Response = - ## `geo/search.json` endpoint - return get(twitter, "geo/search.json", additionalParams) - - -# -------- -# insights -# -------- - - -proc insightsEngagementTotals*(twitter: TwitterAPI, jsonBody: JsonNode): Response = - ## `insights/enagement/totals.json` endpoint - return post(twitter, "insights/enagement/totals.json", jsonBody) - - -proc insightsEngagementHistorical*(twitter: TwitterAPI, jsonBody: JsonNode): Response = - ## `insights/enagement/historical.json` endpoint - return post(twitter, "insights/enagement/historical.json", jsonBody) - - -proc insightsEngagement28h*(twitter: TwitterAPI, jsonBody: JsonNode): Response = - ## `insights/enagement/28h.json` endpoint - return post(twitter, "insights/enagement/28h.json", jsonBody) - - -# ------- -# utility -# ------- -# General-use functions that might be useful without being too compicated - -proc uploadFile*(twitter: TwitterAPI, filename: string, - mediaType: string, additionalParams: StringTableRef = nil): Response = - ## Upload a file from a filename - ## - ## mediaType takes these arguments: `amplify_video, tweet_gif, tweet_image, tweet_video` - # This is a bit 'higher level' than the rest but IMO is routine enough and simple enough to make it useful - var ubody = additionalParams - ubody["media_type"] = mediaType - let data = $ readFile(filename) - return post(twitter, "media/upload.json", ubody, true, data) - - -template callAPI*(twitter: TwitterAPI, api: untyped, - additionalParams: StringTableRef = nil): untyped = - ## Template to callAPI - ## - ## Example: - ## ```nim - ## var testStatus = {"status": "test"}.newStringTable - ## var resp = twitterAPI.callAPI(statusesUpdate, testStatus)``` - api(twitter, additionalParams) - - -when isMainModule: - import unittest - - suite "test for encodeUrl": - # https://dev.twitter.com/oauth/overview/percent-encoding-parameters - test "examples from twitter's percent-encoding parameters.": - check(encodeUrl("Ladies + Gentlemen") == "Ladies%20%2B%20Gentlemen") - check(encodeUrl("An encoded string!") == "An%20encoded%20string%21") - check(encodeUrl("Dogs, Cats & Mice") == "Dogs%2C%20Cats%20%26%20Mice") - check(encodeUrl("☃") == "%E2%98%83") - - suite "test for hmacSha1": - # https://dev.twitter.com/oauth/overview/creating-signatures - test "test for hmacSha1 function.": - check(encode(hmac_sha1("kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE", - "POST&https%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fupdate.json&include_entities%3Dtrue%26oauth_consumer_key%3Dxvz1evFS4wEEPTGEFPHBog%26oauth_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1318622958%26oauth_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb%26oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521")) == "tnnArxj06cWHq44gCs1OSKk/jLY=") diff --git a/twitter.nimble b/twitter.nimble index f5d6130..2186c0e 100644 --- a/twitter.nimble +++ b/twitter.nimble @@ -1,5 +1,5 @@ # Package -version = "1.0.1" +version = "2.0.0" author = "snus-kin" description = "A twitter API wrapper for Nim." srcDir = "src"