2024-03-17 21:58:42 +08:00
|
|
|
SteamID = require('steamid');
|
|
|
|
SteamUser = require('steam-user');
|
|
|
|
SteamTotp = require('steam-totp');
|
|
|
|
fs = require('fs');
|
|
|
|
winston = require("winston");
|
|
|
|
logger = winston.createLogger({
|
|
|
|
level: 'info',
|
|
|
|
format: winston.format.json(),
|
|
|
|
defaultMeta: {service: 'steam-logger'},
|
|
|
|
transports: [
|
|
|
|
new winston.transports.Console(),
|
|
|
|
]
|
|
|
|
});
|
|
|
|
|
|
|
|
const users = {};
|
|
|
|
|
|
|
|
fs.mkdir("./logs", {recursive: true}, (err) => {
|
|
|
|
if (err) {
|
2024-03-17 23:13:10 +08:00
|
|
|
logger.error("an error occurred while creating the logs directory: " + err);
|
2024-03-17 21:58:42 +08:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
const steamUser = new SteamUser();
|
|
|
|
|
|
|
|
steamUser.setOption("renewRefreshTokens", true);
|
|
|
|
steamUser.on("refreshToken", (refreshToken) => {
|
|
|
|
logger.info("Refresh token: " + refreshToken);
|
|
|
|
fs.writeFileSync('refresh.token', refreshToken);
|
|
|
|
});
|
|
|
|
|
|
|
|
config = require("./config.js");
|
|
|
|
|
|
|
|
try {
|
|
|
|
refreshToken = fs.readFileSync('refresh.token', 'utf8');
|
|
|
|
|
2024-03-18 00:21:54 +08:00
|
|
|
if (refreshToken && refreshToken.length > 0) {
|
2024-03-18 00:18:38 +08:00
|
|
|
const LogOnOptionsAUTO = {
|
|
|
|
logonID: config.logonID,
|
|
|
|
refreshToken: refreshToken,
|
|
|
|
steamID: config.steamID,
|
|
|
|
};
|
|
|
|
steamUser.logOn(LogOnOptionsAUTO);
|
|
|
|
} else {
|
|
|
|
steamUser.logOn({
|
|
|
|
accountName: config.accountName,
|
|
|
|
password: config.password,
|
|
|
|
logonID: config.logonID,
|
|
|
|
steamID: config.steamID,
|
|
|
|
});
|
|
|
|
}
|
2024-03-17 21:58:42 +08:00
|
|
|
} catch (e) {
|
|
|
|
logger.warn(`failed to load session: ${e.message}`)
|
|
|
|
|
|
|
|
steamUser.logOn({
|
|
|
|
accountName: config.accountName,
|
|
|
|
password: config.password,
|
|
|
|
logonID: config.logonID,
|
2024-03-18 00:18:38 +08:00
|
|
|
steamID: config.steamID,
|
2024-03-17 21:58:42 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
steamUser.on('loggedOn', () => {
|
|
|
|
logger.info(`login to Steam as ${steamUser.steamID}`);
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {SteamID} steamID
|
|
|
|
* @returns {Promise<{player_name: string}>}
|
|
|
|
*/
|
|
|
|
async function getUserInfo(steamID) {
|
|
|
|
let sender = users[steamID.getSteamID64()];
|
|
|
|
// if user is not cached
|
|
|
|
if (!sender) {
|
|
|
|
try {
|
|
|
|
let personasResult = await steamUser.getPersonas([steamID]);
|
|
|
|
users[steamID.getSteamID64()] = personasResult.personas[steamID.getSteamID64()];
|
|
|
|
sender = users[steamID.getSteamID64()];
|
|
|
|
|
2024-03-17 23:13:10 +08:00
|
|
|
importChatHistory(steamID);
|
|
|
|
|
|
|
|
// noinspection ES6MissingAwait
|
|
|
|
logger.info("user data received: " + JSON.stringify(sender));
|
2024-03-17 21:58:42 +08:00
|
|
|
} catch (err) {
|
2024-03-17 23:13:10 +08:00
|
|
|
logger.error("an error occurred while getting user data: ", err);
|
2024-03-17 21:58:42 +08:00
|
|
|
sender = {
|
|
|
|
player_name: "Unknown",
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return sender;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {string} date
|
|
|
|
* @param {SteamID} steamID
|
|
|
|
* @param {string} message
|
|
|
|
* @param {boolean} echo
|
2024-03-17 23:13:10 +08:00
|
|
|
* @param {number} ordinal
|
2024-03-17 21:58:42 +08:00
|
|
|
* @returns {Promise<void>}
|
|
|
|
*/
|
|
|
|
async function logMessage(date, steamID, message, echo, ordinal) {
|
2024-03-17 23:13:10 +08:00
|
|
|
// try to get chat history
|
|
|
|
await getUserInfo(steamID);
|
|
|
|
|
2024-03-17 21:58:42 +08:00
|
|
|
let sender = await getUserInfo(echo ? steamUser.steamID : steamID);
|
|
|
|
logger.info("log steam chat message", {
|
|
|
|
echo: echo,
|
|
|
|
id: steamID.getSteamID64(),
|
|
|
|
name: sender.player_name,
|
|
|
|
message: message,
|
|
|
|
ordinal: ordinal,
|
|
|
|
});
|
|
|
|
fs.appendFile("./logs/chat.jsonl", JSON.stringify({
|
|
|
|
date: date,
|
|
|
|
echo: echo,
|
|
|
|
id: steamID.getSteamID64(),
|
|
|
|
name: sender.player_name,
|
|
|
|
message: message,
|
|
|
|
ordinal: ordinal,
|
|
|
|
}) + "\n", (e) => {
|
|
|
|
if (e) {
|
2024-03-17 23:13:10 +08:00
|
|
|
logger.error("an error occurred while writing chat log file: " + e);
|
2024-03-17 21:58:42 +08:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
steamUser.chat.on("friendMessage", (message) => {
|
|
|
|
// noinspection JSIgnoredPromiseFromCall
|
2024-03-17 23:13:10 +08:00
|
|
|
logMessage(dateToString(message.server_timestamp), message.steamid_friend, message.message, false, message.ordinal);
|
2024-03-17 21:58:42 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
steamUser.chat.on("friendMessageEcho", (message) => {
|
|
|
|
// noinspection JSIgnoredPromiseFromCall
|
2024-03-17 23:13:10 +08:00
|
|
|
logMessage(dateToString(message.server_timestamp), message.steamid_friend, message.message, true, message.ordinal);
|
2024-03-17 21:58:42 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {Date} date
|
|
|
|
* @returns {string}
|
|
|
|
*/
|
|
|
|
function dateToString(date) {
|
|
|
|
let milliseconds = date.getMilliseconds().toString().padStart(3, '0');
|
|
|
|
|
|
|
|
return `${date.toLocaleString()}.${milliseconds}`
|
|
|
|
}
|
2024-03-17 23:13:10 +08:00
|
|
|
|
|
|
|
function importChatHistory(steamID) {
|
|
|
|
if (steamID === steamUser.steamID) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2024-03-18 00:18:38 +08:00
|
|
|
steamUser.chat.getFriendMessageHistory(steamID.getSteamID64(), {
|
|
|
|
maxCount: 5
|
|
|
|
}, (err, messages) => {
|
2024-03-17 23:13:10 +08:00
|
|
|
if (err) {
|
|
|
|
logger.error("an error occurred while getting chat history: ", err);
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
for (let message of messages.messages) {
|
|
|
|
logger.info("get chat history", message);
|
|
|
|
logMessage(
|
|
|
|
dateToString(message.server_timestamp),
|
|
|
|
steamID, message.message,
|
2024-03-18 00:18:38 +08:00
|
|
|
message.sender.getSteamID64() === steamUser.steamID.getSteamID64(),
|
2024-03-17 23:13:10 +08:00
|
|
|
message.ordinal,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
steamUser: steamUser,
|
|
|
|
getUserInfo: getUserInfo,
|
|
|
|
}
|