mirror of
https://github.com/progval/Limnoria.git
synced 2025-04-29 06:51:08 -05:00
Add script to run with Pyodide
This commit is contained in:
parent
ed4d5d60e7
commit
ca422d007a
1
.gitignore
vendored
1
.gitignore
vendored
@ -31,6 +31,7 @@ data/
|
|||||||
logs/
|
logs/
|
||||||
*.conf
|
*.conf
|
||||||
*.conf.bak
|
*.conf.bak
|
||||||
|
!pyodide/limnoria.conf
|
||||||
|
|
||||||
# Intellij PyCharm / IDEA related files
|
# Intellij PyCharm / IDEA related files
|
||||||
*.iml
|
*.iml
|
||||||
|
48
pyodide/index.html
Normal file
48
pyodide/index.html
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<script type="text/javascript" src="https://cdn.jsdelivr.net/pyodide/dev/full/pyodide.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
async function main(){
|
||||||
|
await loadPyodide({ indexURL : 'https://cdn.jsdelivr.net/pyodide/dev/full/' });
|
||||||
|
await pyodide.runPythonAsync(`
|
||||||
|
import pyodide
|
||||||
|
import micropip
|
||||||
|
|
||||||
|
# Use micropip to install a Limnoria wheel
|
||||||
|
await micropip.install(
|
||||||
|
'http://[fdfe:6f1:908a:1fbe:c713:7c74:d786:8f15]:8081/%(WHEEL_PATH)s'
|
||||||
|
)
|
||||||
|
# Check we can indeed import Limnoria
|
||||||
|
import supybot.version
|
||||||
|
print(supybot.version.version)
|
||||||
|
|
||||||
|
# Load config file
|
||||||
|
config = pyodide.open_url('/limnoria.conf').read()
|
||||||
|
with open('limnoria.conf', 'a') as fd:
|
||||||
|
fd.write(config)
|
||||||
|
|
||||||
|
# Inject arguments to pretend it's called from the CLI
|
||||||
|
import sys
|
||||||
|
sys.argv = ['supybot', '--allow-root', '--single-loop', 'limnoria.conf']
|
||||||
|
|
||||||
|
# Initialize the bot
|
||||||
|
import supybot._main
|
||||||
|
supybot._main.main()
|
||||||
|
`);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
// Hacky!!! We're taking the main loop away from Limnoria
|
||||||
|
// so the Python code releases control to the JS interpreter
|
||||||
|
await pyodide.runPythonAsync(`
|
||||||
|
import supybot._main
|
||||||
|
supybot._main._main(singleLoop=True)
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
main();
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
5
pyodide/limnoria.conf
Normal file
5
pyodide/limnoria.conf
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
supybot.networks: testnet
|
||||||
|
supybot.networks.testnet.servers: [fdfe:4421:f18d:fe24:d51c:3fb4:b255:4f09]:8097
|
||||||
|
supybot.networks.testnet.channels: #limnoria-bots
|
||||||
|
supybot.drivers.module: PyodideWebsocket
|
||||||
|
supybot.log.stdout.level: DEBUG
|
48
pyodide/serve.py
Normal file
48
pyodide/serve.py
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
import sys
|
||||||
|
import glob
|
||||||
|
import socket
|
||||||
|
import http.server
|
||||||
|
import socketserver
|
||||||
|
|
||||||
|
WHEEL_PATH = max(glob.glob('dist/limnoria-*-py3-none-any.whl'))
|
||||||
|
CONF_PATH = 'pyodide/limnoria.conf'
|
||||||
|
|
||||||
|
|
||||||
|
class Handler(http.server.BaseHTTPRequestHandler):
|
||||||
|
|
||||||
|
def end_headers(self):
|
||||||
|
# Enable Cross-Origin Resource Sharing (CORS)
|
||||||
|
self.send_header('Access-Control-Allow-Origin', '*')
|
||||||
|
super().end_headers()
|
||||||
|
|
||||||
|
def do_GET(self):
|
||||||
|
if self.path == '/':
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header('Content-Type', 'text/html;charset=UTF-8')
|
||||||
|
self.end_headers()
|
||||||
|
with open('pyodide/index.html', 'rb') as fd:
|
||||||
|
self.wfile.write(fd.read() % {b'WHEEL_PATH': WHEEL_PATH.encode()})
|
||||||
|
elif self.path == '/' + WHEEL_PATH:
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header('Content-Type', 'application/wasm')
|
||||||
|
with open(WHEEL_PATH, 'rb') as fd:
|
||||||
|
self.wfile.write(fd.read())
|
||||||
|
elif self.path == '/limnoria.conf':
|
||||||
|
self.send_response(200)
|
||||||
|
with open(CONF_PATH, 'rb') as fd:
|
||||||
|
self.wfile.write(fd.read())
|
||||||
|
elif self.path == '/favicon.ico':
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
print('Unexpected URL', self.path)
|
||||||
|
|
||||||
|
class TCPv6Server(socketserver.TCPServer):
|
||||||
|
address_family = socket.AF_INET6
|
||||||
|
allow_reuse_address = True
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
port = 8081
|
||||||
|
with TCPv6Server(('::', port), Handler) as httpd:
|
||||||
|
print('Serving at: http://[::1]:{}'.format(port))
|
||||||
|
httpd.serve_forever()
|
Loading…
x
Reference in New Issue
Block a user