Hello World
This commit is contained in:
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
42
accept-quest.html
Normal file
42
accept-quest.html
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<script type="text/javascript">
|
||||||
|
RED.nodes.registerType('habitica-accept-quest', {
|
||||||
|
category: 'Habitica',
|
||||||
|
color: '#a6bbcf',
|
||||||
|
defaults: {
|
||||||
|
name: {value: ''},
|
||||||
|
apiAccount: {value: '', type: 'habitica-account', required: true},
|
||||||
|
account: {value: '', type: 'habitica-account', required: true},
|
||||||
|
},
|
||||||
|
inputs: 1,
|
||||||
|
outputs: 1,
|
||||||
|
icon: 'file.png',
|
||||||
|
label: function() {
|
||||||
|
return this.name || 'Habitica: Accepting quest';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/html" data-template-name="habitica-accept-quest">
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="node-input-name">
|
||||||
|
<i class="fa fa-tag"></i> Name
|
||||||
|
</label>
|
||||||
|
<input type="text" id="node-input-name" placeholder="Name" />
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="node-input-apiAccount">
|
||||||
|
<i class="fa fa-tag"></i> API Account
|
||||||
|
</label>
|
||||||
|
<input type="text" id="node-input-apiAccount" placeholder="API Account" />
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="node-input-account">
|
||||||
|
<i class="fa fa-tag"></i> Account
|
||||||
|
</label>
|
||||||
|
<input type="text" id="node-input-account" placeholder="Account" />
|
||||||
|
</div>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/html" data-help-name="habitica-accept-quest">
|
||||||
|
<p>Accept pending quest from the Habitica API.</p>
|
||||||
|
</script>
|
59
accept-quest.js
Normal file
59
accept-quest.js
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
const https = require('https');
|
||||||
|
|
||||||
|
module.exports = RED => {
|
||||||
|
function UserProfileNode(config) {
|
||||||
|
const node = this;
|
||||||
|
|
||||||
|
RED.nodes.createNode(node, config);
|
||||||
|
|
||||||
|
node.apiAccount = RED.nodes.getNode(config.apiAccount);
|
||||||
|
node.account = RED.nodes.getNode(config.account);
|
||||||
|
|
||||||
|
const handleErr = (err, debugErr) => {
|
||||||
|
console.log(debugErr);
|
||||||
|
node.error('Something done broke: '+err);
|
||||||
|
node.status({fill: 'red', shape: 'ring', text: 'Error accepting quest: '+err});
|
||||||
|
};
|
||||||
|
|
||||||
|
node.on('input', async function(msg) {
|
||||||
|
|
||||||
|
const group_id = 'party';
|
||||||
|
|
||||||
|
const opts = {
|
||||||
|
host: 'habitica.com',
|
||||||
|
path: `/api/v3/groups/${group_id}/quests/accept`,
|
||||||
|
headers: {
|
||||||
|
'X-Client': `${node.apiAccount.username}-NodeRED`,
|
||||||
|
'X-API-User': node.account.userId,
|
||||||
|
'X-API-Key': node.account.apiToken,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
https.get(opts, req => {
|
||||||
|
req.setEncoding('utf-8');
|
||||||
|
|
||||||
|
let body = '',
|
||||||
|
response = null;
|
||||||
|
|
||||||
|
req.on('data', data => {
|
||||||
|
body += data;
|
||||||
|
});
|
||||||
|
|
||||||
|
req.on('end', () => {
|
||||||
|
response = JSON.parse(body);
|
||||||
|
|
||||||
|
msg.payload = response.data;
|
||||||
|
if (response.success) {
|
||||||
|
node.send(msg);
|
||||||
|
node.status({fill: 'green', shape: 'dot', text: 'Quest accepted'});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
handleErr('The response was not successful: '+response.message, body);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).on('error', err => handleErr(err));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
RED.nodes.registerType('habitica-accept-quest', UserProfileNode);
|
||||||
|
};
|
52
group.html
Normal file
52
group.html
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<script type="text/javascript">
|
||||||
|
RED.nodes.registerType('habitica-group', {
|
||||||
|
category: 'Habitica',
|
||||||
|
color: '#a6bbcf',
|
||||||
|
defaults: {
|
||||||
|
name: {value: ''},
|
||||||
|
apiAccount: {value: '', type: 'habitica-account', required: true},
|
||||||
|
account: {value: '', type: 'habitica-account', required: true},
|
||||||
|
fields: {value: ''},
|
||||||
|
},
|
||||||
|
inputs: 1,
|
||||||
|
outputs: 1,
|
||||||
|
icon: 'file.png',
|
||||||
|
label: function() {
|
||||||
|
return this.name || 'Habitica: Group';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/html" data-template-name="habitica-group">
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="node-input-name">
|
||||||
|
<i class="fa fa-tag"></i> Name
|
||||||
|
</label>
|
||||||
|
<input type="text" id="node-input-name" placeholder="Name" />
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="node-input-apiAccount">
|
||||||
|
<i class="fa fa-tag"></i> API Account
|
||||||
|
</label>
|
||||||
|
<input type="text" id="node-input-apiAccount" placeholder="API Account" />
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="node-input-account">
|
||||||
|
<i class="fa fa-tag"></i> Account
|
||||||
|
</label>
|
||||||
|
<input type="text" id="node-input-account" placeholder="Account" />
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="node-input-fields-editor">
|
||||||
|
<i class="fa fa-tag"></i> Fields
|
||||||
|
</label>
|
||||||
|
<div style="height: 250px; min-height:150px;" class="node-text-editor" id="node-input-fields-editor"></div>
|
||||||
|
<small>Enter one or more fields, separated by commas or line breaks. For sub-fields, use "dot-notation" such as <code>items.gear</code>. <a href="https://github.com/HabitRPG/habitica/blob/develop/website/server/models/user/schema.js">See the Habitica user schema</a> for more information.</small>
|
||||||
|
<br />
|
||||||
|
<small><em>Example: <code>stats,achievements,items.gear</code></em></small>
|
||||||
|
</div>
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/html" data-help-name="habitica-group">
|
||||||
|
<p>Retrieve profile information for a given user from the Habitica API.</p>
|
||||||
|
</script>
|
56
group.js
Normal file
56
group.js
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
const https = require('https');
|
||||||
|
|
||||||
|
module.exports = RED => {
|
||||||
|
function UserProfileNode(config) {
|
||||||
|
const node = this;
|
||||||
|
|
||||||
|
RED.nodes.createNode(node, config);
|
||||||
|
|
||||||
|
node.apiAccount = RED.nodes.getNode(config.apiAccount);
|
||||||
|
node.account = RED.nodes.getNode(config.account);
|
||||||
|
|
||||||
|
const handleErr = (err) => {
|
||||||
|
console.log(err);
|
||||||
|
node.error('Something done broke');
|
||||||
|
node.status({fill: 'red', shape: 'ring', text: 'Error retrieving profile'});
|
||||||
|
};
|
||||||
|
|
||||||
|
node.on('input', async function(msg) {
|
||||||
|
const opts = {
|
||||||
|
host: 'habitica.com',
|
||||||
|
path: `/api/v3/groups/party`,
|
||||||
|
headers: {
|
||||||
|
'X-Client': `${node.apiAccount.username}-NodeRED`,
|
||||||
|
'X-API-User': node.account.userId,
|
||||||
|
'X-API-Key': node.account.apiToken,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
https.get(opts, req => {
|
||||||
|
req.setEncoding('utf-8');
|
||||||
|
|
||||||
|
let body = '',
|
||||||
|
response = null;
|
||||||
|
|
||||||
|
req.on('data', data => {
|
||||||
|
body += data;
|
||||||
|
});
|
||||||
|
|
||||||
|
req.on('end', () => {
|
||||||
|
response = JSON.parse(body);
|
||||||
|
|
||||||
|
if (response.success) {
|
||||||
|
msg.payload = response.data;
|
||||||
|
node.send(msg);
|
||||||
|
node.status({fill: 'green', shape: 'dot', text: 'Group retrieved'});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
handleErr('The response was not successful');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).on('error', err => handleErr(err));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
RED.nodes.registerType('habitica-group', UserProfileNode);
|
||||||
|
};
|
28
habitica-account.html
Normal file
28
habitica-account.html
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<script type="text/javascript">
|
||||||
|
RED.nodes.registerType('habitica-account', {
|
||||||
|
category: 'config',
|
||||||
|
defaults: {
|
||||||
|
username: {value: '', required: true},
|
||||||
|
userId: {value: '', required: true},
|
||||||
|
apiToken: {value: '', required: true},
|
||||||
|
},
|
||||||
|
label: function() {
|
||||||
|
return this.username;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/html" data-template-name="habitica-account">
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="node-config-input-username"><i class="fa fa-bookmark"></i> Local user id</label>
|
||||||
|
<input type="text" id="node-config-input-username">
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="node-config-input-userId"><i class="fa fa-bookmark"></i> Habitica User ID</label>
|
||||||
|
<input type="text" id="node-config-input-userId">
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="node-config-input-apiToken"><i class="fa fa-bookmark"></i> Habitica API Token</label>
|
||||||
|
<input type="text" id="node-config-input-apiToken">
|
||||||
|
</div>
|
||||||
|
</script>
|
11
habitica-account.js
Normal file
11
habitica-account.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
module.exports = RED => {
|
||||||
|
function HabiticaAccountNode(n) {
|
||||||
|
RED.nodes.createNode(this, n);
|
||||||
|
|
||||||
|
this.username = n.username;
|
||||||
|
this.userId = n.userId;
|
||||||
|
this.apiToken = n.apiToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
RED.nodes.registerType('habitica-account', HabiticaAccountNode);
|
||||||
|
};
|
6622
package-lock.json
generated
Normal file
6622
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
39
package.json
Normal file
39
package.json
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"name": "node-red-contrib-habitica-quest",
|
||||||
|
"description": "NodeRED plugin to provide nodes for interacting with the Habitica API.",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"author": "Clément Desmidt <projets@shiki.fr>",
|
||||||
|
"license": "MIT",
|
||||||
|
"keywords": [
|
||||||
|
"node-red",
|
||||||
|
"habitica"
|
||||||
|
],
|
||||||
|
"devDependencies": {
|
||||||
|
"@commitlint/cli": "11.0.0",
|
||||||
|
"@commitlint/config-conventional": "11.0.0",
|
||||||
|
"@types/node": "^14.14.9",
|
||||||
|
"@types/node-red": "^1.1.1",
|
||||||
|
"commitizen": "4.2.2",
|
||||||
|
"cz-conventional-changelog": "3.3.0",
|
||||||
|
"husky": "5.0.0-beta.0",
|
||||||
|
"pinst": "2.0.0",
|
||||||
|
"standard-version": "9.0.0"
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"commitizen": {
|
||||||
|
"path": "./node_modules/cz-conventional-changelog"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commitlint": {
|
||||||
|
"extends": [
|
||||||
|
"@commitlint/config-conventional"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node-red": {
|
||||||
|
"nodes": {
|
||||||
|
"habitica-account": "habitica-account.js",
|
||||||
|
"habitica-group": "group.js",
|
||||||
|
"habitica-accept-quest": "accept-quest.js"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user