Skip to content

Commit

Permalink
Merge pull request #38 from M4RCK5/dev
Browse files Browse the repository at this point in the history
Lobby Connect Improvements + MBTL Fix
  • Loading branch information
Detanup01 authored Sep 15, 2024
2 parents cd8fcaf + fcd5237 commit ca66c1b
Show file tree
Hide file tree
Showing 2 changed files with 118 additions and 96 deletions.
2 changes: 1 addition & 1 deletion dll/steam_user_stats_leaderboard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ unsigned int Steam_User_Stats::cache_leaderboard_ifneeded(const std::string &nam

// create a new entry in-memory and try reading the entries from disk
struct Steam_Leaderboard new_board{};
new_board.name = common_helpers::ascii_to_lowercase(name);
new_board.name = name;
new_board.sort_method = eLeaderboardSortMethod;
new_board.display_type = eLeaderboardDisplayType;
new_board.entries = load_leaderboard_entries(name);
Expand Down
212 changes: 117 additions & 95 deletions tools/lobby_connect/lobby_connect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,18 @@
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#else

#endif

void title() {
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif

std::cout << "\n----Lobby Connect----\n\n";
}

int main() {
std::string appid_str(std::to_string(LOBBY_CONNECT_APPID));
set_env_variable("SteamAppId", appid_str);
Expand All @@ -45,28 +54,32 @@ int main() {

//Set appid to: LOBBY_CONNECT_APPID
SteamAPI_RestartAppIfNecessary(LOBBY_CONNECT_APPID);
std::cout << "This is a program to find lobbies and run the game with lobby connect parameters" << std::endl;
std::cout << "Api initialized, ";
top:
std::cout << "waiting a few seconds for connections:" << std::endl;

refresh:
title();
std::cout << "Please wait...\n";

for (int i = 0; i < 10; ++i) {
SteamAPI_RunCallbacks();
std::this_thread::sleep_for(std::chrono::milliseconds(200));
}

int friend_count = SteamFriends()->GetFriendCount(k_EFriendFlagAll);
std::cout << "People on the network: " << friend_count << std::endl;

/*
std::cout << "People on the network: " << friend_count << "\n";
for (int i = 0; i < friend_count; ++i) {
CSteamID id = SteamFriends()->GetFriendByIndex(i, k_EFriendFlagAll);
const char *name = SteamFriends()->GetFriendPersonaName(id);

FriendGameInfo_t friend_info = {};
SteamFriends()->GetFriendGamePlayed(id, &friend_info);
std::cout << name << " is playing: " << friend_info.m_gameID.AppID() << std::endl;
}

std::cout << std::endl << "--------------Menu-------------" << std::endl << "\tappid\tname\tcommand line" << std::endl;

*/

title();

std::vector<std::pair<std::string, uint32>> arguments;
for (int i = 0; i < friend_count; ++i) {
CSteamID id = SteamFriends()->GetFriendByIndex(i, k_EFriendFlagAll);
Expand All @@ -75,100 +88,109 @@ int main() {
FriendGameInfo_t friend_info = {};
SteamFriends()->GetFriendGamePlayed(id, &friend_info);
auto appid = friend_info.m_gameID.AppID();

if (strlen(connect) > 0) {
std::cout << arguments.size() << "\t" << appid << "\t" << name << "\t" << connect << std::endl;
std::cout << arguments.size() << " - " << name << " is playing " << appid << " (" << connect << ").\n";
arguments.emplace_back(connect, appid);
} else {
if (friend_info.m_steamIDLobby != k_steamIDNil) {
std::string connect = "+connect_lobby " + std::to_string(friend_info.m_steamIDLobby.ConvertToUint64());
std::cout << arguments.size() << "\t" << appid << "\t" << name << "\t" << connect << std::endl;
std::cout << arguments.size() << " - " << name << " is playing " << appid << " (" << connect << ").\n";
arguments.emplace_back(connect, appid);
}
}
}

std::cout << arguments.size() << ": Retry." << std::endl;
std::cout << std::endl << "Enter the number corresponding to your choice then press Enter." << std::endl;
std::cout << arguments.size() << " - Refresh.\n\n";
std::cout << "Choose an option: ";
unsigned int choice;
std::cin >> choice;

if (choice >= arguments.size()) goto top;


if (std::cin.fail() || choice >= arguments.size()) {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
goto refresh;
}

title();

auto connect = arguments[choice].first;
#ifdef _WIN32
auto appid = arguments[choice].second;
std::cout << "starting the game with: " << connect << std::endl;

char szBaseDirectory[MAX_PATH] = "";
GetModuleFileNameA(0, szBaseDirectory, MAX_PATH);
if (auto bs = strrchr(szBaseDirectory, '\\')) {
*bs = '\0';
}
auto lobbyFile = std::string(szBaseDirectory) + "\\lobby_connect_" + std::to_string(appid) + ".txt";

auto readLobbyFile = [&lobbyFile]() {
std::string data;
std::ifstream ifs(std::filesystem::u8path(lobbyFile));
if (ifs.is_open())
std::getline(ifs, data);
return data;
};

auto writeLobbyFile = [&lobbyFile](const std::string& data) {
std::ofstream ofs(std::filesystem::u8path(lobbyFile));
ofs << data << std::endl;
};

auto fileExists = [](const std::string& filename) {
std::ifstream ifs(std::filesystem::u8path(filename));
return ifs.is_open();
};

auto joinLobby = [&connect](std::string filename) {
filename = "\"" + filename + "\" " + connect;
std::cout << filename << std::endl;

STARTUPINFOA lpStartupInfo;
PROCESS_INFORMATION lpProcessInfo;

ZeroMemory( &lpStartupInfo, sizeof( lpStartupInfo ) );
lpStartupInfo.cb = sizeof( lpStartupInfo );
ZeroMemory( &lpProcessInfo, sizeof( lpProcessInfo ) );

auto success = !!CreateProcessA( NULL,
const_cast<char *>(filename.c_str()), NULL, NULL,
NULL, NULL, NULL, NULL,
&lpStartupInfo,
&lpProcessInfo
);

CloseHandle(lpProcessInfo.hThread);
CloseHandle(lpProcessInfo.hProcess);
return success;
};

std::string filename = readLobbyFile();
if (filename.empty() || !fileExists(filename) || !joinLobby(filename)) {
std::cout << "Please select the game exe" << std::endl;

OPENFILENAMEA ofn;
char szFileName[MAX_PATH] = "";
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = 0;
ofn.lpstrFilter = "Exe Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0";
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = "exe";
if(GetOpenFileNameA(&ofn) && joinLobby(szFileName)) {
writeLobbyFile(szFileName);
}
}
#else
std::cout << "Please launch the game with these arguments: " << connect << std::endl;
#endif


#ifdef _WIN32
auto appid = arguments[choice].second;
std::cout << "Starting the game with: " << connect << "\n";

char szBaseDirectory[MAX_PATH] = "";
GetModuleFileNameA(0, szBaseDirectory, MAX_PATH);
if (auto bs = strrchr(szBaseDirectory, '\\')) {
*bs = '\0';
}
auto lobbyFile = std::string(szBaseDirectory) + "\\lobby_connect_" + std::to_string(appid) + ".txt";

auto readLobbyFile = [&lobbyFile]() {
std::string data;
std::ifstream ifs(std::filesystem::u8path(lobbyFile));
if (ifs.is_open())
std::getline(ifs, data);
return data;
};

auto writeLobbyFile = [&lobbyFile](const std::string& data) {
std::ofstream ofs(std::filesystem::u8path(lobbyFile));
ofs << data << "\n";
};

auto fileExists = [](const std::string& filename) {
std::ifstream ifs(std::filesystem::u8path(filename));
return ifs.is_open();
};

auto joinLobby = [&connect](std::string filename) {
filename = "\"" + filename + "\" " + connect;
std::cout << filename << std::endl;

STARTUPINFOA lpStartupInfo;
PROCESS_INFORMATION lpProcessInfo;

ZeroMemory( &lpStartupInfo, sizeof( lpStartupInfo ) );
lpStartupInfo.cb = sizeof( lpStartupInfo );
ZeroMemory( &lpProcessInfo, sizeof( lpProcessInfo ) );

auto success = !!CreateProcessA( NULL,
const_cast<char *>(filename.c_str()), NULL, NULL,
NULL, NULL, NULL, NULL,
&lpStartupInfo,
&lpProcessInfo
);

CloseHandle(lpProcessInfo.hThread);
CloseHandle(lpProcessInfo.hProcess);
return success;
};

std::string filename = readLobbyFile();
if (filename.empty() || !fileExists(filename) || !joinLobby(filename)) {
std::cout << "Please select the game executable.\n";

OPENFILENAMEA ofn;
char szFileName[MAX_PATH] = "";
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = 0;
ofn.lpstrFilter = "Exe Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0";
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = "exe";
if(GetOpenFileNameA(&ofn) && joinLobby(szFileName)) {
writeLobbyFile(szFileName);
}
}
#else
std::cout << "Please launch the game with these arguments: " << connect << "\n\n";
#endif

return 0;
}


0 comments on commit ca66c1b

Please sign in to comment.