Найти в Дзене
Дмитрий Власов

Портируем программу с Windows на Linux

Добрый день. Есть один интересный софт на просторах GitHub'а, а именно SteamItemDropIdler. Вкратце расскажу, что это за программа. Она позволяет добывать(drop) предметы из игр в Steam, которые поддерживаю Inventory Service Steam API. Программа простая и хорошо работает, правда только на Windows. Вот её я и попытаюсь портировать на Linux и немного доработать.

Перед нами проект на C++, который использует Open Steamworks. А это значит, что 99% кода точно работать будет без исправлений, проблемой является только введённые Microsoft'ом функции, которые я буду заменять и библиотеки. Меня интересуют функции, имена которых заканчиваются на "_s", а именно: strcpy_s(), sprintf_s().

Первоначально приставки "_s" у них не было, просто Microsoft усовершенствовала безопасность. В данном случае мы просто и элегантно удаляем префиксы по всему проекту. Дальше мы удаляем из проекта введённые Microsoft'ом функции: SetConsoleTitleA().

-2

Так как эта функция просто изменяет заголовок консоли, то я просто выпилю её за ненадобностью. В проекте используется HANDLE для изменения цвета в консоли, его я тоже решил полностью удалить.

-3

Да и к тому же в Linux этого просто напросто нет, так как это уже Win API. Дальше самое интересное, это 2 строки кода с комментарием от разработчика.

-4

Я долго ломал голову над тем, как это работает. На сколько я понял, это вызов функций с передачей в них параметров без заголовочного ".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.

-5

Переписываем пути на новые.

  • "./Open Steamworks/Resources/Libs/libsteam.so"
  • "./Open Steamworks/Resources/Libs/steamclient.so"

Дальше нужно найти файл "IClientUser.h" и дописать недостающие функции.

-6

И в основном классе меняем вызовы на нормальные. На этом портирование можно считать завершённым.

Доработка программы

Я же не просто так решил перенести программу на Linux, а ещё и доработать 2 момента:

  1. Добавить новый параметр для 2FA кода Steam в аргументах командной строки
  2. Переделать логику запроса нового предмета

Ну первое это вообще фигня.

-7

И добавляем сразу запуск клиента после всех проверок

-8

Готово. Теперь меняем надо поменять логику. Изначально программа при авторизации пользователя сразу начинает "клянчить" предмет у Steam, дёргая функцию TriggerItemDrop(). Но я хочу, чтобы программа запустилась, и ждала Callback с id 819. Зачем это? Если честно, то я сам не знаю, просто после этого Callback'а нас не отключат от Steam. Дописываем в конец второго цикла while

-9

Вот теперь точно всё. Собираем в g++ и запускаем. Дальше можно написать загрузчик на bash и поставить под cron. Получилась полностью автоматическая ферма для ботов, которая добывает вещи из игр.

Полностью готовый проект можно посмотреть на GitHub.

Всего вам хорошего.