18 const auto found = std::ranges::find(_required,
id, &Requirement::Id);
19 if (
found != _required.end())
25 _required.push_back({.Id =
id, .Holders = 1});
32 const auto found = std::ranges::find(_required,
id, &Requirement::Id);
33 if (
found != _required.end() && --
found->Holders <= 0)
35 _required.erase(
found);
41 std::vector<uint64_t>
ids;
42 ids.reserve(_required.size());
50const DownloadQueue::Client* DownloadQueue::FindClient(
int64_t steamId)
const
53 return found != _clients.end() ? &
found->second :
nullptr;
86 return !_required.empty();
92 return std::ranges::any_of(_required,
missing);
163 if (
found == _clients.end())
176 if (!std::ranges::contains(
client.Downloaded,
client.Sending))
205 std::vector<std::string_view>
entries;
207 while (!
field.empty())
212 if (
comma == std::string_view::npos)
228 std::vector<uint64_t>
ids;
246 if (
id == 0 || std::ranges::contains(
named,
id) || std::ranges::contains(
appended,
id))
255 field += std::to_string(
id);
AddonDecision DecideJoinMessage(int64_t steamId, bool reconnect, std::string_view addons, double now, int maxAttempts)
bool HasMissing(int64_t steamId) const
void ClientReconnected(int64_t steamId, double now, double timeoutSec)
std::vector< uint64_t > ClientMountList(int64_t steamId) const
void MarkSending(int64_t steamId, uint64_t id, double now)
std::vector< uint64_t > Required() const
void ClientLeft(int64_t steamId, double now, double forgetAfterSec)
AddonDecision NextToSend(int64_t steamId, double now, int maxAttempts)
std::vector< uint64_t > MissingFor(int64_t steamId) const
static std::string ReadFile(const std::filesystem::path &path)
std::vector< uint64_t > AppendToAddonList(std::string &field, const std::vector< uint64_t > &ids)
std::optional< uint64_t > ParseUInt64(std::string_view text)
void RemoveFromAddonList(std::string &field, const std::vector< uint64_t > &ids)
std::vector< uint64_t > ParseAddonList(std::string_view field)
@ TrimToFirst
the message names several addons; keep only AddonDecision::Id
@ Kick
the client refused AddonDecision::Id too often
@ Send
point the client at AddonDecision::Id and wait for its reconnect
@ KeepMounted
a map change names no addon; name AddonDecision::Id so the client keeps it
static std::vector< std::string_view > SplitAddonList(std::string_view field)