From 55e156579b64e215ec9807cd3401b45ac1153f21 Mon Sep 17 00:00:00 2001 From: rebelonion <87634197+rebelonion@users.noreply.github.com> Date: Sat, 24 Feb 2024 22:43:55 -0600 Subject: [PATCH] feat: comment reporting --- .../connections/comments/CommentsAPI.kt | 74 ++++++++++++++++--- .../dantotsu/media/anime/AnimeWatchAdapter.kt | 3 +- .../dantotsu/media/comments/CommentItem.kt | 10 ++- .../media/comments/CommentsActivity.kt | 2 + .../dantotsu/media/manga/MangaReadAdapter.kt | 3 +- app/src/main/res/layout/item_comments.xml | 14 +++- 6 files changed, 90 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/connections/comments/CommentsAPI.kt b/app/src/main/java/ani/dantotsu/connections/comments/CommentsAPI.kt index 30e8ddc8..8b13f50a 100644 --- a/app/src/main/java/ani/dantotsu/connections/comments/CommentsAPI.kt +++ b/app/src/main/java/ani/dantotsu/connections/comments/CommentsAPI.kt @@ -1,6 +1,5 @@ package ani.dantotsu.connections.comments -import ani.dantotsu.BuildConfig import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName @@ -33,7 +32,12 @@ object CommentsAPI { suspend fun getCommentsForId(id: Int, page: Int = 1): CommentResponse? { val url = "$address/comments/$id/$page" val request = requestBuilder() - val json = request.get(url) + val json = try { + request.get(url) + } catch (e: IOException) { + snackString("Failed to fetch comments") + return null + } if (!json.text.startsWith("{")) return null val res = json.code == 200 if (!res && json.code != 404) { @@ -42,7 +46,6 @@ object CommentsAPI { val parsed = try { Json.decodeFromString(json.text) } catch (e: Exception) { - println("comments: $e") return null } return parsed @@ -51,7 +54,12 @@ object CommentsAPI { suspend fun getRepliesFromId(id: Int, page: Int = 1): CommentResponse? { val url = "$address/comments/parent/$id/$page" val request = requestBuilder() - val json = request.get(url) + val json = try { + request.get(url) + } catch (e: IOException) { + snackString("Failed to fetch comments") + return null + } if (!json.text.startsWith("{")) return null val res = json.code == 200 if (!res && json.code != 404) { @@ -60,7 +68,6 @@ object CommentsAPI { val parsed = try { Json.decodeFromString(json.text) } catch (e: Exception) { - println("comments: $e") return null } return parsed @@ -69,7 +76,12 @@ object CommentsAPI { suspend fun vote(commentId: Int, voteType: Int): Boolean { val url = "$address/comments/vote/$commentId/$voteType" val request = requestBuilder() - val json = request.post(url) + val json = try { + request.post(url) + } catch (e: IOException) { + snackString("Failed to vote") + return false + } val res = json.code == 200 if (!res) { errorReason(json.code, json.text) @@ -87,7 +99,12 @@ object CommentsAPI { body.add("parent_comment_id", it.toString()) } val request = requestBuilder() - val json = request.post(url, requestBody = body.build()) + val json = try{ + request.post(url, requestBody = body.build()) + } catch (e: IOException) { + snackString("Failed to comment") + return null + } val res = json.code == 200 if (!res) { errorReason(json.code, json.text) @@ -96,7 +113,6 @@ object CommentsAPI { val parsed = try { Json.decodeFromString(json.text) } catch (e: Exception) { - println("comment: $e") snackString("Failed to parse comment") return null } @@ -120,7 +136,12 @@ object CommentsAPI { suspend fun deleteComment(commentId: Int): Boolean { val url = "$address/comments/$commentId" val request = requestBuilder() - val json = request.delete(url) + val json = try{ + request.delete(url) + } catch (e: IOException) { + snackString("Failed to delete comment") + return false + } val res = json.code == 200 if (!res) { errorReason(json.code, json.text) @@ -134,7 +155,12 @@ object CommentsAPI { .add("content", content) .build() val request = requestBuilder() - val json = request.put(url, requestBody = body) + val json = try { + request.put(url, requestBody = body) + } catch (e: IOException) { + snackString("Failed to edit comment") + return false + } val res = json.code == 200 if (!res) { errorReason(json.code, json.text) @@ -145,7 +171,32 @@ object CommentsAPI { suspend fun banUser(userId: String): Boolean { val url = "$address/ban/$userId" val request = requestBuilder() - val json = request.post(url) + val json = try{ + request.post(url) + } catch (e: IOException) { + snackString("Failed to ban user") + return false + } + val res = json.code == 200 + if (!res) { + errorReason(json.code, json.text) + } + return res + } + + suspend fun reportComment(commentId: Int, username: String, mediaTitle: String): Boolean { + val url = "$address/report/$commentId" + val body = FormBody.Builder() + .add("username", username) + .add("mediaName", mediaTitle) + .build() + val request = requestBuilder() + val json = try{ + request.post(url, requestBody = body) + } catch (e: IOException) { + snackString("Failed to report comment") + return false + } val res = json.code == 200 if (!res) { errorReason(json.code, json.text) @@ -154,6 +205,7 @@ object CommentsAPI { } suspend fun fetchAuthToken() { + if (authToken != null) return val url = "$address/authenticate" val token = PrefManager.getVal(PrefName.AnilistToken, null as String?) ?: return val body: FormBody = FormBody.Builder() diff --git a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt index d72f0249..b17826ca 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt @@ -66,7 +66,8 @@ class AnimeWatchAdapter( startActivity( fragment.requireContext(), Intent(fragment.requireContext(), CommentsActivity::class.java) - .putExtra("mediaId", media.id), + .putExtra("mediaId", media.id) + .putExtra("mediaName", media.mainName()), null ) } diff --git a/app/src/main/java/ani/dantotsu/media/comments/CommentItem.kt b/app/src/main/java/ani/dantotsu/media/comments/CommentItem.kt index 2c7fe6bf..6279a270 100644 --- a/app/src/main/java/ani/dantotsu/media/comments/CommentItem.kt +++ b/app/src/main/java/ani/dantotsu/media/comments/CommentItem.kt @@ -17,7 +17,6 @@ import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.snackString import com.xwray.groupie.GroupieAdapter import com.xwray.groupie.Section - import com.xwray.groupie.viewbinding.BindableItem import io.noties.markwon.Markwon import kotlinx.coroutines.CoroutineScope @@ -127,6 +126,15 @@ class CommentItem(val comment: Comment, } } } + viewBinding.commentReport.setOnClickListener { + val scope = CoroutineScope(Dispatchers.Main + SupervisorJob()) + scope.launch { + val success = CommentsAPI.reportComment(comment.commentId, comment.username, commentsActivity.mediaName) + if (success) { + snackString("Comment Reported") + } + } + } //fill the icon if the user has liked the comment setVoteButtons(viewBinding) viewBinding.commentUpVote.setOnClickListener { diff --git a/app/src/main/java/ani/dantotsu/media/comments/CommentsActivity.kt b/app/src/main/java/ani/dantotsu/media/comments/CommentsActivity.kt index c4df12f5..1fc23058 100644 --- a/app/src/main/java/ani/dantotsu/media/comments/CommentsActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/comments/CommentsActivity.kt @@ -57,6 +57,7 @@ class CommentsActivity : AppCompatActivity() { private val section = Section() private val adapter = GroupieAdapter() private var mediaId: Int = -1 + var mediaName: String = "" private var backgroundColor: Int = 0 var pagesLoaded = 1 var totalPages = 1 @@ -69,6 +70,7 @@ class CommentsActivity : AppCompatActivity() { initActivity(this) //get the media id from the intent val mediaId = intent.getIntExtra("mediaId", -1) + mediaName = intent.getStringExtra("mediaName")?:"unknown" if (mediaId == -1) { snackString("Invalid Media ID") finish() diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt index 319b82a3..2342fede 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt @@ -72,7 +72,8 @@ class MangaReadAdapter( startActivity( fragment.requireContext(), Intent(fragment.requireContext(), CommentsActivity::class.java) - .putExtra("mediaId", media.id), + .putExtra("mediaId", media.id) + .putExtra("mediaName", media.mainName()), null ) } diff --git a/app/src/main/res/layout/item_comments.xml b/app/src/main/res/layout/item_comments.xml index 5bf536c0..dc68c463 100644 --- a/app/src/main/res/layout/item_comments.xml +++ b/app/src/main/res/layout/item_comments.xml @@ -159,6 +159,17 @@ android:textSize="12sp" tools:ignore="HardcodedText" /> + + \ No newline at end of file