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 queries = {""}; ref map catalogue = new map(); 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 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 detailIds = {"60C4E0B49618CC62", "6503091A7B264FC3", "BFC890A6F1603EC0", "69BAEE0D439966FE", "62D442CE4BF95641", "2528466DE220D91C", "656514EAA451A2B2", "64D5438A385B978C", "690F2562DCF58542", "70C981A53E02B64F", "60612C225328522E", "64DE57C0A1601D14", "665D1AA55B5D8076", "595F2BF2F44836FB", "629B2BA37EFFD577", "5E524E4FEECCA92B", "65930CB4CD0237B2", "65AD7BE594439A52", "62C33B60BB2FACA8"}; ref array 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 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(); } }