diff options
author | Jonathan B <greenbigfrog@gmail.com> | 2019-08-14 21:25:02 +0200 |
---|---|---|
committer | Jonathan B <greenbigfrog@gmail.com> | 2019-08-14 21:25:02 +0200 |
commit | 99b3d7287bd0ac36ee82129ad38bd88c5b5af625 (patch) | |
tree | 461ba1e96425d62a60d4fdb1fd9d892264b146f2 /src | |
download | twitcr-99b3d7287bd0ac36ee82129ad38bd88c5b5af625.tar.gz twitcr-99b3d7287bd0ac36ee82129ad38bd88c5b5af625.zip |
Initial release
Diffstat (limited to 'src')
-rw-r--r-- | src/twitch/client.cr | 27 | ||||
-rw-r--r-- | src/twitch/mappings/converters.cr | 3 | ||||
-rw-r--r-- | src/twitch/mappings/user.cr | 21 | ||||
-rw-r--r-- | src/twitch/rest.cr | 50 | ||||
-rw-r--r-- | src/twitcr.cr | 6 |
5 files changed, 107 insertions, 0 deletions
diff --git a/src/twitch/client.cr b/src/twitch/client.cr new file mode 100644 index 0000000..8502b90 --- /dev/null +++ b/src/twitch/client.cr @@ -0,0 +1,27 @@ +require "./rest" +require "./mappings/*" + +module Twitcr::Client + include REST + + getter token : String + getter client_id : String + + def initialize(@token, @client_id) + @token = "Bearer" + @token + end + + def user?(name : String) + true if get_user_by_login(name) + rescue EMPTY_RESULT + false + end + + def user(name : String) + get_user_by_login(name) + end + + def user(id : Int64) + get_user_by_id(id) + end +end diff --git a/src/twitch/mappings/converters.cr b/src/twitch/mappings/converters.cr new file mode 100644 index 0000000..d9b57e9 --- /dev/null +++ b/src/twitch/mappings/converters.cr @@ -0,0 +1,3 @@ +module Twitcr + TIME_FORMAT = Time::Format.new("%FT%TZ") +end diff --git a/src/twitch/mappings/user.cr b/src/twitch/mappings/user.cr new file mode 100644 index 0000000..6ddd08b --- /dev/null +++ b/src/twitch/mappings/user.cr @@ -0,0 +1,21 @@ +require "./converters" + +module Twitcr + struct UserList + JSON.mapping({data: Array(User)}) + end + + struct User + JSON.mapping({ + id: {type: UInt64, converter: ID::Converter}, + login: String, + display_name: String, + }) + end +end + +module ID::Converter + def self.from_json(value : JSON::PullParser) : UInt64 + UInt64.new(value.read_string) + end +end diff --git a/src/twitch/rest.cr b/src/twitch/rest.cr new file mode 100644 index 0000000..1de8d6f --- /dev/null +++ b/src/twitch/rest.cr @@ -0,0 +1,50 @@ +require "http" +require "json" +require "./mappings/*" + +module Twitcr::REST + # Mixin for interacting with Twitch's REST API + SSL_CONTEXT = OpenSSL::SSL::Context::Client.new + API_BASE = "https://api.twitch.tv/helix" + + EMPTY_RESULT = Exception.new("Empty Result") + + # Executes an HTTP request against the API_BASE url + def request(method : String, route : String, version = "5", headers = HTTP::Headers.new, body : String? = nil) + headers["Authorization"] = @token + headers["Client-ID"] = @client_id + + response = HTTP::Client.exec( + method, + API_BASE + route, + headers, + tls: SSL_CONTEXT + ) + + response.body + end + + def get_user_by_login(login : String) + response = request( + "GET", + "/users?login=" + login + ) + + list = UserList.from_json(response) + raise EMPTY_RESULT if list.data.empty? + + list.data.first + end + + def get_user_by_id(id : Int64) + response = request( + "GET", + "/users?id=" + id.to_s + ) + + list = UserList.from_json(response) + raise EMPTY_RESULT if list.data.empty? + + list.data.first + end +end diff --git a/src/twitcr.cr b/src/twitcr.cr new file mode 100644 index 0000000..701653d --- /dev/null +++ b/src/twitcr.cr @@ -0,0 +1,6 @@ +# TODO: Write documentation for `Twitcr` +module Twitcr + VERSION = "0.1.0" + + # TODO: Put your code here +end |