Сегодня мы будем работать с интерфейсами Apps, Utils, а так же познакомимся с тем как реализовывать callbacks в нашем приложении. Рекомендую ознакомиться с 1 частью, прежде чем приступать ко второй.
Для активации дебаг режима в steam нужно добавить параметры запуска:
-dev -console
Для вывода отладочной информации с нашего приложения переходим в появившуюся консоль и пишем:
log_ipc verbose <имя нашего приложения.exe>
Подключим заголовочный файл #include <windows.h> для использования необходимых функций.
Используя наше тестовое приложение из первой части, добавим подключение необходимых интерфейсов.
auto *Utils = (ISteamUtils001 *)Client->GetISteamUtils(pipe,STEAMUTILS_INTERFACE_VERSION_001);
auto *Apps = (ISteamApps004 *)Client->GetISteamApps(user,pipe,STEAMAPPS_INTERFACE_VERSION_004);
Попробуем получить время покупки игры на моем steam аккаунте c заданным ID, объявим AppId_t,
который имеет тип uint32, поместим в него значение 500 (Left 4 Dead).
AppId_t l4d(500);
Получаем время покупки и серверное время в формате unix timestamp.
int PurchaseTime = Apps->GetEarliestPurchaseUnixTime(l4d);
int time = Utils->GetServerRealTime();
Конвертируем unix timestamp в удобный вид для человека.
time_t rawtime = time;
time_t Ptime = PurchaseTime;
struct tm timeinfo;
char timebuf[32];
localtime_s( &timeinfo,&rawtime );
asctime_s (timebuf,32,&timeinfo);
printf( "%s n", timebuf );
localtime_s( &timeinfo,&Ptime);
asctime_s (timebuf,32,&timeinfo);
printf( "%s n", timebuf);
На выходе получаю 1 — реальное время сервера, 2 — время когда я приобрел игру.
Sat Nov 10 09:51:15 2012
Sat Nov 22 17:03:45 2008
Теперь попробуем получить список друзей и уникальную (не изменяющуюся ссылку) на их профиль.
CSteamID curID;
int friendcount = Friends->GetFriendCount();
for(int i = 0; i < friendcount; i++)
{
curID = Friends13->GetFriendByIndex(i, k_EFriendFlagAll);
printf("%s - %llun", Friends->GetFriendPersonaName(curID), curID.ConvertToUint64());
}
system("pause");
Получаем такой вывод:
:REC: FabZen - 765611979787897xx
DrLuke - 765611979853980xx
[EM] Cooler_sk - 765611979862334xx
Maryus - 765611979878419xx
vorram - 765611979915317xx
0nb0ard - 765611979922297xx
..........
я закрыл последние две цифры символом <х>, теперь данный id можно подставить в steamcommunity.com/profiles/[id]
Приступим к работе с callbacks, все callbacks перечислены в файле FriendsCommon.h в папке OpenSteamWorks.
Пока не нажмем клавишу Escape получаем callback, сравниваем его с структурой FriendChatMsg_t, если условие верное, выделяем память под строку сообщения, получаем сообщение, если тип сообщения равняется обычному или написанному через /me — сравниваем полученную строку с «hello», если идентичны — посылаю в ответ приветствие, очищаю последний callback и выхожу из программы.
CallbackMsg_t callBack;
while (!GetAsyncKeyState(VK_ESCAPE))
{
Sleep(1);
if ( Steam_BGetCallback( pipe, &callBack ) )
{
if(callBack.m_iCallback == FriendChatMsg_t::k_iCallback) {
FriendChatMsg_t *pFriendMessageInfo = (FriendChatMsg_t *)callBack.m_pubParam;
EChatEntryType eMsgType;
char szData[k_cchFriendChatMsgMax];
memset(szData, 0, k_cchFriendChatMsgMax);
Friends->GetChatMessage(pFriendMessageInfo>m_ulSenderID,pFriendMessageInfo>m_iChatID, szData,sizeof(szData),&eMsgType);
if (eMsgType == k_EChatEntryTypeChatMsg || k_EChatEntryTypeEmote) {
if (strcmp(szData, "hello") == 0 && (pFriendMessageInfo->m_ulSenderID != User->GetSteamID())){
Friends->SendMsgToFriend(pFriendMessageInfo->m_ulFriendID,k_EChatEntryTypeChatMsg,"hello my friend",22);
Steam_FreeLastCallback(pipe);
ExitProcess(0);
}
}
}
Steam_FreeLastCallback(pipe);
}
}
Пример callback-a на Trade Response (запрос обмена вещей).
if (callbackMsg.m_iCallback == TradeInviteReceived_t::k_iCallback)
{
TradeInviteReceived_t* pTradeInviteReceived = (TradeInviteReceived_t*) callbackMsg.m_pubParam;
printf("Trade from %s, ID %un", pTradeInviteReceived->m_steamIDPartner.SteamRender(), pTradeInviteReceived->m_unTradeRequestID);
//Ваш код ответа на Trade запрос.
}
В следующей статье будет показана работа с пользовательскими достижениями (ISteamUserStats) и интерфейс (ISteamScreenshots).
Автор: Dinisoid