diff --git a/SteamCSV.js b/SteamCSV.js
index 33534e2..95b7794 100644
--- a/SteamCSV.js
+++ b/SteamCSV.js
@@ -91,3 +91,24 @@ export async function QueryWishlistActionsForCSV({ dateStart = DATE_START, dateE
cookie
);
}
+
+export async function QueryFollowers({ id }) {
+ const res = await fetch(`https://steamcommunity.com/games/${id}/memberslistxml/?xml=1`);
+ const textBody = await res.text();
+
+ // We can't parse XML in NodeJS without modules ? Okay, let's do it manually !
+
+ // 1. Take groupDetails
+ const relevantPart = textBody.split('')[1].split('')[0];
+
+ // 2. Check Invalid format
+ if(!relevantPart.includes('')) {
+ throw new Error('Invalid XML !');
+ }
+
+ // 3. Extract data
+ return parseInt(
+ relevantPart.split('')[1].split('')[0],
+ 10
+ );
+}
\ No newline at end of file
diff --git a/main.server.js b/main.server.js
index adb8ccf..59b7318 100644
--- a/main.server.js
+++ b/main.server.js
@@ -1,4 +1,4 @@
-import { QueryPackageSalesForCSV, QueryWishlistActionsForCSV } from './SteamCSV.js';
+import { QueryPackageSalesForCSV, QueryWishlistActionsForCSV, QueryFollowers } from './SteamCSV.js';
const COOKIE_FORMAT = (runAs) => config.COOKIE_FORMAT.replace('${runAs}', runAs);
@@ -36,15 +36,16 @@ export default class SteamSoldWishlist {
await SteamSoldWishlist.UpdateSoldAmount();
} catch(e) {
log(' ' + e.message, 'error');
- SteamSoldWishlist.running = false;
- return;
}
try {
await SteamSoldWishlist.UpdateWishlistAmount();
} catch(e) {
log(' ' + e.message, 'error');
- SteamSoldWishlist.running = false;
- return;
+ }
+ try {
+ await SteamSoldWishlist.UpdateFollowers();
+ } catch(e) {
+ log(' ' + e.message, 'error');
}
SteamSoldWishlist.running = false;
}
@@ -63,39 +64,55 @@ export default class SteamSoldWishlist {
)
`;
- const dbData = (await Database.execQuery('SELECT * FROM steam_sold')).rows;
+ await Database.execQuery('BEGIN');
- for(const currentPackage of config.soldPackages) {
- const data = await QueryPackageSalesForCSV({ ...currentPackage, cookie: COOKIE_FORMAT(currentPackage.runAs) });
-
- for(const line of data) {
- const currentDate = (new Date(line['Date'] + 'T00:00:00.000Z')).getTime();
+ await Database.execQuery(`
+ DELETE FROM steam_sold
+ WHERE date > (
+ SELECT MAX(date) FROM steam_sold
+ ) - interval '35d'
+ `);
- if(dbData.find((data) =>
- data.bundle_id == line['Bundle(ID#)'] &&
- data.product_id == line['Product(ID#)'] &&
- (data.date.getTime() == currentDate) &&
- data.country_code == line['Country Code'] &&
- data.type == line["Type"] &&
- data.gross_units_sold == line["Gross Units Sold"] &&
- data.net_units_sold == line["Net Units Sold"] &&
- data.gross_steam_sale_usd == line["Gross Steam Sales (USD)"] &&
- data.net_steam_sale_usd == line["Net Steam Sales (USD)"]
- )) {
- continue;
- }
-
- try {
- await Database.execQuery(
- query,
- Object.values(line)
- );
- } catch(e) {
- // Do nothing
+ try {
+ const dbData = (await Database.execQuery('SELECT * FROM steam_sold')).rows;
+
+ for(const currentPackage of config.soldPackages) {
+ const data = await QueryPackageSalesForCSV({ ...currentPackage, cookie: COOKIE_FORMAT(currentPackage.runAs) });
+
+ for(const line of data) {
+ const currentDate = (new Date(line['Date'] + 'T00:00:00.000Z')).getTime();
+
+ if(dbData.find((data) =>
+ data.bundle_id == line['Bundle(ID#)'] &&
+ data.product_id == line['Product(ID#)'] &&
+ (data.date.getTime() == currentDate) &&
+ data.country_code == line['Country Code'] &&
+ data.type == line["Type"] &&
+ data.gross_units_sold == line["Gross Units Sold"] &&
+ data.net_units_sold == line["Net Units Sold"] &&
+ data.gross_steam_sale_usd == line["Gross Steam Sales (USD)"] &&
+ data.net_steam_sale_usd == line["Net Steam Sales (USD)"]
+ )) {
+ continue;
+ }
+
+ try {
+ await Database.execQuery(
+ query,
+ Object.values(line)
+ );
+ } catch(e) {
+ log(' ' + e.message, 'error');
+ }
}
}
+ } catch(e) {
+ await Database.execQuery('ROLLBACK');
+ throw e;
}
+ await Database.execQuery('COMMIT');
+
log('Saved Steam sold status', 'info');
}
@@ -126,13 +143,32 @@ export default class SteamSoldWishlist {
Object.values(line)
);
} catch(e) {
- // Do nothing
+ log(' ' + e.message, 'error');
}
}
}
log('Saved Steam wishlist status', 'info');
}
+
+ static async UpdateFollowers() {
+ const query = 'INSERT INTO public.steam_followers(datelocal, game, amount) VALUES ($1, $2, $3)'
+
+ for(const currentPackage of config.wishlistApps) {
+ const amount = await QueryFollowers({ id: currentPackage.id });
+
+ try {
+ await Database.execQuery(
+ query,
+ [new Date(), currentPackage.name, amount]
+ );
+ } catch(e) {
+ log(' ' + e.message, 'error');
+ }
+ }
+
+ log('Saved Steam followers status', 'info');
+ }
}
SteamSoldWishlist.init();
\ No newline at end of file