Добрый день. Есть один интересный софт на просторах GitHub'а, а именно SteamItemDropIdler. Вкратце расскажу, что это за программа. Она позволяет добывать(drop) предметы из игр в Steam, которые поддерживаю Inventory Service Steam API. Программа простая и хорошо работает, правда только на Windows. Вот её я и попытаюсь портировать на Linux и немного доработать.
Перед нами проект на C++, который использует Open Steamworks. А это значит, что 99% кода точно работать будет без исправлений, проблемой является только введённые Microsoft'ом функции, которые я буду заменять и библиотеки. Меня интересуют функции, имена которых заканчиваются на "_s", а именно: strcpy_s(), sprintf_s().
Первоначально приставки "_s" у них не было, просто Microsoft усовершенствовала безопасность. В данном случае мы просто и элегантно удаляем префиксы по всему проекту. Дальше мы удаляем из проекта введённые Microsoft'ом функции: SetConsoleTitleA().
Так как эта функция просто изменяет заголовок консоли, то я просто выпилю её за ненадобностью. В проекте используется HANDLE для изменения цвета в консоли, его я тоже решил полностью удалить.
Да и к тому же в Linux этого просто напросто нет, так как это уже Win API. Дальше самое интересное, это 2 строки кода с комментарием от разработчика.
Я долго ломал голову над тем, как это работает. На сколько я понял, это вызов функций с передачей в них параметров без заголовочного ".h" файла. И тут началось самое ужасное. Во-первых, надо обновить заголовочный файл от Open Steamworks. Переписать "это" на нормальные вызовы функций и найти в интернете библиотеку от Steam для Linux.
Начал с поисков библиотек, так как без них код не проверить. Убил день на это. Почему же так долго? Потому что это Linux, детка! Для Windows есть один .lib файл и всё, его достаточно, но для Linux их 3:
- libsteam.a
- libsteam.so
- steamclient.so
И главным условие это, что у всех библиотек должна быть одинаковая разрядность, либо х32 или х64. Но я их все нашёл под х64. Отлично, идем дальше.
Теперь надо доработать Open Steamworks. Ищем файл "Interface_OSW.h". В нем мы видим раздел для Linux.
Переписываем пути на новые.
- "./Open Steamworks/Resources/Libs/libsteam.so"
- "./Open Steamworks/Resources/Libs/steamclient.so"
Дальше нужно найти файл "IClientUser.h" и дописать недостающие функции.
И в основном классе меняем вызовы на нормальные. На этом портирование можно считать завершённым.
Доработка программы
Я же не просто так решил перенести программу на Linux, а ещё и доработать 2 момента:
- Добавить новый параметр для 2FA кода Steam в аргументах командной строки
- Переделать логику запроса нового предмета
Ну первое это вообще фигня.
И добавляем сразу запуск клиента после всех проверок
Готово. Теперь меняем надо поменять логику. Изначально программа при авторизации пользователя сразу начинает "клянчить" предмет у Steam, дёргая функцию TriggerItemDrop(). Но я хочу, чтобы программа запустилась, и ждала Callback с id 819. Зачем это? Если честно, то я сам не знаю, просто после этого Callback'а нас не отключат от Steam. Дописываем в конец второго цикла while
Вот теперь точно всё. Собираем в g++ и запускаем. Дальше можно написать загрузчик на bash и поставить под cron. Получилась полностью автоматическая ферма для ботов, которая добывает вещи из игр.
Полностью готовый проект можно посмотреть на GitHub.
Всего вам хорошего.