Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions native/events.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ EVENT_DECL( P2PSessionConnectionFail, P2PSessionConnectFail_t )
// ugc
EVENT_DECL(DownloadItem, DownloadItemResult_t)
EVENT_DECL(ItemInstalled, ItemInstalled_t)
EVENT_DECL(SubscribedItemsListChanged, UserSubscribedItemsListChanged_t)

// -------------- OLD EVENTS -----------------------
#ifndef GLOBAL_EVENTS
Expand Down
65 changes: 52 additions & 13 deletions native/ugc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,25 @@

vdynamic *CallbackHandler::EncodeDownloadItem(DownloadItemResult_t *d) {
HLValue v;
v.Set("appId", d->m_unAppID);
v.Set("file", d->m_nPublishedFileId);
v.Set("result", (int)d->m_eResult);
return v.value;
}

vdynamic *CallbackHandler::EncodeItemInstalled(ItemInstalled_t *d) {
HLValue v;
v.Set("appId", d->m_unAppID);
v.Set("file", d->m_nPublishedFileId);
return v.value;
}

vdynamic *CallbackHandler::EncodeSubscribedItemsListChanged(UserSubscribedItemsListChanged_t *d) {
HLValue v;
v.Set("appId", d->m_nAppID);
return v.value;
}

HL_PRIM varray *HL_NAME(get_subscribed_items)(){
if (!CheckInit()) return NULL;

Expand Down Expand Up @@ -167,6 +176,35 @@ HL_PRIM CClosureCallResult<GetAppDependenciesResult_t>* HL_NAME(get_app_dependen
return m_call;
}

HL_PRIM void HL_NAME(start_playtime_tracking)(varray *fileIDs){
if (!CheckInit()) return;

PublishedFileId_t * pvecPublishedFileID = new PublishedFileId_t[fileIDs->size];
vuid *ids = hl_aptr(fileIDs, vuid);
for (int i = 0; i < fileIDs->size; i++)
pvecPublishedFileID[i] = ids[i] ? hl_to_uint64(ids[i]) : 0;

SteamAPICall_t result = SteamUGC()->StartPlaytimeTracking(pvecPublishedFileID, fileIDs->size);
delete[] pvecPublishedFileID;
}

HL_PRIM void HL_NAME(stop_playtime_tracking)(varray *fileIDs){
if (!CheckInit()) return;

PublishedFileId_t * pvecPublishedFileID = new PublishedFileId_t[fileIDs->size];
vuid *ids = hl_aptr(fileIDs, vuid);
for (int i = 0; i < fileIDs->size; i++)
pvecPublishedFileID[i] = ids[i] ? hl_to_uint64(ids[i]) : 0;

SteamAPICall_t result = SteamUGC()->StopPlaytimeTracking(pvecPublishedFileID, fileIDs->size);
delete[] pvecPublishedFileID;
}

HL_PRIM void HL_NAME(stop_playtime_tracking_for_all_items)(){
if (!CheckInit()) return;
SteamAPICall_t result = SteamUGC()->StopPlaytimeTrackingForAllItems();
}

DEFINE_PRIM(_ARR, get_subscribed_items, _NO_ARG);
DEFINE_PRIM(_I32, get_item_state, _UID);
DEFINE_PRIM(_BOOL, get_item_download_info, _UID _REF(_F64) _REF(_F64));
Expand All @@ -178,6 +216,9 @@ DEFINE_PRIM(_CRESULT, delete_item, _UID _CALLB(_I32));
DEFINE_PRIM(_CRESULT, add_app_dependency, _UID _I32 _CALLB(_I32));
DEFINE_PRIM(_CRESULT, remove_app_dependency, _UID _I32 _CALLB(_I32));
DEFINE_PRIM(_CRESULT, get_app_dependencies, _UID _CALLB(_DYN));
DEFINE_PRIM(_VOID, start_playtime_tracking, _ARR);
DEFINE_PRIM(_VOID, stop_playtime_tracking, _ARR);
DEFINE_PRIM(_VOID, stop_playtime_tracking_for_all_items, _NO_ARG);

//-----------------------------------------------------------------------------------------------------------
// UGC QUERY
Expand Down Expand Up @@ -403,6 +444,7 @@ static void on_item_created(vclosure *c, CreateItemResult_t *result, bool error)
HLValue v;
v.Set("id", result->m_nPublishedFileId);
v.Set("userNeedsLegalAgreement", result->m_bUserNeedsToAcceptWorkshopLegalAgreement);
v.Set("result", result->m_eResult);
dyn_call_result(c, v.value, error);
}
else {
Expand All @@ -424,18 +466,15 @@ HL_PRIM vuid HL_NAME(ugc_item_start_update)(int id, vuid itemID) {
}

static void on_item_updated(vclosure *c, SubmitItemUpdateResult_t *result, bool error) {
if (!error && result->m_eResult == k_EResultOK) {
vdynamic d;
d.t = &hlt_bool;
d.v.b = result->m_bUserNeedsToAcceptWorkshopLegalAgreement;
dyn_call_result(c, &d, error);
}
else {
vdynamic d;
d.t = &hlt_i32;
d.v.i = result->m_eResult;
dyn_call_result(c, &d, true);
}
HLValue v;

v.Set("userNeedsLegalAgreement", result->m_bUserNeedsToAcceptWorkshopLegalAgreement);
v.Set("result", result->m_eResult);

if (!error && result->m_eResult != k_EResultOK)
error = true;

dyn_call_result(c, v.value, error);
}

HL_PRIM CClosureCallResult<SubmitItemUpdateResult_t>* HL_NAME(ugc_item_submit_update)(vuid updateHandle, vbyte *changeNotes, vclosure *closure){
Expand Down Expand Up @@ -503,7 +542,7 @@ HL_PRIM bool HL_NAME(ugc_item_set_preview_image)(vuid updateHandle, vbyte *path)

DEFINE_PRIM(_CRESULT, ugc_item_create, _I32 _CALLB(_DYN));
DEFINE_PRIM(_UID, ugc_item_start_update, _I32 _UID);
DEFINE_PRIM(_CRESULT, ugc_item_submit_update, _UID _BYTES _CALLB(_BOOL));
DEFINE_PRIM(_CRESULT, ugc_item_submit_update, _UID _BYTES _CALLB(_DYN));
DEFINE_PRIM(_BOOL, ugc_item_set_update_language, _UID _BYTES);
DEFINE_PRIM(_BOOL, ugc_item_set_title, _UID _BYTES);
DEFINE_PRIM(_BOOL, ugc_item_set_description, _UID _BYTES);
Expand Down
57 changes: 49 additions & 8 deletions steam/ugc/Item.hx
Original file line number Diff line number Diff line change
Expand Up @@ -14,39 +14,53 @@ enum ItemState {
class Item {

public var id : UID;
public static var downloadedCallbacks = new Array<Item->Void>();
public static var downloadedCallbacks = new Array<Item->Int->Void>();
public static var installedCallbacks = new Array<Item->Void>();
public static dynamic function subscribedItemsListChanged() {}

public static function fromInt( i : Int ){
var b = haxe.io.Bytes.alloc(8);
b.setInt32(0, i);
return new Item(steam.UID.fromBytes(b));
}

public static function init( onDownloaded : Item -> Void, onInstalled : Item -> Void ){
public static function init( onDownloaded : ( item:Item, result:Int ) -> Void, onInstalled : Item -> Void ){
downloadedCallbacks.push(onDownloaded);
installedCallbacks.push(onInstalled);
Api.registerGlobalEvent(3400 + 6, function(data:{file:UID}){
Api.registerGlobalEvent(3400 + 6, function(data:{appId:Int, file:UID, result:Int}){
if (data.appId != Api.appId)
return;

var item = new Item(data.file);
for( callback in downloadedCallbacks ){
callback(item);
callback(item, data.result);
}
});
Api.registerGlobalEvent(3400 + 5, function(data:{file:UID}){
Api.registerGlobalEvent(3400 + 5, function(data:{appId:Int, file:UID}){
if (data.appId != Api.appId)
return;

var item = new Item(data.file);
for( callback in installedCallbacks ){
callback(item);
}
});

Api.registerGlobalEvent(3400 + 18, function(data:{appId:Int}){
if (data.appId != Api.appId)
return;

subscribedItemsListChanged();
});
}

public static function create( appId : Int, cb : Null<Item> -> Bool -> Void ){
public static function create( appId : Int, cb : ( id:Null<Item>, needsAgreement:Bool, result:Int ) -> Void ){
ugc_item_create(appId,function(obj, error){
if( error ){
cb(null,false);
cb(null, false, obj.result);
return;
}
cb(new Item(obj.id), obj.userNeedsLegalAgreement);
cb(new Item(obj.id), obj.userNeedsLegalAgreement, obj.result);
});
}

Expand All @@ -55,6 +69,24 @@ class Item {
return a == null ? null : [for( it in a ) new Item(it)];
}

public static function startPlaytimeTracking(ids:Array<Item>) {
var a = new hl.NativeArray(ids.length);
for( i in 0...ids.length )
a[i] = ids[i].id;
start_playtime_tracking(a);
}

public static function stopPlaytimeTracking(ids:Array<Item>) {
var a = new hl.NativeArray(ids.length);
for( i in 0...ids.length )
a[i] = ids[i].id;
stop_playtime_tracking(a);
}

public static function stopPlaytimeTrackingForAllItems() {
stop_playtime_tracking_for_all_items();
}

inline function new( b : UID ){
id = b;
}
Expand Down Expand Up @@ -168,5 +200,14 @@ class Item {
return null;
}

static function start_playtime_tracking( ids : hl.NativeArray<UID> ) : Void {
}

static function stop_playtime_tracking( ids : hl.NativeArray<UID> ) : Void {
}

static function stop_playtime_tracking_for_all_items() : Void {
}

}

6 changes: 3 additions & 3 deletions steam/ugc/ItemUpdate.hx
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ class ItemUpdate {
id = updId;
}

public function submit( notes : String, cb : Bool -> Dynamic -> Void ){
return ugc_item_submit_update(id,notes == null ? null : @:privateAccess notes.toUtf8(), function(needsAgreement,error) cb(!error,needsAgreement));
public function submit( notes : String, cb : ( success:Bool, needsAgreement:Bool, result:Int ) -> Void ){
return ugc_item_submit_update(id,notes == null ? null : @:privateAccess notes.toUtf8(), function(v:Dynamic,error) cb(!error,v.needsAgreement,v.result));
}

public function setUpdateLanguage( lang : String ){
Expand Down Expand Up @@ -66,7 +66,7 @@ class ItemUpdate {
// -- native

static function ugc_item_start_update( appId : Int, itemId : UID ) : UID { return null; }
static function ugc_item_submit_update( updId : UID, notes : hl.Bytes, cb : Callback<Bool> ) : AsyncCall { return null; }
static function ugc_item_submit_update( updId : UID, notes : hl.Bytes, cb : Callback<Dynamic> ) : AsyncCall { return null; }
static function ugc_item_set_update_language( updId : UID, lang : hl.Bytes ) : Bool { return false; }
static function ugc_item_set_title( updId : UID, title : hl.Bytes ) : Bool { return false; }
static function ugc_item_set_description( updId : UID, desc : hl.Bytes ) : Bool { return false; }
Expand Down