Files
jakub 6a667d8deb Capture current mission, AI, map and administration development
Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
2026-10-13 22:52:53 +02:00

110 lines
4.9 KiB
C

class EWAParams : PageParams
{
string search;
override void OnPack()
{
StoreString("search", search);
StoreString("orderBy", "name"); StoreString("orderDirection", "asc");
StoreBoolean("reported", false); StoreBoolean("hidden", false);
}
}
class EWAReader
{
ref array<string> queries = {""};
ref map<string, ref WorkshopItem> catalogue = new map<string, ref WorkshopItem>();
int index, offset;
WorkshopApi api;
ref BackendCallback callback;
ref EWAParams params;
void Start()
{
api = GetGame().GetBackendApi().GetWorkshop();
callback = new BackendCallback(); callback.SetOnSuccess(Success); callback.SetOnError(Error);
Next();
}
void Next()
{
if (index >= queries.Count()) { StartDetails(); return; }
params = new EWAParams(); params.search = queries[index]; params.limit = Math.Min(50, api.MaxPageSize()); params.offset = offset;
api.SetPageSize(params.limit);
PrintFormat("EWA QUERY|%1|offset=%2", params.search, offset);
api.RequestPage(callback, params, true);
}
void Success()
{
array<WorkshopItem> items = {}; api.GetPageItems(items);
PrintFormat("EWA RESULT|%1|total=%2|returned=%3", params.search, api.GetTotalItemCount(), items.Count());
foreach (WorkshopItem item : items)
{
catalogue.Set(item.Id(), item);
Revision r = item.GetLatestRevision();
if (r) PrintFormat("EWA ITEM|%1|%2|%3|%4|game=%5|availability=%6|env=%7", params.search, item.Id(), item.Name(), r.GetVersion(), r.GetGameVersion(), r.GetAvailability(), r.GetBackendEnv());
else PrintFormat("EWA ITEM|%1|%2|%3|no revision|env=%4", params.search, item.Id(), item.Name(), item.GetBackendEnv());
}
offset += items.Count();
if (items.Count() == 0 || offset >= api.GetTotalItemCount() || offset >= 10000) { offset = 0; index++; }
GetGame().GetCallqueue().CallLater(Next, 700, false);
}
ref array<string> detailIds = {"60C4E0B49618CC62", "6503091A7B264FC3", "BFC890A6F1603EC0", "69BAEE0D439966FE", "62D442CE4BF95641", "2528466DE220D91C", "656514EAA451A2B2", "64D5438A385B978C", "690F2562DCF58542", "70C981A53E02B64F", "60612C225328522E", "64DE57C0A1601D14", "665D1AA55B5D8076", "595F2BF2F44836FB", "629B2BA37EFFD577", "5E524E4FEECCA92B", "65930CB4CD0237B2", "65AD7BE594439A52", "62C33B60BB2FACA8"};
ref array<string> detailSeen = {};
int detailIndex;
WorkshopItem detailItem;
ref BackendCallback detailCallback, depCallback;
void StartDetails()
{
detailCallback = new BackendCallback(); detailCallback.SetOnSuccess(DetailSuccess); detailCallback.SetOnError(DetailError);
depCallback = new BackendCallback(); depCallback.SetOnSuccess(DepsSuccess); depCallback.SetOnError(DepsError);
NextDetail();
}
void NextDetail()
{
if (detailIndex >= detailIds.Count() || detailIndex >= 200) { Print("EWA COMPLETE"); return; }
string id = detailIds[detailIndex++];
if (detailSeen.Contains(id)) { GetGame().GetCallqueue().CallLater(NextDetail, 10, false); return; }
detailSeen.Insert(id);
detailItem = catalogue.Get(id);
if (!detailItem) detailItem = api.FindItem(id);
if (!detailItem) { PrintFormat("EWA MISSING|%1", id); GetGame().GetCallqueue().CallLater(NextDetail, 10, false); return; }
detailItem.AskDetail(detailCallback);
}
void DetailSuccess()
{
Revision r = detailItem.GetLatestRevision();
if (!r) { PrintFormat("EWA NOREVISION|%1|%2", detailItem.Id(), detailItem.Name()); GetGame().GetCallqueue().CallLater(NextDetail, 200, false); return; }
PrintFormat("EWA DETAIL|%1|%2|%3|game=%4|availability=%5|env=%6", detailItem.Id(), detailItem.Name(), r.GetVersion(), r.GetGameVersion(), r.GetAvailability(), r.GetBackendEnv());
r.LoadDependencies(depCallback);
}
void DepsSuccess()
{
array<WorkshopItem> deps = {};
detailItem.GetLatestRevision().GetDependencies(deps);
foreach (WorkshopItem dep : deps)
{
PrintFormat("EWA DEP|%1|%2|%3", detailItem.Id(), dep.Id(), dep.Name());
if (!detailIds.Contains(dep.Id())) detailIds.Insert(dep.Id());
}
GetGame().GetCallqueue().CallLater(NextDetail, 200, false);
}
void DetailError(BackendCallback cb) { PrintFormat("EWA DETAILERROR|%1|http=%2|api=%3", detailItem.Id(), cb.GetHttpCode(), cb.GetApiCode()); GetGame().GetCallqueue().CallLater(NextDetail, 500, false); }
void DepsError(BackendCallback cb) { PrintFormat("EWA DEPERROR|%1|http=%2|api=%3", detailItem.Id(), cb.GetHttpCode(), cb.GetApiCode()); GetGame().GetCallqueue().CallLater(NextDetail, 500, false); }
void Error(BackendCallback cb)
{
PrintFormat("EWA ERROR|%1|http=%2|api=%3", params.search, cb.GetHttpCode(), cb.GetApiCode());
index++; offset = 0; GetGame().GetCallqueue().CallLater(Next, 1500, false);
}
}
modded class ArmaReforgerScripted
{
ref EWAReader ewa;
float ewaTime;
override void OnUpdate(BaseWorld world, float timeslice)
{
super.OnUpdate(world, timeslice);
if (ewa) return;
ewaTime += timeslice;
if (ewaTime < 15 || !BackendAuthenticatorApi.IsAuthenticated()) return;
Print("EWA START authenticated experimental client");
ewa = new EWAReader(); ewa.Start();
}
}