{"id":158119,"date":"2012-11-10T11:23:03","date_gmt":"2012-11-10T07:23:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=158119"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=158119","title":{"rendered":"<span class=\"post_title\">\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 SteamWorks. \u0427\u0430\u0441\u0442\u044c 2<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<habracut\/><img decoding=\"async\" src=\"https:\/\/partner.steamgames.com\/public\/images\/logo_steamworks.gif\" align=\"left\"\/>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438 Apps, Utils, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 \u0442\u0435\u043c \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c callbacks \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 <a href=\"http:\/\/habrahabr.ru\/post\/157999\/\">1 \u0447\u0430\u0441\u0442\u044c\u044e<\/a>, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a\u043e \u0432\u0442\u043e\u0440\u043e\u0439.<\/p>\n<p>  \u0414\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0434\u0435\u0431\u0430\u0433 \u0440\u0435\u0436\u0438\u043c\u0430 \u0432 steam \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430:<\/p>\n<pre><code class=\"cpp\"> -dev -console <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0438 \u043f\u0438\u0448\u0435\u043c:<\/p>\n<pre><code class=\"cpp\">log_ipc  verbose &lt;\u0438\u043c\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.exe&gt; <\/code><\/pre>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b #include &lt;windows.h&gt; \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<br \/>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u0430\u0448\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432.<\/p>\n<pre><code class=\"cpp\">auto *Utils = (ISteamUtils001 *)Client-&gt;GetISteamUtils(pipe,STEAMUTILS_INTERFACE_VERSION_001); auto *Apps = (ISteamApps004 *)Client-&gt;GetISteamApps(user,pipe,STEAMAPPS_INTERFACE_VERSION_004); <\/code><\/pre>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0438\u0433\u0440\u044b \u043d\u0430 \u043c\u043e\u0435\u043c steam \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0435 c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c ID, \u043e\u0431\u044a\u044f\u0432\u0438\u043c AppId_t,<br \/>  \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f uint32, \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 500 (Left 4 Dead).<\/p>\n<pre><code class=\"cpp\">AppId_t l4d(500); <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 unix timestamp.<\/p>\n<pre><code class=\"cpp\">int PurchaseTime = Apps-&gt;GetEarliestPurchaseUnixTime(l4d); int time = Utils-&gt;GetServerRealTime(); <\/code><\/pre>\n<p>  \u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c unix timestamp \u0432 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0432\u0438\u0434 \u0434\u043b\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430.<\/p>\n<pre><code class=\"cpp\">time_t rawtime = time; time_t Ptime = PurchaseTime; struct tm timeinfo; char timebuf[32]; localtime_s( &timeinfo,&rawtime ); asctime_s (timebuf,32,&timeinfo); printf( &quot;%s \\n&quot;, timebuf );  localtime_s( &timeinfo,&Ptime); asctime_s (timebuf,32,&timeinfo); printf( &quot;%s \\n&quot;, timebuf); <\/code><\/pre>\n<p>  \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044e 1 \u2014 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430, 2 \u2014 \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u0433\u0434\u0430 \u044f \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u043b \u0438\u0433\u0440\u0443.<\/p>\n<pre><code class=\"cpp\">Sat Nov 10 09:51:15 2012 Sat Nov 22 17:03:45 2008 <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0440\u0443\u0437\u0435\u0439 \u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e (\u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0449\u0443\u044e\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0443) \u043d\u0430 \u0438\u0445 \u043f\u0440\u043e\u0444\u0438\u043b\u044c.<\/p>\n<pre><code class=\"cpp\">CSteamID curID; int friendcount = Friends-&gt;GetFriendCount(); for(int i = 0; i &lt; friendcount; i++)    {    curID = Friends13-&gt;GetFriendByIndex(i, k_EFriendFlagAll);    printf(&quot;%s - %llu\\n&quot;, Friends-&gt;GetFriendPersonaName(curID), curID.ConvertToUint64());    } system(&quot;pause&quot;); <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0432\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">:REC: FabZen - 765611979787897xx DrLuke - 765611979853980xx [EM] Cooler_sk - 765611979862334xx Maryus - 765611979878419xx vorram - 765611979915317xx 0nb0ard - 765611979922297xx .......... <\/code><\/pre>\n<p>  \u044f \u0437\u0430\u043a\u0440\u044b\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u0432\u0435 \u0446\u0438\u0444\u0440\u044b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c &lt;\u0445&gt;, \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u043d\u043d\u044b\u0439 id \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 steamcommunity.com\/profiles\/[id]<\/p>\n<p>  \u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 callbacks, \u0432\u0441\u0435 callbacks \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0432 \u0444\u0430\u0439\u043b\u0435 <b>FriendsCommon.h<\/b> \u0432 \u043f\u0430\u043f\u043a\u0435 OpenSteamWorks.<\/p>\n<p>  \u041f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0436\u043c\u0435\u043c \u043a\u043b\u0430\u0432\u0438\u0448\u0443 Escape \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c callback, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0441 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 FriendChatMsg_t, \u0435\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u0435\u0440\u043d\u043e\u0435, \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0442\u0438\u043f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 \u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c\u0443 \u0447\u0435\u0440\u0435\u0437 \/me \u2014 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u00abhello\u00bb, \u0435\u0441\u043b\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b \u2014 \u043f\u043e\u0441\u044b\u043b\u0430\u044e \u0432 \u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435, \u043e\u0447\u0438\u0449\u0430\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 callback \u0438 \u0432\u044b\u0445\u043e\u0436\u0443 \u0438\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<pre><code class=\"cpp\">CallbackMsg_t callBack; while (!GetAsyncKeyState(VK_ESCAPE)) { \tSleep(1); \tif ( Steam_BGetCallback( pipe, &callBack ) )          {  \tif(callBack.m_iCallback ==  FriendChatMsg_t::k_iCallback) { \t\t FriendChatMsg_t *pFriendMessageInfo = (FriendChatMsg_t *)callBack.m_pubParam; \t\t EChatEntryType eMsgType;          char szData[k_cchFriendChatMsgMax];          memset(szData, 0, k_cchFriendChatMsgMax);          Friends-&gt;GetChatMessage(pFriendMessageInfo&gt;m_ulSenderID,pFriendMessageInfo&gt;m_iChatID,               szData,sizeof(szData),&eMsgType);      if (eMsgType == k_EChatEntryTypeChatMsg || k_EChatEntryTypeEmote)  {  \tif (strcmp(szData, &quot;hello&quot;) == 0 && (pFriendMessageInfo-&gt;m_ulSenderID != User-&gt;GetSteamID())){      Friends-&gt;SendMsgToFriend(pFriendMessageInfo-&gt;m_ulFriendID,k_EChatEntryTypeChatMsg,&quot;hello my friend&quot;,22); \tSteam_FreeLastCallback(pipe); \tExitProcess(0); \t\t   } \t     } \t } \t Steam_FreeLastCallback(pipe);    } }\t <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 callback-a \u043d\u0430 Trade Response (\u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0431\u043c\u0435\u043d\u0430 \u0432\u0435\u0449\u0435\u0439).<\/p>\n<pre><code class=\"cpp\">if (callbackMsg.m_iCallback == TradeInviteReceived_t::k_iCallback) {        TradeInviteReceived_t* pTradeInviteReceived = (TradeInviteReceived_t*) callbackMsg.m_pubParam;        printf(&quot;Trade from %s, ID %u\\n&quot;, pTradeInviteReceived-&gt;m_steamIDPartner.SteamRender(), pTradeInviteReceived-&gt;m_unTradeRequestID); \t   \/\/\u0412\u0430\u0448 \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 Trade \u0437\u0430\u043f\u0440\u043e\u0441. } <\/code><\/pre>\n<p>  \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c\u0438 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f\u043c\u0438 (ISteamUserStats) \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (ISteamScreenshots).    \t   \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/158119\/\"> http:\/\/habrahabr.ru\/post\/158119\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<habracut\/>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438 Apps, Utils, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 \u0442\u0435\u043c \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c callbacks \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 <a href=\"http:\/\/habrahabr.ru\/post\/157999\/\">1 \u0447\u0430\u0441\u0442\u044c\u044e<\/a>, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a\u043e \u0432\u0442\u043e\u0440\u043e\u0439.<\/p>\n<p>  \u0414\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0434\u0435\u0431\u0430\u0433 \u0440\u0435\u0436\u0438\u043c\u0430 \u0432 steam \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430:<\/p>\n<pre><code class=\"cpp\"> -dev -console <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0438 \u043f\u0438\u0448\u0435\u043c:<\/p>\n<pre><code class=\"cpp\">log_ipc  verbose &lt;\u0438\u043c\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.exe&gt; <\/code><\/pre>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b #include &lt;windows.h&gt; \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<br \/>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u0430\u0448\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432.<\/p>\n<pre><code class=\"cpp\">auto *Utils = (ISteamUtils001 *)Client-&gt;GetISteamUtils(pipe,STEAMUTILS_INTERFACE_VERSION_001); auto *Apps = (ISteamApps004 *)Client-&gt;GetISteamApps(user,pipe,STEAMAPPS_INTERFACE_VERSION_004); <\/code><\/pre>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0438\u0433\u0440\u044b \u043d\u0430 \u043c\u043e\u0435\u043c steam \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0435 c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c ID, \u043e\u0431\u044a\u044f\u0432\u0438\u043c AppId_t,<br \/>  \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f uint32, \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 500 (Left 4 Dead).<\/p>\n<pre><code class=\"cpp\">AppId_t l4d(500); <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043a\u0443\u043f\u043a\u0438 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 unix timestamp.<\/p>\n<pre><code class=\"cpp\">int PurchaseTime = Apps-&gt;GetEarliestPurchaseUnixTime(l4d); int time = Utils-&gt;GetServerRealTime(); <\/code><\/pre>\n<p>  \u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c unix timestamp \u0432 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0432\u0438\u0434 \u0434\u043b\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430.<\/p>\n<pre><code class=\"cpp\">time_t rawtime = time; time_t Ptime = PurchaseTime; struct tm timeinfo; char timebuf[32]; localtime_s( &#038;timeinfo,&#038;rawtime ); asctime_s (timebuf,32,&#038;timeinfo); printf( &quot;%s \\n&quot;, timebuf );  localtime_s( &#038;timeinfo,&#038;Ptime); asctime_s (timebuf,32,&#038;timeinfo); printf( &quot;%s \\n&quot;, timebuf); <\/code><\/pre>\n<p>  \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044e 1 \u2014 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430, 2 \u2014 \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u0433\u0434\u0430 \u044f \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u043b \u0438\u0433\u0440\u0443.<\/p>\n<pre><code class=\"cpp\">Sat Nov 10 09:51:15 2012 Sat Nov 22 17:03:45 2008 <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0440\u0443\u0437\u0435\u0439 \u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e (\u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0449\u0443\u044e\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0443) \u043d\u0430 \u0438\u0445 \u043f\u0440\u043e\u0444\u0438\u043b\u044c.<\/p>\n<pre><code class=\"cpp\">CSteamID curID; int friendcount = Friends-&gt;GetFriendCount(); for(int i = 0; i &lt; friendcount; i++)    {    curID = Friends13-&gt;GetFriendByIndex(i, k_EFriendFlagAll);    printf(&quot;%s - %llu\\n&quot;, Friends-&gt;GetFriendPersonaName(curID), curID.ConvertToUint64());    } system(&quot;pause&quot;); <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0432\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">:REC: FabZen - 765611979787897xx DrLuke - 765611979853980xx [EM] Cooler_sk - 765611979862334xx Maryus - 765611979878419xx vorram - 765611979915317xx 0nb0ard - 765611979922297xx .......... <\/code><\/pre>\n<p>  \u044f \u0437\u0430\u043a\u0440\u044b\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u0432\u0435 \u0446\u0438\u0444\u0440\u044b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c &lt;\u0445&gt;, \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u043d\u043d\u044b\u0439 id \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 steamcommunity.com\/profiles\/[id]<\/p>\n<p>  \u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 callbacks, \u0432\u0441\u0435 callbacks \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0432 \u0444\u0430\u0439\u043b\u0435 <b>FriendsCommon.h<\/b> \u0432 \u043f\u0430\u043f\u043a\u0435 OpenSteamWorks.<\/p>\n<p>  \u041f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0436\u043c\u0435\u043c \u043a\u043b\u0430\u0432\u0438\u0448\u0443 Escape \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c callback, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0441 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 FriendChatMsg_t, \u0435\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u0435\u0440\u043d\u043e\u0435, \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0442\u0438\u043f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 \u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c\u0443 \u0447\u0435\u0440\u0435\u0437 \/me \u2014 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u00abhello\u00bb, \u0435\u0441\u043b\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b \u2014 \u043f\u043e\u0441\u044b\u043b\u0430\u044e \u0432 \u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435, \u043e\u0447\u0438\u0449\u0430\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 callback \u0438 \u0432\u044b\u0445\u043e\u0436\u0443 \u0438\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<pre><code class=\"cpp\">CallbackMsg_t callBack; while (!GetAsyncKeyState(VK_ESCAPE)) { \tSleep(1); \tif ( Steam_BGetCallback( pipe, &#038;callBack ) )          {  \tif(callBack.m_iCallback ==  FriendChatMsg_t::k_iCallback) { \t\t FriendChatMsg_t *pFriendMessageInfo = (FriendChatMsg_t *)callBack.m_pubParam; \t\t EChatEntryType eMsgType;          char szData[k_cchFriendChatMsgMax];          memset(szData, 0, k_cchFriendChatMsgMax);          Friends-&gt;GetChatMessage(pFriendMessageInfo&gt;m_ulSenderID,pFriendMessageInfo&gt;m_iChatID,               szData,sizeof(szData),&#038;eMsgType);      if (eMsgType == k_EChatEntryTypeChatMsg || k_EChatEntryTypeEmote)  {  \tif (strcmp(szData, &quot;hello&quot;) == 0 &#038;& (pFriendMessageInfo-&gt;m_ulSenderID != User-&gt;GetSteamID())){      Friends-&gt;SendMsgToFriend(pFriendMessageInfo-&gt;m_ulFriendID,k_EChatEntryTypeChatMsg,&quot;hello my friend&quot;,22); \tSteam_FreeLastCallback(pipe); \tExitProcess(0); \t\t   } \t     } \t } \t Steam_FreeLastCallback(pipe);    } }\t <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 callback-a \u043d\u0430 Trade Response (\u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0431\u043c\u0435\u043d\u0430 \u0432\u0435\u0449\u0435\u0439).<\/p>\n<pre><code class=\"cpp\">if (callbackMsg.m_iCallback == TradeInviteReceived_t::k_iCallback) {        TradeInviteReceived_t* pTradeInviteReceived = (TradeInviteReceived_t*) callbackMsg.m_pubParam;        printf(&quot;Trade from %s, ID %u\\n&quot;, pTradeInviteReceived-&gt;m_steamIDPartner.SteamRender(), pTradeInviteReceived-&gt;m_unTradeRequestID); \t   \/\/\u0412\u0430\u0448 \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 Trade \u0437\u0430\u043f\u0440\u043e\u0441. } <\/code><\/pre>\n<p>  \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c\u0438 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f\u043c\u0438 (ISteamUserStats) \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (ISteamScreenshots).    \t   \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/158119\/\"> http:\/\/habrahabr.ru\/post\/158119\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-158119","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/158119","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=158119"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/158119\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=158119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=158119"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=158119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}