aboutsummaryrefslogtreecommitdiff
path: root/juick-www/src/main/java/com/juick/www/UserThread.java
diff options
context:
space:
mode:
Diffstat (limited to 'juick-www/src/main/java/com/juick/www/UserThread.java')
-rw-r--r--juick-www/src/main/java/com/juick/www/UserThread.java364
1 files changed, 364 insertions, 0 deletions
diff --git a/juick-www/src/main/java/com/juick/www/UserThread.java b/juick-www/src/main/java/com/juick/www/UserThread.java
new file mode 100644
index 00000000..249cf342
--- /dev/null
+++ b/juick-www/src/main/java/com/juick/www/UserThread.java
@@ -0,0 +1,364 @@
+/*
+ * Juick
+ * Copyright (C) 2008-2011, Ugnich Anton
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.juick.www;
+
+import com.juick.Message;
+import com.juick.Tag;
+import com.juick.server.MessagesQueries;
+import com.juick.server.UserQueries;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ *
+ * @author Ugnich Anton
+ */
+public class UserThread {
+
+ protected void doGetThread(JdbcTemplate sql, HttpServletRequest request, HttpServletResponse response, int MID) throws ServletException, IOException {
+ com.juick.User visitor = Utils.getVisitorUser(sql, request, response);
+
+ if (!MessagesQueries.canViewThread(sql, MID, visitor != null ? visitor.getUID() : 0)) {
+ response.sendError(403);
+ return;
+ }
+
+ com.juick.Message msg = MessagesQueries.getMessage(sql, MID);
+
+ boolean listview = false;
+ String paramView = request.getParameter("view");
+ if (paramView != null) {
+ if (paramView.equals("list")) {
+ listview = true;
+ if (visitor != null) {
+ UserQueries.setUserOptionInt(sql, visitor.getUID(), "repliesview", 1);
+ }
+ } else if (paramView.equals("tree") && visitor != null) {
+ UserQueries.setUserOptionInt(sql, visitor.getUID(), "repliesview", 0);
+ }
+ } else if (visitor != null && UserQueries.getUserOptionInt(sql, visitor.getUID(), "repliesview", 0) == 1) {
+ listview = true;
+ }
+
+ String title = msg.getUser().getUName() + ": " + msg.getTagsString();
+
+ if (visitor == null) {
+ User.pageUserRefCookie(request, response, msg.getUser().getUID());
+ }
+
+ response.setContentType("text/html; charset=UTF-8");
+ PrintWriter out = response.getWriter();
+ try {
+ String headers = "<link rel=\"alternate\" type=\"application/rss+xml\" title=\"@" + msg.getUser().getUName() + "\" href=\"//rss.juick.com/" + msg.getUser().getUName() + "/blog\"/>";
+ if (paramView != null) {
+ headers += "<link rel=\"canonical\" href=\"http://juick.com/" + msg.getUser().getUName() + "/" + msg.getMID() + "\"/>";
+ }
+ if (msg.Hidden) {
+ headers += "<meta name=\"robots\" content=\"noindex\"/>";
+ }
+ PageTemplates.pageHead(out, title, headers);
+ PageTemplates.pageNavigation(out, visitor, null);
+
+ out.println("<section id=\"content\" style=\"margin-left: 0; width: 100%\">");
+ printMessage(out, sql, msg, visitor);
+ printReplies(out, sql, msg, visitor, listview);
+ out.println("</section>");
+
+ PageTemplates.pageFooter(request, out, visitor, false);
+
+ out.println("<script type='text/javascript'>");
+ out.println("var pageMID=" + msg.getMID() + ";");
+ out.println("initWS();");
+ out.println("</script>");
+
+ PageTemplates.pageEnd(out);
+ } finally {
+ out.close();
+ }
+ }
+
+ public static com.juick.Message printMessage(PrintWriter out, JdbcTemplate sql, com.juick.Message msg, com.juick.User visitor) {
+ msg.VisitorCanComment = visitor != null;
+
+ List<Tag> tags = MessagesQueries.getMessageTags(sql, msg.getMID());
+ String tagsStr = PageTemplates.formatTags(tags);
+ if (msg.ReadOnly) {
+ tagsStr += " *readonly";
+ msg.VisitorCanComment = false;
+ }
+ if (msg.Privacy < 0) {
+ tagsStr += " *friends";
+ }
+
+ String txt;
+ if (!msg.Tags.isEmpty() && msg.Tags.contains("code")) {
+ txt = PageTemplates.formatMessageCode(msg.getText());
+ } else {
+ txt = PageTemplates.formatMessage(msg.getText());
+ }
+
+ if (!tags.isEmpty()) {
+ tagsStr = "<span class=\"msg-tags\">" + tagsStr + "</span>";
+ }
+
+ out.println("<ul>");
+ out.println(" <li id=\"msg-" + msg.getMID() + "\" class=\"msg msgthread\">");
+ out.println(" <div class=\"msg-avatar\"><a href=\"/" + msg.getUser().getUName() + "/\"><img src=\"//i.juick.com/a/" + msg.getUser().getUID() + ".png\" alt=\"" + msg.getUser().getUName() + "\"/></a></div>");
+ out.println(" <div class=\"msg-cont\">");
+ out.println(" <div class=\"msg-menu\"><a href=\"#\" onclick=\"showMessageLinksDialog(" + msg.getMID() + "); return false\"></a></div>");
+ out.println(" <div class=\"msg-header\"><a href=\"/" + msg.getUser().getUName() + "/\">@" + msg.getUser().getUName() + "</a>:" + tagsStr + "</div>");
+ out.println(" <div class=\"msg-ts\">" + PageTemplates.formatJSLocalTime(msg.getDate()) + "</div>");
+ out.println(" <div class=\"msg-txt\">" + txt + "</div>");
+
+ if (msg.AttachmentType != null) {
+ out.println(" <div class=\"msg-media\"><a href=\"//i.juick.com/p/" + msg.getMID() + "." + msg.AttachmentType + "\"><img src=\"//i.juick.com/photos-512/" + msg.getMID() + "." + msg.AttachmentType + "\" alt=\"\"/></a></div>");
+ }
+
+ boolean visitorInBL = false;
+ if (visitor != null) {
+ if (visitor.getUID() == msg.getUser().getUID()) {
+ msg.VisitorCanComment = true;
+ } else {
+ visitorInBL = UserQueries.isInBL(sql, msg.getUser().getUID(), visitor.getUID());
+ if (visitorInBL) {
+ msg.VisitorCanComment = false;
+ }
+ }
+ }
+
+ if (msg.VisitorCanComment) {
+ out.println(" <form action=\"/comment\" method=\"POST\" enctype=\"multipart/form-data\"><input type=\"hidden\" name=\"mid\" value=\"" + msg.getMID() + "\"/>");
+ out.println(" <div class=\"msg-comment\"><div class=\"ta-wrapper\"><textarea name=\"body\" rows=\"1\" class=\"reply\" placeholder=\"Написать комментарий\" onkeypress=\"postformListener(this.form,event)\"></textarea></div></div>");
+ out.println(" </form>");
+ }
+
+ List<String> recomm = MessagesQueries.getMessageRecommendations(sql, msg.getMID());
+ if (!recomm.isEmpty()) {
+ out.print(" <div class=\"" + (msg.VisitorCanComment ? "msg-recomms" : "msg-comments") + "\">Рекомендовали (" + recomm.size() + "): ");
+ for (int i = 0; i < recomm.size(); i++) {
+ if (i > 0) {
+ out.print(", ");
+ }
+ out.print("<a href=\"/" + recomm.get(i) + "/\">@" + recomm.get(i) + "</a>");
+ }
+ out.println("</div>");
+ }
+ out.println(" </div>");
+ out.println(" </li>");
+
+ out.println(" <li id=\"mtoolbar\"><ul>");
+ out.println(" <li><a href=\"/" + msg.getMID() + "\"><div style=\"background-position: -64px 0\"></div>" + msg.getMID() + "</a></li>");
+ if (visitor != null) {
+ if (visitor.getUID() != msg.getUser().getUID()) {
+ if (MessagesQueries.isSubscribed(sql, visitor.getUID(), msg.getMID())) {
+ out.println(" <li><a href=\"/post?body=U+%23" + msg.getMID() + "\"><div style=\"background-position: -48px 0\"></div>Подписан</a></li>");
+ } else {
+ out.println(" <li><a href=\"/post?body=S+%23" + msg.getMID() + "\"><div style=\"background-position: -16px 0\"></div>Подписаться</a></li>");
+ }
+ if (!visitorInBL) {
+ out.println(" <li><a href=\"/post?body=%21+%23" + msg.getMID() + "\"><div style=\"background-position: -32px 0\"></div>Рекомендовать</a></li>");
+ }
+ } else {
+ out.println(" <li><a href=\"/post?body=D+%23" + msg.getMID() + "\"><div style=\"background-position: 0\"></div>Удалить</a></li>");
+ }
+ }
+ out.println(" </ul></li>");
+ out.println("</ul>");
+
+ return msg;
+ }
+
+ public static void printReplies(PrintWriter out, JdbcTemplate sql, com.juick.Message msg, com.juick.User visitor, boolean listview) {
+ List<com.juick.Message> replies = MessagesQueries.getReplies(sql, msg.getMID());
+
+ List<Integer> blUIDs = new ArrayList<Integer>();
+ for (int i = 0; i < replies.size(); i++) {
+ com.juick.Message reply = replies.get(i);
+ if (reply.getUser().getUID() != msg.getUser().getUID() && !blUIDs.contains(reply.getUser().getUID())) {
+ blUIDs.add(reply.getUser().getUID());
+ }
+ if (reply.ReplyTo > 0) {
+ boolean added = false;
+ for (int n = 0; n < replies.size(); n++) {
+ if (replies.get(n).getRID() == reply.ReplyTo) {
+ replies.get(n).childs.add(reply);
+ added = true;
+ break;
+ }
+ }
+ if (!added) {
+ reply.ReplyTo = 0;
+ }
+ }
+ }
+
+ if (!replies.isEmpty()) {
+ if (visitor != null && msg.getUser().getUID() == visitor.getUID()) {
+ for (Message reply : replies) {
+ reply.VisitorCanComment = true;
+ }
+ } else if (visitor != null && msg.VisitorCanComment) {
+ blUIDs = UserQueries.checkBL(sql, visitor.getUID(), blUIDs);
+ for (Message reply : replies) {
+ reply.VisitorCanComment = reply.getUser().getUID() == visitor.getUID() || !blUIDs.contains(reply.getUser().getUID());
+ }
+ } else {
+ for (Message reply : replies) {
+ reply.VisitorCanComment = false;
+ }
+ }
+
+ boolean foldable = false;
+ if (replies.size() > 10) {
+ for (int i = 0; i < replies.size() - 1; i++) {
+ if (replies.get(i).getChildsCount() > 1) {
+ foldable = true;
+ break;
+ }
+ }
+ }
+
+ out.println("<div class=\"title2\">");
+ out.print(" <div class=\"title2-right\">");
+ if (listview) {
+ out.print("<a href=\"?view=tree\" rel=\"nofollow\">Показать деревом</a>");
+ } else {
+ if (foldable) {
+ out.print("<span id=\"unfoldall\"><a href=\"#\" onclick=\"$('#replies>li').show(); $('#replies .msg-comments').hide(); $('#unfoldall').hide(); return false\">Раскрыть все</a> &#183; </span>");
+ }
+ out.print("<a href=\"?view=list\" rel=\"nofollow\">Показать списком</a>");
+ }
+ out.print("</div>");
+ out.println(" <h2>Ответы (" + replies.size() + ")</h2>");
+ out.println("</div>");
+
+ out.println("<ul id=\"replies\">");
+ if (listview) {
+ printList(out, replies, visitor);
+ } else {
+ printTree(out, replies, visitor, 0, 0, false);
+ }
+ out.println("</ul>");
+
+ for (Message reply : replies) {
+ reply.cleanupChilds();
+ }
+ replies.clear();
+ }
+ }
+
+ public static void printTree(PrintWriter out, List<com.juick.Message> replies, com.juick.User visitor, int ReplyTo, int margin, boolean hidden) {
+ if (margin > 240) {
+ margin = 240;
+ }
+
+ for (int i = 0; i < replies.size(); i++) {
+ com.juick.Message msg = replies.get(i);
+ if (msg.ReplyTo == ReplyTo) {
+
+ out.print(" <li id=\"" + msg.getRID() + "\" class=\"msg\" style=\"");
+ if (margin > 0) {
+ out.print("margin-left: " + margin + "px;");
+ }
+ if (hidden) {
+ out.print("display:none;");
+ }
+ out.println("\">");
+ if (!msg.getUser().Banned) {
+ out.println(" <div class=\"msg-avatar\"><a href=\"/" + msg.getUser().getUName() + "/\"><img src=\"//i.juick.com/a/" + msg.getUser().getUID() + ".png\" alt=\"" + msg.getUser().getUName() + "\"/></a></div>");
+ } else {
+ out.println(" <div class=\"msg-avatar\"><img src=\"//i.juick.com/av-96.png\"/></div>");
+ }
+ out.println(" <div class=\"msg-cont\">");
+ out.println(" <div class=\"msg-menu\"><a href=\"#\" onclick=\"showMessageLinksDialog(" + msg.getMID() + "," + msg.getRID() + "); return false\"></a></div>");
+ if (!msg.getUser().Banned) {
+ out.println(" <div class=\"msg-header\"><a href=\"/" + msg.getUser().getUName() + "/\">@" + msg.getUser().getUName() + "</a>:</div>");
+ } else {
+ out.println(" <div class=\"msg-header\">[удалено]:</div>");
+ }
+ out.println(" <div class=\"msg-ts\"><a href=\"/" + msg.getMID() + "#" + msg.getRID() + "\" title=\"" + PageTemplates.sdfSQL.format(msg.getDate()) + " GMT\">" + PageTemplates.formatDate(msg.TimeAgo, msg.getDate()) + "</a></div>");
+ out.println(" <div class=\"msg-txt\">" + PageTemplates.formatMessage(msg.getText()) + "</div>");
+ if (msg.AttachmentType != null) {
+ out.println(" <div class=\"msg-media\"><a href=\"//i.juick.com/p/" + msg.getMID() + "-" + msg.getRID() + "." + msg.AttachmentType + "\"><img src=\"//i.juick.com/photos-512/" + msg.getMID() + "-" + msg.getRID() + "." + msg.AttachmentType + "\" alt=\"\"/></a></div>");
+ }
+ if (msg.VisitorCanComment) {
+ out.println(" <div class=\"msg-links\"><a href=\"#\" onclick=\"return showCommentForm(" + msg.getMID() + "," + msg.getRID() + ")\">Ответить</a></div>");
+ out.println(" <div class=\"msg-comment\" style=\"display: none\"></div>");
+ } else if (visitor == null) {
+ out.println(" <div class=\"msg-links\"><a href=\"#\" onclick=\"return openDialogLogin()\">Ответить</a></div>");
+ }
+
+ int childs = msg.getChildsCount();
+ if (ReplyTo == 0 && childs > 1 && replies.size() > 10) {
+ out.println(" <div class=\"msg-comments\"><a href=\"#\" onclick=\"return showMoreReplies(" + msg.getRID() + ")\">" + PageTemplates.formatReplies(childs) + "</a></div>");
+
+ }
+ out.println(" </div>");
+ out.println(" </li>");
+
+ if (ReplyTo == 0 && childs > 1 && replies.size() > 10) {
+ printTree(out, msg.childs, visitor, msg.getRID(), margin + 20, true);
+ } else if (childs > 0) {
+ printTree(out, msg.childs, visitor, msg.getRID(), margin + 20, hidden);
+ }
+ }
+ }
+ }
+
+ public static void printList(PrintWriter out, List<com.juick.Message> replies, com.juick.User visitor) {
+ for (Message msg : replies) {
+ out.print(" <li id=\"" + msg.getRID() + "\" class=\"msg\">");
+ if (!msg.getUser().Banned) {
+ out.println(" <div class=\"msg-avatar\"><a href=\"/" + msg.getUser().getUName() + "/\"><img src=\"//i.juick.com/a/" + msg.getUser().getUID() + ".png\" alt=\"" + msg.getUser().getUName() + "\"/></a></div>");
+ } else {
+ out.println(" <div class=\"msg-avatar\"><img src=\"//i.juick.com/av-96.png\"/></div>");
+ }
+ out.println(" <div class=\"msg-cont\">");
+ out.println(" <div class=\"msg-menu\"><a href=\"#\" onclick=\"showMessageLinksDialog(" + msg.getMID() + "," + msg.getRID() + "); return false\"></a></div>");
+ if (!msg.getUser().Banned) {
+ out.println(" <div class=\"msg-header\"><a href=\"/" + msg.getUser().getUName() + "/\">@" + msg.getUser().getUName() + "</a>:</div>");
+ } else {
+ out.println(" <div class=\"msg-header\">[удалено]:</div>");
+ }
+ out.println(" <div class=\"msg-ts\"><a href=\"/" + msg.getMID() + "#" + msg.getRID() + "\" title=\"" + PageTemplates.sdfSQL.format(msg.getDate()) + " GMT\">" + PageTemplates.formatDate(msg.TimeAgo, msg.getDate()) + "</a></div>");
+ out.println(" <div class=\"msg-txt\">" + PageTemplates.formatMessage(msg.getText()) + "</div>");
+ if (msg.AttachmentType != null) {
+ out.println(" <div class=\"msg-media\"><a href=\"//i.juick.com/p/" + msg.getMID() + "-" + msg.getRID() + "." + msg.AttachmentType + "\"><img src=\"//i.juick.com/photos-512/" + msg.getMID() + "-" + msg.getRID() + "." + msg.AttachmentType + "\" alt=\"\"/></a></div>");
+ }
+ out.print(" <div class=\"msg-links\">/" + msg.getRID());
+ if (msg.ReplyTo > 0) {
+ out.print(" в ответ на <a href=\"#" + msg.ReplyTo + "\">/" + msg.ReplyTo + "</a>");
+ }
+ if (msg.VisitorCanComment) {
+ out.println(" &#183; <a href=\"#\" onclick=\"return showCommentForm(" + msg.getMID() + "," + msg.getRID() + ")\">Ответить</a></div>");
+ out.println(" <div class=\"msg-comment\" style=\"display: none\"></div>");
+ } else if (visitor == null) {
+ out.println(" <div class=\"msg-links\"><a href=\"#\" onclick=\"return openDialogLogin()\">Ответить</a></div>");
+ }
+ out.println(" </div>");
+ out.println(" </li>");
+ }
+ }
+}