diff --git a/docs/api.xml b/docs/api.xml
new file mode 100644
index 000000000..df6731f4b
--- /dev/null
+++ b/docs/api.xml
@@ -0,0 +1,241 @@
+
+
+
+
+
+
+
+
+
+
+ Submits a post.
+
+
+
+
+
+ The posts title. :emojis: will be parsed as well. Plaintext. No markdown.
+
+
+
+
+ Post URL. Be wary of duplicates.
+
+
+
+
+ The post in markdown.
+
+
+
+
+
+
+
+ The post you were looking for.
+
+
+
+
+
+
+ {
+ "our": "example, here",
+ "our": "example, here"
+ }
+
+
+
+
+
+
+ Not found
+
+
+
+
+
+
+
+
+
+
+
+ Sends a user a message
+
+
+
+
+
+ User URL
+
+
+
+
+ Message data to the user.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Creates a comment on a post, or replies to a comment
+
+
+
+
+
+ ID of the parent post. Starts with p_
for a parent submission, and c_
for a comment submission. Anything else will emit a 400.
+
+
+
+
+ Parent submission (the id, right?)
+
+
+
+
+ Your messages content
+
+
+
+
+ Parent submission (the id, right?)
+
+
+
+
+ If this post is marked as sensitive.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ }
+
+
+
+
+
+
+
+
+
+
+
+ User is exiled from the hole, or needs extra permissions.
+ User is banned and needs to do better.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/files/assets/css/main.css b/files/assets/css/main.css
index d9ccf085d..6786dd3f8 100644
--- a/files/assets/css/main.css
+++ b/files/assets/css/main.css
@@ -6406,3 +6406,43 @@ div.markdown {
.modlog-action:not(:first-of-type) {
border-top: 1px solid var(--gray-400) !important;
}
+
+/* Documentation elements */
+#docs-page .docs-path {
+ font-size: 1.7rem;
+}
+
+#docs-page .docs-request {
+ background-color: var(--primary);
+ padding: 3px 8px;
+ border-radius: 4px;
+}
+
+#docs-page .docs-response {
+ background-color: var(--secondary);
+ padding: 3px 8px;
+ border-radius: 4px;
+}
+
+#docs-page .doc-snippet {
+ padding: 4px;
+}
+
+#docs-page .doc-snippet table {
+ border: 1px solid var(--secondary);
+}
+
+#docs-page .doc-snippet table p {
+ margin: 0;
+}
+
+#docs-page .doc-snippet table tr th {
+ color: #aaa;
+ border-bottom: 1px solid var(--secondary);
+}
+
+#docs-page .doc-snippet table tr td,
+#docs-page .doc-snippet table tr th {
+ padding: 4px 8px;
+ border-right: 1px solid var(--secondary);
+}
diff --git a/files/routes/__init__.py b/files/routes/__init__.py
index 5649270be..32c0313b1 100644
--- a/files/routes/__init__.py
+++ b/files/routes/__init__.py
@@ -20,6 +20,7 @@ from files.routes.jinja2 import *
from .admin import *
from .comments import *
from .errors import *
+from .docs import *
from .reporting import *
from .front import *
from .login import *
diff --git a/files/routes/comments.py b/files/routes/comments.py
index 334455f16..108fed507 100644
--- a/files/routes/comments.py
+++ b/files/routes/comments.py
@@ -79,6 +79,7 @@ def post_pid_comment_cid(cid, pid=None, anything=None, v=None, sub=None):
else: template = "submission.html"
return render_template(template, v=v, p=post, sort=sort, comment_info=comment_info, render_replies=True, sub=post.subr)
+#- API
@app.post("/comment")
@limiter.limit("1/second;20/minute;200/hour;1000/day")
@auth_required
@@ -91,7 +92,7 @@ def comment(v):
id = parent_fullname[2:]
parent_comment_id = None
rts = False
-
+
if parent_fullname.startswith("p_"):
parent = get_post(id, v=v)
parent_post = parent
diff --git a/files/routes/docs.py b/files/routes/docs.py
new file mode 100644
index 000000000..e8d3e7971
--- /dev/null
+++ b/files/routes/docs.py
@@ -0,0 +1,13 @@
+import xml
+import xml.etree.ElementTree as ET
+from files.__main__ import app, cache, limiter
+
+tree = ET.parse('docs/api.xml')
+
+@app.get("/dev/api")
+@auth_desired
+def get_docs_page():
+ # TODO cache
+ root = tree.getroot()
+
+ return render_template("docs.html", root=tree.getroot())
diff --git a/files/templates/docs.html b/files/templates/docs.html
new file mode 100644
index 000000000..272859049
--- /dev/null
+++ b/files/templates/docs.html
@@ -0,0 +1,81 @@
+{% extends "default.html" %}
+
+{#% Some macros %#}
+{% macro docbook_read(info) -%}
+ {% for p in info -%}
+ {#% Lazy hack, not """conforming""" to docbook %#}
+
+ {{- p.text -}}
+
+ {%- endfor %}
+{%- endmacro %}
+
+{%- macro param_table(info) -%}
+
+
+ Param |
+ Description |
+ Type |
+ Format |
+ Required |
+
+ {% for param in info %}
+
+
+ {{ param.attrib.name }} |
+ {{- docbook_read(param[0]) -}} |
+ {{ param.attrib.type }} |
+ {{ param.attrib.style }} |
+ {{ param.attrib.required }} |
+
+ {% endfor %}
+
+{%- endmacro -%}
+
+{% block pagetitle %}Documentation{% endblock %}
+{% block content %}
+
+
rDrama REST Api Documentaion
+
+
Warning: This documentation is SHIT, so get
+ used to it
+
+
You're probably here because you want to create your own application
+ which calls our REST api. Some of the stuff you see here might seem
+ ugly (it is), but it's mainly inherited from the old Ruqqus API.
+
+
This documentation is generated from an XML WADL file.
+
+
+
+ {% for res in root[0] %}
+
+ {#% There's usually only one method, but this is more correct %#}
+ {% for method in res %}
+
+
+ {{- method.attrib.name -}}
+
+ {{ res.attrib.path }}
+
+ {% for info in method %}
+ {% if info.tag == "{http://wadl.dev.java.net/2009/02}doc" %}
+ {{ docbook_read(info) }}
+ {% elif info.tag == "{http://wadl.dev.java.net/2009/02}request" %}
+ {{ param_table(info) }}
+ {% elif info.tag == "{http://wadl.dev.java.net/2009/02}response" %}
+ Response {{ info.attrib.status }}
+ {% for response_child in info %}
+ {% if response_child.tag == "{http://wadl.dev.java.net/2009/02}param" %}
+ {{ param_table(info) }}
+ {% elif response_child.tag == "{http://wadl.dev.java.net/2009/02}doc" %}
+ {{ docbook_read(response_child) }}
+ {% endif %}
+ {% endfor %}
+ {% endif %}
+ {% endfor %}
+ {% endfor %}
+
+ {% endfor %}
+
+{% endblock %}