longpoll.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. // Copyright (c) 2025 gugdun
  2. // All rights reserved. Unauthorized use, copying, or distribution is strictly prohibited.
  3. const express = require("express");
  4. const db = require("../db");
  5. const { decrypt } = require("../util/crypto");
  6. const router = express.Router();
  7. router.post("/poll/:id", async (req, res) => {
  8. if (req.user) {
  9. try {
  10. const chat = await db.one("SELECT user1_id, user2_id FROM chats WHERE id = $1", [ req.params.id ]);
  11. if (chat?.user1_id !== req.user.id && chat?.user2_id !== req.user.id) {
  12. throw "User does not belong to this chat!";
  13. }
  14. async function checkMessages() {
  15. const messages = await db.any("SELECT username, attachment_id, text, timestamp FROM messages JOIN users ON users.id = user_id WHERE chat_id = $1 AND timestamp > $2 ORDER BY messages.timestamp DESC", [ req.params.id, req.body.timestamp ]);
  16. if (messages.length > 0) {
  17. res.json({
  18. messages: messages.map((message) => {
  19. return {
  20. username: message.username,
  21. text: decrypt(message.text),
  22. datetime: message.timestamp,
  23. attachment: message.attachment_id
  24. }
  25. })
  26. });
  27. } else setTimeout(checkMessages, 500);
  28. }
  29. checkMessages();
  30. } catch (err) {
  31. console.log(err);
  32. res.json({ success: false });
  33. }
  34. } else {
  35. res.redirect("/login");
  36. }
  37. });
  38. module.exports = router;