Skip to content

Commit 66b19ff

Browse files
committed
Expand Steamworks parity bindings
1 parent 6cd8cbb commit 66b19ff

34 files changed

Lines changed: 5354 additions & 168 deletions

CHECKLIST.md

Lines changed: 126 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
- [x] `greenworks.getCurrentUILanguage()`
1515
- [x] `greenworks.getCurrentGameInstallDir()`
1616
- [x] `greenworks.getAppInstallDir(appId, buffer, buffer_size)`
17-
- [ ] `greenworks.getNumberOfPlayers(success_callback, [error_callback])`
17+
- [x] `greenworks.getNumberOfPlayers(success_callback, [error_callback])`
1818
- [x] `greenworks.activateGameOverlay(option)`
1919
- [x] `game-overlay-activated` event
2020
- [x] `greenworks.activateGameOverlayToWebPage(url)`
@@ -45,18 +45,18 @@
4545
## Authentication
4646

4747
- [x] `greenworks.getAuthSessionTicket(success_callback, [error_callback])`
48-
- [ ] `greenworks.getAuthSessionTicketForWebAPI(identity, success_callback, [error_callback])`
48+
- [x] `greenworks.getAuthSessionTicketForWebAPI(identity, success_callback, [error_callback])`
4949
- [x] `greenworks.cancelAuthTicket(ticket_handle)`
50-
- [ ] `greenworks.beginAuthSessionAsUser(ticket, steam_id)`
51-
- [ ] `greenworks.endAuthSessionAsUser(steam_id)`
52-
- [ ] `greenworks.getEncryptedAppTicket(user_data, success_callback, [error_callback])`
53-
- [ ] `greenworks.decryptAppTicket(encrypted_ticket, decryption_key)`
54-
- [ ] `greenworks.isTicketForApp(decrypted_ticket, app_id)`
55-
- [ ] `greenworks.getTicketIssueTime(decrypted_ticket)`
56-
- [ ] `greenworks.getTicketSteamId(decrypted_ticket)`
57-
- [ ] `greenworks.getTicketAppId(decrypted_ticket)`
58-
- [ ] `greenworks.EncryptedAppTicketSymmetricKeyLength`
59-
- [ ] `validate-auth-ticket` event
50+
- [x] `greenworks.beginAuthSessionAsUser(ticket, steam_id)`
51+
- [x] `greenworks.endAuthSessionAsUser(steam_id)`
52+
- [x] `greenworks.getEncryptedAppTicket(user_data, success_callback, [error_callback])`
53+
- [x] `greenworks.decryptAppTicket(encrypted_ticket, decryption_key)`
54+
- [x] `greenworks.isTicketForApp(decrypted_ticket, app_id)`
55+
- [x] `greenworks.getTicketIssueTime(decrypted_ticket)`
56+
- [x] `greenworks.getTicketSteamId(decrypted_ticket)`
57+
- [x] `greenworks.getTicketAppId(decrypted_ticket)`
58+
- [x] `greenworks.EncryptedAppTicketSymmetricKeyLength`
59+
- [x] `validate-auth-ticket` event
6060

6161
## Achievements and Stats
6262

@@ -74,146 +74,139 @@
7474

7575
## Cloud and Remote Storage
7676

77-
- [ ] `greenworks.saveTextToFile(file_name, file_content, success_callback, [error_callback])`
78-
- [ ] `greenworks.readTextFromFile(file_name, success_callback, [error_callback])`
79-
- [ ] `greenworks.deleteFile(file_name, success_callback, [error_callback])`
80-
- [ ] `greenworks.saveFilesToCloud(files_path, success_callback, [error_callback])`
81-
- [ ] `greenworks.isCloudEnabledForUser()`
82-
- [ ] `greenworks.isCloudEnabled()`
83-
- [ ] `greenworks.enableCloud(flag)`
84-
- [ ] `greenworks.getCloudQuota(success_callback, [error_callback])`
85-
- [ ] `greenworks.getFileCount()`
86-
- [ ] `greenworks.getFileNameAndSize(index)`
77+
- [x] `greenworks.saveTextToFile(file_name, file_content, success_callback, [error_callback])`
78+
- [x] `greenworks.readTextFromFile(file_name, success_callback, [error_callback])`
79+
- [x] `greenworks.deleteFile(file_name, success_callback, [error_callback])`
80+
- [x] `greenworks.saveFilesToCloud(files_path, success_callback, [error_callback])`
81+
- [x] `greenworks.isCloudEnabledForUser()`
82+
- [x] `greenworks.isCloudEnabled()`
83+
- [x] `greenworks.enableCloud(flag)`
84+
- [x] `greenworks.getCloudQuota(success_callback, [error_callback])`
85+
- [x] `greenworks.getFileCount()`
86+
- [x] `greenworks.getFileNameAndSize(index)`
8787

8888
## Friends and SteamID
8989

90-
- [ ] `SteamID.isAnonymous()`
91-
- [ ] `SteamID.isAnonymousGameServer()`
92-
- [ ] `SteamID.isAnonymousGameServerLogin()`
93-
- [ ] `SteamID.isAnonymousUser()`
94-
- [ ] `SteamID.isChatAccount()`
95-
- [ ] `SteamID.isClanAccount()`
96-
- [ ] `SteamID.isConsoleUserAccount()`
97-
- [ ] `SteamID.isContentServerAccount()`
98-
- [ ] `SteamID.isGameServerAccount()`
99-
- [ ] `SteamID.isIndividualAccount()`
100-
- [ ] `SteamID.isPersistentGameServerAccount()`
101-
- [ ] `SteamID.isLobby()`
102-
- [ ] `SteamID.getAccountID()`
103-
- [ ] `SteamID.getRawSteamID()`
104-
- [ ] `SteamID.getAccountType()`
105-
- [ ] `SteamID.isValid()`
106-
- [ ] `SteamID.getStaticAccountKey()`
107-
- [ ] `SteamID.getPersonaName()`
108-
- [ ] `SteamID.getNickname()`
109-
- [ ] `SteamID.getRelationship()`
110-
- [ ] `SteamID.getSteamLevel()`
111-
- [ ] `greenworks.getFriendCount(friend_flag)`
112-
- [ ] `greenworks.getFriends(friend_flag)`
113-
- [ ] `greenworks.requestUserInformation(raw_steam_id, require_name_only)`
114-
- [ ] `greenworks.getSmallFriendAvatar(raw_steam_id)`
115-
- [ ] `greenworks.getMediumFriendAvatar(raw_steam_id)`
116-
- [ ] `greenworks.getLargeFriendAvatar(raw_steam_id)`
117-
- [ ] `greenworks.setListenForFriendsMessage(intercept_enabled)`
118-
- [ ] `greenworks.replyToFriendMessage(raw_steam_id, message)`
119-
- [ ] `greenworks.getFriendMessage(raw_steam_id, message_id, maximum_message_size)`
120-
- [ ] `greenworks.getFriendPersonaName(raw_steam_id)`
121-
- [ ] `greenworks.setRichPresence(pchKey, pchValue)`
122-
- [ ] `greenworks.clearRichPresence()`
123-
- [ ] `greenworks.getFriendRichPresence(steamIDFriend, pchKey)`
124-
- [ ] `greenworks.setPlayedWith(steamIDUserPlayedWith)`
125-
- [ ] `greenworks.getFriendGamePlayed(steamIDFriend)`
126-
- [ ] `greenworks.activateGameOverlayInviteDialog(steamIDLobby)`
127-
- [ ] `greenworks.activateGameOverlayToUser(pchDialog, steamID)`
128-
- [ ] `persona-state-change` event
129-
- [ ] `avatar-image-loaded` event
130-
- [ ] `game-connected-friend-chat-message` event
131-
- [ ] `rich-presence-join-requested` event
90+
- [x] `SteamID.isAnonymous()`
91+
- [x] `SteamID.isAnonymousGameServer()`
92+
- [x] `SteamID.isAnonymousGameServerLogin()`
93+
- [x] `SteamID.isAnonymousUser()`
94+
- [x] `SteamID.isChatAccount()`
95+
- [x] `SteamID.isClanAccount()`
96+
- [x] `SteamID.isConsoleUserAccount()`
97+
- [x] `SteamID.isContentServerAccount()`
98+
- [x] `SteamID.isGameServerAccount()`
99+
- [x] `SteamID.isIndividualAccount()`
100+
- [x] `SteamID.isPersistentGameServerAccount()`
101+
- [x] `SteamID.isLobby()`
102+
- [x] `SteamID.getAccountID()`
103+
- [x] `SteamID.getRawSteamID()`
104+
- [x] `SteamID.getAccountType()`
105+
- [x] `SteamID.isValid()`
106+
- [x] `SteamID.getStaticAccountKey()`
107+
- [x] `SteamID.getPersonaName()`
108+
- [x] `SteamID.getNickname()`
109+
- [x] `SteamID.getRelationship()`
110+
- [x] `SteamID.getSteamLevel()`
111+
- [x] `greenworks.getFriendCount(friend_flag)`
112+
- [x] `greenworks.getFriends(friend_flag)`
113+
- [x] `greenworks.requestUserInformation(raw_steam_id, require_name_only)`
114+
- [x] `greenworks.getSmallFriendAvatar(raw_steam_id)`
115+
- [x] `greenworks.getMediumFriendAvatar(raw_steam_id)`
116+
- [x] `greenworks.getLargeFriendAvatar(raw_steam_id)`
117+
- [x] `greenworks.setListenForFriendsMessage(intercept_enabled)`
118+
- [x] `greenworks.replyToFriendMessage(raw_steam_id, message)`
119+
- [x] `greenworks.getFriendMessage(raw_steam_id, message_id, maximum_message_size)`
120+
- [x] `greenworks.getFriendPersonaName(raw_steam_id)`
121+
- [x] `greenworks.setRichPresence(pchKey, pchValue)`
122+
- [x] `greenworks.clearRichPresence()`
123+
- [x] `greenworks.getFriendRichPresence(steamIDFriend, pchKey)`
124+
- [x] `greenworks.setPlayedWith(steamIDUserPlayedWith)`
125+
- [x] `greenworks.getFriendGamePlayed(steamIDFriend)`
126+
- [x] `greenworks.activateGameOverlayInviteDialog(steamIDLobby)`
127+
- [x] `greenworks.activateGameOverlayToUser(pchDialog, steamID)`
128+
- [x] `persona-state-change` event
129+
- [x] `avatar-image-loaded` event
130+
- [x] `game-connected-friend-chat-message` event
131+
- [x] `rich-presence-join-requested` event
132132

133133
## Workshop and UGC
134134

135-
- [ ] `greenworks.fileShare(file_path, success_callback, [error_callback])`
136-
- [ ] `greenworks.publishWorkshopFile([options,] file_path, image_path, title, description, success_callback, [error_callback])`
137-
- [ ] `greenworks.updatePublishedWorkshopFile([options,] published_file_handle, file_path, image_path, title, description, success_callback, [error_callback])`
138-
- [ ] `greenworks.ugcPublish(file_path, title, description, image_path, success_callback, [error_callback], [progress_callback])`
139-
- [ ] `greenworks.ugcPublishUpdate(published_file_handle, file_path, title, description, image_path, success_callback, [error_callback], [progress_callback])`
140-
- [ ] `greenworks.ugcGetItems([options,] ugc_matching_type, ugc_query_type, success_callback, [error_callback])`
141-
- [ ] `greenworks.ugcGetUserItems([options,] ugc_matching_type, ugc_list_sort_order, ugc_list, success_callback, [error_callback])`
142-
- [ ] `greenworks.ugcDownloadItem(download_file_handle, download_dir, success_callback, [error_callback])`
143-
- [ ] `greenworks.ugcSynchronizeItems([options,] sync_dir, success_callback, [error_callback])`
144-
- [ ] `greenworks.ugcUnsubscribe(published_file_handle, success_callback, [error_callback])`
145-
- [ ] `greenworks.ugcShowOverlay([published_file_id])`
146-
- [ ] `greenworks.ugcGetItemState(published_file_id)`
147-
- [ ] `greenworks.ugcGetItemInstallInfo(published_file_id)`
148-
- [ ] `_publishWorkshopFile`
149-
- [ ] `_updatePublishedWorkshopFile`
150-
- [ ] `_ugcGetItems`
151-
- [ ] `_ugcGetUserItems`
152-
- [ ] `_ugcSynchronizeItems`
153-
- [ ] `SteamUGCDetails`
135+
- [x] `greenworks.fileShare(file_path, success_callback, [error_callback])`
136+
- [x] `greenworks.publishWorkshopFile([options,] file_path, image_path, title, description, success_callback, [error_callback])`
137+
- [x] `greenworks.updatePublishedWorkshopFile([options,] published_file_handle, file_path, image_path, title, description, success_callback, [error_callback])`
138+
- [x] `greenworks.ugcPublish(file_path, title, description, image_path, success_callback, [error_callback], [progress_callback])`
139+
- [x] `greenworks.ugcPublishUpdate(published_file_handle, file_path, title, description, image_path, success_callback, [error_callback], [progress_callback])`
140+
- [x] `greenworks.ugcGetItems([options,] ugc_matching_type, ugc_query_type, success_callback, [error_callback])`
141+
- [x] `greenworks.ugcGetUserItems([options,] ugc_matching_type, ugc_list_sort_order, ugc_list, success_callback, [error_callback])`
142+
- [x] `greenworks.ugcDownloadItem(download_file_handle, download_dir, success_callback, [error_callback])`
143+
- [x] `greenworks.ugcSynchronizeItems([options,] sync_dir, success_callback, [error_callback])`
144+
- [x] `greenworks.ugcUnsubscribe(published_file_handle, success_callback, [error_callback])`
145+
- [x] `greenworks.ugcShowOverlay([published_file_id])`
146+
- [x] `greenworks.ugcGetItemState(published_file_id)`
147+
- [x] `greenworks.ugcGetItemInstallInfo(published_file_id)`
148+
- [x] `_publishWorkshopFile`
149+
- [x] `_updatePublishedWorkshopFile`
150+
- [x] `_ugcGetItems`
151+
- [x] `_ugcGetUserItems`
152+
- [x] `_ugcSynchronizeItems`
153+
- [x] `SteamUGCDetails`
154154

155155
## Matchmaking and Lobbies
156156

157-
- [ ] `greenworks.createLobby(lobbyType, maxMembers)`
158-
- [ ] `greenworks.deleteLobbyData(steamIDLobby, pchKey)`
159-
- [ ] `greenworks.getLobbyByIndex(iLobby)`
160-
- [ ] `greenworks.getLobbyData(steamIDLobby, pchKey)`
161-
- [ ] `greenworks.getLobbyMemberByIndex(steamIDLobby, iMember)`
162-
- [ ] `greenworks.getNumLobbyMembers(steamIDLobby)`
163-
- [ ] `greenworks.getLobbyOwner(steamIDLobby)`
164-
- [ ] `greenworks.inviteUserToLobby(steamIDLobby, steamIDInvitee)`
165-
- [ ] `greenworks.joinLobby(steamIDLobby)`
166-
- [ ] `greenworks.leaveLobby(steamIDLobby)`
167-
- [ ] `greenworks.setLobbyData(steamIDLobby, pchKey, pchValue)`
168-
- [ ] `greenworks.setLobbyJoinable(steamIDLobby, bLobbyJoinable)`
169-
- [ ] `greenworks.setLobbyOwner(steamIDLobby, steamIDNewOwner)`
170-
- [ ] `greenworks.setLobbyType(steamIDLobby, eLobbyType)`
171-
- [ ] `greenworks.requestLobbyList()`
172-
- [ ] `greenworks.getLobbyMemberLimit(steamIDLobby)`
173-
- [ ] `greenworks.setLobbyMemberLimit(steamIDLobby, limit)`
174-
- [ ] `greenworks.getLobbyMemberData(steamIDLobby, steamIDMember, pchKey)`
175-
- [ ] `greenworks.setLobbyMemberData(steamIDLobby, pchKey, pchValue)`
176-
- [ ] `greenworks.getLobbyDataCount(steamIDLobby)`
177-
- [ ] `greenworks.getLobbyDataByIndex(steamIDLobby, index)`
178-
- [ ] `greenworks.sendLobbyChatMsg(steamIDLobby, data)`
179-
- [ ] `greenworks.getLobbyChatEntry(steamIDLobby, chatID)`
180-
- [ ] `lobby-created` event
181-
- [ ] `lobby-data-update` event
182-
- [ ] `lobby-enter` event
183-
- [ ] `lobby-invite` event
184-
- [ ] `lobby-join-requested` event
185-
- [ ] `lobby-match-list` event
186-
- [ ] `lobby-chat-update` event
187-
- [ ] `lobby-chat-msg` event
157+
- [x] `greenworks.createLobby(lobbyType, maxMembers)`
158+
- [x] `greenworks.deleteLobbyData(steamIDLobby, pchKey)`
159+
- [x] `greenworks.getLobbyByIndex(iLobby)`
160+
- [x] `greenworks.getLobbyData(steamIDLobby, pchKey)`
161+
- [x] `greenworks.getLobbyMemberByIndex(steamIDLobby, iMember)`
162+
- [x] `greenworks.getNumLobbyMembers(steamIDLobby)`
163+
- [x] `greenworks.getLobbyOwner(steamIDLobby)`
164+
- [x] `greenworks.inviteUserToLobby(steamIDLobby, steamIDInvitee)`
165+
- [x] `greenworks.joinLobby(steamIDLobby)`
166+
- [x] `greenworks.leaveLobby(steamIDLobby)`
167+
- [x] `greenworks.setLobbyData(steamIDLobby, pchKey, pchValue)`
168+
- [x] `greenworks.setLobbyJoinable(steamIDLobby, bLobbyJoinable)`
169+
- [x] `greenworks.setLobbyOwner(steamIDLobby, steamIDNewOwner)`
170+
- [x] `greenworks.setLobbyType(steamIDLobby, eLobbyType)`
171+
- [x] `greenworks.requestLobbyList()`
172+
- [x] `greenworks.getLobbyMemberLimit(steamIDLobby)`
173+
- [x] `greenworks.setLobbyMemberLimit(steamIDLobby, limit)`
174+
- [x] `greenworks.getLobbyMemberData(steamIDLobby, steamIDMember, pchKey)`
175+
- [x] `greenworks.setLobbyMemberData(steamIDLobby, pchKey, pchValue)`
176+
- [x] `greenworks.getLobbyDataCount(steamIDLobby)`
177+
- [x] `greenworks.getLobbyDataByIndex(steamIDLobby, index)`
178+
- [x] `greenworks.sendLobbyChatMsg(steamIDLobby, data)`
179+
- [x] `greenworks.getLobbyChatEntry(steamIDLobby, chatID)`
180+
- [x] `lobby-created` event
181+
- [x] `lobby-data-update` event
182+
- [x] `lobby-enter` event
183+
- [x] `lobby-invite` event
184+
- [x] `lobby-join-requested` event
185+
- [x] `lobby-match-list` event
186+
- [x] `lobby-chat-update` event
187+
- [x] `lobby-chat-msg` event
188188

189189
## P2P Networking
190190

191-
- [ ] `greenworks.sendP2PPacket(steamId, sendType, data, nChannel)`
192-
- [ ] `greenworks.isP2PPacketAvailable(nChannel)`
193-
- [ ] `greenworks.readP2PPacket(size, nChannel)`
194-
- [ ] `greenworks.acceptP2PSessionWithUser(steamId)`
195-
- [ ] `greenworks.getP2PSessionState(steamIDUser)`
196-
- [ ] `greenworks.closeP2PSessionWithUser(steamIDUser)`
197-
- [ ] `greenworks.closeP2PChannelWithUser(steamIDUser, nChannel)`
198-
- [ ] `greenworks.isBehindNAT()`
199-
- [ ] `p2p-session-request` event
200-
- [ ] `p2p-session-connect-fail` event
201-
202-
## Archive Utilities
203-
204-
- [ ] `greenworks.Utils.move(source_dir, target_dir, [success_callback], [error_callback])`
205-
- [ ] `greenworks.Utils.createArchive(zip_file_path, source_dir, password, compress_level, success_callback, [error_callback])`
206-
- [ ] `greenworks.Utils.extractArchive(zip_file_path, extract_dir, password, success_callback, [error_callback])`
191+
- [x] `greenworks.sendP2PPacket(steamId, sendType, data, nChannel)`
192+
- [x] `greenworks.isP2PPacketAvailable(nChannel)`
193+
- [x] `greenworks.readP2PPacket(size, nChannel)`
194+
- [x] `greenworks.acceptP2PSessionWithUser(steamId)`
195+
- [x] `greenworks.getP2PSessionState(steamIDUser)`
196+
- [x] `greenworks.closeP2PSessionWithUser(steamIDUser)`
197+
- [x] `greenworks.closeP2PChannelWithUser(steamIDUser, nChannel)`
198+
- [x] `greenworks.isBehindNAT()`
199+
- [x] `p2p-session-request` event
200+
- [x] `p2p-session-connect-fail` event
207201

208202
## Floating Gamepad Text Input
209203

210-
- [ ] `greenworks.showFloatingGamepadTextInput(keyboardMode, x, y, width, height)`
204+
- [x] `greenworks.showFloatingGamepadTextInput(keyboardMode, x, y, width, height)`
211205
- [x] `floating-gamepad-text-input-dismissed` event
212206

213207
## Constants and Enums
214208

215-
- [ ] `_version`
216-
- [ ] `EncryptedAppTicketSymmetricKeyLength`
209+
- [x] `EncryptedAppTicketSymmetricKeyLength`
217210
- [x] `FriendFlags`
218211
- [x] `FriendRelationship`
219212
- [x] `PersonaChange`

CONTRIBUTING.md

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,32 @@ callback polling.
4545
- `setStat` convenience helper or documented split helpers
4646
- [x] Phase 2: add typed enum exports.
4747
- [ ] Phase 2b: add typed result/object types for larger API families.
48+
- [x] UGC published file ID, UGC handle, and item install info types.
49+
- [x] UGC query details and async query result types.
50+
- [x] UGC download and unsubscribe result types.
51+
- [x] UGC file share, publish, and update result types.
52+
- [x] UGC composed publish/update result types.
53+
- [x] UGC sync result types.
4854
- [x] Phase 3a: refactor callback bridge payloads and cover core Greenworks
4955
event outcomes.
5056
- [ ] Phase 3b: expand callback bridge as friends, lobbies, P2P, UGC, and auth
5157
event families land.
58+
- [x] Friends callback events.
59+
- [x] Lobby callback events.
60+
- [x] P2P networking callback events.
61+
- [x] Auth ticket callback events.
5262
- [ ] Phase 4: implement friends, SteamID object parity or string-first
5363
equivalents, avatars, chat, and rich presence.
64+
- [x] SteamID string-first helper namespace.
65+
- [x] Friends, avatars, chat message, rich presence, and played-with methods.
5466
- [ ] Phase 5: implement remote storage/cloud and callback-style async wrappers.
67+
- [x] Cloud text/file writes, reads, delete, settings, quota, and enumeration.
5568
- [ ] Phase 6: implement matchmaking/lobbies and P2P networking.
56-
- [ ] Phase 7: implement workshop/UGC and archive utility helpers if still
57-
desired.
69+
- [x] Matchmaking lobby methods.
70+
- [x] P2P packet/session methods.
71+
- [x] Phase 6b: implement auth session and encrypted app ticket helpers.
72+
- [x] Phase 6c: implement current player count and floating gamepad text input.
73+
- [x] Phase 7: implement workshop/UGC equivalents.
5874
- [ ] Phase 8: keep `GREENWORKS.md` migration mappings current for implemented
5975
capability families.
6076

0 commit comments

Comments
 (0)