From 76fc9f7455c3444e446278a24c1ef9d4029fcb22 Mon Sep 17 00:00:00 2001 From: "Rachel Fae Fox (foxiepaws)" Date: Mon, 17 Feb 2020 04:30:14 -0500 Subject: [PATCH] Initial Commit --- .formatter.exs | 4 ++++ .gitignore | 26 ++++++++++++++++++++++++++ README.md | 21 +++++++++++++++++++++ config/config.exs | 31 +++++++++++++++++++++++++++++++ config/dev.exs | 2 ++ config/prod.exs | 2 ++ config/test.exs | 2 ++ lib/IRemoteStorage.ex | 38 ++++++++++++++++++++++++++++++++++++++ lib/SteamAPI.ex | 37 +++++++++++++++++++++++++++++++++++++ lib/steamwebapi.ex | 18 ++++++++++++++++++ mix.exs | 29 +++++++++++++++++++++++++++++ mix.lock | 13 +++++++++++++ test/steamwebapi_test.exs | 8 ++++++++ test/test_helper.exs | 1 + 14 files changed, 232 insertions(+) create mode 100644 .formatter.exs create mode 100644 .gitignore create mode 100644 README.md create mode 100644 config/config.exs create mode 100644 config/dev.exs create mode 100644 config/prod.exs create mode 100644 config/test.exs create mode 100644 lib/IRemoteStorage.ex create mode 100644 lib/SteamAPI.ex create mode 100644 lib/steamwebapi.ex create mode 100644 mix.exs create mode 100644 mix.lock create mode 100644 test/steamwebapi_test.exs create mode 100644 test/test_helper.exs diff --git a/.formatter.exs b/.formatter.exs new file mode 100644 index 0000000..d2cda26 --- /dev/null +++ b/.formatter.exs @@ -0,0 +1,4 @@ +# Used by "mix format" +[ + inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"] +] diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4d6a8be --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# The directory Mix will write compiled artifacts to. +/_build/ + +# If you run "mix test --cover", coverage assets end up here. +/cover/ + +# The directory Mix downloads your dependencies sources to. +/deps/ + +# Where third-party dependencies like ExDoc output generated docs. +/doc/ + +# Ignore .fetch files in case you like to edit your project deps locally. +/.fetch + +# If the VM crashes, it generates a dump, let's ignore it too. +erl_crash.dump + +# Also ignore archive artifacts (built via "mix archive.build"). +*.ez + +# Ignore package tarball (built via "mix hex.build"). +steamwebapi-*.tar + +# ignore secrets +/config/*.secret.exs diff --git a/README.md b/README.md new file mode 100644 index 0000000..806dd62 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +# Steamwebapi + +**TODO: Add description** + +## Installation + +If [available in Hex](https://hex.pm/docs/publish), the package can be installed +by adding `steamwebapi` to your list of dependencies in `mix.exs`: + +```elixir +def deps do + [ + {:steamwebapi, "~> 0.1.0"} + ] +end +``` + +Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc) +and published on [HexDocs](https://hexdocs.pm). Once published, the docs can +be found at [https://hexdocs.pm/steamwebapi](https://hexdocs.pm/steamwebapi). + diff --git a/config/config.exs b/config/config.exs new file mode 100644 index 0000000..122509d --- /dev/null +++ b/config/config.exs @@ -0,0 +1,31 @@ +# This file is responsible for configuring your application +# and its dependencies with the aid of the Mix.Config module. +use Mix.Config + +# This configuration is loaded before any dependency and is restricted +# to this project. If another project depends on this project, this +# file won't be loaded nor affect the parent project. For this reason, +# if you want to provide default values for your application for +# third-party users, it should be done in your "mix.exs" file. + +# You can configure your application as: +# +# config :steamwebapi, key: :value +# +# and access this configuration in your application as: +# +# Application.get_env(:steamwebapi, :key) +# +# You can also configure a third-party app: +# +# config :logger, level: :info +# + +# It is also possible to import configuration files, relative to this +# directory. For example, you can emulate configuration per environment +# by uncommenting the line below and defining dev.exs, test.exs and such. +# Configuration from the imported file will override the ones defined +# here (which is why it is important to import them last). +# +import_config "#{Mix.env()}.exs" +import_config "#{Mix.env()}.secret.exs" diff --git a/config/dev.exs b/config/dev.exs new file mode 100644 index 0000000..e3c2728 --- /dev/null +++ b/config/dev.exs @@ -0,0 +1,2 @@ +use Mix.Config +config :tesla, :adapter, Tesla.Adapter.Hackney diff --git a/config/prod.exs b/config/prod.exs new file mode 100644 index 0000000..e3c2728 --- /dev/null +++ b/config/prod.exs @@ -0,0 +1,2 @@ +use Mix.Config +config :tesla, :adapter, Tesla.Adapter.Hackney diff --git a/config/test.exs b/config/test.exs new file mode 100644 index 0000000..78a4ca8 --- /dev/null +++ b/config/test.exs @@ -0,0 +1,2 @@ +use Mix.Config +config :tesla, :adapter, Tesla.Adapter.Mock diff --git a/lib/IRemoteStorage.ex b/lib/IRemoteStorage.ex new file mode 100644 index 0000000..1c00b7b --- /dev/null +++ b/lib/IRemoteStorage.ex @@ -0,0 +1,38 @@ +defmodule IRemoteStorage do + use Tesla + + plug(SteamAPI, "ISteamRemoteStorage") + plug(Tesla.Middleware.FormUrlencoded) + + def _helper(c, i) do + num = Enum.count(i) + + m = + i + |> Enum.with_index() + |> Enum.map(fn {x, y} -> + %{"publishedfileids[#{y}]" => x} + end) + |> Enum.reduce(fn x, xs -> + Map.merge(x, xs) + end) + + Map.merge(%{"#{c}count" => num}, m) + end + + def collection(collections) do + vars = _helper("collection", collections) + + if {:ok, response} = post("GetCollectionDetails/v1", vars) do + Jason.decode(response.body) + end + end + + def item(items) do + vars = _helper("item", items) + + if {:ok, response} = post("GetPublishedFileDetails/v1", vars) do + Jason.decode(response.body) + end + end +end diff --git a/lib/SteamAPI.ex b/lib/SteamAPI.ex new file mode 100644 index 0000000..fbb106c --- /dev/null +++ b/lib/SteamAPI.ex @@ -0,0 +1,37 @@ +defmodule SteamAPI do + @behaviour Tesla.Middleware + # steam API helper, based off baseurl and query + + @impl Tesla.Middleware + def call(env, next, interface) do + env + |> apply_base(interface) + |> apply_base("https://api.steampowered.com") + |> merge(key: Application.fetch_env!(:steamwebapi, :token)) + |> Tesla.run(next) + end + + defp apply_base(env, base) do + if Regex.match?(~r/^https?:\/\//i, env.url) do + # skip if url is already with scheme + env + else + %{env | url: join(base, env.url)} + end + end + + defp merge(env, query) do + Map.update!(env, :query, &(&1 ++ query)) + end + + defp join(base, url) do + case {String.last(to_string(base)), url} do + {nil, url} -> url + {"/", "/" <> rest} -> base <> rest + {"/", rest} -> base <> rest + {_, ""} -> base + {_, "/" <> rest} -> base <> "/" <> rest + {_, rest} -> base <> "/" <> rest + end + end +end diff --git a/lib/steamwebapi.ex b/lib/steamwebapi.ex new file mode 100644 index 0000000..3f73f1e --- /dev/null +++ b/lib/steamwebapi.ex @@ -0,0 +1,18 @@ +defmodule Steamwebapi do + @moduledoc """ + Documentation for Steamwebapi. + """ + + @doc """ + Hello world. + + ## Examples + + iex> Steamwebapi.hello() + :world + + """ + def hello do + :world + end +end diff --git a/mix.exs b/mix.exs new file mode 100644 index 0000000..aa6a15c --- /dev/null +++ b/mix.exs @@ -0,0 +1,29 @@ +defmodule Steamwebapi.MixProject do + use Mix.Project + + def project do + [ + app: :steamwebapi, + version: "0.1.0", + elixir: "~> 1.8", + start_permanent: Mix.env() == :prod, + deps: deps() + ] + end + + # Run "mix help compile.app" to learn about applications. + def application do + [ + extra_applications: [:logger] + ] + end + + # Run "mix help deps" to learn about dependencies. + defp deps do + [ + {:tesla, "~> 1.3.0"}, + {:hackney, "~> 1.15.2"}, + {:jason, ">= 1.0.0"} + ] + end +end diff --git a/mix.lock b/mix.lock new file mode 100644 index 0000000..487f22b --- /dev/null +++ b/mix.lock @@ -0,0 +1,13 @@ +%{ + "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, + "hackney": {:hex, :hackney, "1.15.2", "07e33c794f8f8964ee86cebec1a8ed88db5070e52e904b8f12209773c1036085", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.5", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"}, + "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, + "jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"}, + "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"}, + "mime": {:hex, :mime, "1.3.1", "30ce04ab3175b6ad0bdce0035cba77bba68b813d523d1aac73d9781b4d193cf8", [:mix], [], "hexpm"}, + "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm"}, + "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm"}, + "tesla": {:hex, :tesla, "1.3.2", "deb92c5c9ce35e747a395ba413ca78593a4f75bf0e1545630ee2e3d34264021e", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.3", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm"}, +} diff --git a/test/steamwebapi_test.exs b/test/steamwebapi_test.exs new file mode 100644 index 0000000..60c75ca --- /dev/null +++ b/test/steamwebapi_test.exs @@ -0,0 +1,8 @@ +defmodule SteamwebapiTest do + use ExUnit.Case + doctest Steamwebapi + + test "greets the world" do + assert Steamwebapi.hello() == :world + end +end diff --git a/test/test_helper.exs b/test/test_helper.exs new file mode 100644 index 0000000..869559e --- /dev/null +++ b/test/test_helper.exs @@ -0,0 +1 @@ +ExUnit.start()