diff --git a/tmessage/settings.py b/tmessage/settings.py index 7ff0c76..a1e1fd4 100644 --- a/tmessage/settings.py +++ b/tmessage/settings.py @@ -21,6 +21,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent STATIC_DIR = BASE_DIR / "tmessage/static" ALLOWED_HOSTS = ["*"] +CSRF_TRUSTED_ORIGINS = [config["services"]["message"]["url"]["pub"]] INSTALLED_APPS = [ "django.contrib.admin", diff --git a/tmessage/static/css/messages.css b/tmessage/static/css/messages.css index d490f7a..faa6358 100644 --- a/tmessage/static/css/messages.css +++ b/tmessage/static/css/messages.css @@ -2,6 +2,7 @@ width: calc(90vw - 40px); max-width: 400px; padding: 20px; + padding-top: 2px; margin: 0 auto; margin-bottom: 30px; border-radius: 6px; diff --git a/tmessage/static/js/messages.js b/tmessage/static/js/messages.js index 67ebc9c..7efad69 100644 --- a/tmessage/static/js/messages.js +++ b/tmessage/static/js/messages.js @@ -10,11 +10,13 @@ function getMessageHTML(messageJSON, canRespond) { let el = document.createElement("div"); el.classList.add("message-container"); el.dataset.messageId = messageJSON.id; - el.innerHTML = `
-
${messageJSON.from || "Anonymous"} writes: ${timeSince(messageJSON.timestamp)}
-
${escapeHTML(messageJSON.content)}
+ el.innerHTML = ` +

Messaging ${messageJSON.to}: ${messageJSON.response ? `${timeSince(messageJSON.response_timestamp)}` : ""}

+
+
<${messageJSON.from ? "a" : "b"} href="/u/${messageJSON.from}/">${messageJSON.from || "Anony­mous"} writes: ${timeSince(messageJSON.timestamp)}
+
${escapeHTML(messageJSON.content)}
- ${messageJSON.response ? `${timeSince(messageJSON.response_timestamp)}
\n${escapeHTML(messageJSON.response)}
` : ""} + ${messageJSON.response ? `
${escapeHTML(messageJSON.response)}
` : ""} ${ canRespond ? `
@@ -29,31 +31,6 @@ function getMessageHTML(messageJSON, canRespond) { return el } -function timeSince(date) { - let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - let dateObject = new Date(date * 1000); - let dateString = `${months[dateObject.getMonth()]} ${dateObject.getDate()}, ${dateObject.getFullYear()}, ${String(dateObject.getHours()).padStart(2, "0")}:${String(dateObject.getMinutes()).padStart(2, "0")}:${String(dateObject.getSeconds()).padStart(2, "0")}`; - let seconds = Math.floor((+(new Date()) / 1000 - date + 1)); - let unit = "second"; - let amount = seconds > 0 ? seconds : 0; - const timeAmounts = [ - { name: "minute", amount: 60 }, - { name: "hour", amount: 3600 }, - { name: "day", amount: 86400 }, - { name: "month", amount: 2592000 }, - { name: "year", amount: 31536000 } - ]; - - for (const info of timeAmounts) { - let interval = seconds / info.amount; - if (interval >= 1) { - unit = info.name; - amount = Math.floor(interval); - } - } - return `${Math.floor(amount)} ${unit}${Math.floor(amount) == 1 ? "" : "s"} ago`; -} - function replyTo(messageID) { let msgContainer = document.querySelector(`.message-container[data-message-id="${messageID}"]`); let self = msgContainer.querySelector(".reply-button") @@ -197,9 +174,3 @@ function fetchMessages(fetchFromStart=false) { } fetchMessages(true); - -setInterval(function () { - for (const timestamp of document.querySelectorAll("[data-timestamp]")) { - timestamp.innerHTML = timeSince(Number(timestamp.dataset.timestamp)); - } -}, 5000); diff --git a/tmessage/templates/message-page.html b/tmessage/templates/message-page.html new file mode 100644 index 0000000..0635439 --- /dev/null +++ b/tmessage/templates/message-page.html @@ -0,0 +1,25 @@ +{% extends "base.html" %} + +{% block head %} + +{% endblock %} + +{% block body %} +
+

Messaging {{ message.u_to.username }}: {% if message.response %}{% endif %}

+
+
{% if not message.anonymous and message.u_from.username %}{{ message.u_from.username }}{% else %}Anony­mous{% endif %} writes:
+
{{ message.content }}
+
+
{{ message.response }}
+
+ + {% if username %} + Logged in as {{ username }} +

View your messages

+ {% else %} + Not logged in. + {% if config.new_users %}Sign up{% else %}Log in{% endif %}? + {% endif %} + +{% endblock %} diff --git a/tmessage/templates/message.html b/tmessage/templates/message.html index b996a6d..ddd5311 100644 --- a/tmessage/templates/message.html +++ b/tmessage/templates/message.html @@ -8,7 +8,7 @@ {% csrf_token %}

{% if self_username %} - Logged in as {{ self_username }} + Logged in as {{ username }}
@@ -18,5 +18,6 @@ {% if config.new_users %}Sign up{% else %}Log in{% endif %}? {% endif %}

+ {% if self_username %}

View your messages

{% endif %} {% endblock %} diff --git a/tmessage/templates/messages.html b/tmessage/templates/messages.html index 02b2c95..eb5f96b 100644 --- a/tmessage/templates/messages.html +++ b/tmessage/templates/messages.html @@ -7,14 +7,27 @@ {% block body %}

Your messages

- Logged in as {{ username }} +

Logged in as {{ username }}


- +

+

Your message link: {{ config.services.message.url.pub }}/m/{{ username }}/
+
(click to copy)
+

+ +

All messages - Not responded

Loading...
+ + {% endblock %} diff --git a/tmessage/urls.py b/tmessage/urls.py index 998aa44..5f468c2 100644 --- a/tmessage/urls.py +++ b/tmessage/urls.py @@ -1,7 +1,8 @@ from django.contrib import admin from django.urls import include, path -from .views import api_messages, auth, index, message, messages, profile +from .views import (api_messages, auth, index, message, message_page, messages, + profile) urlpatterns = [ path("", index), @@ -9,6 +10,7 @@ urlpatterns = [ path("messages/", messages), path("u//", profile), path("m//", message), + path("msg//", message_page), path("api/messages/", api_messages), path("static/", include("tmessage.views.static")), path("django-admin/", admin.site.urls) diff --git a/tmessage/views/__init__.py b/tmessage/views/__init__.py index ada94fb..5a1f428 100644 --- a/tmessage/views/__init__.py +++ b/tmessage/views/__init__.py @@ -1,2 +1,3 @@ from .api import api_messages # noqa: F401 -from .templates import auth, index, message, messages, profile # noqa: F401 +from .templates import (auth, index, message, message_page, # noqa: F401 + messages, profile) diff --git a/tmessage/views/api.py b/tmessage/views/api.py index 3502954..912f8fc 100644 --- a/tmessage/views/api.py +++ b/tmessage/views/api.py @@ -96,7 +96,7 @@ def api_messages(request: WSGIRequest) -> HttpResponse: output = [] messages = msgObjects.order_by("-message_id")[:50].values_list( - "message_id", "content", "response", "anonymous", "u_from", "sent_timestamp", "response_timestamp" + "message_id", "content", "response", "anonymous", "u_from", "u_to", "sent_timestamp", "response_timestamp" ) for message in messages: @@ -105,8 +105,9 @@ def api_messages(request: WSGIRequest) -> HttpResponse: "content": message[1], "response": message[2], "from": message[4] if not message[3] and message[4] else None, - "timestamp": message[5], - "response_timestamp": message[6] + "to": message[5], + "timestamp": message[6], + "response_timestamp": message[7] }) return _json_response({ diff --git a/tmessage/views/templates.py b/tmessage/views/templates.py index 48f22ac..34a986b 100644 --- a/tmessage/views/templates.py +++ b/tmessage/views/templates.py @@ -38,6 +38,22 @@ def index(request: WSGIRequest) -> HttpResponse: def profile(request: WSGIRequest, username: str) -> HttpResponse: ... +def message_page(request: WSGIRequest, message_id: int) -> HttpResponse: + try: + message = tMMessage.objects.get(message_id=message_id) + except tMMessage.DoesNotExist: + return render_template( + request, "404.html", + status=404 + ) + + return render_template( + request, "message-page.html", + title="Viewing a Message", + message=message, + username=get_username(request) + ) + def message(request: WSGIRequest, username: str) -> HttpResponse: if not username_exists(username): return render_template( @@ -73,6 +89,7 @@ def message(request: WSGIRequest, username: str) -> HttpResponse: return render_template( request, "message.html", + title=f"Messaging {username}", username=username, error=error, self_username=get_username(request) @@ -86,5 +103,6 @@ def messages(request: WSGIRequest) -> HttpResponse: return render_template( request, "messages.html", + title="Messages", username=username )