├── .gitignore ├── src ├── main │ └── java │ │ └── ga │ │ └── dryco │ │ └── redditjerk │ │ ├── datamodels │ │ ├── More.java │ │ ├── T5Listing.java │ │ ├── ModeratorsListing.java │ │ ├── T1Listing.java │ │ ├── T3Listing.java │ │ ├── T3.java │ │ ├── T1.java │ │ ├── T5.java │ │ ├── T2.java │ │ ├── JsonError.java │ │ ├── MoreChildren.java │ │ ├── ModeratorsListingData.java │ │ ├── T3ListingData.java │ │ ├── T5ListingData.java │ │ ├── RedditThreadData.java │ │ ├── PostReturn.java │ │ ├── Thing.java │ │ ├── T1ListingData.java │ │ ├── deserializers │ │ │ ├── T3Deserializer.java │ │ │ ├── T1Deserializer.java │ │ │ ├── ThreadDeserializer.java │ │ │ ├── MoreChildrenDeserializer.java │ │ │ ├── PostReturnDeserializer.java │ │ │ └── T1ListingDeserializer.java │ │ ├── ModeratorsData.java │ │ ├── MoreData.java │ │ ├── ListingData.java │ │ ├── AuthData.java │ │ ├── T1Data.java │ │ ├── T3Data.java │ │ ├── PostData.java │ │ ├── T2Data.java │ │ └── T5Data.java │ │ ├── wrappers │ │ ├── Thingy.java │ │ ├── Post.java │ │ ├── Link.java │ │ ├── Comment.java │ │ ├── User.java │ │ ├── Subreddit.java │ │ └── RedditThread.java │ │ ├── api │ │ ├── Reddit.java │ │ ├── enums │ │ │ ├── FlairPosition.java │ │ │ ├── ConfigValues.java │ │ │ ├── Distinguish.java │ │ │ ├── Moderation.java │ │ │ ├── Sorting.java │ │ │ ├── FromPast.java │ │ │ └── Endpoints.java │ │ ├── FlairApi.java │ │ ├── SubredditApi.java │ │ ├── UserApi.java │ │ ├── ModerationApi.java │ │ └── PostApi.java │ │ ├── exceptions │ │ ├── OAuthClientException.java │ │ └── RedditJerkException.java │ │ ├── rest │ │ ├── AuthInfo.java │ │ └── OAuthClient.java │ │ └── implementation │ │ └── RedditApi.java └── test │ └── java │ └── ga │ └── dryco │ └── redditjerk │ ├── TestBot.java │ ├── ClientTest.java │ └── ExamplesTest.java ├── pom.xml └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # IntelliJ 2 | .idea/ 3 | *.iml 4 | *.ipr 5 | *.iws 6 | 7 | # Local todo list 8 | todo.txt 9 | 10 | # Other 11 | bin/ 12 | *.swp 13 | 14 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/More.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | 4 | public class More extends Thing { 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/T5Listing.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | 4 | public class T5Listing extends Thing { 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/ModeratorsListing.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | 4 | public class ModeratorsListing extends Thing { 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/T1Listing.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | /** 4 | * Listing is a thing with "data" type of ListingData 5 | */ 6 | public class T1Listing extends Thing { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/T3Listing.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | /** 4 | * Listing is a Thing with "data" type of ListingData 5 | */ 6 | public class T3Listing extends Thing { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/T3.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | import ga.dryco.redditjerk.wrappers.Link; 4 | 5 | /** 6 | * t3 type objects Links 7 | */ 8 | public class T3 extends Thing { 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/wrappers/Thingy.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.wrappers; 2 | 3 | /** 4 | * A parent interface for T1(commensts), T3(Links) and T5(subreddits) things. 5 | */ 6 | public interface Thingy { 7 | 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/T1.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | import ga.dryco.redditjerk.wrappers.Comment; 4 | 5 | /** 6 | * t1 is comment object 7 | */ 8 | public class T1 extends Thing{ 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/T5.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | import ga.dryco.redditjerk.wrappers.Subreddit; 4 | 5 | /** 6 | * T5 is Subreddit info type 7 | */ 8 | public class T5 extends Thing { 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/api/Reddit.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.api; 2 | 3 | 4 | 5 | 6 | /** 7 | * Parent Reddit Api Interface 8 | */ 9 | public interface Reddit extends FlairApi, ModerationApi, PostApi, SubredditApi, UserApi { 10 | 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/T2.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | import ga.dryco.redditjerk.wrappers.User; 4 | 5 | /** 6 | * T2 is user 7 | * Thing with data type of User, class User extends T2Data 8 | */ 9 | public class T2 extends Thing { 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/JsonError.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | 4 | import com.google.gson.annotations.Expose; 5 | 6 | public class JsonError { 7 | 8 | @Expose 9 | private Integer error; 10 | 11 | public Integer getError() { 12 | return error; 13 | } 14 | 15 | public void setError(Integer error) { 16 | this.error = error; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/api/enums/FlairPosition.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.api.enums; 2 | 3 | 4 | /** 5 | * Values for flair possition 6 | */ 7 | public enum FlairPosition { 8 | LEFT("left"), 9 | RIGHT("right"); 10 | 11 | private String position; 12 | 13 | FlairPosition(String position){ 14 | this.position = position; 15 | } 16 | 17 | @Override 18 | public String toString(){ 19 | return this.position; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/exceptions/OAuthClientException.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.exceptions; 2 | 3 | 4 | public class OAuthClientException extends RuntimeException { 5 | public OAuthClientException(){ 6 | super(); 7 | } 8 | 9 | public OAuthClientException(String message) { 10 | super(message); 11 | } 12 | 13 | public OAuthClientException(String message, Throwable cause) { 14 | super(message, cause); 15 | } 16 | 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/api/enums/ConfigValues.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.api.enums; 2 | 3 | 4 | /** 5 | * Contains reddit api URIs for oauth and normal use 6 | */ 7 | 8 | public enum ConfigValues { 9 | API_URL("https://api.reddit.com/"), 10 | OAUTH_URL("https://oauth.reddit.com/"); 11 | private String url; 12 | 13 | ConfigValues(String url) { 14 | this.url = url; 15 | } 16 | 17 | @Override 18 | public String toString() { 19 | return url; 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/api/enums/Distinguish.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.api.enums; 2 | 3 | 4 | /** 5 | * Contains values for post Distinguish 6 | * 7 | */ 8 | 9 | public enum Distinguish { 10 | YES("yes"), 11 | NO("no"), 12 | ADMIN("admin"), 13 | SPECIAL("special"); 14 | 15 | private String distinguish; 16 | 17 | Distinguish(String distinguish){ 18 | this.distinguish = distinguish; 19 | } 20 | 21 | public String toString(){ 22 | return this.distinguish; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/exceptions/RedditJerkException.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.exceptions; 2 | 3 | 4 | /** 5 | * General RedditJerk Exception 6 | * 7 | */ 8 | public class RedditJerkException extends RuntimeException { 9 | public RedditJerkException(){ 10 | super(); 11 | } 12 | 13 | public RedditJerkException(String message) { 14 | super(message); 15 | } 16 | 17 | public RedditJerkException(String message, Throwable cause) { 18 | super(message, cause); 19 | } 20 | 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/wrappers/Post.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.wrappers; 2 | 3 | 4 | import ga.dryco.redditjerk.api.enums.Distinguish; 5 | 6 | /** 7 | * Interface for Links and Comments 8 | */ 9 | public interface Post extends Thingy{ 10 | Post edit(String text) ; 11 | void delete() ; 12 | void upvote() ; 13 | void downvote() ; 14 | Post reply(String text) ; 15 | void hide(); 16 | void unhide(); 17 | void remove(Boolean spam); 18 | void approve(); 19 | void distinguish(Distinguish distinguish); 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/api/enums/Moderation.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.api.enums; 2 | 3 | 4 | /** 5 | * 6 | * Moderation page values 7 | */ 8 | public enum Moderation { 9 | REPORTED("reports"), 10 | SPAM("spam"), 11 | QUEUE("modqueue"), 12 | EDITED("edited"), 13 | UNMODERATED("unmoderated"); 14 | 15 | 16 | private String mod_list; 17 | 18 | Moderation(String mod_list){ 19 | this.mod_list = mod_list; 20 | } 21 | 22 | @Override 23 | public String toString(){ 24 | return this.mod_list; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/MoreChildren.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | /** 4 | * returned data from /api/morechildren is converted to T1Listing and encaplusated in moreChildrenComments 5 | */ 6 | public class MoreChildren { 7 | private T1Listing moreChildrenComments; 8 | 9 | public T1Listing getMoreChildrenComments() { 10 | return moreChildrenComments; 11 | } 12 | 13 | public void setMoreChildrenComments(T1Listing moreChildrenComments) { 14 | this.moreChildrenComments = moreChildrenComments; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/api/enums/Sorting.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.api.enums; 2 | 3 | /** 4 | * Post sorting values 5 | * 6 | */ 7 | public enum Sorting { 8 | 9 | NEW("new"), 10 | TOP("top"), 11 | HOT("hot"), 12 | CONTROVERSIAL("controversial"), 13 | RISING("rising"); 14 | 15 | 16 | private String sortingString; 17 | 18 | Sorting(String sortingString){ 19 | this.sortingString = sortingString; 20 | } 21 | 22 | @Override 23 | public final String toString(){ 24 | return this.sortingString; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/api/enums/FromPast.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.api.enums; 2 | 3 | 4 | /** 5 | * Timespan values for posts 6 | * 7 | */ 8 | public enum FromPast { 9 | HOUR("hour"), 10 | DAY("day"), 11 | WEEK("week"), 12 | MONTH("month"), 13 | YEAR("year"), 14 | ALL_TIME("all"); 15 | 16 | private String fromPastString; 17 | 18 | FromPast(String fromPastString){ 19 | this.fromPastString = fromPastString; 20 | } 21 | 22 | @Override 23 | public final String toString(){ 24 | return this.fromPastString; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/ModeratorsListingData.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | import com.google.gson.annotations.Expose; 4 | 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * This is a weird listing that doesn't include "after" and "before" so no need to extend ListingData 10 | */ 11 | public class ModeratorsListingData { 12 | 13 | public List getChildren() { 14 | return children; 15 | } 16 | 17 | public void setChildren(List children) { 18 | this.children = children; 19 | } 20 | 21 | @Expose 22 | private List children; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/T3ListingData.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | 7 | 8 | public class T3ListingData extends ListingData{ 9 | 10 | /** 11 | * Listing that will contain Children of type t3 12 | * 13 | */ 14 | @Expose 15 | private List children = new ArrayList<>(); 16 | 17 | public List getChildren() { 18 | return children; 19 | } 20 | 21 | /** 22 | * 23 | * @param children 24 | * The children 25 | */ 26 | public void setChildren(List children) { 27 | this.children = children; 28 | } 29 | 30 | 31 | 32 | } -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/T5ListingData.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | 7 | 8 | public class T5ListingData extends ListingData{ 9 | 10 | /** 11 | * Listing that will contain Children of type t5 12 | * 13 | */ 14 | @Expose 15 | private List children = new ArrayList<>(); 16 | 17 | public List getChildren() { 18 | return children; 19 | } 20 | 21 | /** 22 | * 23 | * @param children 24 | * The children 25 | */ 26 | public void setChildren(List children) { 27 | this.children = children; 28 | } 29 | 30 | 31 | 32 | } -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/RedditThreadData.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | /** 4 | * A thread contains a main post(Original Post) and optionally comments 5 | * the comments are nested and can be flattened into a simple List of T1 objects 6 | */ 7 | public class RedditThreadData { 8 | private T3 SubmissionPost; 9 | private T1Listing Comments; 10 | 11 | public T3 getSubmissionPost() { 12 | return SubmissionPost; 13 | } 14 | 15 | public void setSubmissionPost(T3 submissionPost) { 16 | SubmissionPost = submissionPost; 17 | } 18 | 19 | public T1Listing getComments() { 20 | return Comments; 21 | } 22 | 23 | public void setComments(T1Listing comments) { 24 | Comments = comments; 25 | } 26 | 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/api/FlairApi.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.api; 2 | 3 | import ga.dryco.redditjerk.api.enums.FlairPosition; 4 | 5 | /** 6 | * Functions regarding the reddit Flair feature 7 | * 8 | */ 9 | public interface FlairApi { 10 | void deleteFlair(String subreddit, String username); 11 | void clearFlairTemplates(String subreddit, String flairtype); 12 | void deleteFlairTemplate(String subreddit, String flairTemplateId); 13 | void linkFlair(String subreddit, String link_fullName, String text, String css_class); 14 | void userFlair(String subreddit, String name, String text, String css_class); 15 | void flairConfig(String flair_enabled, FlairPosition flair_position, Boolean flair_self_assign_enabled, FlairPosition link_flair_position, Boolean link_flair_self_assign_enabled); 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/PostReturn.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | /** 4 | * Data class for the JSON returned when POSTing a reply or Link, the deserializer takes care of what to put where 5 | */ 6 | public class PostReturn { 7 | 8 | private T1 comment; 9 | private T3 link; 10 | private String kind; 11 | public String getKind() { 12 | return kind; 13 | } 14 | 15 | public void setKind(String kind) { 16 | this.kind = kind; 17 | } 18 | 19 | 20 | 21 | public T3 getLink() { 22 | return link; 23 | } 24 | 25 | public void setLink(T3 link) { 26 | this.link = link; 27 | } 28 | 29 | public T1 getComment() { 30 | return comment; 31 | } 32 | 33 | public void setComment(T1 comment) { 34 | this.comment = comment; 35 | } 36 | 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/Thing.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | 4 | import com.google.gson.annotations.Expose; 5 | 6 | 7 | public abstract class Thing { 8 | 9 | @Expose 10 | private String kind; 11 | @Expose 12 | private T data; 13 | 14 | /** 15 | * 16 | * @return 17 | * The kind 18 | */ 19 | public String getKind() { 20 | return kind; 21 | } 22 | 23 | /** 24 | * 25 | * @param kind 26 | * The kind 27 | */ 28 | public void setKind(String kind) { 29 | this.kind = kind; 30 | } 31 | 32 | /** 33 | * 34 | * @return 35 | * The data 36 | */ 37 | public T getData() { 38 | return data; 39 | } 40 | 41 | /** 42 | * 43 | * @param data 44 | * The data 45 | */ 46 | public void setData(T data) { 47 | this.data = data; 48 | } 49 | 50 | } -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/T1ListingData.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | import com.google.gson.annotations.Expose; 6 | 7 | 8 | public class T1ListingData extends ListingData { 9 | 10 | /** 11 | * Listing that will contain Children of type "t1" and type "more" 12 | * 13 | */ 14 | @Expose 15 | private List children = new ArrayList<>(); 16 | 17 | private List moreChildren = new ArrayList<>(); 18 | 19 | 20 | public List getChildren() { 21 | return children; 22 | } 23 | 24 | public void setChildren(List children) { 25 | this.children = children; 26 | } 27 | 28 | public List getMoreChildren() { 29 | return moreChildren; 30 | } 31 | 32 | public void setMoreChildren(List moreChildren) { 33 | this.moreChildren = moreChildren; 34 | } 35 | 36 | 37 | } -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/api/SubredditApi.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.api; 2 | 3 | import ga.dryco.redditjerk.api.enums.FromPast; 4 | import ga.dryco.redditjerk.api.enums.Sorting; 5 | import ga.dryco.redditjerk.wrappers.*; 6 | import ga.dryco.redditjerk.datamodels.ModeratorsData; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * Subreddit related functions 12 | */ 13 | 14 | public interface SubredditApi { 15 | 16 | Subreddit getSubreddit(String subredditname); 17 | List getSubredditPage(String subreddit, Integer limit, Sorting sort, FromPast timeperiod); 18 | List getSubredditModerators(String subreddit); 19 | List getSubredditModeratorsRaw(String subreddit); 20 | List getSubredditComments(String subreddit, Integer limit); 21 | void subscribe(String subreddit); 22 | void unsubscribe(String subreddit); 23 | List getInfo_subreddit(List idList); 24 | RedditThread getRandomPostFromSubreddit(String subreddit); 25 | 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/api/UserApi.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.api; 2 | 3 | import ga.dryco.redditjerk.api.enums.Sorting; 4 | import ga.dryco.redditjerk.wrappers.Comment; 5 | import ga.dryco.redditjerk.wrappers.Link; 6 | import ga.dryco.redditjerk.wrappers.User; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * User related functions 12 | * 13 | */ 14 | 15 | public interface UserApi { 16 | User login(String username, String password, String clientId, String secret); 17 | User getUser(String username); 18 | 19 | List getUserComments(String username, Integer limit, Sorting sort); 20 | List getUserHidden(String username, Integer limit); 21 | List getUserDownvoted(String username, Integer limit); 22 | List getUserUpvoted(String username, Integer limit); 23 | List getUserGilded(String username, Integer limit); 24 | List getUserSubmissions(String username, Integer limit, Sorting sort); 25 | void giveGold(String username, Integer months); 26 | 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/rest/AuthInfo.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.rest; 2 | 3 | import java.io.Serializable; 4 | 5 | 6 | public class AuthInfo implements Serializable{ 7 | 8 | private String username; 9 | private String password; 10 | private String clientId; 11 | private String secret; 12 | private long timeAquired; 13 | 14 | public AuthInfo(String username, String password, String clientId, String secret){ 15 | this.username = username; 16 | this.password = password; 17 | this.clientId = clientId; 18 | this.secret = secret; 19 | } 20 | 21 | public long getTimeAquired() { 22 | return timeAquired; 23 | } 24 | 25 | public void setTimeAquired(long timeAquired) { 26 | this.timeAquired = timeAquired; 27 | } 28 | public String getUsername() { 29 | return username; 30 | } 31 | 32 | public String getPassword() { 33 | return password; 34 | } 35 | 36 | public String getClientId() { 37 | return clientId; 38 | } 39 | 40 | public String getSecret() { 41 | return secret; 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/deserializers/T3Deserializer.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels.deserializers; 2 | 3 | import com.google.gson.*; 4 | 5 | import ga.dryco.redditjerk.wrappers.Link; 6 | import ga.dryco.redditjerk.datamodels.T3; 7 | 8 | import java.lang.reflect.Type; 9 | 10 | /** 11 | * t3 deserializer: 12 | * if "edited" is boolean remove it 13 | */ 14 | public class T3Deserializer implements JsonDeserializer { 15 | public T3 deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context){ 16 | JsonObject jsonData = json.getAsJsonObject().get("data").getAsJsonObject(); 17 | JsonElement edited = jsonData.get("edited"); 18 | if (edited != null && edited.isJsonPrimitive()){ 19 | JsonPrimitive primitiv = edited.getAsJsonPrimitive(); 20 | if (primitiv.isBoolean()) { 21 | jsonData.remove("edited"); 22 | } 23 | } 24 | T3 t3 = new T3(); 25 | Link t3Data = context.deserialize(jsonData, Link.class); 26 | t3.setData(t3Data); 27 | 28 | return t3; 29 | 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/deserializers/T1Deserializer.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels.deserializers; 2 | 3 | import com.google.gson.*; 4 | import ga.dryco.redditjerk.wrappers.Comment; 5 | import ga.dryco.redditjerk.datamodels.T1; 6 | 7 | import java.lang.reflect.Type; 8 | 9 | /** 10 | * t1 deserializer: 11 | * if "replies" is a string, remove it 12 | */ 13 | public class T1Deserializer implements JsonDeserializer { 14 | public T1 deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context){ 15 | JsonObject jsonData = json.getAsJsonObject().get("data").getAsJsonObject(); 16 | JsonElement replies = jsonData.get("replies"); 17 | if (replies != null && replies.isJsonPrimitive()){ 18 | JsonPrimitive primitiv = replies.getAsJsonPrimitive(); 19 | if (primitiv.isString()) { 20 | jsonData.remove("replies"); 21 | } 22 | } 23 | T1 t1 = new T1(); 24 | Comment t1Data = context.deserialize(jsonData, Comment.class); 25 | t1.setData(t1Data); 26 | 27 | return t1; 28 | 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/ModeratorsData.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | import com.google.gson.annotations.Expose; 4 | 5 | import java.util.List; 6 | 7 | 8 | public class ModeratorsData { 9 | @Expose 10 | private Long date; 11 | 12 | @Expose 13 | private List mod_permissions; 14 | 15 | @Expose 16 | private String name; 17 | 18 | @Expose 19 | private String id; 20 | 21 | 22 | 23 | public Long getDate() { 24 | return date; 25 | } 26 | 27 | public void setDate(Long date) { 28 | this.date = date; 29 | } 30 | 31 | public List getMod_permissions() { 32 | return mod_permissions; 33 | } 34 | 35 | public void setMod_permissions(List mod_permissions) { 36 | this.mod_permissions = mod_permissions; 37 | } 38 | 39 | public String getName() { 40 | return name; 41 | } 42 | 43 | public void setName(String name) { 44 | this.name = name; 45 | } 46 | 47 | public String getId() { 48 | return id; 49 | } 50 | 51 | public void setId(String id) { 52 | this.id = id; 53 | } 54 | 55 | 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/api/ModerationApi.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.api; 2 | 3 | import ga.dryco.redditjerk.api.enums.Distinguish; 4 | import ga.dryco.redditjerk.api.enums.Moderation; 5 | import ga.dryco.redditjerk.wrappers.Comment; 6 | import ga.dryco.redditjerk.wrappers.Link; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * Moderation functions 12 | */ 13 | public interface ModerationApi { 14 | 15 | void acceptModInvite(String subreddit); 16 | void leaveModeration(String subreddit); 17 | void ignoreReports(String thingFullId); 18 | List getModerationReportsComments(String subreddit, Moderation modreport, Integer limit); 19 | List getModerationReportsSubmissions(String subreddit, Moderation modreport, Integer limit); 20 | void approve(String fullnameId); 21 | void remove(String fullnameId, Boolean spam); 22 | void distinguish(String fullnameId, Distinguish distinguish); 23 | void leaveContributor(String subreddit); 24 | void unignoreReports(String thingFullId); 25 | void markNsfw(String fullnameId); 26 | void unmarkNsfw(String fullnameId); 27 | void lock(String fullnameId); 28 | void unlock(String fullnameId); 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/api/PostApi.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.api; 2 | 3 | import ga.dryco.redditjerk.api.enums.Sorting; 4 | import ga.dryco.redditjerk.wrappers.Comment; 5 | import ga.dryco.redditjerk.wrappers.Link; 6 | import ga.dryco.redditjerk.wrappers.Post; 7 | import ga.dryco.redditjerk.wrappers.RedditThread; 8 | import ga.dryco.redditjerk.datamodels.MoreChildren; 9 | 10 | import java.net.MalformedURLException; 11 | import java.util.List; 12 | 13 | /** 14 | * Comment and Link related functions 15 | */ 16 | 17 | public interface PostApi { 18 | RedditThread getRedditThread(String url, Sorting sort) throws MalformedURLException; 19 | void vote(String fullnameId, String dir); 20 | Comment reply(String fullnameId, String text); 21 | void delete(String fullnameId); 22 | Post edit(String fullnameId, String text); 23 | void hide(String fullnameId); 24 | void unhide(String fullnameId); 25 | MoreChildren getMoreChildren(List idList, String linkId, Sorting sort); 26 | Link Submit(String subreddit, String title, String bodyOrUrl, String kind); 27 | List getInfo_link(List idList); 28 | List getInfo_comment(List idList); 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/MoreData.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | import com.google.gson.annotations.Expose; 4 | 5 | import java.util.List; 6 | 7 | 8 | public class MoreData { 9 | @Expose 10 | private List children; 11 | @Expose 12 | private String name; 13 | @Expose 14 | private String id; 15 | @Expose 16 | private String parent_id; 17 | @Expose 18 | private Integer count; 19 | 20 | 21 | public List getChildren() { 22 | return children; 23 | } 24 | 25 | public void setChildren(List children) { 26 | this.children = children; 27 | } 28 | 29 | public String getName() { 30 | return name; 31 | } 32 | 33 | public void setName(String name) { 34 | this.name = name; 35 | } 36 | 37 | public String getId() { 38 | return id; 39 | } 40 | 41 | public void setId(String id) { 42 | this.id = id; 43 | } 44 | 45 | public String getParent_id() { 46 | return parent_id; 47 | } 48 | 49 | public void setParent_id(String parent_id) { 50 | this.parent_id = parent_id; 51 | } 52 | 53 | public Integer getCount() { 54 | return count; 55 | } 56 | 57 | public void setCount(Integer count) { 58 | this.count = count; 59 | } 60 | 61 | 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/wrappers/Link.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.wrappers; 2 | 3 | import ga.dryco.redditjerk.api.enums.Distinguish; 4 | import ga.dryco.redditjerk.api.Reddit; 5 | import ga.dryco.redditjerk.implementation.RedditApi; 6 | import ga.dryco.redditjerk.datamodels.T3Data; 7 | 8 | public class Link extends T3Data implements Post{ 9 | 10 | private Reddit rApi = RedditApi.getRedditInstance(); 11 | 12 | public void downvote() { 13 | rApi.vote(super.getName(), "-1"); 14 | } 15 | 16 | public void upvote() { 17 | rApi.vote(super.getName(), "1"); 18 | } 19 | 20 | public Comment reply(String text) { 21 | return rApi.reply(super.getName(), text); 22 | } 23 | 24 | public void delete() { 25 | rApi.delete(super.getName()); 26 | } 27 | 28 | public Link edit(String text) { 29 | return (Link) rApi.edit(super.getName(), text); 30 | } 31 | 32 | public void hide(){ 33 | rApi.hide(super.getName()); 34 | } 35 | 36 | public void unhide(){ 37 | rApi.unhide(super.getName()); 38 | } 39 | 40 | public void approve(){ 41 | rApi.approve(super.getName()); 42 | } 43 | 44 | public void remove(Boolean spam){ 45 | rApi.remove(super.getName(), spam); 46 | } 47 | 48 | public void distinguish(Distinguish distinguish){ 49 | rApi.distinguish(super.getName(), distinguish); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/wrappers/Comment.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.wrappers; 2 | 3 | import ga.dryco.redditjerk.api.enums.Distinguish; 4 | import ga.dryco.redditjerk.api.Reddit; 5 | import ga.dryco.redditjerk.implementation.RedditApi; 6 | import ga.dryco.redditjerk.datamodels.T1Data; 7 | 8 | 9 | public class Comment extends T1Data implements Post { 10 | 11 | private Reddit rApi = RedditApi.getRedditInstance(); 12 | 13 | public Comment reply(String text) { 14 | return rApi.reply(super.getName(), text); 15 | } 16 | 17 | public void downvote() { 18 | rApi.vote(super.getName(), "-1"); 19 | } 20 | 21 | public void upvote() { 22 | rApi.vote(super.getName(), "1"); 23 | } 24 | 25 | public void delete() { 26 | rApi.delete(super.getName()); 27 | } 28 | 29 | public Comment edit(String text) { 30 | return (Comment) rApi.edit(super.getName(), text); 31 | } 32 | 33 | public void hide(){ 34 | rApi.hide(super.getName()); 35 | } 36 | 37 | public void unhide(){ 38 | rApi.unhide(super.getName()); 39 | } 40 | 41 | public void approve(){ 42 | rApi.approve(super.getName()); 43 | } 44 | 45 | public void remove(Boolean spam){ 46 | rApi.remove(super.getName(), spam); 47 | } 48 | 49 | public void distinguish(Distinguish distinguish){ 50 | rApi.distinguish(super.getName(), distinguish); 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/deserializers/ThreadDeserializer.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels.deserializers; 2 | 3 | import com.google.gson.*; 4 | 5 | import ga.dryco.redditjerk.wrappers.RedditThread; 6 | import ga.dryco.redditjerk.datamodels.T1Listing; 7 | import ga.dryco.redditjerk.datamodels.T3; 8 | 9 | import java.lang.reflect.Type; 10 | 11 | /** 12 | * 13 | * 14 | */ 15 | public class ThreadDeserializer implements JsonDeserializer { 16 | public RedditThread deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context){ 17 | RedditThread returnthread = new RedditThread(); 18 | JsonArray threadarray = json.getAsJsonArray(); 19 | if(threadarray.size() != 2){ 20 | throw new JsonParseException(json.toString()); 21 | } 22 | //doing the Post part of the thread 23 | JsonArray postobj = threadarray.get(0).getAsJsonObject().get("data").getAsJsonObject().getAsJsonArray("children"); 24 | returnthread.setSubmissionPost(context.deserialize(postobj.get(0), T3.class)); 25 | 26 | JsonObject comlisting = threadarray.get(1).getAsJsonObject(); 27 | JsonArray commarr = comlisting.get("data").getAsJsonObject().getAsJsonArray("children"); 28 | if(commarr.size() > 0){ 29 | returnthread.setComments(context.deserialize(comlisting, T1Listing.class)); 30 | } 31 | 32 | return returnthread; 33 | 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/deserializers/MoreChildrenDeserializer.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels.deserializers; 2 | 3 | import com.google.gson.*; 4 | import ga.dryco.redditjerk.datamodels.MoreChildren; 5 | import ga.dryco.redditjerk.datamodels.T1Listing; 6 | 7 | import java.lang.reflect.Type; 8 | 9 | /** 10 | * Since /api/morechildren returns a weird JSON we convert it here to T1Listing wrapped in MoreChildren object 11 | * 12 | * 13 | */ 14 | 15 | public class MoreChildrenDeserializer implements JsonDeserializer { 16 | 17 | public MoreChildren deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context){ 18 | MoreChildren returnObj = new MoreChildren(); 19 | 20 | 21 | if(json.getAsJsonObject().getAsJsonObject("json").has("data")){ 22 | JsonArray t1Objects = json.getAsJsonObject().getAsJsonObject("json").getAsJsonObject("data").getAsJsonArray("things"); 23 | //System.out.println(t1Objects.size()); 24 | 25 | JsonObject jObj = json.getAsJsonObject(); 26 | jObj.remove("json"); 27 | 28 | 29 | jObj.add("kind", new JsonPrimitive("Listing")); 30 | jObj.add("data", new JsonObject()); 31 | 32 | jObj.getAsJsonObject("data").add("children", t1Objects); 33 | T1Listing newListing = context.deserialize(jObj, T1Listing.class); 34 | 35 | returnObj.setMoreChildrenComments(newListing); 36 | } 37 | 38 | return returnObj; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/ListingData.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | import javax.annotation.Generated; 4 | import com.google.gson.annotations.Expose; 5 | 6 | import java.util.List; 7 | 8 | @Generated("org.jsonschema2pojo") 9 | public abstract class ListingData { 10 | 11 | @Expose 12 | private String modhash; 13 | /** 14 | * This class at first used generics to decide the Children type but the nested generics were getting too 15 | * confusing so now it is subclassed for every type of Children 16 | * 17 | */ 18 | 19 | @Expose 20 | private String after; 21 | @Expose 22 | private String before; 23 | 24 | public abstract List getChildren(); 25 | 26 | /** 27 | * 28 | * @return 29 | * The modhash 30 | */ 31 | public String getModhash() { 32 | return modhash; 33 | } 34 | 35 | /** 36 | * 37 | * @param modhash 38 | * The modhash 39 | */ 40 | public void setModhash(String modhash) { 41 | this.modhash = modhash; 42 | } 43 | 44 | /** 45 | * 46 | * @return 47 | * The after 48 | */ 49 | public String getAfter() { 50 | return after; 51 | } 52 | 53 | /** 54 | * 55 | * @param after 56 | * The after 57 | */ 58 | public void setAfter(String after) { 59 | this.after = after; 60 | } 61 | 62 | /** 63 | * 64 | * @return 65 | * The before 66 | */ 67 | public String getBefore() { 68 | return before; 69 | } 70 | 71 | /** 72 | * 73 | * @param before 74 | * The before 75 | */ 76 | public void setBefore(String before) { 77 | this.before = before; 78 | } 79 | 80 | } -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/deserializers/PostReturnDeserializer.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels.deserializers; 2 | 3 | import com.google.gson.*; 4 | import ga.dryco.redditjerk.datamodels.PostReturn; 5 | import ga.dryco.redditjerk.datamodels.T1; 6 | import ga.dryco.redditjerk.datamodels.T3; 7 | import ga.dryco.redditjerk.exceptions.RedditJerkException; 8 | 9 | import java.lang.reflect.Type; 10 | 11 | 12 | 13 | public class PostReturnDeserializer implements JsonDeserializer { 14 | public PostReturn deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context){ 15 | PostReturn returnObject = new PostReturn(); 16 | 17 | if(json.getAsJsonObject().get("json").getAsJsonObject().get("errors").getAsJsonArray().size() != 0){ 18 | //TODO:improve this 19 | 20 | throw new RedditJerkException("Rate Limit Error, try later"); 21 | } else { 22 | JsonArray thinglist = json.getAsJsonObject().get("json").getAsJsonObject().get("data").getAsJsonObject().getAsJsonArray("things"); 23 | JsonObject thingObj = thinglist.get(0).getAsJsonObject(); 24 | JsonPrimitive kindtext = thingObj.get("kind").getAsJsonPrimitive(); 25 | if(kindtext.getAsString().equals("t1")){ 26 | T1 comm = context.deserialize(thingObj, T1.class); 27 | returnObject.setComment(comm); 28 | returnObject.setKind("reply"); 29 | } 30 | else if(kindtext.getAsString().equals("t3")){ 31 | T3 subm = context.deserialize(thingObj, T3.class); 32 | returnObject.setLink(subm); 33 | returnObject.setKind("link"); 34 | } 35 | return returnObject; 36 | } 37 | 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/deserializers/T1ListingDeserializer.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels.deserializers; 2 | 3 | import com.google.gson.*; 4 | import ga.dryco.redditjerk.datamodels.More; 5 | import ga.dryco.redditjerk.datamodels.T1Listing; 6 | import ga.dryco.redditjerk.datamodels.T1ListingData; 7 | 8 | import java.lang.reflect.Type; 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | /** 13 | * Since the Listing of "replies" returned by reddit contains Things of both types t1 and "more" we 14 | * are splitting it here. 15 | */ 16 | public class T1ListingDeserializer implements JsonDeserializer { 17 | public T1Listing deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context){ 18 | 19 | T1Listing t1ListingTemp = new T1Listing(); 20 | t1ListingTemp.setKind("Listing"); 21 | T1ListingData t1Data = context.deserialize(json.getAsJsonObject().get("data"), T1ListingData.class); 22 | t1ListingTemp.setData(t1Data); 23 | 24 | List moreTemp = new ArrayList<>(); 25 | 26 | //getting the Listing's data children 27 | 28 | JsonArray childrenArray = json.getAsJsonObject().get("data").getAsJsonObject().getAsJsonArray("children"); 29 | 30 | for(JsonElement child:childrenArray){ 31 | JsonObject childObj = child.getAsJsonObject(); 32 | JsonPrimitive kindtext = childObj.get("kind").getAsJsonPrimitive(); 33 | if(kindtext.getAsString().equals("more")) { 34 | More moteObj = context.deserialize(child.getAsJsonObject(), More.class); 35 | moreTemp.add(moteObj); 36 | } 37 | 38 | } 39 | t1ListingTemp.setData(t1Data); 40 | t1ListingTemp.getData().setMoreChildren(moreTemp); 41 | 42 | return t1ListingTemp; 43 | 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/AuthData.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | import com.google.gson.annotations.Expose; 4 | import com.google.gson.annotations.SerializedName; 5 | 6 | 7 | public class AuthData { 8 | 9 | @SerializedName("access_token") 10 | @Expose 11 | private String accessToken; 12 | @SerializedName("expires_in") 13 | @Expose 14 | private Integer expiresIn; 15 | @Expose 16 | private String scope; 17 | @SerializedName("token_type") 18 | @Expose 19 | private String tokenType; 20 | 21 | /** 22 | * 23 | * @return 24 | * The accessToken 25 | */ 26 | public String getAccessToken() { 27 | return accessToken; 28 | } 29 | 30 | /** 31 | * 32 | * @param accessToken 33 | * The access_token 34 | */ 35 | public void setAccessToken(String accessToken) { 36 | this.accessToken = accessToken; 37 | } 38 | 39 | /** 40 | * 41 | * @return 42 | * The expiresIn 43 | */ 44 | public Integer getExpiresIn() { 45 | return expiresIn; 46 | } 47 | 48 | /** 49 | * 50 | * @param expiresIn 51 | * The expires_in 52 | */ 53 | public void setExpiresIn(Integer expiresIn) { 54 | this.expiresIn = expiresIn; 55 | } 56 | 57 | /** 58 | * 59 | * @return 60 | * The scope 61 | */ 62 | public String getScope() { 63 | return scope; 64 | } 65 | 66 | /** 67 | * 68 | * @param scope 69 | * The scope 70 | */ 71 | public void setScope(String scope) { 72 | this.scope = scope; 73 | } 74 | 75 | /** 76 | * 77 | * @return 78 | * The tokenType 79 | */ 80 | public String getTokenType() { 81 | return tokenType; 82 | } 83 | 84 | /** 85 | * 86 | * @param tokenType 87 | * The token_type 88 | */ 89 | public void setTokenType(String tokenType) { 90 | this.tokenType = tokenType; 91 | } 92 | 93 | } -------------------------------------------------------------------------------- /src/test/java/ga/dryco/redditjerk/TestBot.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk; 2 | 3 | import ga.dryco.redditjerk.api.Reddit; 4 | import ga.dryco.redditjerk.api.enums.FromPast; 5 | import ga.dryco.redditjerk.api.enums.Sorting; 6 | import ga.dryco.redditjerk.implementation.RedditApi; 7 | import ga.dryco.redditjerk.wrappers.Link; 8 | import ga.dryco.redditjerk.wrappers.User; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | 14 | public class TestBot { 15 | public static void main(String[] args){ 16 | 17 | 18 | 19 | 20 | List done = new ArrayList<>(); 21 | List keywords = new ArrayList<>(); 22 | int submsLastRun = 0; 23 | 24 | keywords.add("Linux"); 25 | keywords.add("Cisco"); 26 | keywords.add("Java"); 27 | keywords.add("Windows"); 28 | keywords.add("Fl Studio"); 29 | keywords.add("Ahsoka"); 30 | Reddit red = RedditApi.getRedditInstance("TestClient34"); 31 | User myUser = red.login("RedditJerkTest", "jerkjerkjerk", "WoXLiKdjulE09Q", "QoG2unmpgAum-IQ92NDhhNy-UKs"); 32 | //red.login("RedditJerkTest", "jerkjerkjerk", "WoXLiKdjulE09Q", "QoG2unmpgAum-IQ92NDhhNy-UKs"); 33 | 34 | while (true){ 35 | List all; 36 | Integer sbmCount = 0; 37 | 38 | all = red.getSubredditPage("all", submsLastRun + 50, Sorting.NEW, FromPast.DAY); 39 | 40 | assert all != null; 41 | for(Link sbm: all){ 42 | if(!done.contains(sbm.getName())){ 43 | sbmCount++; 44 | keywords.stream().filter(str -> sbm.getTitle().toLowerCase().contains(str.toLowerCase())).forEach(str -> System.out.println("Keyword Matched: " + str + ", " + sbm.getName())); 45 | done.add(sbm.getName()); 46 | } 47 | 48 | } 49 | System.out.println("Already done:" + done.size() + "\nThis run:" + sbmCount); 50 | submsLastRun = sbmCount; 51 | try { 52 | System.out.println("Sleeping"); 53 | Thread.sleep(60000); 54 | } catch (InterruptedException e) { 55 | e.printStackTrace(); 56 | } 57 | 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/wrappers/User.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.wrappers; 2 | 3 | import ga.dryco.redditjerk.api.Reddit; 4 | import ga.dryco.redditjerk.implementation.RedditApi; 5 | import ga.dryco.redditjerk.api.enums.Sorting; 6 | import ga.dryco.redditjerk.datamodels.T2Data; 7 | 8 | import java.util.List; 9 | import java.util.Objects; 10 | 11 | 12 | public class User extends T2Data { 13 | 14 | private Reddit rApi = RedditApi.getRedditInstance(); 15 | 16 | public List getSubmitted(Integer limit) { 17 | return rApi.getUserSubmissions(super.getName(), limit, Sorting.NEW); 18 | } 19 | 20 | public List getSubmitted(Integer limit, Sorting sort) { 21 | return rApi.getUserSubmissions(super.getName(), limit, sort); 22 | } 23 | 24 | public List getComments(Integer limit) { 25 | return rApi.getUserComments(super.getName(), limit, Sorting.NEW); 26 | } 27 | 28 | 29 | public List getComments(Integer limit, Sorting sort) { 30 | return rApi.getUserComments(super.getName(), limit, sort); 31 | } 32 | 33 | public List getHidden(Integer limit){ 34 | return rApi.getUserHidden(super.getName(), limit); 35 | } 36 | 37 | public List getUpvoted(Integer limit){ 38 | return rApi.getUserUpvoted(super.getName(), limit); 39 | } 40 | 41 | public List getDownvoted(Integer limit){ 42 | return rApi.getUserDownvoted(super.getName(), limit); 43 | } 44 | 45 | public List getGilded(Integer limit){ return rApi.getUserGilded(super.getName(), limit); 46 | } 47 | 48 | /** 49 | * Extra utility functions 50 | */ 51 | 52 | public Integer getKarmaBalance(String subreddit, Integer limit) { 53 | Integer karma = 0; 54 | for(Comment comm: this.getComments(limit)){ 55 | if(Objects.equals(comm.getSubreddit(), subreddit)){ 56 | karma = karma + comm.getScore(); 57 | } 58 | 59 | } 60 | 61 | for(Link subm:this.getSubmitted(limit)){ 62 | if(Objects.equals(subm.getSubreddit(), subreddit)){ 63 | karma = karma + subm.getScore(); 64 | } 65 | } 66 | 67 | return karma; 68 | } 69 | 70 | 71 | 72 | } 73 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | ga.dryco 5 | RedditJerk 6 | jar 7 | 1.55-SNAPSHOT 8 | RedditJerk 9 | https://github.com/euparkeria/RedditJerk/ 10 | 11 | 12 | 1.8 13 | 14 | 15 | 16 | 17 | 18 | org.apache.httpcomponents 19 | httpclient 20 | 4.5.2 21 | 22 | 23 | 24 | org.apache.httpcomponents 25 | httpcore 26 | 4.4.4 27 | 28 | 29 | 30 | commons-codec 31 | commons-codec 32 | 1.10 33 | 34 | 35 | 36 | commons-logging 37 | commons-logging 38 | 1.2 39 | 40 | 41 | 42 | com.google.code.gson 43 | gson 44 | 2.6.2 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | org.apache.maven.plugins 53 | maven-compiler-plugin 54 | 3.5.1 55 | 56 | 1.8 57 | 1.8 58 | 59 | 60 | 61 | 62 | maven-assembly-plugin 63 | 64 | 65 | package 66 | 67 | single 68 | 69 | 70 | 71 | 72 | 73 | jar-with-dependencies 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/api/enums/Endpoints.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.api.enums; 2 | 3 | 4 | /** 5 | * All the implmented Api Endpoints 6 | * 7 | */ 8 | public enum Endpoints { 9 | USER("user/%s/about/"), 10 | ME("api/v1/me"), 11 | OVERVIEW("user/%s/?limit=%d&sort=%s"), 12 | SUBREDDIT( "r/%s/about"), 13 | USER_COMMENTS("user/%s/comments/?limit=%d&sort=%s"), 14 | USER_SUBS("user/%s/submitted/?limit=%d&sort=%s"), 15 | USER_GILDED("user/%s/gilded/?limit=%d"), 16 | USER_UPVOTED("user/%s/upvoted/?limit=%d"), 17 | USER_DOWNVOTED("user/%s/downvoted/?limit=%d"), 18 | USER_HIDDEN("user/%s/hidden/?limit=%d"), 19 | USER_SAVED("user/%s/saved/?limit=%d"), 20 | SUBREDDIT_PAGE("r/%s/%s/?limit=%d&t=%s"), 21 | SUBREDDIT_COMMENTS("/r/%s/comments/?limit=%d"), 22 | VOTE("/api/vote"), 23 | SUBMIT("/api/submit"), 24 | DELETE( "/api/del"), 25 | HIDE("/api/hide"), 26 | UNHIDE("/api/unhide"), 27 | REPLY("/api/comment"), 28 | EDIT("/api/editusertext"), 29 | SUB_MODERATORS("/r/%s/about/moderators/"), 30 | INFO("/api/info/?id=%s"), 31 | SUBSCRIBE("/api/subscribe"), 32 | ACCEPT_MOD_INVITE("/r/%s/api/accept_moderator_invite"), 33 | LEAVE_MODERATOR("/api/leavemoderator"), 34 | LEAVE_CONTRIBUTOR("/api/leavecontributor"), 35 | IGNORE_REPORTS("/api/ignore_reports"), 36 | UNIGNORE_REPORTS("/api/unignore_reports"), 37 | MODERATION_COMMENTS("/r/%s/about/%s/?only=comments&limit=%d"), 38 | MODERATION_SUBMISSIONS("/r/%s/about/%s/?only=comments&limit=%d"), 39 | APPROVE("/api/approve"), 40 | REMOVE("/api/remove"), 41 | DISTINGUISH("/api/distinguish"), 42 | DELETE_FLAIR("/r/%s/api/deleteflair"), 43 | CLEAR_FLAIR_TEMPLATES("/r/%s/api/clearflairtemplates"), 44 | DELETE_FLAIR_TEMPLATE("/r/%s/api/deleteflairtemplate"), 45 | FLAIR("/r/%s/api/flair"), 46 | FLAIR_CONFIG("/r/subreddit/api/flairconfig"), 47 | MORE_CHILDREN("/api/morechildren?api_type=json&children=%s&link_id=%s&sort=%s"), 48 | REDDIT_THREAD("%s?sort=%s"), 49 | MARK_NSFW("/api/marknsfw"), 50 | UNMARK_NSFW("/api/unmarknsfw"), 51 | LOCK("/api/lock"), 52 | UNLOCK("/api/unlock"), 53 | GIVE_GOLD("/api/v1/gold/give/username") 54 | ; 55 | 56 | 57 | private String url; 58 | 59 | Endpoints(String url) { 60 | this.url = url; 61 | } 62 | 63 | @Override 64 | public String toString(){ 65 | return this.url; 66 | } 67 | 68 | } 69 | 70 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/wrappers/Subreddit.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.wrappers; 2 | 3 | import ga.dryco.redditjerk.api.enums.FromPast; 4 | import ga.dryco.redditjerk.api.Reddit; 5 | import ga.dryco.redditjerk.implementation.RedditApi; 6 | import ga.dryco.redditjerk.api.enums.Sorting; 7 | import ga.dryco.redditjerk.datamodels.T5Data; 8 | 9 | import java.util.List; 10 | 11 | 12 | public class Subreddit extends T5Data implements Thingy{ 13 | 14 | private Reddit rApi = RedditApi.getRedditInstance(); 15 | 16 | public List getHot(Integer limit) { 17 | return rApi.getSubredditPage(super.getDisplayName(), limit, Sorting.HOT, FromPast.DAY); 18 | } 19 | 20 | public List getHot(Integer limit, FromPast timespan) { 21 | return rApi.getSubredditPage(super.getDisplayName(), limit, Sorting.HOT, timespan); 22 | } 23 | 24 | public List getNew(Integer limit) { 25 | return rApi.getSubredditPage(super.getDisplayName(), limit, Sorting.NEW, FromPast.DAY); 26 | } 27 | 28 | public List getNew(Integer limit, FromPast timespan) { 29 | return rApi.getSubredditPage(super.getDisplayName(), limit, Sorting.NEW, timespan); 30 | } 31 | 32 | public List getTop(Integer limit) { 33 | return rApi.getSubredditPage(super.getDisplayName(), limit, Sorting.TOP, FromPast.DAY); 34 | 35 | } 36 | 37 | public List getTop(Integer limit, FromPast timespan) { 38 | return rApi.getSubredditPage(super.getDisplayName(), limit, Sorting.TOP, timespan); 39 | 40 | } 41 | 42 | public List getControversial(Integer limit){ 43 | return rApi.getSubredditPage(super.getDisplayName(), limit, Sorting.CONTROVERSIAL, FromPast.DAY); 44 | } 45 | 46 | public List getControversial(Integer limit, FromPast timespan){ 47 | return rApi.getSubredditPage(super.getDisplayName(), limit, Sorting.CONTROVERSIAL, timespan); 48 | } 49 | 50 | public List getRising(Integer limit){ 51 | return rApi.getSubredditPage(super.getDisplayName(), limit, Sorting.RISING, FromPast.DAY); 52 | } 53 | 54 | public RedditThread getRandom(){ 55 | return rApi.getRandomPostFromSubreddit(super.getDisplayName()); 56 | } 57 | 58 | public List getComments(Integer limit){ 59 | return rApi.getSubredditComments(super.getDisplayName(), limit); 60 | } 61 | 62 | public void subscribe(){ 63 | rApi.subscribe(super.getDisplayName()); 64 | } 65 | 66 | public void unsubscribe(){ 67 | rApi.unsubscribe(super.getDisplayName()); 68 | } 69 | 70 | 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/wrappers/RedditThread.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.wrappers; 2 | 3 | import ga.dryco.redditjerk.api.Reddit; 4 | import ga.dryco.redditjerk.implementation.RedditApi; 5 | import ga.dryco.redditjerk.api.enums.Sorting; 6 | import ga.dryco.redditjerk.datamodels.More; 7 | import ga.dryco.redditjerk.datamodels.T1; 8 | import ga.dryco.redditjerk.datamodels.T1Listing; 9 | import ga.dryco.redditjerk.datamodels.RedditThreadData; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | 15 | public class RedditThread extends RedditThreadData { 16 | 17 | private Reddit rApi = RedditApi.getRedditInstance(); 18 | 19 | private List flatComments; 20 | private boolean alreadyFlattened = false; 21 | private boolean moreCommentsAlreadyFetched = false; 22 | private boolean fetchMoreComments = false; 23 | 24 | public boolean isFetchMoreComments() { 25 | return fetchMoreComments; 26 | } 27 | 28 | public void fetchMoreComments(boolean fetchMoreComments) { 29 | this.fetchMoreComments = fetchMoreComments; 30 | } 31 | 32 | public List getFlatComments() { 33 | if(!this.alreadyFlattened | this.fetchMoreComments & !this.moreCommentsAlreadyFetched){ 34 | this.flatComments = new ArrayList<>(); 35 | this.flattenComments(super.getComments()); 36 | this.alreadyFlattened = true; 37 | if(this.fetchMoreComments) this.moreCommentsAlreadyFetched = true; 38 | } 39 | return flatComments; 40 | } 41 | 42 | 43 | /** 44 | * Flatten the nested reply tree with recursion 45 | * also fetch the MoreComments 46 | * @param listing T1Listing 47 | */ 48 | private void flattenComments(T1Listing listing){ 49 | if(listing != null) { 50 | if(this.fetchMoreComments) { 51 | //this.moreObjects.addAll(listing.getData().getMoreChildrenComments()); 52 | for (More mor : listing.getData().getMoreChildren()) { 53 | Integer MAX_ITEMS_PER_QUERY = 20; 54 | List> listOfIdLists = new ArrayList<>(); 55 | //dividing the list into lists of 20 items each 56 | for (int i = 0; i <= mor.getData().getChildren().size(); i += MAX_ITEMS_PER_QUERY) { 57 | listOfIdLists.add(mor.getData().getChildren().subList(i, Math.min(i + MAX_ITEMS_PER_QUERY, mor.getData().getChildren().size()))); 58 | } 59 | for (List idLst : listOfIdLists) { 60 | this.flattenComments(rApi.getMoreChildren(idLst, super.getSubmissionPost().getData().getName(), Sorting.NEW).getMoreChildrenComments()); 61 | } 62 | } 63 | } 64 | 65 | for (T1 comm : listing.getData().getChildren()) { 66 | flatComments.add(comm.getData()); 67 | if (comm.getData().getReplies() != null) { 68 | this.flattenComments(comm.getData().getReplies()); 69 | } 70 | } 71 | } 72 | } 73 | 74 | } 75 | 76 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/T1Data.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | 4 | 5 | import com.google.gson.annotations.Expose; 6 | import com.google.gson.annotations.SerializedName; 7 | 8 | 9 | /** 10 | * data of type t1 represents a Comment type object, 11 | * all comments are t1 objects 12 | * User OverviewData page Listing can contain both t3 and t1 objects * 13 | * 14 | * */ 15 | 16 | public class T1Data extends PostData { 17 | 18 | 19 | @SerializedName("link_title") 20 | @Expose 21 | private String linkTitle; 22 | 23 | @SerializedName("link_id") 24 | @Expose 25 | private String linkId; 26 | 27 | @SerializedName("link_author") 28 | @Expose 29 | private String linkAuthor; 30 | 31 | // replies can contain a mixed listing of Things of both "t1" and "more" 32 | @Expose 33 | private T1Listing replies; 34 | 35 | @SerializedName("parent_id") 36 | @Expose 37 | private String parentId; 38 | 39 | @Expose 40 | private Integer controversiality; 41 | @Expose 42 | private String body; 43 | 44 | @SerializedName("body_html") 45 | @Expose 46 | private String bodyHtml; 47 | 48 | @SerializedName("score_hidden") 49 | @Expose 50 | private Boolean scoreHidden; 51 | 52 | @SerializedName("link_url") 53 | @Expose 54 | private String linkUrl; 55 | 56 | 57 | public String getLinkTitle() { 58 | return linkTitle; 59 | } 60 | 61 | public void setLinkTitle(String linkTitle) { 62 | this.linkTitle = linkTitle; 63 | } 64 | 65 | public String getLinkId() { 66 | return linkId; 67 | } 68 | 69 | public void setLinkId(String linkId) { 70 | this.linkId = linkId; 71 | } 72 | 73 | public String getLinkAuthor() { 74 | return linkAuthor; 75 | } 76 | 77 | public void setLinkAuthor(String linkAuthor) { 78 | this.linkAuthor = linkAuthor; 79 | } 80 | 81 | public T1Listing getReplies() { 82 | return replies; 83 | } 84 | 85 | public void setReplies(T1Listing replies) { 86 | this.replies = replies; 87 | } 88 | 89 | public String getParentId() { 90 | return parentId; 91 | } 92 | 93 | public void setParentId(String parentId) { 94 | this.parentId = parentId; 95 | } 96 | 97 | public Integer getControversiality() { 98 | return controversiality; 99 | } 100 | 101 | public void setControversiality(Integer controversiality) { 102 | this.controversiality = controversiality; 103 | } 104 | 105 | public String getBody() { 106 | return body; 107 | } 108 | 109 | public void setBody(String body) { 110 | this.body = body; 111 | } 112 | 113 | public String getBodyHtml() { 114 | return bodyHtml; 115 | } 116 | 117 | public void setBodyHtml(String bodyHtml) { 118 | this.bodyHtml = bodyHtml; 119 | } 120 | 121 | public Boolean getScoreHidden() { 122 | return scoreHidden; 123 | } 124 | 125 | public void setScoreHidden(Boolean scoreHidden) { 126 | this.scoreHidden = scoreHidden; 127 | } 128 | 129 | public String getLinkUrl() { 130 | return linkUrl; 131 | } 132 | 133 | public void setLinkUrl(String linkUrl) { 134 | this.linkUrl = linkUrl; 135 | } 136 | 137 | 138 | } -------------------------------------------------------------------------------- /src/test/java/ga/dryco/redditjerk/ClientTest.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk; 2 | 3 | import ga.dryco.redditjerk.api.enums.FromPast; 4 | import ga.dryco.redditjerk.api.enums.Sorting; 5 | import ga.dryco.redditjerk.implementation.RedditApi; 6 | import ga.dryco.redditjerk.wrappers.*; 7 | 8 | import java.net.MalformedURLException; 9 | import java.util.List; 10 | 11 | 12 | public class ClientTest { 13 | public static void main(String[] args) throws MalformedURLException { 14 | RedditApi rApi = RedditApi.getRedditInstance("Test clv1"); 15 | 16 | 17 | //User myUser = rApi.login("RedditJerkTest", "jerkjerkjerk", "WoXLiKdjulE09Q", "QoG2unmpgAum-IQ92NDhhNy-UKs"); 18 | 19 | //rApi.subscribe("flairtestsubreddit"); 20 | 21 | // rApi.acceptModInvite("flairtestsubreddit"); 22 | 23 | // List rlist = rApi.getModerationReportsSubmissions("flairtestsubreddit", Moderation.UNMODERATED, 100); 24 | // for(Link lnk:rlist){ 25 | // System.out.println(lnk.getTitle()); 26 | // rApi.distinguish(lnk.getName(), Distinguish.SPECIAL); 27 | // } 28 | 29 | //rApi.clearFlairTemplates("flairtestsubreddit", "USER_FLAIR"); 30 | //rApi.leaveModeration("flairtestsubreddit"); 31 | // rApi.linkFlair("flairtestsubreddit", "t3_4jlhec", "GREATEST2", ""); 32 | // rApi.userFlair("flairtestsubreddit", "seldonn", "CRAP!!2", ""); 33 | 34 | 35 | Subreddit subr = rApi.getSubreddit("Socialism"); 36 | System.out.println(subr.getRandom().getSubmissionPost().getData().getTitle()); 37 | 38 | 39 | /* 40 | RedditThread rthread1 = rApi.getRedditThread("https://www.reddit.com/r/science/comments/4kvf0i/nasa_ama_we_are_expanding_the_first_humanrated/", Sorting.NEW); 41 | rthread1.fetchMoreComments(true); 42 | System.out.println(rthread1.getFlatComments().size()); 43 | for(Comment com:rthread1.getFlatComments()){ 44 | System.out.println(com.getBody()); 45 | } 46 | 47 | System.out.println(rthread1.getFlatComments().size()); 48 | 49 | **/ 50 | 51 | 52 | 53 | /* 54 | List idList = new ArrayList<>(); 55 | idList.add("d3bw0lf"); 56 | idList.add("d3bw0le"); 57 | 58 | MoreChildren mm = rApi.getMoreChildren(idList,"t3_4k2p3f"); 59 | T1Listing tt = mm.getMoreChildrenComments(); 60 | System.out.println(tt.getData().getChildren().size()); 61 | for(T1 com: tt.getData().getChildren()){ 62 | System.out.println(com.getData().getBody()); 63 | 64 | } 65 | */ 66 | 67 | 68 | /* 69 | List uCom = rApi.getUserComments("iamwiththedconsnow", 10000, Sorting.NEW); 70 | for(Comment c:uCom){ 71 | System.out.println(c.getReplies()); 72 | } 73 | System.out.println(uCom.size()); 74 | /* 75 | //System.out.println(rApi.authData.getAccessTokenJson()); 76 | //User myuser = rApi.me(); 77 | //System.out.println(myuser.getName()); 78 | /* 79 | RedditThread tp = null; 80 | 81 | try { 82 | tp = rApi.getRedditThread("https://www.reddit.com/r/Android/comments/46q9l1/exclusive_android_n_may_not_have_an_app_drawer/"); 83 | } catch (MalformedURLException e) { 84 | e.printStackTrace(); 85 | } 86 | 87 | 88 | assert tp != null; 89 | Comment comm = tp.getFlatComments().get(1); 90 | 91 | Subreddit sub22 = rApi.getSubreddit("Marxism"); 92 | sub22.getHot(20); 93 | 94 | 95 | 96 | 97 | 98 | System.out.println("REPLYING");*/ 99 | //Comment replcomm = comm.reply("1YapaYapa22"); 100 | //System.out.println(replcomm.getBody()); 101 | //System.out.println(replcomm.getName()); 102 | 103 | //Comment edittedComment = replcomm.edit("WORKS FINALLY ???"); 104 | //System.out.println(edittedComment.getBody()); 105 | 106 | 107 | 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RedditJerk 2 | 3 | RedditJerk is a simple and easy to use Reddit API wrapper for java. 4 | 5 | ######Still in development! 6 | 7 | ### Example Usage: 8 | 9 | 10 | ```Java 11 | 12 | //Getting the api instance with useragent as parameter: 13 | Reddit red = RedditApi.getRedditInstance("Reddit client Test v1313"); 14 | 15 | //OAuth login, returns User object of the logged in account 16 | User myUser = red.login("", "", "", ""); 17 | 18 | //getting a redditor object 19 | User jerkUser = red.getUser("reditor123"); 20 | 21 | //Give user reditor123 six months worth of Reddit Gold 22 | red.giveGold("reditor123", 6); 23 | 24 | //getting user comments, gets 200 newest comments 25 | List clist = jerkUser.getComments(200, Sorting.NEW); 26 | 27 | //getting user's top 100 submissions 28 | List slist = jerkUser.getSubmitted(100, Sorting.TOP); 29 | 30 | //Getting user's Karma Balance in a moronic subreddit for his last 200 comments 31 | Integer karmaBalance = jerkUser.getKarmaBalance("MensRights", 200); 32 | 33 | //Getting a Subreddit object of a subreddit 34 | Subreddit amSubr = red.getSubreddit("ShitAmericansSay"); 35 | 36 | //get /r/ShitAmericansSay 50 controversial submissions 37 | amSubr.getControversial(50); 38 | 39 | //get /r/ShitAmericansSay top 10 submissions, default timespan is DAY 40 | amSubr.getTop(10); 41 | 42 | //we can also specify the timespan 43 | amSubr.getTop(100, FromPast.ALL_TIME); 44 | amSubr.getTop(100, FromPast.WEEK); 45 | 46 | //Subscribe to the subreddit 47 | amSubr.subscribe(); 48 | //Unsubscribe 49 | amSubr.unsubscribe(); 50 | 51 | //Subscribe and unsibscribe from subreddits without gettinga Subreddit object 52 | red.subscribe("Socialism"); 53 | red.unsubscribe("Funny"); 54 | 55 | //and getting it's front page 56 | List amlinkList = amSubr.getHot(25); 57 | 58 | //Getting a reddit Thread object 59 | RedditThread post = red.getRedditThread( 60 | "https://www.reddit.com/r/Economics/comments/46lkfz/can_sanders_do_it_is_it_plausible_that_there/d06k38f", Sorting.NEW); 61 | 62 | //We can flatten comments like this, this will return all the comments in the 63 | // thread as a flat list, not inclding the MoreComments hidden comments. 64 | List flatComments = post.getFlatComments(); 65 | 66 | //If you want to get ALL the comments you should set fetchMoreComments property of the thread object to true 67 | //before you get the flat comments, this will make a lot of api calls and take a long time. 68 | post.fetchMoreComments(true); 69 | List ALLflatComments = post.getFlatComments(); 70 | 71 | Link subm = post.getSubmissionPost().getData(); 72 | Comment myComment2 = subm.reply("South Park is Awesome!! :P"); 73 | 74 | //Editing our comment 75 | myComment2.edit("South Park is SUPER Awesome!! :PPP"); 76 | 77 | //upvoting the submission 78 | subm.upvote(); 79 | 80 | //hiding and unhiding the submission 81 | subm.hide(); 82 | subm.unhide(); 83 | 84 | //Reaplying to first comment in the thread, myComment is the object of the comment you just posted. 85 | Comment firstComment = post.getFlatComments().get(0); 86 | Comment myComment1 = firstComment.reply("Hello!"); 87 | 88 | //we can immidately delete our new comment 89 | myComment1.delete(); 90 | 91 | //Submitting a new self post in subreddit TheRedPill that is bound to be upvoted and gilded 92 | red.Submit("TheRedPill", "DAE thinks women's job should be to please and serve men !?", "Anyone ? ", "self"); 93 | 94 | //get top 5 submittions of the week in /r/learnprogramming 95 | List learnPrgrTop = red.getSubredditPage("learnprogramming", 5, Sorting.TOP, FromPast.WEEK); 96 | 97 | //getting /r/learnprogramming's moderators 98 | List learnPrgMods = red.getSubredditModerators("learnprogramming"); 99 | 100 | //printing their usernames 101 | for(User modusr: learnPrgMods){ 102 | System.out.println(modusr.getName()); 103 | } 104 | 105 | /** 106 | * 107 | * MODERATION API 108 | * 109 | * 110 | */ 111 | 112 | //Accept an invitation to be moderator in /r/Movies 113 | red.acceptModInvite("Movies"); 114 | 115 | //Leaving as moderator in /r/Videos 116 | red.leaveModeration("Videos"); 117 | 118 | red.approve("t3_4jeqzj"); 119 | 120 | //remove comment or submission, second parameter: spam= true or false. 121 | red.remove("t3_4jeqzj", true); 122 | 123 | //Ignore reports from a thing, submission or comment fullId. 124 | red.ignoreReports("t3_4jeqzj"); 125 | 126 | //unignore 127 | red.unignoreReports("t3_4jeqzj"); 128 | 129 | //Distinguish 130 | red.distinguish("t3_4jeqzj", Distinguish.YES); 131 | red.distinguish("t3_4jeqzj", Distinguish.ADMIN); 132 | red.distinguish("t3_4jeqzj", Distinguish.SPECIAL); 133 | red.distinguish("t3_4jeqzj", Distinguish.NO); 134 | 135 | //Get 100 reported comments in a subreddit you are a moderator of 136 | red.getModerationReportsComments("Movies", Moderation.REPORTED, 100); 137 | 138 | //Reported 100 Submissions 139 | red.getModerationReportsSubmissions("Movies", Moderation.REPORTED, 100); 140 | 141 | //Get 100 Spam comments 142 | red.getModerationReportsComments("Movies", Moderation.SPAM, 100); 143 | 144 | //Get 20 queued moderation Submissions 145 | red.getModerationReportsSubmissions("Movies", Moderation.QUEUE, 20); 146 | 147 | //Get 50 Unmoderated Submissions 148 | red.getModerationReportsSubmissions("Movies", Moderation.UNMODERATED, 50); 149 | 150 | //Get Edited comments 151 | red.getModerationReportsComments("Movies", Moderation.EDITED, 20); 152 | 153 | 154 | /** 155 | * Flair API 156 | * 157 | */ 158 | //Clear the Flair templates, second argument should be either ""USER_FLAIR" for user flairs 159 | // or "LINK_FLAIR" for the link flairs 160 | red.clearFlairTemplates("flairtestsubreddit", "USER_FLAIR"); 161 | 162 | //Set flair to a link, last argument is css_class, it can be left empty if none 163 | red.linkFlair("Movies", "t3_4jlhec", "GREATEST", ""); 164 | 165 | //Set flair to a User, last argument is css_class, it can be left empty if none 166 | red.userFlair("Movies", "kakunas", "CRAP!!", ""); 167 | 168 | 169 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/rest/OAuthClient.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.rest; 2 | 3 | import com.google.gson.Gson; 4 | import ga.dryco.redditjerk.datamodels.AuthData; 5 | import ga.dryco.redditjerk.exceptions.OAuthClientException; 6 | import org.apache.http.HttpResponse; 7 | import org.apache.http.NameValuePair; 8 | import org.apache.http.auth.AuthScope; 9 | 10 | import org.apache.http.auth.UsernamePasswordCredentials; 11 | import org.apache.http.client.CredentialsProvider; 12 | import org.apache.http.client.HttpClient; 13 | import org.apache.http.client.entity.UrlEncodedFormEntity; 14 | import org.apache.http.client.methods.HttpGet; 15 | import org.apache.http.client.methods.HttpPost; 16 | import org.apache.http.impl.client.BasicCredentialsProvider; 17 | import org.apache.http.impl.client.HttpClientBuilder; 18 | import org.apache.http.message.BasicNameValuePair; 19 | 20 | 21 | import java.io.BufferedReader; 22 | import java.io.IOException; 23 | import java.io.InputStreamReader; 24 | import java.io.UnsupportedEncodingException; 25 | import java.time.Instant; 26 | import java.util.ArrayList; 27 | import java.util.List; 28 | 29 | public final class OAuthClient { 30 | private String userAgent; 31 | private HttpClient postClient; 32 | private AuthInfo authInfo; 33 | 34 | 35 | 36 | private AuthData authData; 37 | 38 | 39 | public AuthInfo getAuthInfo() { 40 | return authInfo; 41 | } 42 | 43 | public void setAuthData(AuthData authData) { 44 | this.authData = authData; 45 | } 46 | 47 | public OAuthClient(String useragent){ 48 | this.userAgent = useragent; 49 | } 50 | 51 | private void renewAccessToken() { 52 | //if current time is bigger or equal to token's time of aquiering + expire value - 3 minutes 53 | if(authData != null){ 54 | if(Instant.now().getEpochSecond() >= (authInfo.getTimeAquired() + authData.getExpiresIn() - 180)){ 55 | 56 | // requesting new token with token header set will result in 401 error 57 | this.authData = null; 58 | this.OAuthAuthenitcation(); 59 | } 60 | } 61 | 62 | } 63 | 64 | public AuthInfo Authenticate(String username, String password, String clientId, String secret){ 65 | if(this.authInfo == null){ 66 | this.authInfo = new AuthInfo(username, password, clientId, secret); 67 | this.OAuthAuthenitcation(); 68 | } else this.renewAccessToken(); 69 | 70 | return this.authInfo; 71 | 72 | } 73 | 74 | private void OAuthAuthenitcation() { 75 | if(this.authInfo == null){ 76 | throw new OAuthClientException("No Authentication info present"); 77 | } 78 | 79 | this.authData = getAccessTokenJson(); 80 | this.authInfo.setTimeAquired(Instant.now().getEpochSecond()); 81 | } 82 | 83 | 84 | 85 | 86 | 87 | private AuthData getAccessTokenJson() { 88 | CredentialsProvider provider = new BasicCredentialsProvider(); 89 | UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(authInfo.getClientId(), authInfo.getSecret()); 90 | provider.setCredentials(AuthScope.ANY, credentials); 91 | this.postClient = HttpClientBuilder.create().setDefaultCredentialsProvider(provider).setUserAgent(this.userAgent).build(); 92 | List urlParameters = new ArrayList<>(); 93 | urlParameters.add(new BasicNameValuePair("grant_type", "password")); 94 | urlParameters.add(new BasicNameValuePair("username", authInfo.getUsername())); 95 | urlParameters.add(new BasicNameValuePair("password", authInfo.getPassword())); 96 | 97 | Gson gson = new Gson(); 98 | 99 | HttpPost post = new HttpPost("https://www.reddit.com/api/v1/access_token"); 100 | 101 | try { 102 | post.setEntity(new UrlEncodedFormEntity(urlParameters)); 103 | } catch (UnsupportedEncodingException e) { 104 | e.printStackTrace(); 105 | } 106 | 107 | HttpResponse response; 108 | try { 109 | response = this.postClient.execute(post); 110 | } catch (IOException e) { 111 | throw new OAuthClientException("Oath getAccessToken Error" , e); 112 | } 113 | 114 | return gson.fromJson(this.responseReader(response), AuthData.class); 115 | 116 | } 117 | 118 | 119 | public String get(String url) throws IllegalArgumentException { 120 | renewAccessToken(); 121 | HttpClient getClient = HttpClientBuilder.create().setUserAgent(this.userAgent).build(); 122 | HttpGet request = new HttpGet(url); 123 | 124 | if(this.authData != null){ 125 | request.addHeader("Authorization","bearer " + this.authData.getAccessToken()); 126 | } 127 | HttpResponse response; 128 | try { 129 | response = getClient.execute(request); 130 | } catch (IOException e) { 131 | throw new OAuthClientException("Oauth Get error", e); 132 | } 133 | 134 | return this.responseReader(response); 135 | 136 | } 137 | 138 | 139 | public String post(String url, List urlParameters) { 140 | renewAccessToken(); 141 | 142 | HttpPost post = new HttpPost(url); 143 | 144 | if(this.authData != null){ 145 | post.addHeader("Authorization","bearer " + this.authData.getAccessToken()); 146 | } 147 | 148 | try { 149 | post.setEntity(new UrlEncodedFormEntity(urlParameters)); 150 | } catch (UnsupportedEncodingException e) { 151 | e.printStackTrace(); 152 | } 153 | 154 | HttpResponse response; 155 | try { 156 | response = this.postClient.execute(post); 157 | } catch (IOException e) { 158 | throw new OAuthClientException("Oath Post IO Error" , e); 159 | } 160 | 161 | 162 | return this.responseReader(response); 163 | 164 | } 165 | 166 | private String responseReader(HttpResponse response) { 167 | String line; 168 | 169 | StringBuilder sb = new StringBuilder(); 170 | 171 | try { 172 | BufferedReader rd = new BufferedReader (new InputStreamReader(response.getEntity().getContent())); 173 | while ((line = rd.readLine()) != null) { 174 | sb.append(line); 175 | } 176 | } catch (IOException e) { 177 | e.printStackTrace(); 178 | } 179 | 180 | //System.out.println(sb.toString()); 181 | return sb.toString(); 182 | } 183 | 184 | 185 | } 186 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/T3Data.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | 4 | import com.google.gson.annotations.Expose; 5 | import com.google.gson.annotations.SerializedName; 6 | 7 | /** 8 | * data of type t3 represents a Link type object, 9 | * all front page or subreddit Listings contain only t3 objects. 10 | * User OverviewData page Listing can contain both t3 and t1 objects * 11 | * 12 | * */ 13 | 14 | 15 | public class T3Data extends PostData { 16 | 17 | @Expose 18 | private String domain; 19 | 20 | @SerializedName("selftext_html") 21 | @Expose 22 | private String selftextHtml; 23 | 24 | @Expose 25 | private String selftext; 26 | 27 | @SerializedName("suggested_sort") 28 | @Expose 29 | private String suggestedSort; 30 | 31 | @SerializedName("secure_media") 32 | @Expose 33 | private Object secureMedia; 34 | 35 | @SerializedName("link_flair_text") 36 | @Expose 37 | private String linkFlairText; 38 | 39 | @SerializedName("from_kind") 40 | @Expose 41 | private String fromKind; 42 | 43 | @Expose 44 | private Boolean clicked; 45 | 46 | @Expose 47 | private Object media; 48 | 49 | @SerializedName("over_18") 50 | @Expose 51 | private Boolean over18; 52 | 53 | @Expose 54 | private Boolean hidden; 55 | 56 | @SerializedName("num_comments") 57 | @Expose 58 | private Integer numComments; 59 | 60 | @Expose 61 | private String thumbnail; 62 | 63 | @SerializedName("hide_score") 64 | @Expose 65 | private Boolean hideScore; 66 | 67 | @Expose 68 | private String edited; 69 | 70 | @SerializedName("link_flair_css_class") 71 | @Expose 72 | private String linkFlairCssClass; 73 | 74 | @Expose 75 | private Boolean stickied; 76 | 77 | @Expose 78 | private String from; 79 | 80 | @SerializedName("is_self") 81 | @Expose 82 | private Boolean isSelf; 83 | 84 | @SerializedName("from_id") 85 | @Expose 86 | private String fromId; 87 | 88 | @Expose 89 | private String permalink; 90 | 91 | @Expose 92 | private Boolean locked; 93 | 94 | @Expose 95 | private String url; 96 | 97 | @Expose 98 | private String title; 99 | 100 | @Expose 101 | private Boolean visited; 102 | 103 | public String getDomain() { 104 | return domain; 105 | } 106 | 107 | public void setDomain(String domain) { 108 | this.domain = domain; 109 | } 110 | 111 | public String getSelftextHtml() { 112 | return selftextHtml; 113 | } 114 | 115 | public void setSelftextHtml(String selftextHtml) { 116 | this.selftextHtml = selftextHtml; 117 | } 118 | 119 | public String getSelftext() { 120 | return selftext; 121 | } 122 | 123 | public void setSelftext(String selftext) { 124 | this.selftext = selftext; 125 | } 126 | 127 | public String getSuggestedSort() { 128 | return suggestedSort; 129 | } 130 | 131 | public void setSuggestedSort(String suggestedSort) { 132 | this.suggestedSort = suggestedSort; 133 | } 134 | 135 | public Object getSecureMedia() { 136 | return secureMedia; 137 | } 138 | 139 | public void setSecureMedia(Object secureMedia) { 140 | this.secureMedia = secureMedia; 141 | } 142 | 143 | public String getLinkFlairText() { 144 | return linkFlairText; 145 | } 146 | 147 | public void setLinkFlairText(String linkFlairText) { 148 | this.linkFlairText = linkFlairText; 149 | } 150 | 151 | public String getFromKind() { 152 | return fromKind; 153 | } 154 | 155 | public void setFromKind(String fromKind) { 156 | this.fromKind = fromKind; 157 | } 158 | 159 | public Boolean getClicked() { 160 | return clicked; 161 | } 162 | 163 | public void setClicked(Boolean clicked) { 164 | this.clicked = clicked; 165 | } 166 | 167 | public Object getMedia() { 168 | return media; 169 | } 170 | 171 | public void setMedia(Object media) { 172 | this.media = media; 173 | } 174 | 175 | public Boolean getOver18() { 176 | return over18; 177 | } 178 | 179 | public void setOver18(Boolean over18) { 180 | this.over18 = over18; 181 | } 182 | 183 | public Boolean getHidden() { 184 | return hidden; 185 | } 186 | 187 | public void setHidden(Boolean hidden) { 188 | this.hidden = hidden; 189 | } 190 | 191 | public Integer getNumComments() { 192 | return numComments; 193 | } 194 | 195 | public void setNumComments(Integer numComments) { 196 | this.numComments = numComments; 197 | } 198 | 199 | public String getThumbnail() { 200 | return thumbnail; 201 | } 202 | 203 | public void setThumbnail(String thumbnail) { 204 | this.thumbnail = thumbnail; 205 | } 206 | 207 | public Boolean getHideScore() { 208 | return hideScore; 209 | } 210 | 211 | public void setHideScore(Boolean hideScore) { 212 | this.hideScore = hideScore; 213 | } 214 | 215 | public String getEdited() { 216 | return edited; 217 | } 218 | 219 | public void setEdited(String edited) { 220 | this.edited = edited; 221 | } 222 | 223 | public String getLinkFlairCssClass() { 224 | return linkFlairCssClass; 225 | } 226 | 227 | public void setLinkFlairCssClass(String linkFlairCssClass) { 228 | this.linkFlairCssClass = linkFlairCssClass; 229 | } 230 | 231 | public Boolean getStickied() { 232 | return stickied; 233 | } 234 | 235 | public void setStickied(Boolean stickied) { 236 | this.stickied = stickied; 237 | } 238 | 239 | public String getFrom() { 240 | return from; 241 | } 242 | 243 | public void setFrom(String from) { 244 | this.from = from; 245 | } 246 | 247 | public Boolean getSelf() { 248 | return isSelf; 249 | } 250 | 251 | public void setSelf(Boolean self) { 252 | isSelf = self; 253 | } 254 | 255 | public String getFromId() { 256 | return fromId; 257 | } 258 | 259 | public void setFromId(String fromId) { 260 | this.fromId = fromId; 261 | } 262 | 263 | public String getPermalink() { 264 | return permalink; 265 | } 266 | 267 | public void setPermalink(String permalink) { 268 | this.permalink = permalink; 269 | } 270 | 271 | public Boolean getLocked() { 272 | return locked; 273 | } 274 | 275 | public void setLocked(Boolean locked) { 276 | this.locked = locked; 277 | } 278 | 279 | public String getUrl() { 280 | return url; 281 | } 282 | 283 | public void setUrl(String url) { 284 | this.url = url; 285 | } 286 | 287 | public String getTitle() { 288 | return title; 289 | } 290 | 291 | public void setTitle(String title) { 292 | this.title = title; 293 | } 294 | 295 | public Boolean getVisited() { 296 | return visited; 297 | } 298 | 299 | public void setVisited(Boolean visited) { 300 | this.visited = visited; 301 | } 302 | } -------------------------------------------------------------------------------- /src/test/java/ga/dryco/redditjerk/ExamplesTest.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk; 2 | 3 | import ga.dryco.redditjerk.api.Reddit; 4 | import ga.dryco.redditjerk.api.enums.Distinguish; 5 | import ga.dryco.redditjerk.api.enums.FromPast; 6 | import ga.dryco.redditjerk.api.enums.Moderation; 7 | import ga.dryco.redditjerk.api.enums.Sorting; 8 | import ga.dryco.redditjerk.implementation.RedditApi; 9 | import ga.dryco.redditjerk.wrappers.*; 10 | 11 | import java.net.MalformedURLException; 12 | import java.util.List; 13 | 14 | public class ExamplesTest { 15 | public static void main(String[] args) throws MalformedURLException { 16 | 17 | 18 | //Getting the api instance with useragent as parameter: 19 | Reddit red = RedditApi.getRedditInstance("Reddit client Test v1313"); 20 | 21 | //OAuth login, returns User object of the logged in account 22 | User myUser = red.login("RedditJerkTest", "jerkjerkjerk", "WoXLiKdjulE09Q", "QoG2unmpgAum-IQ92NDhhNy-UKs"); 23 | 24 | //getting a redditor object 25 | User jerkUser = red.getUser("reditor123"); 26 | 27 | //Give user reditor123 six months worth of Reddit Gold 28 | red.giveGold("reditor123", 6); 29 | 30 | //getting user comments, gets 200 newest comments 31 | List clist = jerkUser.getComments(200, Sorting.NEW); 32 | 33 | //getting user's top 100 submissions 34 | List slist = jerkUser.getSubmitted(100, Sorting.TOP); 35 | 36 | //Getting user's Karma Balance in a moronic subreddit for his last 200 comments 37 | Integer karmaBalance = jerkUser.getKarmaBalance("MensRights", 200); 38 | 39 | //Getting a Subreddit object of a subreddit 40 | Subreddit amSubr = red.getSubreddit("ShitAmericansSay"); 41 | 42 | //get /r/ShitAmericansSay 50 controversial submissions 43 | amSubr.getControversial(50); 44 | 45 | //get /r/ShitAmericansSay top 10 submissions, default timespan is DAY 46 | amSubr.getTop(10); 47 | 48 | //we can also specify the timespan 49 | amSubr.getTop(100, FromPast.ALL_TIME); 50 | amSubr.getTop(100, FromPast.WEEK); 51 | 52 | //Subscribe to the subreddit 53 | amSubr.subscribe(); 54 | //Unsubscribe 55 | amSubr.unsubscribe(); 56 | 57 | //Subscribe and unsibscribe from subreddits without gettinga Subreddit object 58 | red.subscribe("Socialism"); 59 | red.unsubscribe("Funny"); 60 | 61 | //and getting it's front page 62 | List amlinkList = amSubr.getHot(25); 63 | 64 | //Getting a reddit Thread object 65 | RedditThread post = red.getRedditThread( 66 | "https://www.reddit.com/r/Economics/comments/46lkfz/can_sanders_do_it_is_it_plausible_that_there/d06k38f", Sorting.NEW); 67 | 68 | //We can flatten comments like this, this will return all the comments in the 69 | // thread as a flat list, not inclding the MoreComments hidden comments. 70 | List flatComments = post.getFlatComments(); 71 | 72 | //If you want to get ALL the comments you should set fetchMoreComments property of the thread object to true 73 | //before you get the flat comments, this will make a lot of api calls and take a long time. 74 | post.fetchMoreComments(true); 75 | List ALLflatComments = post.getFlatComments(); 76 | 77 | Link subm = post.getSubmissionPost().getData(); 78 | Comment myComment2 = subm.reply("South Park is Awesome!! :P"); 79 | 80 | //Editing our comment 81 | myComment2.edit("South Park is SUPER Awesome!! :PPP"); 82 | 83 | //upvoting the submission 84 | subm.upvote(); 85 | 86 | //hiding and unhiding the submission 87 | subm.hide(); 88 | subm.unhide(); 89 | 90 | //Reaplying to first comment in the thread, myComment is the object of the comment you just posted. 91 | Comment firstComment = post.getFlatComments().get(0); 92 | Comment myComment1 = firstComment.reply("Hello!"); 93 | 94 | //we can immidately delete our new comment 95 | myComment1.delete(); 96 | 97 | //Submitting a new self post in subreddit TheRedPill that is bound to be upvoted and gilded 98 | red.Submit("TheRedPill", "DAE thinks women's job should be to please and serve men !?", "Anyone ? ", "self"); 99 | 100 | //get top 5 submittions of the week in /r/learnprogramming 101 | List learnPrgrTop = red.getSubredditPage("learnprogramming", 5, Sorting.TOP, FromPast.WEEK); 102 | 103 | //getting /r/learnprogramming's moderators 104 | List learnPrgMods = red.getSubredditModerators("learnprogramming"); 105 | 106 | //printing their usernames 107 | for(User modusr: learnPrgMods){ 108 | System.out.println(modusr.getName()); 109 | } 110 | 111 | /** 112 | * 113 | * MODERATION API 114 | * 115 | * 116 | */ 117 | 118 | //Accept an invitation to be moderator in /r/Movies 119 | red.acceptModInvite("Movies"); 120 | 121 | //Leaving as moderator in /r/Videos 122 | red.leaveModeration("Videos"); 123 | 124 | red.approve("t3_4jeqzj"); 125 | 126 | //remove comment or submission, second parameter: spam= true or false. 127 | red.remove("t3_4jeqzj", true); 128 | 129 | //Ignore reports from a thing, submission or comment fullId. 130 | red.ignoreReports("t3_4jeqzj"); 131 | 132 | //unignore 133 | red.unignoreReports("t3_4jeqzj"); 134 | 135 | //Distinguish 136 | red.distinguish("t3_4jeqzj", Distinguish.YES); 137 | red.distinguish("t3_4jeqzj", Distinguish.ADMIN); 138 | red.distinguish("t3_4jeqzj", Distinguish.SPECIAL); 139 | red.distinguish("t3_4jeqzj", Distinguish.NO); 140 | 141 | //Get 100 reported comments in a subreddit you are a moderator of 142 | red.getModerationReportsComments("Movies", Moderation.REPORTED, 100); 143 | 144 | //Reported 100 Submissions 145 | red.getModerationReportsSubmissions("Movies", Moderation.REPORTED, 100); 146 | 147 | //Get 100 Spam comments 148 | red.getModerationReportsComments("Movies", Moderation.SPAM, 100); 149 | 150 | //Get 20 queued moderation Submissions 151 | red.getModerationReportsSubmissions("Movies", Moderation.QUEUE, 20); 152 | 153 | //Get 50 Unmoderated Submissions 154 | red.getModerationReportsSubmissions("Movies", Moderation.UNMODERATED, 50); 155 | 156 | //Get Edited comments 157 | red.getModerationReportsComments("Movies", Moderation.EDITED, 20); 158 | 159 | 160 | /** 161 | * Flair API 162 | * 163 | */ 164 | //Clear the Flair templates, second argument should be either ""USER_FLAIR" for user flairs 165 | // or "LINK_FLAIR" for the link flairs 166 | red.clearFlairTemplates("flairtestsubreddit", "USER_FLAIR"); 167 | 168 | //Set flair to a link, last argument is css_class, it can be left empty if none 169 | red.linkFlair("Movies", "t3_4jlhec", "GREATEST", ""); 170 | 171 | //Set flair to a User, last argument is css_class, it can be left empty if none 172 | red.userFlair("Movies", "kakunas", "CRAP!!", ""); 173 | 174 | 175 | 176 | } 177 | 178 | } 179 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/PostData.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | import com.google.gson.annotations.Expose; 4 | import com.google.gson.annotations.SerializedName; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | /** 10 | * parent class for t1Data and t3Data 11 | */ 12 | public class PostData { 13 | 14 | @Expose 15 | private String subreddit; 16 | 17 | @Expose 18 | private Integer score; 19 | 20 | @Expose 21 | private String author; 22 | 23 | @Expose 24 | private long created; 25 | 26 | @SerializedName("created_utc") 27 | @Expose 28 | private long createdUtc; 29 | 30 | @SerializedName("subreddit_id") 31 | @Expose 32 | private String subredditId; 33 | 34 | 35 | @SerializedName("banned_by") 36 | @Expose 37 | private String bannedBy; 38 | 39 | @Expose 40 | private Boolean likes; 41 | 42 | @SerializedName("removal_reason") 43 | @Expose 44 | private String removalReason; 45 | 46 | @Expose 47 | private String id; 48 | 49 | 50 | @Expose 51 | private Integer gilded; 52 | 53 | @Expose 54 | private Boolean archived; 55 | 56 | 57 | @SerializedName("report_reasons") 58 | @Expose 59 | private List reportReasons; 60 | 61 | @SerializedName("user_reports") 62 | @Expose 63 | private List userReports = new ArrayList(); 64 | 65 | 66 | @SerializedName("approved_by") 67 | @Expose 68 | private String approvedBy; 69 | 70 | 71 | @SerializedName("author_flair_css_class") 72 | @Expose 73 | private String authorFlairCssClass; 74 | 75 | @Expose 76 | private Integer downs; 77 | 78 | @Expose 79 | private Boolean saved; 80 | 81 | 82 | @Expose 83 | private String name; 84 | 85 | @SerializedName("author_flair_text") 86 | @Expose 87 | private String authorFlairText; 88 | 89 | @Expose 90 | private String distinguished; 91 | 92 | @SerializedName("mod_reports") 93 | @Expose 94 | private List modReports = new ArrayList(); 95 | 96 | @SerializedName("num_reports") 97 | @Expose 98 | private Integer numReports; 99 | 100 | @Expose 101 | private Integer ups; 102 | 103 | @Expose 104 | private Boolean quarantine; 105 | 106 | 107 | 108 | public String getSubreddit() { 109 | return subreddit; 110 | } 111 | 112 | public void setSubreddit(String subreddit) { 113 | this.subreddit = subreddit; 114 | } 115 | 116 | public Integer getScore() { 117 | return score; 118 | } 119 | 120 | public void setScore(Integer score) { 121 | this.score = score; 122 | } 123 | 124 | public String getAuthor() { 125 | return author; 126 | } 127 | 128 | public void setAuthor(String author) { 129 | this.author = author; 130 | } 131 | 132 | public long getCreated() { 133 | return created; 134 | } 135 | 136 | public void setCreated(long created) { 137 | this.created = created; 138 | } 139 | 140 | public long getCreatedUtc() { 141 | return createdUtc; 142 | } 143 | 144 | public void setCreatedUtc(long createdUtc) { 145 | this.createdUtc = createdUtc; 146 | } 147 | 148 | public String getSubredditId() { 149 | return subredditId; 150 | } 151 | 152 | public void setSubredditId(String subredditId) { 153 | this.subredditId = subredditId; 154 | } 155 | 156 | public String getBannedBy() { 157 | return bannedBy; 158 | } 159 | 160 | public void setBannedBy(String bannedBy) { 161 | this.bannedBy = bannedBy; 162 | } 163 | 164 | public Boolean getLikes() { 165 | return likes; 166 | } 167 | 168 | public void setLikes(Boolean likes) { 169 | this.likes = likes; 170 | } 171 | 172 | public String getRemovalReason() { 173 | return removalReason; 174 | } 175 | 176 | public void setRemovalReason(String removalReason) { 177 | this.removalReason = removalReason; 178 | } 179 | 180 | public String getId() { 181 | return id; 182 | } 183 | 184 | public void setId(String id) { 185 | this.id = id; 186 | } 187 | 188 | public Integer getGilded() { 189 | return gilded; 190 | } 191 | 192 | public void setGilded(Integer gilded) { 193 | this.gilded = gilded; 194 | } 195 | 196 | public Boolean getArchived() { 197 | return archived; 198 | } 199 | 200 | public void setArchived(Boolean archived) { 201 | this.archived = archived; 202 | } 203 | 204 | public List getReportReasons() { 205 | return reportReasons; 206 | } 207 | 208 | public void setReportReasons(List reportReasons) { 209 | this.reportReasons = reportReasons; 210 | } 211 | 212 | public List getUserReports() { 213 | return userReports; 214 | } 215 | 216 | public void setUserReports(List userReports) { 217 | this.userReports = userReports; 218 | } 219 | 220 | public String getApprovedBy() { 221 | return approvedBy; 222 | } 223 | 224 | public void setApprovedBy(String approvedBy) { 225 | this.approvedBy = approvedBy; 226 | } 227 | 228 | public String getAuthorFlairCssClass() { 229 | return authorFlairCssClass; 230 | } 231 | 232 | public void setAuthorFlairCssClass(String authorFlairCssClass) { 233 | this.authorFlairCssClass = authorFlairCssClass; 234 | } 235 | 236 | public Integer getDowns() { 237 | return downs; 238 | } 239 | 240 | public void setDowns(Integer downs) { 241 | this.downs = downs; 242 | } 243 | 244 | public Boolean getSaved() { 245 | return saved; 246 | } 247 | 248 | public void setSaved(Boolean saved) { 249 | this.saved = saved; 250 | } 251 | 252 | public String getName() { 253 | return name; 254 | } 255 | 256 | public void setName(String name) { 257 | this.name = name; 258 | } 259 | 260 | public String getAuthorFlairText() { 261 | return authorFlairText; 262 | } 263 | 264 | public void setAuthorFlairText(String authorFlairText) { 265 | this.authorFlairText = authorFlairText; 266 | } 267 | 268 | public String getDistinguished() { 269 | return distinguished; 270 | } 271 | 272 | public void setDistinguished(String distinguished) { 273 | this.distinguished = distinguished; 274 | } 275 | 276 | public List getModReports() { 277 | return modReports; 278 | } 279 | 280 | public void setModReports(List modReports) { 281 | this.modReports = modReports; 282 | } 283 | 284 | public Integer getNumReports() { 285 | return numReports; 286 | } 287 | 288 | public void setNumReports(Integer numReports) { 289 | this.numReports = numReports; 290 | } 291 | 292 | public Integer getUps() { 293 | return ups; 294 | } 295 | 296 | public void setUps(Integer ups) { 297 | this.ups = ups; 298 | } 299 | 300 | public Boolean getQuarantine() { 301 | return quarantine; 302 | } 303 | 304 | public void setQuarantine(Boolean quarantine) { 305 | this.quarantine = quarantine; 306 | } 307 | } 308 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/T2Data.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | import javax.annotation.Generated; 4 | import com.google.gson.annotations.Expose; 5 | import com.google.gson.annotations.SerializedName; 6 | 7 | @Generated("org.jsonschema2pojo") 8 | public class T2Data { 9 | 10 | @SerializedName("has_mail") 11 | @Expose 12 | private Boolean hasMail; 13 | @Expose 14 | private String name; 15 | @SerializedName("is_friend") 16 | @Expose 17 | private Boolean isFriend; 18 | @Expose 19 | private Double created; 20 | @SerializedName("hide_from_robots") 21 | @Expose 22 | private Boolean hideFromRobots; 23 | @SerializedName("gold_creddits") 24 | @Expose 25 | private Integer goldCreddits; 26 | @Expose 27 | private String modhash; 28 | @SerializedName("created_utc") 29 | @Expose 30 | private Double createdUtc; 31 | @SerializedName("has_mod_mail") 32 | @Expose 33 | private Boolean hasModMail; 34 | @SerializedName("link_karma") 35 | @Expose 36 | private Integer linkKarma; 37 | @SerializedName("comment_karma") 38 | @Expose 39 | private Integer commentKarma; 40 | @SerializedName("over_18") 41 | @Expose 42 | private Boolean over18; 43 | @SerializedName("is_gold") 44 | @Expose 45 | private Boolean isGold; 46 | @SerializedName("is_mod") 47 | @Expose 48 | private Boolean isMod; 49 | 50 | @SerializedName("has_verified_email") 51 | @Expose 52 | private Boolean hasVerifiedEmail; 53 | @Expose 54 | private String id; 55 | @SerializedName("inbox_count") 56 | @Expose 57 | private Integer inboxCount; 58 | 59 | /** 60 | * 61 | * @return 62 | * The hasMail 63 | */ 64 | public Boolean getHasMail() { 65 | return hasMail; 66 | } 67 | 68 | /** 69 | * 70 | * @param hasMail 71 | * The has_mail 72 | */ 73 | public void setHasMail(Boolean hasMail) { 74 | this.hasMail = hasMail; 75 | } 76 | 77 | /** 78 | * 79 | * @return 80 | * The name 81 | */ 82 | public String getName() { 83 | return name; 84 | } 85 | 86 | /** 87 | * 88 | * @param name 89 | * The name 90 | */ 91 | public void setName(String name) { 92 | this.name = name; 93 | } 94 | 95 | /** 96 | * 97 | * @return 98 | * The isFriend 99 | */ 100 | public Boolean getIsFriend() { 101 | return isFriend; 102 | } 103 | 104 | /** 105 | * 106 | * @param isFriend 107 | * The is_friend 108 | */ 109 | public void setIsFriend(Boolean isFriend) { 110 | this.isFriend = isFriend; 111 | } 112 | 113 | /** 114 | * 115 | * @return 116 | * The created 117 | */ 118 | public Double getCreated() { 119 | return created; 120 | } 121 | 122 | /** 123 | * 124 | * @param created 125 | * The created 126 | */ 127 | public void setCreated(Double created) { 128 | this.created = created; 129 | } 130 | 131 | /** 132 | * 133 | * @return 134 | * The hideFromRobots 135 | */ 136 | public Boolean getHideFromRobots() { 137 | return hideFromRobots; 138 | } 139 | 140 | /** 141 | * 142 | * @param hideFromRobots 143 | * The hide_from_robots 144 | */ 145 | public void setHideFromRobots(Boolean hideFromRobots) { 146 | this.hideFromRobots = hideFromRobots; 147 | } 148 | 149 | /** 150 | * 151 | * @return 152 | * The goldCreddits 153 | */ 154 | public Integer getGoldCreddits() { 155 | return goldCreddits; 156 | } 157 | 158 | /** 159 | * 160 | * @param goldCreddits 161 | * The gold_creddits 162 | */ 163 | public void setGoldCreddits(Integer goldCreddits) { 164 | this.goldCreddits = goldCreddits; 165 | } 166 | 167 | /** 168 | * 169 | * @return 170 | * The modhash 171 | */ 172 | public String getModhash() { 173 | return modhash; 174 | } 175 | 176 | /** 177 | * 178 | * @param modhash 179 | * The modhash 180 | */ 181 | public void setModhash(String modhash) { 182 | this.modhash = modhash; 183 | } 184 | 185 | /** 186 | * 187 | * @return 188 | * The createdUtc 189 | */ 190 | public Double getCreatedUtc() { 191 | return createdUtc; 192 | } 193 | 194 | /** 195 | * 196 | * @param createdUtc 197 | * The created_utc 198 | */ 199 | public void setCreatedUtc(Double createdUtc) { 200 | this.createdUtc = createdUtc; 201 | } 202 | 203 | /** 204 | * 205 | * @return 206 | * The hasModMail 207 | */ 208 | public Boolean getHasModMail() { 209 | return hasModMail; 210 | } 211 | 212 | /** 213 | * 214 | * @param hasModMail 215 | * The has_mod_mail 216 | */ 217 | public void setHasModMail(Boolean hasModMail) { 218 | this.hasModMail = hasModMail; 219 | } 220 | 221 | /** 222 | * 223 | * @return 224 | * The linkKarma 225 | */ 226 | public Integer getLinkKarma() { 227 | return linkKarma; 228 | } 229 | 230 | /** 231 | * 232 | * @param linkKarma 233 | * The link_karma 234 | */ 235 | public void setLinkKarma(Integer linkKarma) { 236 | this.linkKarma = linkKarma; 237 | } 238 | 239 | /** 240 | * 241 | * @return 242 | * The commentKarma 243 | */ 244 | public Integer getCommentKarma() { 245 | return commentKarma; 246 | } 247 | 248 | /** 249 | * 250 | * @param commentKarma 251 | * The comment_karma 252 | */ 253 | public void setCommentKarma(Integer commentKarma) { 254 | this.commentKarma = commentKarma; 255 | } 256 | 257 | /** 258 | * 259 | * @return 260 | * The over18 261 | */ 262 | public Boolean getOver18() { 263 | return over18; 264 | } 265 | 266 | /** 267 | * 268 | * @param over18 269 | * The over_18 270 | */ 271 | public void setOver18(Boolean over18) { 272 | this.over18 = over18; 273 | } 274 | 275 | /** 276 | * 277 | * @return 278 | * The isGold 279 | */ 280 | public Boolean getIsGold() { 281 | return isGold; 282 | } 283 | 284 | /** 285 | * 286 | * @param isGold 287 | * The is_gold 288 | */ 289 | public void setIsGold(Boolean isGold) { 290 | this.isGold = isGold; 291 | } 292 | 293 | /** 294 | * 295 | * @return 296 | * The isMod 297 | */ 298 | public Boolean getIsMod() { 299 | return isMod; 300 | } 301 | 302 | /** 303 | * 304 | * @param isMod 305 | * The is_mod 306 | */ 307 | public void setIsMod(Boolean isMod) { 308 | this.isMod = isMod; 309 | } 310 | 311 | 312 | /** 313 | * 314 | * @return 315 | * The hasVerifiedEmail 316 | */ 317 | public Boolean getHasVerifiedEmail() { 318 | return hasVerifiedEmail; 319 | } 320 | 321 | /** 322 | * 323 | * @param hasVerifiedEmail 324 | * The has_verified_email 325 | */ 326 | public void setHasVerifiedEmail(Boolean hasVerifiedEmail) { 327 | this.hasVerifiedEmail = hasVerifiedEmail; 328 | } 329 | 330 | /** 331 | * 332 | * @return 333 | * The id 334 | */ 335 | public String getId() { 336 | return id; 337 | } 338 | 339 | /** 340 | * 341 | * @param id 342 | * The id 343 | */ 344 | public void setId(String id) { 345 | this.id = id; 346 | } 347 | 348 | /** 349 | * 350 | * @return 351 | * The inboxCount 352 | */ 353 | public Integer getInboxCount() { 354 | return inboxCount; 355 | } 356 | 357 | /** 358 | * 359 | * @param inboxCount 360 | * The inbox_count 361 | */ 362 | public void setInboxCount(Integer inboxCount) { 363 | this.inboxCount = inboxCount; 364 | } 365 | 366 | } -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/datamodels/T5Data.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.datamodels; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | import javax.annotation.Generated; 6 | import com.google.gson.annotations.Expose; 7 | import com.google.gson.annotations.SerializedName; 8 | 9 | @Generated("org.jsonschema2pojo") 10 | public class T5Data { 11 | 12 | @SerializedName("banner_img") 13 | @Expose 14 | private String bannerImg; 15 | 16 | @SerializedName("user_is_banned") 17 | @Expose 18 | private Boolean userIsBanned; 19 | 20 | @Expose 21 | private String id; 22 | @SerializedName("user_is_contributor") 23 | @Expose 24 | private Boolean userIsContributor; 25 | @SerializedName("submit_text") 26 | @Expose 27 | private String submitText; 28 | @SerializedName("display_name") 29 | @Expose 30 | private String displayName; 31 | @SerializedName("header_img") 32 | @Expose 33 | private String headerImg; 34 | @SerializedName("description_html") 35 | @Expose 36 | private String descriptionHtml; 37 | @Expose 38 | private String title; 39 | @SerializedName("collapse_deleted_comments") 40 | @Expose 41 | private Boolean collapseDeletedComments; 42 | @SerializedName("public_description") 43 | @Expose 44 | private String publicDescription; 45 | @Expose 46 | private Boolean over18; 47 | 48 | @SerializedName("public_description_html") 49 | @Expose 50 | private String publicDescriptionHtml; 51 | 52 | @SerializedName("icon_img") 53 | @Expose 54 | private String iconImg; 55 | 56 | @Expose 57 | private String description; 58 | 59 | @SerializedName("accounts_active") 60 | @Expose 61 | private Integer accountsActive; 62 | 63 | @SerializedName("public_traffic") 64 | @Expose 65 | private Boolean publicTraffic; 66 | @SerializedName("header_size") 67 | @Expose 68 | private List headerSize = new ArrayList(); 69 | @Expose 70 | private Integer subscribers; 71 | 72 | @Expose 73 | private String name; 74 | @Expose 75 | private long created; 76 | @Expose 77 | private String url; 78 | @SerializedName("hide_ads") 79 | @Expose 80 | private Boolean hideAds; 81 | @SerializedName("created_utc") 82 | @Expose 83 | private long createdUtc; 84 | 85 | @SerializedName("user_is_moderator") 86 | @Expose 87 | private Boolean userIsModerator; 88 | @SerializedName("user_sr_theme_enabled") 89 | @Expose 90 | private Boolean userSrThemeEnabled; 91 | @SerializedName("comment_score_hide_mins") 92 | @Expose 93 | private Integer commentScoreHideMins; 94 | @SerializedName("subreddit_type") 95 | @Expose 96 | private String subredditType; 97 | @SerializedName("submission_type") 98 | @Expose 99 | private String submissionType; 100 | @SerializedName("user_is_subscriber") 101 | @Expose 102 | private Boolean userIsSubscriber; 103 | 104 | @Expose 105 | private Boolean quarantine; 106 | 107 | 108 | public Boolean getQuarantine() { 109 | return quarantine; 110 | } 111 | 112 | public void setQuarantine(Boolean quarantine) { 113 | this.quarantine = quarantine; 114 | } 115 | /** 116 | * 117 | * @return 118 | * The bannerImg 119 | */ 120 | public String getBannerImg() { 121 | return bannerImg; 122 | } 123 | 124 | /** 125 | * 126 | * @param bannerImg 127 | * The banner_img 128 | */ 129 | public void setBannerImg(String bannerImg) { 130 | this.bannerImg = bannerImg; 131 | } 132 | 133 | 134 | /** 135 | * 136 | * @return 137 | * The userIsBanned 138 | */ 139 | public Boolean getUserIsBanned() { 140 | return userIsBanned; 141 | } 142 | 143 | /** 144 | * 145 | * @param userIsBanned 146 | * The user_is_banned 147 | */ 148 | public void setUserIsBanned(Boolean userIsBanned) { 149 | this.userIsBanned = userIsBanned; 150 | } 151 | 152 | /** 153 | * 154 | * @return 155 | * The id 156 | */ 157 | public String getId() { 158 | return id; 159 | } 160 | 161 | /** 162 | * 163 | * @param id 164 | * The id 165 | */ 166 | public void setId(String id) { 167 | this.id = id; 168 | } 169 | 170 | /** 171 | * 172 | * @return 173 | * The userIsContributor 174 | */ 175 | public Boolean getUserIsContributor() { 176 | return userIsContributor; 177 | } 178 | 179 | /** 180 | * 181 | * @param userIsContributor 182 | * The user_is_contributor 183 | */ 184 | public void setUserIsContributor(Boolean userIsContributor) { 185 | this.userIsContributor = userIsContributor; 186 | } 187 | 188 | /** 189 | * 190 | * @return 191 | * The submitText 192 | */ 193 | public String getSubmitText() { 194 | return submitText; 195 | } 196 | 197 | /** 198 | * 199 | * @param submitText 200 | * The submit_text 201 | */ 202 | public void setSubmitText(String submitText) { 203 | this.submitText = submitText; 204 | } 205 | 206 | /** 207 | * 208 | * @return 209 | * The displayName 210 | */ 211 | public String getDisplayName() { 212 | return displayName; 213 | } 214 | 215 | /** 216 | * 217 | * @param displayName 218 | * The display_name 219 | */ 220 | public void setDisplayName(String displayName) { 221 | this.displayName = displayName; 222 | } 223 | 224 | /** 225 | * 226 | * @return 227 | * The headerImg 228 | */ 229 | public String getHeaderImg() { 230 | return headerImg; 231 | } 232 | 233 | /** 234 | * 235 | * @param headerImg 236 | * The header_img 237 | */ 238 | public void setHeaderImg(String headerImg) { 239 | this.headerImg = headerImg; 240 | } 241 | 242 | /** 243 | * 244 | * @return 245 | * The descriptionHtml 246 | */ 247 | public String getDescriptionHtml() { 248 | return descriptionHtml; 249 | } 250 | 251 | /** 252 | * 253 | * @param descriptionHtml 254 | * The description_html 255 | */ 256 | public void setDescriptionHtml(String descriptionHtml) { 257 | this.descriptionHtml = descriptionHtml; 258 | } 259 | 260 | /** 261 | * 262 | * @return 263 | * The title 264 | */ 265 | public String getTitle() { 266 | return title; 267 | } 268 | 269 | /** 270 | * 271 | * @param title 272 | * The title 273 | */ 274 | public void setTitle(String title) { 275 | this.title = title; 276 | } 277 | 278 | /** 279 | * 280 | * @return 281 | * The collapseDeletedComments 282 | */ 283 | public Boolean getCollapseDeletedComments() { 284 | return collapseDeletedComments; 285 | } 286 | 287 | /** 288 | * 289 | * @param collapseDeletedComments 290 | * The collapse_deleted_comments 291 | */ 292 | public void setCollapseDeletedComments(Boolean collapseDeletedComments) { 293 | this.collapseDeletedComments = collapseDeletedComments; 294 | } 295 | 296 | /** 297 | * 298 | * @return 299 | * The publicDescription 300 | */ 301 | public String getPublicDescription() { 302 | return publicDescription; 303 | } 304 | 305 | /** 306 | * 307 | * @param publicDescription 308 | * The public_description 309 | */ 310 | public void setPublicDescription(String publicDescription) { 311 | this.publicDescription = publicDescription; 312 | } 313 | 314 | /** 315 | * 316 | * @return 317 | * The over18 318 | */ 319 | public Boolean getOver18() { 320 | return over18; 321 | } 322 | 323 | /** 324 | * 325 | * @param over18 326 | * The over18 327 | */ 328 | public void setOver18(Boolean over18) { 329 | this.over18 = over18; 330 | } 331 | 332 | /** 333 | * 334 | * @return 335 | * The publicDescriptionHtml 336 | */ 337 | public String getPublicDescriptionHtml() { 338 | return publicDescriptionHtml; 339 | } 340 | 341 | /** 342 | * 343 | * @param publicDescriptionHtml 344 | * The public_description_html 345 | */ 346 | public void setPublicDescriptionHtml(String publicDescriptionHtml) { 347 | this.publicDescriptionHtml = publicDescriptionHtml; 348 | } 349 | 350 | 351 | 352 | /** 353 | * 354 | * @return 355 | * The iconImg 356 | */ 357 | public String getIconImg() { 358 | return iconImg; 359 | } 360 | 361 | /** 362 | * 363 | * @param iconImg 364 | * The icon_img 365 | */ 366 | public void setIconImg(String iconImg) { 367 | this.iconImg = iconImg; 368 | } 369 | 370 | 371 | 372 | /** 373 | * 374 | * @return 375 | * The description 376 | */ 377 | public String getDescription() { 378 | return description; 379 | } 380 | 381 | /** 382 | * 383 | * @param description 384 | * The description 385 | */ 386 | public void setDescription(String description) { 387 | this.description = description; 388 | } 389 | 390 | 391 | /** 392 | * 393 | * @return 394 | * The accountsActive 395 | */ 396 | public Integer getAccountsActive() { 397 | return accountsActive; 398 | } 399 | 400 | /** 401 | * 402 | * @param accountsActive 403 | * The accounts_active 404 | */ 405 | public void setAccountsActive(Integer accountsActive) { 406 | this.accountsActive = accountsActive; 407 | } 408 | 409 | /** 410 | * 411 | * @return 412 | * The publicTraffic 413 | */ 414 | public Boolean getPublicTraffic() { 415 | return publicTraffic; 416 | } 417 | 418 | /** 419 | * 420 | * @param publicTraffic 421 | * The public_traffic 422 | */ 423 | public void setPublicTraffic(Boolean publicTraffic) { 424 | this.publicTraffic = publicTraffic; 425 | } 426 | 427 | /** 428 | * 429 | * @return 430 | * The headerSize 431 | */ 432 | public List getHeaderSize() { 433 | return headerSize; 434 | } 435 | 436 | /** 437 | * 438 | * @param headerSize 439 | * The header_size 440 | */ 441 | public void setHeaderSize(List headerSize) { 442 | this.headerSize = headerSize; 443 | } 444 | 445 | /** 446 | * 447 | * @return 448 | * The subscribers 449 | */ 450 | public Integer getSubscribers() { 451 | return subscribers; 452 | } 453 | 454 | /** 455 | * 456 | * @param subscribers 457 | * The subscribers 458 | */ 459 | public void setSubscribers(Integer subscribers) { 460 | this.subscribers = subscribers; 461 | } 462 | 463 | 464 | /** 465 | * 466 | * @return 467 | * The name 468 | */ 469 | public String getName() { 470 | return name; 471 | } 472 | 473 | /** 474 | * 475 | * @param name 476 | * The name 477 | */ 478 | public void setName(String name) { 479 | this.name = name; 480 | } 481 | 482 | /** 483 | * 484 | * @return 485 | * The created 486 | */ 487 | public long getCreated() { 488 | return created; 489 | } 490 | 491 | /** 492 | * 493 | * @param created 494 | * The created 495 | */ 496 | public void setCreated(long created) { 497 | this.created = created; 498 | } 499 | 500 | /** 501 | * 502 | * @return 503 | * The url 504 | */ 505 | public String getUrl() { 506 | return url; 507 | } 508 | 509 | /** 510 | * 511 | * @param url 512 | * The url 513 | */ 514 | public void setUrl(String url) { 515 | this.url = url; 516 | } 517 | 518 | /** 519 | * 520 | * @return 521 | * The hideAds 522 | */ 523 | public Boolean getHideAds() { 524 | return hideAds; 525 | } 526 | 527 | /** 528 | * 529 | * @param hideAds 530 | * The hide_ads 531 | */ 532 | public void setHideAds(Boolean hideAds) { 533 | this.hideAds = hideAds; 534 | } 535 | 536 | /** 537 | * 538 | * @return 539 | * The createdUtc 540 | */ 541 | public long getCreatedUtc() { 542 | return createdUtc; 543 | } 544 | 545 | /** 546 | * 547 | * @param createdUtc 548 | * The created_utc 549 | */ 550 | public void setCreatedUtc(long createdUtc) { 551 | this.createdUtc = createdUtc; 552 | } 553 | 554 | /** 555 | * 556 | * @return 557 | * The userIsModerator 558 | */ 559 | public Boolean getUserIsModerator() { 560 | return userIsModerator; 561 | } 562 | 563 | /** 564 | * 565 | * @param userIsModerator 566 | * The user_is_moderator 567 | */ 568 | public void setUserIsModerator(Boolean userIsModerator) { 569 | this.userIsModerator = userIsModerator; 570 | } 571 | 572 | /** 573 | * 574 | * @return 575 | * The userSrThemeEnabled 576 | */ 577 | public Boolean getUserSrThemeEnabled() { 578 | return userSrThemeEnabled; 579 | } 580 | 581 | /** 582 | * 583 | * @param userSrThemeEnabled 584 | * The user_sr_theme_enabled 585 | */ 586 | public void setUserSrThemeEnabled(Boolean userSrThemeEnabled) { 587 | this.userSrThemeEnabled = userSrThemeEnabled; 588 | } 589 | 590 | /** 591 | * 592 | * @return 593 | * The commentScoreHideMins 594 | */ 595 | public Integer getCommentScoreHideMins() { 596 | return commentScoreHideMins; 597 | } 598 | 599 | /** 600 | * 601 | * @param commentScoreHideMins 602 | * The comment_score_hide_mins 603 | */ 604 | public void setCommentScoreHideMins(Integer commentScoreHideMins) { 605 | this.commentScoreHideMins = commentScoreHideMins; 606 | } 607 | 608 | /** 609 | * 610 | * @return 611 | * The subredditType 612 | */ 613 | public String getSubredditType() { 614 | return subredditType; 615 | } 616 | 617 | /** 618 | * 619 | * @param subredditType 620 | * The subreddit_type 621 | */ 622 | public void setSubredditType(String subredditType) { 623 | this.subredditType = subredditType; 624 | } 625 | 626 | /** 627 | * 628 | * @return 629 | * The submissionType 630 | */ 631 | public String getSubmissionType() { 632 | return submissionType; 633 | } 634 | 635 | /** 636 | * 637 | * @param submissionType 638 | * The submission_type 639 | */ 640 | public void setSubmissionType(String submissionType) { 641 | this.submissionType = submissionType; 642 | } 643 | 644 | /** 645 | * 646 | * @return 647 | * The userIsSubscriber 648 | */ 649 | public Boolean getUserIsSubscriber() { 650 | return userIsSubscriber; 651 | } 652 | 653 | /** 654 | * 655 | * @param userIsSubscriber 656 | * The user_is_subscriber 657 | */ 658 | public void setUserIsSubscriber(Boolean userIsSubscriber) { 659 | this.userIsSubscriber = userIsSubscriber; 660 | } 661 | 662 | } 663 | -------------------------------------------------------------------------------- /src/main/java/ga/dryco/redditjerk/implementation/RedditApi.java: -------------------------------------------------------------------------------- 1 | package ga.dryco.redditjerk.implementation; 2 | 3 | import com.google.gson.Gson; 4 | import com.google.gson.GsonBuilder; 5 | import com.google.gson.JsonParser; 6 | import com.sun.deploy.util.StringUtils; 7 | import ga.dryco.redditjerk.api.*; 8 | import ga.dryco.redditjerk.api.enums.*; 9 | import ga.dryco.redditjerk.wrappers.*; 10 | import ga.dryco.redditjerk.datamodels.*; 11 | import ga.dryco.redditjerk.datamodels.deserializers.*; 12 | import ga.dryco.redditjerk.exceptions.RedditJerkException; 13 | import ga.dryco.redditjerk.rest.OAuthClient; 14 | import org.apache.http.NameValuePair; 15 | import org.apache.http.message.BasicNameValuePair; 16 | import java.net.MalformedURLException; 17 | import java.net.URL; 18 | import java.util.ArrayList; 19 | import java.util.List; 20 | import java.util.stream.Collectors; 21 | 22 | 23 | /** 24 | * Default api implementation. 25 | */ 26 | public final class RedditApi implements Reddit { 27 | private final OAuthClient client; 28 | 29 | 30 | private String ApiURL = ConfigValues.API_URL.toString(); 31 | private final Gson gson; 32 | 33 | private RedditApi(String useragent){ 34 | this.client = new OAuthClient(useragent); 35 | 36 | GsonBuilder gsonBuilder = new GsonBuilder(); 37 | gsonBuilder.registerTypeAdapter(T1.class, new T1Deserializer()); 38 | gsonBuilder.registerTypeAdapter(T3.class, new T3Deserializer()); 39 | gsonBuilder.registerTypeAdapter(RedditThread.class, new ThreadDeserializer()); 40 | gsonBuilder.registerTypeAdapter(PostReturn.class, new PostReturnDeserializer()); 41 | gsonBuilder.registerTypeAdapter(T1Listing.class, new T1ListingDeserializer()); 42 | gsonBuilder.registerTypeAdapter(MoreChildren.class, new MoreChildrenDeserializer()); 43 | this.gson = gsonBuilder.create(); 44 | 45 | } 46 | 47 | private static RedditApi ApiINSTANCE; 48 | 49 | public static RedditApi getRedditInstance(String userAgent){ 50 | if(ApiINSTANCE == null) 51 | ApiINSTANCE = new RedditApi(userAgent); 52 | return ApiINSTANCE; 53 | } 54 | 55 | public static RedditApi getRedditInstance(){ 56 | return ApiINSTANCE; 57 | } 58 | 59 | 60 | /** 61 | * 62 | * @param username reddit account username 63 | * @param password reddit account password 64 | * @param clientId oAuth app id 65 | * @param secret oAuth Secret 66 | * @return User object of the logged in user 67 | */ 68 | public User login(String username, String password, String clientId, String secret) { 69 | this.ApiURL = ConfigValues.OAUTH_URL.toString(); 70 | client.Authenticate(username, password, clientId, secret); 71 | 72 | return this.me(); 73 | } 74 | 75 | /** 76 | * 77 | * @param username username to get 78 | * @return User object 79 | * 80 | */ 81 | 82 | public User getUser(String username) { 83 | String requesturl = String.format(ApiURL + Endpoints.USER, username); 84 | 85 | T2 t2 = this.getDataObject(makeHttpRequest(requesturl), T2.class); 86 | return t2.getData(); 87 | } 88 | 89 | 90 | /** 91 | * 92 | * @return User object of the logged in user 93 | */ 94 | 95 | 96 | private User me() { 97 | String requesturl = ApiURL + Endpoints.ME; 98 | return this.getDataObject(makeHttpRequest(requesturl), User.class); 99 | 100 | } 101 | 102 | /** 103 | * 104 | * 105 | * @param url Url of the reddit thread 106 | * @param sort Sorting, top, hot, new 107 | * @return RedditThread object 108 | * @throws MalformedURLException 109 | */ 110 | 111 | public RedditThread getRedditThread(String url, Sorting sort) throws MalformedURLException { 112 | URL purl = new URL(url); 113 | url = purl.getPath(); 114 | 115 | String requesturl = String.format(ApiURL + Endpoints.REDDIT_THREAD, url, sort); 116 | 117 | return this.getDataObject(makeHttpRequest(requesturl), RedditThread.class); 118 | } 119 | 120 | public RedditThread getRandomPostFromSubreddit(String subreddit){ 121 | 122 | String requesturl = String.format(ApiURL + Endpoints.SUBREDDIT_PAGE, subreddit, "random", 1, ""); 123 | 124 | return this.getDataObject(makeHttpRequest(requesturl), RedditThread.class); 125 | 126 | } 127 | 128 | 129 | /** 130 | * 131 | * @param idList list of fullname ids for moreChildren comments 132 | * @param linkId Id of the Link object 133 | * @param sort Sorting 134 | * @return MoreChildren object 135 | */ 136 | public MoreChildren getMoreChildren(List idList, String linkId, Sorting sort){ 137 | 138 | String idListComma = StringUtils.join(idList, ","); 139 | String requesturl = String.format(ApiURL + Endpoints.MORE_CHILDREN, idListComma, linkId, sort); 140 | 141 | return this.getDataObject(makeHttpRequest(requesturl), MoreChildren.class); 142 | } 143 | 144 | 145 | 146 | /** 147 | * 148 | * @param subreddit subreddit name 149 | * @return Subreddit object 150 | */ 151 | public Subreddit getSubreddit(String subreddit) { 152 | String requesturl = String.format(ApiURL + Endpoints.SUBREDDIT, subreddit); 153 | 154 | return this.getDataObject(makeHttpRequest(requesturl), T5.class).getData(); 155 | } 156 | 157 | 158 | /** 159 | * 160 | * @param username reddit username 161 | * @param limit number of comments to get 162 | * @param sort Sorting 163 | * @return returns list of Comment objects 164 | */ 165 | public final List getUserComments(String username, Integer limit, Sorting sort) { 166 | String requesturl = String.format(ApiURL + Endpoints.USER_COMMENTS, username, limit, sort); 167 | 168 | return this.getListings(requesturl, limit, T1Listing.class).stream().map(comm -> (Comment) comm).collect(Collectors.toList()); 169 | } 170 | 171 | /** 172 | * 173 | * @param username reddit username 174 | * @param limit number of comments to get 175 | * @return list of Comment objects 176 | */ 177 | public final List getUserGilded(String username, Integer limit){ 178 | String requesturl = String.format(ApiURL + Endpoints.USER_GILDED, username, limit); 179 | 180 | return this.getListings(requesturl, limit, T1Listing.class).stream().map(comm -> (Comment) comm).collect(Collectors.toList()); 181 | 182 | } 183 | 184 | /** 185 | * 186 | * @param username username to give gold to 187 | * @param months for how many months, must be between 1 and 36 188 | */ 189 | public final void giveGold(String username, Integer months){ 190 | String requesturl = String.format(ApiURL + Endpoints.GIVE_GOLD, username); 191 | 192 | List urlParameters = new ArrayList<>(); 193 | urlParameters.add(new BasicNameValuePair("months", months.toString())); 194 | urlParameters.add(new BasicNameValuePair("username", username)); 195 | 196 | 197 | this.makeHttpRequest(requesturl, urlParameters); 198 | 199 | 200 | } 201 | 202 | 203 | /** 204 | * 205 | * @param username reddit username 206 | * @param limit number of links to get 207 | * @return list of Link objects 208 | */ 209 | public final List getUserUpvoted(String username, Integer limit){ 210 | String requesturl = String.format(ApiURL + Endpoints.USER_UPVOTED, username, limit); 211 | 212 | return this.getListings(requesturl, limit, T3Listing.class).stream().map(lnk -> (Link) lnk).collect(Collectors.toList()); 213 | 214 | } 215 | 216 | /** 217 | * 218 | * @param username reddit username 219 | * @param limit number of links to get 220 | * @return list of Link objects 221 | */ 222 | public final List getUserDownvoted(String username, Integer limit){ 223 | String requesturl = String.format(ApiURL + Endpoints.USER_DOWNVOTED, username, limit); 224 | 225 | return this.getListings(requesturl, limit, T3Listing.class).stream().map(lnk -> (Link) lnk).collect(Collectors.toList()); 226 | 227 | } 228 | 229 | /** 230 | * 231 | * @param username reddit username 232 | * @param limit number of links to get 233 | * @return list of Link objects 234 | */ 235 | public final List getUserHidden(String username, Integer limit){ 236 | String requesturl = String.format(ApiURL + Endpoints.USER_HIDDEN, username, limit); 237 | 238 | return this.getListings(requesturl, limit, T3Listing.class).stream().map(lnk -> (Link) lnk).collect(Collectors.toList()); 239 | 240 | } 241 | 242 | /** 243 | * 244 | * @param username reddit username 245 | * @param limit number of links to get 246 | * @param sort Sorting 247 | * @return list of Link objects 248 | */ 249 | public final List getUserSubmissions(String username, Integer limit, Sorting sort) { 250 | String requesturl = String.format(ApiURL + Endpoints.USER_SUBS, username, limit, sort); 251 | 252 | return this.getListings(requesturl, limit, T3Listing.class).stream().map(lnk -> (Link) lnk).collect(Collectors.toList()); 253 | } 254 | 255 | /** 256 | * 257 | * @param subreddit Subreddit name 258 | * @param limit number of links to get 259 | * @param sort Sorting 260 | * @param timeperiod From how far back to get links 261 | * @return list of Link objects 262 | */ 263 | public List getSubredditPage(String subreddit, Integer limit, Sorting sort, FromPast timeperiod) { 264 | String requesturl = String.format(ApiURL + Endpoints.SUBREDDIT_PAGE, subreddit, sort, limit, timeperiod); 265 | 266 | return this.getListings(requesturl, limit, T3Listing.class).stream().map(lnk -> (Link) lnk).collect(Collectors.toList()); 267 | } 268 | 269 | 270 | /** 271 | * 272 | * @param subreddit subreddit name 273 | * @param limit number of comments to get 274 | * @return list of comment objects 275 | */ 276 | public List getSubredditComments(String subreddit, Integer limit){ 277 | String requesturl = String.format(ApiURL + Endpoints.SUBREDDIT_COMMENTS, subreddit, limit); 278 | 279 | return this.getListings(requesturl, limit, T1Listing.class).stream().map(cmt -> (Comment) cmt).collect(Collectors.toList()); 280 | 281 | } 282 | 283 | 284 | /** 285 | * 286 | * @param subreddit 287 | * @param modreport 288 | * @param limit 289 | * @return 290 | */ 291 | public List getModerationReportsSubmissions(String subreddit, Moderation modreport, Integer limit){ 292 | String requesturl = String.format(ApiURL + Endpoints.MODERATION_SUBMISSIONS, subreddit, modreport, limit); 293 | 294 | return this.getListings(requesturl, limit, T3Listing.class).stream().map(cmt -> (Link) cmt).collect(Collectors.toList()); 295 | 296 | } 297 | 298 | /** 299 | * 300 | * @param subreddit 301 | * @param modreport 302 | * @param limit 303 | * @return 304 | */ 305 | public List getModerationReportsComments(String subreddit, Moderation modreport, Integer limit){ 306 | String requesturl = String.format(ApiURL + Endpoints.MODERATION_COMMENTS, subreddit, modreport, limit); 307 | 308 | return this.getListings(requesturl, limit, T1Listing.class).stream().map(cmt -> (Comment) cmt).collect(Collectors.toList()); 309 | 310 | } 311 | 312 | /** 313 | * 314 | * @param idList 315 | * @return 316 | */ 317 | // list can be of comments, links, or subreddit objects 318 | public List getInfo_subreddit(List idList){ 319 | return this.getInfo(idList, T5Listing.class).stream().map(t -> (Subreddit) t).collect(Collectors.toList()); 320 | } 321 | 322 | /** 323 | * 324 | * @param idList 325 | * @return 326 | */ 327 | public List getInfo_link(List idList){ 328 | return this.getInfo(idList, T3Listing.class).stream().map(t -> (Link) t).collect(Collectors.toList()); 329 | } 330 | 331 | /** 332 | * 333 | * @param idList 334 | * @return 335 | */ 336 | public List getInfo_comment(List idList){ 337 | return this.getInfo(idList, T1Listing.class).stream().map(t -> (Comment) t).collect(Collectors.toList()); 338 | } 339 | 340 | 341 | /** 342 | * 343 | * @param idList 344 | * @param typeC 345 | * @param 346 | * @return 347 | */ 348 | private > List getInfo(List idList, Class typeC){ 349 | final int MAX_INFO_LIST = 100; 350 | if(idList.size() > MAX_INFO_LIST) throw new RedditJerkException("/api/info thing list larger than 100"); 351 | String ids = String.join(",", idList); 352 | 353 | String requesturl = String.format(ApiURL + Endpoints.INFO, ids); 354 | 355 | return this.getListings(requesturl, MAX_INFO_LIST, typeC).stream().collect(Collectors.toList()); 356 | 357 | } 358 | 359 | /** 360 | * 361 | * @param subreddit 362 | * @return 363 | */ 364 | public List getSubredditModerators(String subreddit) { 365 | 366 | List returnUserList = new ArrayList<>(); 367 | 368 | List modListing = this.getSubredditModeratorsRaw(subreddit); 369 | 370 | returnUserList.addAll(modListing.stream().map(modD -> this.getUser(modD.getName())).collect(Collectors.toList())); 371 | 372 | return returnUserList; 373 | 374 | } 375 | 376 | /** 377 | * This returns the raw ModeratorsData objects which avoids all the extra getUser() API calls, useful if you 378 | * dont need the actual User objects. 379 | * 380 | * @param subreddit subreddit name 381 | * @return returns a list with ModeratorsData 382 | */ 383 | public List getSubredditModeratorsRaw(String subreddit){ 384 | String requesturl = String.format(ApiURL + Endpoints.SUB_MODERATORS, subreddit); 385 | 386 | 387 | return this.getDataObject(makeHttpRequest(requesturl), ModeratorsListing.class).getData().getChildren(); 388 | 389 | } 390 | 391 | /** 392 | * 393 | * @param fullnameId Thing Id 394 | * @param direction "1" for upvote, "-1" for downvote 395 | * 396 | */ 397 | public void vote(String fullnameId, String direction) { 398 | String requesturl = ApiURL + Endpoints.VOTE; 399 | List urlParameters = new ArrayList<>(); 400 | urlParameters.add(new BasicNameValuePair("id", fullnameId)); 401 | urlParameters.add(new BasicNameValuePair("dir", direction)); 402 | this.makeHttpRequest(requesturl, urlParameters); 403 | } 404 | 405 | 406 | /** 407 | * 408 | * @param subreddit Subreddit name in which to post a new submission 409 | * @param title Title of the submission 410 | * @param bodyOrUrl Url or body of Submission 411 | * @param kind should be either "link" or "self" 412 | * @return Link object 413 | */ 414 | public final Link Submit(String subreddit, String title, String bodyOrUrl, String kind) { 415 | String requesturl = ApiURL + Endpoints.SUBMIT; 416 | 417 | List urlParameters = new ArrayList<>(); 418 | urlParameters.add(new BasicNameValuePair("api_type", "json")); 419 | urlParameters.add(new BasicNameValuePair("kind", kind)); 420 | urlParameters.add(new BasicNameValuePair("resubmit", "true")); 421 | urlParameters.add(new BasicNameValuePair("sr", subreddit)); 422 | urlParameters.add(new BasicNameValuePair("title", title)); 423 | if(kind.equals("link")) urlParameters.add(new BasicNameValuePair("url", bodyOrUrl)); 424 | if(kind.equals("self")) urlParameters.add(new BasicNameValuePair("text", bodyOrUrl)); 425 | 426 | PostReturn pstr = this.getDataObject(this.makeHttpRequest(requesturl, urlParameters), PostReturn.class); 427 | return pstr.getLink().getData(); 428 | 429 | 430 | } 431 | 432 | /** 433 | * 434 | * @param fullnameId Fullname Id of an object to delete 435 | */ 436 | public final void delete(String fullnameId) { 437 | String requesturl = ApiURL + Endpoints.DELETE; 438 | 439 | List urlParameters = new ArrayList<>(); 440 | urlParameters.add(new BasicNameValuePair("api_type", "json")); 441 | urlParameters.add(new BasicNameValuePair("id", fullnameId)); 442 | 443 | this.makeHttpRequest(requesturl, urlParameters); 444 | 445 | } 446 | 447 | /** 448 | * 449 | * @param subreddit subreddit name 450 | */ 451 | public final void subscribe(String subreddit){ 452 | String requesturl = ApiURL + Endpoints.SUBSCRIBE; 453 | 454 | List urlParameters = new ArrayList<>(); 455 | urlParameters.add(new BasicNameValuePair("action", "sub")); 456 | urlParameters.add(new BasicNameValuePair("sr_name", subreddit)); 457 | 458 | this.makeHttpRequest(requesturl, urlParameters); 459 | 460 | } 461 | 462 | /** 463 | * 464 | * @param subreddit subreddit name 465 | */ 466 | public final void unsubscribe(String subreddit){ 467 | String requesturl = ApiURL + Endpoints.SUBSCRIBE; 468 | 469 | List urlParameters = new ArrayList<>(); 470 | urlParameters.add(new BasicNameValuePair("action", "unsub")); 471 | urlParameters.add(new BasicNameValuePair("sr_name", subreddit)); 472 | 473 | this.makeHttpRequest(requesturl, urlParameters); 474 | 475 | } 476 | 477 | /** 478 | * 479 | * @param fullnameId Fullname Id of the object to hide 480 | */ 481 | public final void hide(String fullnameId) { 482 | String requesturl = ApiURL + Endpoints.HIDE; 483 | 484 | List urlParameters = new ArrayList<>(); 485 | urlParameters.add(new BasicNameValuePair("id", fullnameId)); 486 | 487 | this.makeHttpRequest(requesturl, urlParameters); 488 | } 489 | 490 | /** 491 | * 492 | * @param fullnameId ullname Id of the object to unhide 493 | */ 494 | public final void unhide(String fullnameId) { 495 | String requesturl = ApiURL + Endpoints.UNHIDE; 496 | 497 | List urlParameters = new ArrayList<>(); 498 | urlParameters.add(new BasicNameValuePair("id", fullnameId)); 499 | 500 | this.makeHttpRequest(requesturl, urlParameters); 501 | } 502 | 503 | /** 504 | * 505 | * @param fullnameId Thing Id to which to reply 506 | * @param text Reply body 507 | * 508 | */ 509 | public Comment reply(String fullnameId, String text) { 510 | String requesturl = ApiURL + Endpoints.REPLY; 511 | 512 | List urlParameters = new ArrayList<>(); 513 | urlParameters.add(new BasicNameValuePair("api_type", "json")); 514 | urlParameters.add(new BasicNameValuePair("text", text)); 515 | urlParameters.add(new BasicNameValuePair("thing_id", fullnameId)); 516 | 517 | PostReturn pstr = this.getDataObject(this.makeHttpRequest(requesturl, urlParameters), PostReturn.class); 518 | 519 | return pstr.getComment().getData(); 520 | } 521 | 522 | 523 | /** 524 | * 525 | * @param fullnameId Fullname id of an object to edit 526 | * @param text Text of the editted object 527 | * @return Either Comment or Link object 528 | */ 529 | public final Post edit(String fullnameId, String text) { 530 | String requesturl = ApiURL + Endpoints.EDIT; 531 | 532 | List urlParameters = new ArrayList<>(); 533 | urlParameters.add(new BasicNameValuePair("api_type", "json")); 534 | urlParameters.add(new BasicNameValuePair("text", text)); 535 | urlParameters.add(new BasicNameValuePair("thing_id", fullnameId)); 536 | 537 | 538 | PostReturn pstr = this.getDataObject(this.makeHttpRequest(requesturl, urlParameters), PostReturn.class); 539 | 540 | if(pstr.getKind().equals("link")){ 541 | return pstr.getLink().getData(); 542 | } 543 | else return pstr.getComment().getData(); 544 | 545 | } 546 | 547 | /** 548 | * 549 | * @param subreddit subreddit name 550 | */ 551 | public final void acceptModInvite(String subreddit){ 552 | String requesturl = String.format(ApiURL + Endpoints.ACCEPT_MOD_INVITE, subreddit); 553 | 554 | List urlParameters = new ArrayList<>(); 555 | urlParameters.add(new BasicNameValuePair("api_type", "json")); 556 | 557 | this.makeHttpRequest(requesturl, urlParameters); 558 | 559 | } 560 | 561 | /** 562 | * 563 | * @param fullnameId fullname id of an object to approve as moderator 564 | */ 565 | public final void approve(String fullnameId){ 566 | String requesturl = ApiURL + Endpoints.APPROVE; 567 | 568 | List urlParameters = new ArrayList<>(); 569 | urlParameters.add(new BasicNameValuePair("id", fullnameId)); 570 | 571 | this.makeHttpRequest(requesturl, urlParameters); 572 | 573 | } 574 | 575 | 576 | /** 577 | * 578 | * @param fullnameId fullname id of an object to remove as moderator 579 | * @param spam Is it Spam or not 580 | */ 581 | public final void remove(String fullnameId, Boolean spam){ 582 | String requesturl = ApiURL + Endpoints.REMOVE; 583 | 584 | List urlParameters = new ArrayList<>(); 585 | urlParameters.add(new BasicNameValuePair("id", fullnameId)); 586 | urlParameters.add(new BasicNameValuePair("spam", spam.toString())); 587 | 588 | this.makeHttpRequest(requesturl, urlParameters); 589 | 590 | } 591 | 592 | /** 593 | * 594 | * @param fullnameId Fullname id of an object to distinguish 595 | * @param distinguish Distinguish 596 | */ 597 | public final void distinguish(String fullnameId, Distinguish distinguish){ 598 | String requesturl = ApiURL + Endpoints.DISTINGUISH; 599 | 600 | List urlParameters = new ArrayList<>(); 601 | urlParameters.add(new BasicNameValuePair("api_type", "json")); 602 | urlParameters.add(new BasicNameValuePair("how", distinguish.toString())); 603 | urlParameters.add(new BasicNameValuePair("id", fullnameId)); 604 | 605 | this.makeHttpRequest(requesturl, urlParameters); 606 | 607 | } 608 | 609 | 610 | 611 | /** 612 | * The reddit API requires subreddit fullId instead of Name to leave moderation so we do another api call here 613 | * to get the fullid from a subreddit name 614 | * 615 | * @param subreddit subreddit name 616 | */ 617 | public final void leaveModeration(String subreddit){ 618 | String requesturl = ApiURL + Endpoints.LEAVE_MODERATOR; 619 | 620 | String subFullId = this.getSubreddit(subreddit).getName(); 621 | 622 | List urlParameters = new ArrayList<>(); 623 | urlParameters.add(new BasicNameValuePair("id", subFullId)); 624 | 625 | this.makeHttpRequest(requesturl, urlParameters); 626 | 627 | } 628 | 629 | /** 630 | * 631 | * @param subreddit Subreddit name 632 | */ 633 | public final void leaveContributor(String subreddit){ 634 | String requesturl = ApiURL + Endpoints.LEAVE_CONTRIBUTOR; 635 | 636 | String subFullId = this.getSubreddit(subreddit).getName(); 637 | 638 | List urlParameters = new ArrayList<>(); 639 | urlParameters.add(new BasicNameValuePair("id", subFullId)); 640 | 641 | this.makeHttpRequest(requesturl, urlParameters); 642 | 643 | } 644 | 645 | /** 646 | * 647 | * @param thingFullId Fullname Id of a thing 648 | */ 649 | public final void ignoreReports(String thingFullId){ 650 | String requesturl = ApiURL + Endpoints.IGNORE_REPORTS; 651 | 652 | List urlParameters = new ArrayList<>(); 653 | urlParameters.add(new BasicNameValuePair("id", thingFullId)); 654 | 655 | this.makeHttpRequest(requesturl, urlParameters); 656 | 657 | 658 | } 659 | 660 | /** 661 | * 662 | * @param thingFullId Full name id of a thing 663 | */ 664 | 665 | public final void unignoreReports(String thingFullId){ 666 | String requesturl = ApiURL + Endpoints.UNIGNORE_REPORTS; 667 | 668 | List urlParameters = new ArrayList<>(); 669 | urlParameters.add(new BasicNameValuePair("id", thingFullId)); 670 | 671 | this.makeHttpRequest(requesturl, urlParameters); 672 | 673 | 674 | } 675 | 676 | 677 | /** 678 | * 679 | * Flair Api 680 | * 681 | */ 682 | 683 | public final void flairConfig(String flair_enabled, FlairPosition flair_position, Boolean flair_self_assign_enabled, FlairPosition link_flair_position, Boolean link_flair_self_assign_enabled){ 684 | String requesturl = ApiURL + Endpoints.FLAIR_CONFIG; 685 | 686 | List urlParameters = new ArrayList<>(); 687 | 688 | urlParameters.add(new BasicNameValuePair("api_type", "json")); 689 | urlParameters.add(new BasicNameValuePair("flair_enabled", flair_enabled)); 690 | urlParameters.add(new BasicNameValuePair("flair_position", flair_position.toString())); 691 | urlParameters.add(new BasicNameValuePair("flair_self_assign_enabled", flair_self_assign_enabled.toString())); 692 | urlParameters.add(new BasicNameValuePair("link_flair_position", link_flair_position.toString())); 693 | urlParameters.add(new BasicNameValuePair("link_flair_self_assign_enabled", link_flair_self_assign_enabled.toString())); 694 | 695 | this.makeHttpRequest(requesturl, urlParameters); 696 | 697 | 698 | } 699 | 700 | public void deleteFlair(String subreddit, String username){ 701 | String requesturl = String.format(ApiURL + Endpoints.DELETE_FLAIR, subreddit); 702 | 703 | List urlParameters = new ArrayList<>(); 704 | urlParameters.add(new BasicNameValuePair("api_type", "json")); 705 | urlParameters.add(new BasicNameValuePair("name", username)); 706 | 707 | this.makeHttpRequest(requesturl, urlParameters); 708 | 709 | 710 | } 711 | 712 | public void clearFlairTemplates(String subreddit, String flairtype){ 713 | String requesturl = String.format(ApiURL + Endpoints.CLEAR_FLAIR_TEMPLATES, subreddit); 714 | 715 | List urlParameters = new ArrayList<>(); 716 | urlParameters.add(new BasicNameValuePair("api_type", "json")); 717 | urlParameters.add(new BasicNameValuePair("flair_type", flairtype)); 718 | 719 | this.makeHttpRequest(requesturl, urlParameters); 720 | 721 | 722 | } 723 | 724 | public void deleteFlairTemplate(String subreddit, String flairTemplateId){ 725 | String requesturl = String.format(ApiURL + Endpoints.DELETE_FLAIR_TEMPLATE, subreddit); 726 | 727 | List urlParameters = new ArrayList<>(); 728 | urlParameters.add(new BasicNameValuePair("api_type", "json")); 729 | urlParameters.add(new BasicNameValuePair("flair_template_id", flairTemplateId)); 730 | 731 | this.makeHttpRequest(requesturl, urlParameters); 732 | 733 | 734 | } 735 | 736 | public void userFlair(String subreddit, String name, String text, String css_class){ 737 | String requesturl = String.format(ApiURL + Endpoints.FLAIR, subreddit); 738 | 739 | List urlParameters = new ArrayList<>(); 740 | urlParameters.add(new BasicNameValuePair("api_type", "json")); 741 | urlParameters.add(new BasicNameValuePair("css_class", css_class)); 742 | urlParameters.add(new BasicNameValuePair("name", name)); 743 | urlParameters.add(new BasicNameValuePair("text", text)); 744 | 745 | this.makeHttpRequest(requesturl, urlParameters); 746 | 747 | 748 | } 749 | 750 | /** 751 | * 752 | * @param subreddit name of the subreddit 753 | * @param link_fullName fullname id of the subreddit, must start with t3_ 754 | * @param text flair text 755 | * @param css_class css class 756 | */ 757 | 758 | public void linkFlair(String subreddit, String link_fullName, String text, String css_class){ 759 | String requesturl = String.format(ApiURL + Endpoints.FLAIR, subreddit); 760 | 761 | List urlParameters = new ArrayList<>(); 762 | urlParameters.add(new BasicNameValuePair("api_type", "json")); 763 | urlParameters.add(new BasicNameValuePair("link", link_fullName)); 764 | urlParameters.add(new BasicNameValuePair("text", text)); 765 | urlParameters.add(new BasicNameValuePair("css_class", css_class)); 766 | 767 | this.makeHttpRequest(requesturl, urlParameters); 768 | 769 | 770 | } 771 | 772 | public final void markNsfw(String fullnameId){ 773 | String requesturl = ApiURL + Endpoints.MARK_NSFW; 774 | List urlParameters = new ArrayList<>(); 775 | 776 | urlParameters.add(new BasicNameValuePair("id", fullnameId)); 777 | 778 | this.makeHttpRequest(requesturl, urlParameters); 779 | 780 | 781 | } 782 | 783 | public final void unmarkNsfw(String fullnameId){ 784 | String requesturl = ApiURL + Endpoints.UNMARK_NSFW; 785 | List urlParameters = new ArrayList<>(); 786 | 787 | urlParameters.add(new BasicNameValuePair("id", fullnameId)); 788 | 789 | this.makeHttpRequest(requesturl, urlParameters); 790 | 791 | 792 | } 793 | 794 | public final void lock(String fullnameId){ 795 | String requesturl = ApiURL + Endpoints.LOCK; 796 | List urlParameters = new ArrayList<>(); 797 | 798 | urlParameters.add(new BasicNameValuePair("id", fullnameId)); 799 | 800 | this.makeHttpRequest(requesturl, urlParameters); 801 | 802 | 803 | } 804 | 805 | public final void unlock(String fullnameId){ 806 | String requesturl = ApiURL + Endpoints.UNLOCK; 807 | List urlParameters = new ArrayList<>(); 808 | 809 | urlParameters.add(new BasicNameValuePair("id", fullnameId)); 810 | 811 | this.makeHttpRequest(requesturl, urlParameters); 812 | 813 | } 814 | 815 | 816 | private , E extends Thing> List getListings 817 | (String requesturl, Integer limit, Class type) { 818 | 819 | List listinglist = this.getRawListings(requesturl, limit, type); 820 | 821 | List submlist = new ArrayList<>(); 822 | 823 | for(T t1lst:listinglist){ 824 | //submlist.addAll((List)t1lst.getData().getChildren().stream().collect(Collectors.toList())); 825 | for(E subm:(List)t1lst.getData().getChildren()){ 826 | submlist.add(subm); 827 | } 828 | } 829 | if(submlist.size() > limit) 830 | submlist = submlist.subList(0, limit); 831 | 832 | return submlist.stream().map(e -> (Thingy) e.getData()).collect(Collectors.toList()); 833 | 834 | } 835 | 836 | private > List getRawListings(String requesturl, Integer limit, Class type){ 837 | 838 | Integer MAX_ITEMS_PER_QUERY = 100; 839 | 840 | Double querynumd = (limit / MAX_ITEMS_PER_QUERY) + 0.5; 841 | int querynum = querynumd.intValue(); 842 | String afterid = ""; 843 | List listinglist = new ArrayList<>(); 844 | //TODO: make the last request partial 845 | //System.out.println(requesturl); 846 | for(int i=0;i<=querynum;i++){ 847 | requesturl = requesturl + "&after=" + afterid; 848 | T listing = this.getDataObject(makeHttpRequest(requesturl), type); 849 | listinglist.add(listing); 850 | afterid = listing.getData().getAfter(); 851 | 852 | if(afterid == null) break; 853 | } 854 | 855 | return listinglist; 856 | 857 | } 858 | 859 | 860 | private String makeHttpRequest(String requesturl){ 861 | return client.get(requesturl); 862 | } 863 | 864 | private String makeHttpRequest(String requesturl, List urlParameters){ 865 | //System.out.println("Post URL parameters:" + urlParameters); 866 | return client.post(requesturl, urlParameters); 867 | 868 | } 869 | 870 | 871 | private T getDataObject(String json, Class type) { 872 | 873 | JsonParser parser = new JsonParser(); 874 | 875 | try{ 876 | parser.parse(json); 877 | }catch (com.google.gson.JsonSyntaxException ex){ 878 | throw new RedditJerkException("Server response is not a valid JSON"); 879 | } 880 | 881 | //check if the returned json is an error message 882 | JsonError jerror; 883 | try{ 884 | jerror = gson.fromJson(json, JsonError.class); 885 | }catch (com.google.gson.JsonSyntaxException ex){ 886 | jerror = new JsonError(); 887 | jerror.setError(null); 888 | 889 | } 890 | 891 | if(jerror.getError() != null) throw new RedditJerkException("Error Json Object returned, error code:" + jerror.getError()); 892 | 893 | return gson.fromJson(json, type); 894 | 895 | } 896 | 897 | } 898 | --------------------------------------------------------------------------------