feat: Added more inputs and outputs
All checks were successful
Build Docker / Build Image (push) Successful in 32s
All checks were successful
Build Docker / Build Image (push) Successful in 32s
This commit is contained in:
parent
5bb4e1bc4c
commit
441a0274ff
24
README.md
24
README.md
@ -40,6 +40,30 @@ If you have HSD running on a different IP/container
|
|||||||
sudo docker run -p 5000:5000 -e hsd_api=yourapikeyhere -e hsd_ip=hsdcontainer git.woodburn.au/nathanwoodburn/firewallet:latest
|
sudo docker run -p 5000:5000 -e hsd_api=yourapikeyhere -e hsd_ip=hsdcontainer git.woodburn.au/nathanwoodburn/firewallet:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Features
|
||||||
|
- Basic wallet functionality
|
||||||
|
- Send HNS
|
||||||
|
- Receive HNS
|
||||||
|
- Have multiple wallets
|
||||||
|
- View transactions
|
||||||
|
- View balance
|
||||||
|
- View wallet domains
|
||||||
|
- Domain management
|
||||||
|
- Transfer domains
|
||||||
|
- DNS Editor
|
||||||
|
- Renew domains
|
||||||
|
- Auctions
|
||||||
|
- Send open
|
||||||
|
- Send bid
|
||||||
|
- Send reveal
|
||||||
|
- Send redeem
|
||||||
|
- Download a list of all domains
|
||||||
|
- Resend all pending transactions
|
||||||
|
- Rescan
|
||||||
|
- Zap pending transactions
|
||||||
|
- View xPub
|
||||||
|
- Custom plugin support
|
||||||
|
|
||||||
## Themes
|
## Themes
|
||||||
Set a theme in the .env file
|
Set a theme in the .env file
|
||||||
**Available themes**
|
**Available themes**
|
||||||
|
15
main.py
15
main.py
@ -1083,7 +1083,20 @@ def plugin_function(plugin,function):
|
|||||||
inputs = module.listFunctions()[function]["params"]
|
inputs = module.listFunctions()[function]["params"]
|
||||||
request_data = {}
|
request_data = {}
|
||||||
for input in inputs:
|
for input in inputs:
|
||||||
request_data[input] = request.form.get(input)
|
request_data[input] = request.form.get(input)
|
||||||
|
|
||||||
|
if inputs[input]['type'] == "address":
|
||||||
|
# Handle hip2
|
||||||
|
address_check = account_module.check_address(request_data[input],True,True)
|
||||||
|
if not address_check:
|
||||||
|
return redirect("/plugin/" + plugin + "?error=Invalid address")
|
||||||
|
request_data[input] = address_check
|
||||||
|
elif inputs[input]['type'] == "dns":
|
||||||
|
# Handle URL encoding of DNS
|
||||||
|
request_data[input] = urllib.parse.unquote(request_data[input])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
response = module.runFunction(function,request_data,request.cookies.get("account"))
|
response = module.runFunction(function,request_data,request.cookies.get("account"))
|
||||||
if not response:
|
if not response:
|
||||||
|
43
plugins.md
Normal file
43
plugins.md
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# Plugins
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
### Plain Text
|
||||||
|
Type: `text`
|
||||||
|
|
||||||
|
### Long Text
|
||||||
|
Type: `longText`
|
||||||
|
|
||||||
|
### Number
|
||||||
|
Type: `number`
|
||||||
|
|
||||||
|
|
||||||
|
### Checkbox
|
||||||
|
Type: `checkbox`
|
||||||
|
|
||||||
|
### Address
|
||||||
|
Type: `address`
|
||||||
|
This will handle hip2 resolution for you so the function will always receive a valid address
|
||||||
|
|
||||||
|
### DNS
|
||||||
|
Type: `dns`
|
||||||
|
This isn't done yet but use it over text as it includes parsing
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
### Plain Text
|
||||||
|
Type: `text`
|
||||||
|
|
||||||
|
|
||||||
|
### List
|
||||||
|
Type: `list`
|
||||||
|
This is a list if text items (or HTML items)
|
||||||
|
|
||||||
|
### Transaction hash
|
||||||
|
Type: `tx`
|
||||||
|
This will display the hash and links to explorers
|
||||||
|
|
||||||
|
### DNS records
|
||||||
|
Type: `dns`
|
||||||
|
This will display DNS in a table format
|
@ -8,7 +8,7 @@ functions = {
|
|||||||
"description": "Check if domains in file are owned by the wallet",
|
"description": "Check if domains in file are owned by the wallet",
|
||||||
"params": {
|
"params": {
|
||||||
"domains": {
|
"domains": {
|
||||||
"name":"File of domains to check",
|
"name":"List of domains to check",
|
||||||
"type":"longText"
|
"type":"longText"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -36,6 +36,54 @@ functions = {
|
|||||||
"type": "list"
|
"type": "list"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"transfer":{
|
||||||
|
"name": "Bulk Transfer Domains",
|
||||||
|
"description": "Transfer domains to another wallet",
|
||||||
|
"params": {
|
||||||
|
"address": {
|
||||||
|
"name":"Address to transfer to",
|
||||||
|
"type":"address"
|
||||||
|
},
|
||||||
|
"domains": {
|
||||||
|
"name":"List of domains to transfer",
|
||||||
|
"type":"longText"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"returns": {
|
||||||
|
"hash": {
|
||||||
|
"name": "Hash of the transaction",
|
||||||
|
"type": "tx"
|
||||||
|
},
|
||||||
|
"address":{
|
||||||
|
"name": "Address of the new owner",
|
||||||
|
"type": "text"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dns":{
|
||||||
|
"name": "Set DNS for Domains",
|
||||||
|
"description": "Set DNS for domains",
|
||||||
|
"params": {
|
||||||
|
"domains": {
|
||||||
|
"name":"List of domains to set DNS for",
|
||||||
|
"type":"longText"
|
||||||
|
},
|
||||||
|
"dns": {
|
||||||
|
"name":"DNS",
|
||||||
|
"type":"dns"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"returns": {
|
||||||
|
"hash": {
|
||||||
|
"name": "Hash of the transaction",
|
||||||
|
"type": "tx"
|
||||||
|
},
|
||||||
|
"dns":{
|
||||||
|
"name": "DNS",
|
||||||
|
"type": "dns"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,6 +95,10 @@ def runFunction(function, params, authentication):
|
|||||||
return check(params['domains'], authentication)
|
return check(params['domains'], authentication)
|
||||||
elif function == "search":
|
elif function == "search":
|
||||||
return search(params['search'], authentication)
|
return search(params['search'], authentication)
|
||||||
|
elif function == "transfer":
|
||||||
|
return transfer(params['address'], params['domains'], authentication)
|
||||||
|
elif function == "dns":
|
||||||
|
return dns(params['domains'],params['dns'],authentication)
|
||||||
else:
|
else:
|
||||||
return "Function not found"
|
return "Function not found"
|
||||||
|
|
||||||
@ -74,3 +126,9 @@ def search(search, authentication):
|
|||||||
|
|
||||||
return {"domains": domains}
|
return {"domains": domains}
|
||||||
|
|
||||||
|
|
||||||
|
def transfer(address, domains, authentication):
|
||||||
|
return {"hash":"f921ffe1bb01884bf515a8079073ee9381cb93a56b486694eda2cce0719f27c0","address":address}
|
||||||
|
|
||||||
|
def dns(domains,dns,authentication):
|
||||||
|
return {"hash":"f921ffe1bb01884bf515a8079073ee9381cb93a56b486694eda2cce0719f27c0","dns":dns}
|
17
render.py
17
render.py
@ -1,6 +1,7 @@
|
|||||||
import datetime
|
import datetime
|
||||||
import json
|
import json
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
|
from flask import render_template
|
||||||
|
|
||||||
def domains(domains):
|
def domains(domains):
|
||||||
html = ''
|
html = ''
|
||||||
@ -218,6 +219,15 @@ def plugin_functions(functions, pluginName):
|
|||||||
html += f'<input class="form-control" type="number" name="{param}" />'
|
html += f'<input class="form-control" type="number" name="{param}" />'
|
||||||
elif paramType == "checkbox":
|
elif paramType == "checkbox":
|
||||||
html += f'<div class="form-check"><input id="{param}" class="form-check-input" type="checkbox" name="{param}" /><label class="form-check-label" for="{param}">{paramName}</label></div>'
|
html += f'<div class="form-check"><input id="{param}" class="form-check-input" type="checkbox" name="{param}" /><label class="form-check-label" for="{param}">{paramName}</label></div>'
|
||||||
|
elif paramType == "address":
|
||||||
|
# render components/address.html
|
||||||
|
address = render_template('components/address.html', paramName=paramName, param=param)
|
||||||
|
html += address
|
||||||
|
elif paramType == "dns":
|
||||||
|
html += render_template('components/dns-input.html', paramName=paramName, param=param)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
html += f'</div>'
|
html += f'</div>'
|
||||||
|
|
||||||
@ -236,8 +246,6 @@ def plugin_output(outputs, returns):
|
|||||||
html = ''
|
html = ''
|
||||||
|
|
||||||
for returnOutput in returns:
|
for returnOutput in returns:
|
||||||
print(returns)
|
|
||||||
|
|
||||||
html += f'<div class="card" style="margin-top: 50px; margin-bottom: 50px;">'
|
html += f'<div class="card" style="margin-top: 50px; margin-bottom: 50px;">'
|
||||||
html += f'<div class="card-body">'
|
html += f'<div class="card-body">'
|
||||||
html += f'<h4 class="card-title">{returns[returnOutput]["name"]}</h4>'
|
html += f'<h4 class="card-title">{returns[returnOutput]["name"]}</h4>'
|
||||||
@ -251,6 +259,11 @@ def plugin_output(outputs, returns):
|
|||||||
html += f'</ul>'
|
html += f'</ul>'
|
||||||
elif returns[returnOutput]["type"] == "text":
|
elif returns[returnOutput]["type"] == "text":
|
||||||
html += f'<p>{output}</p>'
|
html += f'<p>{output}</p>'
|
||||||
|
elif returns[returnOutput]["type"] == "tx":
|
||||||
|
html += render_template('components/tx.html', tx=output)
|
||||||
|
elif returns[returnOutput]["type"] == "dns":
|
||||||
|
output = json.loads(output)
|
||||||
|
html += render_template('components/dns-output.html', dns=dns(output))
|
||||||
|
|
||||||
|
|
||||||
html += f'</div>'
|
html += f'</div>'
|
||||||
|
40
templates/components/address.html
Normal file
40
templates/components/address.html
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
<div style="margin-top: 25px;">
|
||||||
|
<label class="form-label">{{paramName}}</label>
|
||||||
|
<input id="{{param}}" class="form-control" type="text" placeholder="Address or @domain" name="{{param}}" value="{{address}}" />
|
||||||
|
<span id="addressValid"></span>
|
||||||
|
<script>
|
||||||
|
function checkAddress(inputValue) {
|
||||||
|
// Make API request to "/checkaddress"
|
||||||
|
var apiUrl = '/checkaddress?address=' + encodeURIComponent(inputValue);
|
||||||
|
|
||||||
|
fetch(apiUrl)
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
// Update the content of the span with the response data
|
||||||
|
var addressCheckSpan = document.getElementById('addressValid');
|
||||||
|
addressCheckSpan.textContent = data.result; // You can replace 'addressInfo' with the actual property you receive from the API
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Error fetching data:', error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to handle input field blur event
|
||||||
|
function handleBlur() {
|
||||||
|
var inputField = document.getElementById('{{param}}');
|
||||||
|
var inputValue = inputField.value;
|
||||||
|
|
||||||
|
// Check if the input value is not empty
|
||||||
|
if (inputValue.trim() !== '') {
|
||||||
|
checkAddress(inputValue);
|
||||||
|
} else {
|
||||||
|
var addressCheckSpan = document.getElementById('addressValid');
|
||||||
|
addressCheckSpan.textContent = 'Invalid address';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a blur event listener to the input field
|
||||||
|
var inputField = document.getElementById('{{param}}');
|
||||||
|
inputField.addEventListener('blur', handleBlur);
|
||||||
|
</script>
|
||||||
|
</div>
|
5
templates/components/dns-input.html
Normal file
5
templates/components/dns-input.html
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<h4>TODO DNS LATER</h4>
|
||||||
|
<p>For a temporary work around edit any domains DNS and before pressing save</p>
|
||||||
|
<p>Copy the text in the url after ?dns=</p>
|
||||||
|
<label for="{{param}}">{{paramName}}</label>
|
||||||
|
<input class="form-control" type="text" name="{{param}}" />
|
13
templates/components/dns-output.html
Normal file
13
templates/components/dns-output.html
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{dns | safe}}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
4
templates/components/tx.html
Normal file
4
templates/components/tx.html
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<span style="display: block;font-size: 12px;">TX: {{tx}}</span>
|
||||||
|
<span style="display: block;">Check your transaction on a block explorer</span>
|
||||||
|
<a class="card-link" href="https://niami.io/tx/{{tx}}" target="_blank">Niami</a>
|
||||||
|
<a class="card-link" href="https://3xpl.com/handshake/transaction/{{tx}}" target="_blank">3xpl</a>
|
Loading…
Reference in New Issue
Block a user