Yo my dudes,
Here's an updated TS script which works with the lastest version of nrelay.
Also, merged some changes from thread 1392628 which makes retrieving rewards less error prone.
Code:
import {
Client,
Library,
Runtime,
Events,
Logger,
LogLevel,
HttpClient,
GoToQuestRoomPacket,
ClaimDailyRewardMessage
} from 'nrelay';
@Library({
name: 'Auto claim daily rewards',
author: 'tcrane, kiwi5, headlesspiranha, d00dguy1337',
enabled: true
})
class CollectorPlugin {
constructor(runtime: Runtime) {
runtime.on(Events.ClientReady, (client: Client) => {
switch(client.mapInfo.name) {
case 'Nexus':
this.GoToQuestRoom(client);
break;
case 'Daily Quest Room':
this.ClaimDailyRewards(client);
break;
default:
Logger.log('Collector', `Unknown map ${client.mapInfo.name}!`, LogLevel.Error);
this.logOut(client);
};
});
}
private GoToQuestRoom(client: Client) {
Logger.log('Collector', `Sending ${client.alias} to quest room...`);
const gotoQuestRoom = new GoToQuestRoomPacket();
client.io.send(gotoQuestRoom);
}
private ClaimDailyRewards(client: Client) {
Logger.log('Collector', `Fetching calendar for ${client.alias}...`);
HttpClient
.get('https://realmofthemadgodhrd.appspo*****m/dailyLogin/fetchCalendar', {
query: {
guid: client.guid,
password: client.password
}
})
.then((response) => {
const items = this.getKeys(response);
if (items.length === 0) {
Logger.log('Collector', `Nothing to collect for ${client.alias}!`);
this.logOut(client);
} else {
Logger.log('Collector', `Collecting ${items.length} item${items.length === 1 ? '' : 's'} for ${client.alias}`);
this
.collect(items, client)
.then(() => {
Logger.log('Collector', `Finished collecting items for ${client.alias}!`)
setTimeout(() => this.logOut(client), 2000);
});
}
})
.catch((error) => {
Logger.log('Collector', `Error fetching calendar for ${client.alias}!`);
Logger.log('Collector', error.message, LogLevel.Error);
this.logOut(client);
});
}
private logOut(client: Client) {
Logger.log('Collector', `Loging out ${client.alias}`);
client.destroy();
}
private getKeys(xml: string): string[] {
const items: string[] = [];
const parseString = require("xml2js").parseString;
parseString(xml,
{
mergeAttrs: true,
trim: true,
explicitArray: false
},
function (err: any, result: any) {
const json = JSON.stringify(result);
const parsedJson = JSON.parse(json);
for (const loginReward of parsedJson.LoginRewards.NonConsecutive.Login) {
if (loginReward.key) {
items.push(loginReward.key);
}
}
}
);
return items;
}
private collect(collectables: string[], client: Client): Promise<void> {
return new Promise((resolve, reject) => {
const collect = (item: string) => {
const claim = new ClaimDailyRewardMessage();
claim.claimKey = item;
claim.claimType = 'nonconsecutive';
client.io.send(claim);
if (collectables.length > 0) {
setTimeout(() => {
collect(collectables.shift());
}, 1500);
} else {
resolve();
}
};
collect(collectables.shift());
});
}
}
Also, change your versions.json with the following (as the updater fails to update it correctly to this day)
Code:
{
"assetVersion": "1587115536",
"clientVersion": "1587115536",
"buildVersion": "X33.0.1",
"clientToken": "XTeP7hERdchV5jrBZEYNebAqDPU6tKU6"
}
Now, to build and all
- npm i xml2js
- nrelay build
- nrelay run --update-from=AssembleeGameClient1587115536.swf --force-update
Here AssembleeGameClient1587115536 is the latest SWF (to this day) which you can get from the realmofthemadgod website.
Now you can for the subsequent runs just do
- nrelay run