summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/twitch/client.cr27
-rw-r--r--src/twitch/mappings/converters.cr3
-rw-r--r--src/twitch/mappings/user.cr21
-rw-r--r--src/twitch/rest.cr50
-rw-r--r--src/twitcr.cr6
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