From 15d2daa887a11e3176860dc272a9b83c44433778 Mon Sep 17 00:00:00 2001 From: Erik Kiznov <46452865+k1zn@users.noreply.github.com> Date: Fri, 26 Aug 2022 21:09:01 +0500 Subject: [PATCH] msg downloader: update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add wall_reply support - add story support - add podcast support - add gift support - add miniapp support - add audio playlist support - add poll support - add market support - add VK_DOMAIN constant (idk why но пусть будет) --- .../lite/downloaders/MessagesDownloader.java | 95 +++++++++++++++---- 1 file changed, 75 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/downloaders/MessagesDownloader.java b/app/src/main/java/ru/vtosters/lite/downloaders/MessagesDownloader.java index 90d7ce1f7..d9e6d7fc1 100644 --- a/app/src/main/java/ru/vtosters/lite/downloaders/MessagesDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/downloaders/MessagesDownloader.java @@ -33,6 +33,8 @@ public class MessagesDownloader{ private static SparseArray usersArray; + public static final String VK_DOMAIN = "vk.ru"; + public static String formatTime(long now){ return sdformat.format(new Date(now)); } @@ -264,6 +266,13 @@ public class MessagesDownloader{ ".msg-reply p.reply-content {\n" + " color: #000000;\n" + "}\n" + + ".vtex-milk-msg.poll {\n" + + " width: 45%;\n" + + " background: linear-gradient(to bottom right, #707c8c, #4d5565);\n" + + " font-style: normal;" + + "}\n" + + ".vtex-milk-msg.poll p { color: white; }\n" + + ".vtex-milk-msg.poll hr { border-top: 1px; background: #ffffff; }\n" + "\n" + ""; @@ -283,6 +292,7 @@ public class MessagesDownloader{ @Override String provideMessage(MiniMsg message, MiniUser user) throws JSONException{ String isOut = (user.id == getUserId()) ? " vtex-milk-msg-out" : ""; + String geoPosition = ""; if (message.geo != null) { var coordinates = message.geo.optJSONObject("coordinates"); @@ -295,6 +305,7 @@ public class MessagesDownloader{ ""; } } + String chatAction = (message.chat_action != null) ? getHtmlForChatAction(message.chat_action) : ""; String attaches = (message.attachments.size() > 0) ? "

Вложения: " + getHtmlForAttach(message.attachments) + "

" : ""; String reply = (message.reply_message != null) ? provideReply(message.reply_message) : ""; @@ -302,7 +313,7 @@ public class MessagesDownloader{ String userLink = (user.isGroup ? "club" : "id") + user.id; return "
" + - "

от " + user.firstName + " " + user.lastName + " " + formatTime(message.date) + "

" + // TODO photo100 + "

от " + user.firstName + " " + user.lastName + " " + formatTime(message.date) + "

" + // TODO photo100 "

" + mentionsReplace(message.text) + "

" + geoPosition + chatAction + @@ -381,7 +392,7 @@ public class MessagesDownloader{ var userLink = ((userId < 0) ? "club" : "id") + Math.abs(userId); - fwdmsgs.append("

@").append(userLink).append(": ").append(text).append(attachesHtml).append(replyHtml).append(fwdsHtml); + fwdmsgs.append("

@").append(userLink).append(": ").append(text).append(attachesHtml).append(replyHtml).append(fwdsHtml); } return fwdmsgs.append("

").toString(); @@ -390,7 +401,7 @@ public class MessagesDownloader{ private String mentionsReplace(String text) { var matcher = Pattern.compile("\\[((?:club|id|public)\\d+)\\|([^]]+)\\]").matcher(text); - return matcher.replaceAll("$2"); + return matcher.replaceAll("$2"); } private String pluralMsg(int count) { @@ -431,7 +442,7 @@ public class MessagesDownloader{ htmlAction.append("Добавил ").append((newUserId > 0) ? "пользователя" : "группу"); if (newUserId != 0) { var userLink = ((newUserId < 0) ? "club" : "id") + Math.abs(newUserId); - htmlAction.append(" @").append(userLink).append(""); + htmlAction.append(" @").append(userLink).append(""); } break; case "chat_kick_user": @@ -439,7 +450,7 @@ public class MessagesDownloader{ htmlAction.append("Исключил ").append((removedUserId > 0) ? "пользователя" : "группу"); if (removedUserId != 0) { var userLink = ((removedUserId < 0) ? "club" : "id") + Math.abs(removedUserId); - htmlAction.append(" @").append(userLink).append(""); + htmlAction.append(" @").append(userLink).append(""); } break; case "chat_pin_message": @@ -466,17 +477,6 @@ public class MessagesDownloader{ return htmlAction.append("

").toString(); } - /* - TODO: - 1) poll (опросы) - 2) mini_app (поделиться миниаппом) - 3) audio_playlist (плейлист песен) - 4) story (история) - 5) wall_reply (комментарий на стене) - 6) podcast (подкаст) - 7) gift (подарок) - */ - private String getHtmlForAttach(List attaches) throws JSONException{ StringBuilder rs = new StringBuilder(); @@ -486,7 +486,7 @@ public class MessagesDownloader{ if (item == null) continue; - switch(type) { + switch(type) { // market_album is not supported case "photo": var sizes = item.getJSONArray("sizes"); rs.append("фотография"); @@ -498,7 +498,7 @@ public class MessagesDownloader{ rs.append("ссылка"); break; case "wall": - rs.append("запись на стене"); + rs.append("запись на стене"); break; case "sticker": rs.append(""); @@ -512,6 +512,43 @@ public class MessagesDownloader{ case "video": rs.append("видеозапись ( ").append(getVideoHtml(item.optJSONObject("files"))).append(")"); break; + case "wall_reply": + var link = "https://" + VK_DOMAIN + "/wall" + item.optString("owner_id") + "_" + item.optString("post_id") + "?reply=" + item.optString("id"); + rs.append("комментарий на стене"); + break; + case "story": + var story_link = "https://" + VK_DOMAIN + "/story" + item.optString("owner_id") + "_" + item.optString("id"); + rs.append("история"); + break; + case "podcast": + var podcast_link = "https://" + VK_DOMAIN + "/podcast" + item.optString("owner_id") + "_" + item.optString("id"); + rs.append("подкаст"); + break; + case "gift": + rs.append(""); + break; + case "mini_app": + var app = item.optJSONObject("app"); + + if (app != null) { + var miniapp_link = "https://" + VK_DOMAIN + "/app" + app.optString("id"); + rs.append("мини-приложение"); + break; + } + + rs.append("ошибка"); + break; + case "audio_playlist": + var playlist_link = "https://" + VK_DOMAIN + "/music/album/" + item.optString("owner_id") + "_" + item.optString("id") + "_" + item.optString("access_key"); + rs.append("плейлист (").append(item.optString("title")).append(")"); + break; + case "poll": + rs.append((item.optBoolean("anonymous") ? "анонимный" : "публичный")).append(" опрос ").append(getPollHtml(item)); + break; + case "market": + var market_item_link = "https://" + VK_DOMAIN + "/market" + item.optString("owner_id") + "_" + item.optString("id"); + rs.append("товар"); + break; default: rs.append("не поддерживается (").append(type).append(")"); break; @@ -524,8 +561,26 @@ public class MessagesDownloader{ } } - private static String getVideoHtml(JSONObject files) throws JSONException { + private static String getPollHtml(JSONObject poll) throws JSONException { + StringBuilder pollHtml = new StringBuilder( + "
" + + "

" + poll.optString("question") + "

" + ); + var answers = poll.optJSONArray("answers"); + + for (int i = 0; i < answers.length(); i++) { + var jsonObject = answers.optJSONObject(i); + if (jsonObject != null) + pollHtml.append("

").append(jsonObject.optString("text")).append(" · ").append(jsonObject.optString("votes")).append(" (").append(jsonObject.optString("rate")).append("%)

"); + } + + pollHtml.append("

Проголосовало ").append(poll.optString("votes")).append(" чел.

"); + + return pollHtml.append("
").toString(); + } + + private static String getVideoHtml(JSONObject files) throws JSONException { if (files == null) return "ссылки отсутствуют"; Iterator< ? > keys = files.keys(); @@ -539,7 +594,7 @@ public class MessagesDownloader{ if (key.equals("mp4_" + quality[qualityIndex])) { videoHtml.append("").append(quality[qualityIndex]).append("p").append(" "); - if (qualityIndex == 7) break; + if (qualityIndex == quality.length - 1) break; ++qualityIndex; } }