parent
caaa7af722
commit
d207e741d9
@ -0,0 +1,5 @@
|
|||||||
|
from .flask import Flask
|
||||||
|
|
||||||
|
|
||||||
|
def setup(bot):
|
||||||
|
bot.add_cog(Flask(bot))
|
@ -0,0 +1,102 @@
|
|||||||
|
import asyncio
|
||||||
|
import threading
|
||||||
|
|
||||||
|
from quart import Quart, websocket, Response
|
||||||
|
from redbot.core import Config, checks, commands
|
||||||
|
from redbot.core.bot import Red
|
||||||
|
|
||||||
|
|
||||||
|
class EndpointAction(object):
|
||||||
|
|
||||||
|
def __init__(self, action):
|
||||||
|
self.action = action
|
||||||
|
|
||||||
|
async def __call__(self, *args):
|
||||||
|
response = await self.action()
|
||||||
|
return Response(response, status=200, headers={})
|
||||||
|
|
||||||
|
|
||||||
|
class Flask:
|
||||||
|
"""
|
||||||
|
Run an owner only quart (async flask) server for issuing commands.
|
||||||
|
"""
|
||||||
|
app = Quart(__name__)
|
||||||
|
test_name = "FlaskQuart"
|
||||||
|
|
||||||
|
def __init__(self, bot: Red):
|
||||||
|
self.bot = bot
|
||||||
|
self.config = Config.get_conf(self, identifier=9811198108111121, force_registration=True)
|
||||||
|
default_global = {}
|
||||||
|
default_guild = {}
|
||||||
|
|
||||||
|
self.config.register_global(**default_global)
|
||||||
|
self.config.register_guild(**default_guild)
|
||||||
|
|
||||||
|
self.threads = []
|
||||||
|
self.t = threading.Thread(target=self.worker)
|
||||||
|
self.t.daemon = True
|
||||||
|
self.threads.append(self.t)
|
||||||
|
|
||||||
|
self.context = None
|
||||||
|
|
||||||
|
def __unload(self):
|
||||||
|
try:
|
||||||
|
self.t._stop()
|
||||||
|
except:
|
||||||
|
self.t._stop() # No really, stop
|
||||||
|
|
||||||
|
@checks.is_owner()
|
||||||
|
@commands.command()
|
||||||
|
async def flask(self, ctx: commands.Context):
|
||||||
|
"""Starts a quart server"""
|
||||||
|
self.context = ctx
|
||||||
|
self.add_endpoint(endpoint="/name", endpoint_name="name", handler=self.bot_name)
|
||||||
|
self.add_endpoint(endpoint="/help", endpoint_name="help", handler=self.quart_help)
|
||||||
|
self.t.start()
|
||||||
|
await ctx.send("Done")
|
||||||
|
|
||||||
|
def add_endpoint(self, endpoint=None, endpoint_name=None, handler=None):
|
||||||
|
self.app.add_url_rule(endpoint, endpoint_name, EndpointAction(handler))
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
@app.route('/')
|
||||||
|
async def hello():
|
||||||
|
return "hello"
|
||||||
|
|
||||||
|
async def bot_name(self):
|
||||||
|
return self.test_name
|
||||||
|
|
||||||
|
async def quart_help(self):
|
||||||
|
f = commands.HelpFormatter()
|
||||||
|
msgs = await f.format_help_for(self.context, self.bot)
|
||||||
|
out = ""
|
||||||
|
for msg in msgs:
|
||||||
|
for line in msg.split('\n'):
|
||||||
|
if line == '```':
|
||||||
|
continue
|
||||||
|
if line.endswith(":"):
|
||||||
|
out += "<h1>" + line + "</h1>\n"
|
||||||
|
else:
|
||||||
|
line = line.strip().split(" ")
|
||||||
|
out += "<p><b>" + line[0] + "</b> " + " ".join(line[1:]) + "</p>\n"
|
||||||
|
|
||||||
|
return '''
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Red Bot - Help</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{}
|
||||||
|
</body>
|
||||||
|
</html>'''.format(out)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
@app.websocket('/ws')
|
||||||
|
async def ws():
|
||||||
|
while True:
|
||||||
|
await websocket.send('hello')
|
||||||
|
|
||||||
|
def worker(self):
|
||||||
|
second_loop = asyncio.new_event_loop()
|
||||||
|
asyncio.ensure_future(self.app.run(loop=second_loop))
|
||||||
|
return
|
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"author": [
|
||||||
|
"Bobloy"
|
||||||
|
],
|
||||||
|
"bot_version": [
|
||||||
|
3,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"description": "Add expiring flags on members to track warnings or incidents",
|
||||||
|
"hidden": true,
|
||||||
|
"install_msg": "Thank you for installing flask! Get started with `[p]load flask`, then `[p]help Flag`",
|
||||||
|
"requirements": ["quart"],
|
||||||
|
"short": "Run a Flask site to issue commands.",
|
||||||
|
"tags": [
|
||||||
|
"bobloy"
|
||||||
|
]
|
||||||
|
}
|
Loading…
Reference in new issue