On this page

HTTP, logs & players

Player proxies, cooldowns, structured logging, and HTTP clients.

Player helpers

wrapPlayer
local P = require("CrawlzUtils").wrapPlayer(pl)
P:notify("`2Hello!``", { bubble = true })

patchPlayer(player) — merges PlayerMethods via metatable when the runtime allows; otherwise prefer wrapPlayer.

Method (selection)Role
:message, :bubble, :overlay, :notifyFeedback
:plainName, :identity, :where, :tilePosInfo
:hasItem, :giveItem, :takeItem, :canAfford, :charge, :rewardEconomy
:openDialogOpen dialog
:action, :say, :dialogReturnActions
:disconnectWithMessageDisconnect
ReservedPlayerMethods

Names in ReservedPlayerMethods are never overridden by patchPlayer. See CrawlzUtils.lua for the full list.

Cooldown

Lua
local Utils = require("CrawlzUtils")
local cd = Utils.Cooldown.new("my_feature")
local ok, left = cd:check(pl, "jump", 5, true)
if not ok then
  Utils.wrapPlayer(pl):message("Wait " .. tostring(left) .. "s")
end
MethodRole
:remaining, :ready, :set, :clearTimer
:check, :touch, :peek, :sweepGate / cleanup

Logger

Lua
local Logger = require("CrawlzUtils").Logger
local log = Logger.new("Shop", { level = "info" })
log:info("tick")
log:child("Tax"):debug("detail")

Levels: tracefatal. Logger.setGlobalLevel("warn") applies to new loggers.

HttpClient

Lua
local HttpClient = require("CrawlzUtils").HttpClient
local Logger = require("CrawlzUtils").Logger
local log = Logger.new("http")

local http = HttpClient.new({ baseUrl = "https://api.example.com", timeout = 10, retries = 2 })
http:setHeader("X-Key", secret)
http:get("/v1/status", {}, function(res)
  if res.ok then log:info("ok") end
end)
http:postJson("/v1/event", { kind = "sale" }, {}, function(res) end)
http:discordWebhook(url, { content = "Hello" }, function() end)
MethodNote
:request, :get, :post, :put, :patch, :deleteHTTP verbs
:postJsonJSON body
:webhook, :discordWebhookHooks
:authBearer, :basicAuthAuth
Tip. options.sync = true blocks inside HttpClient. useCoroutine cooperates with scheduling (merged with defaults).