-
Notifications
You must be signed in to change notification settings - Fork 30
Expand file tree
/
Copy pathApus.Engine.SteamAPI.pas
More file actions
194 lines (169 loc) · 7.39 KB
/
Copy pathApus.Engine.SteamAPI.pas
File metadata and controls
194 lines (169 loc) · 7.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
// Translated from STEAM SDK headers
// Copyright (C) 2011 Apus Software. Ivan Polyacov (ivan@apus-software.com)
// This file is licensed under the terms of BSD-3 license (see license.txt)
// This file is a part of the Apus Game Engine (http://apus-software.com/engine/)
{$I defines.inc}
unit Apus.Engine.SteamAPI;
interface
const
{$IFDEF MSWINDOWS}
{$IFDEF CPU64}
steamLibName = 'steam_api64.dll';
{$ELSE}
steamLibName = 'steam_api.dll';
{$ENDIF}
{$ENDIF}
{$IFDEF LINUX}
//{$LINKLIB steam_api}
steamLibName = 'libsteam_api.so';
{$ENDIF}
var
steamAvailable:boolean=false; // Is API available?
steamID:int64;
steamUserName:PAnsiChar;
steamGameLang:PAnsiChar;
type
int32=integer;
Pint32=^int32;
uint32=cardinal;
float=single;
SteamAPICall_t=int64;
SteamLeaderboard_t=int64;
SteamLeaderboardEntries_t=int64;
UGCHandle_t=int64;
HAuthTicket=uint32;
HSteamuser=integer;
HSteamPipe=integer;
// Own functions
procedure InitSteamAPI;
procedure DoneSteamAPI;
//function VerifyOwnership:boolean;
// Obtains ticket to pass to the server (HEX-string)
function GetSteamAuthTicket:string;
// Imported SteamAPI functions
function SteamAPI_Init():boolean; cdecl; external steamLibName;
procedure SteamAPI_Shutdown(); cdecl; external steamLibName;
procedure SetSteamAchievement(name:string;enable:boolean=true);
function SteamInternal_CreateInterface(ver:PAnsiChar):pointer; cdecl; external steamLibName;
function SteamAPI_GetHSteamUser:HSteamUser; cdecl; external steamLibName;
function SteamAPI_GetHSteamPipe:HSteamPipe; cdecl; external steamLibName;
function SteamAPI_ISteamClient_GetISteamUser(steamClient:pointer;hSteamUser:HSteamUser;
hSteamPipe:HSteamPipe;const pchVersion:PAnsiChar):pointer; cdecl; external steamLibName;
function SteamAPI_ISteamClient_GetISteamApps(steamClient:pointer;hSteamUser:HSteamUser;
hSteamPipe:HSteamPipe;const pchVersion:PAnsiChar):pointer; cdecl; external steamLibName;
function SteamAPI_ISteamClient_GetISteamUserStats(steamClient:pointer;hSteamUser:HSteamUser;
hSteamPipe:HSteamPipe;const pchVersion:PAnsiChar):pointer; cdecl; external steamLibName;
function SteamAPI_ISteamClient_GetISteamFriends(steamClient:pointer;hSteamUser:HSteamUser;
hSteamPipe:HSteamPipe;const pchVersion:PAnsiChar):pointer; cdecl; external steamLibName;
function SteamAPI_ISteamUser_GetAuthSessionTicket(steamUser:pointer;pTicket:pointer;cbMaxTicket:integer;
out pcbTicket:Cardinal):HAuthTicket; cdecl; external steamLibName;
function SteamAPI_ISteamUser_GetSteamID(steamUser:pointer):int64; cdecl; external steamLibName;
function SteamAPI_ISteamApps_GetCurrentGameLanguage(steamApps:pointer):PAnsiChar; cdecl; external steamLibName;
procedure SteamAPI_RunCallbacks; cdecl; external steamLibName;
procedure SteamAPI_RegisterCallback(callbackbase:pointer;iCallback:integer); cdecl; external steamLibName;
function SteamAPI_ISteamUserStats_SetAchievement(steamUserStats:pointer;const pchName:PAnsiChar):boolean; cdecl; external steamLibName;
function SteamAPI_ISteamUserStats_ClearAchievement(steamUserStats:pointer;const pchName:PAnsiChar):boolean; cdecl; external steamLibName;
function SteamAPI_ISteamUserStats_IndicateAchievementProgress(steamUserStats:pointer;const pchName:PAnsiChar;
nCurProgress,nMaxProgress:cardinal):boolean; cdecl; external steamLibName;
function SteamAPI_ISteamFriends_GetPersonaName(self:pointer):PAnsiChar; cdecl external steamLibName;
implementation
uses SysUtils, Apus.Common, Apus.EventMan;
type
PMicroTxnAuthorizationResponse_t=^MicroTxnAuthorizationResponse_t;
MicroTxnAuthorizationResponse_t=record
m_unAppID:integer; // AppID for this microtransaction
m_ulOrderID:int64; // OrderID provided for the microtransaction
m_bAuthorized:byte; // if user authorized transaction
end;
const
STEAMCLIENT_VERSION='SteamClient017';
STEAMUSER_VERSION='SteamUser019';
STEAMAPPS_VERSION='STEAMAPPS_INTERFACE_VERSION008';
STEAMUSERSTAT_VERSION='STEAMUSERSTATS_INTERFACE_VERSION011';
STEAMFRIENDS_VERSION='SteamFriends017';
k_iSteamUserCallbacks = 100;
var
steamClient,steamUser,steamApps,steamUserStats,steamFriends:pointer;
callbackVMT:array[0..5] of pointer;
callbackObj:array[0..5] of pointer;
// Callback function
{$W+}
procedure OnMicroTxnAuthorization(param:PMicroTxnAuthorizationResponse_t); stdcall;
begin
LogMessage('Transaction: '+IntToStr(param.m_ulOrderID)+' code:'+IntToStr(param.m_bAuthorized));
Signal('STEAM\MicroTxnAuthorization\'+IntToStr(param.m_ulOrderID),param.m_bAuthorized);
end;
procedure SetSteamAchievement(name:string;enable:boolean=true);
var
aName:PAnsiChar;
res:boolean;
begin
if not steamAvailable or (steamUserStats=nil) then begin
LogMessage('Steam not available');
exit;
end;
LogMessage('SSA: '+name);
aName:=PAnsiChar(AnsiString(name));
if enable then
res:=SteamAPI_ISteamUserStats_SetAchievement(steamUserStats,aName)
else
res:=SteamAPI_ISteamUserStats_ClearAchievement(steamUserStats,aName);
if not res then LogMessage('SSA failed');
end;
function GetSteamAuthTicket:string;
var
ticket:array[0..1023] of byte;
size:cardinal;
begin
result:='';
ASSERT(steamAvailable);
SteamAPI_ISteamUser_GetAuthSessionTicket(steamUser,@ticket,sizeof(ticket),size);
result:=EncodeHex(@ticket,size);
end;
procedure InitSteamAPI;
var
pipe,user:integer;
p:MicroTxnAuthorizationResponse_t;
begin
steamAvailable:=SteamAPI_Init;
if not steamAvailable then begin
LogMessage('STEAM not available');
exit;
end;
LogMessage('STEAM API available');
user:=SteamAPI_GetHSteamUser;
pipe:=SteamAPI_GetHSteamPipe;
steamClient:=SteamInternal_CreateInterface(STEAMCLIENT_VERSION);
steamUser:=SteamAPI_ISteamClient_GetISteamUser(steamClient,user,pipe,STEAMUSER_VERSION);
steamApps:=SteamAPI_ISteamClient_GetISteamApps(steamClient,user,pipe,STEAMAPPS_VERSION);
steamFriends:=SteamAPI_ISteamClient_GetISteamFriends(steamClient,user,pipe,STEAMFRIENDS_VERSION);
steamUserStats:=SteamAPI_ISteamClient_GetISteamUserStats(steamClient,user,pipe,STEAMUSERSTAT_VERSION);
// ForceLogMessage(Format('steamClient=%x steamUser=%x, user=%d pipe=%d',[cardinal(steamClient),cardinal(steamUser),user,pipe]));
steamID:=SteamAPI_ISteamUser_GetSteamID(steamUser);
steamGameLang:=SteamAPI_ISteamApps_GetCurrentGameLanguage(steamApps);
steamUserName:=SteamAPI_ISteamFriends_GetPersonaName(steamFriends);
LogMessage('SteamID=%d, name="%s", lang="%s"',[steamID,AnsiString(steamUserName),AnsiString(steamGameLang)]);
//LogMessage('SteamID='+IntToStr(steamID)+' GameLang='+string(steamGameLang));
// Register callbacks
{ SteamAPI_RegisterCallback(@callback,k_iSteamUserCallbacks + 1);
SteamAPI_RegisterCallback(@callback,k_iSteamUserCallbacks + 2);
SteamAPI_RegisterCallback(@callback,k_iSteamUserCallbacks + 3);
SteamAPI_RegisterCallback(@callback,k_iSteamUserCallbacks + 17);
SteamAPI_RegisterCallback(@callback,k_iSteamUserCallbacks + 43);
SteamAPI_RegisterCallback(@callback,k_iSteamUserCallbacks + 54);}
callbackVMT[1]:=@OnMicroTxnAuthorization;
callbackObj[0]:=@callbackVMT;
SteamAPI_RegisterCallback(@callbackObj,k_iSteamUserCallbacks + 52);
end;
procedure DoneSteamAPI;
begin
if steamAvailable then SteamAPI_Shutdown;
end;
{ function VerifyOwnership:boolean;
var
ticket:string;
begin
ticket:=GetSteamAuthTicket;
end;}
initialization
end.