Packages
Robust API call planning and execution for Torn City
Current section
Files
Jump to
Current section
Files
lib/query.ex
# Copyright 2024-2025 tiksan
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
defmodule Tornex.Query do
@moduledoc """
The query struct containing API request data.
The `Tornex.Query` struct is utilized by `Tornex.API.torn_get/1` and `Tornex.Scheduler.Bucket.enqueue/1` to make API calls. The struct stores the required information to perform the API call.
"""
defstruct [
:resource,
:resource_id,
:key,
:selections,
:from,
:to,
:timestamp,
:limit,
:sort,
:params,
# Values required for the scheduler
:key_owner,
:nice,
:origin
]
@type t :: %__MODULE__{
resource: String.t(),
resource_id: integer() | String.t(),
key: String.t(),
selections: [String.t()] | nil,
from: integer() | nil,
to: integer() | nil,
timestamp: integer() | nil,
limit: integer() | nil,
sort: :asc | :desc | nil,
params: Keyword | nil,
# Values required for the scheduler
key_owner: integer(),
nice: integer(),
origin: GenServer.from() | nil
}
@doc """
Determines the priority of a `Tornex.Query` by the `nice` value as a priority "bucket" atom.
The nice value of a query is based on the Linux niceness value between -20 and 19. A niceness of -20 is the highest priority request and 19 is the lowest priority. For more information on the scheduling of requests against `Tornex.Query`, see `Tornex.Scheduler.Bucket`.
There are three priority buckets:
- generic requests (nice > 0) => Requests that are intended to be made with as much latency as needed
- high priority requests (-10 < nice <= 0) => Requests where latency matters
- user requests (nice <= -10) => Requests that should be performed immediately, typically initiated by a user action
"""
@spec query_priority(Tornex.Query.t()) :: :user_request | :high_priority | :generic_request
def query_priority(%Tornex.Query{} = query) do
cond do
query.nice <= -10 -> :user_request
query.nice <= 0 -> :high_priority
true -> :generic_request
end
end
end