From e882914b29f384d3f530865737cc7de3790e5b0e Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Sat, 6 Oct 2018 23:39:10 +0300 Subject: HTML replies --- .../java/com/juick/server/ActivityPubManager.java | 2 +- .../main/java/com/juick/server/EmailManager.java | 2 +- .../java/com/juick/server/api/rss/RepliesView.java | 2 +- .../com/juick/service/MessagesServiceImpl.java | 22 ++++++++++++++-------- .../extension/filters/FormatMessageFilter.java | 3 +++ .../resources/db/migration/V1.8__html reply.sql | 1 + 6 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 juick-server/src/main/resources/db/migration/V1.8__html reply.sql (limited to 'juick-server') diff --git a/juick-server/src/main/java/com/juick/server/ActivityPubManager.java b/juick-server/src/main/java/com/juick/server/ActivityPubManager.java index 4adfafea..c1790deb 100644 --- a/juick-server/src/main/java/com/juick/server/ActivityPubManager.java +++ b/juick-server/src/main/java/com/juick/server/ActivityPubManager.java @@ -196,7 +196,7 @@ public class ActivityPubManager implements ActivityListener, NotificationListene note.setCc(Collections.singletonList(followersUri(msg.getUser()))); } note.setPublished(msg.getTimestamp()); - note.setContent(MessageUtils.formatMessage(msg.getText())); + note.setContent(msg.isHtml() ? msg.getText() : MessageUtils.formatMessage(msg.getText())); if (StringUtils.isNotBlank(msg.getAttachmentType())) { Image attachment = new Image(); attachment.setId(msg.getAttachment().getMedium().getUrl()); diff --git a/juick-server/src/main/java/com/juick/server/EmailManager.java b/juick-server/src/main/java/com/juick/server/EmailManager.java index 726da4b9..1cdafac6 100644 --- a/juick-server/src/main/java/com/juick/server/EmailManager.java +++ b/juick-server/src/main/java/com/juick/server/EmailManager.java @@ -114,7 +114,7 @@ public class EmailManager implements NotificationListener { String htmlText = String.format("%s

--
You are receiving this because you are subscribed to this user" + ", discussion, tag or mentioned. Reply to this email directly or view it on Juick." + "
Configure or disable notifications", - MessageUtils.formatHtml(msg), formatUrl(msg), + msg.isHtml() ? msg.getText() : MessageUtils.formatHtml(msg), formatUrl(msg), msg.getMid(), msg.getRid(), hash, hash); sendEmail(email, subject, plainText, htmlText, headers); } diff --git a/juick-server/src/main/java/com/juick/server/api/rss/RepliesView.java b/juick-server/src/main/java/com/juick/server/api/rss/RepliesView.java index f9d7109e..a0ab801e 100644 --- a/juick-server/src/main/java/com/juick/server/api/rss/RepliesView.java +++ b/juick-server/src/main/java/com/juick/server/api/rss/RepliesView.java @@ -78,7 +78,7 @@ public class RepliesView extends AbstractRssFeedView { Item item = new Item(); String messageUrl = String.format("http://juick.com/m/%d#%d", msg.getMid(), msg.getRid()); String messageTitle = String.format("@%s:", msg.getUname()); - String messageDescription = MessageUtils.formatMessage(msg.getDescription()); + String messageDescription = msg.isHtml() ? msg.getDescription() : MessageUtils.formatMessage(msg.getDescription()); item.setLink(messageUrl); //item.setGuid(messageUrl); item.setTitle(messageTitle); diff --git a/juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java b/juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java index a6a38e2b..0b0a11ae 100644 --- a/juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java +++ b/juick-server/src/main/java/com/juick/service/MessagesServiceImpl.java @@ -100,6 +100,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ msg.setTo(quoteUser); msg.setUpdatedAt(rs.getTimestamp(21).toInstant()); msg.setReplyUri(URI.create(Optional.ofNullable(rs.getString(24)).orElse(StringUtils.EMPTY))); + msg.setHtml(rs.getBoolean(25)); if (StringUtils.isNotEmpty(msg.getAttachmentType())) { try { imagesService.setAttachmentMetadata(baseImagesUrl, msg); @@ -337,7 +338,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ + "messages.readonly, messages.privacy, messages.replies," + "messages.attach, COUNT(DISTINCT favorites.user_id) as likes, messages.hidden," + "txt.tags, txt.repliesby, txt.txt, '' as q, messages.updated as updated, 0 as to_uid, " - + "NULL as to_name, txt.updated_at, '' as user_uri, '' as to_uri, '' as reply_uri FROM messages " + + "NULL as to_name, txt.updated_at, '' as user_uri, '' as to_uri, '' as reply_uri, 0 as html FROM messages " + "INNER JOIN users ON messages.user_id = users.id " + "INNER JOIN messages_txt AS txt " + "ON messages.message_id = txt.message_id " @@ -345,7 +346,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ + "ON messages.message_id = favorites.message_id AND favorites.like_id=1 " + "WHERE messages.message_id = ? " + "GROUP BY mid, rid, replyto, uid, nick, banned, messages.ts, readonly, " - + "privacy, replies, attach, tags, repliesby, q, updated_at, user_uri, to_uri, reply_uri", + + "privacy, replies, attach, tags, repliesby, q, updated_at, user_uri, to_uri, reply_uri, html", new MessageMapper(), mid); if (!list.isEmpty()) { @@ -366,7 +367,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ + "replies.attach, replies.txt, IFNULL(q.txt,t.txt) as quote, " + "COALESCE(q.user_id, m.user_id) AS to_uid, COALESCE(qu.nick, mu.nick) AS to_name, " + "replies.updated_at, replies.user_uri as uri, " - + "q.user_uri AS to_uri, replies.reply_uri AS reply_uri " + + "q.user_uri AS to_uri, replies.reply_uri AS reply_uri, replies.html " + "FROM replies LEFT JOIN users ON replies.user_id = users.id " + "LEFT JOIN replies q ON replies.message_id = q.message_id and replies.replyto = q.reply_id " + "LEFT JOIN messages_txt t ON replies.message_id = t.message_id " @@ -404,6 +405,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ msg.setTo(quoteUser); msg.setUpdatedAt(rs.getTimestamp(10).toInstant()); msg.setReplyUri(URI.create(Optional.ofNullable(rs.getString(12)).orElse(StringUtils.EMPTY))); + msg.setHtml(rs.getBoolean(13)); if (StringUtils.isNotEmpty(msg.getAttachmentType())) { try { imagesService.setAttachmentMetadata(baseImagesUrl, msg); @@ -834,7 +836,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ + "messages.attach,COUNT(DISTINCT favorites.user_id) AS likes,messages.hidden," + "messages_txt.tags,messages_txt.repliesby, messages_txt.txt, '' as q, " + "messages.updated, 0 as to_uid, NULL as to_name, messages_txt.updated_at, '' as user_uri, " - + "'' as to_uri, '' as reply_uri " + + "'' as to_uri, '' as reply_uri, 0 as html " + "FROM (messages INNER JOIN messages_txt " + "ON messages.message_id=messages_txt.message_id) " + "INNER JOIN users ON messages.user_id=users.id " @@ -843,7 +845,10 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ + "LEFT JOIN banned " + "ON messages.message_id = banned.message_id " + "WHERE messages.message_id IN (:ids) GROUP BY " - + "messages.message_id, rid, replyto, messages.user_id, users.nick, banned, messages.ts, messages.readonly, messages.privacy, messages.attach, messages.hidden, messages_txt.tags, messages_txt.repliesby, messages_txt.txt, q, messages.updated, to_uid, to_name, updated_at, user_uri, reply_uri", + + "messages.message_id, rid, replyto, messages.user_id, users.nick, banned, messages.ts, " + + "messages.readonly, messages.privacy, messages.attach, messages.hidden, messages_txt.tags, " + + "messages_txt.repliesby, messages_txt.txt, q, messages.updated, to_uid, to_name, updated_at, " + + "user_uri, reply_uri, html", new MapSqlParameterSource("ids", mids) .addValue("uid", visitor.getUid()), new MessageMapper()); @@ -912,7 +917,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ "NOW(), " + "COALESCE(qw.user_id, m.user_id) as to_uid, COALESCE(qu.nick, mu.nick) as to_name, " + "replies.updated_at, replies.user_uri as uri, " + - "qw.user_uri as to_uri, replies.reply_uri " + + "qw.user_uri as to_uri, replies.reply_uri, replies.html " + "FROM replies LEFT JOIN users " + "ON replies.user_id = users.id " + "LEFT JOIN replies qw ON replies.message_id = qw.message_id and replies.replyto = qw.reply_id " + @@ -1027,7 +1032,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ public List getLastReplies(int hours) { return getJdbcTemplate().query("SELECT users2.nick,replies.message_id,replies.reply_id," + "users.nick,replies.txt," + - "replies.ts,replies.attach,replies.ts+0 " + + "replies.ts,replies.attach,replies.ts+0, replies.html " + "FROM ((replies INNER JOIN users ON replies.user_id=users.id) " + "INNER JOIN messages ON replies.message_id=messages.message_id) " + "INNER JOIN users AS users2 ON messages.user_id=users2.id " + @@ -1040,6 +1045,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ reply.setDescription(rs.getString(5)); reply.setPubDate(rs.getTimestamp(6)); reply.setAttachmentType(rs.getString(7)); + reply.setHtml(rs.getBoolean(8)); return reply; }, -hours); } @@ -1097,7 +1103,7 @@ public class MessagesServiceImpl extends BaseJdbcService implements MessagesServ @Override public boolean updateReplyUri(Message reply, URI replyUri) { - return jdbcTemplate.update("UPDATE replies SET reply_uri=? WHERE message_id=? AND reply_id=?", + return jdbcTemplate.update("UPDATE replies SET reply_uri=?, html=1 WHERE message_id=? AND reply_id=?", replyUri.toASCIIString(), reply.getMid(), reply.getRid()) > 0; } } diff --git a/juick-server/src/main/java/com/mitchellbosecke/pebble/extension/filters/FormatMessageFilter.java b/juick-server/src/main/java/com/mitchellbosecke/pebble/extension/filters/FormatMessageFilter.java index 93f9fccb..f347c1c3 100644 --- a/juick-server/src/main/java/com/mitchellbosecke/pebble/extension/filters/FormatMessageFilter.java +++ b/juick-server/src/main/java/com/mitchellbosecke/pebble/extension/filters/FormatMessageFilter.java @@ -38,6 +38,9 @@ public class FormatMessageFilter implements Filter { public Object apply(Object input, Map args, PebbleTemplate self, EvaluationContext context, int lineNumber) { if (input instanceof Message) { Message msg = (Message) input; + if (msg.isHtml()) { + return new SafeString(msg.getText()); + } boolean isCode = msg.getTags().stream().anyMatch(t -> t.getName().equals("code")); String toUserString = msg.getTo().getUid() == 0 ? String.format("@%s", msg.getTo().getUri().toASCIIString(), msg.getTo().getName()) : String.format("@%s", msg.getTo().getName(), msg.getTo().getName()); diff --git a/juick-server/src/main/resources/db/migration/V1.8__html reply.sql b/juick-server/src/main/resources/db/migration/V1.8__html reply.sql new file mode 100644 index 00000000..9f939971 --- /dev/null +++ b/juick-server/src/main/resources/db/migration/V1.8__html reply.sql @@ -0,0 +1 @@ +ALTER TABLE replies ADD COLUMN html tinyint(4) NOT NULL DEFAULT '0'; \ No newline at end of file -- cgit v1.2.3