{"action":"created","comment":{"url":"https://api.github.com/repos/Innoxia/liliths-throne-public/pulls/comments/211118030","pull_request_review_id":147473603,"id":211118030,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMTExODAzMA==","diff_hunk":"@@ -0,0 +1,175 @@\n+package com.lilithsthrone.utils;\n+\n+import com.lilithsthrone.main.Main;\n+\n+import java.io.File;\n+import java.io.IOException;\n+import java.nio.file.*;\n+import java.text.DateFormat;\n+import java.text.SimpleDateFormat;\n+import java.util.ArrayList;\n+import java.util.Comparator;\n+import java.util.List;\n+import java.util.stream.Stream;\n+\n+/**\n+ * @since 0.2.10\n+ * @version 0.2.10\n+ * @author Addi\n+ */\n+public class FileUtils {\n+\n+    /**\n+     * Returns the formatted date of the last modification of the given file.\n+     * @param file The file to check for the last modification\n+     * @return A string containing the date of the modification\n+     */\n+    public static String getFileTime(File file) {\n+        DateFormat dateFormat = new SimpleDateFormat(\"dd/MM/yy - hh:mm\");\n+        return dateFormat.format(file.lastModified());\n+    }\n+\n+    /**\n+     * Compiles a list of all files in the given path matching the given pattern, e.g. \"*.xml\" for all XML files.\n+     * @param path The directory to search\n+     * @param pattern The file name pattern to include\n+     * @return A list of files matching the pattern\n+     */\n+    public static List<File> listFiles(String path, String pattern) {\n+        List<File> filesList = new ArrayList<>();\n+\n+        // Iterate over all files in the directory matching the pattern\n+        try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(path), pattern)) {\n+            for (Path entry : stream) {\n+                filesList.add(entry.toFile());\n+            }\n+        } catch (IOException e) {\n+            e.printStackTrace();\n+        }\n+\n+        // Sort the files from newest to oldest\n+        filesList.sort(Comparator.comparingLong(File::lastModified).reversed());\n+        return filesList;\n+    }\n+\n+    /**\n+     * Utility method to construct the paths from strings. See {@link FileUtils#copyFile(Path, Path, boolean)} for details.\n+     * @param source A string containing the path to the source file\n+     * @param destination A string containing the path to the destination file\n+     */\n+    public static boolean copyFile(String source, String destination) {\n+        return copyFile(Paths.get(source), Paths.get(destination), false);\n+    }\n+\n+    /**\n+     * Copies a single file from the source to the target. Returns success and flashes a message if the operation fails.\n+     * @param source The path of the source file\n+     * @param destination The path of the destination file\n+     * @param atomic Indicates if the operation should execute in a single step, which guarantees thread safety and\n+     *               completeness, but is more likely to cause an error\n+     * @return True if the operation succeeded, false otherwise\n+     */\n+    public static boolean copyFile(Path source, Path destination, boolean atomic) {\n+        try {\n+            // Skip existing directories\n+            if (Files.isDirectory(destination) && Files.exists(destination)) {","path":"src/com/lilithsthrone/utils/FileUtils.java","position":75,"original_position":75,"commit_id":"18abd6c88cc0f09b7b7f515e741a520858e5faa2","original_commit_id":"18abd6c88cc0f09b7b7f515e741a520858e5faa2","user":{"login":"DJ4ddi","id":1696102,"node_id":"MDQ6VXNlcjE2OTYxMDI=","avatar_url":"https://avatars0.githubusercontent.com/u/1696102?v=4","gravatar_id":"","url":"https://api.github.com/users/DJ4ddi","html_url":"https://github.com/DJ4ddi","followers_url":"https://api.github.com/users/DJ4ddi/followers","following_url":"https://api.github.com/users/DJ4ddi/following{/other_user}","gists_url":"https://api.github.com/users/DJ4ddi/gists{/gist_id}","starred_url":"https://api.github.com/users/DJ4ddi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DJ4ddi/subscriptions","organizations_url":"https://api.github.com/users/DJ4ddi/orgs","repos_url":"https://api.github.com/users/DJ4ddi/repos","events_url":"https://api.github.com/users/DJ4ddi/events{/privacy}","received_events_url":"https://api.github.com/users/DJ4ddi/received_events","type":"User","site_admin":false},"body":"There seem to be a lot of misunderstandings here, so let me try to clear those up:\r\n\r\nFirst of all, the FileUtils methods are designed for general purpose usage. The image import and export do use these new methods because they're convenient, but the point is to provide generally streamlined file utilities.\r\n\r\nSo what you are arguing for is essentially that no code in the entirety of LT should ever be allowed to write files outside of the installation directory. This does not seem like a useful limitation as it can be done by the system (user permissions) in a more reliable way. If you still think that it should be done, feel free to create your own [SecurityManager](https://docs.oracle.com/javase/8/docs/api/java/lang/SecurityManager.html) implementation, which the file methods will take into account by default.\r\nAnd while we're on the subject of security: It is (in theory) possible to modify a save game to include a specifically formatted path as character name, which would then be used as part of the path created by the game, which could then be used to copy an infested JPG or PNG file that could cause a security issue when manually opening it with a program that does not have 10-year old exploits fixed. I'm not saying that it should be neglected, but by your argumentation virtually all programs installed on my PC pose a security threat because they are capable of copying files and opening images.\r\n\r\nNext up, a dedicated copy method should definitely not always fail if the file already exists. Replacing it is desirable in many scenarios and can be prevented by checking the presence of the file beforehand.\r\nThere are numerous examples of directory trees deeper than two levels in LT. For example, an imported image would be put into /res/images/characters/generic/((charactername))/custom, out of which only the first part (/res) is guaranteed to exist and only the first three (/res/images/characters) exist by default. It should be mentioned that I didn't code it that way, I only followed the structure that the game already had.\r\n\r\nAnd finally, a late fail during a file operation is never clean unless it is guaranteed to be atomic by the system (which is almost never the case). The process can fail at any time for a variety of reasons, leaving partially written files behind. You are correct that there may be empty directories under very specific circumstances, but those would require manual cleanup in any case, regardless of wether things are done in one try block or multiple. Thing is: I could see arguments in favor of always checking for incomplete files or empty directories and delete them, but for the purposes of debugging on both the developer and the user side (e.g. moving files manually) it may actually be desirable to have those folders created.\r\nWhat I'm trying to say is this: Your point has nothing to do with a long try block and applies to any kind of writing file system operation.\r\n\r\nOn the positive side, the Files.exists call is indeed redundant, thanks for pointing that out.","created_at":"2018-08-19T22:52:29Z","updated_at":"2018-08-19T22:52:29Z","html_url":"https://github.com/Innoxia/liliths-throne-public/pull/904#discussion_r211118030","pull_request_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/pulls/904","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/Innoxia/liliths-throne-public/pulls/comments/211118030"},"html":{"href":"https://github.com/Innoxia/liliths-throne-public/pull/904#discussion_r211118030"},"pull_request":{"href":"https://api.github.com/repos/Innoxia/liliths-throne-public/pulls/904"}},"in_reply_to_id":211098076},"pull_request":{"url":"https://api.github.com/repos/Innoxia/liliths-throne-public/pulls/904","id":209324990,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA5MzI0OTkw","html_url":"https://github.com/Innoxia/liliths-throne-public/pull/904","diff_url":"https://github.com/Innoxia/liliths-throne-public/pull/904.diff","patch_url":"https://github.com/Innoxia/liliths-throne-public/pull/904.patch","issue_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/issues/904","number":904,"state":"open","locked":false,"title":"Custom image accessibility","user":{"login":"DJ4ddi","id":1696102,"node_id":"MDQ6VXNlcjE2OTYxMDI=","avatar_url":"https://avatars0.githubusercontent.com/u/1696102?v=4","gravatar_id":"","url":"https://api.github.com/users/DJ4ddi","html_url":"https://github.com/DJ4ddi","followers_url":"https://api.github.com/users/DJ4ddi/followers","following_url":"https://api.github.com/users/DJ4ddi/following{/other_user}","gists_url":"https://api.github.com/users/DJ4ddi/gists{/gist_id}","starred_url":"https://api.github.com/users/DJ4ddi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DJ4ddi/subscriptions","organizations_url":"https://api.github.com/users/DJ4ddi/orgs","repos_url":"https://api.github.com/users/DJ4ddi/repos","events_url":"https://api.github.com/users/DJ4ddi/events{/privacy}","received_events_url":"https://api.github.com/users/DJ4ddi/received_events","type":"User","site_admin":false},"body":"So I originally intended to wait for some bug reports so I could just merge the fixes in with this, but for the sake of keeping it at least somewhat condensed I won't.\r\n\r\n### Goals\r\n\r\nThis PR aims to further improve the accessibility and ease-of-use of custom images. This was already started with the ingame button to add images, now it is joined by its friend, the remove button.\r\n\r\nFurthermore, images are now ex- and imported along with their characters. This applies to both the player (when starting a new game) and slaves (when importing at the auction). It should also make sharing characters with images easier, as people no longer need to look for them in the depths of the resource folder.\r\n\r\n### Changes\r\n\r\nThe delete button shouldn't need much explaining. It removes the image, then reloads, that's all.\r\n\r\nImport and export are also more or less self-explanatory. A directory with the same name as the .xml file containing the character information is created and all images of the character are copied into it. The copy is recursive, so artist folders are preserved.\r\n\r\nSomething that does need explaining is the new FileUtils class. I found that file handling was all over the place with very little error handling and the outdated Utils API. In order to streamline this, as well as to improve performance and error handling, I wrote some standard use cases (copy, delete) using the more modern NIO2 API and put them here. All methods are documented, if there are any questions I can be reached via Discord.\r\n\r\n### Testing\r\n\r\nAll changes have been tested based on 0.2.10.2.","created_at":"2018-08-18T18:37:35Z","updated_at":"2018-08-19T22:52:29Z","closed_at":null,"merged_at":null,"merge_commit_sha":"78642236138b66c4008714ec6b7eb169d3a2d348","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/pulls/904/commits","review_comments_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/pulls/904/comments","review_comment_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/issues/904/comments","statuses_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/statuses/18abd6c88cc0f09b7b7f515e741a520858e5faa2","head":{"label":"DJ4ddi:custom-image-improvements","ref":"custom-image-improvements","sha":"18abd6c88cc0f09b7b7f515e741a520858e5faa2","user":{"login":"DJ4ddi","id":1696102,"node_id":"MDQ6VXNlcjE2OTYxMDI=","avatar_url":"https://avatars0.githubusercontent.com/u/1696102?v=4","gravatar_id":"","url":"https://api.github.com/users/DJ4ddi","html_url":"https://github.com/DJ4ddi","followers_url":"https://api.github.com/users/DJ4ddi/followers","following_url":"https://api.github.com/users/DJ4ddi/following{/other_user}","gists_url":"https://api.github.com/users/DJ4ddi/gists{/gist_id}","starred_url":"https://api.github.com/users/DJ4ddi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DJ4ddi/subscriptions","organizations_url":"https://api.github.com/users/DJ4ddi/orgs","repos_url":"https://api.github.com/users/DJ4ddi/repos","events_url":"https://api.github.com/users/DJ4ddi/events{/privacy}","received_events_url":"https://api.github.com/users/DJ4ddi/received_events","type":"User","site_admin":false},"repo":{"id":132915607,"node_id":"MDEwOlJlcG9zaXRvcnkxMzI5MTU2MDc=","name":"liliths-throne-public","full_name":"DJ4ddi/liliths-throne-public","owner":{"login":"DJ4ddi","id":1696102,"node_id":"MDQ6VXNlcjE2OTYxMDI=","avatar_url":"https://avatars0.githubusercontent.com/u/1696102?v=4","gravatar_id":"","url":"https://api.github.com/users/DJ4ddi","html_url":"https://github.com/DJ4ddi","followers_url":"https://api.github.com/users/DJ4ddi/followers","following_url":"https://api.github.com/users/DJ4ddi/following{/other_user}","gists_url":"https://api.github.com/users/DJ4ddi/gists{/gist_id}","starred_url":"https://api.github.com/users/DJ4ddi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DJ4ddi/subscriptions","organizations_url":"https://api.github.com/users/DJ4ddi/orgs","repos_url":"https://api.github.com/users/DJ4ddi/repos","events_url":"https://api.github.com/users/DJ4ddi/events{/privacy}","received_events_url":"https://api.github.com/users/DJ4ddi/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/DJ4ddi/liliths-throne-public","description":"Public repository for Lilith's Throne. (18+)","fork":true,"url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public","forks_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/forks","keys_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/keys{/key_id}","collaborators_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/teams","hooks_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/hooks","issue_events_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/issues/events{/number}","events_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/events","assignees_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/assignees{/user}","branches_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/branches{/branch}","tags_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/tags","blobs_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/git/refs{/sha}","trees_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/git/trees{/sha}","statuses_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/statuses/{sha}","languages_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/languages","stargazers_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/stargazers","contributors_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/contributors","subscribers_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/subscribers","subscription_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/subscription","commits_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/commits{/sha}","git_commits_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/git/commits{/sha}","comments_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/comments{/number}","issue_comment_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/issues/comments{/number}","contents_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/contents/{+path}","compare_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/compare/{base}...{head}","merges_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/merges","archive_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/downloads","issues_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/issues{/number}","pulls_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/pulls{/number}","milestones_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/milestones{/number}","notifications_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/labels{/name}","releases_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/releases{/id}","deployments_url":"https://api.github.com/repos/DJ4ddi/liliths-throne-public/deployments","created_at":"2018-05-10T14:56:25Z","updated_at":"2018-08-18T19:57:45Z","pushed_at":"2018-08-18T22:06:23Z","git_url":"git://github.com/DJ4ddi/liliths-throne-public.git","ssh_url":"git@github.com:DJ4ddi/liliths-throne-public.git","clone_url":"https://github.com/DJ4ddi/liliths-throne-public.git","svn_url":"https://github.com/DJ4ddi/liliths-throne-public","homepage":"","size":60834,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"custom-image-improvements"}},"base":{"label":"Innoxia:dev","ref":"dev","sha":"2757cf9b2ce458b95e4e985e61c22ec1aa42d095","user":{"login":"Innoxia","id":25914384,"node_id":"MDQ6VXNlcjI1OTE0Mzg0","avatar_url":"https://avatars2.githubusercontent.com/u/25914384?v=4","gravatar_id":"","url":"https://api.github.com/users/Innoxia","html_url":"https://github.com/Innoxia","followers_url":"https://api.github.com/users/Innoxia/followers","following_url":"https://api.github.com/users/Innoxia/following{/other_user}","gists_url":"https://api.github.com/users/Innoxia/gists{/gist_id}","starred_url":"https://api.github.com/users/Innoxia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Innoxia/subscriptions","organizations_url":"https://api.github.com/users/Innoxia/orgs","repos_url":"https://api.github.com/users/Innoxia/repos","events_url":"https://api.github.com/users/Innoxia/events{/privacy}","received_events_url":"https://api.github.com/users/Innoxia/received_events","type":"User","site_admin":false},"repo":{"id":98690886,"node_id":"MDEwOlJlcG9zaXRvcnk5ODY5MDg4Ng==","name":"liliths-throne-public","full_name":"Innoxia/liliths-throne-public","owner":{"login":"Innoxia","id":25914384,"node_id":"MDQ6VXNlcjI1OTE0Mzg0","avatar_url":"https://avatars2.githubusercontent.com/u/25914384?v=4","gravatar_id":"","url":"https://api.github.com/users/Innoxia","html_url":"https://github.com/Innoxia","followers_url":"https://api.github.com/users/Innoxia/followers","following_url":"https://api.github.com/users/Innoxia/following{/other_user}","gists_url":"https://api.github.com/users/Innoxia/gists{/gist_id}","starred_url":"https://api.github.com/users/Innoxia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Innoxia/subscriptions","organizations_url":"https://api.github.com/users/Innoxia/orgs","repos_url":"https://api.github.com/users/Innoxia/repos","events_url":"https://api.github.com/users/Innoxia/events{/privacy}","received_events_url":"https://api.github.com/users/Innoxia/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Innoxia/liliths-throne-public","description":"Public repository for Lilith's Throne. (18+)","fork":false,"url":"https://api.github.com/repos/Innoxia/liliths-throne-public","forks_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/forks","keys_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/teams","hooks_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/hooks","issue_events_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/issues/events{/number}","events_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/events","assignees_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/assignees{/user}","branches_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/branches{/branch}","tags_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/tags","blobs_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/git/refs{/sha}","trees_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/statuses/{sha}","languages_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/languages","stargazers_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/stargazers","contributors_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/contributors","subscribers_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/subscribers","subscription_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/subscription","commits_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/commits{/sha}","git_commits_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/git/commits{/sha}","comments_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/comments{/number}","issue_comment_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/issues/comments{/number}","contents_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/contents/{+path}","compare_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/merges","archive_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/downloads","issues_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/issues{/number}","pulls_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/pulls{/number}","milestones_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/milestones{/number}","notifications_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/labels{/name}","releases_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/releases{/id}","deployments_url":"https://api.github.com/repos/Innoxia/liliths-throne-public/deployments","created_at":"2017-07-28T21:51:29Z","updated_at":"2018-08-18T18:43:57Z","pushed_at":"2018-08-19T00:14:39Z","git_url":"git://github.com/Innoxia/liliths-throne-public.git","ssh_url":"git@github.com:Innoxia/liliths-throne-public.git","clone_url":"https://github.com/Innoxia/liliths-throne-public.git","svn_url":"https://github.com/Innoxia/liliths-throne-public","homepage":"","size":59734,"stargazers_count":70,"watchers_count":70,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":94,"mirror_url":null,"archived":false,"open_issues_count":382,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":94,"open_issues":382,"watchers":70,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Innoxia/liliths-throne-public/pulls/904"},"html":{"href":"https://github.com/Innoxia/liliths-throne-public/pull/904"},"issue":{"href":"https://api.github.com/repos/Innoxia/liliths-throne-public/issues/904"},"comments":{"href":"https://api.github.com/repos/Innoxia/liliths-throne-public/issues/904/comments"},"review_comments":{"href":"https://api.github.com/repos/Innoxia/liliths-throne-public/pulls/904/comments"},"review_comment":{"href":"https://api.github.com/repos/Innoxia/liliths-throne-public/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Innoxia/liliths-throne-public/pulls/904/commits"},"statuses":{"href":"https://api.github.com/repos/Innoxia/liliths-throne-public/statuses/18abd6c88cc0f09b7b7f515e741a520858e5faa2"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"DJ4ddi"}}